Implement logical shift right
authorMichael Nolan <mtnolan2640@gmail.com>
Sat, 9 May 2020 17:06:48 +0000 (13:06 -0400)
committerMichael Nolan <mtnolan2640@gmail.com>
Sat, 9 May 2020 17:06:48 +0000 (13:06 -0400)
src/soc/alu/main_stage.py
src/soc/alu/test/test_pipe_caller.py

index ab89c2db2b5695ab568077182e593682d8c05b5c..e66a769e94de9a440580412f76d867caf99d0229 100644 (file)
@@ -38,12 +38,13 @@ class ALUMainStage(PipeModBase):
         m.submodules.maskgen = maskgen = MaskGen(64)
         m.submodules.rotl = rotl = ROTL(64)
         m.submodules.rotl32 = rotl32 = ROTL(32)
+        rotate_amt = Signal.like(rotl.b)
 
         comb += [
             rotl.a.eq(self.i.a),
-            rotl.b.eq(self.i.b),
+            rotl.b.eq(rotate_amt),
             rotl32.a.eq(self.i.a[0:32]),
-            rotl32.b.eq(self.i.b)]
+            rotl32.b.eq(rotate_amt)]
 
         with m.If(is_32bit):
             comb += rotl_out.eq(Cat(rotl32.o, Repl(0, 32)))
@@ -65,6 +66,22 @@ class ALUMainStage(PipeModBase):
             with m.Case(InternalOp.OP_SHL):
                 comb += maskgen.mb.eq(Mux(is_32bit, 32, 0))
                 comb += maskgen.me.eq(63-self.i.b[0:6])
+                comb += rotate_amt.eq(self.i.b[0:6])
+                with m.If(is_32bit):
+                    with m.If(self.i.b[5]):
+                        comb += mask.eq(0)
+                    with m.Else():
+                        comb += mask.eq(maskgen.o)
+                with m.Else():
+                    with m.If(self.i.b[6]):
+                        comb += mask.eq(0)
+                    with m.Else():
+                        comb += mask.eq(maskgen.o)
+                comb += self.o.o.eq(rotl_out & mask)
+            with m.Case(InternalOp.OP_SHR):
+                comb += maskgen.mb.eq(Mux(is_32bit, 32, 0) + self.i.b[0:6])
+                comb += maskgen.me.eq(63)
+                comb += rotate_amt.eq(64-self.i.b[0:6])
                 with m.If(is_32bit):
                     with m.If(self.i.b[5]):
                         comb += mask.eq(0)
index 85ae620693bd2d05ca602de966ef29802b26bb68..3be8d3efaa4951fc2a1ff4d5369686b43c7b53cf 100644 (file)
@@ -125,8 +125,8 @@ class ALUTestCase(FHDLTestCase):
                 sim = self.run_tst_program(program, initial_regs)
 
     def test_shift(self):
-        insns = ["slw", "sld"]
-        for i in range(10):
+        insns = ["slw", "sld", "srw", "srd"]
+        for i in range(20):
             choice = random.choice(insns)
             lst = [f"{choice} 3, 1, 2"]
             initial_regs = [0] * 32