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"
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);
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))
33 if (!isnormal (source
))
35 src
= (src
& 0xffbfffff);
37 while (!(src
& 0x400000))
39 src
+= fraction
& 0x400000;
40 fraction
= fraction
<< 1;
51 exp
= ((exp
- 0x7f) & 0x1) ? 0x7e : 0x7f;
57 exp
= (fraction
& 0x400000) ? 0x7e : 0x7f;
63 bin_conv
.int_val
= (sign
<< 31) | (exp
<< 23) | fraction
;
65 return bin_conv
.fp_val
;
70 compute_vgetmantss (float *r
, float *s1
, float *s2
, int interv
,
74 r
[0] = get_norm_mant (s2
[0], signctrl
, interv
);
75 for (i
= 1; i
< 4; i
++)
84 union128 res1
, src1
, src2
;
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
))