Skip to content

Commit 2e8cf99

Browse files
committed
wip
1 parent d4f9e0e commit 2e8cf99

9 files changed

+4613
-26
lines changed

src/decode.c

+20-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <stdlib.h>
88

99
#include "decode.h"
10+
#include "encoding.h"
1011
#include "riscv_private.h"
1112

1213
/* decode rd field
@@ -2138,7 +2139,7 @@ static inline bool op_mvx(rv_insn_t *ir, const uint32_t insn) {}
21382139
static inline bool op_v(rv_insn_t *ir, const uint32_t insn)
21392140
{
21402141
uint32_t funct3_mask = 0x7000;
2141-
switch (insn & funct3_mask) {
2142+
switch ((insn & funct3_mask) >> 7) {
21422143
case 0:
21432144
return op_ivv(ir, insn);
21442145
case 1:
@@ -2156,6 +2157,24 @@ static inline bool op_v(rv_insn_t *ir, const uint32_t insn)
21562157
default:
21572158
return false;
21582159
}
2160+
2161+
if ((insn & MASK_VSETVLI) == MATCH_VSETVLI) {
2162+
// vsetvli
2163+
ir->rd = (insn >> 7) & 0x1f;
2164+
ir->rs1 = (insn >> 15) & 0x1f;
2165+
ir->zimm = (insn >> 20) & 0x7ff;
2166+
} else if ((insn & MASK_VSETIVLI) == MATCH_VSETIVLI) {
2167+
// vsetivli
2168+
ir->rd = (insn >> 7) & 0x1f;
2169+
ir->uimm = (insn >> 15) & 0x1f;
2170+
ir->zimm = (insn >> 20) & 0x3ff; // zimm[9:0]
2171+
2172+
} else if ((insn & MASK_VSETVL) == MATCH_VSETVL) {
2173+
// vsetvl
2174+
ir->rd = (insn >> 7) & 0x1f;
2175+
ir->rs1 = (insn >> 15) & 0x1f;
2176+
ir->rs2 = (insn >> 20) & 0x1f;
2177+
}
21592178
}
21602179

21612180
/* handler for all unimplemented opcodes */

src/decode.h

+2
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,8 @@ typedef struct rv_insn {
388388

389389
#if RV32_HAS(EXT_RVV)
390390
uint8_t vm;
391+
uint8_t zimm;
392+
uint8_t uimm;
391393
#endif
392394
/* fuse operation */
393395
int32_t imm2;

0 commit comments

Comments
 (0)