@@ -193,6 +193,51 @@ namespace isfpclass {
193
193
char isfpclass_snan_3 [!__builtin_isfpclass(__builtin_nans(" " ), 0x01F8 ) ? 1 : -1 ]; // fcFinite
194
194
}
195
195
196
+ namespace signbit {
197
+ static_assert (
198
+ !__builtin_signbit(1.0 ) && __builtin_signbit(-1.0 ) && !__builtin_signbit(0.0 ) && __builtin_signbit(-0.0 ) &&
199
+ !__builtin_signbitf(1 .0f ) && __builtin_signbitf(-1 .0f ) && !__builtin_signbitf(0 .0f ) && __builtin_signbitf(-0 .0f ) &&
200
+ !__builtin_signbitl(1 .0L ) && __builtin_signbitf(-1 .0L ) && !__builtin_signbitf(0 .0L ) && __builtin_signbitf(-0 .0L ) &&
201
+ !__builtin_signbit(1 .0f ) && __builtin_signbit(-1 .0f ) && !__builtin_signbit(0 .0f ) && __builtin_signbit(-0 .0f ) &&
202
+ !__builtin_signbit(1 .0L ) && __builtin_signbit(-1 .0L ) && !__builtin_signbit(0 .0L ) && __builtin_signbit(-0 .0L ) &&
203
+ true , " "
204
+ );
205
+ }
206
+
207
+ namespace floating_comparison {
208
+ #define LESS (X, Y ) \
209
+ !__builtin_isgreater(X, Y) && __builtin_isgreater(Y, X) && \
210
+ !__builtin_isgreaterequal(X, Y) && __builtin_isgreaterequal(Y, X) && \
211
+ __builtin_isless (X, Y) && !__builtin_isless(Y, X) && \
212
+ __builtin_islessequal (X, Y) && !__builtin_islessequal(Y, X) && \
213
+ __builtin_islessgreater (X, Y) && __builtin_islessgreater(Y, X) && \
214
+ !__builtin_isunordered(X, Y) && !__builtin_isunordered(Y, X)
215
+ #define EQUAL (X, Y ) \
216
+ !__builtin_isgreater(X, Y) && !__builtin_isgreater(Y, X) && \
217
+ __builtin_isgreaterequal (X, Y) && __builtin_isgreaterequal(Y, X) && \
218
+ !__builtin_isless(X, Y) && !__builtin_isless(Y, X) && \
219
+ __builtin_islessequal (X, Y) && __builtin_islessequal(Y, X) && \
220
+ !__builtin_islessgreater(X, Y) && !__builtin_islessgreater(Y, X) && \
221
+ !__builtin_isunordered(X, Y) && !__builtin_isunordered(Y, X)
222
+ #define UNORDERED (X, Y ) \
223
+ !__builtin_isgreater(X, Y) && !__builtin_isgreater(Y, X) && \
224
+ !__builtin_isgreaterequal(X, Y) && !__builtin_isgreaterequal(Y, X) && \
225
+ !__builtin_isless(X, Y) && !__builtin_isless(Y, X) && \
226
+ !__builtin_islessequal(X, Y) && !__builtin_islessequal(Y, X) && \
227
+ !__builtin_islessgreater(X, Y) && !__builtin_islessgreater(Y, X) && \
228
+ __builtin_isunordered (X, Y) && __builtin_isunordered(Y, X)
229
+
230
+ static_assert (
231
+ LESS (0.0 , 1.0 ) && EQUAL(1.0 , 1.0 ) && EQUAL(0.0 , -0.0 ) &&
232
+ UNORDERED(__builtin_nan(" " ), 1.0) && UNORDERED(__builtin_nan(" " ), __builtin_inf()) && LESS(0.0 , __builtin_inf()) &&
233
+ LESS(0 .0f , 1 .0f ) && EQUAL(1 .0f , 1 .0f ) && EQUAL(0 .0f , -0 .0f ) &&
234
+ UNORDERED(__builtin_nanf(" " ), 1.0f) && UNORDERED(__builtin_nanf(" " ), __builtin_inff()) && LESS(0 .0f , __builtin_inff()) &&
235
+ LESS(0 .0L , 1 .0L ) && EQUAL(1 .0L , 1 .0L ) && EQUAL(0 .0L , -0 .0L ) &&
236
+ UNORDERED(__builtin_nanl(" " ), 1.0L) && UNORDERED(__builtin_nanl(" " ), __builtin_infl()) && LESS(0 .0L , __builtin_infl()) &&
237
+ true, ""
238
+ );
239
+ }
240
+
196
241
namespace fpclassify {
197
242
char classify_nan [__builtin_fpclassify(+1 , -1 , -1 , -1 , -1 , __builtin_nan(" " ))];
198
243
char classify_snan [__builtin_fpclassify(+1 , -1 , -1 , -1 , -1 , __builtin_nans(" " ))];
0 commit comments