1  /* Test whether using target specific options, we can use the x86 builtin
       2     functions in functions with the appropriate function specific options.  */
       3  /* { dg-do compile } */
       4  /* { dg-skip-if "" { *-*-* } { "-march=*" } { "-march=k8" } } */
       5  /* { dg-options "-O2 -march=k8 -mno-sse3 -mfpmath=sse" } */
       6  
       7  typedef float     __m128  __attribute__ ((__vector_size__ (16), __may_alias__));
       8  typedef double    __m128d __attribute__ ((__vector_size__ (16), __may_alias__));
       9  typedef int	  __m128w __attribute__ ((__vector_size__ (16), __may_alias__));
      10  typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
      11  typedef char __m128qi __attribute__ ((__vector_size__ (16), __may_alias__));
      12  
      13  #ifdef __SSE3__
      14  #error "-msse3 should not be set for this test"
      15  #endif
      16  
      17  __m128d sse3_hsubpd (__m128d a, __m128d b) __attribute__((__target__("sse3")));
      18  __m128d generic_hsubpd (__m128d a, __m128d b);
      19  
      20  __m128d
      21  sse3_hsubpd (__m128d a, __m128d b)
      22  {
      23    return __builtin_ia32_hsubpd (a, b);
      24  }
      25  
      26  __m128d
      27  generic_hsubpd (__m128d a, __m128d b)
      28  {
      29    return __builtin_ia32_hsubpd (a, b);			/* { dg-error "needs isa option" } */
      30  }
      31  
      32  #ifdef __SSSE3__
      33  #error "-mssse3 should not be set for this test"
      34  #endif
      35  
      36  __m128w ssse3_psignd128 (__m128w a, __m128w b) __attribute__((__target__("ssse3")));
      37  __m128w generic_psignd (__m128w ab, __m128w b);
      38  
      39  __m128w
      40  ssse3_psignd128 (__m128w a, __m128w b)
      41  {
      42    return __builtin_ia32_psignd128 (a, b);
      43  }
      44  
      45  __m128w
      46  generic_psignd128 (__m128w a, __m128w b)
      47  {
      48    return __builtin_ia32_psignd128 (a, b);		/* { dg-error "needs isa option" } */
      49  }
      50  
      51  #ifdef __SSE4_1__
      52  #error "-msse4.1 should not be set for this test"
      53  #endif
      54  
      55  __m128 sse4_1_roundv4sf2 (__m128 a) __attribute__((__target__("sse4.1")));
      56  __m128 generic_roundv4sf2 (__m128 a);
      57  
      58  __m128
      59  sse4_1_roundv4sf2  (__m128 a)
      60  {
      61    return __builtin_ia32_roundps_az (a);
      62  }
      63  
      64  __m128
      65  generic_blendvpd  (__m128 a)
      66  {
      67    return __builtin_ia32_roundps_az (a);		/* { dg-error "needs isa option" } */
      68  }
      69  
      70  #ifdef __SSE4_2__
      71  #error "-msse4.2 should not be set for this test"
      72  #endif
      73  
      74  __m128qi sse4_2_cmpistrm (__m128qi a, __m128qi b) __attribute__((__target__("sse4.2")));
      75  __m128qi generic_cmpistrm (__m128qi a, __m128qi b);
      76  
      77  __m128qi
      78  sse4_2_cmpistrm (__m128qi a, __m128qi b)
      79  {
      80    return  __builtin_ia32_pcmpistrm128 (a, b, 0);
      81  }
      82  
      83  __m128qi
      84  generic_comistrm (__m128qi a, __m128qi b)
      85  {
      86    return  __builtin_ia32_pcmpistrm128 (a, b, 0);	/* { dg-error "needs isa option" } */
      87  }
      88  
      89  #ifdef __SSE4A__
      90  #error "-msse4a should not be set for this test"
      91  #endif
      92  
      93  __m128i sse4_2_insertq (__m128i a, __m128i b) __attribute__((__target__("sse4a")));
      94  __m128i generic_insertq (__m128i ab, __m128i b);
      95  
      96  __m128i
      97  sse4_2_insertq (__m128i a, __m128i b)
      98  {
      99    return __builtin_ia32_insertq (a, b);
     100  }
     101  
     102  __m128i
     103  generic_insertq (__m128i a, __m128i b)
     104  {
     105    return __builtin_ia32_insertq (a, b);			/* { dg-error "needs isa option" } */
     106  }
     107  
     108  #ifdef __FMA4__
     109  #error "-mfma4 should not be set for this test"
     110  #endif
     111  
     112  __m128d fma4_fmaddpd (__m128d a, __m128d b, __m128d c) __attribute__((__target__("fma4")));
     113  __m128d generic_fmaddpd (__m128d a, __m128d b, __m128d c);
     114  
     115  __m128d
     116  fma4_fmaddpd  (__m128d a, __m128d b, __m128d c)
     117  {
     118    return __builtin_ia32_vfmaddpd (a, b, c);
     119  }
     120  
     121  __m128d
     122  generic_fmaddpd  (__m128d a, __m128d b, __m128d c)
     123  {
     124    return __builtin_ia32_vfmaddpd (a, b, c);		/* { dg-error "needs isa option" } */
     125  }
     126  
     127  #ifdef __AES__
     128  #error "-maes should not be set for this test"
     129  #endif
     130  
     131  __m128i aes_aesimc128 (__m128i a) __attribute__((__target__("aes")));
     132  __m128i generic_aesimc128 (__m128i a);
     133  
     134  __m128i
     135  aes_aesimc128 (__m128i a)
     136  {
     137    return __builtin_ia32_aesimc128 (a);
     138  }
     139  
     140  __m128i
     141  generic_aesimc128 (__m128i a)
     142  {
     143    return __builtin_ia32_aesimc128 (a);			/* { dg-error "needs isa option" } */
     144  }
     145  
     146  #ifdef __PCLMUL__
     147  #error "-mpclmul should not be set for this test"
     148  #endif
     149  
     150  __m128i pclmul_pclmulqdq128 (__m128i a, __m128i b) __attribute__((__target__("pclmul")));
     151  __m128i generic_pclmulqdq128 (__m128i a, __m128i b);
     152  
     153  __m128i
     154  pclmul_pclmulqdq128 (__m128i a, __m128i b)
     155  {
     156    return __builtin_ia32_pclmulqdq128 (a, b, 5);
     157  }
     158  
     159  __m128i
     160  generic_pclmulqdq128 (__m128i a, __m128i b)
     161  {
     162    return __builtin_ia32_pclmulqdq128 (a, b, 5);		/* { dg-error "needs isa option" } */
     163  }