aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrashanth Mundkur <prashanth.mundkur@gmail.com>2019-03-04 13:13:39 -0800
committerPrashanth Mundkur <prashanth.mundkur@gmail.com>2019-03-04 13:14:00 -0800
commita6e01eb4f5e2df4933e5884723f05896d4c57bba (patch)
treecccb1b0c84e67eed15cfb0d40ece139cf6e4e15c
parent5201dccd129055f2a32952d4e96d7ecf6f41d174 (diff)
downloadsail-riscv-a6e01eb4f5e2df4933e5884723f05896d4c57bba.zip
sail-riscv-a6e01eb4f5e2df4933e5884723f05896d4c57bba.tar.gz
sail-riscv-a6e01eb4f5e2df4933e5884723f05896d4c57bba.tar.bz2
Fix missed RV32 check for shamt in sll/srl.
-rw-r--r--model/riscv_insts_base.sail18
1 files changed, 13 insertions, 5 deletions
diff --git a/model/riscv_insts_base.sail b/model/riscv_insts_base.sail
index c612039..87da930 100644
--- a/model/riscv_insts_base.sail
+++ b/model/riscv_insts_base.sail
@@ -185,11 +185,15 @@ mapping clause encdec = SHIFTIOP(shamt, rs1, rd, RISCV_SRAI) <-> 0b010000 @ sham
function clause execute (SHIFTIOP(shamt, rs1, rd, op)) = {
let rs1_val = X(rs1);
+ /* the decoder guard should ensure that shamt[5] = 0 for RV32 */
let result : xlenbits = match op {
- RISCV_SLLI => rs1_val << shamt,
- RISCV_SRLI => rs1_val >> shamt,
+ RISCV_SLLI => if sizeof(xlen) == 32
+ then rs1_val << shamt[4..0]
+ else rs1_val << shamt,
+ RISCV_SRLI => if sizeof(xlen) == 32
+ then rs1_val >> shamt[4..0]
+ else rs1_val >> shamt,
RISCV_SRAI => if sizeof(xlen) == 32
- /* the decoder guard should ensure that shamt[5] = 0 for RV32 */
then shift_right_arith32(rs1_val, shamt[4..0])
else shift_right_arith64(rs1_val, shamt)
};
@@ -230,8 +234,12 @@ function clause execute (RTYPE(rs2, rs1, rd, op)) = {
RISCV_AND => rs1_val & rs2_val,
RISCV_OR => rs1_val | rs2_val,
RISCV_XOR => rs1_val ^ rs2_val,
- RISCV_SLL => rs1_val << (rs2_val[5..0]),
- RISCV_SRL => rs1_val >> (rs2_val[5..0]),
+ RISCV_SLL => if sizeof(xlen) == 32
+ then rs1_val << (rs2_val[4..0])
+ else rs1_val << (rs2_val[5..0]),
+ RISCV_SRL => if sizeof(xlen) == 32
+ then rs1_val >> (rs2_val[4..0])
+ else rs1_val >> (rs2_val[5..0]),
RISCV_SUB => rs1_val - rs2_val,
RISCV_SRA => if sizeof(xlen) == 32
then shift_right_arith32(rs1_val, rs2_val[4..0])