/* { 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; }