More left shifts of negative signed values to fix in the SH port. I'm
not sure how these were missed last week or if they were introduced
between the point when I tested last week and yesterday. Regardless,
they're fixed in the obvious way.
Tested by building all the sh targets form config-all.mk.
Installed on the trunk.
Jeff
commit d1349379450b8e11dcc7adfe678028b674a63cf1
Author: Jeff Law <l...@tor.usersys.redhat.com>
Date: Mon Sep 28 19:25:20 2015 -0400
[PATCH] Fix undefined behaviour in SH port
* config/sh/sh.c (gen_shl_and): Fix undefined left shift
behaviour.
(gen_shl_sext): Likewise.
* config/sh/sh.md (divsi3): Likewise.
(imm->ext_dest_operand splitter): Likewise.
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cce1ba5..22c09b7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2015-09-29 Jeff Law <l...@redhat.com>
+
+ * config/sh/sh.c (gen_shl_and): Fix undefined left shift
+ behaviour.
+ (gen_shl_sext): Likewise.
+ * config/sh/sh.md (divsi3): Likewise.
+ (imm->ext_dest_operand splitter): Likewise.
+
2015-09-29 Evandro Menezes <e.mene...@samsung.com>
* config/arm/types.md (neon_ldp, neon_ldp_q, neon_stp, neon_stp_q):
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 16fb575..904201b 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -4342,7 +4342,7 @@ gen_shl_and (rtx dest, rtx left_rtx, rtx mask_rtx, rtx
source)
that don't matter. This way, we might be able to get a shorter
signed constant. */
if (mask & ((HOST_WIDE_INT) 1 << (31 - total_shift)))
- mask |= (HOST_WIDE_INT) ~0 << (31 - total_shift);
+ mask |= (HOST_WIDE_INT) ((HOST_WIDE_INT_M1U) << (31 - total_shift));
case 2:
/* Don't expand fine-grained when combining, because that will
make the pattern fail. */
@@ -4626,7 +4626,7 @@ gen_shl_sext (rtx dest, rtx left_rtx, rtx size_rtx, rtx
source)
}
emit_insn (gen_andsi3 (dest, source, GEN_INT ((1 << insize) - 1)));
emit_insn (gen_xorsi3 (dest, dest, GEN_INT (1 << (insize - 1))));
- emit_insn (gen_addsi3 (dest, dest, GEN_INT (-1 << (insize - 1))));
+ emit_insn (gen_addsi3 (dest, dest, GEN_INT (HOST_WIDE_INT_M1U << (insize
- 1))));
operands[0] = dest;
operands[2] = kind == 7 ? GEN_INT (left + 1) : left_rtx;
gen_shifty_op (ASHIFT, operands);
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index 8a388bc..d758e3b 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -3052,7 +3052,7 @@
tab_base = force_reg (DImode, tab_base);
}
if (TARGET_DIVIDE_INV20U)
- i2p27 = force_reg (DImode, GEN_INT (-2 << 27));
+ i2p27 = force_reg (DImode, GEN_INT ((unsigned HOST_WIDE_INT)-2 << 27));
else
i2p27 = GEN_INT (0);
if (TARGET_DIVIDE_INV20U || TARGET_DIVIDE_INV20L)
@@ -7875,7 +7875,7 @@ label:
break;
}
/* Try movi / mshflo.l w/ r63. */
- val2 = val + ((HOST_WIDE_INT) -1 << 32);
+ val2 = val + ((HOST_WIDE_INT) (HOST_WIDE_INT_M1U << 32));
if ((HOST_WIDE_INT) val2 < 0 && CONST_OK_FOR_I16 (val2))
{
operands[1] = gen_mshflo_l_di (operands[0], operands[0],