1 /* { dg-do run } */
2 /* { dg-options "-mavx512f -O2" } */
3 /* { dg-require-effective-target avx512f } */
4
5 #define SIZE (128 / 32)
6
7 #include <math.h>
8 #include "avx512f-check.h"
9 #include "avx512f-mask-type.h"
10
11 static void
compute_rndscaless(float * s1,float * s2,float * r,int imm)12 compute_rndscaless (float *s1, float *s2, float *r, int imm)
13 {
14 int rc, m;
15 rc = imm & 0xf;
16 m = imm >> 4;
17
18 switch (rc)
19 {
20 case _MM_FROUND_FLOOR:
21 r[0] = __builtin_floorf (s2[0] * pow (2, m)) / pow (2, m);
22 break;
23 case _MM_FROUND_CEIL:
24 r[0] = __builtin_ceilf (s2[0] * pow (2, m)) / pow (2, m);
25 break;
26 default:
27 abort ();
28 break;
29 }
30
31 r[1] = s1[1];
32 r[2] = s1[2];
33 r[3] = s1[3];
34 }
35
36 static void
avx512f_test(void)37 avx512f_test (void)
38 {
39 int i, imm;
40 union128 s1, s2, res1, res2, res3, res4, res5, res6;
41 float res_ref[SIZE];
42
43 MASK_TYPE mask = MASK_VALUE;
44
45 imm = _MM_FROUND_FLOOR | (7 << 4);
46
47 s1.x = _mm_set_ps (4.05084, -1.23162, 2.00231, -6.22103);
48 s2.x = _mm_set_ps (-4.19319, -3.53222, 7.33527, 5.57655);
49
50 for(i = 0; i < SIZE; i++)
51 {
52 res2.a[i] = DEFAULT_VALUE;
53 res5.a[i] = DEFAULT_VALUE;
54 }
55
56 res1.x = _mm_roundscale_ss (s1.x, s2.x, imm);
57 res2.x = _mm_mask_roundscale_ss (res2.x, mask, s1.x, s2.x, imm);
58 res3.x = _mm_maskz_roundscale_ss (mask, s1.x, s2.x, imm);
59 res4.x = _mm_roundscale_round_ss (s1.x, s2.x, imm, _MM_FROUND_NO_EXC);
60 res5.x = _mm_mask_roundscale_round_ss (res5.x, mask, s1.x, s2.x, imm, _MM_FROUND_NO_EXC);
61 res6.x = _mm_maskz_roundscale_round_ss (mask, s1.x, s2.x, imm, _MM_FROUND_NO_EXC);
62
63 compute_rndscaless (s1.a, s2.a, res_ref, imm);
64
65 if (check_union128 (res1, res_ref))
66 abort ();
67
68 MASK_MERGE () (res_ref, mask, 1);
69 if (check_union128 (res2, res_ref))
70 abort ();
71
72 MASK_ZERO () (res_ref, mask, 1);
73 if (check_union128 (res3, res_ref))
74 abort ();
75
76 compute_rndscaless (s1.a, s2.a, res_ref, imm);
77
78 if (check_union128 (res4, res_ref))
79 abort ();
80
81 MASK_MERGE () (res_ref, mask, 1);
82 if (check_union128 (res5, res_ref))
83 abort ();
84
85 MASK_ZERO () (res_ref, mask, 1);
86 if (check_union128 (res6, res_ref))
87 abort ();
88 }
89