@@ -62,11 +62,6 @@ type InstructionI =
62
62
//================================================================
63
63
// Sub-opcodes for 'I' instructions
64
64
65
- // Sub opcode_OP_IMM.SLLI/SRLI/SRAI - 32 & 64 bit
66
- let msbs6_SLLI = 0b0000000 L
67
- let msbs6_SRLI = 0b0000000 L
68
- let msbs6_SRAI = 0b0100000 L
69
-
70
65
// opcode_MISC_MEM sub-opcodes
71
66
let funct3_FENCE = 0b000 L
72
67
@@ -76,7 +71,7 @@ let funct12_ECALL = 0b000000000000L
76
71
let funct12_EBREAK = 0b000000000001 L
77
72
78
73
/// Decode 'I' instructions
79
- let Decode ( instr : InstrField ) : InstructionI =
74
+ let Decode ( mstate : MachineState ) ( instr : InstrField ) : InstructionI =
80
75
let opcode = instr.bitSlice 6 0
81
76
// Register number can be: 0-32
82
77
let rd = int32( instr.bitSlice 11 7 )
@@ -87,11 +82,15 @@ let Decode (instr: InstrField) : InstructionI =
87
82
let funct7 = instr.bitSlice 31 25
88
83
89
84
// 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 ) = 0 L) ||
93
+ ( mstate.Arch.archBits = RV64)
95
94
96
95
let imm12_I = ( instr.bitSlice 31 20 ) .signExtend 12
97
96
let imm20_U = (( instr.bitSlice 31 12 ) <<< 12 ) .signExtend 32
@@ -172,9 +171,9 @@ let Decode (instr: InstrField) : InstructionI =
172
171
| 0b111 L -> ANDI {| rd = rd; rs1 = rs1; imm12 = imm12_ I |}
173
172
174
173
// Shift Immediate Opcodes
175
- | 0b001 L when funct7 = msbs6 _ SLLI -> SLLI {| rd = rd; rs1 = rs1; shamt = shamt |}
176
- | 0b101 L when funct7 = msbs6 _ SRLI -> SRLI {| rd = rd; rs1 = rs1; shamt = shamt |}
177
- | 0b101 L when funct7 = msbs6 _ SRAI -> SRAI {| rd = rd; rs1 = rs1; shamt = shamt |}
174
+ | 0b001 L when funct6 = 0b000000 L && shamt _ ok -> SLLI {| rd = rd; rs1 = rs1; shamt = shamt |}
175
+ | 0b101 L when funct6 = 0b000000 L && shamt _ ok -> SRLI {| rd = rd; rs1 = rs1; shamt = shamt |}
176
+ | 0b101 L when funct6 = 0b010000 L && shamt _ ok -> SRAI {| rd = rd; rs1 = rs1; shamt = shamt |}
178
177
| _ -> None
179
178
180
179
// ALU Opcodes
0 commit comments