19
19
#include <stdio.h>
20
20
#include <stdlib.h>
21
21
22
- #define VAL_FORMAT "%" PRIx32
23
- #define GET_VALUE (x ) (*(uint32_t *)x)
22
+
23
+ #define INT_FORMAT PRIx32
24
+ #define FLOAT_FORMAT "g"
25
+ #define VAL_FORMAT INT_FORMAT
26
+ #define INT_TYPE uint32_t
27
+ #define FLOAT_TYPE float
24
28
25
29
uint32_t FloatQNaNValues [] = {
26
30
F32_MAKE (0 , F32_EXP_MASK , F32_QNAN_BIT | F32_PAYLOAD_MASK ),
@@ -33,25 +37,28 @@ uint32_t FloatQNaNValues[] = {
33
37
F32_MAKE (1 , F32_EXP_MASK , F32_QNAN_BIT | 0x00100000U ),
34
38
35
39
F32_MAKE (0 , F32_EXP_MASK , F32_QNAN_BIT | 0x00000001U ),
36
- F32_MAKE (1 , F32_EXP_MASK , F32_QNAN_BIT | 0x00000002U )};
40
+ F32_MAKE (1 , F32_EXP_MASK , F32_QNAN_BIT | 0x00000002U )
41
+ };
37
42
38
- uint32_t FloatSNaNValues [] = {F32_MAKE (0 , F32_EXP_MASK , F32_PAYLOAD_MASK ),
39
- F32_MAKE (1 , F32_EXP_MASK , F32_PAYLOAD_MASK ),
43
+ uint32_t FloatSNaNValues [] = {
44
+ F32_MAKE (0 , F32_EXP_MASK , F32_PAYLOAD_MASK ),
45
+ F32_MAKE (1 , F32_EXP_MASK , F32_PAYLOAD_MASK ),
40
46
41
- F32_MAKE (0 , F32_EXP_MASK , 0x00200000U ),
42
- F32_MAKE (1 , F32_EXP_MASK , 0x00100000U ),
47
+ F32_MAKE (0 , F32_EXP_MASK , 0x00200000U ),
48
+ F32_MAKE (1 , F32_EXP_MASK , 0x00100000U ),
43
49
44
- F32_MAKE (0 , F32_EXP_MASK , 0x00000001U ),
45
- F32_MAKE (1 , F32_EXP_MASK , 0x00000002U )};
50
+ F32_MAKE (0 , F32_EXP_MASK , 0x00000001U ),
51
+ F32_MAKE (1 , F32_EXP_MASK , 0x00000002U )
52
+ };
46
53
47
54
uint32_t FloatInfValues [] = {
48
- F32_MAKE (0 , F32_EXP_MASK , 0 ), // +Inf
49
- F32_MAKE (1 , F32_EXP_MASK , 0 ) // -Inf
55
+ F32_MAKE (0 , F32_EXP_MASK , 0 ), // +Inf
56
+ F32_MAKE (1 , F32_EXP_MASK , 0 ) // -Inf
50
57
};
51
58
52
59
uint32_t FloatZeroValues [] = {
53
- F32_MAKE (0 , 0 , 0 ), // +0.0
54
- F32_MAKE (1 , 0 , 0 ) // -0.0
60
+ F32_MAKE (0 , 0 , 0 ), // +0.0
61
+ F32_MAKE (1 , 0 , 0 ) // -0.0
55
62
};
56
63
57
64
uint32_t FloatDenormValues [] = {
@@ -94,130 +101,99 @@ uint32_t FloatNormalValues[] = {
94
101
};
95
102
96
103
int test_float () {
104
+ CHECK_EQ (F32_NORMAL (0 , 0 , 0 ), 1.0F );
105
+ CHECK_EQ (F32_NORMAL (0 , 0 , F32_MANTISSA (1 , 0 , 0 )), 1.5F );
106
+ CHECK_EQ (F32_NORMAL (0 , 0 , F32_MANTISSA (0 , 1 , 0 )), 1.25F );
107
+ CHECK_EQ (F32_NORMAL (0 , 0 , F32_MANTISSA (0 , 0 , 1 )), 1.125 );
108
+ CHECK_EQ (F32_NORMAL (0 , -1 , 0 ), 0.5F );
109
+ CHECK_EQ (F32_NORMAL (0 , -2 , 0 ), 0.25 );
110
+ CHECK_EQ (F32_NORMAL (0 , -3 , 0 ), 0.125 );
111
+ CHECK_EQ (F32_NORMAL (0 , 1 , 0 ), 2.0F );
112
+ CHECK_EQ (F32_NORMAL (0 , 1 , F32_MANTISSA (1 , 0 , 0 )), 3.0F );
113
+
114
+ CHECK_EQ (F32_NORMAL (1 , 0 , 0 ), -1.0F );
115
+ CHECK_EQ (F32_NORMAL (1 , 0 , F32_MANTISSA (1 , 0 , 0 )), -1.5F );
116
+ CHECK_EQ (F32_NORMAL (1 , 0 , F32_MANTISSA (0 , 1 , 0 )), -1.25F );
117
+ CHECK_EQ (F32_NORMAL (1 , 0 , F32_MANTISSA (0 , 0 , 1 )), -1.125 );
118
+ CHECK_EQ (F32_NORMAL (1 , -1 , 0 ), -0.5F );
119
+ CHECK_EQ (F32_NORMAL (1 , -2 , 0 ), -0.25 );
120
+ CHECK_EQ (F32_NORMAL (1 , -3 , 0 ), -0.125 );
121
+ CHECK_EQ (F32_NORMAL (1 , 1 , 0 ), -2.0F );
122
+ CHECK_EQ (F32_NORMAL (1 , 1 , F32_MANTISSA (1 , 0 , 0 )), -3.0F );
123
+
124
+ CHECK_EQ (F32_NORMAL (0 , F32_EXP_MIN , 0 ), 1.1754943508e-38F );
125
+ CHECK_EQ (F32_NORMAL (1 , F32_EXP_MIN , 0 ), -1.1754943508e-38F );
126
+ CHECK_EQ (F32_NORMAL (0 , F32_EXP_MAX , F32_MANTISSA_MASK ), 3.4028234664e38F );
127
+ CHECK_EQ (F32_NORMAL (1 , F32_EXP_MAX , F32_MANTISSA_MASK ), -3.4028234664e38F );
128
+
97
129
for (unsigned i = 0 ; i < DimOf (FloatQNaNValues ); i ++ ) {
98
130
uint32_t * IPtr = FloatQNaNValues + i ;
131
+ uint32_t IX = * IPtr ;
99
132
float X = * (float * )IPtr ;
100
- CHECK_VALUE (__builtin_isnan (X ), IPtr );
101
- CHECK_VALUE (!__builtin_issignaling (X ), IPtr );
102
- CHECK_VALUE (!__builtin_isinf (X ), IPtr );
103
- CHECK_VALUE (!__builtin_isfinite (X ), IPtr );
104
- CHECK_VALUE (!__builtin_isnormal (X ), IPtr );
105
- CHECK_VALUE (!__builtin_issubnormal (X ), IPtr );
106
- CHECK_VALUE (!__builtin_iszero (X ), IPtr );
107
- CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 0 , IPtr );
133
+ CHECK_VALUE (__builtin_isnan (X ), IX );
134
+ CHECK_VALUE (!__builtin_isinf (X ), IX );
135
+ CHECK_VALUE (!__builtin_isfinite (X ), IX );
136
+ CHECK_VALUE (!__builtin_isnormal (X ), IX );
137
+ CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 0 , IX );
108
138
}
109
139
for (unsigned i = 0 ; i < DimOf (FloatSNaNValues ); i ++ ) {
110
140
uint32_t * IPtr = FloatSNaNValues + i ;
141
+ uint32_t IX = * IPtr ;
111
142
float X = * (float * )IPtr ;
112
- CHECK_VALUE (__builtin_isnan (X ), IPtr );
113
- CHECK_VALUE (__builtin_issignaling (X ), IPtr );
114
- CHECK_VALUE (!__builtin_isinf (X ), IPtr );
115
- CHECK_VALUE (!__builtin_isfinite (X ), IPtr );
116
- CHECK_VALUE (!__builtin_isnormal (X ), IPtr );
117
- CHECK_VALUE (!__builtin_issubnormal (X ), IPtr );
118
- CHECK_VALUE (!__builtin_iszero (X ), IPtr );
119
- CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 0 , IPtr );
143
+ CHECK_VALUE (__builtin_isnan (X ), IX );
144
+ CHECK_VALUE (!__builtin_isinf (X ), IX );
145
+ CHECK_VALUE (!__builtin_isfinite (X ), IX );
146
+ CHECK_VALUE (!__builtin_isnormal (X ), IX );
147
+ CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 0 , IX );
120
148
}
121
149
for (unsigned i = 0 ; i < DimOf (FloatInfValues ); i ++ ) {
122
150
uint32_t * IPtr = FloatInfValues + i ;
151
+ uint32_t IX = * IPtr ;
123
152
float X = * (float * )IPtr ;
124
- CHECK_VALUE (!__builtin_isnan (X ), IPtr );
125
- CHECK_VALUE (!__builtin_issignaling (X ), IPtr );
126
- CHECK_VALUE (__builtin_isinf (X ), IPtr );
127
- CHECK_VALUE (!__builtin_isfinite (X ), IPtr );
128
- CHECK_VALUE (!__builtin_isnormal (X ), IPtr );
129
- CHECK_VALUE (!__builtin_issubnormal (X ), IPtr );
130
- CHECK_VALUE (!__builtin_iszero (X ), IPtr );
131
- CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 1 , IPtr );
153
+ CHECK_VALUE (!__builtin_isnan (X ), IX );
154
+ CHECK_VALUE (__builtin_isinf (X ), IX );
155
+ CHECK_VALUE (!__builtin_isfinite (X ), IX );
156
+ CHECK_VALUE (!__builtin_isnormal (X ), IX );
157
+ CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 1 , IX );
132
158
}
133
159
for (unsigned i = 0 ; i < DimOf (FloatZeroValues ); i ++ ) {
134
160
uint32_t * IPtr = FloatZeroValues + i ;
161
+ uint32_t IX = * IPtr ;
135
162
float X = * (float * )IPtr ;
136
- CHECK_VALUE (!__builtin_isnan (X ), IPtr );
137
- CHECK_VALUE (!__builtin_issignaling (X ), IPtr );
138
- CHECK_VALUE (!__builtin_isinf (X ), IPtr );
139
- CHECK_VALUE (__builtin_isfinite (X ), IPtr );
140
- CHECK_VALUE (!__builtin_isnormal (X ), IPtr );
141
- CHECK_VALUE (!__builtin_issubnormal (X ), IPtr );
142
- CHECK_VALUE (__builtin_iszero (X ), IPtr );
143
- CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 4 , IPtr );
163
+ CHECK_VALUE (!__builtin_isnan (X ), IX );
164
+ CHECK_VALUE (!__builtin_isinf (X ), IX );
165
+ CHECK_VALUE (__builtin_isfinite (X ), IX );
166
+ CHECK_VALUE (!__builtin_isnormal (X ), IX );
167
+ CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 4 , IX );
144
168
}
145
169
for (unsigned i = 0 ; i < DimOf (FloatDenormValues ); i ++ ) {
146
170
uint32_t * IPtr = FloatDenormValues + i ;
171
+ uint32_t IX = * IPtr ;
147
172
float X = * (float * )IPtr ;
148
- CHECK_VALUE (!__builtin_isnan (X ), IPtr );
149
- CHECK_VALUE (!__builtin_issignaling (X ), IPtr );
150
- CHECK_VALUE (!__builtin_isinf (X ), IPtr );
151
- CHECK_VALUE (__builtin_isfinite (X ), IPtr );
152
- CHECK_VALUE (!__builtin_isnormal (X ), IPtr );
153
- CHECK_VALUE (__builtin_issubnormal (X ), IPtr );
154
- CHECK_VALUE (!__builtin_iszero (X ), IPtr );
155
- CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 3 , IPtr );
173
+ CHECK_VALUE (!__builtin_isnan (X ), IX );
174
+ CHECK_VALUE (!__builtin_isinf (X ), IX );
175
+ CHECK_VALUE (__builtin_isfinite (X ), IX );
176
+ CHECK_VALUE (!__builtin_isnormal (X ), IX );
177
+ CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 3 , IX );
156
178
}
157
179
for (unsigned i = 0 ; i < DimOf (FloatNormalValues ); i ++ ) {
158
180
uint32_t * IPtr = FloatNormalValues + i ;
181
+ uint32_t IX = * IPtr ;
159
182
float X = * (float * )IPtr ;
160
- CHECK_VALUE (!__builtin_isnan (X ), IPtr );
161
- CHECK_VALUE (!__builtin_issignaling (X ), IPtr );
162
- CHECK_VALUE (!__builtin_isinf (X ), IPtr );
163
- CHECK_VALUE (__builtin_isfinite (X ), IPtr );
164
- CHECK_VALUE (__builtin_isnormal (X ), IPtr );
165
- CHECK_VALUE (!__builtin_issubnormal (X ), IPtr );
166
- CHECK_VALUE (!__builtin_iszero (X ), IPtr );
167
- CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 2 , IPtr );
183
+ CHECK_VALUE (!__builtin_isnan (X ), IX );
184
+ CHECK_VALUE (!__builtin_isinf (X ), IX );
185
+ CHECK_VALUE (__builtin_isfinite (X ), IX );
186
+ CHECK_VALUE (__builtin_isnormal (X ), IX );
187
+ CHECK_VALUE (__builtin_fpclassify (0 , 1 , 2 , 3 , 4 , X ) == 2 , IX );
168
188
}
169
189
170
190
return 0 ;
171
191
}
172
192
173
- #define FLOAT_TYPE float
174
- #include "gen_isfpclass_funcs.h"
175
-
176
- void test_isfpclass_float () {
177
- for (unsigned i = 0 ; i < DimOf (FloatZeroValues ); i ++ ) {
178
- float X = * (float * )(FloatZeroValues + i );
179
- if (__builtin_signbit (X ) == 0 )
180
- test_fcPosZero_float (X );
181
- else
182
- test_fcNegZero_float (X );
183
- }
184
- for (unsigned i = 0 ; i < DimOf (FloatDenormValues ); i ++ ) {
185
- float X = * (float * )(FloatDenormValues + i );
186
- if (X < 0 )
187
- test_fcNegSubnormal_float (X );
188
- else
189
- test_fcPosSubnormal_float (X );
190
- }
191
- for (unsigned i = 0 ; i < DimOf (FloatNormalValues ); i ++ ) {
192
- float X = * (float * )(FloatNormalValues + i );
193
- if (X < 0 )
194
- test_fcNegNormal_float (X );
195
- else
196
- test_fcPosNormal_float (X );
197
- }
198
- for (unsigned i = 0 ; i < DimOf (FloatInfValues ); i ++ ) {
199
- float X = * (float * )(FloatInfValues + i );
200
- if (X > 0 )
201
- test_fcPosInf_float (X );
202
- else
203
- test_fcNegInf_float (X );
204
- }
205
- for (unsigned i = 0 ; i < DimOf (FloatQNaNValues ); i ++ ) {
206
- float X = * (float * )(FloatQNaNValues + i );
207
- test_fcQNan_float (X );
208
- }
209
- for (unsigned i = 0 ; i < DimOf (FloatSNaNValues ); i ++ ) {
210
- float X = * (float * )(FloatSNaNValues + i );
211
- test_fcSNan_float (X );
212
- }
213
- test_fcPosInf_float (__builtin_inff ());
214
- test_fcNegInf_float (- __builtin_inff ());
215
- test_fcPosZero_float (0.0F );
216
- test_fcNegZero_float (-0.0F );
217
- }
218
-
193
+ #undef INT_FORMAT
194
+ #undef FLOAT_FORMAT
219
195
#undef VAL_FORMAT
220
- #undef GET_VALUE
196
+ #undef INT_TYPE
221
197
#undef FLOAT_TYPE
222
198
223
199
#endif
0 commit comments