1  /* { dg-do compile } */
       2  /* { dg-options "-O2 -msse3 -fno-expensive-optimizations" } */
       3  
       4  typedef double __m128d __attribute__ ((__vector_size__ (16)));
       5  
       6  extern double p1[];
       7  extern double p2[];
       8  extern double ck[];
       9  extern int n;
      10  
      11  __attribute__((__noinline__, __noclone__)) int chk_pd (double *v1, double *v2)
      12  {
      13    return v2[n] != v1[n];
      14  }
      15  
      16  static inline void sse3_test_movddup_reg_subsume_ldsd (double *i1, double *r)
      17  {
      18    __m128d t1 = (__m128d){*i1, 0};
      19    __m128d t2 = __builtin_ia32_shufpd (t1, t1, 0);
      20    __builtin_ia32_storeupd (r, t2);
      21  }
      22  
      23  int sse3_test (void)
      24  {
      25    int i = 0;
      26    int fail = 0;
      27    for (; i < 80; i += 1)
      28      {
      29        ck[0] = p1[0];
      30        fail += chk_pd (ck, p2);
      31        sse3_test_movddup_reg_subsume_ldsd (p1, p2);
      32      }
      33    return fail;
      34  }