1
From: Alistair Francis <alistair.francis@wdc.com>
1
From: Alistair Francis <alistair.francis@wdc.com>
2
2
3
The following changes since commit c5fbdd60cf1fb52f01bdfe342b6fa65d5343e1b1:
3
The following changes since commit 2ba341b3694cf3cff7b8a1df4cc765900d5c4f60:
4
4
5
Merge tag 'qemu-sparc-20211121' of git://github.com/mcayland/qemu into staging (2021-11-21 14:12:25 +0100)
5
Merge tag 'kraxel-20221013-pull-request' of https://gitlab.com/kraxel/qemu into staging (2022-10-13 13:55:53 -0400)
6
6
7
are available in the Git repository at:
7
are available in the Git repository at:
8
8
9
git@github.com:alistair23/qemu.git tags/pull-riscv-to-apply-20211122
9
https://github.com/alistair23/qemu.git tags/pull-riscv-to-apply-20221014
10
10
11
for you to fetch changes up to 526e7443027c71fe7b04c29df529e1f9f425f9e3:
11
for you to fetch changes up to 47566421f029b0a489b63f8195b3ff944e017056:
12
12
13
hw/misc/sifive_u_otp: Do not reset OTP content on hardware reset (2021-11-22 10:46:22 +1000)
13
target/riscv: pmp: Fixup TLB size calculation (2022-10-14 14:36:19 +1000)
14
14
15
----------------------------------------------------------------
15
----------------------------------------------------------------
16
Seventh RISC-V PR for QEMU 6.2
16
Third RISC-V PR for QEMU 7.2
17
17
18
- Deprecate IF_NONE for SiFive OTP
18
* Update qtest comment
19
- Don't reset SiFive OTP content
19
* Fix coverity issue with Ibex SPI
20
* Move load_image_to_fw_cfg() to common location
21
* Enable booting S-mode firmware from pflash on virt machine
22
* Add disas support for vector instructions
23
* Priority level fixes for PLIC
24
* Fixup TLB size calculation when using PMP
20
25
21
----------------------------------------------------------------
26
----------------------------------------------------------------
22
Philippe Mathieu-Daudé (1):
27
Alistair Francis (1):
23
hw/misc/sifive_u_otp: Do not reset OTP content on hardware reset
28
target/riscv: pmp: Fixup TLB size calculation
24
29
25
Thomas Huth (1):
30
Bin Meng (1):
26
hw/misc/sifive_u_otp: Use IF_PFLASH for the OTP device instead of IF_NONE
31
hw/riscv: Update comment for qtest check in riscv_find_firmware()
27
32
28
docs/about/deprecated.rst | 6 ++++++
33
Jim Shu (2):
29
hw/misc/sifive_u_otp.c | 22 +++++++++++++---------
34
hw/intc: sifive_plic: fix hard-coded max priority level
30
2 files changed, 19 insertions(+), 9 deletions(-)
35
hw/intc: sifive_plic: change interrupt priority register to WARL field
31
36
37
Sunil V L (3):
38
hw/arm, loongarch: Move load_image_to_fw_cfg() to common location
39
hw/riscv: virt: Move create_fw_cfg() prior to loading kernel
40
hw/riscv: virt: Enable booting S-mode firmware from pflash
41
42
Wilfred Mallawa (2):
43
hw/ssi: ibex_spi: fixup coverity issue
44
hw/ssi: ibex_spi: fixup/add rw1c functionality
45
46
Yang Liu (1):
47
disas/riscv.c: rvv: Add disas support for vector instructions
48
49
include/hw/nvram/fw_cfg.h | 21 +
50
include/hw/riscv/boot.h | 1 +
51
include/hw/ssi/ibex_spi_host.h | 4 +-
52
disas/riscv.c | 1432 +++++++++++++++++++++++++++++++++++++++-
53
hw/arm/boot.c | 49 --
54
hw/intc/sifive_plic.c | 25 +-
55
hw/loongarch/virt.c | 33 -
56
hw/nvram/fw_cfg.c | 32 +
57
hw/riscv/boot.c | 33 +-
58
hw/riscv/virt.c | 32 +-
59
hw/ssi/ibex_spi_host.c | 166 +++--
60
target/riscv/pmp.c | 12 +
61
12 files changed, 1675 insertions(+), 165 deletions(-)
diff view generated by jsdifflib
New patch
1
From: Bin Meng <bmeng.cn@gmail.com>
1
2
3
Since commit 4211fc553234 ("roms/opensbi: Remove ELF images"), the
4
comment for qtest check in riscv_find_firmware() is out of date.
5
Update it to reflect the latest status.
6
7
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <BN7PR08MB435525C92550BAC5467BE672BF219@BN7PR08MB4355.namprd08.prod.outlook.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
hw/riscv/boot.c | 4 ++--
13
1 file changed, 2 insertions(+), 2 deletions(-)
14
15
diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/riscv/boot.c
18
+++ b/hw/riscv/boot.c
19
@@ -XXX,XX +XXX,XX @@ char *riscv_find_firmware(const char *firmware_filename)
20
if (filename == NULL) {
21
if (!qtest_enabled()) {
22
/*
23
- * We only ship plain binary bios images in the QEMU source.
24
- * With Spike machine that uses ELF images as the default bios,
25
+ * We only ship OpenSBI binary bios images in the QEMU source.
26
+ * For machines that use images other than the default bios,
27
* running QEMU test will complain hence let's suppress the error
28
* report for QEMU testing.
29
*/
30
--
31
2.37.3
diff view generated by jsdifflib
New patch
1
1
From: Wilfred Mallawa <wilfred.mallawa@wdc.com>
2
3
This patch addresses the coverity issues specified in [1],
4
as suggested, `FIELD_DP32()`/`FIELD_EX32()` macros have been
5
implemented to clean up the code.
6
7
[1] https://www.mail-archive.com/qemu-devel@nongnu.org/msg887713.html
8
9
Fixes: Coverity CID 1488107
10
11
Signed-off-by: Wilfred Mallawa <wilfred.mallawa@wdc.com>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
14
Message-Id: <20220930033241.206581-2-wilfred.mallawa@opensource.wdc.com>
15
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
---
17
hw/ssi/ibex_spi_host.c | 132 +++++++++++++++++++++--------------------
18
1 file changed, 68 insertions(+), 64 deletions(-)
19
20
diff --git a/hw/ssi/ibex_spi_host.c b/hw/ssi/ibex_spi_host.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/ssi/ibex_spi_host.c
23
+++ b/hw/ssi/ibex_spi_host.c
24
@@ -XXX,XX +XXX,XX @@ static inline uint8_t div4_round_up(uint8_t dividend)
25
26
static void ibex_spi_rxfifo_reset(IbexSPIHostState *s)
27
{
28
+ uint32_t data = s->regs[IBEX_SPI_HOST_STATUS];
29
/* Empty the RX FIFO and assert RXEMPTY */
30
fifo8_reset(&s->rx_fifo);
31
- s->regs[IBEX_SPI_HOST_STATUS] &= ~R_STATUS_RXFULL_MASK;
32
- s->regs[IBEX_SPI_HOST_STATUS] |= R_STATUS_RXEMPTY_MASK;
33
+ data = FIELD_DP32(data, STATUS, RXFULL, 0);
34
+ data = FIELD_DP32(data, STATUS, RXEMPTY, 1);
35
+ s->regs[IBEX_SPI_HOST_STATUS] = data;
36
}
37
38
static void ibex_spi_txfifo_reset(IbexSPIHostState *s)
39
{
40
+ uint32_t data = s->regs[IBEX_SPI_HOST_STATUS];
41
/* Empty the TX FIFO and assert TXEMPTY */
42
fifo8_reset(&s->tx_fifo);
43
- s->regs[IBEX_SPI_HOST_STATUS] &= ~R_STATUS_TXFULL_MASK;
44
- s->regs[IBEX_SPI_HOST_STATUS] |= R_STATUS_TXEMPTY_MASK;
45
+ data = FIELD_DP32(data, STATUS, TXFULL, 0);
46
+ data = FIELD_DP32(data, STATUS, TXEMPTY, 1);
47
+ s->regs[IBEX_SPI_HOST_STATUS] = data;
48
}
49
50
static void ibex_spi_host_reset(DeviceState *dev)
51
@@ -XXX,XX +XXX,XX @@ static void ibex_spi_host_reset(DeviceState *dev)
52
*/
53
static void ibex_spi_host_irq(IbexSPIHostState *s)
54
{
55
- bool error_en = s->regs[IBEX_SPI_HOST_INTR_ENABLE]
56
- & R_INTR_ENABLE_ERROR_MASK;
57
- bool event_en = s->regs[IBEX_SPI_HOST_INTR_ENABLE]
58
- & R_INTR_ENABLE_SPI_EVENT_MASK;
59
- bool err_pending = s->regs[IBEX_SPI_HOST_INTR_STATE]
60
- & R_INTR_STATE_ERROR_MASK;
61
- bool status_pending = s->regs[IBEX_SPI_HOST_INTR_STATE]
62
- & R_INTR_STATE_SPI_EVENT_MASK;
63
+ uint32_t intr_test_reg = s->regs[IBEX_SPI_HOST_INTR_TEST];
64
+ uint32_t intr_en_reg = s->regs[IBEX_SPI_HOST_INTR_ENABLE];
65
+ uint32_t intr_state_reg = s->regs[IBEX_SPI_HOST_INTR_STATE];
66
+
67
+ uint32_t err_en_reg = s->regs[IBEX_SPI_HOST_ERROR_ENABLE];
68
+ uint32_t event_en_reg = s->regs[IBEX_SPI_HOST_EVENT_ENABLE];
69
+ uint32_t err_status_reg = s->regs[IBEX_SPI_HOST_ERROR_STATUS];
70
+ uint32_t status_reg = s->regs[IBEX_SPI_HOST_STATUS];
71
+
72
+
73
+ bool error_en = FIELD_EX32(intr_en_reg, INTR_ENABLE, ERROR);
74
+ bool event_en = FIELD_EX32(intr_en_reg, INTR_ENABLE, SPI_EVENT);
75
+ bool err_pending = FIELD_EX32(intr_state_reg, INTR_STATE, ERROR);
76
+ bool status_pending = FIELD_EX32(intr_state_reg, INTR_STATE, SPI_EVENT);
77
+
78
int err_irq = 0, event_irq = 0;
79
80
/* Error IRQ enabled and Error IRQ Cleared */
81
if (error_en && !err_pending) {
82
/* Event enabled, Interrupt Test Error */
83
- if (s->regs[IBEX_SPI_HOST_INTR_TEST] & R_INTR_TEST_ERROR_MASK) {
84
+ if (FIELD_EX32(intr_test_reg, INTR_TEST, ERROR)) {
85
err_irq = 1;
86
- } else if ((s->regs[IBEX_SPI_HOST_ERROR_ENABLE]
87
- & R_ERROR_ENABLE_CMDBUSY_MASK) &&
88
- s->regs[IBEX_SPI_HOST_ERROR_STATUS]
89
- & R_ERROR_STATUS_CMDBUSY_MASK) {
90
+ } else if (FIELD_EX32(err_en_reg, ERROR_ENABLE, CMDBUSY) &&
91
+ FIELD_EX32(err_status_reg, ERROR_STATUS, CMDBUSY)) {
92
/* Wrote to COMMAND when not READY */
93
err_irq = 1;
94
- } else if ((s->regs[IBEX_SPI_HOST_ERROR_ENABLE]
95
- & R_ERROR_ENABLE_CMDINVAL_MASK) &&
96
- s->regs[IBEX_SPI_HOST_ERROR_STATUS]
97
- & R_ERROR_STATUS_CMDINVAL_MASK) {
98
+ } else if (FIELD_EX32(err_en_reg, ERROR_ENABLE, CMDINVAL) &&
99
+ FIELD_EX32(err_status_reg, ERROR_STATUS, CMDINVAL)) {
100
/* Invalid command segment */
101
err_irq = 1;
102
- } else if ((s->regs[IBEX_SPI_HOST_ERROR_ENABLE]
103
- & R_ERROR_ENABLE_CSIDINVAL_MASK) &&
104
- s->regs[IBEX_SPI_HOST_ERROR_STATUS]
105
- & R_ERROR_STATUS_CSIDINVAL_MASK) {
106
+ } else if (FIELD_EX32(err_en_reg, ERROR_ENABLE, CSIDINVAL) &&
107
+ FIELD_EX32(err_status_reg, ERROR_STATUS, CSIDINVAL)) {
108
/* Invalid value for CSID */
109
err_irq = 1;
110
}
111
@@ -XXX,XX +XXX,XX @@ static void ibex_spi_host_irq(IbexSPIHostState *s)
112
113
/* Event IRQ Enabled and Event IRQ Cleared */
114
if (event_en && !status_pending) {
115
- if (s->regs[IBEX_SPI_HOST_INTR_TEST] & R_INTR_TEST_SPI_EVENT_MASK) {
116
+ if (FIELD_EX32(intr_test_reg, INTR_STATE, SPI_EVENT)) {
117
/* Event enabled, Interrupt Test Event */
118
event_irq = 1;
119
- } else if ((s->regs[IBEX_SPI_HOST_EVENT_ENABLE]
120
- & R_EVENT_ENABLE_READY_MASK) &&
121
- (s->regs[IBEX_SPI_HOST_STATUS] & R_STATUS_READY_MASK)) {
122
+ } else if (FIELD_EX32(event_en_reg, EVENT_ENABLE, READY) &&
123
+ FIELD_EX32(status_reg, STATUS, READY)) {
124
/* SPI Host ready for next command */
125
event_irq = 1;
126
- } else if ((s->regs[IBEX_SPI_HOST_EVENT_ENABLE]
127
- & R_EVENT_ENABLE_TXEMPTY_MASK) &&
128
- (s->regs[IBEX_SPI_HOST_STATUS] & R_STATUS_TXEMPTY_MASK)) {
129
+ } else if (FIELD_EX32(event_en_reg, EVENT_ENABLE, TXEMPTY) &&
130
+ FIELD_EX32(status_reg, STATUS, TXEMPTY)) {
131
/* SPI TXEMPTY, TXFIFO drained */
132
event_irq = 1;
133
- } else if ((s->regs[IBEX_SPI_HOST_EVENT_ENABLE]
134
- & R_EVENT_ENABLE_RXFULL_MASK) &&
135
- (s->regs[IBEX_SPI_HOST_STATUS] & R_STATUS_RXFULL_MASK)) {
136
+ } else if (FIELD_EX32(event_en_reg, EVENT_ENABLE, RXFULL) &&
137
+ FIELD_EX32(status_reg, STATUS, RXFULL)) {
138
/* SPI RXFULL, RXFIFO full */
139
event_irq = 1;
140
}
141
@@ -XXX,XX +XXX,XX @@ static void ibex_spi_host_irq(IbexSPIHostState *s)
142
143
static void ibex_spi_host_transfer(IbexSPIHostState *s)
144
{
145
- uint32_t rx, tx;
146
+ uint32_t rx, tx, data;
147
/* Get num of one byte transfers */
148
- uint8_t segment_len = ((s->regs[IBEX_SPI_HOST_COMMAND] & R_COMMAND_LEN_MASK)
149
- >> R_COMMAND_LEN_SHIFT);
150
+ uint8_t segment_len = FIELD_EX32(s->regs[IBEX_SPI_HOST_COMMAND],
151
+ COMMAND, LEN);
152
+
153
while (segment_len > 0) {
154
if (fifo8_is_empty(&s->tx_fifo)) {
155
/* Assert Stall */
156
@@ -XXX,XX +XXX,XX @@ static void ibex_spi_host_transfer(IbexSPIHostState *s)
157
--segment_len;
158
}
159
160
+ data = s->regs[IBEX_SPI_HOST_STATUS];
161
/* Assert Ready */
162
- s->regs[IBEX_SPI_HOST_STATUS] |= R_STATUS_READY_MASK;
163
+ data = FIELD_DP32(data, STATUS, READY, 1);
164
/* Set RXQD */
165
- s->regs[IBEX_SPI_HOST_STATUS] &= ~R_STATUS_RXQD_MASK;
166
- s->regs[IBEX_SPI_HOST_STATUS] |= (R_STATUS_RXQD_MASK
167
- & div4_round_up(segment_len));
168
+ data = FIELD_DP32(data, STATUS, RXQD, div4_round_up(segment_len));
169
/* Set TXQD */
170
- s->regs[IBEX_SPI_HOST_STATUS] &= ~R_STATUS_TXQD_MASK;
171
- s->regs[IBEX_SPI_HOST_STATUS] |= (fifo8_num_used(&s->tx_fifo) / 4)
172
- & R_STATUS_TXQD_MASK;
173
+ data = FIELD_DP32(data, STATUS, TXQD, fifo8_num_used(&s->tx_fifo) / 4);
174
/* Clear TXFULL */
175
- s->regs[IBEX_SPI_HOST_STATUS] &= ~R_STATUS_TXFULL_MASK;
176
- /* Assert TXEMPTY and drop remaining bytes that exceed segment_len */
177
- ibex_spi_txfifo_reset(s);
178
+ data = FIELD_DP32(data, STATUS, TXFULL, 0);
179
/* Reset RXEMPTY */
180
- s->regs[IBEX_SPI_HOST_STATUS] &= ~R_STATUS_RXEMPTY_MASK;
181
+ data = FIELD_DP32(data, STATUS, RXEMPTY, 0);
182
+ /* Update register status */
183
+ s->regs[IBEX_SPI_HOST_STATUS] = data;
184
+ /* Drop remaining bytes that exceed segment_len */
185
+ ibex_spi_txfifo_reset(s);
186
187
ibex_spi_host_irq(s);
188
}
189
@@ -XXX,XX +XXX,XX @@ static void ibex_spi_host_write(void *opaque, hwaddr addr,
190
{
191
IbexSPIHostState *s = opaque;
192
uint32_t val32 = val64;
193
- uint32_t shift_mask = 0xff;
194
+ uint32_t shift_mask = 0xff, status = 0;
195
uint8_t txqd_len;
196
197
trace_ibex_spi_host_write(addr, size, val64);
198
@@ -XXX,XX +XXX,XX @@ static void ibex_spi_host_write(void *opaque, hwaddr addr,
199
s->regs[addr] = val32;
200
201
/* STALL, IP not enabled */
202
- if (!(s->regs[IBEX_SPI_HOST_CONTROL] & R_CONTROL_SPIEN_MASK)) {
203
+ if (!(FIELD_EX32(s->regs[IBEX_SPI_HOST_CONTROL],
204
+ CONTROL, SPIEN))) {
205
return;
206
}
207
208
/* SPI not ready, IRQ Error */
209
- if (!(s->regs[IBEX_SPI_HOST_STATUS] & R_STATUS_READY_MASK)) {
210
+ if (!(FIELD_EX32(s->regs[IBEX_SPI_HOST_STATUS],
211
+ STATUS, READY))) {
212
s->regs[IBEX_SPI_HOST_ERROR_STATUS] |= R_ERROR_STATUS_CMDBUSY_MASK;
213
ibex_spi_host_irq(s);
214
return;
215
}
216
+
217
/* Assert Not Ready */
218
s->regs[IBEX_SPI_HOST_STATUS] &= ~R_STATUS_READY_MASK;
219
220
- if (((val32 & R_COMMAND_DIRECTION_MASK) >> R_COMMAND_DIRECTION_SHIFT)
221
- != BIDIRECTIONAL_TRANSFER) {
222
- qemu_log_mask(LOG_UNIMP,
223
+ if (FIELD_EX32(val32, COMMAND, DIRECTION) != BIDIRECTIONAL_TRANSFER) {
224
+ qemu_log_mask(LOG_UNIMP,
225
"%s: Rx Only/Tx Only are not supported\n", __func__);
226
}
227
228
@@ -XXX,XX +XXX,XX @@ static void ibex_spi_host_write(void *opaque, hwaddr addr,
229
return;
230
}
231
/* Byte ordering is set by the IP */
232
- if ((s->regs[IBEX_SPI_HOST_STATUS] &
233
- R_STATUS_BYTEORDER_MASK) == 0) {
234
+ status = s->regs[IBEX_SPI_HOST_STATUS];
235
+ if (FIELD_EX32(status, STATUS, BYTEORDER) == 0) {
236
/* LE: LSB transmitted first (default for ibex processor) */
237
shift_mask = 0xff << (i * 8);
238
} else {
239
@@ -XXX,XX +XXX,XX @@ static void ibex_spi_host_write(void *opaque, hwaddr addr,
240
241
fifo8_push(&s->tx_fifo, (val32 & shift_mask) >> (i * 8));
242
}
243
-
244
+ status = s->regs[IBEX_SPI_HOST_STATUS];
245
/* Reset TXEMPTY */
246
- s->regs[IBEX_SPI_HOST_STATUS] &= ~R_STATUS_TXEMPTY_MASK;
247
+ status = FIELD_DP32(status, STATUS, TXEMPTY, 0);
248
/* Update TXQD */
249
- txqd_len = (s->regs[IBEX_SPI_HOST_STATUS] &
250
- R_STATUS_TXQD_MASK) >> R_STATUS_TXQD_SHIFT;
251
+ txqd_len = FIELD_EX32(status, STATUS, TXQD);
252
/* Partial bytes (size < 4) are padded, in words. */
253
txqd_len += 1;
254
- s->regs[IBEX_SPI_HOST_STATUS] &= ~R_STATUS_TXQD_MASK;
255
- s->regs[IBEX_SPI_HOST_STATUS] |= txqd_len;
256
+ status = FIELD_DP32(status, STATUS, TXQD, txqd_len);
257
/* Assert Ready */
258
- s->regs[IBEX_SPI_HOST_STATUS] |= R_STATUS_READY_MASK;
259
+ status = FIELD_DP32(status, STATUS, READY, 1);
260
+ /* Update register status */
261
+ s->regs[IBEX_SPI_HOST_STATUS] = status;
262
break;
263
case IBEX_SPI_HOST_ERROR_ENABLE:
264
s->regs[addr] = val32;
265
--
266
2.37.3
diff view generated by jsdifflib
New patch
1
From: Wilfred Mallawa <wilfred.mallawa@wdc.com>
1
2
3
This patch adds the `rw1c` functionality to the respective
4
registers. The status fields are cleared when the respective
5
field is set.
6
7
Signed-off-by: Wilfred Mallawa <wilfred.mallawa@wdc.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <20220930033241.206581-3-wilfred.mallawa@opensource.wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
include/hw/ssi/ibex_spi_host.h | 4 ++--
13
hw/ssi/ibex_spi_host.c | 36 +++++++++++++++++++++++++++++++---
14
2 files changed, 35 insertions(+), 5 deletions(-)
15
16
diff --git a/include/hw/ssi/ibex_spi_host.h b/include/hw/ssi/ibex_spi_host.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/ssi/ibex_spi_host.h
19
+++ b/include/hw/ssi/ibex_spi_host.h
20
@@ -XXX,XX +XXX,XX @@
21
OBJECT_CHECK(IbexSPIHostState, (obj), TYPE_IBEX_SPI_HOST)
22
23
/* SPI Registers */
24
-#define IBEX_SPI_HOST_INTR_STATE (0x00 / 4) /* rw */
25
+#define IBEX_SPI_HOST_INTR_STATE (0x00 / 4) /* rw1c */
26
#define IBEX_SPI_HOST_INTR_ENABLE (0x04 / 4) /* rw */
27
#define IBEX_SPI_HOST_INTR_TEST (0x08 / 4) /* wo */
28
#define IBEX_SPI_HOST_ALERT_TEST (0x0c / 4) /* wo */
29
@@ -XXX,XX +XXX,XX @@
30
#define IBEX_SPI_HOST_TXDATA (0x28 / 4)
31
32
#define IBEX_SPI_HOST_ERROR_ENABLE (0x2c / 4) /* rw */
33
-#define IBEX_SPI_HOST_ERROR_STATUS (0x30 / 4) /* rw */
34
+#define IBEX_SPI_HOST_ERROR_STATUS (0x30 / 4) /* rw1c */
35
#define IBEX_SPI_HOST_EVENT_ENABLE (0x34 / 4) /* rw */
36
37
/* FIFO Len in Bytes */
38
diff --git a/hw/ssi/ibex_spi_host.c b/hw/ssi/ibex_spi_host.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/hw/ssi/ibex_spi_host.c
41
+++ b/hw/ssi/ibex_spi_host.c
42
@@ -XXX,XX +XXX,XX @@ static void ibex_spi_host_write(void *opaque, hwaddr addr,
43
{
44
IbexSPIHostState *s = opaque;
45
uint32_t val32 = val64;
46
- uint32_t shift_mask = 0xff, status = 0;
47
+ uint32_t shift_mask = 0xff, status = 0, data = 0;
48
uint8_t txqd_len;
49
50
trace_ibex_spi_host_write(addr, size, val64);
51
@@ -XXX,XX +XXX,XX @@ static void ibex_spi_host_write(void *opaque, hwaddr addr,
52
53
switch (addr) {
54
/* Skipping any R/O registers */
55
- case IBEX_SPI_HOST_INTR_STATE...IBEX_SPI_HOST_INTR_ENABLE:
56
+ case IBEX_SPI_HOST_INTR_STATE:
57
+ /* rw1c status register */
58
+ if (FIELD_EX32(val32, INTR_STATE, ERROR)) {
59
+ data = FIELD_DP32(data, INTR_STATE, ERROR, 0);
60
+ }
61
+ if (FIELD_EX32(val32, INTR_STATE, SPI_EVENT)) {
62
+ data = FIELD_DP32(data, INTR_STATE, SPI_EVENT, 0);
63
+ }
64
+ s->regs[addr] = data;
65
+ break;
66
+ case IBEX_SPI_HOST_INTR_ENABLE:
67
s->regs[addr] = val32;
68
break;
69
case IBEX_SPI_HOST_INTR_TEST:
70
@@ -XXX,XX +XXX,XX @@ static void ibex_spi_host_write(void *opaque, hwaddr addr,
71
* When an error occurs, the corresponding bit must be cleared
72
* here before issuing any further commands
73
*/
74
- s->regs[addr] = val32;
75
+ status = s->regs[addr];
76
+ /* rw1c status register */
77
+ if (FIELD_EX32(val32, ERROR_STATUS, CMDBUSY)) {
78
+ status = FIELD_DP32(status, ERROR_STATUS, CMDBUSY, 0);
79
+ }
80
+ if (FIELD_EX32(val32, ERROR_STATUS, OVERFLOW)) {
81
+ status = FIELD_DP32(status, ERROR_STATUS, OVERFLOW, 0);
82
+ }
83
+ if (FIELD_EX32(val32, ERROR_STATUS, UNDERFLOW)) {
84
+ status = FIELD_DP32(status, ERROR_STATUS, UNDERFLOW, 0);
85
+ }
86
+ if (FIELD_EX32(val32, ERROR_STATUS, CMDINVAL)) {
87
+ status = FIELD_DP32(status, ERROR_STATUS, CMDINVAL, 0);
88
+ }
89
+ if (FIELD_EX32(val32, ERROR_STATUS, CSIDINVAL)) {
90
+ status = FIELD_DP32(status, ERROR_STATUS, CSIDINVAL, 0);
91
+ }
92
+ if (FIELD_EX32(val32, ERROR_STATUS, ACCESSINVAL)) {
93
+ status = FIELD_DP32(status, ERROR_STATUS, ACCESSINVAL, 0);
94
+ }
95
+ s->regs[addr] = status;
96
break;
97
case IBEX_SPI_HOST_EVENT_ENABLE:
98
/* Controls which classes of SPI events raise an interrupt. */
99
--
100
2.37.3
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Sunil V L <sunilvl@ventanamicro.com>
2
2
3
Once a "One Time Programmable" is programmed, it shouldn't be reset.
3
load_image_to_fw_cfg() is duplicated by both arm and loongarch. The same
4
function will be required by riscv too. So, it's time to refactor and
5
move this function to a common path.
4
6
5
Do not re-initialize the OTP content in the DeviceReset handler,
7
Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
6
initialize it once in the DeviceRealize one.
8
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
7
8
Fixes: 9fb45c62ae8 ("riscv: sifive: Implement a model for SiFive FU540 OTP")
9
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
11
Message-Id: <20211119104757.331579-1-f4bug@amsat.org>
10
Reviewed-by: Song Gao <gaosong@loongson.cn>
11
Message-Id: <20221004092351.18209-2-sunilvl@ventanamicro.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
13
---
14
hw/misc/sifive_u_otp.c | 13 +++++--------
14
include/hw/nvram/fw_cfg.h | 21 +++++++++++++++++
15
1 file changed, 5 insertions(+), 8 deletions(-)
15
hw/arm/boot.c | 49 ---------------------------------------
16
hw/loongarch/virt.c | 33 --------------------------
17
hw/nvram/fw_cfg.c | 32 +++++++++++++++++++++++++
18
4 files changed, 53 insertions(+), 82 deletions(-)
16
19
17
diff --git a/hw/misc/sifive_u_otp.c b/hw/misc/sifive_u_otp.c
20
diff --git a/include/hw/nvram/fw_cfg.h b/include/hw/nvram/fw_cfg.h
18
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/misc/sifive_u_otp.c
22
--- a/include/hw/nvram/fw_cfg.h
20
+++ b/hw/misc/sifive_u_otp.c
23
+++ b/include/hw/nvram/fw_cfg.h
21
@@ -XXX,XX +XXX,XX @@ static void sifive_u_otp_realize(DeviceState *dev, Error **errp)
24
@@ -XXX,XX +XXX,XX @@ bool fw_cfg_dma_enabled(void *opaque);
22
25
*/
23
if (blk_pread(s->blk, 0, s->fuse, filesize) != filesize) {
26
const char *fw_cfg_arch_key_name(uint16_t key);
24
error_setg(errp, "failed to read the initial flash content");
27
25
+ return;
28
+/**
26
}
29
+ * load_image_to_fw_cfg() - Load an image file into an fw_cfg entry identified
27
}
30
+ * by key.
31
+ * @fw_cfg: The firmware config instance to store the data in.
32
+ * @size_key: The firmware config key to store the size of the loaded
33
+ * data under, with fw_cfg_add_i32().
34
+ * @data_key: The firmware config key to store the loaded data under,
35
+ * with fw_cfg_add_bytes().
36
+ * @image_name: The name of the image file to load. If it is NULL, the
37
+ * function returns without doing anything.
38
+ * @try_decompress: Whether the image should be decompressed (gunzipped) before
39
+ * adding it to fw_cfg. If decompression fails, the image is
40
+ * loaded as-is.
41
+ *
42
+ * In case of failure, the function prints an error message to stderr and the
43
+ * process exits with status 1.
44
+ */
45
+void load_image_to_fw_cfg(FWCfgState *fw_cfg, uint16_t size_key,
46
+ uint16_t data_key, const char *image_name,
47
+ bool try_decompress);
48
+
49
#endif
50
diff --git a/hw/arm/boot.c b/hw/arm/boot.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/arm/boot.c
53
+++ b/hw/arm/boot.c
54
@@ -XXX,XX +XXX,XX @@ static void do_cpu_reset(void *opaque)
28
}
55
}
56
}
57
58
-/**
59
- * load_image_to_fw_cfg() - Load an image file into an fw_cfg entry identified
60
- * by key.
61
- * @fw_cfg: The firmware config instance to store the data in.
62
- * @size_key: The firmware config key to store the size of the loaded
63
- * data under, with fw_cfg_add_i32().
64
- * @data_key: The firmware config key to store the loaded data under,
65
- * with fw_cfg_add_bytes().
66
- * @image_name: The name of the image file to load. If it is NULL, the
67
- * function returns without doing anything.
68
- * @try_decompress: Whether the image should be decompressed (gunzipped) before
69
- * adding it to fw_cfg. If decompression fails, the image is
70
- * loaded as-is.
71
- *
72
- * In case of failure, the function prints an error message to stderr and the
73
- * process exits with status 1.
74
- */
75
-static void load_image_to_fw_cfg(FWCfgState *fw_cfg, uint16_t size_key,
76
- uint16_t data_key, const char *image_name,
77
- bool try_decompress)
78
-{
79
- size_t size = -1;
80
- uint8_t *data;
81
-
82
- if (image_name == NULL) {
83
- return;
84
- }
85
-
86
- if (try_decompress) {
87
- size = load_image_gzipped_buffer(image_name,
88
- LOAD_IMAGE_MAX_GUNZIP_BYTES, &data);
89
- }
90
-
91
- if (size == (size_t)-1) {
92
- gchar *contents;
93
- gsize length;
94
-
95
- if (!g_file_get_contents(image_name, &contents, &length, NULL)) {
96
- error_report("failed to load \"%s\"", image_name);
97
- exit(1);
98
- }
99
- size = length;
100
- data = (uint8_t *)contents;
101
- }
102
-
103
- fw_cfg_add_i32(fw_cfg, size_key, size);
104
- fw_cfg_add_bytes(fw_cfg, data_key, data, size);
29
-}
105
-}
30
-
106
-
31
-static void sifive_u_otp_reset(DeviceState *dev)
107
static int do_arm_linux_init(Object *obj, void *opaque)
108
{
109
if (object_dynamic_cast(obj, TYPE_ARM_LINUX_BOOT_IF)) {
110
diff --git a/hw/loongarch/virt.c b/hw/loongarch/virt.c
111
index XXXXXXX..XXXXXXX 100644
112
--- a/hw/loongarch/virt.c
113
+++ b/hw/loongarch/virt.c
114
@@ -XXX,XX +XXX,XX @@ static void reset_load_elf(void *opaque)
115
}
116
}
117
118
-/* Load an image file into an fw_cfg entry identified by key. */
119
-static void load_image_to_fw_cfg(FWCfgState *fw_cfg, uint16_t size_key,
120
- uint16_t data_key, const char *image_name,
121
- bool try_decompress)
32
-{
122
-{
33
- SiFiveUOTPState *s = SIFIVE_U_OTP(dev);
123
- size_t size = -1;
34
124
- uint8_t *data;
35
/* Initialize all fuses' initial value to 0xFFs */
125
-
36
memset(s->fuse, 0xff, sizeof(s->fuse));
126
- if (image_name == NULL) {
37
@@ -XXX,XX +XXX,XX @@ static void sifive_u_otp_reset(DeviceState *dev)
127
- return;
38
serial_data = s->serial;
128
- }
39
if (blk_pwrite(s->blk, index * SIFIVE_U_OTP_FUSE_WORD,
129
-
40
&serial_data, SIFIVE_U_OTP_FUSE_WORD, 0) < 0) {
130
- if (try_decompress) {
41
- error_report("write error index<%d>", index);
131
- size = load_image_gzipped_buffer(image_name,
42
+ error_setg(errp, "failed to write index<%d>", index);
132
- LOAD_IMAGE_MAX_GUNZIP_BYTES, &data);
43
+ return;
133
- }
44
}
134
-
45
135
- if (size == (size_t)-1) {
46
serial_data = ~(s->serial);
136
- gchar *contents;
47
if (blk_pwrite(s->blk, (index + 1) * SIFIVE_U_OTP_FUSE_WORD,
137
- gsize length;
48
&serial_data, SIFIVE_U_OTP_FUSE_WORD, 0) < 0) {
138
-
49
- error_report("write error index<%d>", index + 1);
139
- if (!g_file_get_contents(image_name, &contents, &length, NULL)) {
50
+ error_setg(errp, "failed to write index<%d>", index + 1);
140
- error_report("failed to load \"%s\"", image_name);
51
+ return;
141
- exit(1);
52
}
142
- }
53
}
143
- size = length;
54
144
- data = (uint8_t *)contents;
55
@@ -XXX,XX +XXX,XX @@ static void sifive_u_otp_class_init(ObjectClass *klass, void *data)
145
- }
56
146
-
57
device_class_set_props(dc, sifive_u_otp_properties);
147
- fw_cfg_add_i32(fw_cfg, size_key, size);
58
dc->realize = sifive_u_otp_realize;
148
- fw_cfg_add_bytes(fw_cfg, data_key, data, size);
59
- dc->reset = sifive_u_otp_reset;
149
-}
150
-
151
static void fw_cfg_add_kernel_info(FWCfgState *fw_cfg)
152
{
153
/*
154
diff --git a/hw/nvram/fw_cfg.c b/hw/nvram/fw_cfg.c
155
index XXXXXXX..XXXXXXX 100644
156
--- a/hw/nvram/fw_cfg.c
157
+++ b/hw/nvram/fw_cfg.c
158
@@ -XXX,XX +XXX,XX @@
159
#include "qapi/error.h"
160
#include "hw/acpi/aml-build.h"
161
#include "hw/pci/pci_bus.h"
162
+#include "hw/loader.h"
163
164
#define FW_CFG_FILE_SLOTS_DFLT 0x20
165
166
@@ -XXX,XX +XXX,XX @@ FWCfgState *fw_cfg_find(void)
167
return FW_CFG(object_resolve_path_type("", TYPE_FW_CFG, NULL));
60
}
168
}
61
169
62
static const TypeInfo sifive_u_otp_info = {
170
+void load_image_to_fw_cfg(FWCfgState *fw_cfg, uint16_t size_key,
171
+ uint16_t data_key, const char *image_name,
172
+ bool try_decompress)
173
+{
174
+ size_t size = -1;
175
+ uint8_t *data;
176
+
177
+ if (image_name == NULL) {
178
+ return;
179
+ }
180
+
181
+ if (try_decompress) {
182
+ size = load_image_gzipped_buffer(image_name,
183
+ LOAD_IMAGE_MAX_GUNZIP_BYTES, &data);
184
+ }
185
+
186
+ if (size == (size_t)-1) {
187
+ gchar *contents;
188
+ gsize length;
189
+
190
+ if (!g_file_get_contents(image_name, &contents, &length, NULL)) {
191
+ error_report("failed to load \"%s\"", image_name);
192
+ exit(1);
193
+ }
194
+ size = length;
195
+ data = (uint8_t *)contents;
196
+ }
197
+
198
+ fw_cfg_add_i32(fw_cfg, size_key, size);
199
+ fw_cfg_add_bytes(fw_cfg, data_key, data, size);
200
+}
201
202
static void fw_cfg_class_init(ObjectClass *klass, void *data)
203
{
63
--
204
--
64
2.31.1
205
2.37.3
65
66
diff view generated by jsdifflib
New patch
1
From: Sunil V L <sunilvl@ventanamicro.com>
1
2
3
To enable both -kernel and -pflash options, the fw_cfg needs to be
4
created prior to loading the kernel.
5
6
Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
7
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <20221004092351.18209-3-sunilvl@ventanamicro.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
hw/riscv/virt.c | 14 +++++++-------
13
1 file changed, 7 insertions(+), 7 deletions(-)
14
15
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/riscv/virt.c
18
+++ b/hw/riscv/virt.c
19
@@ -XXX,XX +XXX,XX @@ static void virt_machine_done(Notifier *notifier, void *data)
20
RISCV64_BIOS_BIN, start_addr, NULL);
21
}
22
23
+ /*
24
+ * Init fw_cfg. Must be done before riscv_load_fdt, otherwise the device
25
+ * tree cannot be altered and we get FDT_ERR_NOSPACE.
26
+ */
27
+ s->fw_cfg = create_fw_cfg(machine);
28
+ rom_set_fw(s->fw_cfg);
29
+
30
if (machine->kernel_filename) {
31
kernel_start_addr = riscv_calc_kernel_start_addr(&s->soc[0],
32
firmware_end_addr);
33
@@ -XXX,XX +XXX,XX @@ static void virt_machine_done(Notifier *notifier, void *data)
34
start_addr = virt_memmap[VIRT_FLASH].base;
35
}
36
37
- /*
38
- * Init fw_cfg. Must be done before riscv_load_fdt, otherwise the device
39
- * tree cannot be altered and we get FDT_ERR_NOSPACE.
40
- */
41
- s->fw_cfg = create_fw_cfg(machine);
42
- rom_set_fw(s->fw_cfg);
43
-
44
/* Compute the fdt load address in dram */
45
fdt_load_addr = riscv_load_fdt(memmap[VIRT_DRAM].base,
46
machine->ram_size, machine->fdt);
47
--
48
2.37.3
diff view generated by jsdifflib
1
From: Thomas Huth <thuth@redhat.com>
1
From: Sunil V L <sunilvl@ventanamicro.com>
2
2
3
Configuring a drive with "if=none" is meant for creation of a backend
3
To boot S-mode firmware payload like EDK2 from persistent
4
only, it should not get automatically assigned to a device frontend.
4
flash storage, qemu needs to pass the flash address as the
5
Use "if=pflash" for the One-Time-Programmable device instead (like
5
next_addr in fw_dynamic_info to the opensbi.
6
it is e.g. also done for the efuse device in hw/arm/xlnx-zcu102.c).
7
6
8
Since the old way of configuring the device has already been published
7
When both -kernel and -pflash options are provided in command line,
9
with the previous QEMU versions, we cannot remove this immediately, but
8
the kernel (and initrd if -initrd) will be copied to fw_cfg table.
10
have to deprecate it and support it for at least two more releases.
9
The S-mode FW will load the kernel/initrd from fw_cfg table.
11
10
12
Signed-off-by: Thomas Huth <thuth@redhat.com>
11
If only pflash is given but not -kernel, then it is the job of
13
Acked-by: Philippe Mathieu-Daudé <philmd@redhat.com>
12
of the S-mode firmware to locate and load the kernel.
14
Reviewed-by: Markus Armbruster <armbru@redhat.com>
13
14
In either case, update the kernel_entry with the flash address
15
so that the opensbi can jump to the entry point of the S-mode
16
firmware.
17
18
Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
19
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
15
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
20
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
16
Message-id: 20211119102549.217755-1-thuth@redhat.com
21
Message-Id: <20221004092351.18209-4-sunilvl@ventanamicro.com>
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
22
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
18
---
23
---
19
docs/about/deprecated.rst | 6 ++++++
24
include/hw/riscv/boot.h | 1 +
20
hw/misc/sifive_u_otp.c | 9 ++++++++-
25
hw/riscv/boot.c | 29 +++++++++++++++++++++++++++++
21
2 files changed, 14 insertions(+), 1 deletion(-)
26
hw/riscv/virt.c | 18 +++++++++++++++++-
27
3 files changed, 47 insertions(+), 1 deletion(-)
22
28
23
diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
29
diff --git a/include/hw/riscv/boot.h b/include/hw/riscv/boot.h
24
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
25
--- a/docs/about/deprecated.rst
31
--- a/include/hw/riscv/boot.h
26
+++ b/docs/about/deprecated.rst
32
+++ b/include/hw/riscv/boot.h
27
@@ -XXX,XX +XXX,XX @@ as short-form boolean values, and passed to plugins as ``arg_name=on``.
33
@@ -XXX,XX +XXX,XX @@ void riscv_rom_copy_firmware_info(MachineState *machine, hwaddr rom_base,
28
However, short-form booleans are deprecated and full explicit ``arg_name=on``
34
uint32_t reset_vec_size,
29
form is preferred.
35
uint64_t kernel_entry);
30
36
void riscv_setup_direct_kernel(hwaddr kernel_addr, hwaddr fdt_addr);
31
+``-drive if=none`` for the sifive_u OTP device (since 6.2)
37
+void riscv_setup_firmware_boot(MachineState *machine);
32
+''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
38
39
#endif /* RISCV_BOOT_H */
40
diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/hw/riscv/boot.c
43
+++ b/hw/riscv/boot.c
44
@@ -XXX,XX +XXX,XX @@ void riscv_setup_direct_kernel(hwaddr kernel_addr, hwaddr fdt_addr)
45
riscv_cpu->env.fdt_addr = fdt_addr;
46
}
47
}
33
+
48
+
34
+Using ``-drive if=none`` to configure the OTP device of the sifive_u
49
+void riscv_setup_firmware_boot(MachineState *machine)
35
+RISC-V machine is deprecated. Use ``-drive if=pflash`` instead.
50
+{
51
+ if (machine->kernel_filename) {
52
+ FWCfgState *fw_cfg;
53
+ fw_cfg = fw_cfg_find();
36
+
54
+
37
55
+ assert(fw_cfg);
38
QEMU Machine Protocol (QMP) commands
56
+ /*
39
------------------------------------
57
+ * Expose the kernel, the command line, and the initrd in fw_cfg.
40
diff --git a/hw/misc/sifive_u_otp.c b/hw/misc/sifive_u_otp.c
58
+ * We don't process them here at all, it's all left to the
41
index XXXXXXX..XXXXXXX 100644
59
+ * firmware.
42
--- a/hw/misc/sifive_u_otp.c
60
+ */
43
+++ b/hw/misc/sifive_u_otp.c
61
+ load_image_to_fw_cfg(fw_cfg,
44
@@ -XXX,XX +XXX,XX @@ static void sifive_u_otp_realize(DeviceState *dev, Error **errp)
62
+ FW_CFG_KERNEL_SIZE, FW_CFG_KERNEL_DATA,
45
TYPE_SIFIVE_U_OTP, SIFIVE_U_OTP_REG_SIZE);
63
+ machine->kernel_filename,
46
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->mmio);
64
+ true);
47
65
+ load_image_to_fw_cfg(fw_cfg,
48
- dinfo = drive_get_next(IF_NONE);
66
+ FW_CFG_INITRD_SIZE, FW_CFG_INITRD_DATA,
49
+ dinfo = drive_get_next(IF_PFLASH);
67
+ machine->initrd_filename, false);
50
+ if (!dinfo) {
68
+
51
+ dinfo = drive_get_next(IF_NONE);
69
+ if (machine->kernel_cmdline) {
52
+ if (dinfo) {
70
+ fw_cfg_add_i32(fw_cfg, FW_CFG_CMDLINE_SIZE,
53
+ warn_report("using \"-drive if=none\" for the OTP is deprecated, "
71
+ strlen(machine->kernel_cmdline) + 1);
54
+ "use \"-drive if=pflash\" instead.");
72
+ fw_cfg_add_string(fw_cfg, FW_CFG_CMDLINE_DATA,
73
+ machine->kernel_cmdline);
55
+ }
74
+ }
56
+ }
75
+ }
57
if (dinfo) {
76
+}
58
int ret;
77
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
59
uint64_t perm;
78
index XXXXXXX..XXXXXXX 100644
79
--- a/hw/riscv/virt.c
80
+++ b/hw/riscv/virt.c
81
@@ -XXX,XX +XXX,XX @@ static void virt_machine_done(Notifier *notifier, void *data)
82
s->fw_cfg = create_fw_cfg(machine);
83
rom_set_fw(s->fw_cfg);
84
85
- if (machine->kernel_filename) {
86
+ if (drive_get(IF_PFLASH, 0, 1)) {
87
+ /*
88
+ * S-mode FW like EDK2 will be kept in second plash (unit 1).
89
+ * When both kernel, initrd and pflash options are provided in the
90
+ * command line, the kernel and initrd will be copied to the fw_cfg
91
+ * table and opensbi will jump to the flash address which is the
92
+ * entry point of S-mode FW. It is the job of the S-mode FW to load
93
+ * the kernel and initrd using fw_cfg table.
94
+ *
95
+ * If only pflash is given but not -kernel, then it is the job of
96
+ * of the S-mode firmware to locate and load the kernel.
97
+ * In either case, the next_addr for opensbi will be the flash address.
98
+ */
99
+ riscv_setup_firmware_boot(machine);
100
+ kernel_entry = virt_memmap[VIRT_FLASH].base +
101
+ virt_memmap[VIRT_FLASH].size / 2;
102
+ } else if (machine->kernel_filename) {
103
kernel_start_addr = riscv_calc_kernel_start_addr(&s->soc[0],
104
firmware_end_addr);
105
60
--
106
--
61
2.31.1
107
2.37.3
62
63
diff view generated by jsdifflib
New patch
1
From: Yang Liu <liuyang22@iscas.ac.cn>
1
2
3
Tested with https://github.com/ksco/rvv-decoder-tests
4
5
Expected checkpatch errors for consistency and brevity reasons:
6
7
ERROR: line over 90 characters
8
ERROR: trailing statements should be on next line
9
ERROR: braces {} are necessary for all arms of this statement
10
11
Signed-off-by: Yang Liu <liuyang22@iscas.ac.cn>
12
Acked-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-Id: <20220928051842.16207-1-liuyang22@iscas.ac.cn>
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
15
---
16
disas/riscv.c | 1432 ++++++++++++++++++++++++++++++++++++++++++++++++-
17
1 file changed, 1430 insertions(+), 2 deletions(-)
18
19
diff --git a/disas/riscv.c b/disas/riscv.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/disas/riscv.c
22
+++ b/disas/riscv.c
23
@@ -XXX,XX +XXX,XX @@ typedef enum {
24
rv_codec_css_sqsp,
25
rv_codec_k_bs,
26
rv_codec_k_rnum,
27
+ rv_codec_v_r,
28
+ rv_codec_v_ldst,
29
+ rv_codec_v_i,
30
+ rv_codec_vsetvli,
31
+ rv_codec_vsetivli,
32
} rv_codec;
33
34
typedef enum {
35
@@ -XXX,XX +XXX,XX @@ typedef enum {
36
rv_op_zip = 396,
37
rv_op_xperm4 = 397,
38
rv_op_xperm8 = 398,
39
+ rv_op_vle8_v = 399,
40
+ rv_op_vle16_v = 400,
41
+ rv_op_vle32_v = 401,
42
+ rv_op_vle64_v = 402,
43
+ rv_op_vse8_v = 403,
44
+ rv_op_vse16_v = 404,
45
+ rv_op_vse32_v = 405,
46
+ rv_op_vse64_v = 406,
47
+ rv_op_vlm_v = 407,
48
+ rv_op_vsm_v = 408,
49
+ rv_op_vlse8_v = 409,
50
+ rv_op_vlse16_v = 410,
51
+ rv_op_vlse32_v = 411,
52
+ rv_op_vlse64_v = 412,
53
+ rv_op_vsse8_v = 413,
54
+ rv_op_vsse16_v = 414,
55
+ rv_op_vsse32_v = 415,
56
+ rv_op_vsse64_v = 416,
57
+ rv_op_vluxei8_v = 417,
58
+ rv_op_vluxei16_v = 418,
59
+ rv_op_vluxei32_v = 419,
60
+ rv_op_vluxei64_v = 420,
61
+ rv_op_vloxei8_v = 421,
62
+ rv_op_vloxei16_v = 422,
63
+ rv_op_vloxei32_v = 423,
64
+ rv_op_vloxei64_v = 424,
65
+ rv_op_vsuxei8_v = 425,
66
+ rv_op_vsuxei16_v = 426,
67
+ rv_op_vsuxei32_v = 427,
68
+ rv_op_vsuxei64_v = 428,
69
+ rv_op_vsoxei8_v = 429,
70
+ rv_op_vsoxei16_v = 430,
71
+ rv_op_vsoxei32_v = 431,
72
+ rv_op_vsoxei64_v = 432,
73
+ rv_op_vle8ff_v = 433,
74
+ rv_op_vle16ff_v = 434,
75
+ rv_op_vle32ff_v = 435,
76
+ rv_op_vle64ff_v = 436,
77
+ rv_op_vl1re8_v = 437,
78
+ rv_op_vl1re16_v = 438,
79
+ rv_op_vl1re32_v = 439,
80
+ rv_op_vl1re64_v = 440,
81
+ rv_op_vl2re8_v = 441,
82
+ rv_op_vl2re16_v = 442,
83
+ rv_op_vl2re32_v = 443,
84
+ rv_op_vl2re64_v = 444,
85
+ rv_op_vl4re8_v = 445,
86
+ rv_op_vl4re16_v = 446,
87
+ rv_op_vl4re32_v = 447,
88
+ rv_op_vl4re64_v = 448,
89
+ rv_op_vl8re8_v = 449,
90
+ rv_op_vl8re16_v = 450,
91
+ rv_op_vl8re32_v = 451,
92
+ rv_op_vl8re64_v = 452,
93
+ rv_op_vs1r_v = 453,
94
+ rv_op_vs2r_v = 454,
95
+ rv_op_vs4r_v = 455,
96
+ rv_op_vs8r_v = 456,
97
+ rv_op_vadd_vv = 457,
98
+ rv_op_vadd_vx = 458,
99
+ rv_op_vadd_vi = 459,
100
+ rv_op_vsub_vv = 460,
101
+ rv_op_vsub_vx = 461,
102
+ rv_op_vrsub_vx = 462,
103
+ rv_op_vrsub_vi = 463,
104
+ rv_op_vwaddu_vv = 464,
105
+ rv_op_vwaddu_vx = 465,
106
+ rv_op_vwadd_vv = 466,
107
+ rv_op_vwadd_vx = 467,
108
+ rv_op_vwsubu_vv = 468,
109
+ rv_op_vwsubu_vx = 469,
110
+ rv_op_vwsub_vv = 470,
111
+ rv_op_vwsub_vx = 471,
112
+ rv_op_vwaddu_wv = 472,
113
+ rv_op_vwaddu_wx = 473,
114
+ rv_op_vwadd_wv = 474,
115
+ rv_op_vwadd_wx = 475,
116
+ rv_op_vwsubu_wv = 476,
117
+ rv_op_vwsubu_wx = 477,
118
+ rv_op_vwsub_wv = 478,
119
+ rv_op_vwsub_wx = 479,
120
+ rv_op_vadc_vvm = 480,
121
+ rv_op_vadc_vxm = 481,
122
+ rv_op_vadc_vim = 482,
123
+ rv_op_vmadc_vvm = 483,
124
+ rv_op_vmadc_vxm = 484,
125
+ rv_op_vmadc_vim = 485,
126
+ rv_op_vsbc_vvm = 486,
127
+ rv_op_vsbc_vxm = 487,
128
+ rv_op_vmsbc_vvm = 488,
129
+ rv_op_vmsbc_vxm = 489,
130
+ rv_op_vand_vv = 490,
131
+ rv_op_vand_vx = 491,
132
+ rv_op_vand_vi = 492,
133
+ rv_op_vor_vv = 493,
134
+ rv_op_vor_vx = 494,
135
+ rv_op_vor_vi = 495,
136
+ rv_op_vxor_vv = 496,
137
+ rv_op_vxor_vx = 497,
138
+ rv_op_vxor_vi = 498,
139
+ rv_op_vsll_vv = 499,
140
+ rv_op_vsll_vx = 500,
141
+ rv_op_vsll_vi = 501,
142
+ rv_op_vsrl_vv = 502,
143
+ rv_op_vsrl_vx = 503,
144
+ rv_op_vsrl_vi = 504,
145
+ rv_op_vsra_vv = 505,
146
+ rv_op_vsra_vx = 506,
147
+ rv_op_vsra_vi = 507,
148
+ rv_op_vnsrl_wv = 508,
149
+ rv_op_vnsrl_wx = 509,
150
+ rv_op_vnsrl_wi = 510,
151
+ rv_op_vnsra_wv = 511,
152
+ rv_op_vnsra_wx = 512,
153
+ rv_op_vnsra_wi = 513,
154
+ rv_op_vmseq_vv = 514,
155
+ rv_op_vmseq_vx = 515,
156
+ rv_op_vmseq_vi = 516,
157
+ rv_op_vmsne_vv = 517,
158
+ rv_op_vmsne_vx = 518,
159
+ rv_op_vmsne_vi = 519,
160
+ rv_op_vmsltu_vv = 520,
161
+ rv_op_vmsltu_vx = 521,
162
+ rv_op_vmslt_vv = 522,
163
+ rv_op_vmslt_vx = 523,
164
+ rv_op_vmsleu_vv = 524,
165
+ rv_op_vmsleu_vx = 525,
166
+ rv_op_vmsleu_vi = 526,
167
+ rv_op_vmsle_vv = 527,
168
+ rv_op_vmsle_vx = 528,
169
+ rv_op_vmsle_vi = 529,
170
+ rv_op_vmsgtu_vx = 530,
171
+ rv_op_vmsgtu_vi = 531,
172
+ rv_op_vmsgt_vx = 532,
173
+ rv_op_vmsgt_vi = 533,
174
+ rv_op_vminu_vv = 534,
175
+ rv_op_vminu_vx = 535,
176
+ rv_op_vmin_vv = 536,
177
+ rv_op_vmin_vx = 537,
178
+ rv_op_vmaxu_vv = 538,
179
+ rv_op_vmaxu_vx = 539,
180
+ rv_op_vmax_vv = 540,
181
+ rv_op_vmax_vx = 541,
182
+ rv_op_vmul_vv = 542,
183
+ rv_op_vmul_vx = 543,
184
+ rv_op_vmulh_vv = 544,
185
+ rv_op_vmulh_vx = 545,
186
+ rv_op_vmulhu_vv = 546,
187
+ rv_op_vmulhu_vx = 547,
188
+ rv_op_vmulhsu_vv = 548,
189
+ rv_op_vmulhsu_vx = 549,
190
+ rv_op_vdivu_vv = 550,
191
+ rv_op_vdivu_vx = 551,
192
+ rv_op_vdiv_vv = 552,
193
+ rv_op_vdiv_vx = 553,
194
+ rv_op_vremu_vv = 554,
195
+ rv_op_vremu_vx = 555,
196
+ rv_op_vrem_vv = 556,
197
+ rv_op_vrem_vx = 557,
198
+ rv_op_vwmulu_vv = 558,
199
+ rv_op_vwmulu_vx = 559,
200
+ rv_op_vwmulsu_vv = 560,
201
+ rv_op_vwmulsu_vx = 561,
202
+ rv_op_vwmul_vv = 562,
203
+ rv_op_vwmul_vx = 563,
204
+ rv_op_vmacc_vv = 564,
205
+ rv_op_vmacc_vx = 565,
206
+ rv_op_vnmsac_vv = 566,
207
+ rv_op_vnmsac_vx = 567,
208
+ rv_op_vmadd_vv = 568,
209
+ rv_op_vmadd_vx = 569,
210
+ rv_op_vnmsub_vv = 570,
211
+ rv_op_vnmsub_vx = 571,
212
+ rv_op_vwmaccu_vv = 572,
213
+ rv_op_vwmaccu_vx = 573,
214
+ rv_op_vwmacc_vv = 574,
215
+ rv_op_vwmacc_vx = 575,
216
+ rv_op_vwmaccsu_vv = 576,
217
+ rv_op_vwmaccsu_vx = 577,
218
+ rv_op_vwmaccus_vx = 578,
219
+ rv_op_vmv_v_v = 579,
220
+ rv_op_vmv_v_x = 580,
221
+ rv_op_vmv_v_i = 581,
222
+ rv_op_vmerge_vvm = 582,
223
+ rv_op_vmerge_vxm = 583,
224
+ rv_op_vmerge_vim = 584,
225
+ rv_op_vsaddu_vv = 585,
226
+ rv_op_vsaddu_vx = 586,
227
+ rv_op_vsaddu_vi = 587,
228
+ rv_op_vsadd_vv = 588,
229
+ rv_op_vsadd_vx = 589,
230
+ rv_op_vsadd_vi = 590,
231
+ rv_op_vssubu_vv = 591,
232
+ rv_op_vssubu_vx = 592,
233
+ rv_op_vssub_vv = 593,
234
+ rv_op_vssub_vx = 594,
235
+ rv_op_vaadd_vv = 595,
236
+ rv_op_vaadd_vx = 596,
237
+ rv_op_vaaddu_vv = 597,
238
+ rv_op_vaaddu_vx = 598,
239
+ rv_op_vasub_vv = 599,
240
+ rv_op_vasub_vx = 600,
241
+ rv_op_vasubu_vv = 601,
242
+ rv_op_vasubu_vx = 602,
243
+ rv_op_vsmul_vv = 603,
244
+ rv_op_vsmul_vx = 604,
245
+ rv_op_vssrl_vv = 605,
246
+ rv_op_vssrl_vx = 606,
247
+ rv_op_vssrl_vi = 607,
248
+ rv_op_vssra_vv = 608,
249
+ rv_op_vssra_vx = 609,
250
+ rv_op_vssra_vi = 610,
251
+ rv_op_vnclipu_wv = 611,
252
+ rv_op_vnclipu_wx = 612,
253
+ rv_op_vnclipu_wi = 613,
254
+ rv_op_vnclip_wv = 614,
255
+ rv_op_vnclip_wx = 615,
256
+ rv_op_vnclip_wi = 616,
257
+ rv_op_vfadd_vv = 617,
258
+ rv_op_vfadd_vf = 618,
259
+ rv_op_vfsub_vv = 619,
260
+ rv_op_vfsub_vf = 620,
261
+ rv_op_vfrsub_vf = 621,
262
+ rv_op_vfwadd_vv = 622,
263
+ rv_op_vfwadd_vf = 623,
264
+ rv_op_vfwadd_wv = 624,
265
+ rv_op_vfwadd_wf = 625,
266
+ rv_op_vfwsub_vv = 626,
267
+ rv_op_vfwsub_vf = 627,
268
+ rv_op_vfwsub_wv = 628,
269
+ rv_op_vfwsub_wf = 629,
270
+ rv_op_vfmul_vv = 630,
271
+ rv_op_vfmul_vf = 631,
272
+ rv_op_vfdiv_vv = 632,
273
+ rv_op_vfdiv_vf = 633,
274
+ rv_op_vfrdiv_vf = 634,
275
+ rv_op_vfwmul_vv = 635,
276
+ rv_op_vfwmul_vf = 636,
277
+ rv_op_vfmacc_vv = 637,
278
+ rv_op_vfmacc_vf = 638,
279
+ rv_op_vfnmacc_vv = 639,
280
+ rv_op_vfnmacc_vf = 640,
281
+ rv_op_vfmsac_vv = 641,
282
+ rv_op_vfmsac_vf = 642,
283
+ rv_op_vfnmsac_vv = 643,
284
+ rv_op_vfnmsac_vf = 644,
285
+ rv_op_vfmadd_vv = 645,
286
+ rv_op_vfmadd_vf = 646,
287
+ rv_op_vfnmadd_vv = 647,
288
+ rv_op_vfnmadd_vf = 648,
289
+ rv_op_vfmsub_vv = 649,
290
+ rv_op_vfmsub_vf = 650,
291
+ rv_op_vfnmsub_vv = 651,
292
+ rv_op_vfnmsub_vf = 652,
293
+ rv_op_vfwmacc_vv = 653,
294
+ rv_op_vfwmacc_vf = 654,
295
+ rv_op_vfwnmacc_vv = 655,
296
+ rv_op_vfwnmacc_vf = 656,
297
+ rv_op_vfwmsac_vv = 657,
298
+ rv_op_vfwmsac_vf = 658,
299
+ rv_op_vfwnmsac_vv = 659,
300
+ rv_op_vfwnmsac_vf = 660,
301
+ rv_op_vfsqrt_v = 661,
302
+ rv_op_vfrsqrt7_v = 662,
303
+ rv_op_vfrec7_v = 663,
304
+ rv_op_vfmin_vv = 664,
305
+ rv_op_vfmin_vf = 665,
306
+ rv_op_vfmax_vv = 666,
307
+ rv_op_vfmax_vf = 667,
308
+ rv_op_vfsgnj_vv = 668,
309
+ rv_op_vfsgnj_vf = 669,
310
+ rv_op_vfsgnjn_vv = 670,
311
+ rv_op_vfsgnjn_vf = 671,
312
+ rv_op_vfsgnjx_vv = 672,
313
+ rv_op_vfsgnjx_vf = 673,
314
+ rv_op_vfslide1up_vf = 674,
315
+ rv_op_vfslide1down_vf = 675,
316
+ rv_op_vmfeq_vv = 676,
317
+ rv_op_vmfeq_vf = 677,
318
+ rv_op_vmfne_vv = 678,
319
+ rv_op_vmfne_vf = 679,
320
+ rv_op_vmflt_vv = 680,
321
+ rv_op_vmflt_vf = 681,
322
+ rv_op_vmfle_vv = 682,
323
+ rv_op_vmfle_vf = 683,
324
+ rv_op_vmfgt_vf = 684,
325
+ rv_op_vmfge_vf = 685,
326
+ rv_op_vfclass_v = 686,
327
+ rv_op_vfmerge_vfm = 687,
328
+ rv_op_vfmv_v_f = 688,
329
+ rv_op_vfcvt_xu_f_v = 689,
330
+ rv_op_vfcvt_x_f_v = 690,
331
+ rv_op_vfcvt_f_xu_v = 691,
332
+ rv_op_vfcvt_f_x_v = 692,
333
+ rv_op_vfcvt_rtz_xu_f_v = 693,
334
+ rv_op_vfcvt_rtz_x_f_v = 694,
335
+ rv_op_vfwcvt_xu_f_v = 695,
336
+ rv_op_vfwcvt_x_f_v = 696,
337
+ rv_op_vfwcvt_f_xu_v = 697,
338
+ rv_op_vfwcvt_f_x_v = 698,
339
+ rv_op_vfwcvt_f_f_v = 699,
340
+ rv_op_vfwcvt_rtz_xu_f_v = 700,
341
+ rv_op_vfwcvt_rtz_x_f_v = 701,
342
+ rv_op_vfncvt_xu_f_w = 702,
343
+ rv_op_vfncvt_x_f_w = 703,
344
+ rv_op_vfncvt_f_xu_w = 704,
345
+ rv_op_vfncvt_f_x_w = 705,
346
+ rv_op_vfncvt_f_f_w = 706,
347
+ rv_op_vfncvt_rod_f_f_w = 707,
348
+ rv_op_vfncvt_rtz_xu_f_w = 708,
349
+ rv_op_vfncvt_rtz_x_f_w = 709,
350
+ rv_op_vredsum_vs = 710,
351
+ rv_op_vredand_vs = 711,
352
+ rv_op_vredor_vs = 712,
353
+ rv_op_vredxor_vs = 713,
354
+ rv_op_vredminu_vs = 714,
355
+ rv_op_vredmin_vs = 715,
356
+ rv_op_vredmaxu_vs = 716,
357
+ rv_op_vredmax_vs = 717,
358
+ rv_op_vwredsumu_vs = 718,
359
+ rv_op_vwredsum_vs = 719,
360
+ rv_op_vfredusum_vs = 720,
361
+ rv_op_vfredosum_vs = 721,
362
+ rv_op_vfredmin_vs = 722,
363
+ rv_op_vfredmax_vs = 723,
364
+ rv_op_vfwredusum_vs = 724,
365
+ rv_op_vfwredosum_vs = 725,
366
+ rv_op_vmand_mm = 726,
367
+ rv_op_vmnand_mm = 727,
368
+ rv_op_vmandn_mm = 728,
369
+ rv_op_vmxor_mm = 729,
370
+ rv_op_vmor_mm = 730,
371
+ rv_op_vmnor_mm = 731,
372
+ rv_op_vmorn_mm = 732,
373
+ rv_op_vmxnor_mm = 733,
374
+ rv_op_vcpop_m = 734,
375
+ rv_op_vfirst_m = 735,
376
+ rv_op_vmsbf_m = 736,
377
+ rv_op_vmsif_m = 737,
378
+ rv_op_vmsof_m = 738,
379
+ rv_op_viota_m = 739,
380
+ rv_op_vid_v = 740,
381
+ rv_op_vmv_x_s = 741,
382
+ rv_op_vmv_s_x = 742,
383
+ rv_op_vfmv_f_s = 743,
384
+ rv_op_vfmv_s_f = 744,
385
+ rv_op_vslideup_vx = 745,
386
+ rv_op_vslideup_vi = 746,
387
+ rv_op_vslide1up_vx = 747,
388
+ rv_op_vslidedown_vx = 748,
389
+ rv_op_vslidedown_vi = 749,
390
+ rv_op_vslide1down_vx = 750,
391
+ rv_op_vrgather_vv = 751,
392
+ rv_op_vrgatherei16_vv = 752,
393
+ rv_op_vrgather_vx = 753,
394
+ rv_op_vrgather_vi = 754,
395
+ rv_op_vcompress_vm = 755,
396
+ rv_op_vmv1r_v = 756,
397
+ rv_op_vmv2r_v = 757,
398
+ rv_op_vmv4r_v = 758,
399
+ rv_op_vmv8r_v = 759,
400
+ rv_op_vzext_vf2 = 760,
401
+ rv_op_vzext_vf4 = 761,
402
+ rv_op_vzext_vf8 = 762,
403
+ rv_op_vsext_vf2 = 763,
404
+ rv_op_vsext_vf4 = 764,
405
+ rv_op_vsext_vf8 = 765,
406
+ rv_op_vsetvli = 766,
407
+ rv_op_vsetivli = 767,
408
+ rv_op_vsetvl = 768,
409
} rv_op;
410
411
/* structures */
412
@@ -XXX,XX +XXX,XX @@ typedef struct {
413
uint8_t rl;
414
uint8_t bs;
415
uint8_t rnum;
416
+ uint8_t vm;
417
+ uint32_t vzimm;
418
} rv_decode;
419
420
typedef struct {
421
@@ -XXX,XX +XXX,XX @@ static const char rv_freg_name_sym[32][5] = {
422
"fs8", "fs9", "fs10", "fs11", "ft8", "ft9", "ft10", "ft11",
423
};
424
425
+static const char rv_vreg_name_sym[32][4] = {
426
+ "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
427
+ "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
428
+ "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
429
+ "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
430
+};
431
+
432
/* instruction formats */
433
434
#define rv_fmt_none "O\t"
435
@@ -XXX,XX +XXX,XX @@ static const char rv_freg_name_sym[32][5] = {
436
#define rv_fmt_rs2_offset "O\t2,o"
437
#define rv_fmt_rs1_rs2_bs "O\t1,2,b"
438
#define rv_fmt_rd_rs1_rnum "O\t0,1,n"
439
+#define rv_fmt_ldst_vd_rs1_vm "O\tD,(1)m"
440
+#define rv_fmt_ldst_vd_rs1_rs2_vm "O\tD,(1),2m"
441
+#define rv_fmt_ldst_vd_rs1_vs2_vm "O\tD,(1),Fm"
442
+#define rv_fmt_vd_vs2_vs1 "O\tD,F,E"
443
+#define rv_fmt_vd_vs2_vs1_vl "O\tD,F,El"
444
+#define rv_fmt_vd_vs2_vs1_vm "O\tD,F,Em"
445
+#define rv_fmt_vd_vs2_rs1_vl "O\tD,F,1l"
446
+#define rv_fmt_vd_vs2_fs1_vl "O\tD,F,4l"
447
+#define rv_fmt_vd_vs2_rs1_vm "O\tD,F,1m"
448
+#define rv_fmt_vd_vs2_fs1_vm "O\tD,F,4m"
449
+#define rv_fmt_vd_vs2_imm_vl "O\tD,F,il"
450
+#define rv_fmt_vd_vs2_imm_vm "O\tD,F,im"
451
+#define rv_fmt_vd_vs2_uimm_vm "O\tD,F,um"
452
+#define rv_fmt_vd_vs1_vs2_vm "O\tD,E,Fm"
453
+#define rv_fmt_vd_rs1_vs2_vm "O\tD,1,Fm"
454
+#define rv_fmt_vd_fs1_vs2_vm "O\tD,4,Fm"
455
+#define rv_fmt_vd_vs1 "O\tD,E"
456
+#define rv_fmt_vd_rs1 "O\tD,1"
457
+#define rv_fmt_vd_fs1 "O\tD,4"
458
+#define rv_fmt_vd_imm "O\tD,i"
459
+#define rv_fmt_vd_vs2 "O\tD,F"
460
+#define rv_fmt_vd_vs2_vm "O\tD,Fm"
461
+#define rv_fmt_rd_vs2_vm "O\t0,Fm"
462
+#define rv_fmt_rd_vs2 "O\t0,F"
463
+#define rv_fmt_fd_vs2 "O\t3,F"
464
+#define rv_fmt_vd_vm "O\tDm"
465
+#define rv_fmt_vsetvli "O\t0,1,v"
466
+#define rv_fmt_vsetivli "O\t0,u,v"
467
468
/* pseudo-instruction constraints */
469
470
@@ -XXX,XX +XXX,XX @@ const rv_opcode_data opcode_data[] = {
471
{ "unzip", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
472
{ "zip", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
473
{ "xperm4", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
474
- { "xperm8", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 }
475
+ { "xperm8", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
476
+ { "vle8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle8_v, rv_op_vle8_v, 0 },
477
+ { "vle16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle16_v, rv_op_vle16_v, 0 },
478
+ { "vle32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle32_v, rv_op_vle32_v, 0 },
479
+ { "vle64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle64_v, rv_op_vle64_v, 0 },
480
+ { "vse8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse8_v, rv_op_vse8_v, 0 },
481
+ { "vse16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse16_v, rv_op_vse16_v, 0 },
482
+ { "vse32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse32_v, rv_op_vse32_v, 0 },
483
+ { "vse64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse64_v, rv_op_vse64_v, 0 },
484
+ { "vlm.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vlm_v, rv_op_vlm_v, 0 },
485
+ { "vsm.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vsm_v, rv_op_vsm_v, 0 },
486
+ { "vlse8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse8_v, rv_op_vlse8_v, 0 },
487
+ { "vlse16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse16_v, rv_op_vlse16_v, 0 },
488
+ { "vlse32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse32_v, rv_op_vlse32_v, 0 },
489
+ { "vlse64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse64_v, rv_op_vlse64_v, 0 },
490
+ { "vsse8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse8_v, rv_op_vsse8_v, 0 },
491
+ { "vsse16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse16_v, rv_op_vsse16_v, 0 },
492
+ { "vsse32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse32_v, rv_op_vsse32_v, 0 },
493
+ { "vsse64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse64_v, rv_op_vsse64_v, 0 },
494
+ { "vluxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei8_v, rv_op_vluxei8_v, 0 },
495
+ { "vluxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei16_v, rv_op_vluxei16_v, 0 },
496
+ { "vluxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei32_v, rv_op_vluxei32_v, 0 },
497
+ { "vluxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei64_v, rv_op_vluxei64_v, 0 },
498
+ { "vloxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei8_v, rv_op_vloxei8_v, 0 },
499
+ { "vloxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei16_v, rv_op_vloxei16_v, 0 },
500
+ { "vloxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei32_v, rv_op_vloxei32_v, 0 },
501
+ { "vloxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei64_v, rv_op_vloxei64_v, 0 },
502
+ { "vsuxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei8_v, rv_op_vsuxei8_v, 0 },
503
+ { "vsuxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei16_v, rv_op_vsuxei16_v, 0 },
504
+ { "vsuxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei32_v, rv_op_vsuxei32_v, 0 },
505
+ { "vsuxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei64_v, rv_op_vsuxei64_v, 0 },
506
+ { "vsoxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei8_v, rv_op_vsoxei8_v, 0 },
507
+ { "vsoxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei16_v, rv_op_vsoxei16_v, 0 },
508
+ { "vsoxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei32_v, rv_op_vsoxei32_v, 0 },
509
+ { "vsoxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei64_v, rv_op_vsoxei64_v, 0 },
510
+ { "vle8ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle8ff_v, rv_op_vle8ff_v, 0 },
511
+ { "vle16ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle16ff_v, rv_op_vle16ff_v, 0 },
512
+ { "vle32ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle32ff_v, rv_op_vle32ff_v, 0 },
513
+ { "vle64ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle64ff_v, rv_op_vle64ff_v, 0 },
514
+ { "vl1re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re8_v, rv_op_vl1re8_v, 0 },
515
+ { "vl1re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re16_v, rv_op_vl1re16_v, 0 },
516
+ { "vl1re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re32_v, rv_op_vl1re32_v, 0 },
517
+ { "vl1re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re64_v, rv_op_vl1re64_v, 0 },
518
+ { "vl2re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re8_v, rv_op_vl2re8_v, 0 },
519
+ { "vl2re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re16_v, rv_op_vl2re16_v, 0 },
520
+ { "vl2re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re32_v, rv_op_vl2re32_v, 0 },
521
+ { "vl2re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re64_v, rv_op_vl2re64_v, 0 },
522
+ { "vl4re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re8_v, rv_op_vl4re8_v, 0 },
523
+ { "vl4re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re16_v, rv_op_vl4re16_v, 0 },
524
+ { "vl4re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re32_v, rv_op_vl4re32_v, 0 },
525
+ { "vl4re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re64_v, rv_op_vl4re64_v, 0 },
526
+ { "vl8re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re8_v, rv_op_vl8re8_v, 0 },
527
+ { "vl8re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re16_v, rv_op_vl8re16_v, 0 },
528
+ { "vl8re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re32_v, rv_op_vl8re32_v, 0 },
529
+ { "vl8re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re64_v, rv_op_vl8re64_v, 0 },
530
+ { "vs1r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs1r_v, rv_op_vs1r_v, 0 },
531
+ { "vs2r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs2r_v, rv_op_vs2r_v, 0 },
532
+ { "vs4r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs4r_v, rv_op_vs4r_v, 0 },
533
+ { "vs8r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs8r_v, rv_op_vs8r_v, 0 },
534
+ { "vadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vadd_vv, rv_op_vadd_vv, 0 },
535
+ { "vadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vadd_vx, rv_op_vadd_vx, 0 },
536
+ { "vadd.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vadd_vi, rv_op_vadd_vi, 0 },
537
+ { "vsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsub_vv, rv_op_vsub_vv, 0 },
538
+ { "vsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsub_vx, rv_op_vsub_vx, 0 },
539
+ { "vrsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vrsub_vx, rv_op_vrsub_vx, 0 },
540
+ { "vrsub.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vrsub_vi, rv_op_vrsub_vi, 0 },
541
+ { "vwaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwaddu_vv, rv_op_vwaddu_vv, 0 },
542
+ { "vwaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwaddu_vx, rv_op_vwaddu_vx, 0 },
543
+ { "vwadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwadd_vv, rv_op_vwadd_vv, 0 },
544
+ { "vwadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwadd_vx, rv_op_vwadd_vx, 0 },
545
+ { "vwsubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsubu_vv, rv_op_vwsubu_vv, 0 },
546
+ { "vwsubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsubu_vx, rv_op_vwsubu_vx, 0 },
547
+ { "vwsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsub_vv, rv_op_vwsub_vv, 0 },
548
+ { "vwsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsub_vx, rv_op_vwsub_vx, 0 },
549
+ { "vwaddu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwaddu_wv, rv_op_vwaddu_wv, 0 },
550
+ { "vwaddu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwaddu_wx, rv_op_vwaddu_wx, 0 },
551
+ { "vwadd.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwadd_wv, rv_op_vwadd_wv, 0 },
552
+ { "vwadd.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwadd_wx, rv_op_vwadd_wx, 0 },
553
+ { "vwsubu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsubu_wv, rv_op_vwsubu_wv, 0 },
554
+ { "vwsubu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsubu_wx, rv_op_vwsubu_wx, 0 },
555
+ { "vwsub.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsub_wv, rv_op_vwsub_wv, 0 },
556
+ { "vwsub.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsub_wx, rv_op_vwsub_wx, 0 },
557
+ { "vadc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vadc_vvm, rv_op_vadc_vvm, 0 },
558
+ { "vadc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vadc_vxm, rv_op_vadc_vxm, 0 },
559
+ { "vadc.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, rv_op_vadc_vim, rv_op_vadc_vim, 0 },
560
+ { "vmadc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vmadc_vvm, rv_op_vmadc_vvm, 0 },
561
+ { "vmadc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vmadc_vxm, rv_op_vmadc_vxm, 0 },
562
+ { "vmadc.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, rv_op_vmadc_vim, rv_op_vmadc_vim, 0 },
563
+ { "vsbc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vsbc_vvm, rv_op_vsbc_vvm, 0 },
564
+ { "vsbc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vsbc_vxm, rv_op_vsbc_vxm, 0 },
565
+ { "vmsbc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vmsbc_vvm, rv_op_vmsbc_vvm, 0 },
566
+ { "vmsbc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vmsbc_vxm, rv_op_vmsbc_vxm, 0 },
567
+ { "vand.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vand_vv, rv_op_vand_vv, 0 },
568
+ { "vand.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vand_vx, rv_op_vand_vx, 0 },
569
+ { "vand.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vand_vi, rv_op_vand_vi, 0 },
570
+ { "vor.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vor_vv, rv_op_vor_vv, 0 },
571
+ { "vor.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vor_vx, rv_op_vor_vx, 0 },
572
+ { "vor.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vor_vi, rv_op_vor_vi, 0 },
573
+ { "vxor.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vxor_vv, rv_op_vxor_vv, 0 },
574
+ { "vxor.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vxor_vx, rv_op_vxor_vx, 0 },
575
+ { "vxor.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vxor_vi, rv_op_vxor_vi, 0 },
576
+ { "vsll.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsll_vv, rv_op_vsll_vv, 0 },
577
+ { "vsll.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsll_vx, rv_op_vsll_vx, 0 },
578
+ { "vsll.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vsll_vi, rv_op_vsll_vi, 0 },
579
+ { "vsrl.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsrl_vv, rv_op_vsrl_vv, 0 },
580
+ { "vsrl.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsrl_vx, rv_op_vsrl_vx, 0 },
581
+ { "vsrl.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vsrl_vi, rv_op_vsrl_vi, 0 },
582
+ { "vsra.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsra_vv, rv_op_vsra_vv, 0 },
583
+ { "vsra.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsra_vx, rv_op_vsra_vx, 0 },
584
+ { "vsra.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vsra_vi, rv_op_vsra_vi, 0 },
585
+ { "vnsrl.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnsrl_wv, rv_op_vnsrl_wv, 0 },
586
+ { "vnsrl.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnsrl_wx, rv_op_vnsrl_wx, 0 },
587
+ { "vnsrl.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnsrl_wi, rv_op_vnsrl_wi, 0 },
588
+ { "vnsra.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnsra_wv, rv_op_vnsra_wv, 0 },
589
+ { "vnsra.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnsra_wx, rv_op_vnsra_wx, 0 },
590
+ { "vnsra.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnsra_wi, rv_op_vnsra_wi, 0 },
591
+ { "vmseq.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmseq_vv, rv_op_vmseq_vv, 0 },
592
+ { "vmseq.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmseq_vx, rv_op_vmseq_vx, 0 },
593
+ { "vmseq.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmseq_vi, rv_op_vmseq_vi, 0 },
594
+ { "vmsne.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsne_vv, rv_op_vmsne_vv, 0 },
595
+ { "vmsne.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsne_vx, rv_op_vmsne_vx, 0 },
596
+ { "vmsne.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsne_vi, rv_op_vmsne_vi, 0 },
597
+ { "vmsltu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsltu_vv, rv_op_vmsltu_vv, 0 },
598
+ { "vmsltu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsltu_vx, rv_op_vmsltu_vx, 0 },
599
+ { "vmslt.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmslt_vv, rv_op_vmslt_vv, 0 },
600
+ { "vmslt.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmslt_vx, rv_op_vmslt_vx, 0 },
601
+ { "vmsleu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsleu_vv, rv_op_vmsleu_vv, 0 },
602
+ { "vmsleu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsleu_vx, rv_op_vmsleu_vx, 0 },
603
+ { "vmsleu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsleu_vi, rv_op_vmsleu_vi, 0 },
604
+ { "vmsle.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsle_vv, rv_op_vmsle_vv, 0 },
605
+ { "vmsle.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsle_vx, rv_op_vmsle_vx, 0 },
606
+ { "vmsle.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsle_vi, rv_op_vmsle_vi, 0 },
607
+ { "vmsgtu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsgtu_vx, rv_op_vmsgtu_vx, 0 },
608
+ { "vmsgtu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsgtu_vi, rv_op_vmsgtu_vi, 0 },
609
+ { "vmsgt.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsgt_vx, rv_op_vmsgt_vx, 0 },
610
+ { "vmsgt.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsgt_vi, rv_op_vmsgt_vi, 0 },
611
+ { "vminu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vminu_vv, rv_op_vminu_vv, 0 },
612
+ { "vminu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vminu_vx, rv_op_vminu_vx, 0 },
613
+ { "vmin.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmin_vv, rv_op_vmin_vv, 0 },
614
+ { "vmin.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmin_vx, rv_op_vmin_vx, 0 },
615
+ { "vmaxu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmaxu_vv, rv_op_vmaxu_vv, 0 },
616
+ { "vmaxu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmaxu_vx, rv_op_vmaxu_vx, 0 },
617
+ { "vmax.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmax_vv, rv_op_vmax_vv, 0 },
618
+ { "vmax.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmax_vx, rv_op_vmax_vx, 0 },
619
+ { "vmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmul_vv, rv_op_vmul_vv, 0 },
620
+ { "vmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmul_vx, rv_op_vmul_vx, 0 },
621
+ { "vmulh.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmulh_vv, rv_op_vmulh_vv, 0 },
622
+ { "vmulh.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmulh_vx, rv_op_vmulh_vx, 0 },
623
+ { "vmulhu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmulhu_vv, rv_op_vmulhu_vv, 0 },
624
+ { "vmulhu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmulhu_vx, rv_op_vmulhu_vx, 0 },
625
+ { "vmulhsu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmulhsu_vv, rv_op_vmulhsu_vv, 0 },
626
+ { "vmulhsu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmulhsu_vx, rv_op_vmulhsu_vx, 0 },
627
+ { "vdivu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vdivu_vv, rv_op_vdivu_vv, 0 },
628
+ { "vdivu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vdivu_vx, rv_op_vdivu_vx, 0 },
629
+ { "vdiv.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vdiv_vv, rv_op_vdiv_vv, 0 },
630
+ { "vdiv.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vdiv_vx, rv_op_vdiv_vx, 0 },
631
+ { "vremu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vremu_vv, rv_op_vremu_vv, 0 },
632
+ { "vremu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vremu_vx, rv_op_vremu_vx, 0 },
633
+ { "vrem.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vrem_vv, rv_op_vrem_vv, 0 },
634
+ { "vrem.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vrem_vx, rv_op_vrem_vx, 0 },
635
+ { "vwmulu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwmulu_vv, rv_op_vwmulu_vv, 0 },
636
+ { "vwmulu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwmulu_vx, rv_op_vwmulu_vx, 0 },
637
+ { "vwmulsu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwmulsu_vv, rv_op_vwmulsu_vv, 0 },
638
+ { "vwmulsu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwmulsu_vx, rv_op_vwmulsu_vx, 0 },
639
+ { "vwmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwmul_vv, rv_op_vwmul_vv, 0 },
640
+ { "vwmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwmul_vx, rv_op_vwmul_vx, 0 },
641
+ { "vmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vmacc_vv, rv_op_vmacc_vv, 0 },
642
+ { "vmacc.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vmacc_vx, rv_op_vmacc_vx, 0 },
643
+ { "vnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vnmsac_vv, rv_op_vnmsac_vv, 0 },
644
+ { "vnmsac.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vnmsac_vx, rv_op_vnmsac_vx, 0 },
645
+ { "vmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vmadd_vv, rv_op_vmadd_vv, 0 },
646
+ { "vmadd.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vmadd_vx, rv_op_vmadd_vx, 0 },
647
+ { "vnmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vnmsub_vv, rv_op_vnmsub_vv, 0 },
648
+ { "vnmsub.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vnmsub_vx, rv_op_vnmsub_vx, 0 },
649
+ { "vwmaccu.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vwmaccu_vv, rv_op_vwmaccu_vv, 0 },
650
+ { "vwmaccu.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmaccu_vx, rv_op_vwmaccu_vx, 0 },
651
+ { "vwmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vwmacc_vv, rv_op_vwmacc_vv, 0 },
652
+ { "vwmacc.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmacc_vx, rv_op_vwmacc_vx, 0 },
653
+ { "vwmaccsu.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vwmaccsu_vv, rv_op_vwmaccsu_vv, 0 },
654
+ { "vwmaccsu.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmaccsu_vx, rv_op_vwmaccsu_vx, 0 },
655
+ { "vwmaccus.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmaccus_vx, rv_op_vwmaccus_vx, 0 },
656
+ { "vmv.v.v", rv_codec_v_r, rv_fmt_vd_vs1, NULL, rv_op_vmv_v_v, rv_op_vmv_v_v, 0 },
657
+ { "vmv.v.x", rv_codec_v_r, rv_fmt_vd_rs1, NULL, rv_op_vmv_v_x, rv_op_vmv_v_x, 0 },
658
+ { "vmv.v.i", rv_codec_v_i, rv_fmt_vd_imm, NULL, rv_op_vmv_v_i, rv_op_vmv_v_i, 0 },
659
+ { "vmerge.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vmerge_vvm, rv_op_vmerge_vvm, 0 },
660
+ { "vmerge.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vmerge_vxm, rv_op_vmerge_vxm, 0 },
661
+ { "vmerge.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, rv_op_vmerge_vim, rv_op_vmerge_vim, 0 },
662
+ { "vsaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsaddu_vv, rv_op_vsaddu_vv, 0 },
663
+ { "vsaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsaddu_vx, rv_op_vsaddu_vx, 0 },
664
+ { "vsaddu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vsaddu_vi, rv_op_vsaddu_vi, 0 },
665
+ { "vsadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsadd_vv, rv_op_vsadd_vv, 0 },
666
+ { "vsadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsadd_vx, rv_op_vsadd_vx, 0 },
667
+ { "vsadd.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vsadd_vi, rv_op_vsadd_vi, 0 },
668
+ { "vssubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssubu_vv, rv_op_vssubu_vv, 0 },
669
+ { "vssubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssubu_vx, rv_op_vssubu_vx, 0 },
670
+ { "vssub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssub_vv, rv_op_vssub_vv, 0 },
671
+ { "vssub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssub_vx, rv_op_vssub_vx, 0 },
672
+ { "vaadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vaadd_vv, rv_op_vaadd_vv, 0 },
673
+ { "vaadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vaadd_vx, rv_op_vaadd_vx, 0 },
674
+ { "vaaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vaaddu_vv, rv_op_vaaddu_vv, 0 },
675
+ { "vaaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vaaddu_vx, rv_op_vaaddu_vx, 0 },
676
+ { "vasub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vasub_vv, rv_op_vasub_vv, 0 },
677
+ { "vasub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vasub_vx, rv_op_vasub_vx, 0 },
678
+ { "vasubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vasubu_vv, rv_op_vasubu_vv, 0 },
679
+ { "vasubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vasubu_vx, rv_op_vasubu_vx, 0 },
680
+ { "vsmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsmul_vv, rv_op_vsmul_vv, 0 },
681
+ { "vsmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsmul_vx, rv_op_vsmul_vx, 0 },
682
+ { "vssrl.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssrl_vv, rv_op_vssrl_vv, 0 },
683
+ { "vssrl.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssrl_vx, rv_op_vssrl_vx, 0 },
684
+ { "vssrl.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vssrl_vi, rv_op_vssrl_vi, 0 },
685
+ { "vssra.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssra_vv, rv_op_vssra_vv, 0 },
686
+ { "vssra.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssra_vx, rv_op_vssra_vx, 0 },
687
+ { "vssra.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vssra_vi, rv_op_vssra_vi, 0 },
688
+ { "vnclipu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnclipu_wv, rv_op_vnclipu_wv, 0 },
689
+ { "vnclipu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnclipu_wx, rv_op_vnclipu_wx, 0 },
690
+ { "vnclipu.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnclipu_wi, rv_op_vnclipu_wi, 0 },
691
+ { "vnclip.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnclip_wv, rv_op_vnclip_wv, 0 },
692
+ { "vnclip.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnclip_wx, rv_op_vnclip_wx, 0 },
693
+ { "vnclip.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnclip_wi, rv_op_vnclip_wi, 0 },
694
+ { "vfadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfadd_vv, rv_op_vfadd_vv, 0 },
695
+ { "vfadd.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfadd_vf, rv_op_vfadd_vf, 0 },
696
+ { "vfsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsub_vv, rv_op_vfsub_vv, 0 },
697
+ { "vfsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsub_vf, rv_op_vfsub_vf, 0 },
698
+ { "vfrsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfrsub_vf, rv_op_vfrsub_vf, 0 },
699
+ { "vfwadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwadd_vv, rv_op_vfwadd_vv, 0 },
700
+ { "vfwadd.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwadd_vf, rv_op_vfwadd_vf, 0 },
701
+ { "vfwadd.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwadd_wv, rv_op_vfwadd_wv, 0 },
702
+ { "vfwadd.wf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwadd_wf, rv_op_vfwadd_wf, 0 },
703
+ { "vfwsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwsub_vv, rv_op_vfwsub_vv, 0 },
704
+ { "vfwsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwsub_vf, rv_op_vfwsub_vf, 0 },
705
+ { "vfwsub.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwsub_wv, rv_op_vfwsub_wv, 0 },
706
+ { "vfwsub.wf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwsub_wf, rv_op_vfwsub_wf, 0 },
707
+ { "vfmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfmul_vv, rv_op_vfmul_vv, 0 },
708
+ { "vfmul.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfmul_vf, rv_op_vfmul_vf, 0 },
709
+ { "vfdiv.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfdiv_vv, rv_op_vfdiv_vv, 0 },
710
+ { "vfdiv.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfdiv_vf, rv_op_vfdiv_vf, 0 },
711
+ { "vfrdiv.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfrdiv_vf, rv_op_vfrdiv_vf, 0 },
712
+ { "vfwmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwmul_vv, rv_op_vfwmul_vv, 0 },
713
+ { "vfwmul.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwmul_vf, rv_op_vfwmul_vf, 0 },
714
+ { "vfmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmacc_vv, rv_op_vfmacc_vv, 0 },
715
+ { "vfmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmacc_vf, rv_op_vfmacc_vf, 0 },
716
+ { "vfnmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmacc_vv, rv_op_vfnmacc_vv, 0 },
717
+ { "vfnmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmacc_vf, rv_op_vfnmacc_vf, 0 },
718
+ { "vfmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmsac_vv, rv_op_vfmsac_vv, 0 },
719
+ { "vfmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmsac_vf, rv_op_vfmsac_vf, 0 },
720
+ { "vfnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmsac_vv, rv_op_vfnmsac_vv, 0 },
721
+ { "vfnmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmsac_vf, rv_op_vfnmsac_vf, 0 },
722
+ { "vfmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmadd_vv, rv_op_vfmadd_vv, 0 },
723
+ { "vfmadd.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmadd_vf, rv_op_vfmadd_vf, 0 },
724
+ { "vfnmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmadd_vv, rv_op_vfnmadd_vv, 0 },
725
+ { "vfnmadd.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmadd_vf, rv_op_vfnmadd_vf, 0 },
726
+ { "vfmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmsub_vv, rv_op_vfmsub_vv, 0 },
727
+ { "vfmsub.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmsub_vf, rv_op_vfmsub_vf, 0 },
728
+ { "vfnmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmsub_vv, rv_op_vfnmsub_vv, 0 },
729
+ { "vfnmsub.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmsub_vf, rv_op_vfnmsub_vf, 0 },
730
+ { "vfwmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwmacc_vv, rv_op_vfwmacc_vv, 0 },
731
+ { "vfwmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwmacc_vf, rv_op_vfwmacc_vf, 0 },
732
+ { "vfwnmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwnmacc_vv, rv_op_vfwnmacc_vv, 0 },
733
+ { "vfwnmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwnmacc_vf, rv_op_vfwnmacc_vf, 0 },
734
+ { "vfwmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwmsac_vv, rv_op_vfwmsac_vv, 0 },
735
+ { "vfwmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwmsac_vf, rv_op_vfwmsac_vf, 0 },
736
+ { "vfwnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwnmsac_vv, rv_op_vfwnmsac_vv, 0 },
737
+ { "vfwnmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwnmsac_vf, rv_op_vfwnmsac_vf, 0 },
738
+ { "vfsqrt.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vfsqrt_v, rv_op_vfsqrt_v, 0 },
739
+ { "vfrsqrt7.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vfrsqrt7_v, rv_op_vfrsqrt7_v, 0 },
740
+ { "vfrec7.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vfrec7_v, rv_op_vfrec7_v, 0 },
741
+ { "vfmin.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfmin_vv, rv_op_vfmin_vv, 0 },
742
+ { "vfmin.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfmin_vf, rv_op_vfmin_vf, 0 },
743
+ { "vfmax.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfmax_vv, rv_op_vfmax_vv, 0 },
744
+ { "vfmax.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfmax_vf, rv_op_vfmax_vf, 0 },
745
+ { "vfsgnj.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsgnj_vv, rv_op_vfsgnj_vv, 0 },
746
+ { "vfsgnj.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsgnj_vf, rv_op_vfsgnj_vf, 0 },
747
+ { "vfsgnjn.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsgnjn_vv, rv_op_vfsgnjn_vv, 0 },
748
+ { "vfsgnjn.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsgnjn_vf, rv_op_vfsgnjn_vf, 0 },
749
+ { "vfsgnjx.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsgnjx_vv, rv_op_vfsgnjx_vv, 0 },
750
+ { "vfsgnjx.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsgnjx_vf, rv_op_vfsgnjx_vf, 0 },
751
+ { "vfslide1up.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfslide1up_vf, rv_op_vfslide1up_vf, 0 },
752
+ { "vfslide1down.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfslide1down_vf, rv_op_vfslide1down_vf, 0 },
753
+ { "vmfeq.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmfeq_vv, rv_op_vmfeq_vv, 0 },
754
+ { "vmfeq.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfeq_vf, rv_op_vmfeq_vf, 0 },
755
+ { "vmfne.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmfne_vv, rv_op_vmfne_vv, 0 },
756
+ { "vmfne.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfne_vf, rv_op_vmfne_vf, 0 },
757
+ { "vmflt.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmflt_vv, rv_op_vmflt_vv, 0 },
758
+ { "vmflt.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmflt_vf, rv_op_vmflt_vf, 0 },
759
+ { "vmfle.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmfle_vv, rv_op_vmfle_vv, 0 },
760
+ { "vmfle.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfle_vf, rv_op_vmfle_vf, 0 },
761
+ { "vmfgt.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfgt_vf, rv_op_vmfgt_vf, 0 },
762
+ { "vmfge.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfge_vf, rv_op_vmfge_vf, 0 },
763
+ { "vfclass.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfclass_v, rv_op_vfclass_v, 0 },
764
+ { "vfmerge.vfm", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vl, NULL, rv_op_vfmerge_vfm, rv_op_vfmerge_vfm, 0 },
765
+ { "vfmv.v.f", rv_codec_v_r, rv_fmt_vd_fs1, NULL, rv_op_vfmv_v_f, rv_op_vfmv_v_f, 0 },
766
+ { "vfcvt.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_xu_f_v, rv_op_vfcvt_xu_f_v, 0 },
767
+ { "vfcvt.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_x_f_v, rv_op_vfcvt_x_f_v, 0 },
768
+ { "vfcvt.f.xu.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_f_xu_v, rv_op_vfcvt_f_xu_v, 0 },
769
+ { "vfcvt.f.x.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_f_x_v, rv_op_vfcvt_f_x_v, 0 },
770
+ { "vfcvt.rtz.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_rtz_xu_f_v, rv_op_vfcvt_rtz_xu_f_v, 0 },
771
+ { "vfcvt.rtz.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_rtz_x_f_v, rv_op_vfcvt_rtz_x_f_v, 0 },
772
+ { "vfwcvt.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_xu_f_v, rv_op_vfwcvt_xu_f_v, 0 },
773
+ { "vfwcvt.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_x_f_v, rv_op_vfwcvt_x_f_v, 0 },
774
+ { "vfwcvt.f.xu.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_f_xu_v, rv_op_vfwcvt_f_xu_v, 0 },
775
+ { "vfwcvt.f.x.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_f_x_v, rv_op_vfwcvt_f_x_v, 0 },
776
+ { "vfwcvt.f.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_f_f_v, rv_op_vfwcvt_f_f_v, 0 },
777
+ { "vfwcvt.rtz.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_rtz_xu_f_v, rv_op_vfwcvt_rtz_xu_f_v, 0 },
778
+ { "vfwcvt.rtz.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_rtz_x_f_v, rv_op_vfwcvt_rtz_x_f_v, 0 },
779
+ { "vfncvt.xu.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_xu_f_w, rv_op_vfncvt_xu_f_w, 0 },
780
+ { "vfncvt.x.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_x_f_w, rv_op_vfncvt_x_f_w, 0 },
781
+ { "vfncvt.f.xu.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_f_xu_w, rv_op_vfncvt_f_xu_w, 0 },
782
+ { "vfncvt.f.x.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_f_x_w, rv_op_vfncvt_f_x_w, 0 },
783
+ { "vfncvt.f.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_f_f_w, rv_op_vfncvt_f_f_w, 0 },
784
+ { "vfncvt.rod.f.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_rod_f_f_w, rv_op_vfncvt_rod_f_f_w, 0 },
785
+ { "vfncvt.rtz.xu.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_rtz_xu_f_w, rv_op_vfncvt_rtz_xu_f_w, 0 },
786
+ { "vfncvt.rtz.x.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_rtz_x_f_w, rv_op_vfncvt_rtz_x_f_w, 0 },
787
+ { "vredsum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredsum_vs, rv_op_vredsum_vs, 0 },
788
+ { "vredand.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredand_vs, rv_op_vredand_vs, 0 },
789
+ { "vredor.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredor_vs, rv_op_vredor_vs, 0 },
790
+ { "vredxor.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredxor_vs, rv_op_vredxor_vs, 0 },
791
+ { "vredminu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredminu_vs, rv_op_vredminu_vs, 0 },
792
+ { "vredmin.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredmin_vs, rv_op_vredmin_vs, 0 },
793
+ { "vredmaxu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredmaxu_vs, rv_op_vredmaxu_vs, 0 },
794
+ { "vredmax.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredmax_vs, rv_op_vredmax_vs, 0 },
795
+ { "vwredsumu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwredsumu_vs, rv_op_vwredsumu_vs, 0 },
796
+ { "vwredsum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwredsum_vs, rv_op_vwredsum_vs, 0 },
797
+ { "vfredusum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredusum_vs, rv_op_vfredusum_vs, 0 },
798
+ { "vfredosum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredosum_vs, rv_op_vfredosum_vs, 0 },
799
+ { "vfredmin.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredmin_vs, rv_op_vfredmin_vs, 0 },
800
+ { "vfredmax.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredmax_vs, rv_op_vfredmax_vs, 0 },
801
+ { "vfwredusum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwredusum_vs, rv_op_vfwredusum_vs, 0 },
802
+ { "vfwredosum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwredosum_vs, rv_op_vfwredosum_vs, 0 },
803
+ { "vmand.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmand_mm, rv_op_vmand_mm, 0 },
804
+ { "vmnand.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmnand_mm, rv_op_vmnand_mm, 0 },
805
+ { "vmandn.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmandn_mm, rv_op_vmandn_mm, 0 },
806
+ { "vmxor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmxor_mm, rv_op_vmxor_mm, 0 },
807
+ { "vmor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmor_mm, rv_op_vmor_mm, 0 },
808
+ { "vmnor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmnor_mm, rv_op_vmnor_mm, 0 },
809
+ { "vmorn.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmorn_mm, rv_op_vmorn_mm, 0 },
810
+ { "vmxnor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmxnor_mm, rv_op_vmxnor_mm, 0 },
811
+ { "vcpop.m", rv_codec_v_r, rv_fmt_rd_vs2_vm, NULL, rv_op_vcpop_m, rv_op_vcpop_m, 0 },
812
+ { "vfirst.m", rv_codec_v_r, rv_fmt_rd_vs2_vm, NULL, rv_op_vfirst_m, rv_op_vfirst_m, 0 },
813
+ { "vmsbf.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vmsbf_m, rv_op_vmsbf_m, 0 },
814
+ { "vmsif.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vmsif_m, rv_op_vmsif_m, 0 },
815
+ { "vmsof.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vmsof_m, rv_op_vmsof_m, 0 },
816
+ { "viota.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_viota_m, rv_op_viota_m, 0 },
817
+ { "vid.v", rv_codec_v_r, rv_fmt_vd_vm, NULL, rv_op_vid_v, rv_op_vid_v, 0 },
818
+ { "vmv.x.s", rv_codec_v_r, rv_fmt_rd_vs2, NULL, rv_op_vmv_x_s, rv_op_vmv_x_s, 0 },
819
+ { "vmv.s.x", rv_codec_v_r, rv_fmt_vd_rs1, NULL, rv_op_vmv_s_x, rv_op_vmv_s_x, 0 },
820
+ { "vfmv.f.s", rv_codec_v_r, rv_fmt_fd_vs2, NULL, rv_op_vfmv_f_s, rv_op_vfmv_f_s, 0 },
821
+ { "vfmv.s.f", rv_codec_v_r, rv_fmt_vd_fs1, NULL, rv_op_vfmv_s_f, rv_op_vfmv_s_f, 0 },
822
+ { "vslideup.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslideup_vx, rv_op_vslideup_vx, 0 },
823
+ { "vslideup.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vslideup_vi, rv_op_vslideup_vi, 0 },
824
+ { "vslide1up.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslide1up_vx, rv_op_vslide1up_vx, 0 },
825
+ { "vslidedown.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslidedown_vx, rv_op_vslidedown_vx, 0 },
826
+ { "vslidedown.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vslidedown_vi, rv_op_vslidedown_vi, 0 },
827
+ { "vslide1down.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslide1down_vx, rv_op_vslide1down_vx, 0 },
828
+ { "vrgather.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vrgather_vv, rv_op_vrgather_vv, 0 },
829
+ { "vrgatherei16.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vrgatherei16_vv, rv_op_vrgatherei16_vv, 0 },
830
+ { "vrgather.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vrgather_vx, rv_op_vrgather_vx, 0 },
831
+ { "vrgather.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vrgather_vi, rv_op_vrgather_vi, 0 },
832
+ { "vcompress.vm", rv_codec_v_r, rv_fmt_vd_vs2_vs1, NULL, rv_op_vcompress_vm, rv_op_vcompress_vm, 0 },
833
+ { "vmv1r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv1r_v, rv_op_vmv1r_v, 0 },
834
+ { "vmv2r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv2r_v, rv_op_vmv2r_v, 0 },
835
+ { "vmv4r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv4r_v, rv_op_vmv4r_v, 0 },
836
+ { "vmv8r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv8r_v, rv_op_vmv8r_v, 0 },
837
+ { "vzext.vf2", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vzext_vf2, rv_op_vzext_vf2, 0 },
838
+ { "vzext.vf4", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vzext_vf4, rv_op_vzext_vf4, 0 },
839
+ { "vzext.vf8", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vzext_vf8, rv_op_vzext_vf8, 0 },
840
+ { "vsext.vf2", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vsext_vf2, rv_op_vsext_vf2, 0 },
841
+ { "vsext.vf4", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vsext_vf4, rv_op_vsext_vf4, 0 },
842
+ { "vsext.vf8", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vsext_vf8, rv_op_vsext_vf8, 0 },
843
+ { "vsetvli", rv_codec_vsetvli, rv_fmt_vsetvli, NULL, rv_op_vsetvli, rv_op_vsetvli, 0 },
844
+ { "vsetivli", rv_codec_vsetivli, rv_fmt_vsetivli, NULL, rv_op_vsetivli, rv_op_vsetivli, 0 },
845
+ { "vsetvl", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, rv_op_vsetvl, rv_op_vsetvl, 0 }
846
};
847
848
/* CSR names */
849
@@ -XXX,XX +XXX,XX @@ static const char *csr_name(int csrno)
850
case 0x0003: return "fcsr";
851
case 0x0004: return "uie";
852
case 0x0005: return "utvec";
853
+ case 0x0008: return "vstart";
854
+ case 0x0009: return "vxsat";
855
+ case 0x000a: return "vxrm";
856
+ case 0x000f: return "vcsr";
857
case 0x0015: return "seed";
858
case 0x0040: return "uscratch";
859
case 0x0041: return "uepc";
860
@@ -XXX,XX +XXX,XX @@ static const char *csr_name(int csrno)
861
case 0x0c00: return "cycle";
862
case 0x0c01: return "time";
863
case 0x0c02: return "instret";
864
+ case 0x0c20: return "vl";
865
+ case 0x0c21: return "vtype";
866
+ case 0x0c22: return "vlenb";
867
case 0x0c80: return "cycleh";
868
case 0x0c81: return "timeh";
869
case 0x0c82: return "instreth";
870
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
871
break;
872
case 1:
873
switch (((inst >> 12) & 0b111)) {
874
+ case 0:
875
+ switch (((inst >> 20) & 0b111111111111)) {
876
+ case 40: op = rv_op_vl1re8_v; break;
877
+ case 552: op = rv_op_vl2re8_v; break;
878
+ case 1576: op = rv_op_vl4re8_v; break;
879
+ case 3624: op = rv_op_vl8re8_v; break;
880
+ }
881
+ switch (((inst >> 26) & 0b111)) {
882
+ case 0:
883
+ switch (((inst >> 20) & 0b11111)) {
884
+ case 0: op = rv_op_vle8_v; break;
885
+ case 11: op = rv_op_vlm_v; break;
886
+ case 16: op = rv_op_vle8ff_v; break;
887
+ }
888
+ break;
889
+ case 1: op = rv_op_vluxei8_v; break;
890
+ case 2: op = rv_op_vlse8_v; break;
891
+ case 3: op = rv_op_vloxei8_v; break;
892
+ }
893
+ break;
894
case 2: op = rv_op_flw; break;
895
case 3: op = rv_op_fld; break;
896
case 4: op = rv_op_flq; break;
897
+ case 5:
898
+ switch (((inst >> 20) & 0b111111111111)) {
899
+ case 40: op = rv_op_vl1re16_v; break;
900
+ case 552: op = rv_op_vl2re16_v; break;
901
+ case 1576: op = rv_op_vl4re16_v; break;
902
+ case 3624: op = rv_op_vl8re16_v; break;
903
+ }
904
+ switch (((inst >> 26) & 0b111)) {
905
+ case 0:
906
+ switch (((inst >> 20) & 0b11111)) {
907
+ case 0: op = rv_op_vle16_v; break;
908
+ case 16: op = rv_op_vle16ff_v; break;
909
+ }
910
+ break;
911
+ case 1: op = rv_op_vluxei16_v; break;
912
+ case 2: op = rv_op_vlse16_v; break;
913
+ case 3: op = rv_op_vloxei16_v; break;
914
+ }
915
+ break;
916
+ case 6:
917
+ switch (((inst >> 20) & 0b111111111111)) {
918
+ case 40: op = rv_op_vl1re32_v; break;
919
+ case 552: op = rv_op_vl2re32_v; break;
920
+ case 1576: op = rv_op_vl4re32_v; break;
921
+ case 3624: op = rv_op_vl8re32_v; break;
922
+ }
923
+ switch (((inst >> 26) & 0b111)) {
924
+ case 0:
925
+ switch (((inst >> 20) & 0b11111)) {
926
+ case 0: op = rv_op_vle32_v; break;
927
+ case 16: op = rv_op_vle32ff_v; break;
928
+ }
929
+ break;
930
+ case 1: op = rv_op_vluxei32_v; break;
931
+ case 2: op = rv_op_vlse32_v; break;
932
+ case 3: op = rv_op_vloxei32_v; break;
933
+ }
934
+ break;
935
+ case 7:
936
+ switch (((inst >> 20) & 0b111111111111)) {
937
+ case 40: op = rv_op_vl1re64_v; break;
938
+ case 552: op = rv_op_vl2re64_v; break;
939
+ case 1576: op = rv_op_vl4re64_v; break;
940
+ case 3624: op = rv_op_vl8re64_v; break;
941
+ }
942
+ switch (((inst >> 26) & 0b111)) {
943
+ case 0:
944
+ switch (((inst >> 20) & 0b11111)) {
945
+ case 0: op = rv_op_vle64_v; break;
946
+ case 16: op = rv_op_vle64ff_v; break;
947
+ }
948
+ break;
949
+ case 1: op = rv_op_vluxei64_v; break;
950
+ case 2: op = rv_op_vlse64_v; break;
951
+ case 3: op = rv_op_vloxei64_v; break;
952
+ }
953
+ break;
954
}
955
break;
956
case 3:
957
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
958
break;
959
case 9:
960
switch (((inst >> 12) & 0b111)) {
961
+ case 0:
962
+ switch (((inst >> 20) & 0b111111111111)) {
963
+ case 40: op = rv_op_vs1r_v; break;
964
+ case 552: op = rv_op_vs2r_v; break;
965
+ case 1576: op = rv_op_vs4r_v; break;
966
+ case 3624: op = rv_op_vs8r_v; break;
967
+ }
968
+ switch (((inst >> 26) & 0b111)) {
969
+ case 0:
970
+ switch (((inst >> 20) & 0b11111)) {
971
+ case 0: op = rv_op_vse8_v; break;
972
+ case 11: op = rv_op_vsm_v; break;
973
+ }
974
+ break;
975
+ case 1: op = rv_op_vsuxei8_v; break;
976
+ case 2: op = rv_op_vsse8_v; break;
977
+ case 3: op = rv_op_vsoxei8_v; break;
978
+ }
979
+ break;
980
case 2: op = rv_op_fsw; break;
981
case 3: op = rv_op_fsd; break;
982
case 4: op = rv_op_fsq; break;
983
+ case 5:
984
+ switch (((inst >> 26) & 0b111)) {
985
+ case 0:
986
+ switch (((inst >> 20) & 0b11111)) {
987
+ case 0: op = rv_op_vse16_v; break;
988
+ }
989
+ break;
990
+ case 1: op = rv_op_vsuxei16_v; break;
991
+ case 2: op = rv_op_vsse16_v; break;
992
+ case 3: op = rv_op_vsoxei16_v; break;
993
+ }
994
+ break;
995
+ case 6:
996
+ switch (((inst >> 26) & 0b111)) {
997
+ case 0:
998
+ switch (((inst >> 20) & 0b11111)) {
999
+ case 0: op = rv_op_vse32_v; break;
1000
+ }
1001
+ break;
1002
+ case 1: op = rv_op_vsuxei32_v; break;
1003
+ case 2: op = rv_op_vsse32_v; break;
1004
+ case 3: op = rv_op_vsoxei32_v; break;
1005
+ }
1006
+ break;
1007
+ case 7:
1008
+ switch (((inst >> 26) & 0b111)) {
1009
+ case 0:
1010
+ switch (((inst >> 20) & 0b11111)) {
1011
+ case 0: op = rv_op_vse64_v; break;
1012
+ }
1013
+ break;
1014
+ case 1: op = rv_op_vsuxei64_v; break;
1015
+ case 2: op = rv_op_vsse64_v; break;
1016
+ case 3: op = rv_op_vsoxei64_v; break;
1017
+ }
1018
+ break;
1019
}
1020
break;
1021
case 11:
1022
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
1023
break;
1024
}
1025
break;
1026
+ case 21:
1027
+ switch (((inst >> 12) & 0b111)) {
1028
+ case 0:
1029
+ switch (((inst >> 26) & 0b111111)) {
1030
+ case 0: op = rv_op_vadd_vv; break;
1031
+ case 2: op = rv_op_vsub_vv; break;
1032
+ case 4: op = rv_op_vminu_vv; break;
1033
+ case 5: op = rv_op_vmin_vv; break;
1034
+ case 6: op = rv_op_vmaxu_vv; break;
1035
+ case 7: op = rv_op_vmax_vv; break;
1036
+ case 9: op = rv_op_vand_vv; break;
1037
+ case 10: op = rv_op_vor_vv; break;
1038
+ case 11: op = rv_op_vxor_vv; break;
1039
+ case 12: op = rv_op_vrgather_vv; break;
1040
+ case 14: op = rv_op_vrgatherei16_vv; break;
1041
+ case 16: if (((inst >> 25) & 1) == 0) op = rv_op_vadc_vvm; break;
1042
+ case 17: op = rv_op_vmadc_vvm; break;
1043
+ case 18: if (((inst >> 25) & 1) == 0) op = rv_op_vsbc_vvm; break;
1044
+ case 19: op = rv_op_vmsbc_vvm; break;
1045
+ case 23:
1046
+ if (((inst >> 20) & 0b111111) == 32)
1047
+ op = rv_op_vmv_v_v;
1048
+ else if (((inst >> 25) & 1) == 0)
1049
+ op = rv_op_vmerge_vvm;
1050
+ break;
1051
+ case 24: op = rv_op_vmseq_vv; break;
1052
+ case 25: op = rv_op_vmsne_vv; break;
1053
+ case 26: op = rv_op_vmsltu_vv; break;
1054
+ case 27: op = rv_op_vmslt_vv; break;
1055
+ case 28: op = rv_op_vmsleu_vv; break;
1056
+ case 29: op = rv_op_vmsle_vv; break;
1057
+ case 32: op = rv_op_vsaddu_vv; break;
1058
+ case 33: op = rv_op_vsadd_vv; break;
1059
+ case 34: op = rv_op_vssubu_vv; break;
1060
+ case 35: op = rv_op_vssub_vv; break;
1061
+ case 37: op = rv_op_vsll_vv; break;
1062
+ case 39: op = rv_op_vsmul_vv; break;
1063
+ case 40: op = rv_op_vsrl_vv; break;
1064
+ case 41: op = rv_op_vsra_vv; break;
1065
+ case 42: op = rv_op_vssrl_vv; break;
1066
+ case 43: op = rv_op_vssra_vv; break;
1067
+ case 44: op = rv_op_vnsrl_wv; break;
1068
+ case 45: op = rv_op_vnsra_wv; break;
1069
+ case 46: op = rv_op_vnclipu_wv; break;
1070
+ case 47: op = rv_op_vnclip_wv; break;
1071
+ case 48: op = rv_op_vwredsumu_vs; break;
1072
+ case 49: op = rv_op_vwredsum_vs; break;
1073
+ }
1074
+ break;
1075
+ case 1:
1076
+ switch (((inst >> 26) & 0b111111)) {
1077
+ case 0: op = rv_op_vfadd_vv; break;
1078
+ case 1: op = rv_op_vfredusum_vs; break;
1079
+ case 2: op = rv_op_vfsub_vv; break;
1080
+ case 3: op = rv_op_vfredosum_vs; break;
1081
+ case 4: op = rv_op_vfmin_vv; break;
1082
+ case 5: op = rv_op_vfredmin_vs; break;
1083
+ case 6: op = rv_op_vfmax_vv; break;
1084
+ case 7: op = rv_op_vfredmax_vs; break;
1085
+ case 8: op = rv_op_vfsgnj_vv; break;
1086
+ case 9: op = rv_op_vfsgnjn_vv; break;
1087
+ case 10: op = rv_op_vfsgnjx_vv; break;
1088
+ case 16:
1089
+ switch (((inst >> 15) & 0b11111)) {
1090
+ case 0: if ((inst >> 25) & 1) op = rv_op_vfmv_f_s; break;
1091
+ }
1092
+ break;
1093
+ case 18:
1094
+ switch (((inst >> 15) & 0b11111)) {
1095
+ case 0: op = rv_op_vfcvt_xu_f_v; break;
1096
+ case 1: op = rv_op_vfcvt_x_f_v; break;
1097
+ case 2: op = rv_op_vfcvt_f_xu_v; break;
1098
+ case 3: op = rv_op_vfcvt_f_x_v; break;
1099
+ case 6: op = rv_op_vfcvt_rtz_xu_f_v; break;
1100
+ case 7: op = rv_op_vfcvt_rtz_x_f_v; break;
1101
+ case 8: op = rv_op_vfwcvt_xu_f_v; break;
1102
+ case 9: op = rv_op_vfwcvt_x_f_v; break;
1103
+ case 10: op = rv_op_vfwcvt_f_xu_v; break;
1104
+ case 11: op = rv_op_vfwcvt_f_x_v; break;
1105
+ case 12: op = rv_op_vfwcvt_f_f_v; break;
1106
+ case 14: op = rv_op_vfwcvt_rtz_xu_f_v; break;
1107
+ case 15: op = rv_op_vfwcvt_rtz_x_f_v; break;
1108
+ case 16: op = rv_op_vfncvt_xu_f_w; break;
1109
+ case 17: op = rv_op_vfncvt_x_f_w; break;
1110
+ case 18: op = rv_op_vfncvt_f_xu_w; break;
1111
+ case 19: op = rv_op_vfncvt_f_x_w; break;
1112
+ case 20: op = rv_op_vfncvt_f_f_w; break;
1113
+ case 21: op = rv_op_vfncvt_rod_f_f_w; break;
1114
+ case 22: op = rv_op_vfncvt_rtz_xu_f_w; break;
1115
+ case 23: op = rv_op_vfncvt_rtz_x_f_w; break;
1116
+ }
1117
+ break;
1118
+ case 19:
1119
+ switch (((inst >> 15) & 0b11111)) {
1120
+ case 0: op = rv_op_vfsqrt_v; break;
1121
+ case 4: op = rv_op_vfrsqrt7_v; break;
1122
+ case 5: op = rv_op_vfrec7_v; break;
1123
+ case 16: op = rv_op_vfclass_v; break;
1124
+ }
1125
+ break;
1126
+ case 24: op = rv_op_vmfeq_vv; break;
1127
+ case 25: op = rv_op_vmfle_vv; break;
1128
+ case 27: op = rv_op_vmflt_vv; break;
1129
+ case 28: op = rv_op_vmfne_vv; break;
1130
+ case 32: op = rv_op_vfdiv_vv; break;
1131
+ case 36: op = rv_op_vfmul_vv; break;
1132
+ case 40: op = rv_op_vfmadd_vv; break;
1133
+ case 41: op = rv_op_vfnmadd_vv; break;
1134
+ case 42: op = rv_op_vfmsub_vv; break;
1135
+ case 43: op = rv_op_vfnmsub_vv; break;
1136
+ case 44: op = rv_op_vfmacc_vv; break;
1137
+ case 45: op = rv_op_vfnmacc_vv; break;
1138
+ case 46: op = rv_op_vfmsac_vv; break;
1139
+ case 47: op = rv_op_vfnmsac_vv; break;
1140
+ case 48: op = rv_op_vfwadd_vv; break;
1141
+ case 49: op = rv_op_vfwredusum_vs; break;
1142
+ case 50: op = rv_op_vfwsub_vv; break;
1143
+ case 51: op = rv_op_vfwredosum_vs; break;
1144
+ case 52: op = rv_op_vfwadd_wv; break;
1145
+ case 54: op = rv_op_vfwsub_wv; break;
1146
+ case 56: op = rv_op_vfwmul_vv; break;
1147
+ case 60: op = rv_op_vfwmacc_vv; break;
1148
+ case 61: op = rv_op_vfwnmacc_vv; break;
1149
+ case 62: op = rv_op_vfwmsac_vv; break;
1150
+ case 63: op = rv_op_vfwnmsac_vv; break;
1151
+ }
1152
+ break;
1153
+ case 2:
1154
+ switch (((inst >> 26) & 0b111111)) {
1155
+ case 0: op = rv_op_vredsum_vs; break;
1156
+ case 1: op = rv_op_vredand_vs; break;
1157
+ case 2: op = rv_op_vredor_vs; break;
1158
+ case 3: op = rv_op_vredxor_vs; break;
1159
+ case 4: op = rv_op_vredminu_vs; break;
1160
+ case 5: op = rv_op_vredmin_vs; break;
1161
+ case 6: op = rv_op_vredmaxu_vs; break;
1162
+ case 7: op = rv_op_vredmax_vs; break;
1163
+ case 8: op = rv_op_vaaddu_vv; break;
1164
+ case 9: op = rv_op_vaadd_vv; break;
1165
+ case 10: op = rv_op_vasubu_vv; break;
1166
+ case 11: op = rv_op_vasub_vv; break;
1167
+ case 16:
1168
+ switch (((inst >> 15) & 0b11111)) {
1169
+ case 0: if ((inst >> 25) & 1) op = rv_op_vmv_x_s; break;
1170
+ case 16: op = rv_op_vcpop_m; break;
1171
+ case 17: op = rv_op_vfirst_m; break;
1172
+ }
1173
+ break;
1174
+ case 18:
1175
+ switch (((inst >> 15) & 0b11111)) {
1176
+ case 2: op = rv_op_vzext_vf8; break;
1177
+ case 3: op = rv_op_vsext_vf8; break;
1178
+ case 4: op = rv_op_vzext_vf4; break;
1179
+ case 5: op = rv_op_vsext_vf4; break;
1180
+ case 6: op = rv_op_vzext_vf2; break;
1181
+ case 7: op = rv_op_vsext_vf2; break;
1182
+ }
1183
+ break;
1184
+ case 20:
1185
+ switch (((inst >> 15) & 0b11111)) {
1186
+ case 1: op = rv_op_vmsbf_m; break;
1187
+ case 2: op = rv_op_vmsof_m; break;
1188
+ case 3: op = rv_op_vmsif_m; break;
1189
+ case 16: op = rv_op_viota_m; break;
1190
+ case 17: if (((inst >> 20) & 0b11111) == 0) op = rv_op_vid_v; break;
1191
+ }
1192
+ break;
1193
+ case 23: if ((inst >> 25) & 1) op = rv_op_vcompress_vm; break;
1194
+ case 24: if ((inst >> 25) & 1) op = rv_op_vmandn_mm; break;
1195
+ case 25: if ((inst >> 25) & 1) op = rv_op_vmand_mm; break;
1196
+ case 26: if ((inst >> 25) & 1) op = rv_op_vmor_mm; break;
1197
+ case 27: if ((inst >> 25) & 1) op = rv_op_vmxor_mm; break;
1198
+ case 28: if ((inst >> 25) & 1) op = rv_op_vmorn_mm; break;
1199
+ case 29: if ((inst >> 25) & 1) op = rv_op_vmnand_mm; break;
1200
+ case 30: if ((inst >> 25) & 1) op = rv_op_vmnor_mm; break;
1201
+ case 31: if ((inst >> 25) & 1) op = rv_op_vmxnor_mm; break;
1202
+ case 32: op = rv_op_vdivu_vv; break;
1203
+ case 33: op = rv_op_vdiv_vv; break;
1204
+ case 34: op = rv_op_vremu_vv; break;
1205
+ case 35: op = rv_op_vrem_vv; break;
1206
+ case 36: op = rv_op_vmulhu_vv; break;
1207
+ case 37: op = rv_op_vmul_vv; break;
1208
+ case 38: op = rv_op_vmulhsu_vv; break;
1209
+ case 39: op = rv_op_vmulh_vv; break;
1210
+ case 41: op = rv_op_vmadd_vv; break;
1211
+ case 43: op = rv_op_vnmsub_vv; break;
1212
+ case 45: op = rv_op_vmacc_vv; break;
1213
+ case 47: op = rv_op_vnmsac_vv; break;
1214
+ case 48: op = rv_op_vwaddu_vv; break;
1215
+ case 49: op = rv_op_vwadd_vv; break;
1216
+ case 50: op = rv_op_vwsubu_vv; break;
1217
+ case 51: op = rv_op_vwsub_vv; break;
1218
+ case 52: op = rv_op_vwaddu_wv; break;
1219
+ case 53: op = rv_op_vwadd_wv; break;
1220
+ case 54: op = rv_op_vwsubu_wv; break;
1221
+ case 55: op = rv_op_vwsub_wv; break;
1222
+ case 56: op = rv_op_vwmulu_vv; break;
1223
+ case 58: op = rv_op_vwmulsu_vv; break;
1224
+ case 59: op = rv_op_vwmul_vv; break;
1225
+ case 60: op = rv_op_vwmaccu_vv; break;
1226
+ case 61: op = rv_op_vwmacc_vv; break;
1227
+ case 63: op = rv_op_vwmaccsu_vv; break;
1228
+ }
1229
+ break;
1230
+ case 3:
1231
+ switch (((inst >> 26) & 0b111111)) {
1232
+ case 0: op = rv_op_vadd_vi; break;
1233
+ case 3: op = rv_op_vrsub_vi; break;
1234
+ case 9: op = rv_op_vand_vi; break;
1235
+ case 10: op = rv_op_vor_vi; break;
1236
+ case 11: op = rv_op_vxor_vi; break;
1237
+ case 12: op = rv_op_vrgather_vi; break;
1238
+ case 14: op = rv_op_vslideup_vi; break;
1239
+ case 15: op = rv_op_vslidedown_vi; break;
1240
+ case 16: if (((inst >> 25) & 1) == 0) op = rv_op_vadc_vim; break;
1241
+ case 17: op = rv_op_vmadc_vim; break;
1242
+ case 23:
1243
+ if (((inst >> 20) & 0b111111) == 32)
1244
+ op = rv_op_vmv_v_i;
1245
+ else if (((inst >> 25) & 1) == 0)
1246
+ op = rv_op_vmerge_vim;
1247
+ break;
1248
+ case 24: op = rv_op_vmseq_vi; break;
1249
+ case 25: op = rv_op_vmsne_vi; break;
1250
+ case 28: op = rv_op_vmsleu_vi; break;
1251
+ case 29: op = rv_op_vmsle_vi; break;
1252
+ case 30: op = rv_op_vmsgtu_vi; break;
1253
+ case 31: op = rv_op_vmsgt_vi; break;
1254
+ case 32: op = rv_op_vsaddu_vi; break;
1255
+ case 33: op = rv_op_vsadd_vi; break;
1256
+ case 37: op = rv_op_vsll_vi; break;
1257
+ case 39:
1258
+ switch (((inst >> 15) & 0b11111)) {
1259
+ case 0: op = rv_op_vmv1r_v; break;
1260
+ case 1: op = rv_op_vmv2r_v; break;
1261
+ case 3: op = rv_op_vmv4r_v; break;
1262
+ case 7: op = rv_op_vmv8r_v; break;
1263
+ }
1264
+ break;
1265
+ case 40: op = rv_op_vsrl_vi; break;
1266
+ case 41: op = rv_op_vsra_vi; break;
1267
+ case 42: op = rv_op_vssrl_vi; break;
1268
+ case 43: op = rv_op_vssra_vi; break;
1269
+ case 44: op = rv_op_vnsrl_wi; break;
1270
+ case 45: op = rv_op_vnsra_wi; break;
1271
+ case 46: op = rv_op_vnclipu_wi; break;
1272
+ case 47: op = rv_op_vnclip_wi; break;
1273
+ }
1274
+ break;
1275
+ case 4:
1276
+ switch (((inst >> 26) & 0b111111)) {
1277
+ case 0: op = rv_op_vadd_vx; break;
1278
+ case 2: op = rv_op_vsub_vx; break;
1279
+ case 3: op = rv_op_vrsub_vx; break;
1280
+ case 4: op = rv_op_vminu_vx; break;
1281
+ case 5: op = rv_op_vmin_vx; break;
1282
+ case 6: op = rv_op_vmaxu_vx; break;
1283
+ case 7: op = rv_op_vmax_vx; break;
1284
+ case 9: op = rv_op_vand_vx; break;
1285
+ case 10: op = rv_op_vor_vx; break;
1286
+ case 11: op = rv_op_vxor_vx; break;
1287
+ case 12: op = rv_op_vrgather_vx; break;
1288
+ case 14: op = rv_op_vslideup_vx; break;
1289
+ case 15: op = rv_op_vslidedown_vx; break;
1290
+ case 16: if (((inst >> 25) & 1) == 0) op = rv_op_vadc_vxm; break;
1291
+ case 17: op = rv_op_vmadc_vxm; break;
1292
+ case 18: if (((inst >> 25) & 1) == 0) op = rv_op_vsbc_vxm; break;
1293
+ case 19: op = rv_op_vmsbc_vxm; break;
1294
+ case 23:
1295
+ if (((inst >> 20) & 0b111111) == 32)
1296
+ op = rv_op_vmv_v_x;
1297
+ else if (((inst >> 25) & 1) == 0)
1298
+ op = rv_op_vmerge_vxm;
1299
+ break;
1300
+ case 24: op = rv_op_vmseq_vx; break;
1301
+ case 25: op = rv_op_vmsne_vx; break;
1302
+ case 26: op = rv_op_vmsltu_vx; break;
1303
+ case 27: op = rv_op_vmslt_vx; break;
1304
+ case 28: op = rv_op_vmsleu_vx; break;
1305
+ case 29: op = rv_op_vmsle_vx; break;
1306
+ case 30: op = rv_op_vmsgtu_vx; break;
1307
+ case 31: op = rv_op_vmsgt_vx; break;
1308
+ case 32: op = rv_op_vsaddu_vx; break;
1309
+ case 33: op = rv_op_vsadd_vx; break;
1310
+ case 34: op = rv_op_vssubu_vx; break;
1311
+ case 35: op = rv_op_vssub_vx; break;
1312
+ case 37: op = rv_op_vsll_vx; break;
1313
+ case 39: op = rv_op_vsmul_vx; break;
1314
+ case 40: op = rv_op_vsrl_vx; break;
1315
+ case 41: op = rv_op_vsra_vx; break;
1316
+ case 42: op = rv_op_vssrl_vx; break;
1317
+ case 43: op = rv_op_vssra_vx; break;
1318
+ case 44: op = rv_op_vnsrl_wx; break;
1319
+ case 45: op = rv_op_vnsra_wx; break;
1320
+ case 46: op = rv_op_vnclipu_wx; break;
1321
+ case 47: op = rv_op_vnclip_wx; break;
1322
+ }
1323
+ break;
1324
+ case 5:
1325
+ switch (((inst >> 26) & 0b111111)) {
1326
+ case 0: op = rv_op_vfadd_vf; break;
1327
+ case 2: op = rv_op_vfsub_vf; break;
1328
+ case 4: op = rv_op_vfmin_vf; break;
1329
+ case 6: op = rv_op_vfmax_vf; break;
1330
+ case 8: op = rv_op_vfsgnj_vf; break;
1331
+ case 9: op = rv_op_vfsgnjn_vf; break;
1332
+ case 10: op = rv_op_vfsgnjx_vf; break;
1333
+ case 14: op = rv_op_vfslide1up_vf; break;
1334
+ case 15: op = rv_op_vfslide1down_vf; break;
1335
+ case 16:
1336
+ switch (((inst >> 20) & 0b11111)) {
1337
+ case 0: if ((inst >> 25) & 1) op = rv_op_vfmv_s_f; break;
1338
+ }
1339
+ break;
1340
+ case 23:
1341
+ if (((inst >> 25) & 1) == 0)
1342
+ op = rv_op_vfmerge_vfm;
1343
+ else if (((inst >> 20) & 0b111111) == 32)
1344
+ op = rv_op_vfmv_v_f;
1345
+ break;
1346
+ case 24: op = rv_op_vmfeq_vf; break;
1347
+ case 25: op = rv_op_vmfle_vf; break;
1348
+ case 27: op = rv_op_vmflt_vf; break;
1349
+ case 28: op = rv_op_vmfne_vf; break;
1350
+ case 29: op = rv_op_vmfgt_vf; break;
1351
+ case 31: op = rv_op_vmfge_vf; break;
1352
+ case 32: op = rv_op_vfdiv_vf; break;
1353
+ case 33: op = rv_op_vfrdiv_vf; break;
1354
+ case 36: op = rv_op_vfmul_vf; break;
1355
+ case 39: op = rv_op_vfrsub_vf; break;
1356
+ case 40: op = rv_op_vfmadd_vf; break;
1357
+ case 41: op = rv_op_vfnmadd_vf; break;
1358
+ case 42: op = rv_op_vfmsub_vf; break;
1359
+ case 43: op = rv_op_vfnmsub_vf; break;
1360
+ case 44: op = rv_op_vfmacc_vf; break;
1361
+ case 45: op = rv_op_vfnmacc_vf; break;
1362
+ case 46: op = rv_op_vfmsac_vf; break;
1363
+ case 47: op = rv_op_vfnmsac_vf; break;
1364
+ case 48: op = rv_op_vfwadd_vf; break;
1365
+ case 50: op = rv_op_vfwsub_vf; break;
1366
+ case 52: op = rv_op_vfwadd_wf; break;
1367
+ case 54: op = rv_op_vfwsub_wf; break;
1368
+ case 56: op = rv_op_vfwmul_vf; break;
1369
+ case 60: op = rv_op_vfwmacc_vf; break;
1370
+ case 61: op = rv_op_vfwnmacc_vf; break;
1371
+ case 62: op = rv_op_vfwmsac_vf; break;
1372
+ case 63: op = rv_op_vfwnmsac_vf; break;
1373
+ }
1374
+ break;
1375
+ case 6:
1376
+ switch (((inst >> 26) & 0b111111)) {
1377
+ case 8: op = rv_op_vaaddu_vx; break;
1378
+ case 9: op = rv_op_vaadd_vx; break;
1379
+ case 10: op = rv_op_vasubu_vx; break;
1380
+ case 11: op = rv_op_vasub_vx; break;
1381
+ case 14: op = rv_op_vslide1up_vx; break;
1382
+ case 15: op = rv_op_vslide1down_vx; break;
1383
+ case 16:
1384
+ switch (((inst >> 20) & 0b11111)) {
1385
+ case 0: if ((inst >> 25) & 1) op = rv_op_vmv_s_x; break;
1386
+ }
1387
+ break;
1388
+ case 32: op = rv_op_vdivu_vx; break;
1389
+ case 33: op = rv_op_vdiv_vx; break;
1390
+ case 34: op = rv_op_vremu_vx; break;
1391
+ case 35: op = rv_op_vrem_vx; break;
1392
+ case 36: op = rv_op_vmulhu_vx; break;
1393
+ case 37: op = rv_op_vmul_vx; break;
1394
+ case 38: op = rv_op_vmulhsu_vx; break;
1395
+ case 39: op = rv_op_vmulh_vx; break;
1396
+ case 41: op = rv_op_vmadd_vx; break;
1397
+ case 43: op = rv_op_vnmsub_vx; break;
1398
+ case 45: op = rv_op_vmacc_vx; break;
1399
+ case 47: op = rv_op_vnmsac_vx; break;
1400
+ case 48: op = rv_op_vwaddu_vx; break;
1401
+ case 49: op = rv_op_vwadd_vx; break;
1402
+ case 50: op = rv_op_vwsubu_vx; break;
1403
+ case 51: op = rv_op_vwsub_vx; break;
1404
+ case 52: op = rv_op_vwaddu_wx; break;
1405
+ case 53: op = rv_op_vwadd_wx; break;
1406
+ case 54: op = rv_op_vwsubu_wx; break;
1407
+ case 55: op = rv_op_vwsub_wx; break;
1408
+ case 56: op = rv_op_vwmulu_vx; break;
1409
+ case 58: op = rv_op_vwmulsu_vx; break;
1410
+ case 59: op = rv_op_vwmul_vx; break;
1411
+ case 60: op = rv_op_vwmaccu_vx; break;
1412
+ case 61: op = rv_op_vwmacc_vx; break;
1413
+ case 62: op = rv_op_vwmaccus_vx; break;
1414
+ case 63: op = rv_op_vwmaccsu_vx; break;
1415
+ }
1416
+ break;
1417
+ case 7:
1418
+ if (((inst >> 31) & 1) == 0) {
1419
+ op = rv_op_vsetvli;
1420
+ } else if ((inst >> 30) & 1) {
1421
+ op = rv_op_vsetivli;
1422
+ } else if (((inst >> 25) & 0b11111) == 0) {
1423
+ op = rv_op_vsetvl;
1424
+ }
1425
+ break;
1426
+ }
1427
+ break;
1428
case 22:
1429
switch (((inst >> 12) & 0b111)) {
1430
case 0: op = rv_op_addid; break;
1431
@@ -XXX,XX +XXX,XX @@ static uint32_t operand_cimmq(rv_inst inst)
1432
((inst << 57) >> 62) << 6;
1433
}
1434
1435
+static uint32_t operand_vimm(rv_inst inst)
1436
+{
1437
+ return (int64_t)(inst << 44) >> 59;
1438
+}
1439
+
1440
+static uint32_t operand_vzimm11(rv_inst inst)
1441
+{
1442
+ return (inst << 33) >> 53;
1443
+}
1444
+
1445
+static uint32_t operand_vzimm10(rv_inst inst)
1446
+{
1447
+ return (inst << 34) >> 54;
1448
+}
1449
+
1450
static uint32_t operand_bs(rv_inst inst)
1451
{
1452
return (inst << 32) >> 62;
1453
@@ -XXX,XX +XXX,XX @@ static uint32_t operand_rnum(rv_inst inst)
1454
return (inst << 40) >> 60;
1455
}
1456
1457
+static uint32_t operand_vm(rv_inst inst)
1458
+{
1459
+ return (inst << 38) >> 63;
1460
+}
1461
+
1462
/* decode operands */
1463
1464
static void decode_inst_operands(rv_decode *dec, rv_isa isa)
1465
@@ -XXX,XX +XXX,XX @@ static void decode_inst_operands(rv_decode *dec, rv_isa isa)
1466
dec->rs1 = operand_rs1(inst);
1467
dec->rnum = operand_rnum(inst);
1468
break;
1469
+ case rv_codec_v_r:
1470
+ dec->rd = operand_rd(inst);
1471
+ dec->rs1 = operand_rs1(inst);
1472
+ dec->rs2 = operand_rs2(inst);
1473
+ dec->vm = operand_vm(inst);
1474
+ break;
1475
+ case rv_codec_v_ldst:
1476
+ dec->rd = operand_rd(inst);
1477
+ dec->rs1 = operand_rs1(inst);
1478
+ dec->vm = operand_vm(inst);
1479
+ break;
1480
+ case rv_codec_v_i:
1481
+ dec->rd = operand_rd(inst);
1482
+ dec->rs2 = operand_rs2(inst);
1483
+ dec->imm = operand_vimm(inst);
1484
+ dec->vm = operand_vm(inst);
1485
+ break;
1486
+ case rv_codec_vsetvli:
1487
+ dec->rd = operand_rd(inst);
1488
+ dec->rs1 = operand_rs1(inst);
1489
+ dec->vzimm = operand_vzimm11(inst);
1490
+ break;
1491
+ case rv_codec_vsetivli:
1492
+ dec->rd = operand_rd(inst);
1493
+ dec->imm = operand_vimm(inst);
1494
+ dec->vzimm = operand_vzimm10(inst);
1495
+ break;
1496
};
1497
}
1498
1499
@@ -XXX,XX +XXX,XX @@ static void format_inst(char *buf, size_t buflen, size_t tab, rv_decode *dec)
1500
snprintf(tmp, sizeof(tmp), "%d", dec->imm);
1501
append(buf, tmp, buflen);
1502
break;
1503
+ case 'u':
1504
+ snprintf(tmp, sizeof(tmp), "%u", ((uint32_t)dec->imm & 0b11111));
1505
+ append(buf, tmp, buflen);
1506
+ break;
1507
case 'o':
1508
snprintf(tmp, sizeof(tmp), "%d", dec->imm);
1509
append(buf, tmp, buflen);
1510
@@ -XXX,XX +XXX,XX @@ static void format_inst(char *buf, size_t buflen, size_t tab, rv_decode *dec)
1511
append(buf, ".rl", buflen);
1512
}
1513
break;
1514
+ case 'l':
1515
+ append(buf, ",v0", buflen);
1516
+ break;
1517
+ case 'm':
1518
+ if (dec->vm == 0) {
1519
+ append(buf, ",v0.t", buflen);
1520
+ }
1521
+ break;
1522
+ case 'D':
1523
+ append(buf, rv_vreg_name_sym[dec->rd], buflen);
1524
+ break;
1525
+ case 'E':
1526
+ append(buf, rv_vreg_name_sym[dec->rs1], buflen);
1527
+ break;
1528
+ case 'F':
1529
+ append(buf, rv_vreg_name_sym[dec->rs2], buflen);
1530
+ break;
1531
+ case 'G':
1532
+ append(buf, rv_vreg_name_sym[dec->rs3], buflen);
1533
+ break;
1534
+ case 'v': {
1535
+ char nbuf[32] = {0};
1536
+ const int sew = 1 << (((dec->vzimm >> 3) & 0b111) + 3);
1537
+ sprintf(nbuf, "%d", sew);
1538
+ const int lmul = dec->vzimm & 0b11;
1539
+ const int flmul = (dec->vzimm >> 2) & 1;
1540
+ const char *vta = (dec->vzimm >> 6) & 1 ? "ta" : "tu";
1541
+ const char *vma = (dec->vzimm >> 7) & 1 ? "ma" : "mu";
1542
+ append(buf, "e", buflen);
1543
+ append(buf, nbuf, buflen);
1544
+ append(buf, ",m", buflen);
1545
+ if (flmul) {
1546
+ switch (lmul) {
1547
+ case 3:
1548
+ sprintf(nbuf, "f2");
1549
+ break;
1550
+ case 2:
1551
+ sprintf(nbuf, "f4");
1552
+ break;
1553
+ case 1:
1554
+ sprintf(nbuf, "f8");
1555
+ break;
1556
+ }
1557
+ append(buf, nbuf, buflen);
1558
+ } else {
1559
+ sprintf(nbuf, "%d", 1 << lmul);
1560
+ append(buf, nbuf, buflen);
1561
+ }
1562
+ append(buf, ",", buflen);
1563
+ append(buf, vta, buflen);
1564
+ append(buf, ",", buflen);
1565
+ append(buf, vma, buflen);
1566
+ break;
1567
+ }
1568
default:
1569
break;
1570
}
1571
@@ -XXX,XX +XXX,XX @@ disasm_inst(char *buf, size_t buflen, rv_isa isa, uint64_t pc, rv_inst inst)
1572
decode_inst_operands(&dec, isa);
1573
decode_inst_decompress(&dec, isa);
1574
decode_inst_lift_pseudo(&dec);
1575
- format_inst(buf, buflen, 16, &dec);
1576
+ format_inst(buf, buflen, 24, &dec);
1577
}
1578
1579
#define INST_FMT_2 "%04" PRIx64 " "
1580
--
1581
2.37.3
diff view generated by jsdifflib
New patch
1
From: Jim Shu <jim.shu@sifive.com>
1
2
3
The maximum priority level is hard-coded when writing to interrupt
4
priority register. However, when writing to priority threshold register,
5
the maximum priority level is from num_priorities Property which is
6
configured by platform.
7
8
Also change interrupt priority register to use num_priorities Property
9
in maximum priority level.
10
11
Signed-off-by: Emmanuel Blot <emmanuel.blot@sifive.com>
12
Signed-off-by: Jim Shu <jim.shu@sifive.com>
13
Reviewed-by: Frank Chang <frank.chang@sifive.com>
14
Acked-by: Alistair Francis <alistair.francis@wdc.com>
15
Message-Id: <20221003041440.2320-2-jim.shu@sifive.com>
16
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
17
---
18
hw/intc/sifive_plic.c | 6 ++++--
19
1 file changed, 4 insertions(+), 2 deletions(-)
20
21
diff --git a/hw/intc/sifive_plic.c b/hw/intc/sifive_plic.c
22
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/intc/sifive_plic.c
24
+++ b/hw/intc/sifive_plic.c
25
@@ -XXX,XX +XXX,XX @@ static void sifive_plic_write(void *opaque, hwaddr addr, uint64_t value,
26
if (addr_between(addr, plic->priority_base, plic->num_sources << 2)) {
27
uint32_t irq = ((addr - plic->priority_base) >> 2) + 1;
28
29
- plic->source_priority[irq] = value & 7;
30
- sifive_plic_update(plic);
31
+ if (value <= plic->num_priorities) {
32
+ plic->source_priority[irq] = value;
33
+ sifive_plic_update(plic);
34
+ }
35
} else if (addr_between(addr, plic->pending_base,
36
plic->num_sources >> 3)) {
37
qemu_log_mask(LOG_GUEST_ERROR,
38
--
39
2.37.3
diff view generated by jsdifflib
New patch
1
From: Jim Shu <jim.shu@sifive.com>
1
2
3
PLIC spec [1] requires interrupt source priority registers are WARL
4
field and the number of supported priority is power-of-2 to simplify SW
5
discovery.
6
7
Existing QEMU RISC-V machine (e.g. shakti_c) don't strictly follow PLIC
8
spec, whose number of supported priority is not power-of-2. Just change
9
each bit of interrupt priority register to WARL field when the number of
10
supported priority is power-of-2.
11
12
[1] https://github.com/riscv/riscv-plic-spec/blob/master/riscv-plic.adoc#interrupt-priorities
13
14
Signed-off-by: Jim Shu <jim.shu@sifive.com>
15
Reviewed-by: Clément Chigot <chigot@adacore.com>
16
Acked-by: Alistair Francis <alistair.francis@wdc.com>
17
Message-Id: <20221003041440.2320-3-jim.shu@sifive.com>
18
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
19
---
20
hw/intc/sifive_plic.c | 21 +++++++++++++++++++--
21
1 file changed, 19 insertions(+), 2 deletions(-)
22
23
diff --git a/hw/intc/sifive_plic.c b/hw/intc/sifive_plic.c
24
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/intc/sifive_plic.c
26
+++ b/hw/intc/sifive_plic.c
27
@@ -XXX,XX +XXX,XX @@ static void sifive_plic_write(void *opaque, hwaddr addr, uint64_t value,
28
if (addr_between(addr, plic->priority_base, plic->num_sources << 2)) {
29
uint32_t irq = ((addr - plic->priority_base) >> 2) + 1;
30
31
- if (value <= plic->num_priorities) {
32
+ if (((plic->num_priorities + 1) & plic->num_priorities) == 0) {
33
+ /*
34
+ * if "num_priorities + 1" is power-of-2, make each register bit of
35
+ * interrupt priority WARL (Write-Any-Read-Legal). Just filter
36
+ * out the access to unsupported priority bits.
37
+ */
38
+ plic->source_priority[irq] = value % (plic->num_priorities + 1);
39
+ sifive_plic_update(plic);
40
+ } else if (value <= plic->num_priorities) {
41
plic->source_priority[irq] = value;
42
sifive_plic_update(plic);
43
}
44
@@ -XXX,XX +XXX,XX @@ static void sifive_plic_write(void *opaque, hwaddr addr, uint64_t value,
45
uint32_t contextid = (addr & (plic->context_stride - 1));
46
47
if (contextid == 0) {
48
- if (value <= plic->num_priorities) {
49
+ if (((plic->num_priorities + 1) & plic->num_priorities) == 0) {
50
+ /*
51
+ * if "num_priorities + 1" is power-of-2, each register bit of
52
+ * interrupt priority is WARL (Write-Any-Read-Legal). Just
53
+ * filter out the access to unsupported priority bits.
54
+ */
55
+ plic->target_priority[addrid] = value %
56
+ (plic->num_priorities + 1);
57
+ sifive_plic_update(plic);
58
+ } else if (value <= plic->num_priorities) {
59
plic->target_priority[addrid] = value;
60
sifive_plic_update(plic);
61
}
62
--
63
2.37.3
diff view generated by jsdifflib
New patch
1
From: Alistair Francis <alistair.francis@wdc.com>
1
2
3
Since commit 4047368938f6 "accel/tcg: Introduce tlb_set_page_full" we
4
have been seeing this assert
5
6
../accel/tcg/cputlb.c:1294: tlb_set_page_with_attrs: Assertion `is_power_of_2(size)' failed.
7
8
When running Tock on the OpenTitan machine.
9
10
The issue is that pmp_get_tlb_size() would return a TLB size that wasn't
11
a power of 2. The size was also smaller then TARGET_PAGE_SIZE.
12
13
This patch ensures that any TLB size less then TARGET_PAGE_SIZE is
14
rounded down to 1 to ensure it's a valid size.
15
16
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
17
Reviewed-by: LIU Zhiwei<zhiwei_liu@linux.alibaba.com>
18
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
19
Message-id: 20221012011449.506928-1-alistair.francis@opensource.wdc.com
20
Message-Id: <20221012011449.506928-1-alistair.francis@opensource.wdc.com>
21
---
22
target/riscv/pmp.c | 12 ++++++++++++
23
1 file changed, 12 insertions(+)
24
25
diff --git a/target/riscv/pmp.c b/target/riscv/pmp.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/target/riscv/pmp.c
28
+++ b/target/riscv/pmp.c
29
@@ -XXX,XX +XXX,XX @@ bool pmp_is_range_in_tlb(CPURISCVState *env, hwaddr tlb_sa,
30
}
31
32
if (*tlb_size != 0) {
33
+ /*
34
+ * At this point we have a tlb_size that is the smallest possible size
35
+ * That fits within a TARGET_PAGE_SIZE and the PMP region.
36
+ *
37
+ * If the size is less then TARGET_PAGE_SIZE we drop the size to 1.
38
+ * This means the result isn't cached in the TLB and is only used for
39
+ * a single translation.
40
+ */
41
+ if (*tlb_size < TARGET_PAGE_SIZE) {
42
+ *tlb_size = 1;
43
+ }
44
+
45
return true;
46
}
47
48
--
49
2.37.3
diff view generated by jsdifflib