xref: /aosp_15_r20/external/FP16/test/bitcasts.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 
7*5f32b710SXin Li 
TEST(FP32_TO_BITS,positive)8*5f32b710SXin Li TEST(FP32_TO_BITS, positive) {
9*5f32b710SXin Li 	for (uint32_t bits = UINT32_C(0x00000000); bits <= UINT32_C(0x7FFFFFFF); bits++) {
10*5f32b710SXin Li 		float value;
11*5f32b710SXin Li 		memcpy(&value, &bits, sizeof(value));
12*5f32b710SXin Li 
13*5f32b710SXin Li 		ASSERT_EQ(bits, fp32_to_bits(value)) <<
14*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
15*5f32b710SXin Li 			"BITS = 0x" << std::setw(8) << bits << ", " <<
16*5f32b710SXin Li 			"BITCAST(VALUE) = 0x" << std::setw(8) << fp32_to_bits(value);
17*5f32b710SXin Li 	}
18*5f32b710SXin Li }
19*5f32b710SXin Li 
TEST(FP32_TO_BITS,negative)20*5f32b710SXin Li TEST(FP32_TO_BITS, negative) {
21*5f32b710SXin Li 	for (uint32_t bits = UINT32_C(0xFFFFFFFF); bits >= UINT32_C(0x80000000); bits--) {
22*5f32b710SXin Li 		float value;
23*5f32b710SXin Li 		memcpy(&value, &bits, sizeof(value));
24*5f32b710SXin Li 
25*5f32b710SXin Li 		ASSERT_EQ(bits, fp32_to_bits(value)) <<
26*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
27*5f32b710SXin Li 			"BITS = 0x" << std::setw(8) << bits << ", " <<
28*5f32b710SXin Li 			"BITCAST(VALUE) = 0x" << std::setw(8) << fp32_to_bits(value);
29*5f32b710SXin Li 	}
30*5f32b710SXin Li }
31*5f32b710SXin Li 
TEST(FP32_FROM_BITS,positive)32*5f32b710SXin Li TEST(FP32_FROM_BITS, positive) {
33*5f32b710SXin Li 	for (uint32_t bits = UINT32_C(0x00000000); bits <= UINT32_C(0x7FFFFFFF); bits++) {
34*5f32b710SXin Li 		const float value = fp32_from_bits(bits);
35*5f32b710SXin Li 		uint32_t bitcast;
36*5f32b710SXin Li 		memcpy(&bitcast, &value, sizeof(bitcast));
37*5f32b710SXin Li 
38*5f32b710SXin Li 		ASSERT_EQ(bits, bitcast) <<
39*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
40*5f32b710SXin Li 			"BITS = 0x" << std::setw(8) << bits << ", " <<
41*5f32b710SXin Li 			"VALUE = 0x" << std::setw(8) << bitcast;
42*5f32b710SXin Li 	}
43*5f32b710SXin Li }
44*5f32b710SXin Li 
TEST(FP32_FROM_BITS,negative)45*5f32b710SXin Li TEST(FP32_FROM_BITS, negative) {
46*5f32b710SXin Li 	for (uint32_t bits = UINT32_C(0xFFFFFFFF); bits >= UINT32_C(0x80000000); bits--) {
47*5f32b710SXin Li 		const float value = fp32_from_bits(bits);
48*5f32b710SXin Li 		uint32_t bitcast;
49*5f32b710SXin Li 		memcpy(&bitcast, &value, sizeof(bitcast));
50*5f32b710SXin Li 
51*5f32b710SXin Li 		ASSERT_EQ(bits, bitcast) <<
52*5f32b710SXin Li 			std::hex << std::uppercase << std::setfill('0') <<
53*5f32b710SXin Li 			"BITS = 0x" << std::setw(8) << bits << ", " <<
54*5f32b710SXin Li 			"VALUE = 0x" << std::setw(8) << bitcast;
55*5f32b710SXin Li 	}
56*5f32b710SXin Li }
57