diff --git a/hs/Execute.hs b/hs/Execute.hs index bd754f5..b57aded 100644 --- a/hs/Execute.hs +++ b/hs/Execute.hs @@ -61,15 +61,18 @@ execute (Opcode opcode addr) = case opcode of SLL (RTypeFields rd _ rs1 rs2 _) -> let val1 = extractRegVal rs1 val2 = extractRegVal rs2 - in WriteBackGPR rd (val1 `shiftL` fromIntegral val2) + shftAmt = fromIntegral |> slice d5 d0 val2 + in WriteBackGPR rd (val1 `shiftL` shftAmt) SRL (RTypeFields rd _ rs1 rs2 _) -> let val1 = extractRegVal rs1 val2 = extractRegVal rs2 - in WriteBackGPR rd (val1 `shiftR` fromIntegral val2) + shftAmt = fromIntegral |> slice d5 d0 val2 + in WriteBackGPR rd (val1 `shiftR` shftAmt) SRA (RTypeFields rd _ rs1 rs2 _) -> let val1 = unpack (pack (extractRegVal rs1) :: BitVector 64) :: Signed 64 val2 = extractRegVal rs2 - in WriteBackGPR rd (bitCoerce (val1 `shiftR` fromIntegral val2)) + shftAmt = fromIntegral |> slice d5 d0 val2 + in WriteBackGPR rd (bitCoerce (val1 `shiftR` shftAmt)) SLT (RTypeFields rd _ rs1 rs2 _) -> let val1 = unpack (pack (extractRegVal rs1) :: BitVector 64) :: Signed 64 val2 = unpack (pack (extractRegVal rs2) :: BitVector 64) :: Signed 64