aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.target/i386/pr55829.c
blob: be70ba2f24f91ba4d2b0ac4b108f27acb446996c (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
/* { dg-do compile } */
/* { dg-options "-O2 -msse3 -fno-expensive-optimizations" } */

typedef double __m128d __attribute__ ((__vector_size__ (16)));

extern double p1[];
extern double p2[];
extern double ck[];
extern int n;

__attribute__((__noinline__, __noclone__)) int chk_pd (double *v1, double *v2)
{
  return v2[n] != v1[n];
}

static inline void sse3_test_movddup_reg_subsume_ldsd (double *i1, double *r)
{
  __m128d t1 = (__m128d){*i1, 0};
  __m128d t2 = __builtin_ia32_shufpd (t1, t1, 0);
  __builtin_ia32_storeupd (r, t2);
}

int sse3_test (void)
{
  int i = 0;
  int fail = 0;
  for (; i < 80; i += 1)
    {
      ck[0] = p1[0];
      fail += chk_pd (ck, p2);
      sse3_test_movddup_reg_subsume_ldsd (p1, p2);
    }
  return fail;
}