aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2015-09-21 14:41:10 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2015-09-21 14:41:10 +0000
commita49448515dfcb69928dc77213a2d2f5aa43ee01c (patch)
treebb1e7bf207e138049df90e8d0f09b0c4eba48da1
parentb1e251ec9ec0260943485793446bfe249eaae290 (diff)
downloadgcc-a49448515dfcb69928dc77213a2d2f5aa43ee01c.zip
gcc-a49448515dfcb69928dc77213a2d2f5aa43ee01c.tar.gz
gcc-a49448515dfcb69928dc77213a2d2f5aa43ee01c.tar.bz2
* config/spu/spu.c (spu_expand_insv): Avoid undefined behavior.
From-SVN: r227974
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/spu/spu.c10
2 files changed, 9 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9a2cf21..c25888a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2015-09-21 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
+
+ * config/spu/spu.c (spu_expand_insv): Avoid undefined behavior.
+
2015-09-21 Richard Biener <rguenther@suse.de>
* passes.c (rest_of_decl_compilation): Do not call
diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c
index 05c81f5..4821453 100644
--- a/gcc/config/spu/spu.c
+++ b/gcc/config/spu/spu.c
@@ -472,7 +472,7 @@ spu_expand_insv (rtx ops[])
{
HOST_WIDE_INT width = INTVAL (ops[1]);
HOST_WIDE_INT start = INTVAL (ops[2]);
- HOST_WIDE_INT maskbits;
+ unsigned HOST_WIDE_INT maskbits;
machine_mode dst_mode;
rtx dst = ops[0], src = ops[3];
int dst_size;
@@ -527,15 +527,15 @@ spu_expand_insv (rtx ops[])
switch (dst_size)
{
case 32:
- maskbits = (-1ll << (32 - width - start));
+ maskbits = (~(unsigned HOST_WIDE_INT)0 << (32 - width - start));
if (start)
- maskbits += (1ll << (32 - start));
+ maskbits += ((unsigned HOST_WIDE_INT)1 << (32 - start));
emit_move_insn (mask, GEN_INT (maskbits));
break;
case 64:
- maskbits = (-1ll << (64 - width - start));
+ maskbits = (~(unsigned HOST_WIDE_INT)0 << (64 - width - start));
if (start)
- maskbits += (1ll << (64 - start));
+ maskbits += ((unsigned HOST_WIDE_INT)1 << (64 - start));
emit_move_insn (mask, GEN_INT (maskbits));
break;
case 128: