(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx512vl-vround-1.c
       1  /* { dg-do compile { target { ! ia32 } } } */
       2  /* { dg-options "-Ofast -mavx512vl" } */
       3  
       4  #include <x86intrin.h>
       5  
       6  __attribute__((noinline, noclone)) double
       7  f1 (double x)
       8  {
       9    register double a __asm__ ("xmm16") = __builtin_round (x);
      10    __asm__ ("" : "+v" (a));
      11    return a;
      12  }
      13  
      14  __attribute__((noinline, noclone)) float
      15  f2 (float x)
      16  {
      17    register float a __asm__ ("xmm16") = __builtin_roundf (x);
      18    __asm__ ("" : "+v" (a));
      19    return a;
      20  }
      21  
      22  __attribute__((noinline, noclone)) __m128d
      23  f3 (__m128d x, __m128d y)
      24  {
      25    register __m128d a __asm__ ("xmm16") = x, b __asm__ ("xmm17") = y;
      26    __asm__ ("" : "+v" (a), "+v" (b));
      27    a = _mm_round_sd (a, b, _MM_FROUND_NINT);
      28    __asm__ ("" : "+v" (a));
      29    return a;
      30  }
      31  
      32  __attribute__((noinline, noclone)) __m128
      33  f4 (__m128 x, __m128 y)
      34  {
      35    register __m128 a __asm__ ("xmm16") = x, b __asm__ ("xmm17") = y;
      36    __asm__ ("" : "+v" (a), "+v" (b));
      37    a = _mm_round_ss (a, b, _MM_FROUND_NINT);
      38    __asm__ ("" : "+v" (a));
      39    return a;
      40  }
      41  
      42  __attribute__((noinline, noclone)) __m128d
      43  f5 (__m128d x)
      44  {
      45    register __m128d a __asm__ ("xmm16") = x;
      46    __asm__ ("" : "+v" (a));
      47    a = _mm_round_pd (a, _MM_FROUND_NINT);
      48    __asm__ ("" : "+v" (a));
      49    return a;
      50  }
      51  
      52  __attribute__((noinline, noclone)) __m128
      53  f6 (__m128 x)
      54  {
      55    register __m128 a __asm__ ("xmm16") = x;
      56    __asm__ ("" : "+v" (a));
      57    a = _mm_round_ps (a, _MM_FROUND_NINT);
      58    __asm__ ("" : "+v" (a));
      59    return a;
      60  }
      61  
      62  __attribute__((noinline, noclone)) __m256d
      63  f7 (__m256d x)
      64  {
      65    register __m256d a __asm__ ("xmm16") = x;
      66    __asm__ ("" : "+v" (a));
      67    a = _mm256_round_pd (a, _MM_FROUND_NINT);
      68    __asm__ ("" : "+v" (a));
      69    return a;
      70  }
      71  
      72  __attribute__((noinline, noclone)) __m256
      73  f8 (__m256 x)
      74  {
      75    register __m256 a __asm__ ("xmm16") = x;
      76    __asm__ ("" : "+v" (a));
      77    a = _mm256_round_ps (a, _MM_FROUND_NINT);
      78    __asm__ ("" : "+v" (a));
      79    return a;
      80  }
      81  
      82  /* Instead of vround{sd,ss,pd,ps} this should use vrndscale{sd,ss,pd,ps}
      83     counterparts, so that [xy]mm1[67] can be referenced directly in the
      84     instructions.  */
      85  /* { dg-final { scan-assembler-times "vrndscalesd\[^\n\r\]*xmm" 2 } } */
      86  /* { dg-final { scan-assembler-times "vrndscaless\[^\n\r\]*xmm" 2 } } */
      87  /* { dg-final { scan-assembler-times "vrndscalepd\[^\n\r\]*xmm" 1 } } */
      88  /* { dg-final { scan-assembler-times "vrndscaleps\[^\n\r\]*xmm" 1 } } */
      89  /* { dg-final { scan-assembler-times "vrndscalepd\[^\n\r\]*ymm" 1 } } */
      90  /* { dg-final { scan-assembler-times "vrndscaleps\[^\n\r\]*ymm" 1 } } */
      91  /* { dg-final { scan-assembler-not "vroundsd\[^\n\r\]*xmm" } } */
      92  /* { dg-final { scan-assembler-not "vroundss\[^\n\r\]*xmm" } } */
      93  /* { dg-final { scan-assembler-not "vroundpd\[^\n\r\]*xmm" } } */
      94  /* { dg-final { scan-assembler-not "vroundps\[^\n\r\]*xmm" } } */
      95  /* { dg-final { scan-assembler-not "vroundpd\[^\n\r\]*ymm" } } */
      96  /* { dg-final { scan-assembler-not "vroundps\[^\n\r\]*ymm" } } */