aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@gcc.gnu.org>2003-06-17 00:03:24 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2003-06-17 00:03:24 +0000
commit825bd25cb621ed2f6c88ff32c8604372de61dc4f (patch)
tree74fd80ca70747089c5d2d3c9bfaffdbd0a52e6fb
parentc24851dee56337fd1d88a87749792980cf0d30bc (diff)
downloadgcc-825bd25cb621ed2f6c88ff32c8604372de61dc4f.zip
gcc-825bd25cb621ed2f6c88ff32c8604372de61dc4f.tar.gz
gcc-825bd25cb621ed2f6c88ff32c8604372de61dc4f.tar.bz2
simplify-rtx.c (simplify_subreg): Do not over-extend vector constants.
2003-06-16 Aldy Hernandez <aldyh@redhat.com> * simplify-rtx.c (simplify_subreg): Do not over-extend vector constants. * testsuite/gcc.c-torture/execute/simd-4.c: New. [[Split portion of a mixed commit.]] From-SVN: r68047.2
-rw-r--r--gcc/simplify-rtx.c6
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/simd-4.c16
2 files changed, 21 insertions, 1 deletions
diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c
index cf68244..132b3ab 100644
--- a/gcc/simplify-rtx.c
+++ b/gcc/simplify-rtx.c
@@ -2657,6 +2657,10 @@ simplify_subreg (outermode, op, innermode, byte)
unsigned i = BYTES_BIG_ENDIAN ? offset : offset + n_elts - 1;
unsigned step = BYTES_BIG_ENDIAN ? 1 : -1;
int shift = BITS_PER_UNIT * elt_size;
+ unsigned HOST_WIDE_INT unit_mask;
+
+ unit_mask = (unsigned HOST_WIDE_INT) -1
+ >> (sizeof (HOST_WIDE_INT) * BITS_PER_UNIT - shift);
for (; n_elts--; i += step)
{
@@ -2675,7 +2679,7 @@ simplify_subreg (outermode, op, innermode, byte)
if (high >> (HOST_BITS_PER_WIDE_INT - shift))
return NULL_RTX;
high = high << shift | sum >> (HOST_BITS_PER_WIDE_INT - shift);
- sum = (sum << shift) + INTVAL (elt);
+ sum = (sum << shift) + (INTVAL (elt) & unit_mask);
}
if (GET_MODE_BITSIZE (outermode) <= HOST_BITS_PER_WIDE_INT)
return GEN_INT (trunc_int_for_mode (sum, outermode));
diff --git a/gcc/testsuite/gcc.c-torture/execute/simd-4.c b/gcc/testsuite/gcc.c-torture/execute/simd-4.c
new file mode 100644
index 0000000..c8ddb53
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/simd-4.c
@@ -0,0 +1,16 @@
+typedef int __attribute__((vector_size(8))) v2si;
+long long s64;
+
+static inline long long
+__ev_convert_s64 (v2si a)
+{
+ return (long long) a;
+}
+
+int main()
+{
+ s64 = __ev_convert_s64 ((v2si){1,0xffffffff});
+ if (s64 != 0x1ffffffffLL)
+ abort ();
+ return 0;
+}