With the patch...

On Sat, 1 Sep 2012, Marc Glisse wrote:

Hello,

this patch copies some more vector extensions from the C front-end to the C++ front-end. There seemed to be some reluctance to add those, but I guess a patch is the best way to ask. Note that I only added the vector x vector operations, not the vector x scalar ones.

I have some issues with the vector-compare-2.c torture test. It passes a vector by value (argument and return type), which is likely to warn (although for some reason it doesn't for me, with today's compiler). And it takes -Wno-psabi through a .x file, but those are not read in c-c++-common, so I put it in dg-options. I would have changed the function to use pointers, but I don't know if it specifically wants to test passing by value...



2012-08-31  Marc Glisse  <marc.gli...@inria.fr>
        PR c++/54427

cp/ChangeLog
        * typeck.c (cp_build_binary_op) [LSHIFT_EXPR, RSHIFT_EXPR, EQ_EXPR,
        NE_EXPR, LE_EXPR, GE_EXPR, LT_EXPR, GT_EXPR]: Handle VECTOR_TYPE.

testsuite/ChangeLog
        * gcc.dg/vector-shift.c: Move ...
        * c-c++-common/vector-shift.c: ... here.
        * gcc.dg/vector-shift1.c: Move ...
        * c-c++-common/vector-shift1.c: ... here.
        * gcc.dg/vector-shift3.c: Move ...
        * c-c++-common/vector-shift3.c: ... here.
        * gcc.dg/vector-compare-1.c: Move ...
        * c-c++-common/vector-compare-1.c: ... here.
        * gcc.dg/vector-compare-2.c: Move ...
        * c-c++-common/vector-compare-2.c: ... here.
        * gcc.c-torture/execute/vector-compare-1.c: Move ...
        * c-c++-common/torture/vector-compare-1.c: ... here.
        * gcc.c-torture/execute/vector-compare-2.x: Delete.
        * gcc.c-torture/execute/vector-compare-2.c: Move ...
        * c-c++-common/torture/vector-compare-2.c: ... here.
        * gcc.c-torture/execute/vector-shift.c: Move ...
        * c-c++-common/torture/vector-shift.c: ... here.
        * gcc.c-torture/execute/vector-shift2.c: Move ...
        * c-c++-common/torture/vector-shift2.c: ... here.
        * gcc.c-torture/execute/vector-subscript-1.c: Move ...
        * c-c++-common/torture/vector-subscript-1.c: ... here.
        * gcc.c-torture/execute/vector-subscript-2.c: Move ...
        * c-c++-common/torture/vector-subscript-2.c: ... here.
        * gcc.c-torture/execute/vector-subscript-3.c: Move ...
        * c-c++-common/torture/vector-subscript-3.c: ... here.

--
Marc Glisse
Index: cp/typeck.c
===================================================================
--- cp/typeck.c (revision 190842)
+++ cp/typeck.c (working copy)
@@ -3977,21 +3977,29 @@ cp_build_binary_op (location_t location,
     case TRUTH_AND_EXPR:
     case TRUTH_OR_EXPR:
       result_type = boolean_type_node;
       break;
 
       /* Shift operations: result has same type as first operand;
         always convert second operand to int.
         Also set SHORT_SHIFT if shifting rightward.  */
 
     case RSHIFT_EXPR:
-      if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
+      if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
+         && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
+         && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
+         && TYPE_VECTOR_SUBPARTS (type0) == TYPE_VECTOR_SUBPARTS (type1))
+       {
+         result_type = type0;
+         converted = 1;
+       }
+      else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
        {
          result_type = type0;
          if (TREE_CODE (op1) == INTEGER_CST)
            {
              if (tree_int_cst_lt (op1, integer_zero_node))
                {
                  if ((complain & tf_warning)
                      && c_inhibit_evaluation_warnings == 0)
                    warning (0, "right shift count is negative");
                }
@@ -4006,21 +4014,29 @@ cp_build_binary_op (location_t location,
          /* Convert the shift-count to an integer, regardless of
             size of value being shifted.  */
          if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
            op1 = cp_convert (integer_type_node, op1, complain);
          /* Avoid converting op1 to result_type later.  */
          converted = 1;
        }
       break;
 
     case LSHIFT_EXPR:
-      if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
+      if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE
+         && TREE_CODE (TREE_TYPE (type0)) == INTEGER_TYPE
+         && TREE_CODE (TREE_TYPE (type1)) == INTEGER_TYPE
+         && TYPE_VECTOR_SUBPARTS (type0) == TYPE_VECTOR_SUBPARTS (type1))
+       {
+         result_type = type0;
+         converted = 1;
+       }
+      else if (code0 == INTEGER_TYPE && code1 == INTEGER_TYPE)
        {
          result_type = type0;
          if (TREE_CODE (op1) == INTEGER_CST)
            {
              if (tree_int_cst_lt (op1, integer_zero_node))
                {
                  if ((complain & tf_warning)
                      && c_inhibit_evaluation_warnings == 0)
                    warning (0, "left shift count is negative");
                }
@@ -4064,20 +4080,22 @@ cp_build_binary_op (location_t location,
            }
          /* Convert the shift-count to an integer, regardless of
             size of value being shifted.  */
          if (TYPE_MAIN_VARIANT (TREE_TYPE (op1)) != integer_type_node)
            op1 = cp_convert (integer_type_node, op1, complain);
        }
       break;
 
     case EQ_EXPR:
     case NE_EXPR:
+      if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
+       goto vector_compare;
       if ((complain & tf_warning)
          && (FLOAT_TYPE_P (type0) || FLOAT_TYPE_P (type1)))
        warning (OPT_Wfloat_equal,
                 "comparing floating point with == or != is unsafe");
       if ((complain & tf_warning)
          && ((TREE_CODE (orig_op0) == STRING_CST && !integer_zerop (op1))
              || (TREE_CODE (orig_op1) == STRING_CST && !integer_zerop (op0))))
        warning (OPT_Waddress, "comparison with string literal results in 
unspecified behaviour");
 
       build_type = boolean_type_node;
@@ -4306,20 +4324,46 @@ cp_build_binary_op (location_t location,
     case GE_EXPR:
     case LT_EXPR:
     case GT_EXPR:
       if (TREE_CODE (orig_op0) == STRING_CST
          || TREE_CODE (orig_op1) == STRING_CST)
        {
          if (complain & tf_warning)
            warning (OPT_Waddress, "comparison with string literal results in 
unspecified behaviour");
        }
 
+      if (code0 == VECTOR_TYPE && code1 == VECTOR_TYPE)
+       {
+       vector_compare:
+         tree intt;
+         if (TREE_TYPE (type0) != TREE_TYPE (type1))
+           {
+             error_at (location, "comparing vectors with different "
+                                 "element types");
+             return error_mark_node;
+           }
+
+         if (TYPE_VECTOR_SUBPARTS (type0) != TYPE_VECTOR_SUBPARTS (type1))
+           {
+             error_at (location, "comparing vectors with different "
+                                 "number of elements");
+             return error_mark_node;
+           }
+
+         /* Always construct signed integer vector type.  */
+         intt = c_common_type_for_size (GET_MODE_BITSIZE
+                                          (TYPE_MODE (TREE_TYPE (type0))), 0);
+         result_type = build_opaque_vector_type (intt,
+                                                 TYPE_VECTOR_SUBPARTS (type0));
+         converted = 1;
+         break;
+       }
       build_type = boolean_type_node;
       if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE
           || code0 == ENUMERAL_TYPE)
           && (code1 == INTEGER_TYPE || code1 == REAL_TYPE
               || code1 == ENUMERAL_TYPE))
        short_compare = 1;
       else if (code0 == POINTER_TYPE && code1 == POINTER_TYPE)
        result_type = composite_pointer_type (type0, type1, op0, op1,
                                              CPO_COMPARISON, complain);
       else if (code0 == POINTER_TYPE && null_ptr_cst_p (op1))
Index: testsuite/c-c++-common/vector-compare-1.c
===================================================================
--- testsuite/c-c++-common/vector-compare-1.c   (revision 190834)
+++ testsuite/c-c++-common/vector-compare-1.c   (working copy)
@@ -7,13 +7,13 @@ __attribute__((vector_size((elcount)*siz
 void
 foo (vector (4, int) x, vector (4, float) y)
 {
   vector (4, int) p4;
   vector (4, int) r4;
   vector (4, unsigned int) q4;
   vector (8, int) r8;
   vector (4, float) f4;
   
   r4 = x > y;      /* { dg-error "comparing vectors with different element 
types" } */
-  r8 = (x != p4);   /* { dg-error "incompatible types when assigning to type" 
} */
+  r8 = (x != p4);   /* { dg-error "incompatible types when assigning to 
type|cannot convert" } */
   r8 == r4;        /* { dg-error "comparing vectors with different number of 
elements" } */
 }
Index: testsuite/c-c++-common/vector-shift.c
===================================================================
--- testsuite/c-c++-common/vector-shift.c       (revision 190834)
+++ testsuite/c-c++-common/vector-shift.c       (working copy)
@@ -1,11 +1,12 @@
 /* { dg-do compile } */
+/* { dg-prune-output "in evaluation of" } */
 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 int main (int argc, char *argv[]) {
     vector(4,char) vchar = {1,2,3,4};
     vector(4, int) vint  = {1,1,1,1};
     
     vint <<= vchar;  /* { dg-error "nvalid operands to binary <<" } */
     vchar >>= vint;  /* { dg-error "nvalid operands to binary >>" } */
 
Index: testsuite/c-c++-common/torture/vector-subscript-1.c
===================================================================
--- testsuite/c-c++-common/torture/vector-subscript-1.c (revision 190838)
+++ testsuite/c-c++-common/torture/vector-subscript-1.c (working copy)
@@ -1,11 +1,11 @@
-/* dg-do run */
+/* { dg-do run } */
 #define vector __attribute__((vector_size(sizeof(int)*4) ))
 
 /* Check to make sure that we extract and insert the vector at the same
    location for vector subscripting and that vectors layout are the same
    as arrays. */
 
 struct TV4
 {
     vector int v;
 };
Index: testsuite/c-c++-common/torture/vector-subscript-2.c
===================================================================
--- testsuite/c-c++-common/torture/vector-subscript-2.c (revision 190838)
+++ testsuite/c-c++-common/torture/vector-subscript-2.c (working copy)
@@ -1,10 +1,11 @@
+/* { dg-do run } */
 #define vector __attribute__((vector_size(sizeof(int)*4) ))
 
 /* Check to make sure that we extract and insert the vector at the same
    location for vector subscripting (with constant indexes) and
    that vectors layout are the same as arrays. */
 
 struct TV4
 {
     vector int v;
 };
Index: testsuite/c-c++-common/torture/vector-shift.c
===================================================================
--- testsuite/c-c++-common/torture/vector-shift.c       (revision 190838)
+++ testsuite/c-c++-common/torture/vector-shift.c       (working copy)
@@ -1,29 +1,30 @@
+/* { dg-do run } */
 
 #define vector __attribute__((vector_size(sizeof(int)*4) ))
 
 static vector int allones = {1, 1, 1, 1};
 static vector int allzeros = {0, 0, 0, 0};
 static vector int numbers = {0, 1, 2, 3};
 static vector int numbersleftshiftallones = {0, 2, 4, 6};
 static vector int numbersrightshiftallones = {0, 0, 1, 1};
 
 
 static vector unsigned int uallones = {1, 1, 1, 1};
 static vector unsigned int uallzeros = {0, 0, 0, 0};
 static vector unsigned int unumbers = {0, 1, 2, 3};
 static vector unsigned int unumbersleftshiftallones = {0, 2, 4, 6};
 static vector unsigned int unumbersrightshiftallones = {0, 0, 1, 1};
 
 #define TEST(result, expected) \
 do { \
-  typeof(result) result1 = result; \
+  __typeof__(result) result1 = result; \
   if(sizeof (result1) != sizeof (expected)) \
     __builtin_abort (); \
   if (__builtin_memcmp (&result1, &expected, sizeof(result1)) != 0) \
     __builtin_abort (); \
 }while (0);
 
 int main(void)
 {
   vector int result;
   TEST ((numbers << allzeros), numbers);
Index: testsuite/c-c++-common/torture/vector-subscript-3.c
===================================================================
--- testsuite/c-c++-common/torture/vector-subscript-3.c (revision 190838)
+++ testsuite/c-c++-common/torture/vector-subscript-3.c (working copy)
@@ -1,11 +1,11 @@
-/* dg-do run */
+/* { dg-do run } */
 #define vector __attribute__((vector_size(16) ))
 
 /* Check whether register declaration of vector type still 
    allow us to subscript this type.  */
 
 typedef vector short myvec_t;
 
 struct vec_s {
     vector short member;
 };
Index: testsuite/c-c++-common/torture/vector-shift2.c
===================================================================
--- testsuite/c-c++-common/torture/vector-shift2.c      (revision 190838)
+++ testsuite/c-c++-common/torture/vector-shift2.c      (working copy)
@@ -1,10 +1,11 @@
+/* { dg-do run } */
 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 #define vidx(type, vec, idx) (*((type *) &(vec) + idx))
 #define uint unsigned int
 
 int main (int argc, char *argv[]) {
     vector(4, uint) vuint  = { 1,  2,  3,  4};
     vector(4,  int) vint0  = { 1,  1,  1,  1};
     vector(4,  int) vint1  = {-1, -1, -1, -1};
Index: testsuite/c-c++-common/torture/vector-compare-1.c
===================================================================
--- testsuite/c-c++-common/torture/vector-compare-1.c   (revision 190838)
+++ testsuite/c-c++-common/torture/vector-compare-1.c   (working copy)
@@ -1,10 +1,11 @@
+/* { dg-do run } */
 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 #define check_compare(count, res, i0, i1, op, fmt) \
 do { \
     int __i; \
     for (__i = 0; __i < count; __i ++) { \
       if ((res)[__i] != ((i0)[__i] op (i1)[__i] ? -1 : 0)) \
        { \
             __builtin_printf ("%i != ((" fmt " " #op " " fmt " ? -1 : 0) ", \
@@ -31,76 +32,76 @@ do { \
 } while (0)
 
 
 int main (int argc, char *argv[]) {
 #define INT  int
     vector (4, INT) i0;
     vector (4, INT) i1;
     vector (4, int) ires;
     int i;
 
-    i0 = (vector (4, INT)){argc, 1,  2,  10};
+    i0 = (vector (4, INT)){(INT)argc, 1,  2,  10};
     i1 = (vector (4, INT)){0, 3, 2, (INT)-23};
     test (4, i0, i1, ires, "%i");
 #undef INT
 
 #define INT unsigned int
     vector (4, int) ures;
     vector (4, INT) u0;
     vector (4, INT) u1;
 
-    u0 = (vector (4, INT)){argc, 1,  2,  10};
+    u0 = (vector (4, INT)){(INT)argc, 1,  2,  10};
     u1 = (vector (4, INT)){0, 3, 2, (INT)-23};
     test (4, u0, u1, ures, "%u");
 #undef INT
 
 
 #define SHORT short
     vector (8, SHORT) s0;
     vector (8, SHORT) s1;
     vector (8, short) sres;
 
-    s0 = (vector (8, SHORT)){argc, 1,  2,  10,  6, 87, (SHORT)-5, 2};
+    s0 = (vector (8, SHORT)){(SHORT)argc, 1,  2,  10,  6, 87, (SHORT)-5, 2};
     s1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
     test (8, s0, s1, sres, "%i");
 #undef SHORT
 
 #define SHORT unsigned short
     vector (8, SHORT) us0;
     vector (8, SHORT) us1;
     vector (8, short) usres;
 
-    us0 = (vector (8, SHORT)){argc, 1,  2,  10,  6, 87, (SHORT)-5, 2};
+    us0 = (vector (8, SHORT)){(SHORT)argc, 1,  2,  10,  6, 87, (SHORT)-5, 2};
     us1 = (vector (8, SHORT)){0, 3, 2, (SHORT)-23, 12, 10, (SHORT)-2, 0};
     test (8, us0, us1, usres, "%u");
 #undef SHORT
 
 #define CHAR signed char
     vector (16, CHAR) c0;
     vector (16, CHAR) c1;
     vector (16, signed char) cres;
 
-    c0 = (vector (16, CHAR)){argc, 1,  2,  10,  6, 87, (CHAR)-5, 2, \
-                             argc, 1,  2,  10,  6, 87, (CHAR)-5, 2 };
+    c0 = (vector (16, CHAR)){(CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2, \
+                             (CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2 };
 
     c1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
                              0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0};
     test (16, c0, c1, cres, "%i");
 #undef CHAR
 
 #define CHAR unsigned char
     vector (16, CHAR) uc0;
     vector (16, CHAR) uc1;
     vector (16, signed char) ucres;
 
-    uc0 = (vector (16, CHAR)){argc, 1,  2,  10,  6, 87, (CHAR)-5, 2, \
-                             argc, 1,  2,  10,  6, 87, (CHAR)-5, 2 };
+    uc0 = (vector (16, CHAR)){(CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2, \
+                              (CHAR)argc, 1,  2,  10,  6, 87, (CHAR)-5, 2 };
 
     uc1 = (vector (16, CHAR)){0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0, \
                              0, 3, 2, (CHAR)-23, 12, 10, (CHAR)-2, 0};
     test (16, uc0, uc1, ucres, "%u");
 #undef CHAR
 /* Float comparison.  */
     vector (4, float) f0;
     vector (4, float) f1;
     __typeof (f0 == f1) ifres;
 
Index: testsuite/c-c++-common/torture/vector-compare-2.c
===================================================================
--- testsuite/c-c++-common/torture/vector-compare-2.c   (revision 190838)
+++ testsuite/c-c++-common/torture/vector-compare-2.c   (working copy)
@@ -1,10 +1,12 @@
+/* { dg-do run } */
+/* { dg-options "-Wno-psabi" } */
 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 /* Check that constant folding in 
    these simple cases works.  */
 vector (4, int)
 foo (vector (4, int) x)
 {
   return   (x == x) + (x != x) + (x >  x) 
         + (x <  x) + (x >= x) + (x <= x);
Index: testsuite/c-c++-common/vector-shift1.c
===================================================================
--- testsuite/c-c++-common/vector-shift1.c      (revision 190834)
+++ testsuite/c-c++-common/vector-shift1.c      (working copy)
@@ -1,18 +1,19 @@
 /* { dg-do compile } */
+/* { dg-prune-output "in evaluation of" } */
 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 int main (int argc, char *argv[]) {
     vector(4, float) vfloat0 = {1., 2., 3., 4.};
     vector(4, float) vfloat1 = {1., 2., 3., 4.};
     
     vector(4,   int) vint   = {1,  1,  1,  1 };
     
     vint <<= vfloat0;  /* { dg-error "nvalid operands to binary <<" } */
     vfloat0 >>= vint;  /* { dg-error "nvalid operands to binary >>" } */
 
-    vfloat0 <<= vfloat1;  /* { dg-error "nvalid operands to binary <<" } */
+    vfloat0 <<= vfloat1;  /* { dg-error "nvalid operands" } */
 
     return 0;
 }
 
Index: testsuite/c-c++-common/vector-shift3.c
===================================================================
--- testsuite/c-c++-common/vector-shift3.c      (revision 190834)
+++ testsuite/c-c++-common/vector-shift3.c      (working copy)
@@ -1,16 +1,16 @@
 /* { dg-do compile } */
 
 #define vector(elcount, type)  \
 __attribute__((vector_size((elcount)*sizeof(type)))) type
 
 
 int main (int argc, char *argv[]) {
-    vector(8, short) v0 = {argc,2,3,4,5,6,7};
+    vector(8, short) v0 = {(short)argc,2,3,4,5,6,7};
     short sc;
 
     
-    scalar1 <<= v0; /* { dg-error ".*scalar1.*undeclared" } */
+    scalar1 <<= v0; /* { dg-error "scalar1.*(undeclared|was not declared)" } */
    
     return 0;
 }
 

Reply via email to