altivec-5280301.c   [plain text]


/* APPLE LOCAL file 5280301 */
/* { dg-do run { target powerpc*-*-darwin* } } */
/* { dg-options "-m64 -O3 -faltivec -std=c99" } */
typedef unsigned int uint32_t;
typedef uint32_t vuint32 __attribute__((__vector_size__(16)));

typedef union
{
  unsigned long long ul[2];
  vuint32 v;
} vec;

extern void abort ();

static int foo (vec *a, vec *b)
{
  for (int i = 0; i < 2; ++i)
  if (a->ul[i] != b->ul[i])
    return 1;
  return 0;
}

int main (void)
{
  vec t = { 0 };
  vec zero, one, signbit, test;
  int i;
  zero.ul[0] = 0;
  zero.ul[1] = 0;
  one.v = zero.v;
  one.ul[1] = 1;
  signbit.v = zero.v;
  signbit.ul[0] = 0;
  test.v = t.v & signbit.v;
  if (foo(&test, &zero))
    ;

  vec p = one;
  for (i = 0; i < 16; ++i)
  {
    if ((i < 15 && i[(unsigned char *) &p] != 0)
         || (i == 15 && i[(unsigned char *) &p] != 1))
      abort ();
  }
  return 0;
}