aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.target/i386/pr54703.c
blob: e30c293c0766b18c78ca21a7626419f08f9ece7f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* PR target/54703 */
/* { dg-do run { target sse2_runtime } } */
/* { dg-options "-O -msse2" } */
/* { dg-additional-options "-mavx -mtune=bdver1" { target avx_runtime } } */

extern void abort (void);
typedef double V __attribute__((vector_size(16)));

union {
  unsigned long long m[2];
  V v;
} u = { { 0xffffffffff000000ULL, 0xffffffffff000000ULL } };

static inline V
foo (V x)
{
  V y = __builtin_ia32_andpd (x, u.v);
  V z = __builtin_ia32_subpd (x, y);
  return __builtin_ia32_mulpd (y, z);
}

void
test (V *x)
{
  V a = { 2.1, 2.1 };
  *x = foo (foo (a));
}

int
main ()
{
  test (&u.v);
  if (u.m[0] != 0x3acbf487f0a30550ULL || u.m[1] != u.m[0])
    abort ();
  return 0;
}