kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

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 }