Skip to content

Commit 489448d

Browse files
authored
Merge pull request #3 from rswarbrick/shifts
Fixes for SRL and SRA
2 parents bdb7df4 + 010c838 commit 489448d

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

riscvmodel/insn.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,15 +253,23 @@ def execute(self, model: Model):
253253
@isa("srl", RV32I, opcode=0b0110011, funct3=0b101, funct7=0b0000000)
254254
class InstructionSRL(InstructionRType):
255255
def execute(self, model: Model):
256-
model.state.intreg[
257-
self.rd] = model.state.intreg[self.rs1] >> model.state.intreg[self.rs2]
256+
src = model.state.intreg[self.rs1]
257+
shift = model.state.intreg[self.rs2] & 0x1f
258+
model.state.intreg[self.rd] = src >> shift
258259

259260

260261
@isa("sra", RV32I, opcode=0b0110011, funct3=0b101, funct7=0b0100000)
261262
class InstructionSRA(InstructionRType):
262263
def execute(self, model: Model):
263-
model.state.intreg[
264-
self.rd] = model.state.intreg[self.rs1] >> model.state.intreg[self.rs2]
264+
usrc = model.state.intreg[self.rs1].unsigned()
265+
shift = model.state.intreg[self.rs2].unsigned() & 0x1f
266+
if usrc >> 31:
267+
to_clear = 32 - shift
268+
sign_mask = (((1 << 32) - 1) >> to_clear) << to_clear
269+
else:
270+
sign_mask = 0
271+
272+
model.state.intreg[self.rd] = sign_mask | (usrc >> shift)
265273

266274

267275
@isa("or", RV32I, opcode=0b0110011, funct3=0b110, funct7=0b0000000)

0 commit comments

Comments
 (0)