fix fcvttg FPSCR.FR computation
authorJacob Lifshay <programmerjake@gmail.com>
Fri, 19 May 2023 03:53:23 +0000 (20:53 -0700)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 2 Jun 2023 18:51:18 +0000 (19:51 +0100)
the unit test previously assumed the rounding mode is truncate,
but when I switched it to allow dynamic rounding modes,
I forgot to no longer hard-code FPSCR.FR = 0

openpower/isa/fpcvt.mdwn
src/openpower/test/fmv_fcvt/fmv_fcvt.py

index 0d2b859f245e731ec18788b8c151699cdc13f791..d14dec91611fe716ff97a102c2437cd8ac25a285 100644 (file)
@@ -192,8 +192,10 @@ Pseudo-code:
         overflow <- 1  # signals SO only when OE = 1
         vxcvi_flag <- 1
         xx_flag <- 0
-    else if ¬bfp_COMPARE_EQ(src, result_bfp) then
-        xx_flag <- 1
+        inc_flag <- 0
+    else
+        xx_flag <- ¬bfp_COMPARE_EQ(src, result_bfp)
+        inc_flag <- bfp_COMPARE_GT(bfp_ABSOLUTE(result_bfp), bfp_ABSOLUTE(src))
     if vxsnan_flag = 1 then SetFX(FPSCR.VXSNAN)
     if vxcvi_flag = 1 then SetFX(FPSCR.VXCVI)
     if xx_flag = 1 then SetFX(FPSCR.XX)
@@ -307,8 +309,10 @@ Pseudo-code:
         overflow <- 1  # signals SO only when OE = 1
         vxcvi_flag <- 1
         xx_flag <- 0
-    else if ¬bfp_COMPARE_EQ(src, result_bfp) then
-        xx_flag <- 1
+        inc_flag <- 0
+    else
+        xx_flag <- ¬bfp_COMPARE_EQ(src, result_bfp)
+        inc_flag <- bfp_COMPARE_GT(bfp_ABSOLUTE(result_bfp), bfp_ABSOLUTE(src))
     if vxsnan_flag = 1 then SetFX(FPSCR.VXSNAN)
     if vxcvi_flag = 1 then SetFX(FPSCR.VXCVI)
     if xx_flag = 1 then SetFX(FPSCR.XX)
index 524edce1233124f4e0941b6c8d44de1bf7096c83..d47f35ccf5ef7839db59af3e8c2634876fc655e1 100644 (file)
@@ -125,7 +125,8 @@ class FMvFCvtCases(TestAccumulatorBase):
                 fpscr.FX = 1
                 fpscr.FI = 1
             fpscr.FPRF = 0  # undefined value we happen to pick
-            fpscr.FR = 0  # trunc never increments
+            if not overflow:
+                fpscr.FR = abs(do_round(inp, round_mode)) > abs(inp)
             lt = bool(expected & (1 << 63))
             gt = not lt and expected != 0
             eq = expected == 0