testsuite/
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / avx512f-vgetmantps-2.c
blobb8ea24d891b86f27fca5c6516d1c5de46a733732
1 /* { dg-do run } */
2 /* { dg-options "-O2 -mavx512f" } */
3 /* { dg-require-effective-target avx512f } */
5 #define AVX512F
7 #include "avx512f-helper.h"
9 #define SIZE (AVX512F_LEN / 32)
10 #include "avx512f-mask-type.h"
11 #include <math.h>
13 #ifndef GET_NORM_MANT
14 #define GET_NORM_MANT
16 union fp_int_t
18 int int_val;
19 float fp_val;
22 float
23 get_norm_mant (float source, int signctrl, int interv)
25 int src, sign, exp, fraction;
26 union fp_int_t bin_conv;
28 bin_conv.fp_val = source;
29 src = bin_conv.int_val;
30 sign = (signctrl & 0x1) ? 0 : (src >> 31);
31 exp = (src & 0x7f800000) >> 23;
32 fraction = (src & 0x7fffff);
34 if (isnan (source))
35 return signbit (source) ? -NAN : NAN;
36 if (source == 0.0 || source == -0.0 || isinf (source))
37 return sign ? -1.0 : 1.0;
38 if (signbit (source) && (signctrl & 0x2))
39 return -NAN;
40 if (!isnormal (source))
42 src = (src & 0xffbfffff);
43 exp = 0x7f;
44 while (!(src & 0x400000))
46 src += fraction & 0x400000;
47 fraction = fraction << 1;
48 exp--;
52 switch (interv)
54 case 0:
55 exp = 0x7f;
56 break;
57 case 1:
58 exp = ((exp - 0x7f) & 0x1) ? 0x7e : 0x7f;
59 break;
60 case 2:
61 exp = 0x7e;
62 break;
63 case 3:
64 exp = (fraction & 0x400000) ? 0x7e : 0x7f;
65 break;
66 default:
67 abort ();
70 bin_conv.int_val = (sign << 31) | (exp << 23) | fraction;
72 return bin_conv.fp_val;
74 #endif
76 CALC (float *r, float *s, int interv, int signctrl)
78 int i;
79 for (i = 0; i < SIZE; i++)
81 r[i] = get_norm_mant (s[i], signctrl, interv);
85 void static
86 TEST (void)
88 int i, sign;
89 UNION_TYPE (AVX512F_LEN,) res1, res2, res3, src;
90 MASK_TYPE mask = MASK_VALUE;
91 float res_ref[SIZE];
92 int interv = _MM_MANT_NORM_p5_1;
93 int signctrl = _MM_MANT_SIGN_src;
95 sign = -1;
96 for (i = 0; i < SIZE; i++)
98 src.a[i] = 34.67 * i * sign;
99 sign = sign * -1;
101 for (i = 0; i < SIZE; i++)
102 res2.a[i] = DEFAULT_VALUE;
104 res1.x = INTRINSIC (_getmant_ps) (src.x, interv, signctrl);
105 res2.x =
106 INTRINSIC (_mask_getmant_ps) (res2.x, mask, src.x, interv,
107 signctrl);
108 res3.x =
109 INTRINSIC (_maskz_getmant_ps) (mask, src.x, interv, signctrl);
111 CALC (res_ref, src.a, interv, signctrl);
113 if (UNION_CHECK (AVX512F_LEN,) (res1, res_ref))
114 abort ();
116 MASK_MERGE ()(res_ref, mask, SIZE);
117 if (UNION_CHECK (AVX512F_LEN,) (res2, res_ref))
118 abort ();
120 MASK_ZERO ()(res_ref, mask, SIZE);
121 if (UNION_CHECK (AVX512F_LEN,) (res3, res_ref))
122 abort ();