builtin_islessgreater_unordered.c (1836B)
1 /* Route A — C99 floating comparison builtins. 2 * 3 * isless/islessequal/isgreater/isgreaterequal reach the ordered predicates 4 * OLT/OLE/OGT/OGE (NaN -> 0); islessgreater reaches the discriminating ONE 5 * predicate (ordered-and-not-equal); isunordered is true iff a NaN. */ 6 static double mknan(void) { 7 double z = 0.0; 8 return z / z; 9 } 10 11 int test_main(void) { 12 double nan = mknan(); 13 int rc = 0; 14 15 /* isless -> OLT */ 16 if (__builtin_isless(1.0, 2.0) != 1) rc |= 1 << 0; 17 if (__builtin_isless(2.0, 1.0) != 0) rc |= 1 << 1; 18 if (__builtin_isless(nan, 1.0) != 0) rc |= 1 << 2; /* NaN ordered -> 0 */ 19 20 /* islessequal -> OLE */ 21 if (__builtin_islessequal(1.0, 1.0) != 1) rc |= 1 << 3; 22 if (__builtin_islessequal(2.0, 1.0) != 0) rc |= 1 << 4; 23 if (__builtin_islessequal(nan, 1.0) != 0) rc |= 1 << 5; 24 25 /* isgreater -> OGT */ 26 if (__builtin_isgreater(2.0, 1.0) != 1) rc |= 1 << 6; 27 if (__builtin_isgreater(1.0, 2.0) != 0) rc |= 1 << 7; 28 if (__builtin_isgreater(nan, 1.0) != 0) rc |= 1 << 8; 29 30 /* isgreaterequal -> OGE */ 31 if (__builtin_isgreaterequal(1.0, 1.0) != 1) rc |= 1 << 9; 32 if (__builtin_isgreaterequal(1.0, 2.0) != 0) rc |= 1 << 10; 33 if (__builtin_isgreaterequal(nan, 1.0) != 0) rc |= 1 << 11; 34 35 /* islessgreater -> ONE (ordered and not equal) */ 36 if (__builtin_islessgreater(1.0, 2.0) != 1) rc |= 1 << 12; 37 if (__builtin_islessgreater(2.0, 1.0) != 1) rc |= 1 << 13; 38 if (__builtin_islessgreater(1.0, 1.0) != 0) rc |= 1 << 14; 39 if (__builtin_islessgreater(nan, 1.0) != 0) rc |= 1 << 15; /* NaN -> 0 */ 40 41 /* isunordered -> true iff a NaN */ 42 if (__builtin_isunordered(nan, 1.0) != 1) rc |= 1 << 16; 43 if (__builtin_isunordered(1.0, nan) != 1) rc |= 1 << 17; 44 if (__builtin_isunordered(nan, nan) != 1) rc |= 1 << 18; 45 if (__builtin_isunordered(1.0, 2.0) != 0) rc |= 1 << 19; 46 47 return rc == 0 ? 42 : 0; 48 }