2 /* { dg-options "-O2 -mavx512f" } */
3 /* { dg-require-effective-target avx512f } */
7 #include "avx512f-helper.h"
9 #define SIZE (AVX512F_LEN / 32)
10 #include "avx512f-mask-type.h"
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);
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))
40 if (!isnormal (source
))
42 src
= (src
& 0xffbfffff);
44 while (!(src
& 0x400000))
46 src
+= fraction
& 0x400000;
47 fraction
= fraction
<< 1;
58 exp
= ((exp
- 0x7f) & 0x1) ? 0x7e : 0x7f;
64 exp
= (fraction
& 0x400000) ? 0x7e : 0x7f;
70 bin_conv
.int_val
= (sign
<< 31) | (exp
<< 23) | fraction
;
72 return bin_conv
.fp_val
;
76 CALC (float *r
, float *s
, int interv
, int signctrl
)
79 for (i
= 0; i
< SIZE
; i
++)
81 r
[i
] = get_norm_mant (s
[i
], signctrl
, interv
);
89 UNION_TYPE (AVX512F_LEN
,) res1
, res2
, res3
, src
;
90 MASK_TYPE mask
= MASK_VALUE
;
92 int interv
= _MM_MANT_NORM_p5_1
;
93 int signctrl
= _MM_MANT_SIGN_src
;
96 for (i
= 0; i
< SIZE
; i
++)
98 src
.a
[i
] = 34.67 * i
* sign
;
101 for (i
= 0; i
< SIZE
; i
++)
102 res2
.a
[i
] = DEFAULT_VALUE
;
104 res1
.x
= INTRINSIC (_getmant_ps
) (src
.x
, interv
, signctrl
);
106 INTRINSIC (_mask_getmant_ps
) (res2
.x
, mask
, src
.x
, interv
,
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
))
116 MASK_MERGE ()(res_ref
, mask
, SIZE
);
117 if (UNION_CHECK (AVX512F_LEN
,) (res2
, res_ref
))
120 MASK_ZERO ()(res_ref
, mask
, SIZE
);
121 if (UNION_CHECK (AVX512F_LEN
,) (res3
, res_ref
))