aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPekka Enberg <penberg@kernel.org>2012-02-14 19:18:20 +0200
committerPekka Enberg <penberg@kernel.org>2012-02-14 19:18:20 +0200
commit817ddf7020c22aa2646f8993ea40151b58c8df1b (patch)
tree4670edfffe5f472add9172a7da3064d6125b7100
parentc1db8eddf0b69eaa256d32507ebd0366f8c8ce19 (diff)
downloadjato-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.brg53
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;