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 }