diff options
author | Pekka Enberg <penberg@kernel.org> | 2012-02-14 19:18:20 +0200 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-02-14 19:18:20 +0200 |
commit | 817ddf7020c22aa2646f8993ea40151b58c8df1b (patch) | |
tree | 4670edfffe5f472add9172a7da3064d6125b7100 | |
parent | c1db8eddf0b69eaa256d32507ebd0366f8c8ce19 (diff) | |
download | jato-817ddf7020c22aa2646f8993ea40151b58c8df1b.tar.gz |
x86-64: Simplify constant argument code generation
The specialized instruction selection rules are not needed for correctness
because EXPR_VALUE and EXPR_FVALUE combined with EXPR_ARG deals with immediate
arguments just fine.
The immediate floating point rule is broken so drop bot specialized runes for
now. We can reintroduce them later on if we can show there's a performance
benefit in having them.
Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r-- | arch/x86/insn-selector_64.brg | 53 |
1 files changed, 0 insertions, 53 deletions
diff --git a/arch/x86/insn-selector_64.brg b/arch/x86/insn-selector_64.brg index 7dfb0ebb..81f18e33 100644 --- a/arch/x86/insn-selector_64.brg +++ b/arch/x86/insn-selector_64.brg @@ -1268,59 +1268,6 @@ arg: EXPR_ARG_THIS(reg) 1 state->reg1 = src; } -arg: EXPR_ARG(EXPR_VALUE) 1 -{ - struct expression *expr, *arg_expr; - struct var_info *dst, *temp; - unsigned long imm; - - expr = to_expr(tree); - arg_expr = to_expr(expr->arg_expression); - imm = arg_expr->value; - - if (expr->arg_reg != MACH_REG_UNASSIGNED) { - dst = get_fixed_var(s->b_parent, expr->arg_reg); - select_insn(s, tree, imm_reg_insn(INSN_MOV_IMM_REG, imm, dst)); - } else { - temp = get_var(s->b_parent, arg_expr->vm_type); - select_insn(s, tree, imm_reg_insn(INSN_MOV_IMM_REG, imm, temp)); - select_insn(s, tree, reg_insn(INSN_PUSH_REG, temp)); - } - - state->reg1 = NULL; -} - -arg: EXPR_ARG(EXPR_FVALUE) 2 -{ - struct expression *expr, *arg_expr; - struct stack_slot *scratch; - struct var_info *temp, *dst; - unsigned long ivalue; - - expr = to_expr(tree); - arg_expr = to_expr(expr->arg_expression); - - if (arg_expr->vm_type == J_FLOAT) { - temp = get_var(s->b_parent, J_INT); - ivalue = float_to_uint32(expr->fvalue); - } else { - temp = get_var(s->b_parent, J_LONG); - ivalue = double_to_uint64(expr->fvalue); - } - - select_insn(s, tree, imm_reg_insn(INSN_MOV_IMM_REG, ivalue, temp)); - - if (expr->arg_reg != MACH_REG_UNASSIGNED) { - scratch = get_scratch_slot(s->b_parent); - dst = get_fixed_var(s->b_parent, expr->arg_reg); - select_insn(s, tree, reg_memlocal_insn(INSN_MOV_REG_MEMLOCAL, temp, scratch)); - select_insn(s, tree, memlocal_reg_insn(INSN_MOV_MEMLOCAL_REG, scratch, dst)); - } else - select_insn(s, tree, reg_insn(INSN_PUSH_REG, temp)); - - state->reg1 = NULL; -} - arg: EXPR_ARG(reg) 1 { struct var_info *src, *dst; |