2016-12-21 Vladimir Makarov <vmakarov@redhat.com>
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / avx512f-vgetmantss-2.c
blob7c30ea7d8e66fe1c52501d9343905afe7f6cae4a
1 /* { dg-do run } */
2 /* { dg-options "-mavx512f -O2 -std=c99" } */
3 /* { dg-require-effective-target avx512f } */
4 /* { dg-require-effective-target c99_runtime } */
6 #include "avx512f-check.h"
7 #include <math.h>
9 union fp_int_t
11 int int_val;
12 float fp_val;
15 float
16 get_norm_mant (float source, int signctrl, int interv)
18 int src, sign, exp, fraction;
19 union fp_int_t bin_conv;
21 bin_conv.fp_val = source;
22 src = bin_conv.int_val;
23 sign = (signctrl & 0x1) ? 0 : (src >> 31);
24 exp = (src & 0x7f800000) >> 23;
25 fraction = (src & 0x7fffff);
27 if (isnan (source))
28 return signbit (source) ? -NAN : NAN;
29 if (source == 0.0 || source == -0.0 || isinf (source))
30 return sign ? -1.0 : 1.0;
31 if (signbit (source) && (signctrl & 0x2))
32 return -NAN;
33 if (!isnormal (source))
35 src = (src & 0xffbfffff);
36 exp = 0x7f;
37 while (!(src & 0x400000))
39 src += fraction & 0x400000;
40 fraction = fraction << 1;
41 exp--;
45 switch (interv)
47 case 0:
48 exp = 0x7f;
49 break;
50 case 1:
51 exp = ((exp - 0x7f) & 0x1) ? 0x7e : 0x7f;
52 break;
53 case 2:
54 exp = 0x7e;
55 break;
56 case 3:
57 exp = (fraction & 0x400000) ? 0x7e : 0x7f;
58 break;
59 default:
60 abort ();
63 bin_conv.int_val = (sign << 31) | (exp << 23) | fraction;
65 return bin_conv.fp_val;
69 static void
70 compute_vgetmantss (float *r, float *s1, float *s2, int interv,
71 int signctrl)
73 int i;
74 r[0] = get_norm_mant (s2[0], signctrl, interv);
75 for (i = 1; i < 4; i++)
77 r[i] = s1[i];
81 static void
82 avx512f_test (void)
84 union128 res1, src1, src2;
85 float res_ref[4];
86 int interv = _MM_MANT_NORM_p5_1;
87 int signctrl = _MM_MANT_SIGN_src;
89 src1.x = _mm_set_ps (-24.043, 68.346, -43.35, 546.46);
90 src2.x = _mm_set_ps (222.222, 333.333, 444.444, -2.0);
92 res1.x = _mm_getmant_ss (src1.x, src2.x, interv, signctrl);
94 compute_vgetmantss (res_ref, src1.a, src2.a, interv, signctrl);
96 if (check_union128 (res1, res_ref))
97 abort ();