modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/scal-to-vec1.c (about)

     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  volatile int one = 1;
    28  
    29  int main (int argc, char *argv[]) {
    30  #define fvec_2 (vector(4, float)){2., 2., 2., 2.}
    31  #define dvec_2 (vector(2, double)){2., 2.}
    32  
    33  
    34      vector(8, short) v0 = {one, 1, 2, 3, 4, 5, 6, 7};
    35      vector(8, short) v1;
    36  
    37      vector(4, float) f0 = {1., 2., 3., 4.};
    38      vector(4, float) f1, f2;
    39  
    40      vector(2, double) d0 = {1., 2.};
    41      vector(2, double) d1, d2;
    42  
    43  
    44  
    45      v1 = 2 + v0;   check (short, 8, v0, v1, 2, +, l);
    46      v1 = 2 - v0;   check (short, 8, v0, v1, 2, -, l);
    47      v1 = 2 * v0;   check (short, 8, v0, v1, 2, *, l);
    48      v1 = 2 / v0;   check (short, 8, v0, v1, 2, /, l);
    49      v1 = 2 % v0;   check (short, 8, v0, v1, 2, %, l);
    50      v1 = 2 ^ v0;   check (short, 8, v0, v1, 2, ^, l);
    51      v1 = 2 & v0;   check (short, 8, v0, v1, 2, &, l);
    52      v1 = 2 | v0;   check (short, 8, v0, v1, 2, |, l);
    53      v1 = 2 << v0;   check (short, 8, v0, v1, 2, <<, l);
    54      v1 = 2 >> v0;   check (short, 8, v0, v1, 2, >>, l);
    55  
    56      v1 = v0 + 2;   check (short, 8, v0, v1, 2, +, r);
    57      v1 = v0 - 2;   check (short, 8, v0, v1, 2, -, r);
    58      v1 = v0 * 2;   check (short, 8, v0, v1, 2, *, r);
    59      v1 = v0 / 2;   check (short, 8, v0, v1, 2, /, r);
    60      v1 = v0 % 2;   check (short, 8, v0, v1, 2, %, r);
    61      v1 = v0 ^ 2;   check (short, 8, v0, v1, 2, ^, r);
    62      v1 = v0 & 2;   check (short, 8, v0, v1, 2, &, r);
    63      v1 = v0 | 2;   check (short, 8, v0, v1, 2, |, r);
    64  
    65      f1 = 2. + f0;  f2 = fvec_2 + f0; veccompare (float, 4, f1, f2);
    66      f1 = 2. - f0;  f2 = fvec_2 - f0; veccompare (float, 4, f1, f2);
    67      f1 = 2. * f0;  f2 = fvec_2 * f0; veccompare (float, 4, f1, f2);
    68      f1 = 2. / f0;  f2 = fvec_2 / f0; veccompare (float, 4, f1, f2);
    69  
    70      f1 = f0 + 2.;  f2 = f0 + fvec_2; veccompare (float, 4, f1, f2);
    71      f1 = f0 - 2.;  f2 = f0 - fvec_2; veccompare (float, 4, f1, f2);
    72      f1 = f0 * 2.;  f2 = f0 * fvec_2; veccompare (float, 4, f1, f2);
    73      f1 = f0 / 2.;  f2 = f0 / fvec_2; veccompare (float, 4, f1, f2);
    74  
    75      d1 = 2. + d0;  d2 = dvec_2 + d0; veccompare (double, 2, d1, d2);
    76      d1 = 2. - d0;  d2 = dvec_2 - d0; veccompare (double, 2, d1, d2);
    77      d1 = 2. * d0;  d2 = dvec_2 * d0; veccompare (double, 2, d1, d2);
    78      d1 = 2. / d0;  d2 = dvec_2 / d0; veccompare (double, 2, d1, d2);
    79  
    80      d1 = d0 + 2.;  d2 = d0 + dvec_2; veccompare (double, 2, d1, d2);
    81      d1 = d0 - 2.;  d2 = d0 - dvec_2; veccompare (double, 2, d1, d2);
    82      d1 = d0 * 2.;  d2 = d0 * dvec_2; veccompare (double, 2, d1, d2);
    83      d1 = d0 / 2.;  d2 = d0 / dvec_2; veccompare (double, 2, d1, d2);
    84  
    85      return 0;
    86  }