@@ -193,6 +193,51 @@ namespace isfpclass {
193193 char isfpclass_snan_3 [!__builtin_isfpclass(__builtin_nans(" " ), 0x01F8 ) ? 1 : -1 ]; // fcFinite
194194}
195195
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+
196241namespace fpclassify {
197242 char classify_nan [__builtin_fpclassify(+1 , -1 , -1 , -1 , -1 , __builtin_nan(" " ))];
198243 char classify_snan [__builtin_fpclassify(+1 , -1 , -1 , -1 , -1 , __builtin_nans(" " ))];
0 commit comments