1  #define vector(elcount, type)  \
       2  __attribute__((vector_size((elcount)*sizeof(type)))) type
       3  
       4  #define vidx(type, vec, idx) (*((type *) &(vec) + idx))
       5  
       6  #define operl(a, b, op) (a op b)
       7  #define operr(a, b, op) (b op a)
       8  
       9  #define check(type, count, vec0, vec1, num, op, lr) \
      10  do {\
      11      int __i; \
      12      for (__i = 0; __i < count; __i++) {\
      13          if (vidx (type, vec1, __i) != oper##lr (num, vidx (type, vec0, __i), op)) \
      14              __builtin_abort (); \
      15      }\
      16  } while (0)
      17  
      18  #define veccompare(type, count, v0, v1) \
      19  do {\
      20      int __i; \
      21      for (__i = 0; __i < count; __i++) { \
      22          if (vidx (type, v0, __i) != vidx (type, v1, __i)) \
      23              __builtin_abort (); \
      24      } \
      25  } while (0)
      26  
      27  
      28  long __attribute__ ((noinline)) vlng () {   return (long)42; }
      29  int  __attribute__ ((noinline)) vint () {   return (int) 43; }
      30  short __attribute__ ((noinline)) vsrt () {   return (short)42; }
      31  char __attribute__ ((noinline)) vchr () {    return (char)42; }
      32  
      33  
      34  int main (int argc, char *argv[]) {
      35      vector(16, char) c0 = {argc, 1,2,3,4,5,6,7, argc, 1,2,3,4,5,6,7};
      36      vector(16, char) c1;
      37      
      38      vector(8, short) s0 = {argc, 1,2,3,4,5,6,7};
      39      vector(8, short) s1;
      40  
      41      vector(4, int) i0 = {argc, 1, 2, 3};
      42      vector(4, int) i1;
      43  
      44      vector(2, long) l0 = {argc, 1};
      45      vector(2, long) l1;
      46  
      47      c1 = vchr() + c0; check (char, 16, c0, c1, vchr(), +, l);
      48      
      49      s1 = vsrt() + s0; check (short, 8, s0, s1, vsrt(), +, l);
      50      s1 = vchr() + s0; check (short, 8, s0, s1, vchr(), +, l);
      51  
      52      i1 = vint() * i0; check (int, 4, i0, i1, vint(), *, l);
      53      i1 = vsrt() * i0; check (int, 4, i0, i1, vsrt(), *, l);
      54      i1 = vchr() * i0; check (int, 4, i0, i1, vchr(), *, l);
      55  
      56      l1 = vlng() * l0; check (long, 2, l0, l1, vlng(), *, l);
      57      l1 = vint() * l0; check (long, 2, l0, l1, vint(), *, l);
      58      l1 = vsrt() * l0; check (long, 2, l0, l1, vsrt(), *, l);
      59      l1 = vchr() * l0; check (long, 2, l0, l1, vchr(), *, l);
      60  
      61      return 0;
      62  }