diff options
author | Pekka Enberg <penberg@kernel.org> | 2012-04-27 17:05:58 +0300 |
---|---|---|
committer | Pekka Enberg <penberg@kernel.org> | 2012-04-27 17:05:58 +0300 |
commit | b549b1efc8f7fd39b0c8cee4cbac934e2059d4d6 (patch) | |
tree | ec761ae09071aa72260f1841f3d0ff550c093be5 | |
parent | c8236e2274351a93b537459fb39855ddf79ae3be (diff) | |
download | jato-b549b1efc8f7fd39b0c8cee4cbac934e2059d4d6.tar.gz |
x86-64: Eliminate redundant EXPR_LOCAL_FLOAT reg -> reg store
This patch eliminates a redundant register to register store from
EXPR_LOCAL_FLOAT instruction selector rule.
Signed-off-by: Pekka Enberg <penberg@kernel.org>
-rw-r--r-- | arch/x86/insn-selector_64.brg | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/arch/x86/insn-selector_64.brg b/arch/x86/insn-selector_64.brg index 6407a441..e57963ec 100644 --- a/arch/x86/insn-selector_64.brg +++ b/arch/x86/insn-selector_64.brg @@ -237,8 +237,6 @@ freg: EXPR_FLOAT_LOCAL 0 exprsrc = to_expr(tree); - state->reg1 = dest = get_var(s->b_parent, exprsrc->vm_type); - if (exprsrc->local_index < (unsigned long) method->args_count) { enum machine_reg reg; @@ -249,6 +247,8 @@ freg: EXPR_FLOAT_LOCAL 0 index = method->args_map[exprsrc->local_index].stack_index; slot = get_local_slot(s->b_parent->stack_frame, index); + state->reg1 = dest = get_var(s->b_parent, exprsrc->vm_type); + if (exprsrc->vm_type == J_FLOAT) select_insn(s, tree, memlocal_reg_insn(INSN_MOVSS_MEMLOCAL_XMM, slot, dest)); else @@ -258,10 +258,7 @@ freg: EXPR_FLOAT_LOCAL 0 src = get_fixed_var(s->b_parent, reg); - if (exprsrc->vm_type == J_FLOAT) - select_insn(s, tree, reg_reg_insn(INSN_MOVSS_XMM_XMM, src, dest)); - else - select_insn(s, tree, reg_reg_insn(INSN_MOVSD_XMM_XMM, src, dest)); + state->reg1 = dest = src; } } else { int index; @@ -269,6 +266,8 @@ freg: EXPR_FLOAT_LOCAL 0 index = exprsrc->local_index - method->reg_args_count; slot = get_local_slot(s->b_parent->stack_frame, index); + state->reg1 = dest = get_var(s->b_parent, exprsrc->vm_type); + if (exprsrc->vm_type == J_FLOAT) select_insn(s, tree, memlocal_reg_insn(INSN_MOVSS_MEMLOCAL_XMM, slot, dest)); else |