aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/m32r/m32r.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/m32r/m32r.c')
-rw-r--r--gcc/config/m32r/m32r.c24
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