gcc/ChangeLog:

2015-09-10  Andreas Krebbel  <kreb...@linux.vnet.ibm.com>

        * config/s390/s390.c (s390_contiguous_bitmask_vector_p): Reject if
        the vector element is bigger than 64 bit.

gcc/testsuite/ChangeLog:

2015-09-10  Andreas Krebbel  <kreb...@linux.vnet.ibm.com>

        * gcc.target/s390/vector/vec-genbytemask-1.c: Add check for V1TI
        initialization with a byte mask.  No change expected here.
        * gcc.target/s390/vector/vec-genmask-1.c: Fix whitespace.
        * gcc.target/s390/vector/vec-genmask-2.c: Add check for V1TI
        initialization with contigious bitmask.  Literal pool is expectd
        to be used here.
---
 gcc/config/s390/s390.c                                   |  5 +++++
 gcc/testsuite/gcc.target/s390/vector/vec-genbytemask-1.c | 13 +++++++++++++
 gcc/testsuite/gcc.target/s390/vector/vec-genmask-1.c     |  1 -
 gcc/testsuite/gcc.target/s390/vector/vec-genmask-2.c     |  9 +++++++++
 4 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index a664443..d276ab2 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -2265,6 +2265,11 @@ s390_contiguous_bitmask_vector_p (rtx op, int *start, 
int *end)
     return false;
 
   size = GET_MODE_UNIT_BITSIZE (GET_MODE (op));
+
+  /* We cannot deal with V1TI/V1TF. This would require a vgmq.  */
+  if (size > 64)
+    return false;
+
   mask = UINTVAL (elt);
   if (s390_contiguous_bitmask_p (mask, size, start,
                                 end != NULL ? &length : NULL))
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-genbytemask-1.c 
b/gcc/testsuite/gcc.target/s390/vector/vec-genbytemask-1.c
index b8cf314..26c189a 100644
--- a/gcc/testsuite/gcc.target/s390/vector/vec-genbytemask-1.c
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-genbytemask-1.c
@@ -1,11 +1,13 @@
 /* { dg-do run } */
 /* { dg-options "-O3 -mzarch -march=z13 --save-temps" } */
 /* { dg-require-effective-target vector } */
+/* { dg-require-effective-target int128 } */
 
 typedef unsigned char     uv16qi __attribute__((vector_size(16)));
 typedef unsigned short     uv8hi __attribute__((vector_size(16)));
 typedef unsigned int       uv4si __attribute__((vector_size(16)));
 typedef unsigned long long uv2di __attribute__((vector_size(16)));
+typedef unsigned __int128  uv1ti __attribute__((vector_size(16)));
 
 uv2di __attribute__((noinline))
 foo1 ()
@@ -45,6 +47,13 @@ foo4 ()
       0xff, 0, 0xff, 0,
       0, 0xff, 0, 0xff };
 }
+
+uv1ti __attribute__((noinline))
+foo5 ()
+{
+  return (uv1ti){ 0xff00ff00ff00ff00ULL };
+}
+
 /* { dg-final { scan-assembler-times "vgbm\t%v24,61605" 1 } } */
 
 int
@@ -64,6 +73,10 @@ main ()
 
   if (foo4()[1] != 0xff)
     __builtin_abort ();
+
+  if (foo5()[0] != 0xff00ff00ff00ff00ULL)
+    __builtin_abort ();
+
   return 0;
 }
 
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-genmask-1.c 
b/gcc/testsuite/gcc.target/s390/vector/vec-genmask-1.c
index b0747f7..6093422 100644
--- a/gcc/testsuite/gcc.target/s390/vector/vec-genmask-1.c
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-genmask-1.c
@@ -66,4 +66,3 @@ main ()
     __builtin_abort ();
   return 0;
 }
-
diff --git a/gcc/testsuite/gcc.target/s390/vector/vec-genmask-2.c 
b/gcc/testsuite/gcc.target/s390/vector/vec-genmask-2.c
index e3ae341..46256e9 100644
--- a/gcc/testsuite/gcc.target/s390/vector/vec-genmask-2.c
+++ b/gcc/testsuite/gcc.target/s390/vector/vec-genmask-2.c
@@ -1,10 +1,12 @@
 /* { dg-do compile } */
 /* { dg-options "-O3 -mzarch -march=z13" } */
+/* { dg-require-effective-target int128 } */
 
 typedef unsigned char     uv16qi __attribute__((vector_size(16)));
 typedef unsigned short     uv8hi __attribute__((vector_size(16)));
 typedef unsigned int       uv4si __attribute__((vector_size(16)));
 typedef unsigned long long uv2di __attribute__((vector_size(16)));
+typedef unsigned __int128  uv1ti __attribute__((vector_size(16)));
 
 /* The elements differ.  */
 uv2di __attribute__((noinline))
@@ -43,4 +45,11 @@ foo4 ()
       0x82, 0x82, 0x82, 0x82,
       0x82, 0x82, 0x82, 0x82 };
 }
+
+/* We do not have vgmq.  */
+uv1ti
+foo5()
+{
+  return (uv1ti){ ((unsigned __int128)1 << 53) - 1 };
+}
 /* { dg-final { scan-assembler-not "vgm" } } */
-- 
1.9.1

Reply via email to