manually add svsetvl instruction
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 28 Sep 2018 07:42:48 +0000 (08:42 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 28 Sep 2018 07:42:48 +0000 (08:42 +0100)
riscv/encoding.h
riscv/insns/svsetvl.h [new file with mode: 0644]
riscv/riscv.mk.in

index 9dcb0e6eedb81bc9e143d26188a513116fdf70d8..12c7ce142f29109dce5f5116e7668f9266d3f159 100644 (file)
 #define MASK_SW  0x707f
 #define MATCH_SD 0x3023
 #define MASK_SD  0x707f
+#define MATCH_SVSETVL 0x4023
+#define MASK_SVSETVL  0x707f
 #define MATCH_FENCE 0xf
 #define MASK_FENCE  0x707f
 #define MATCH_FENCE_I 0x100f
@@ -1026,6 +1028,7 @@ DECLARE_INSN(sb, MATCH_SB, MASK_SB)
 DECLARE_INSN(sh, MATCH_SH, MASK_SH)
 DECLARE_INSN(sw, MATCH_SW, MASK_SW)
 DECLARE_INSN(sd, MATCH_SD, MASK_SD)
+DECLARE_INSN(svsetvl, MATCH_SVSETVL, MASK_SVSETVL)
 DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE)
 DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I)
 DECLARE_INSN(mul, MATCH_MUL, MASK_MUL)
diff --git a/riscv/insns/svsetvl.h b/riscv/insns/svsetvl.h
new file mode 100644 (file)
index 0000000..9517f18
--- /dev/null
@@ -0,0 +1,4 @@
+p->get_state()->vl = std::min((uint64_t)63,
+                     std::min((uint64_t)insn.i_imm(),
+                              RS1));
+WRITE_RD(p->get_state()->vl);
index 045d58ab88e620b7f2c8e695c6d9e03e5591e26f..7e1a2a898d4a3a3767e9b7121040bfef2e3c22df 100644 (file)
@@ -287,6 +287,7 @@ riscv_insn_list = \
        srlw \
        sub \
        subw \
+       svsetvl \
        sw \
        wfi \
        xor \