* gcc.target/i386/pr70021.c: Add -mtune=skylake.
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / avx512vl-vround-1.c
blob55ea792fef7d0ac7521d774875cb079478c40d41
1 /* { dg-do compile { target { ! ia32 } } } */
2 /* { dg-options "-Ofast -mavx512vl" } */
4 #include <x86intrin.h>
6 __attribute__((noinline, noclone)) double
7 f1 (double x)
9 register double a __asm__ ("xmm16") = __builtin_round (x);
10 __asm__ ("" : "+v" (a));
11 return a;
14 __attribute__((noinline, noclone)) float
15 f2 (float x)
17 register float a __asm__ ("xmm16") = __builtin_roundf (x);
18 __asm__ ("" : "+v" (a));
19 return a;
22 __attribute__((noinline, noclone)) __m128d
23 f3 (__m128d x, __m128d y)
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;
32 __attribute__((noinline, noclone)) __m128
33 f4 (__m128 x, __m128 y)
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;
42 __attribute__((noinline, noclone)) __m128d
43 f5 (__m128d x)
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;
52 __attribute__((noinline, noclone)) __m128
53 f6 (__m128 x)
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;
62 __attribute__((noinline, noclone)) __m256d
63 f7 (__m256d x)
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;
72 __attribute__((noinline, noclone)) __m256
73 f8 (__m256 x)
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;
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" } } */