From ce8882e65fe50cef8ead72670b17ecbedc7b25ef Mon Sep 17 00:00:00 2001 From: Stephane Carrez Date: Sat, 5 May 2001 08:59:32 +0200 Subject: m68hc11.c (m68hc11_gen_movhi): Optimize moves between X and Y by using sequences of xgdx and xgdy. * config/m68hc11/m68hc11.c (m68hc11_gen_movhi): Optimize moves between X and Y by using sequences of xgdx and xgdy. From-SVN: r41861 --- gcc/ChangeLog | 5 +++++ gcc/config/m68hc11/m68hc11.c | 32 ++++++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 15f07ba..2692493 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2001-05-05 Stephane Carrez + * config/m68hc11/m68hc11.c (m68hc11_gen_movhi): Optimize moves + between X and Y by using sequences of xgdx and xgdy. + +2001-05-05 Stephane Carrez + * config/m68hc11/m68hc11.md ("*logicalsi3_silshr16"): Use '?' instead of '!' for the 'D' alternative ('!' is too strong). ("*logicalsi3_silshl16"): Likewise. diff --git a/gcc/config/m68hc11/m68hc11.c b/gcc/config/m68hc11/m68hc11.c index 8aa5095..f9de2dc 100644 --- a/gcc/config/m68hc11/m68hc11.c +++ b/gcc/config/m68hc11/m68hc11.c @@ -3135,8 +3135,20 @@ m68hc11_gen_movhi (insn, operands) } else if (Y_REG_P (operands[1])) { - output_asm_insn ("sty\t%t1", operands); - output_asm_insn ("ldx\t%t1", operands); + /* When both D and Y are dead, use the sequence xgdy, xgdx + to move Y into X. The D and Y registers are modified. */ + if (optimize && find_regno_note (insn, REG_DEAD, HARD_Y_REGNUM) + && dead_register_here (insn, d_reg)) + { + output_asm_insn ("xgdy", operands); + output_asm_insn ("xgdx", operands); + CC_STATUS_INIT; + } + else + { + output_asm_insn ("sty\t%t1", operands); + output_asm_insn ("ldx\t%t1", operands); + } } else if (SP_REG_P (operands[1])) { @@ -3165,8 +3177,20 @@ m68hc11_gen_movhi (insn, operands) } else if (X_REG_P (operands[1])) { - output_asm_insn ("stx\t%t1", operands); - output_asm_insn ("ldy\t%t1", operands); + /* When both D and X are dead, use the sequence xgdx, xgdy + to move X into Y. The D and X registers are modified. */ + if (optimize && find_regno_note (insn, REG_DEAD, HARD_X_REGNUM) + && dead_register_here (insn, d_reg)) + { + output_asm_insn ("xgdx", operands); + output_asm_insn ("xgdy", operands); + CC_STATUS_INIT; + } + else + { + output_asm_insn ("stx\t%t1", operands); + output_asm_insn ("ldy\t%t1", operands); + } } else if (SP_REG_P (operands[1])) { -- cgit v1.1