xref: /aosp_15_r20/external/FP16/test/ieee-to-fp32-psimd.cc (revision 5f32b7105932ea8520a0e8811c640f936367d707)
1*5f32b710SXin Li #include <gtest/gtest.h>
2*5f32b710SXin Li 
3*5f32b710SXin Li #include <cstdint>
4*5f32b710SXin Li 
5*5f32b710SXin Li #include <fp16.h>
6*5f32b710SXin Li #include <fp16/psimd.h>
7*5f32b710SXin Li 
8*5f32b710SXin Li 
TEST(FP16_IEEE_TO_FP32_PSIMD,infinity)9*5f32b710SXin Li TEST(FP16_IEEE_TO_FP32_PSIMD, infinity) {
10*5f32b710SXin Li 	const uint16_t positive_infinity_f16 = UINT16_C(0x7C00);
11*5f32b710SXin Li 	const uint16_t negative_infinity_f16 = UINT16_C(0xFC00);
12*5f32b710SXin Li 
13*5f32b710SXin Li 	const uint32_t positive_infinity_f32 = UINT32_C(0x7F800000);
14*5f32b710SXin Li 	const uint32_t negative_infinity_f32 = UINT32_C(0xFF800000);
15*5f32b710SXin Li 
16*5f32b710SXin Li 	const psimd_u16 fp16 = {
17*5f32b710SXin Li 		positive_infinity_f16, negative_infinity_f16,
18*5f32b710SXin Li 		negative_infinity_f16, positive_infinity_f16
19*5f32b710SXin Li 	};
20*5f32b710SXin Li 	const psimd_u32 fp32 = (psimd_u32) fp16_ieee_to_fp32_psimd(fp16);
21*5f32b710SXin Li 
22*5f32b710SXin Li 	EXPECT_EQ(positive_infinity_f32, fp32[0]) <<
23*5f32b710SXin Li 		std::hex << std::uppercase << std::setfill('0') <<
24*5f32b710SXin Li 		"F16 = 0x" << std::setw(4) << fp16[0] << ", " <<
25*5f32b710SXin Li 		"F32(F16) = 0x" << std::setw(8) << fp32[0] << ", " <<
26*5f32b710SXin Li 		"F32 = 0x" << std::setw(8) << positive_infinity_f32;
27*5f32b710SXin Li 	EXPECT_EQ(negative_infinity_f32, fp32[1]) <<
28*5f32b710SXin Li 		std::hex << std::uppercase << std::setfill('0') <<
29*5f32b710SXin Li 		"F16 = 0x" << std::setw(4) << fp16[1] << ", " <<
30*5f32b710SXin Li 		"F32(F16) = 0x" << std::setw(8) << fp32[1] << ", " <<
31*5f32b710SXin Li 		"F32 = 0x" << std::setw(8) << negative_infinity_f32;
32*5f32b710SXin Li 	EXPECT_EQ(negative_infinity_f32, fp32[2]) <<
33*5f32b710SXin Li 		std::hex << std::uppercase << std::setfill('0') <<
34*5f32b710SXin Li 		"F16 = 0x" << std::setw(4) << fp16[2] << ", " <<
35*5f32b710SXin Li 		"F32(F16) = 0x" << std::setw(8) << fp32[2] << ", " <<
36*5f32b710SXin Li 		"F32 = 0x" << std::setw(8) << negative_infinity_f32;
37*5f32b710SXin Li 	EXPECT_EQ(positive_infinity_f32, fp32[3]) <<
38*5f32b710SXin Li 		std::hex << std::uppercase << std::setfill('0') <<
39*5f32b710SXin Li 		"F16 = 0x" << std::setw(4) << fp16[3] << ", " <<
40*5f32b710SXin Li 		"F32(F16) = 0x" << std::setw(8) << fp32[3] << ", " <<
41*5f32b710SXin Li 		"F32 = 0x" << std::setw(8) << positive_infinity_f32;
42*5f32b710SXin Li }
43*5f32b710SXin Li 
TEST(FP16_IEEE_TO_FP32_PSIMD,positive_nan)44*5f32b710SXin Li TEST(FP16_IEEE_TO_FP32_PSIMD, positive_nan) {
45*5f32b710SXin Li 	for (uint16_t h = 0; h < 0x0400; h += 4) {
46*5f32b710SXin Li 		const psimd_u16 fp16 = {
47*5f32b710SXin Li 			(uint16_t) (h + 0x7C00 + (h == 0)) /* Avoid infinity */,
48*5f32b710SXin Li 			(uint16_t) (h + 0x7C01),
49*5f32b710SXin Li 			(uint16_t) (h + 0x7C02),
50*5f32b710SXin Li 			(uint16_t) (h + 0x7C03),
51*5f32b710SXin Li 		};
52*5f32b710SXin Li 		const psimd_u32 fp32 = (psimd_u32) fp16_ieee_to_fp32_psimd(fp16);
53*5f32b710SXin Li 
54*5f32b710SXin Li 		/* Check sign */
55*5f32b710SXin Li 		EXPECT_EQ(fp32[0] & UINT32_C(0x80000000), 0) <<
56*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
57*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[0] << ", " <<
58*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[0];
59*5f32b710SXin Li 		EXPECT_EQ(fp32[1] & UINT32_C(0x80000000), 0) <<
60*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
61*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[1] << ", " <<
62*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[1];
63*5f32b710SXin Li 		EXPECT_EQ(fp32[2] & UINT32_C(0x80000000), 0) <<
64*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
65*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[2] << ", " <<
66*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[2];
67*5f32b710SXin Li 		EXPECT_EQ(fp32[3] & UINT32_C(0x80000000), 0) <<
68*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
69*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[3] << ", " <<
70*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[3];
71*5f32b710SXin Li 
72*5f32b710SXin Li 		/* Check exponent */
73*5f32b710SXin Li 		EXPECT_EQ(fp32[0] & UINT32_C(0x7F800000), UINT32_C(0x7F800000)) <<
74*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
75*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[0] << ", " <<
76*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[0];
77*5f32b710SXin Li 		EXPECT_EQ(fp32[1] & UINT32_C(0x7F800000), UINT32_C(0x7F800000)) <<
78*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
79*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[1] << ", " <<
80*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[1];
81*5f32b710SXin Li 		EXPECT_EQ(fp32[2] & UINT32_C(0x7F800000), UINT32_C(0x7F800000)) <<
82*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
83*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[2] << ", " <<
84*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[2];
85*5f32b710SXin Li 		EXPECT_EQ(fp32[3] & UINT32_C(0x7F800000), UINT32_C(0x7F800000)) <<
86*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
87*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[3] << ", " <<
88*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[3];
89*5f32b710SXin Li 
90*5f32b710SXin Li 		/* Check mantissa */
91*5f32b710SXin Li 		EXPECT_NE(fp32[0] & UINT32_C(0x007FFFFF), UINT32_C(0)) <<
92*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
93*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[0] << ", " <<
94*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[0];
95*5f32b710SXin Li 		EXPECT_NE(fp32[1] & UINT32_C(0x007FFFFF), UINT32_C(0)) <<
96*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
97*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[1] << ", " <<
98*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[1];
99*5f32b710SXin Li 		EXPECT_NE(fp32[2] & UINT32_C(0x007FFFFF), UINT32_C(0)) <<
100*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
101*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[2] << ", " <<
102*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[2];
103*5f32b710SXin Li 		EXPECT_NE(fp32[3] & UINT32_C(0x007FFFFF), UINT32_C(0)) <<
104*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
105*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[3] << ", " <<
106*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[3];
107*5f32b710SXin Li 	}
108*5f32b710SXin Li }
109*5f32b710SXin Li 
TEST(FP16_IEEE_TO_FP32_PSIMD,negative_nan)110*5f32b710SXin Li TEST(FP16_IEEE_TO_FP32_PSIMD, negative_nan) {
111*5f32b710SXin Li 	for (uint16_t h = 0; h < 0x0400; h += 4) {
112*5f32b710SXin Li 		const psimd_u16 fp16 = {
113*5f32b710SXin Li 			(uint16_t) (h + 0xFC00 + (h == 0)) /* Avoid infinity */,
114*5f32b710SXin Li 			(uint16_t) (h + 0xFC01),
115*5f32b710SXin Li 			(uint16_t) (h + 0xFC02),
116*5f32b710SXin Li 			(uint16_t) (h + 0xFC03),
117*5f32b710SXin Li 		};
118*5f32b710SXin Li 		const psimd_u32 fp32 = (psimd_u32) fp16_ieee_to_fp32_psimd(fp16);
119*5f32b710SXin Li 
120*5f32b710SXin Li 		/* Check sign */
121*5f32b710SXin Li 		EXPECT_EQ(fp32[0] & UINT32_C(0x80000000), UINT32_C(0x80000000)) <<
122*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
123*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[0] << ", " <<
124*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[0];
125*5f32b710SXin Li 		EXPECT_EQ(fp32[1] & UINT32_C(0x80000000), UINT32_C(0x80000000)) <<
126*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
127*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[1] << ", " <<
128*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[1];
129*5f32b710SXin Li 		EXPECT_EQ(fp32[2] & UINT32_C(0x80000000), UINT32_C(0x80000000)) <<
130*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
131*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[2] << ", " <<
132*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[2];
133*5f32b710SXin Li 		EXPECT_EQ(fp32[3] & UINT32_C(0x80000000), UINT32_C(0x80000000)) <<
134*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
135*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[3] << ", " <<
136*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[3];
137*5f32b710SXin Li 
138*5f32b710SXin Li 		/* Check exponent */
139*5f32b710SXin Li 		EXPECT_EQ(fp32[0] & UINT32_C(0x7F800000), UINT32_C(0x7F800000)) <<
140*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
141*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[0] << ", " <<
142*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[0];
143*5f32b710SXin Li 		EXPECT_EQ(fp32[1] & UINT32_C(0x7F800000), UINT32_C(0x7F800000)) <<
144*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
145*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[1] << ", " <<
146*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[1];
147*5f32b710SXin Li 		EXPECT_EQ(fp32[2] & UINT32_C(0x7F800000), UINT32_C(0x7F800000)) <<
148*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
149*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[2] << ", " <<
150*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[2];
151*5f32b710SXin Li 		EXPECT_EQ(fp32[3] & UINT32_C(0x7F800000), UINT32_C(0x7F800000)) <<
152*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
153*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[3] << ", " <<
154*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[3];
155*5f32b710SXin Li 
156*5f32b710SXin Li 		/* Check mantissa */
157*5f32b710SXin Li 		EXPECT_NE(fp32[0] & UINT32_C(0x007FFFFF), UINT32_C(0)) <<
158*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
159*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[0] << ", " <<
160*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[0];
161*5f32b710SXin Li 		EXPECT_NE(fp32[1] & UINT32_C(0x007FFFFF), UINT32_C(0)) <<
162*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
163*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[1] << ", " <<
164*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[1];
165*5f32b710SXin Li 		EXPECT_NE(fp32[2] & UINT32_C(0x007FFFFF), UINT32_C(0)) <<
166*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
167*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[2] << ", " <<
168*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[2];
169*5f32b710SXin Li 		EXPECT_NE(fp32[3] & UINT32_C(0x007FFFFF), UINT32_C(0)) <<
170*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
171*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[3] << ", " <<
172*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[3];
173*5f32b710SXin Li 	}
174*5f32b710SXin Li }
175*5f32b710SXin Li 
TEST(FP16_IEEE_TO_FP32_PSIMD,positive_normalized_values)176*5f32b710SXin Li TEST(FP16_IEEE_TO_FP32_PSIMD, positive_normalized_values) {
177*5f32b710SXin Li 	const uint32_t exponentBias = 15;
178*5f32b710SXin Li 	for (int32_t e = -14; e <= 15; e++) {
179*5f32b710SXin Li 		for (uint16_t h = 0; h < 0x0400; h += 4) {
180*5f32b710SXin Li 			const psimd_u16 fp16 = {
181*5f32b710SXin Li 				(uint16_t) (h + ((e + exponentBias) << 10) + 0),
182*5f32b710SXin Li 				(uint16_t) (h + ((e + exponentBias) << 10) + 1),
183*5f32b710SXin Li 				(uint16_t) (h + ((e + exponentBias) << 10) + 2),
184*5f32b710SXin Li 				(uint16_t) (h + ((e + exponentBias) << 10) + 3),
185*5f32b710SXin Li 			};
186*5f32b710SXin Li 			const psimd_u32 fp32 = (psimd_u32) fp16_ieee_to_fp32_psimd(fp16);
187*5f32b710SXin Li 
188*5f32b710SXin Li 			EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[0]), fp32[0]) <<
189*5f32b710SXin Li 				std::hex << std::uppercase << std::setfill('0') <<
190*5f32b710SXin Li 				"F16 = 0x" << std::setw(4) << fp16[0] << ", " <<
191*5f32b710SXin Li 				"F32(F16) = 0x" << std::setw(8) << fp32[0] << ", " <<
192*5f32b710SXin Li 				"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[0]);
193*5f32b710SXin Li 			EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[1]), fp32[1]) <<
194*5f32b710SXin Li 				std::hex << std::uppercase << std::setfill('0') <<
195*5f32b710SXin Li 				"F16 = 0x" << std::setw(4) << fp16[1] << ", " <<
196*5f32b710SXin Li 				"F32(F16) = 0x" << std::setw(8) << fp32[1] << ", " <<
197*5f32b710SXin Li 				"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[1]);
198*5f32b710SXin Li 			EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[2]), fp32[2]) <<
199*5f32b710SXin Li 				std::hex << std::uppercase << std::setfill('0') <<
200*5f32b710SXin Li 				"F16 = 0x" << std::setw(4) << fp16[2] << ", " <<
201*5f32b710SXin Li 				"F32(F16) = 0x" << std::setw(8) << fp32[2] << ", " <<
202*5f32b710SXin Li 				"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[2]);
203*5f32b710SXin Li 			EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[3]), fp32[3]) <<
204*5f32b710SXin Li 				std::hex << std::uppercase << std::setfill('0') <<
205*5f32b710SXin Li 				"F16 = 0x" << std::setw(4) << fp16[3] << ", " <<
206*5f32b710SXin Li 				"F32(F16) = 0x" << std::setw(8) << fp32[3] << ", " <<
207*5f32b710SXin Li 				"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[3]);
208*5f32b710SXin Li 		}
209*5f32b710SXin Li 	}
210*5f32b710SXin Li }
211*5f32b710SXin Li 
TEST(FP16_IEEE_TO_FP32_PSIMD,negative_normalized_values)212*5f32b710SXin Li TEST(FP16_IEEE_TO_FP32_PSIMD, negative_normalized_values) {
213*5f32b710SXin Li 	const uint32_t exponentBias = 15;
214*5f32b710SXin Li 	for (int32_t e = -14; e <= 15; e++) {
215*5f32b710SXin Li 		for (uint16_t h = 0; h < 0x0400; h += 4) {
216*5f32b710SXin Li 			const psimd_u16 fp16 = {
217*5f32b710SXin Li 				(uint16_t) (h + ((e + exponentBias) << 10) + 0x8000),
218*5f32b710SXin Li 				(uint16_t) (h + ((e + exponentBias) << 10) + 0x8001),
219*5f32b710SXin Li 				(uint16_t) (h + ((e + exponentBias) << 10) + 0x8002),
220*5f32b710SXin Li 				(uint16_t) (h + ((e + exponentBias) << 10) + 0x8003),
221*5f32b710SXin Li 			};
222*5f32b710SXin Li 			const psimd_u32 fp32 = (psimd_u32) fp16_ieee_to_fp32_psimd(fp16);
223*5f32b710SXin Li 
224*5f32b710SXin Li 			EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[0]), fp32[0]) <<
225*5f32b710SXin Li 				std::hex << std::uppercase << std::setfill('0') <<
226*5f32b710SXin Li 				"F16 = 0x" << std::setw(4) << fp16[0] << ", " <<
227*5f32b710SXin Li 				"F32(F16) = 0x" << std::setw(8) << fp32[0] << ", " <<
228*5f32b710SXin Li 				"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[0]);
229*5f32b710SXin Li 			EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[1]), fp32[1]) <<
230*5f32b710SXin Li 				std::hex << std::uppercase << std::setfill('0') <<
231*5f32b710SXin Li 				"F16 = 0x" << std::setw(4) << fp16[1] << ", " <<
232*5f32b710SXin Li 				"F32(F16) = 0x" << std::setw(8) << fp32[1] << ", " <<
233*5f32b710SXin Li 				"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[1]);
234*5f32b710SXin Li 			EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[2]), fp32[2]) <<
235*5f32b710SXin Li 				std::hex << std::uppercase << std::setfill('0') <<
236*5f32b710SXin Li 				"F16 = 0x" << std::setw(4) << fp16[2] << ", " <<
237*5f32b710SXin Li 				"F32(F16) = 0x" << std::setw(8) << fp32[2] << ", " <<
238*5f32b710SXin Li 				"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[2]);
239*5f32b710SXin Li 			EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[3]), fp32[3]) <<
240*5f32b710SXin Li 				std::hex << std::uppercase << std::setfill('0') <<
241*5f32b710SXin Li 				"F16 = 0x" << std::setw(4) << fp16[3] << ", " <<
242*5f32b710SXin Li 				"F32(F16) = 0x" << std::setw(8) << fp32[3] << ", " <<
243*5f32b710SXin Li 				"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[3]);
244*5f32b710SXin Li 		}
245*5f32b710SXin Li 	}
246*5f32b710SXin Li }
247*5f32b710SXin Li 
TEST(FP16_IEEE_TO_FP32_PSIMD,positive_denormalized_values)248*5f32b710SXin Li TEST(FP16_IEEE_TO_FP32_PSIMD, positive_denormalized_values) {
249*5f32b710SXin Li 	for (uint16_t h = 0; h < 0x0400; h += 4) {
250*5f32b710SXin Li 		const psimd_u16 fp16 = {
251*5f32b710SXin Li 			(uint16_t) (h + 0),
252*5f32b710SXin Li 			(uint16_t) (h + 1),
253*5f32b710SXin Li 			(uint16_t) (h + 2),
254*5f32b710SXin Li 			(uint16_t) (h + 3),
255*5f32b710SXin Li 		};
256*5f32b710SXin Li 		const psimd_u32 fp32 = (psimd_u32) fp16_ieee_to_fp32_psimd(fp16);
257*5f32b710SXin Li 
258*5f32b710SXin Li 		EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[0]), fp32[0]) <<
259*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
260*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[0] << ", " <<
261*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[0] << ", " <<
262*5f32b710SXin Li 			"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[0]);
263*5f32b710SXin Li 		EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[1]), fp32[1]) <<
264*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
265*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[1] << ", " <<
266*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[1] << ", " <<
267*5f32b710SXin Li 			"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[1]);
268*5f32b710SXin Li 		EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[2]), fp32[2]) <<
269*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
270*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[2] << ", " <<
271*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[2] << ", " <<
272*5f32b710SXin Li 			"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[2]);
273*5f32b710SXin Li 		EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[3]), fp32[3]) <<
274*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
275*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[3] << ", " <<
276*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[3] << ", " <<
277*5f32b710SXin Li 			"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[3]);
278*5f32b710SXin Li 	}
279*5f32b710SXin Li }
280*5f32b710SXin Li 
TEST(FP16_IEEE_TO_FP32_PSIMD,negative_denormalized_values)281*5f32b710SXin Li TEST(FP16_IEEE_TO_FP32_PSIMD, negative_denormalized_values) {
282*5f32b710SXin Li 	for (uint16_t h = 0; h < 0x0400; h += 4) {
283*5f32b710SXin Li 		const psimd_u16 fp16 = {
284*5f32b710SXin Li 			(uint16_t) (h + 0x8000),
285*5f32b710SXin Li 			(uint16_t) (h + 0x8001),
286*5f32b710SXin Li 			(uint16_t) (h + 0x8002),
287*5f32b710SXin Li 			(uint16_t) (h + 0x8003),
288*5f32b710SXin Li 		};
289*5f32b710SXin Li 		const psimd_u32 fp32 = (psimd_u32) fp16_ieee_to_fp32_psimd(fp16);
290*5f32b710SXin Li 
291*5f32b710SXin Li 		EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[0]), fp32[0]) <<
292*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
293*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[0] << ", " <<
294*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[0] << ", " <<
295*5f32b710SXin Li 			"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[0]);
296*5f32b710SXin Li 		EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[1]), fp32[1]) <<
297*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
298*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[1] << ", " <<
299*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[1] << ", " <<
300*5f32b710SXin Li 			"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[1]);
301*5f32b710SXin Li 		EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[2]), fp32[2]) <<
302*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
303*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[2] << ", " <<
304*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[2] << ", " <<
305*5f32b710SXin Li 			"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[2]);
306*5f32b710SXin Li 		EXPECT_EQ(fp16_ieee_to_fp32_bits(fp16[3]), fp32[3]) <<
307*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
308*5f32b710SXin Li 			"F16 = 0x" << std::setw(4) << fp16[3] << ", " <<
309*5f32b710SXin Li 			"F32(F16) = 0x" << std::setw(8) << fp32[3] << ", " <<
310*5f32b710SXin Li 			"F32 = 0x" << std::setw(8) << fp16_ieee_to_fp32_bits(fp16[3]);
311*5f32b710SXin Li 	}
312*5f32b710SXin Li }
313