bug 1248: add a stack of missing CR 3/5-bit operand vector naming
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 9 Jan 2024 13:39:28 +0000 (13:39 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 30 Jan 2024 20:56:35 +0000 (20:56 +0000)
src/openpower/decoder/isa/caller.py

index 9bd971037ffec87392a5c0ea99220e51e60fef32..d8ae38524663877ca664d4f38d5788d853da3fa6 100644 (file)
@@ -564,6 +564,8 @@ def get_cr_in(dec2, name):
             return in1, cr_isvec
     if name == 'BFA':
         if in_sel == CRInSel.BFA.value:
+    if name in ['BA', 'BB']:
+        if in_sel == CRInSel.BA_BB.value:
             return in1, cr_isvec
     log("get_cr_in not found", name)
     return None, False
@@ -589,6 +591,9 @@ def get_cr_out(dec2, name):
     if name == 'BF':
         if out_sel == CROutSel.BF.value:
             return out, o_isvec
+    if name == 'BT':
+        if out_sel == CROutSel.BT.value:
+            return out, o_isvec
     if name == 'CR0':
         if out_sel == CROutSel.CR0.value:
             return out, o_isvec
@@ -1640,20 +1645,24 @@ class ISACaller(ISACallerHelper, ISAFPHelpers, StepLoop):
         for name in op_fields:
             # CR immediates. deal with separately.  needs modifying
             # pseudocode
-            if self.is_svp64_mode and name in ['BI']:  # TODO, more CRs
-                # BI is a 5-bit, must reconstruct the value
-                regnum, is_vec = yield from get_cr_in(self.dec2, name)
+            crlen5 = ['BC', 'BA', 'BB', 'BT', 'BI'] # 5-bit
+            crlen3 = ['BF', 'BFA']                  # 3-bit (BF: bit-field)
+            if self.is_svp64_mode and name in crlen5:
+                # 5-bit, must reconstruct the value
+                if name in ['BT']:
+                    regnum, is_vec = yield from get_cr_out(self.dec2, name)
+                else:
+                    regnum, is_vec = yield from get_cr_in(self.dec2, name)
                 sig = getattr(fields, name)
                 val = yield sig
                 # low 2 LSBs (CR field selector) remain same, CR num extended
                 assert regnum <= 7, "sigh, TODO, 128 CR fields"
                 val = (val & 0b11) | (regnum << 2)
-            elif self.is_svp64_mode and name in ['BFA']:  # TODO, more CRs
-                regnum, is_vec = yield from get_cr_in(self.dec2, name)
-                log('hack %s' % name, regnum, is_vec)
-                val = regnum
-            elif self.is_svp64_mode and name in ['BF']:  # TODO, more CRs
-                regnum, is_vec = yield from get_cr_out(self.dec2, "BF")
+            elif self.is_svp64_mode and name in crlen3:
+                if name in ['BF']:
+                    regnum, is_vec = yield from get_cr_out(self.dec2, name)
+                else:
+                    regnum, is_vec = yield from get_cr_in(self.dec2, name)
                 log('hack %s' % name, regnum, is_vec)
                 val = regnum
             else:
@@ -1662,10 +1671,11 @@ class ISACaller(ISACallerHelper, ISAFPHelpers, StepLoop):
             # these are all opcode fields involved in index-selection of CR,
             # and need to do "standard" arithmetic.  CR[BA+32] for example
             # would, if using SelectableInt, only be 5-bit.
-            if name in ['BF', 'BFA', 'BFB', 'BC', 'BA', 'BB', 'BT', 'BI']:
-                self.namespace[name] = val
-            else:
-                self.namespace[name] = SelectableInt(val, sig.width)
+            if name not in crlen3 and name not in crlen5:
+                val = SelectableInt(val, sig.width)
+
+            # finally put the field into the namespace
+            self.namespace[name] = val
 
         self.namespace['XER'] = self.spr['XER']
         self.namespace['CA'] = self.spr['XER'][XER_bits['CA']].value