power_insn: hack CR assembly
authorDmitry Selyutin <ghostmansd@gmail.com>
Sat, 21 Jan 2023 18:58:22 +0000 (21:58 +0300)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 2 Jun 2023 18:51:16 +0000 (19:51 +0100)
src/openpower/decoder/power_insn.py

index aad06c387296a9ea3d3bbfbb70917f13b3b426e6..df7bb4a907bee278b4fd40fe58959fe4c8273332 100644 (file)
@@ -2653,9 +2653,6 @@ class SpecifierFFPR(SpecifierPredicate):
         if self.record.svp64.mode is _SVMode.CROP:
             if self.mode == "pr":
                 raise ValueError("crop: 'pr' mode not supported")
-            if (self.record.svp64.extra_CR_3bit and
-                    (self.pred.mode is not _SVP64PredMode.RC1)):
-                raise ValueError("3-bit CRs only support RC1/~RC1 BO")
 
     def assemble(self, insn):
         selector = insn.select(record=self.record)
@@ -2663,9 +2660,12 @@ class SpecifierFFPR(SpecifierPredicate):
             raise ValueError("cannot override mode")
         if self.record.svp64.mode is _SVMode.CROP:
             selector.mode.sel = 0b10
-            selector.inv = self.pred.inv
-            if not self.record.svp64.extra_CR_3bit:
-                selector.CR = self.pred.state
+            # HACK: please finally provide correct logic for CRs.
+            if self.pred in (_SVP64Pred.RC1, _SVP64Pred.RC1_N):
+                selector.mode[2] = (self.pred is _SVP64Pred.RC1_N)
+            else:
+                selector.mode[2] = self.pred.inv
+                selector.mode[3, 4] = self.pred.state
         else:
             selector.mode.sel = 0b01 if self.mode == "ff" else 0b11
             selector.inv = self.pred.inv