Implement rlwimi as well
authorMichael Nolan <mtnolan2640@gmail.com>
Sun, 10 May 2020 22:52:45 +0000 (18:52 -0400)
committerMichael Nolan <mtnolan2640@gmail.com>
Sun, 10 May 2020 22:52:45 +0000 (18:52 -0400)
src/soc/alu/input_stage.py
src/soc/alu/main_stage.py
src/soc/alu/test/test_pipe_caller.py
src/soc/decoder/isa/fixedshift.patch

index ed86a5bf0f2be2d16b33f62f26b36bc1fd2c662c..389954b5eb9f4de2a378803a760e0bded9dcd08b 100644 (file)
@@ -5,6 +5,7 @@
 from nmigen import (Module, Signal, Cat, Const, Mux, Repl, signed,
                     unsigned)
 from nmutil.pipemodbase import PipeModBase
+from soc.decoder.power_enums import InternalOp
 from soc.alu.pipe_data import ALUInputData
 from soc.decoder.power_enums import CryIn
 
@@ -38,7 +39,8 @@ class ALUInputStage(PipeModBase):
         ##### operand B #####
 
         # If there's an immediate, set the B operand to that
-        with m.If(self.i.ctx.op.imm_data.imm_ok):
+        with m.If(self.i.ctx.op.imm_data.imm_ok &
+                  ~(self.i.ctx.op.insn_type == InternalOp.OP_RLC)):
             comb += self.o.b.eq(self.i.ctx.op.imm_data.imm)
         with m.Else():
             comb += self.o.b.eq(self.i.b)
index 173ca78fe3abe3bc24f2fc2494f575a2d61bda9c..59c896a56cc6217b969f506d6dee7661bacc548d 100644 (file)
@@ -134,7 +134,10 @@ class ALUMainStage(PipeModBase):
                     comb += self.o.o.eq(rotl_out & mask)
 
             with m.Case(InternalOp.OP_RLC):
-                comb += rotate_amt.eq(self.i.b[0:5])
+                with m.If(self.i.ctx.op.imm_data.imm_ok):
+                    comb += rotate_amt.eq(self.i.ctx.op.imm_data.imm[0:5])
+                with m.Else():
+                    comb += rotate_amt.eq(self.i.b[0:5])
                 comb += maskgen.mb.eq(mb+32)
                 comb += maskgen.me.eq(me+32)
                 comb += mask.eq(maskgen.o)
index 04363ab853b58d6c80364ce45ab266e9980e74e8..bf5a7e24a8b7fdc6f38f6dfa9029832f0733f8f1 100644 (file)
@@ -157,6 +157,15 @@ class ALUTestCase(FHDLTestCase):
             with Program(lst) as program:
                 sim = self.run_tst_program(program, initial_regs)
 
+    def test_rlwimi(self):
+        lst = ["rlwinm 3, 1, 5, 20, 6",
+               "rlwimi 3, 1, 5, 20, 6"]
+        initial_regs = [0] * 32
+        initial_regs[1] = random.randint(0, (1<<64)-1)
+        initial_regs[3] = random.randint(0, (1<<64)-1)
+        with Program(lst) as program:
+            sim = self.run_tst_program(program, initial_regs)
+
     def test_ilang(self):
         rec = CompALUOpSubset()
 
index b9f8908a7d97fa592464f784be7c9cb0a4bb96c3..8485cd8c48d00c9683f740db461506fc0b5db13e 100644 (file)
@@ -1,6 +1,6 @@
 --- fixedshift.py.orig 2020-05-09 09:56:10.393656481 -0400
-+++ fixedshift.py      2020-05-10 16:03:17.449405581 -0400
-@@ -12,8 +12,8 @@
++++ fixedshift.py      2020-05-10 18:51:24.725396454 -0400
+@@ -12,48 +12,48 @@
      @inject()
      def op_rlwinm(self, RS):
          n = SH
          RA = r & m
          return (RA,)
  
-@@ -21,7 +21,7 @@
+     @inject()
      def op_rlwinm_(self, RS):
          n = SH
-         r = ROTL32(RS[32:64], n)
+-        r = ROTL32(RS[32:64], n)
 -        m = MASK(MB + 32, ME + 32)
++        r = ROTL32(EXTZ64(RS[32:64]), n)
 +        m = MASK(MB.value + 32, ME.value + 32)
          RA = r & m
          return (RA,)
  
-@@ -29,7 +29,7 @@
+     @inject()
      def op_rlwnm(self, RB, RS):
          n = RB[59:64]
-         r = ROTL32(RS[32:64], n)
+-        r = ROTL32(RS[32:64], n)
 -        m = MASK(MB + 32, ME + 32)
++        r = ROTL32(EXTZ64(RS[32:64]), n)
 +        m = MASK(MB.value + 32, ME.value + 32)
          RA = r & m
          return (RA,)
  
-@@ -37,7 +37,7 @@
+     @inject()
      def op_rlwnm_(self, RB, RS):
          n = RB[59:64]
-         r = ROTL32(RS[32:64], n)
+-        r = ROTL32(RS[32:64], n)
 -        m = MASK(MB + 32, ME + 32)
++        r = ROTL32(EXTZ64(RS[32:64]), n)
 +        m = MASK(MB.value + 32, ME.value + 32)
          RA = r & m
          return (RA,)
  
-@@ -45,7 +45,7 @@
+     @inject()
      def op_rlwimi(self, RS, RA):
          n = SH
-         r = ROTL32(RS[32:64], n)
+-        r = ROTL32(RS[32:64], n)
 -        m = MASK(MB + 32, ME + 32)
++        r = ROTL32(EXTZ64(RS[32:64]), n)
 +        m = MASK(MB.value + 32, ME.value + 32)
          RA = r & m | RA & ~m
          return (RA,)
  
-@@ -53,7 +53,7 @@
+     @inject()
      def op_rlwimi_(self, RS, RA):
          n = SH
-         r = ROTL32(RS[32:64], n)
+-        r = ROTL32(RS[32:64], n)
 -        m = MASK(MB + 32, ME + 32)
++        r = ROTL32(EXTZ64(RS[32:64]), n)
 +        m = MASK(MB.value + 32, ME.value + 32)
          RA = r & m | RA & ~m
          return (RA,)