summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--riscv/riscv.sail128
1 files changed, 127 insertions, 1 deletions
diff --git a/riscv/riscv.sail b/riscv/riscv.sail
index 37244735..f7cb702c 100644
--- a/riscv/riscv.sail
+++ b/riscv/riscv.sail
@@ -46,7 +46,7 @@ function clause decode imm : bits(12) @ rs1 : regbits @ 0b000 @ rd : regbits @ 0
function clause execute (RISCV_JALR(imm, rs1, rd)) = {
/* write rd before anything else to prevent unintended strength */
- wGPR(rd, PC + 4);
+ wGPR(rd, nextPC); /* compatible with JALR, C.JR and C.JALR */
let newPC : bits(64) = rGPR(rs1) + EXTS(imm);
nextPC = newPC[63..1] @ 0b0;
}
@@ -909,6 +909,132 @@ function clause execute (C_BNEZ(imm, rs)) =
/* ****************************************************************** */
+union clause ast = C_SLLI : (bits(6), regbits)
+
+function clause decodeCompressed (0b000 @ nzui5 : bits(1) @ rsd : regbits @ nzui40 : bits(5) @ 0b10) = {
+ let shamt : bits(6) = nzui5 @ nzui40 in
+ if shamt == 0b000000 | rsd == zreg /* TODO: On RV32, also need shamt[5] == 0 */
+ then None
+ else Some(C_SLLI(shamt, rsd))
+}
+
+function clause execute (C_SLLI(shamt, rsd)) =
+ execute(SHIFTIOP(shamt, rsd, rsd, RISCV_SLLI))
+
+/* ****************************************************************** */
+
+union clause ast = C_LWSP : (bits(6), regbits)
+
+function clause decodeCompressed (0b010 @ ui5 : bits(1) @ rd : regbits @ ui42 : bits(3) @ ui76 : bits(2) @ 0b10) = {
+ let uimm : bits(6) = ui76 @ ui5 @ ui42 in
+ if rd == zreg
+ then None
+ else Some(C_LWSP(uimm, rd))
+}
+
+function clause execute (C_LWSP(uimm, rd)) = {
+ let imm : bits(12) = EXTZ(uimm @ 0b00) in
+ execute(LOAD(imm, sp, rd, false, WORD, false, false))
+}
+
+/* ****************************************************************** */
+
+union clause ast = C_LDSP : (bits(6), regbits)
+
+function clause decodeCompressed (0b010 @ ui5 : bits(1) @ rd : regbits @ ui43 : bits(2) @ ui86 : bits(3) @ 0b10) = {
+ let uimm : bits(6) = ui86 @ ui5 @ ui43 in
+ if rd == zreg
+ then None
+ else Some(C_LDSP(uimm, rd))
+}
+
+function clause execute (C_LDSP(uimm, rd)) = {
+ let imm : bits(12) = EXTZ(uimm @ 0b000) in
+ execute(LOAD(imm, sp, rd, false, DOUBLE, false, false))
+}
+
+/* ****************************************************************** */
+
+union clause ast = C_SWSP : (bits(6), regbits)
+
+function clause decodeCompressed (0b110 @ ui52 : bits(4) @ ui76 : bits(2) @ rs2 : regbits @ 0b10) = {
+ let uimm : bits(6) = ui76 @ ui52 in
+ Some(C_SWSP(uimm, rs2))
+}
+
+function clause execute (C_SWSP(uimm, rs2)) = {
+ let imm : bits(12) = EXTZ(uimm @ 0b00) in
+ execute(STORE(imm, rs2, sp, WORD, false, false))
+}
+
+/* ****************************************************************** */
+
+union clause ast = C_SDSP : (bits(6), regbits)
+
+function clause decodeCompressed (0b111 @ ui53 : bits(3) @ ui86 : bits(3) @ rs2 : regbits @ 0b10) = {
+ let uimm : bits(6) = ui86 @ ui53 in
+ Some(C_SDSP(uimm, rs2))
+}
+
+function clause execute (C_SDSP(uimm, rs2)) = {
+ let imm : bits(12) = EXTZ(uimm @ 0b000) in
+ execute(STORE(imm, rs2, sp, DOUBLE, false, false))
+}
+
+/* ****************************************************************** */
+
+union clause ast = C_JR : (regbits)
+
+function clause decodeCompressed (0b100 @ 0b0 @ rs1 : regbits @ 0b00000 @ 0b10) = {
+ if rs1 == zreg
+ then None
+ else Some(C_JR(rs1))
+}
+
+function clause execute (C_JR(rs1)) =
+ execute(RISCV_JALR(EXTZ(0b0), rs1, zreg))
+
+/* ****************************************************************** */
+
+union clause ast = C_JALR : (regbits)
+
+function clause decodeCompressed (0b100 @ 0b1 @ rs1 : regbits @ 0b00000 @ 0b10) = {
+ if rs1 == zreg
+ then None
+ else Some(C_JALR(rs1))
+}
+
+function clause execute (C_JALR(rs1)) =
+ execute(RISCV_JALR(EXTZ(0b0), rs1, ra))
+
+/* ****************************************************************** */
+
+union clause ast = C_MV : (regbits, regbits)
+
+function clause decodeCompressed (0b100 @ 0b0 @ rd : regbits @ rs2 : regbits @ 0b10) = {
+ if rs2 == zreg | rd == zreg
+ then None
+ else Some(C_MV(rd, rs2))
+}
+
+function clause execute (C_MV(rd, rs2)) =
+ execute(RTYPE(rs2, zreg, rd, RISCV_ADD))
+
+/* ****************************************************************** */
+
+union clause ast = C_ADD : (regbits, regbits)
+
+function clause decodeCompressed (0b100 @ 0b1 @ rsd : regbits @ rs2 : regbits @ 0b10) = {
+ if rsd == zreg | rs2 == zreg
+ then None
+ else Some(C_ADD(rsd, rs2))
+}
+
+function clause execute (C_ADD(rsd, rs2)) =
+ execute(RTYPE(rs2, rsd, rsd, RISCV_ADD))
+
+/* ****************************************************************** */
+
function clause decode _ = None
function clause decodeCompressed _ = None