Skip to content

Commit f10fdd9

Browse files
committed
rv64i: changes shamt functions & tests
1 parent 36c69dc commit f10fdd9

File tree

11 files changed

+25
-26
lines changed

11 files changed

+25
-26
lines changed

DecodeI.fs

+13-14
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,6 @@ type InstructionI =
6262
//================================================================
6363
// Sub-opcodes for 'I' instructions
6464

65-
// Sub opcode_OP_IMM.SLLI/SRLI/SRAI - 32 & 64 bit
66-
let msbs6_SLLI = 0b0000000L
67-
let msbs6_SRLI = 0b0000000L
68-
let msbs6_SRAI = 0b0100000L
69-
7065
// opcode_MISC_MEM sub-opcodes
7166
let funct3_FENCE = 0b000L
7267

@@ -76,7 +71,7 @@ let funct12_ECALL = 0b000000000000L
7671
let funct12_EBREAK = 0b000000000001L
7772

7873
/// Decode 'I' instructions
79-
let Decode (instr: InstrField) : InstructionI =
74+
let Decode (mstate : MachineState) (instr: InstrField) : InstructionI =
8075
let opcode = instr.bitSlice 6 0
8176
// Register number can be: 0-32
8277
let rd = int32(instr.bitSlice 11 7)
@@ -87,11 +82,15 @@ let Decode (instr: InstrField) : InstructionI =
8782
let funct7 = instr.bitSlice 31 25
8883

8984
// Shamt funcs
90-
let shamt = instr.bitSlice 24 20
91-
let shamt5 = instr.bitSlice 24 20
92-
let shamt6 = instr.bitSlice 25 20
93-
// TODO: x32/64 check for Shamt
94-
let shamt_ok = true
85+
let shamt =
86+
if mstate.Arch.archBits = RV32 then
87+
instr.bitSlice 24 20
88+
else
89+
instr.bitSlice 24 20
90+
let funct6 = instr.bitSlice 31 26
91+
let shamt_ok =
92+
((instr.bitSlice 25 25) = 0L) ||
93+
(mstate.Arch.archBits = RV64)
9594

9695
let imm12_I = (instr.bitSlice 31 20).signExtend 12
9796
let imm20_U = ((instr.bitSlice 31 12) <<< 12).signExtend 32
@@ -172,9 +171,9 @@ let Decode (instr: InstrField) : InstructionI =
172171
| 0b111L -> ANDI {| rd = rd; rs1 = rs1; imm12 = imm12_I |}
173172

174173
// Shift Immediate Opcodes
175-
| 0b001L when funct7 = msbs6_SLLI -> SLLI {| rd = rd; rs1 = rs1; shamt = shamt |}
176-
| 0b101L when funct7 = msbs6_SRLI -> SRLI {| rd = rd; rs1 = rs1; shamt = shamt |}
177-
| 0b101L when funct7 = msbs6_SRAI -> SRAI {| rd = rd; rs1 = rs1; shamt = shamt |}
174+
| 0b001L when funct6 = 0b000000L && shamt_ok -> SLLI {| rd = rd; rs1 = rs1; shamt = shamt |}
175+
| 0b101L when funct6 = 0b000000L && shamt_ok -> SRLI {| rd = rd; rs1 = rs1; shamt = shamt |}
176+
| 0b101L when funct6 = 0b010000L && shamt_ok -> SRAI {| rd = rd; rs1 = rs1; shamt = shamt |}
178177
| _ -> None
179178

180179
// ALU Opcodes

Decoder.fs

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ type execFunc = MachineState -> MachineState
1616
// | None
1717

1818
// Aggregate decoded data
19-
let Decode (instr: InstrField) : execFunc option =
20-
let decI32 = I.Decode instr
19+
let Decode (mstate : MachineState) (instr: InstrField) : execFunc option =
20+
let decI32 = I.Decode mstate instr
2121
let decI64 =
2222
if decI32 = I.InstructionI.None then
2323
I64.Decode instr

Run.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ let rec runCycle (mstate : MachineState) =
4848
| None -> mstate.setRunState (Trap (InstructionFetch mstate.PC))
4949
| _ ->
5050
let instrValue = instr.Value
51-
let executor = Decoder.Decode instrValue
51+
let executor = Decoder.Decode mstate instrValue
5252

5353
match executor with
5454
| None -> mstate.setRunState (Trap TrapErrors.InstructionDecode)

Tests/rv32i/alu.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ let ALU instr x1 x2 x3 =
1515
let mstate = mstate.setRegister 1 x1
1616
let mstate = mstate.setRegister 2 x2
1717

18-
let executor = Decoder.Decode instr
18+
let executor = Decoder.Decode mstate instr
1919
Assert.NotEqual(executor, None)
2020
let mstate = executor.Value mstate
2121
Assert.Equal(x1, mstate.getRegister 1)

Tests/rv32i/alui.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ let ALUimmediate instr x2 x3 =
1515
let mstate = mstate.setPC addr
1616
let mstate = mstate.setRegister 2 x2
1717

18-
let executor = Decoder.Decode instr
18+
let executor = Decoder.Decode mstate instr
1919
Assert.NotEqual(executor, None)
2020
let mstate = executor.Value mstate
2121
Assert.Equal(x2, mstate.getRegister 2)

Tests/rv32i/br.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ let Branch instr x1 x2 resultAddr =
1515
let mstate = mstate.setRegister 1 x1
1616
let mstate = mstate.setRegister 2 x2
1717

18-
let executor = Decoder.Decode instr
18+
let executor = Decoder.Decode mstate instr
1919
Assert.NotEqual(executor, None)
2020
let mstate = executor.Value mstate
2121
Assert.Equal(x1, mstate.getRegister 1)

Tests/rv32i/j.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ let Jump instr x2 x3 resultAddr =
1616
let mstate = mstate.setRegister 2 x2
1717
let resMstate = mstate.incPC
1818

19-
let executor = Decoder.Decode instr
19+
let executor = Decoder.Decode mstate instr
2020
Assert.NotEqual(executor, None)
2121
let mstate = executor.Value mstate
2222

Tests/rv32i/mem.fs

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ let loadMemory instr x2 imm nBytes unsign =
3434
let mstate = mstate.setMemoryByte (memAddr+2L) 0xb2uy
3535
(mstate.setMemoryByte (memAddr+3L) 0xc3uy, int64(0xc3b2a10fl))
3636

37-
let executor = Decoder.Decode instr
37+
let executor = Decoder.Decode mstate instr
3838
Assert.NotEqual(executor, None)
3939
let mstate = executor.Value mstate
4040
Assert.Equal(x2, mstate.getRegister 2)
@@ -49,7 +49,7 @@ let storeMemory instr x3 x2 imm nBytes =
4949
let mstate = mstate.setRegister 2 x2
5050
let mstate = mstate.setRegister 3 x3
5151

52-
let executor = Decoder.Decode instr
52+
let executor = Decoder.Decode mstate instr
5353
Assert.NotEqual(executor, None)
5454

5555
// Get memory value

Tests/rv32i/sys.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ let System instr trap =
1515
let mstate = mstate.setPC addr
1616
let newmstate = mstate.incPC
1717

18-
let executor = Decoder.Decode instr
18+
let executor = Decoder.Decode mstate instr
1919
Assert.NotEqual(executor, None)
2020
let mstate = executor.Value mstate
2121

Tests/rv32i/ui.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ let Ui instr x3 =
1313
let mstate = MachineState.InitMachineState Map.empty RV32i true
1414
let mstate = mstate.setPC addr
1515

16-
let executor = Decoder.Decode instr
16+
let executor = Decoder.Decode mstate instr
1717
Assert.NotEqual(executor, None)
1818
let mstate = executor.Value mstate
1919
Assert.Equal(x3, mstate.getRegister 3)

Tests/rv64i/alu.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ let ALU instr x1 x2 x3 =
1515
let mstate = mstate.setRegister 1 x1
1616
let mstate = mstate.setRegister 2 x2
1717

18-
let executor = Decoder.Decode instr
18+
let executor = Decoder.Decode mstate instr
1919
Assert.NotEqual(executor, None)
2020
let mstate = executor.Value mstate
2121
Assert.Equal(x1, mstate.getRegister 1)

0 commit comments

Comments
 (0)