summaryrefslogtreecommitdiff
path: root/risc-v/riscv_regfp.sail
diff options
context:
space:
mode:
Diffstat (limited to 'risc-v/riscv_regfp.sail')
-rw-r--r--risc-v/riscv_regfp.sail77
1 files changed, 69 insertions, 8 deletions
diff --git a/risc-v/riscv_regfp.sail b/risc-v/riscv_regfp.sail
index 0c7a67d8..dee9cc8e 100644
--- a/risc-v/riscv_regfp.sail
+++ b/risc-v/riscv_regfp.sail
@@ -20,16 +20,16 @@ function (regfps,regfps,regfps,niafps,diafp,instruction_kind) initial_analysis (
case (UTYPE ( imm, rd, op)) -> {
if (rd == 0) then () else oR := RFull(GPRstr[rd]) :: oR;
}
- case (JAL ( imm, rd)) -> {
+ case (RISCV_JAL ( imm, rd)) -> {
if (rd == 0) then () else oR := RFull(GPRstr[rd]) :: oR;
let (bit[64]) offset = EXTS(imm) in
Nias := [|| NIAFP_concrete_address (PC + offset) ||]
}
- case (JALR ( imm, rs, rd)) -> {
+ case (RISCV_JALR ( imm, rs, rd)) -> {
if (rs == 0) then () else iR := RFull(GPRstr[rs]) :: iR;
if (rd == 0) then () else oR := RFull(GPRstr[rd]) :: oR;
let (bit[64]) offset = EXTS(imm) in
- Nias := [|| NIAFP_register (RFull(GPRstr[rs])) ||]; (* XXX this should br rs + offset... *)
+ Nias := [|| NIAFP_register (RFull(GPRstr[rs])) ||];
}
case (BTYPE ( imm, rs2, rs1, op)) -> {
if (rs2 == 0) then () else iR := RFull(GPRstr[rs2]) :: iR;
@@ -51,17 +51,29 @@ function (regfps,regfps,regfps,niafps,diafp,instruction_kind) initial_analysis (
if (rs1 == 0) then () else iR := RFull(GPRstr[rs1]) :: iR;
if (rd == 0) then () else oR := RFull(GPRstr[rd]) :: oR;
}
- case (LOAD ( imm, rs, rd, unsign, width)) -> { (* XXX "unsigned" causes name conflict in lem shallow embedding... *)
+ case (LOAD ( imm, rs, rd, unsign, width, aq, rl)) -> { (* XXX "unsigned" causes name conflict in lem shallow embedding... *)
if (rs == 0) then () else iR := RFull(GPRstr[rs]) :: iR;
if (rd == 0) then () else oR := RFull(GPRstr[rd]) :: oR;
aR := iR;
- ik := IK_mem_read (Read_plain);
+ ik :=
+ switch (aq, rl) {
+ case (false, false) -> IK_mem_read (Read_plain)
+ case (true, false) -> IK_mem_read (Read_RISCV_acquire)
+ case (false, true) -> exit "not implemented"
+ case (true, true) -> IK_mem_read (Read_RISCV_strong_acquire)
+ };
}
- case (STORE( imm, rs2, rs1, width)) -> {
+ case (STORE( imm, rs2, rs1, width, aq, rl)) -> {
if (rs2 == 0) then () else iR := RFull(GPRstr[rs2]) :: iR;
if (rs1 == 0) then () else iR := RFull(GPRstr[rs1]) :: iR;
if (rs1 == 0) then () else aR := RFull(GPRstr[rs1]) :: aR;
- ik := IK_mem_write (Write_plain);
+ ik :=
+ switch (aq, rl) {
+ case (false, false) -> IK_mem_write (Write_plain)
+ case (true, false) -> exit "not implemented"
+ case (false, true) -> IK_mem_write (Write_RISCV_release)
+ case (true, true) -> IK_mem_write (Write_RISCV_strong_release)
+ };
}
case (ADDIW ( imm, rs, rd)) -> {
if (rs == 0) then () else iR := RFull(GPRstr[rs]) :: iR;
@@ -77,7 +89,56 @@ function (regfps,regfps,regfps,niafps,diafp,instruction_kind) initial_analysis (
if (rd == 0) then () else oR := RFull(GPRstr[rd]) :: oR;
}
case (FENCE(pred, succ)) -> {
- ik := IK_barrier (Barrier_MIPS_SYNC);
+ ik :=
+ switch(pred, succ) {
+ case (0b0011, 0b0011) -> IK_barrier (Barrier_RISCV_rw_rw)
+ case (0b0010, 0b0011) -> IK_barrier (Barrier_RISCV_r_rw)
+ case (0b0010, 0b0010) -> IK_barrier (Barrier_RISCV_r_r)
+ case (0b0011, 0b0001) -> IK_barrier (Barrier_RISCV_rw_w)
+ case (0b0001, 0b0001) -> IK_barrier (Barrier_RISCV_w_w)
+ case _ -> exit "not implemented"
+ };
+ }
+ case (FENCEI) -> {
+ ik := IK_barrier (Barrier_RISCV_i);
+ }
+ case (LOADRES ( aq, rl, rs1, width, rd)) -> {
+ if (rs1 == 0) then () else iR := RFull(GPRstr[rs1]) :: iR;
+ if (rd == 0) then () else oR := RFull(GPRstr[rd]) :: oR;
+ aR := iR;
+ ik := switch (aq, rl) {
+ case (false, false) -> IK_mem_read (Read_RISCV_reserved)
+ case (true, false) -> IK_mem_read (Read_RISCV_reserved_acquire)
+ case (false, true) -> exit "not implemented"
+ case (true, true) -> IK_mem_read (Read_RISCV_reserved_strong_acquire)
+ };
+ }
+ case (STORECON( aq, rl, rs2, rs1, width, rd)) -> {
+ if (rs2 == 0) then () else iR := RFull(GPRstr[rs2]) :: iR;
+ if (rs1 == 0) then () else iR := RFull(GPRstr[rs1]) :: iR;
+ if (rs1 == 0) then () else aR := RFull(GPRstr[rs1]) :: aR;
+ if (rd == 0) then () else oR := RFull(GPRstr[rd]) :: oR;
+
+ ik := switch (aq, rl) {
+ case (false, false) -> IK_mem_write (Write_RISCV_conditional)
+ case (false, true) -> IK_mem_write (Write_RISCV_conditional_release)
+ case (true, _) -> exit "not implemented"
+ };
+ }
+ case (AMO( op, aq, rl, rs2, rs1, width, rd)) -> {
+ if (rs2 == 0) then () else iR := RFull(GPRstr[rs2]) :: iR;
+ if (rs1 == 0) then () else iR := RFull(GPRstr[rs1]) :: iR;
+ if (rs1 == 0) then () else aR := RFull(GPRstr[rs1]) :: aR;
+ if (rd == 0) then () else oR := RFull(GPRstr[rd]) :: oR;
+
+ ik := switch (aq, rl) {
+ case (false, false) -> IK_mem_rmw (Read_RISCV_reserved, Write_RISCV_conditional)
+ case (false, true) -> IK_mem_rmw (Read_RISCV_reserved, Write_RISCV_conditional_release)
+ case (true, false) -> IK_mem_rmw (Read_RISCV_reserved_acquire,
+ Write_RISCV_conditional)
+ case (true, true) -> IK_mem_rmw (Read_RISCV_reserved_strong_acquire,
+ Write_RISCV_conditional_strong_release)
+ };
}
};
(iR,oR,aR,Nias,Dia,ik)