summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2015-09-29 16:32:45 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2015-09-29 16:32:45 +0000
commit1e9446db621bb2146052fe280327c114fc2c8ea1 (patch)
treec84ca0a4b6a10583b9b48468b374748c3462593e
parent648c8771f044fba58b3249d9197e3320250e2e7c (diff)
downloadgcc-1e9446db621bb2146052fe280327c114fc2c8ea1.tar.gz
[PATCH] Fix undefined behaviour in rx port
* config/rx/constraints.md (Int08): Fix undefined left shift behaviour. (Sint08, Sint16, Sint24): Likewise. * config/rx/rx.c (rx_get_stack_layout): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@228254 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/rx/constraints.md8
-rw-r--r--gcc/config/rx/rx.c4
3 files changed, 11 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bc95889d4e3..cce1ba50244 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -12,6 +12,11 @@
2015-09-29 Jeff Law <law@redhat.com>
+ * config/rx/constraints.md (Int08): Fix undefined left shift
+ behaviour.
+ (Sint08, Sint16, Sint24): Likewise.
+ * config/rx/rx.c (rx_get_stack_layout): Likewise.
+
* config/rl78/rl78-expand.md (movqi): Fix undefined left shift
behaviour.
diff --git a/gcc/config/rx/constraints.md b/gcc/config/rx/constraints.md
index d46f9dac5ef..b41c232fff1 100644
--- a/gcc/config/rx/constraints.md
+++ b/gcc/config/rx/constraints.md
@@ -28,28 +28,28 @@
(define_constraint "Int08"
"@internal A signed or unsigned 8-bit immediate value"
(and (match_code "const_int")
- (match_test "IN_RANGE (ival, (-1 << 8), (1 << 8) - 1)")
+ (match_test "IN_RANGE (ival, (HOST_WIDE_INT_M1U << 8), (1 << 8) - 1)")
)
)
(define_constraint "Sint08"
"@internal A signed 8-bit immediate value"
(and (match_code "const_int")
- (match_test "IN_RANGE (ival, (-1 << 7), (1 << 7) - 1)")
+ (match_test "IN_RANGE (ival, (HOST_WIDE_INT_M1U << 7), (1 << 7) - 1)")
)
)
(define_constraint "Sint16"
"@internal A signed 16-bit immediate value"
(and (match_code "const_int")
- (match_test "IN_RANGE (ival, (-1 << 15), (1 << 15) - 1)")
+ (match_test "IN_RANGE (ival, (HOST_WIDE_INT_M1U << 15), (1 << 15) - 1)")
)
)
(define_constraint "Sint24"
"@internal A signed 24-bit immediate value"
(and (match_code "const_int")
- (match_test "IN_RANGE (ival, (-1 << 23), (1 << 23) - 1)")
+ (match_test "IN_RANGE (ival, (HOST_WIDE_INT_M1U << 23), (1 << 23) - 1)")
)
)
diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c
index c68f29ef6b6..6d911d2edb8 100644
--- a/gcc/config/rx/rx.c
+++ b/gcc/config/rx/rx.c
@@ -1561,7 +1561,7 @@ rx_get_stack_layout (unsigned int * lowest,
PUSHM.
FIXME: Is it worth improving this heuristic ? */
- pushed_mask = (-1 << low) & ~(-1 << (high + 1));
+ pushed_mask = (HOST_WIDE_INT_M1U << low) & ~(HOST_WIDE_INT_M1U << (high + 1));
unneeded_pushes = (pushed_mask & (~ save_mask)) & pushed_mask;
if ((fixed_reg && fixed_reg <= high)
@@ -1667,7 +1667,7 @@ ok_for_max_constant (HOST_WIDE_INT val)
/* rx_max_constant_size specifies the maximum number
of bytes that can be used to hold a signed value. */
- return IN_RANGE (val, (-1 << (rx_max_constant_size * 8)),
+ return IN_RANGE (val, (HOST_WIDE_INT_M1U << (rx_max_constant_size * 8)),
( 1 << (rx_max_constant_size * 8)));
}