From e57530eb19e65163cd9caef552bbbad7ee686a99 Mon Sep 17 00:00:00 2001 From: Yui5427 <785369607@qq.com> Date: Wed, 14 May 2025 23:43:19 +0800 Subject: [PATCH 1/2] temperary add c ext inst file --- sail-impl/inst/32/rv_c/c_addi4spn | 8 +++-- sail-impl/inst/64/rv_c/c_add | 0 sail-impl/inst/64/rv_c/c_addi | 5 +++ sail-impl/inst/64/rv_c/c_addi16sp | 0 sail-impl/inst/64/rv_c/c_addi4spn | 8 +++-- sail-impl/inst/64/rv_c/c_addiw | 5 +++ sail-impl/inst/64/rv_c/c_addw | 0 sail-impl/inst/64/rv_c/c_and | 0 sail-impl/inst/64/rv_c/c_andi | 0 sail-impl/inst/64/rv_c/c_beqz | 0 sail-impl/inst/64/rv_c/c_bnez | 0 sail-impl/inst/64/rv_c/c_ebreak | 0 sail-impl/inst/64/rv_c/c_j | 0 sail-impl/inst/64/rv_c/c_jalr | 0 sail-impl/inst/64/rv_c/c_jr | 0 sail-impl/inst/64/rv_c/c_ld | 0 sail-impl/inst/64/rv_c/c_ldsp | 0 sail-impl/inst/64/rv_c/c_li | 0 sail-impl/inst/64/rv_c/c_lui | 0 sail-impl/inst/64/rv_c/c_lw | 0 sail-impl/inst/64/rv_c/c_lwsp | 0 sail-impl/inst/64/rv_c/c_mv | 0 sail-impl/inst/64/rv_c/c_nop | 0 sail-impl/inst/64/rv_c/c_or | 0 sail-impl/inst/64/rv_c/c_sd | 0 sail-impl/inst/64/rv_c/c_sdsp | 0 sail-impl/inst/64/rv_c/c_slli | 0 sail-impl/inst/64/rv_c/c_srai | 0 sail-impl/inst/64/rv_c/c_srli | 0 sail-impl/inst/64/rv_c/c_sub | 0 sail-impl/inst/64/rv_c/c_subw | 0 sail-impl/inst/64/rv_c/c_sw | 0 sail-impl/inst/64/rv_c/c_xor | 0 sail-impl/sail-impl-meta.json | 2 +- sailcodegen/src/SailCodeGen.scala | 55 ++++++++++++++++++++++++++----- z3_problems | 0 36 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 sail-impl/inst/64/rv_c/c_add create mode 100644 sail-impl/inst/64/rv_c/c_addi create mode 100644 sail-impl/inst/64/rv_c/c_addi16sp create mode 100644 sail-impl/inst/64/rv_c/c_addiw create mode 100644 sail-impl/inst/64/rv_c/c_addw create mode 100644 sail-impl/inst/64/rv_c/c_and create mode 100644 sail-impl/inst/64/rv_c/c_andi create mode 100644 sail-impl/inst/64/rv_c/c_beqz create mode 100644 sail-impl/inst/64/rv_c/c_bnez create mode 100644 sail-impl/inst/64/rv_c/c_ebreak create mode 100644 sail-impl/inst/64/rv_c/c_j create mode 100644 sail-impl/inst/64/rv_c/c_jalr create mode 100644 sail-impl/inst/64/rv_c/c_jr create mode 100644 sail-impl/inst/64/rv_c/c_ld create mode 100644 sail-impl/inst/64/rv_c/c_ldsp create mode 100644 sail-impl/inst/64/rv_c/c_li create mode 100644 sail-impl/inst/64/rv_c/c_lui create mode 100644 sail-impl/inst/64/rv_c/c_lw create mode 100644 sail-impl/inst/64/rv_c/c_lwsp create mode 100644 sail-impl/inst/64/rv_c/c_mv create mode 100644 sail-impl/inst/64/rv_c/c_nop create mode 100644 sail-impl/inst/64/rv_c/c_or create mode 100644 sail-impl/inst/64/rv_c/c_sd create mode 100644 sail-impl/inst/64/rv_c/c_sdsp create mode 100644 sail-impl/inst/64/rv_c/c_slli create mode 100644 sail-impl/inst/64/rv_c/c_srai create mode 100644 sail-impl/inst/64/rv_c/c_srli create mode 100644 sail-impl/inst/64/rv_c/c_sub create mode 100644 sail-impl/inst/64/rv_c/c_subw create mode 100644 sail-impl/inst/64/rv_c/c_sw create mode 100644 sail-impl/inst/64/rv_c/c_xor create mode 100644 z3_problems diff --git a/sail-impl/inst/32/rv_c/c_addi4spn b/sail-impl/inst/32/rv_c/c_addi4spn index f8a5243..563b771 100644 --- a/sail-impl/inst/32/rv_c/c_addi4spn +++ b/sail-impl/inst/32/rv_c/c_addi4spn @@ -1,3 +1,5 @@ -let imm : bits(12) = (0b00 @ nzimm @ 0b00); -let rd = creg2reg_idx(rdc); -X(rd) = X(sp) + imm; \ No newline at end of file +let imm : bits(12) = (0b00 @ c_nzuimm10 @ 0b00); +let rd = creg2reg_idx(rd_p); +// 0b00010 represents sp +let sp_val = read_GPR(0b00010); +write_GPR(rd, sp_val + sign_extend(imm)); \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_add b/sail-impl/inst/64/rv_c/c_add new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_addi b/sail-impl/inst/64/rv_c/c_addi new file mode 100644 index 0000000..563b771 --- /dev/null +++ b/sail-impl/inst/64/rv_c/c_addi @@ -0,0 +1,5 @@ +let imm : bits(12) = (0b00 @ c_nzuimm10 @ 0b00); +let rd = creg2reg_idx(rd_p); +// 0b00010 represents sp +let sp_val = read_GPR(0b00010); +write_GPR(rd, sp_val + sign_extend(imm)); \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_addi16sp b/sail-impl/inst/64/rv_c/c_addi16sp new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_addi4spn b/sail-impl/inst/64/rv_c/c_addi4spn index f8a5243..563b771 100644 --- a/sail-impl/inst/64/rv_c/c_addi4spn +++ b/sail-impl/inst/64/rv_c/c_addi4spn @@ -1,3 +1,5 @@ -let imm : bits(12) = (0b00 @ nzimm @ 0b00); -let rd = creg2reg_idx(rdc); -X(rd) = X(sp) + imm; \ No newline at end of file +let imm : bits(12) = (0b00 @ c_nzuimm10 @ 0b00); +let rd = creg2reg_idx(rd_p); +// 0b00010 represents sp +let sp_val = read_GPR(0b00010); +write_GPR(rd, sp_val + sign_extend(imm)); \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_addiw b/sail-impl/inst/64/rv_c/c_addiw new file mode 100644 index 0000000..978530e --- /dev/null +++ b/sail-impl/inst/64/rv_c/c_addiw @@ -0,0 +1,5 @@ +let imm : bits(6) = c_nzuimm10; +let rd = creg2reg_idx(rd_p); +// 0b00010 represents sp +let sp_val = read_GPR(0b00010); +write_GPR(rd, sp_val + sign_extend(imm)); \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_addw b/sail-impl/inst/64/rv_c/c_addw new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_and b/sail-impl/inst/64/rv_c/c_and new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_andi b/sail-impl/inst/64/rv_c/c_andi new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_beqz b/sail-impl/inst/64/rv_c/c_beqz new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_bnez b/sail-impl/inst/64/rv_c/c_bnez new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_ebreak b/sail-impl/inst/64/rv_c/c_ebreak new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_j b/sail-impl/inst/64/rv_c/c_j new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_jalr b/sail-impl/inst/64/rv_c/c_jalr new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_jr b/sail-impl/inst/64/rv_c/c_jr new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_ld b/sail-impl/inst/64/rv_c/c_ld new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_ldsp b/sail-impl/inst/64/rv_c/c_ldsp new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_li b/sail-impl/inst/64/rv_c/c_li new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_lui b/sail-impl/inst/64/rv_c/c_lui new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_lw b/sail-impl/inst/64/rv_c/c_lw new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_lwsp b/sail-impl/inst/64/rv_c/c_lwsp new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_mv b/sail-impl/inst/64/rv_c/c_mv new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_nop b/sail-impl/inst/64/rv_c/c_nop new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_or b/sail-impl/inst/64/rv_c/c_or new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_sd b/sail-impl/inst/64/rv_c/c_sd new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_sdsp b/sail-impl/inst/64/rv_c/c_sdsp new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_slli b/sail-impl/inst/64/rv_c/c_slli new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_srai b/sail-impl/inst/64/rv_c/c_srai new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_srli b/sail-impl/inst/64/rv_c/c_srli new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_sub b/sail-impl/inst/64/rv_c/c_sub new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_subw b/sail-impl/inst/64/rv_c/c_subw new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_sw b/sail-impl/inst/64/rv_c/c_sw new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/inst/64/rv_c/c_xor b/sail-impl/inst/64/rv_c/c_xor new file mode 100644 index 0000000..e69de29 diff --git a/sail-impl/sail-impl-meta.json b/sail-impl/sail-impl-meta.json index 70bd496..2ed5946 100644 --- a/sail-impl/sail-impl-meta.json +++ b/sail-impl/sail-impl-meta.json @@ -1,3 +1,3 @@ { - "march": "rv64i" + "march": "rv64ic" } diff --git a/sailcodegen/src/SailCodeGen.scala b/sailcodegen/src/SailCodeGen.scala index dc550e3..d354791 100644 --- a/sailcodegen/src/SailCodeGen.scala +++ b/sailcodegen/src/SailCodeGen.scala @@ -156,7 +156,16 @@ class SailCodeGenerator(params: SailCodeGeneratorParams) { case "jimm20lo" => s"bits(20)" case "imm20lo" => s"bits(20)" case "imm12lo" => s"bits(12)" - case "c_nzimm6lo" => s"bits(7)" + case "c_nzimm6lo" => s"bits(6)" + case "c_imm6lo" => s"bits(6)" + case "c_uimm7lo" => s"bits(5)" + case "c_nzimm18lo"=> s"bits(6)" + case "c_bimm9lo" => s"bits(8)" + case "c_uimm8splo"=> s"bits(6)" + case "c_nzimm10lo"=> s"bits(6)" + case "c_uimm8lo" => s"bits(5)" + case "c_nzuimm6lo"=> s"bits(6)" + case "c_uimm9splo"=> s"bits(6)" case _ => s"bits(${arg.lsb - arg.msb + 1})" } } else { @@ -180,12 +189,33 @@ class SailCodeGenerator(params: SailCodeGeneratorParams) { val argBits = arg.lsb - arg.msb + 1 val newAcc = acc :+ (arg.name match { - case "bimm12hi" => "imm7_6 : bits(1) @ imm7_5_0 : bits(6)" - case "bimm12lo" => "imm5_4_1 : bits(4) @ imm5_0 : bits(1)" - case "jimm20" => + case "bimm12hi" => "imm7_6 : bits(1) @ imm7_5_0 : bits(6)" + case "bimm12lo" => "imm5_4_1 : bits(4) @ imm5_0 : bits(1)" + case "jimm20" => "imm_19 : bits(1) @ imm_18_13 : bits(6) @ imm_12_9 : bits(4) @ imm_8 : bits(1) @ imm_7_0 : bits(8)" - case "imm12lo" => "imm12lo : bits(5)" - case "imm12hi" => "imm12hi : bits(7)" + case "imm12lo" => "imm12lo : bits(5)" + case "imm12hi" => "imm12hi : bits(7)" + case "c_nzimm6hi" => "nzi5 : bits(1)" + case "c_nzimm6lo" => "nzi40 : bits(5)" + case "c_nzuimm10" => "nz54 : bits(2) @ nz96 : bits(4) @ nz2 : bits(1) @ nz3 : bits(1)" + case "c_imm6hi" => "c_imm6hi : bits(1)" + case "c_imm6lo" => "c_imm6lo : bits(5)" + case "c_nzimm18hi" => "c_nzimm18hi : bits(1)" + case "c_nzimm18lo" => "c_nzimm18lo : bits(5)" + case "c_bimm9hi" => "i8 : bits(1) @ i43 : bits(2)" + case "c_bimm9lo" => "i76 : bits(2) @ i21 : bits(2) @ i5 : bits(1)" + case "c_uimm8sphi" => "ui5 : bits(1)" + case "c_uimm8splo" => "ui42 : bits(3) @ ui76 : bits(2)" + case "c_nzimm10hi" => "nzi9 : bits(1)" + case "c_nzimm10lo" => "nzi4 : bits(1) @ nzi6 : bits(1) @ nzi87 : bits(2) @ nzi5 : bits(1)" + case "c_uimm7hi" => "ui53 : bits(3)" + case "c_uimm7lo" => "ui2 : bits(1) @ ui6 : bits(1)" + case "c_nzuimm6hi" => "nzui5 : bits(1)" + case "c_nzuimm6lo" => "nzui40 : bits(5)" + case "c_uimm9sphi" => "ui5 : bits(1)" + case "c_uimm9splo" => "ui43 : bits(2) @ ui86 : bits(3)" + case "c_uimm8hi" => "ui53 : bits(3)" + case "c_uimm8lo" => "ui76 : bits(2)" case _ => arg.name }) @@ -221,7 +251,17 @@ class SailCodeGenerator(params: SailCodeGeneratorParams) { case "bimm12lo" => "imm7_6 @ imm5_0 @ imm7_5_0 @ imm5_4_1" case "jimm20" => "imm_19 @ imm_7_0 @ imm_8 @ imm_18_13 @ imm_12_9" case "imm12lo" => "imm12hi @ imm12lo" - case "c_nzimm6lo" => "nz96 @ nz54 @ nz3 @ nz2" + case "c_nzimm6lo" => "nzi5 @ nzi40" + case "c_nzuimm10" => "nz96 @ nz54 @ nz3 @ nz2" + case "c_imm6lo" => "c_imm6hi @ c_imm6lo" + case "c_nzimm18lo"=> "c_nzimm18hi @ c_nzimm18lo" + case "c_bimm9lo" => "i8 @ i76 @ i5 @ i43 @ i21" + case "c_uimm8splo"=> "ui76 @ ui5 @ ui42" + case "c_nzimm10lo"=> "nzi9 @ nzi87 @ nzi6 @ nzi5 @ nzi4" + case "c_uimm7lo" => "ui6 @ ui53 @ ui2" + case "c_nzuimm6lo"=> "nzui5 @ nzui40" + case "c_uimm9splo"=> "ui86 @ ui5 @ ui43" + case "c_uimm8lo" => "ui76 @ ui53" case _ => arg.toString } }) @@ -236,7 +276,6 @@ class SailCodeGenerator(params: SailCodeGeneratorParams) { case "bimm12lo" => "imm7_6 @ imm5_0 @ imm7_5_0 @ imm5_4_1" case "jimm20" => "imm_19 @ imm_7_0 @ imm_8 @ imm_18_13 @ imm_12_9" case "imm12lo" => "imm12hi @ imm12lo" - case "c_nzimm6lo" => "nz96 @ nz54 @ nz3 @ nz2" case _ => arg.toString } }) diff --git a/z3_problems b/z3_problems new file mode 100644 index 0000000..e69de29 From 3e854442447b76db86e907a582c404d336805fea Mon Sep 17 00:00:00 2001 From: Yui5427 <785369607@qq.com> Date: Fri, 16 May 2025 22:56:43 +0800 Subject: [PATCH 2/2] Add c ext --- sail-impl/inst/64/rv_c/c_add | 4 +++ sail-impl/inst/64/rv_c/c_addi | 9 +++-- sail-impl/inst/64/rv_c/c_addi16sp | 5 +++ sail-impl/inst/64/rv_c/c_addi4spn | 3 +- sail-impl/inst/64/rv_c/c_addiw | 3 +- sail-impl/inst/64/rv_c/c_addw | 6 ++++ sail-impl/inst/64/rv_c/c_and | 6 ++++ sail-impl/inst/64/rv_c/c_andi | 3 ++ sail-impl/inst/64/rv_c/c_beqz | 7 ++++ sail-impl/inst/64/rv_c/c_bnez | 7 ++++ sail-impl/inst/64/rv_c/c_ebreak | 58 +++++++++++++++++++++++++++++++ sail-impl/inst/64/rv_c/c_j | 3 ++ sail-impl/inst/64/rv_c/c_jalr | 4 +++ sail-impl/inst/64/rv_c/c_jr | 3 ++ sail-impl/inst/64/rv_c/c_ld | 5 +++ sail-impl/inst/64/rv_c/c_ldsp | 5 +++ sail-impl/inst/64/rv_c/c_li | 2 ++ sail-impl/inst/64/rv_c/c_lui | 3 ++ sail-impl/inst/64/rv_c/c_lw | 5 +++ sail-impl/inst/64/rv_c/c_lwsp | 4 +++ sail-impl/inst/64/rv_c/c_mv | 3 ++ sail-impl/inst/64/rv_c/c_nop | 1 + sail-impl/inst/64/rv_c/c_or | 6 ++++ sail-impl/inst/64/rv_c/c_sd | 4 +++ sail-impl/inst/64/rv_c/c_sdsp | 3 ++ sail-impl/inst/64/rv_c/c_slli | 2 ++ sail-impl/inst/64/rv_c/c_srai | 2 ++ sail-impl/inst/64/rv_c/c_srli | 2 ++ sail-impl/inst/64/rv_c/c_sub | 6 ++++ sail-impl/inst/64/rv_c/c_subw | 6 ++++ sail-impl/inst/64/rv_c/c_sw | 4 +++ sail-impl/inst/64/rv_c/c_xor | 6 ++++ sailcodegen/src/SailCodeGen.scala | 9 ++--- 33 files changed, 188 insertions(+), 11 deletions(-) diff --git a/sail-impl/inst/64/rv_c/c_add b/sail-impl/inst/64/rv_c/c_add index e69de29..6e903a5 100644 --- a/sail-impl/inst/64/rv_c/c_add +++ b/sail-impl/inst/64/rv_c/c_add @@ -0,0 +1,4 @@ +let rd_val = read_GPR(rd_rs1_n0); +let rs2_val = read_GPR(c_rs2_n0); +write_GPR(rd_rs1_n0, rd_val + rs2_val); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_addi b/sail-impl/inst/64/rv_c/c_addi index 563b771..371b58c 100644 --- a/sail-impl/inst/64/rv_c/c_addi +++ b/sail-impl/inst/64/rv_c/c_addi @@ -1,5 +1,4 @@ -let imm : bits(12) = (0b00 @ c_nzuimm10 @ 0b00); -let rd = creg2reg_idx(rd_p); -// 0b00010 represents sp -let sp_val = read_GPR(0b00010); -write_GPR(rd, sp_val + sign_extend(imm)); \ No newline at end of file +let imm : bits(12) = sign_extend(c_nzimm6); +let rsd_val = read_GPR(rd_rs1_n0); +write_GPR(rd_rs1_n0, rsd_val + sign_extend(imm)); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_addi16sp b/sail-impl/inst/64/rv_c/c_addi16sp index e69de29..5bbce25 100644 --- a/sail-impl/inst/64/rv_c/c_addi16sp +++ b/sail-impl/inst/64/rv_c/c_addi16sp @@ -0,0 +1,5 @@ +let imm : bits(12) = sign_extend(c_nzimm10lo @ 0x0); +// 0b00010 represents sp +let sp_val = read_GPR(0b00010); +write_GPR(0b00010, sp_val + sign_extend(imm)); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_addi4spn b/sail-impl/inst/64/rv_c/c_addi4spn index 563b771..9ba3193 100644 --- a/sail-impl/inst/64/rv_c/c_addi4spn +++ b/sail-impl/inst/64/rv_c/c_addi4spn @@ -2,4 +2,5 @@ let imm : bits(12) = (0b00 @ c_nzuimm10 @ 0b00); let rd = creg2reg_idx(rd_p); // 0b00010 represents sp let sp_val = read_GPR(0b00010); -write_GPR(rd, sp_val + sign_extend(imm)); \ No newline at end of file +write_GPR(rd, sp_val + sign_extend(imm)); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_addiw b/sail-impl/inst/64/rv_c/c_addiw index 978530e..4f5e0e3 100644 --- a/sail-impl/inst/64/rv_c/c_addiw +++ b/sail-impl/inst/64/rv_c/c_addiw @@ -2,4 +2,5 @@ let imm : bits(6) = c_nzuimm10; let rd = creg2reg_idx(rd_p); // 0b00010 represents sp let sp_val = read_GPR(0b00010); -write_GPR(rd, sp_val + sign_extend(imm)); \ No newline at end of file +write_GPR(rd, sp_val + sign_extend(imm)); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_addw b/sail-impl/inst/64/rv_c/c_addw index e69de29..f62b225 100644 --- a/sail-impl/inst/64/rv_c/c_addw +++ b/sail-impl/inst/64/rv_c/c_addw @@ -0,0 +1,6 @@ +let rsd = creg2reg_idx(rsd); +let rs2 = creg2reg_idx(rs2); +let rsd_val = read_GPR(rsd)[31..0]; +let rs2_val = read_GPR(rs2)[31..0]; +write_GPR(rsd, rs2_val + rsd_val); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_and b/sail-impl/inst/64/rv_c/c_and index e69de29..601a272 100644 --- a/sail-impl/inst/64/rv_c/c_and +++ b/sail-impl/inst/64/rv_c/c_and @@ -0,0 +1,6 @@ +let rsd = creg2reg_idx(rd_rs1_p); +let rs2 = creg2reg_idx(rs2_p); +let rsd_val = read_GPR(rsd); +let rs2_val = read_GPR(rs2); +write_GPR(rsd, rs2_val & rsd_val); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_andi b/sail-impl/inst/64/rv_c/c_andi index e69de29..38186df 100644 --- a/sail-impl/inst/64/rv_c/c_andi +++ b/sail-impl/inst/64/rv_c/c_andi @@ -0,0 +1,3 @@ +let rsd = creg2reg_idx(rd_rs1_p); +write_GPR(rsd, read_GPR(rsd) & sign_extend(c_imm6lo)); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_beqz b/sail-impl/inst/64/rv_c/c_beqz index e69de29..13975ad 100644 --- a/sail-impl/inst/64/rv_c/c_beqz +++ b/sail-impl/inst/64/rv_c/c_beqz @@ -0,0 +1,7 @@ +let rs = creg2reg_idx(rs1_p); +let rs_val = read_GPR(rs); +let taken : bool = rs_val == zero_extend(0b00); +if taken then { + let t : XLENBITS = PC + sign_extend(c_bimm9lo @ 0b0); + nextPC = t; +} \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_bnez b/sail-impl/inst/64/rv_c/c_bnez index e69de29..76410b7 100644 --- a/sail-impl/inst/64/rv_c/c_bnez +++ b/sail-impl/inst/64/rv_c/c_bnez @@ -0,0 +1,7 @@ +let rs = creg2reg_idx(rs1_p); +let rs_val = read_GPR(rs); +let taken : bool = rs_val != zero_extend(0b00); +if taken then { + let t : XLENBITS = PC + sign_extend(c_bimm9lo @ 0b0); + nextPC = t; +} \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_ebreak b/sail-impl/inst/64/rv_c/c_ebreak index e69de29..41a5385 100644 --- a/sail-impl/inst/64/rv_c/c_ebreak +++ b/sail-impl/inst/64/rv_c/c_ebreak @@ -0,0 +1,58 @@ +// deal with delegation +let idx = num_of_ExceptionType(E_Breakpoint()); +let super = bit_to_bool(medeleg.bits[idx]); +let deleg = if extensionEnabled(Ext_S) & super then Supervisor else Machine; + +let del_priv = if privLevel_to_bits(deleg) <_u privLevel_to_bits(cur_privilege) then cur_privilege else deleg; + +match (del_priv) { + Machine => { + mcause[IsInterrupt] = 0b0; + mcause[Cause] = zero_extend(exceptionType_to_bits(E_Breakpoint())); + + mstatus[MPIE] = mstatus[MIE]; + mstatus[MIE] = 0b0; + mstatus[MPP] = privLevel_to_bits(cur_privilege); + mtval.bits = PC; + mepc.bits = PC; + + cur_privilege = del_priv; + + let base : XLENBITS = mtvec[Base] @ 0b00; + nextPC = match (trapVectorMode_of_bits(mtvec[Mode])) { + TV_Direct => base, + TV_Vector => if mcause[IsInterrupt] == 0b1 + then (base + (zero_extend(mcause[Cause] << 2))) + else base, + TV_Reserved => internal_error("Invalid mtvec mode") + } + }, + Supervisor => { + assert(extensionEnabled(Ext_S), "no supervisor mode present for delegation"); + + scause[IsInterrupt] = 0b0; + scause[Cause] = zero_extend(exceptionType_to_bits(E_Breakpoint())); + + mstatus[SPIE] = mstatus[SIE]; + mstatus[SIE] = 0b0; + mstatus[SPP] = match cur_privilege { + User => 0b0, + Supervisor => 0b1, + Machine => internal_error("Invalid privilege for s-mode trap") + }; + stval.bits = PC; + sepc.bits = PC; + + cur_privilege = del_priv; + + let base : XLENBITS = stvec[Base] @ 0b00; + nextPC = match (trapVectorMode_of_bits(stvec[Mode])) { + TV_Direct => base, + TV_Vector => if scause[IsInterrupt] == 0b1 + then (base + (zero_extend(scause[Cause] << 2))) + else base, + TV_Reserved => internal_error("Invalid stvec mode") + } + }, + User => internal_error("Invalid privilege level") +} diff --git a/sail-impl/inst/64/rv_c/c_j b/sail-impl/inst/64/rv_c/c_j index e69de29..86a2fbd 100644 --- a/sail-impl/inst/64/rv_c/c_j +++ b/sail-impl/inst/64/rv_c/c_j @@ -0,0 +1,3 @@ +write_GPR(0b00000, nextPC); +let newPC : XLENBITS = sign_extend(c_imm12); +nextPC = [newPC with 0 = bitzero]; diff --git a/sail-impl/inst/64/rv_c/c_jalr b/sail-impl/inst/64/rv_c/c_jalr index e69de29..35cbca8 100644 --- a/sail-impl/inst/64/rv_c/c_jalr +++ b/sail-impl/inst/64/rv_c/c_jalr @@ -0,0 +1,4 @@ +let ra_val = read_GPR(0b00001); +write_GPR(0b00000, ra_val); +let newPC : XLENBITS = read_GPR(c_rs1_n0); +nextPC = [newPC with 0 = bitzero]; diff --git a/sail-impl/inst/64/rv_c/c_jr b/sail-impl/inst/64/rv_c/c_jr index e69de29..aff4a71 100644 --- a/sail-impl/inst/64/rv_c/c_jr +++ b/sail-impl/inst/64/rv_c/c_jr @@ -0,0 +1,3 @@ +write_GPR(0b00000, nextPC); +let newPC : XLENBITS = read_GPR(rs1_n0); +nextPC = [newPC with 0 = bitzero]; diff --git a/sail-impl/inst/64/rv_c/c_ld b/sail-impl/inst/64/rv_c/c_ld index e69de29..11e5f14 100644 --- a/sail-impl/inst/64/rv_c/c_ld +++ b/sail-impl/inst/64/rv_c/c_ld @@ -0,0 +1,5 @@ +let imm : bits(12) = zero_extend(uimm @ 0b000); +let rd = creg2reg_idx(rdc); +let rs = creg2reg_idx(rsc); +write_GPR(rd, readmem(read_GPR(rs) + sign_extend(imm), satp.bits)[15..0]); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_ldsp b/sail-impl/inst/64/rv_c/c_ldsp index e69de29..6683fd5 100644 --- a/sail-impl/inst/64/rv_c/c_ldsp +++ b/sail-impl/inst/64/rv_c/c_ldsp @@ -0,0 +1,5 @@ +let imm : bits(12) = zero_extend(uimm @ 0b000); +let rd = creg2reg_idx(rdc); +// 0b00010 represents sp +write_GPR(rd, readmem(read_GPR(0b00010) + sign_extend(imm), satp.bits)[15..0]); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_li b/sail-impl/inst/64/rv_c/c_li index e69de29..c8a8365 100644 --- a/sail-impl/inst/64/rv_c/c_li +++ b/sail-impl/inst/64/rv_c/c_li @@ -0,0 +1,2 @@ +write_GPR(rd_n0, sign_extend(c_imm6lo)); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_lui b/sail-impl/inst/64/rv_c/c_lui index e69de29..6cc9e08 100644 --- a/sail-impl/inst/64/rv_c/c_lui +++ b/sail-impl/inst/64/rv_c/c_lui @@ -0,0 +1,3 @@ +let off : XLENBITS = sign_extend(c_nzimm18lo @ 0x000); +write_GPR(rd_n2, off); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_lw b/sail-impl/inst/64/rv_c/c_lw index e69de29..5526e01 100644 --- a/sail-impl/inst/64/rv_c/c_lw +++ b/sail-impl/inst/64/rv_c/c_lw @@ -0,0 +1,5 @@ +let imm : bits(12) = zero_extend(c_uimm7lo @ 0b00); +let rs = creg2reg_idx(rs1_p); +let rd = creg2reg_idx(rd_p); +write_GPR(rd, sign_extend(readmem(read_GPR(rs) + sign_extend(imm), satp.bits)[31..0])); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_lwsp b/sail-impl/inst/64/rv_c/c_lwsp index e69de29..94f9a02 100644 --- a/sail-impl/inst/64/rv_c/c_lwsp +++ b/sail-impl/inst/64/rv_c/c_lwsp @@ -0,0 +1,4 @@ +let imm : bits(12) = zero_extend(c_uimm8splo @ 0b000); +// 0b00010 represents sp +write_GPR(rd_n0, sign_extend(readmem(read_GPR(0b00010) + sign_extend(imm), satp.bits)[31..0])); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_mv b/sail-impl/inst/64/rv_c/c_mv index e69de29..db5c2b8 100644 --- a/sail-impl/inst/64/rv_c/c_mv +++ b/sail-impl/inst/64/rv_c/c_mv @@ -0,0 +1,3 @@ +let rs2_val = read_GPR(c_rs2_n0); +write_GPR(rd_n0, rs2_val); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_nop b/sail-impl/inst/64/rv_c/c_nop index e69de29..2ce53a6 100644 --- a/sail-impl/inst/64/rv_c/c_nop +++ b/sail-impl/inst/64/rv_c/c_nop @@ -0,0 +1 @@ +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_or b/sail-impl/inst/64/rv_c/c_or index e69de29..7b600bb 100644 --- a/sail-impl/inst/64/rv_c/c_or +++ b/sail-impl/inst/64/rv_c/c_or @@ -0,0 +1,6 @@ +let rsd = creg2reg_idx(rd_rs1_p); +let rs2 = creg2reg_idx(rs2_p); +let rsd_val = read_GPR(rsd); +let rs2_val = read_GPR(rs2); +write_GPR(rsd, rs2_val | rsd_val); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_sd b/sail-impl/inst/64/rv_c/c_sd index e69de29..7ab3911 100644 --- a/sail-impl/inst/64/rv_c/c_sd +++ b/sail-impl/inst/64/rv_c/c_sd @@ -0,0 +1,4 @@ +let imm : bits(12) = zero_extend(uimm @ 0b000); +let rs1 = creg2reg_idx(rsc1); +let rs2 = creg2reg_idx(rsc2); +writemem(read_GPR(rs1) + sign_extend(imm), read_GPR(rs2), satp.bits); \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_sdsp b/sail-impl/inst/64/rv_c/c_sdsp index e69de29..ee07dae 100644 --- a/sail-impl/inst/64/rv_c/c_sdsp +++ b/sail-impl/inst/64/rv_c/c_sdsp @@ -0,0 +1,3 @@ +let imm : bits(12) = zero_extend(uimm @ 0b000); +let sp = creg2reg_idx(rsc2); +writemem(read_GPR(sp) + sign_extend(imm), read_GPR(rs2), satp.bits); \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_slli b/sail-impl/inst/64/rv_c/c_slli index e69de29..3e48dce 100644 --- a/sail-impl/inst/64/rv_c/c_slli +++ b/sail-impl/inst/64/rv_c/c_slli @@ -0,0 +1,2 @@ +write_GPR(rd, read_GPR(rd) << uimm); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_srai b/sail-impl/inst/64/rv_c/c_srai index e69de29..d1d80f5 100644 --- a/sail-impl/inst/64/rv_c/c_srai +++ b/sail-impl/inst/64/rv_c/c_srai @@ -0,0 +1,2 @@ +write_GPR(rd, shift_bits_right_arith(X(rs1), shamt)); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_srli b/sail-impl/inst/64/rv_c/c_srli index e69de29..66c1cfe 100644 --- a/sail-impl/inst/64/rv_c/c_srli +++ b/sail-impl/inst/64/rv_c/c_srli @@ -0,0 +1,2 @@ +write_GPR(rd, read_GPR(rd) >> uimm); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_sub b/sail-impl/inst/64/rv_c/c_sub index e69de29..db1cb22 100644 --- a/sail-impl/inst/64/rv_c/c_sub +++ b/sail-impl/inst/64/rv_c/c_sub @@ -0,0 +1,6 @@ +let rsd = creg2reg_idx(rd_rs1_p); +let rs2 = creg2reg_idx(rs2_p); +let rsd_val = read_GPR(rsd); +let rs2_val = read_GPR(rs2); +write_GPR(rsd, rs2_val - rsd_val); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_subw b/sail-impl/inst/64/rv_c/c_subw index e69de29..030710b 100644 --- a/sail-impl/inst/64/rv_c/c_subw +++ b/sail-impl/inst/64/rv_c/c_subw @@ -0,0 +1,6 @@ +let rsd = creg2reg_idx(rsd); +let rs2 = creg2reg_idx(rs2); +let rsd_val = read_GPR(rsd)[31..0]; +let rs2_val = read_GPR(rs2)[31..0]; +write_GPR(rsd, sign_extend(rs2_val - rsd_val)); +nextPC = PC + 4; \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_sw b/sail-impl/inst/64/rv_c/c_sw index e69de29..816595e 100644 --- a/sail-impl/inst/64/rv_c/c_sw +++ b/sail-impl/inst/64/rv_c/c_sw @@ -0,0 +1,4 @@ +let imm : bits(12) = zero_extend(c_uimm7lo @ 0b000); +let rs1 = creg2reg_idx(rs1_p); +let rs2 = creg2reg_idx(rs2_p); +writemem(read_GPR(rs1) + sign_extend(imm), read_GPR(rs2), zero_extend(0b10), satp.bits); \ No newline at end of file diff --git a/sail-impl/inst/64/rv_c/c_xor b/sail-impl/inst/64/rv_c/c_xor index e69de29..154dbb8 100644 --- a/sail-impl/inst/64/rv_c/c_xor +++ b/sail-impl/inst/64/rv_c/c_xor @@ -0,0 +1,6 @@ +let rd = creg2reg_idx(rd_rs1_p); +let rs2 = creg2reg_idx(rs2_p); +let rd_val = read_GPR(rd); +let rs2_val = read_GPR(rs2); +write_GPR(rd, rd_val ^ rs2_val); +nextPC = PC + 4; \ No newline at end of file diff --git a/sailcodegen/src/SailCodeGen.scala b/sailcodegen/src/SailCodeGen.scala index d354791..259e5b4 100644 --- a/sailcodegen/src/SailCodeGen.scala +++ b/sailcodegen/src/SailCodeGen.scala @@ -296,10 +296,11 @@ class SailCodeGenerator(params: SailCodeGeneratorParams) { .filter(arg => !arg.toString.contains("hi")) .map(arg => { arg.name match { - case "bimm12lo" => arg.toString.stripSuffix("lo") - case "jimm20lo" => arg.toString.stripSuffix("lo") - case "imm12lo" => arg.toString.stripSuffix("lo") - case _ => arg.toString + case "bimm12lo" => arg.toString.stripSuffix("lo") + case "jimm20lo" => arg.toString.stripSuffix("lo") + case "imm12lo" => arg.toString.stripSuffix("lo") + case "c_nzimm6lo" => arg.toString.stripSuffix("lo") + case _ => arg.toString } }) .mkString(", ") + ")) = {" + os.read(path).split('\n').map(line => "\n\t" + line).mkString + "\n" + "}"