diff options
Diffstat (limited to 'gcc/config/m32r/m32r.c')
| -rw-r--r-- | gcc/config/m32r/m32r.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/gcc/config/m32r/m32r.c b/gcc/config/m32r/m32r.c index e7e1a2d..1134569 100644 --- a/gcc/config/m32r/m32r.c +++ b/gcc/config/m32r/m32r.c @@ -692,6 +692,17 @@ gen_compare (enum rtx_code code, rtx x, rtx y, int need_compare) { case EQ: if (GET_CODE (y) == CONST_INT + && UINT16_P (INTVAL (y)) /* Reg equal to small const. */ + && y != const0_rtx) + { + rtx tmp = gen_reg_rtx (SImode); + + emit_insn (gen_xorsi3 (tmp, x, GEN_INT (INTVAL (y)))); + x = tmp; + y = const0_rtx; + } +#if 0 /* Removed for miss optimizing at simplify_relational_operation(). */ + else if (GET_CODE (y) == CONST_INT && CMP_INT16_P (INTVAL (y)) /* Reg equal to small const. */ && y != const0_rtx) { @@ -701,6 +712,7 @@ gen_compare (enum rtx_code code, rtx x, rtx y, int need_compare) x = tmp; y = const0_rtx; } +#endif else if (CONSTANT_P (y)) /* Reg equal to const. */ { rtx tmp = force_reg (GET_MODE (x), y); @@ -815,6 +827,17 @@ gen_compare (enum rtx_code code, rtx x, rtx y, int need_compare) /* Reg/smallconst equal comparison. */ if (compare_code == EQ && GET_CODE (y) == CONST_INT + && UINT16_P (INTVAL (y))) + { + rtx tmp = gen_reg_rtx (SImode); + + emit_insn (gen_xorsi3 (tmp, x, GEN_INT (INTVAL (y)))); + return gen_rtx_fmt_ee (code, CCmode, tmp, const0_rtx); + } + +#if 0 /* Removed for miss optimizing at simplify_relational_operation(). */ + if (compare_code == EQ + && GET_CODE (y) == CONST_INT && CMP_INT16_P (INTVAL (y))) { rtx tmp = gen_reg_rtx (SImode); @@ -822,6 +845,7 @@ gen_compare (enum rtx_code code, rtx x, rtx y, int need_compare) emit_insn (gen_addsi3 (tmp, x, GEN_INT (-INTVAL (y)))); return gen_rtx_fmt_ee (code, CCmode, tmp, const0_rtx); } +#endif /* Reg/const equal comparison. */ if (compare_code == EQ |
