need to read SO if Rc=1
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 27 Aug 2020 12:23:04 +0000 (13:23 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Thu, 27 Aug 2020 12:23:09 +0000 (13:23 +0100)
libreriscv
src/soc/decoder/power_regspec_map.py
src/soc/fu/test/common.py

index 1b3c9590a8878194b8df77c10d184f26f2670ee8..47c09ca29544ec2a0ddce960af8b8feb22cf037d 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 1b3c9590a8878194b8df77c10d184f26f2670ee8
+Subproject commit 47c09ca29544ec2a0ddce960af8b8feb22cf037d
index 81298e8e63ad6c97b9a5806339e018796d4333e5..1e6cf3af2356ab7e6f290290823dac4a1cf2a93c 100644 (file)
@@ -76,7 +76,10 @@ def regspec_decode_read(e, regfile, name):
         CA = 1<<XERRegs.CA
         OV = 1<<XERRegs.OV
         if name == 'xer_so':
-            return (e.do.oe.oe[0] & e.do.oe.oe_ok) | e.xer_in, SO
+            # SO needs to be read for overflow *and* for creation
+            # of CR0 and also for MFSPR
+            return ((e.do.oe.oe[0] & e.do.oe.oe_ok) | e.xer_in |
+                     (e.do.rc.rc & e.do.rc.ok)), SO
         if name == 'xer_ov':
             return (e.do.oe.oe[0] & e.do.oe.oe_ok) | e.xer_in, OV
         if name == 'xer_ca':
index 2ced9569aa8a69979aeaa72bbfc1882263f70511..bffb41288321061f43a783ee326425193e20825f 100644 (file)
@@ -438,12 +438,14 @@ class ALUHelpers:
             res['xer_ov'] = expected_ov | (expected_ov32 << 1)
 
     def get_sim_xer_so(res, sim, dec2):
-        yield
-        #oe = yield dec2.e.do.oe.oe
-        #oe_ok = yield dec2.e.do.oe.ok
-        #xer_in = yield dec2.e.xer_in
-        #if xer_in or (oe and oe_ok):
-        res['xer_so'] = 1 if sim.spr['XER'][XER_bits['SO']] else 0
+        print ("XER", sim.spr.__class__, sim.spr, sim.spr['XER'])
+        oe = yield dec2.e.do.oe.oe
+        oe_ok = yield dec2.e.do.oe.ok
+        xer_in = yield dec2.e.xer_in
+        rc = yield dec2.e.do.rc.rc
+        rc_ok = yield dec2.e.do.rc.ok
+        if xer_in or (oe and oe_ok) or (rc and rc_ok):
+            res['xer_so'] = 1 if sim.spr['XER'][XER_bits['SO']] else 0
 
     def check_slow_spr1(dut, res, sim_o, msg):
         if 'spr1' in res: