kit

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

rv64_fp_nan_compare.c (1114B)


      1 /* NaN comparison semantics: every ordered comparison with NaN must
      2  * return false; `!=` returns true. Exercises rv64 feq.d / flt.d / fle.d
      3  * which set the result reg to 0 when either operand is NaN. */
      4 
      5 static double make_nan(void) {
      6   /* Quiet NaN via volatile arith — avoids the optimizer folding to 0. */
      7   volatile double zero = 0.0;
      8   return zero / zero;
      9 }
     10 
     11 static int eq_d(double a, double b) { return a == b; }
     12 static int ne_d(double a, double b) { return a != b; }
     13 static int lt_d(double a, double b) { return a < b; }
     14 static int le_d(double a, double b) { return a <= b; }
     15 static int gt_d(double a, double b) { return a > b; }
     16 static int ge_d(double a, double b) { return a >= b; }
     17 
     18 int test_main(void) {
     19   double nan = make_nan();
     20   double one = 1.0;
     21   if (eq_d(nan, one) != 0) return 1;
     22   if (eq_d(one, nan) != 0) return 2;
     23   if (eq_d(nan, nan) != 0) return 3;
     24   if (ne_d(nan, one) != 1) return 4;
     25   if (ne_d(nan, nan) != 1) return 5;
     26   if (lt_d(nan, one) != 0) return 6;
     27   if (le_d(nan, one) != 0) return 7;
     28   if (gt_d(one, nan) != 0) return 8;
     29   if (ge_d(one, nan) != 0) return 9;
     30   return 42;
     31 }