Fix implementation of FMIN/FMAX NaN case
authorAndrew Waterman <andrew@sifive.com>
Thu, 19 Oct 2017 19:18:23 +0000 (12:18 -0700)
committerAndrew Waterman <andrew@sifive.com>
Thu, 19 Oct 2017 19:18:23 +0000 (12:18 -0700)
If rd=rs1 or rd=rs2, the NaN check examined the wrong value.

riscv/insns/fmax_d.h
riscv/insns/fmax_q.h
riscv/insns/fmax_s.h
riscv/insns/fmin_d.h
riscv/insns/fmin_q.h
riscv/insns/fmin_s.h

index 3d2c6e6843b921457581b208ad5d4c4317a81517..11491f54bce66c61e6d8af1ee9634603238937d0 100644 (file)
@@ -2,7 +2,8 @@ require_extension('D');
 require_fp;
 bool greater = f64_lt_quiet(f64(FRS2), f64(FRS1)) ||
                (f64_eq(f64(FRS2), f64(FRS1)) && (f64(FRS2).v & F64_SIGN));
-WRITE_FRD(greater || isNaNF64UI(f64(FRS2).v) ? FRS1 : FRS2);
 if (isNaNF64UI(f64(FRS1).v) && isNaNF64UI(f64(FRS2).v))
   WRITE_FRD(f64(defaultNaNF64UI));
+else
+  WRITE_FRD(greater || isNaNF64UI(f64(FRS2).v) ? FRS1 : FRS2);
 set_fp_exceptions;
index 719e6d008b2743853aef5d224a462534ab93fdd6..7dd7884a678f23c23e2ee2a4a805ee4c5b093405 100644 (file)
@@ -2,7 +2,8 @@ require_extension('Q');
 require_fp;
 bool greater = f128_lt_quiet(f128(FRS2), f128(FRS1)) ||
                (f128_eq(f128(FRS2), f128(FRS1)) && (f128(FRS2).v[1] & F64_SIGN));
-WRITE_FRD(greater || isNaNF128(f128(FRS2)) ? FRS1 : FRS2);
 if (isNaNF128(f128(FRS1)) && isNaNF128(f128(FRS2)))
   WRITE_FRD(f128(defaultNaNF128()));
+else
+  WRITE_FRD(greater || isNaNF128(f128(FRS2)) ? FRS1 : FRS2);
 set_fp_exceptions;
index 33e535b5106ea986fdc4e6a79353d45e816c8439..41d8f921fdec4eba9eb7f42cb4a58597ae6d6c87 100644 (file)
@@ -2,7 +2,8 @@ require_extension('F');
 require_fp;
 bool greater = f32_lt_quiet(f32(FRS2), f32(FRS1)) ||
                (f32_eq(f32(FRS2), f32(FRS1)) && (f32(FRS2).v & F32_SIGN));
-WRITE_FRD(greater || isNaNF32UI(f32(FRS2).v) ? FRS1 : FRS2);
 if (isNaNF32UI(f32(FRS1).v) && isNaNF32UI(f32(FRS2).v))
   WRITE_FRD(f32(defaultNaNF32UI));
+else
+  WRITE_FRD(greater || isNaNF32UI(f32(FRS2).v) ? FRS1 : FRS2);
 set_fp_exceptions;
index 486faa5622f952d81618495f48ae42245eeff39f..5cf349d47ee4dda3e850942059b302d108071099 100644 (file)
@@ -2,7 +2,8 @@ require_extension('D');
 require_fp;
 bool less = f64_lt_quiet(f64(FRS1), f64(FRS2)) ||
             (f64_eq(f64(FRS1), f64(FRS2)) && (f64(FRS1).v & F64_SIGN));
-WRITE_FRD(less || isNaNF64UI(f64(FRS2).v) ? FRS1 : FRS2);
 if (isNaNF64UI(f64(FRS1).v) && isNaNF64UI(f64(FRS2).v))
   WRITE_FRD(f64(defaultNaNF64UI));
+else
+  WRITE_FRD(less || isNaNF64UI(f64(FRS2).v) ? FRS1 : FRS2);
 set_fp_exceptions;
index 675c7fd70ca177ba005d18628090962836978e3e..fcb9526efd6e5d3d8f536716e4478812776ad03c 100644 (file)
@@ -2,7 +2,8 @@ require_extension('Q');
 require_fp;
 bool less = f128_lt_quiet(f128(FRS1), f128(FRS2)) ||
             (f128_eq(f128(FRS1), f128(FRS2)) && (f128(FRS1).v[1] & F64_SIGN));
-WRITE_FRD(less || isNaNF128(f128(FRS2)) ? FRS1 : FRS2);
 if (isNaNF128(f128(FRS1)) && isNaNF128(f128(FRS2)))
   WRITE_FRD(f128(defaultNaNF128()));
+else
+  WRITE_FRD(less || isNaNF128(f128(FRS2)) ? FRS1 : FRS2);
 set_fp_exceptions;
index 80990035a6004a721261d57eabda019589fc95d2..19e119381df1c2ae64d2e9d26c799080b8c580e0 100644 (file)
@@ -2,7 +2,8 @@ require_extension('F');
 require_fp;
 bool less = f32_lt_quiet(f32(FRS1), f32(FRS2)) ||
             (f32_eq(f32(FRS1), f32(FRS2)) && (f32(FRS1).v & F32_SIGN));
-WRITE_FRD(less || isNaNF32UI(f32(FRS2).v) ? FRS1 : FRS2);
 if (isNaNF32UI(f32(FRS1).v) && isNaNF32UI(f32(FRS2).v))
   WRITE_FRD(f32(defaultNaNF32UI));
+else
+  WRITE_FRD(less || isNaNF32UI(f32(FRS2).v) ? FRS1 : FRS2);
 set_fp_exceptions;