19
19
#include <stdio.h>
20
20
#include <stdlib.h>
21
21
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
22
+ #define VAL_FORMAT "%" PRIx32
23
+ #define GET_VALUE (x ) (*(uint32_t *)x)
28
24
29
25
uint32_t FloatQNaNValues [] = {
30
26
F32_MAKE (0 , F32_EXP_MASK , F32_QNAN_BIT | F32_PAYLOAD_MASK ),
@@ -37,28 +33,25 @@ uint32_t FloatQNaNValues[] = {
37
33
F32_MAKE (1 , F32_EXP_MASK , F32_QNAN_BIT | 0x00100000U ),
38
34
39
35
F32_MAKE (0 , F32_EXP_MASK , F32_QNAN_BIT | 0x00000001U ),
40
- F32_MAKE (1 , F32_EXP_MASK , F32_QNAN_BIT | 0x00000002U )
41
- };
36
+ F32_MAKE (1 , F32_EXP_MASK , F32_QNAN_BIT | 0x00000002U )};
42
37
43
- uint32_t FloatSNaNValues [] = {
44
- F32_MAKE (0 , F32_EXP_MASK , F32_PAYLOAD_MASK ),
45
- F32_MAKE (1 , F32_EXP_MASK , F32_PAYLOAD_MASK ),
38
+ uint32_t FloatSNaNValues [] = {F32_MAKE (0 , F32_EXP_MASK , F32_PAYLOAD_MASK ),
39
+ F32_MAKE (1 , F32_EXP_MASK , F32_PAYLOAD_MASK ),
46
40
47
- F32_MAKE (0 , F32_EXP_MASK , 0x00200000U ),
48
- F32_MAKE (1 , F32_EXP_MASK , 0x00100000U ),
41
+ F32_MAKE (0 , F32_EXP_MASK , 0x00200000U ),
42
+ F32_MAKE (1 , F32_EXP_MASK , 0x00100000U ),
49
43
50
- F32_MAKE (0 , F32_EXP_MASK , 0x00000001U ),
51
- F32_MAKE (1 , F32_EXP_MASK , 0x00000002U )
52
- };
44
+ F32_MAKE (0 , F32_EXP_MASK , 0x00000001U ),
45
+ F32_MAKE (1 , F32_EXP_MASK , 0x00000002U )};
53
46
54
47
uint32_t FloatInfValues [] = {
55
- F32_MAKE (0 , F32_EXP_MASK , 0 ), // +Inf
56
- F32_MAKE (1 , F32_EXP_MASK , 0 ) // -Inf
48
+ F32_MAKE (0 , F32_EXP_MASK , 0 ), // +Inf
49
+ F32_MAKE (1 , F32_EXP_MASK , 0 ) // -Inf
57
50
};
58
51
59
52
uint32_t FloatZeroValues [] = {
60
- F32_MAKE (0 , 0 , 0 ), // +0.0
61
- F32_MAKE (1 , 0 , 0 ) // -0.0
53
+ F32_MAKE (0 , 0 , 0 ), // +0.0
54
+ F32_MAKE (1 , 0 , 0 ) // -0.0
62
55
};
63
56
64
57
uint32_t FloatDenormValues [] = {
@@ -101,99 +94,130 @@ uint32_t FloatNormalValues[] = {
101
94
};
102
95
103
96
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
-
129
97
for (unsigned i = 0 ; i < DimOf (FloatQNaNValues ); i ++ ) {
130
98
uint32_t * IPtr = FloatQNaNValues + i ;
131
- uint32_t IX = * IPtr ;
132
99
float X = * (float * )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 );
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 );
138
108
}
139
109
for (unsigned i = 0 ; i < DimOf (FloatSNaNValues ); i ++ ) {
140
110
uint32_t * IPtr = FloatSNaNValues + i ;
141
- uint32_t IX = * IPtr ;
142
111
float X = * (float * )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 );
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 );
148
120
}
149
121
for (unsigned i = 0 ; i < DimOf (FloatInfValues ); i ++ ) {
150
122
uint32_t * IPtr = FloatInfValues + i ;
151
- uint32_t IX = * IPtr ;
152
123
float X = * (float * )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 );
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 );
158
132
}
159
133
for (unsigned i = 0 ; i < DimOf (FloatZeroValues ); i ++ ) {
160
134
uint32_t * IPtr = FloatZeroValues + i ;
161
- uint32_t IX = * IPtr ;
162
135
float X = * (float * )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 );
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 );
168
144
}
169
145
for (unsigned i = 0 ; i < DimOf (FloatDenormValues ); i ++ ) {
170
146
uint32_t * IPtr = FloatDenormValues + i ;
171
- uint32_t IX = * IPtr ;
172
147
float X = * (float * )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 );
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 );
178
156
}
179
157
for (unsigned i = 0 ; i < DimOf (FloatNormalValues ); i ++ ) {
180
158
uint32_t * IPtr = FloatNormalValues + i ;
181
- uint32_t IX = * IPtr ;
182
159
float X = * (float * )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 );
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 );
188
168
}
189
169
190
170
return 0 ;
191
171
}
192
172
193
- #undef INT_FORMAT
194
- #undef FLOAT_FORMAT
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
+
195
219
#undef VAL_FORMAT
196
- #undef INT_TYPE
220
+ #undef GET_VALUE
197
221
#undef FLOAT_TYPE
198
222
199
223
#endif
0 commit comments