1  extern
       2  #ifdef __cplusplus
       3  "C"
       4  #endif
       5  void abort (void);
       6  typedef int v4si __attribute__((vector_size (4 * sizeof (int))));
       7  typedef unsigned int v4usi __attribute__((vector_size (4 * sizeof (unsigned int))));
       8  typedef float v4sf __attribute__((vector_size (4 * sizeof (float))));
       9  typedef double v4df __attribute__((vector_size (4 * sizeof (double))));
      10  typedef long long v256di __attribute__((vector_size (256 * sizeof (long long))));
      11  typedef double v256df __attribute__((vector_size (256 * sizeof (double))));
      12  
      13  void
      14  f1 (v4usi *x, v4si *y)
      15  {
      16    *y = __builtin_convertvector (*x, v4si);
      17  }
      18  
      19  void
      20  f2 (v4sf *x, v4si *y)
      21  {
      22    *y = __builtin_convertvector (*x, v4si);
      23  }
      24  
      25  void
      26  f3 (v4si *x, v4sf *y)
      27  {
      28    *y = __builtin_convertvector (*x, v4sf);
      29  }
      30  
      31  void
      32  f4 (v4df *x, v4si *y)
      33  {
      34    *y = __builtin_convertvector (*x, v4si);
      35  }
      36  
      37  void
      38  f5 (v4si *x, v4df *y)
      39  {
      40    *y = __builtin_convertvector (*x, v4df);
      41  }
      42  
      43  void
      44  f6 (v256df *x, v256di *y)
      45  {
      46    *y = __builtin_convertvector (*x, v256di);
      47  }
      48  
      49  void
      50  f7 (v256di *x, v256df *y)
      51  {
      52    *y = __builtin_convertvector (*x, v256df);
      53  }
      54  
      55  void
      56  f8 (v4df *x)
      57  {
      58    v4si a = { 1, 2, -3, -4 };
      59    *x = __builtin_convertvector (a, v4df);
      60  }
      61  
      62  int
      63  main ()
      64  {
      65    union U1 { v4si v; int a[4]; } u1;
      66    union U2 { v4usi v; unsigned int a[4]; } u2;
      67    union U3 { v4sf v; float a[4]; } u3;
      68    union U4 { v4df v; double a[4]; } u4;
      69    union U5 { v256di v; long long a[256]; } u5;
      70    union U6 { v256df v; double a[256]; } u6;
      71    int i;
      72    for (i = 0; i < 4; i++)
      73      u2.a[i] = i * 2;
      74    f1 (&u2.v, &u1.v);
      75    for (i = 0; i < 4; i++)
      76      if (u1.a[i] != i * 2)
      77        abort ();
      78      else
      79        u3.a[i] = i - 2.25f;
      80    f2 (&u3.v, &u1.v);
      81    for (i = 0; i < 4; i++)
      82      if (u1.a[i] != (i == 3 ? 0 : i - 2))
      83        abort ();
      84      else
      85        u3.a[i] = i + 0.75f;
      86    f2 (&u3.v, &u1.v);
      87    for (i = 0; i < 4; i++)
      88      if (u1.a[i] != i)
      89        abort ();
      90      else
      91        u1.a[i] = 7 * i - 5;
      92    f3 (&u1.v, &u3.v);
      93    for (i = 0; i < 4; i++)
      94      if (u3.a[i] != 7 * i - 5)
      95        abort ();
      96      else
      97        u4.a[i] = i - 2.25;
      98    f4 (&u4.v, &u1.v);
      99    for (i = 0; i < 4; i++)
     100      if (u1.a[i] != (i == 3 ? 0 : i - 2))
     101        abort ();
     102      else
     103        u4.a[i] = i + 0.75;
     104    f4 (&u4.v, &u1.v);
     105    for (i = 0; i < 4; i++)
     106      if (u1.a[i] != i)
     107        abort ();
     108      else
     109        u1.a[i] = 7 * i - 5;
     110    f5 (&u1.v, &u4.v);
     111    for (i = 0; i < 4; i++)
     112      if (u4.a[i] != 7 * i - 5)
     113        abort ();
     114    for (i = 0; i < 256; i++)
     115      u6.a[i] = i - 128.25;
     116    f6 (&u6.v, &u5.v);
     117    for (i = 0; i < 256; i++)
     118      if (u5.a[i] != i - 128 - (i > 128))
     119        abort ();
     120      else
     121        u5.a[i] = i - 128;
     122    f7 (&u5.v, &u6.v);
     123    for (i = 0; i < 256; i++)
     124      if (u6.a[i] != i - 128)
     125        abort ();
     126    f8 (&u4.v);
     127    for (i = 0; i < 4; i++)
     128      if (u4.a[i] != (i >= 2 ? -1 - i : i + 1))
     129        abort ();
     130    return 0;
     131  }