1
The following changes since commit 9435a8b3dd35f1f926f1b9127e8a906217a5518a:
1
The following changes since commit 64f0ad8ad8e13257e7c912df470d46784b55c3fd:
2
2
3
Merge remote-tracking branch 'remotes/kraxel/tags/sirius/ipxe-20200908-pull-request' into staging (2020-09-08 21:21:13 +0100)
3
Merge remote-tracking branch 'remotes/armbru/tags/pull-error-2020-07-02' into staging (2020-07-02 15:54:09 +0100)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
git@github.com:alistair23/qemu.git tags/pull-riscv-to-apply-20200910
7
git@github.com:alistair23/qemu.git tags/pull-riscv-to-apply-20200702-1
8
8
9
for you to fetch changes up to 7595a65818ea9b49c36650a8c217a1ef9bd6e62a:
9
for you to fetch changes up to 6bf91617f47c74efc99ef48236765d9677c0898e:
10
10
11
hw/riscv: Sort the Kconfig options in alphabetical order (2020-09-09 15:54:19 -0700)
11
target/riscv: configure and turn on vector extension from command line (2020-07-02 09:19:34 -0700)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
This PR includes multiple fixes and features for RISC-V:
14
This PR contains two patches to improve PLIC support in QEMU.
15
- Fixes a bug in printing trap causes
15
16
- Allows 16-bit writes to the SiFive test device. This fixes the
16
It also contains one patch that fixes CLINT accesses for RISC-V. This
17
failure to reboot the RISC-V virt machine
17
fixes a regression for most RISC-V boards.
18
- Support for the Microchip PolarFire SoC and Icicle Kit
18
19
- A reafactor of RISC-V code out of hw/riscv
19
The rest of the PR is adding support for the v0.7.1 RISC-V vector
20
extensions. This is experimental support as the vector extensions are
21
still in a draft state.
22
23
This is a v2 pull request that has fixed the building on big endian
24
machines failure.
20
25
21
----------------------------------------------------------------
26
----------------------------------------------------------------
22
Bin Meng (28):
27
Alistair Francis (1):
23
target/riscv: cpu: Add a new 'resetvec' property
28
hw/riscv: Allow 64 bit access to SiFive CLINT
24
hw/riscv: hart: Add a new 'resetvec' property
25
target/riscv: cpu: Set reset vector based on the configured property value
26
hw/riscv: Initial support for Microchip PolarFire SoC Icicle Kit board
27
hw/char: Add Microchip PolarFire SoC MMUART emulation
28
hw/riscv: microchip_pfsoc: Connect 5 MMUARTs
29
hw/sd: Add Cadence SDHCI emulation
30
hw/riscv: microchip_pfsoc: Connect a Cadence SDHCI controller and an SD card
31
hw/dma: Add SiFive platform DMA controller emulation
32
hw/riscv: microchip_pfsoc: Connect a DMA controller
33
hw/net: cadence_gem: Add a new 'phy-addr' property
34
hw/arm: xlnx: Set all boards' GEM 'phy-addr' property value to 23
35
hw/riscv: microchip_pfsoc: Connect 2 Cadence GEMs
36
hw/riscv: microchip_pfsoc: Hook GPIO controllers
37
hw/riscv: clint: Avoid using hard-coded timebase frequency
38
hw/riscv: sifive_u: Connect a DMA controller
39
hw/riscv: Move sifive_e_prci model to hw/misc
40
hw/riscv: Move sifive_u_prci model to hw/misc
41
hw/riscv: Move sifive_u_otp model to hw/misc
42
hw/riscv: Move sifive_gpio model to hw/gpio
43
hw/riscv: Move sifive_clint model to hw/intc
44
hw/riscv: Move sifive_plic model to hw/intc
45
hw/riscv: Move riscv_htif model to hw/char
46
hw/riscv: Move sifive_uart model to hw/char
47
hw/riscv: Move sifive_test model to hw/misc
48
hw/riscv: Always build riscv_hart.c
49
hw/riscv: Drop CONFIG_SIFIVE
50
hw/riscv: Sort the Kconfig options in alphabetical order
51
29
52
Nathan Chancellor (1):
30
Jessica Clarke (2):
53
riscv: sifive_test: Allow 16-bit writes to memory region
31
riscv: plic: Honour source priorities
32
riscv: plic: Add a couple of mising sifive_plic_update calls
54
33
55
Yifei Jiang (1):
34
LIU Zhiwei (61):
56
target/riscv: Fix bug in getting trap cause name for trace_riscv_trap
35
target/riscv: add vector extension field in CPURISCVState
36
target/riscv: implementation-defined constant parameters
37
target/riscv: support vector extension csr
38
target/riscv: add vector configure instruction
39
target/riscv: add an internals.h header
40
target/riscv: add vector stride load and store instructions
41
target/riscv: add vector index load and store instructions
42
target/riscv: add fault-only-first unit stride load
43
target/riscv: add vector amo operations
44
target/riscv: vector single-width integer add and subtract
45
target/riscv: vector widening integer add and subtract
46
target/riscv: vector integer add-with-carry / subtract-with-borrow instructions
47
target/riscv: vector bitwise logical instructions
48
target/riscv: vector single-width bit shift instructions
49
target/riscv: vector narrowing integer right shift instructions
50
target/riscv: vector integer comparison instructions
51
target/riscv: vector integer min/max instructions
52
target/riscv: vector single-width integer multiply instructions
53
target/riscv: vector integer divide instructions
54
target/riscv: vector widening integer multiply instructions
55
target/riscv: vector single-width integer multiply-add instructions
56
target/riscv: vector widening integer multiply-add instructions
57
target/riscv: vector integer merge and move instructions
58
target/riscv: vector single-width saturating add and subtract
59
target/riscv: vector single-width averaging add and subtract
60
target/riscv: vector single-width fractional multiply with rounding and saturation
61
target/riscv: vector widening saturating scaled multiply-add
62
target/riscv: vector single-width scaling shift instructions
63
target/riscv: vector narrowing fixed-point clip instructions
64
target/riscv: vector single-width floating-point add/subtract instructions
65
target/riscv: vector widening floating-point add/subtract instructions
66
target/riscv: vector single-width floating-point multiply/divide instructions
67
target/riscv: vector widening floating-point multiply
68
target/riscv: vector single-width floating-point fused multiply-add instructions
69
target/riscv: vector widening floating-point fused multiply-add instructions
70
target/riscv: vector floating-point square-root instruction
71
target/riscv: vector floating-point min/max instructions
72
target/riscv: vector floating-point sign-injection instructions
73
target/riscv: vector floating-point compare instructions
74
target/riscv: vector floating-point classify instructions
75
target/riscv: vector floating-point merge instructions
76
target/riscv: vector floating-point/integer type-convert instructions
77
target/riscv: widening floating-point/integer type-convert instructions
78
target/riscv: narrowing floating-point/integer type-convert instructions
79
target/riscv: vector single-width integer reduction instructions
80
target/riscv: vector wideing integer reduction instructions
81
target/riscv: vector single-width floating-point reduction instructions
82
target/riscv: vector widening floating-point reduction instructions
83
target/riscv: vector mask-register logical instructions
84
target/riscv: vector mask population count vmpopc
85
target/riscv: vmfirst find-first-set mask bit
86
target/riscv: set-X-first mask bit
87
target/riscv: vector iota instruction
88
target/riscv: vector element index instruction
89
target/riscv: integer extract instruction
90
target/riscv: integer scalar move instruction
91
target/riscv: floating-point scalar move instructions
92
target/riscv: vector slide instructions
93
target/riscv: vector register gather instruction
94
target/riscv: vector compress instruction
95
target/riscv: configure and turn on vector extension from command line
57
96
58
default-configs/riscv64-softmmu.mak | 1 +
97
target/riscv/cpu.h | 82 +-
59
{include/hw/riscv => hw/intc}/sifive_plic.h | 0
98
target/riscv/cpu_bits.h | 15 +
60
hw/riscv/trace.h | 1 -
99
target/riscv/helper.h | 1069 +++++++
61
include/hw/char/mchp_pfsoc_mmuart.h | 61 ++++
100
target/riscv/internals.h | 41 +
62
include/hw/{riscv => char}/riscv_htif.h | 0
101
target/riscv/insn32-64.decode | 11 +
63
include/hw/{riscv => char}/sifive_uart.h | 0
102
target/riscv/insn32.decode | 372 +++
64
include/hw/dma/sifive_pdma.h | 57 ++++
103
hw/riscv/sifive_clint.c | 2 +-
65
include/hw/{riscv => gpio}/sifive_gpio.h | 0
104
hw/riscv/sifive_plic.c | 20 +-
66
include/hw/{riscv => intc}/sifive_clint.h | 4 +-
105
target/riscv/cpu.c | 50 +
67
include/hw/{riscv => misc}/sifive_e_prci.h | 0
106
target/riscv/csr.c | 75 +-
68
include/hw/{riscv => misc}/sifive_test.h | 0
107
target/riscv/fpu_helper.c | 33 +-
69
include/hw/{riscv => misc}/sifive_u_otp.h | 0
108
target/riscv/insn_trans/trans_rvv.inc.c | 2888 ++++++++++++++++++
70
include/hw/{riscv => misc}/sifive_u_prci.h | 0
109
target/riscv/translate.c | 27 +-
71
include/hw/net/cadence_gem.h | 2 +
110
target/riscv/vector_helper.c | 4899 +++++++++++++++++++++++++++++++
72
include/hw/riscv/microchip_pfsoc.h | 133 +++++++++
111
target/riscv/Makefile.objs | 2 +-
73
include/hw/riscv/riscv_hart.h | 1 +
112
15 files changed, 9535 insertions(+), 51 deletions(-)
74
include/hw/riscv/sifive_e.h | 2 +-
113
create mode 100644 target/riscv/internals.h
75
include/hw/riscv/sifive_u.h | 17 +-
114
create mode 100644 target/riscv/insn_trans/trans_rvv.inc.c
76
include/hw/sd/cadence_sdhci.h | 47 +++
115
create mode 100644 target/riscv/vector_helper.c
77
target/riscv/cpu.h | 8 +-
78
hw/arm/xilinx_zynq.c | 1 +
79
hw/arm/xlnx-versal.c | 1 +
80
hw/arm/xlnx-zynqmp.c | 2 +
81
hw/char/mchp_pfsoc_mmuart.c | 86 ++++++
82
hw/{riscv => char}/riscv_htif.c | 2 +-
83
hw/{riscv => char}/sifive_uart.c | 2 +-
84
hw/dma/sifive_pdma.c | 313 ++++++++++++++++++++
85
hw/{riscv => gpio}/sifive_gpio.c | 2 +-
86
hw/{riscv => intc}/sifive_clint.c | 28 +-
87
hw/{riscv => intc}/sifive_plic.c | 2 +-
88
hw/{riscv => misc}/sifive_e_prci.c | 2 +-
89
hw/{riscv => misc}/sifive_test.c | 4 +-
90
hw/{riscv => misc}/sifive_u_otp.c | 2 +-
91
hw/{riscv => misc}/sifive_u_prci.c | 2 +-
92
hw/net/cadence_gem.c | 7 +-
93
hw/riscv/microchip_pfsoc.c | 437 ++++++++++++++++++++++++++++
94
hw/riscv/opentitan.c | 1 +
95
hw/riscv/riscv_hart.c | 3 +
96
hw/riscv/sifive_e.c | 12 +-
97
hw/riscv/sifive_u.c | 41 ++-
98
hw/riscv/spike.c | 7 +-
99
hw/riscv/virt.c | 9 +-
100
hw/sd/cadence_sdhci.c | 193 ++++++++++++
101
target/riscv/cpu.c | 19 +-
102
target/riscv/cpu_helper.c | 8 +-
103
target/riscv/csr.c | 4 +-
104
MAINTAINERS | 9 +
105
hw/char/Kconfig | 9 +
106
hw/char/meson.build | 3 +
107
hw/dma/Kconfig | 3 +
108
hw/dma/meson.build | 1 +
109
hw/gpio/Kconfig | 3 +
110
hw/gpio/meson.build | 1 +
111
hw/gpio/trace-events | 6 +
112
hw/intc/Kconfig | 6 +
113
hw/intc/meson.build | 2 +
114
hw/misc/Kconfig | 12 +
115
hw/misc/meson.build | 6 +
116
hw/riscv/Kconfig | 70 +++--
117
hw/riscv/meson.build | 12 +-
118
hw/riscv/trace-events | 7 -
119
hw/sd/Kconfig | 4 +
120
hw/sd/meson.build | 1 +
121
meson.build | 1 -
122
64 files changed, 1575 insertions(+), 105 deletions(-)
123
rename {include/hw/riscv => hw/intc}/sifive_plic.h (100%)
124
delete mode 100644 hw/riscv/trace.h
125
create mode 100644 include/hw/char/mchp_pfsoc_mmuart.h
126
rename include/hw/{riscv => char}/riscv_htif.h (100%)
127
rename include/hw/{riscv => char}/sifive_uart.h (100%)
128
create mode 100644 include/hw/dma/sifive_pdma.h
129
rename include/hw/{riscv => gpio}/sifive_gpio.h (100%)
130
rename include/hw/{riscv => intc}/sifive_clint.h (92%)
131
rename include/hw/{riscv => misc}/sifive_e_prci.h (100%)
132
rename include/hw/{riscv => misc}/sifive_test.h (100%)
133
rename include/hw/{riscv => misc}/sifive_u_otp.h (100%)
134
rename include/hw/{riscv => misc}/sifive_u_prci.h (100%)
135
create mode 100644 include/hw/riscv/microchip_pfsoc.h
136
create mode 100644 include/hw/sd/cadence_sdhci.h
137
create mode 100644 hw/char/mchp_pfsoc_mmuart.c
138
rename hw/{riscv => char}/riscv_htif.c (99%)
139
rename hw/{riscv => char}/sifive_uart.c (99%)
140
create mode 100644 hw/dma/sifive_pdma.c
141
rename hw/{riscv => gpio}/sifive_gpio.c (99%)
142
rename hw/{riscv => intc}/sifive_clint.c (90%)
143
rename hw/{riscv => intc}/sifive_plic.c (99%)
144
rename hw/{riscv => misc}/sifive_e_prci.c (99%)
145
rename hw/{riscv => misc}/sifive_test.c (97%)
146
rename hw/{riscv => misc}/sifive_u_otp.c (99%)
147
rename hw/{riscv => misc}/sifive_u_prci.c (99%)
148
create mode 100644 hw/riscv/microchip_pfsoc.c
149
create mode 100644 hw/sd/cadence_sdhci.c
150
delete mode 100644 hw/riscv/trace-events
151
116
diff view generated by jsdifflib
New patch
1
From: Jessica Clarke <jrtc27@jrtc27.com>
1
2
3
The source priorities can be used to order sources with respect to other
4
sources, not just as a way to enable/disable them based off a threshold.
5
We must therefore always claim the highest-priority source, rather than
6
the first source we find.
7
8
Signed-off-by: Jessica Clarke <jrtc27@jrtc27.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Message-Id: <20200618202343.20455-1-jrtc27@jrtc27.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
hw/riscv/sifive_plic.c | 17 ++++++++++++-----
14
1 file changed, 12 insertions(+), 5 deletions(-)
15
16
diff --git a/hw/riscv/sifive_plic.c b/hw/riscv/sifive_plic.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/riscv/sifive_plic.c
19
+++ b/hw/riscv/sifive_plic.c
20
@@ -XXX,XX +XXX,XX @@ static void sifive_plic_update(SiFivePLICState *plic)
21
static uint32_t sifive_plic_claim(SiFivePLICState *plic, uint32_t addrid)
22
{
23
int i, j;
24
+ uint32_t max_irq = 0;
25
+ uint32_t max_prio = plic->target_priority[addrid];
26
+
27
for (i = 0; i < plic->bitfield_words; i++) {
28
uint32_t pending_enabled_not_claimed =
29
(plic->pending[i] & ~plic->claimed[i]) &
30
@@ -XXX,XX +XXX,XX @@ static uint32_t sifive_plic_claim(SiFivePLICState *plic, uint32_t addrid)
31
int irq = (i << 5) + j;
32
uint32_t prio = plic->source_priority[irq];
33
int enabled = pending_enabled_not_claimed & (1 << j);
34
- if (enabled && prio > plic->target_priority[addrid]) {
35
- sifive_plic_set_pending(plic, irq, false);
36
- sifive_plic_set_claimed(plic, irq, true);
37
- return irq;
38
+ if (enabled && prio > max_prio) {
39
+ max_irq = irq;
40
+ max_prio = prio;
41
}
42
}
43
}
44
- return 0;
45
+
46
+ if (max_irq) {
47
+ sifive_plic_set_pending(plic, max_irq, false);
48
+ sifive_plic_set_claimed(plic, max_irq, true);
49
+ }
50
+ return max_irq;
51
}
52
53
static uint64_t sifive_plic_read(void *opaque, hwaddr addr, unsigned size)
54
--
55
2.27.0
56
57
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: Jessica Clarke <jrtc27@jrtc27.com>
2
2
3
This is an effort to clean up the hw/riscv directory. Ideally it
3
Claiming an interrupt and changing the source priority both potentially
4
should only contain the RISC-V SoC / machine codes plus generic
4
affect whether an interrupt is pending, thus we must re-compute xEIP.
5
codes. Let's move sifive_plic model to hw/intc directory.
5
Note that we don't put the sifive_plic_update inside sifive_plic_claim
6
so that the logging of a claim (and the resulting IRQ) happens before
7
the state update, making the causal effect clear, and that we drop the
8
explicit call to sifive_plic_print_state when claiming since
9
sifive_plic_update already does that automatically at the end for us.
6
10
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
11
This can result in both spurious interrupt storms if you fail to
12
complete an IRQ before enabling interrupts (and no other actions occur
13
that result in a call to sifive_plic_update), but also more importantly
14
lost interrupts if a disabled interrupt is pending and then becomes
15
enabled.
16
17
Signed-off-by: Jessica Clarke <jrtc27@jrtc27.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
18
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1599129623-68957-7-git-send-email-bmeng.cn@gmail.com>
19
Message-Id: <20200618210649.22451-1-jrtc27@jrtc27.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
20
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
21
---
12
{include/hw/riscv => hw/intc}/sifive_plic.h | 0
22
hw/riscv/sifive_plic.c | 3 ++-
13
hw/{riscv => intc}/sifive_plic.c | 2 +-
23
1 file changed, 2 insertions(+), 1 deletion(-)
14
hw/riscv/microchip_pfsoc.c | 2 +-
15
hw/riscv/sifive_e.c | 2 +-
16
hw/riscv/sifive_u.c | 2 +-
17
hw/riscv/virt.c | 2 +-
18
hw/intc/Kconfig | 3 +++
19
hw/intc/meson.build | 1 +
20
hw/riscv/Kconfig | 5 +++++
21
hw/riscv/meson.build | 1 -
22
10 files changed, 14 insertions(+), 6 deletions(-)
23
rename {include/hw/riscv => hw/intc}/sifive_plic.h (100%)
24
rename hw/{riscv => intc}/sifive_plic.c (99%)
25
24
26
diff --git a/include/hw/riscv/sifive_plic.h b/hw/intc/sifive_plic.h
25
diff --git a/hw/riscv/sifive_plic.c b/hw/riscv/sifive_plic.c
27
similarity index 100%
28
rename from include/hw/riscv/sifive_plic.h
29
rename to hw/intc/sifive_plic.h
30
diff --git a/hw/riscv/sifive_plic.c b/hw/intc/sifive_plic.c
31
similarity index 99%
32
rename from hw/riscv/sifive_plic.c
33
rename to hw/intc/sifive_plic.c
34
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/riscv/sifive_plic.c
27
--- a/hw/riscv/sifive_plic.c
36
+++ b/hw/intc/sifive_plic.c
28
+++ b/hw/riscv/sifive_plic.c
37
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@ static uint64_t sifive_plic_read(void *opaque, hwaddr addr, unsigned size)
38
#include "hw/pci/msi.h"
30
plic->addr_config[addrid].hartid,
39
#include "hw/boards.h"
31
mode_to_char(plic->addr_config[addrid].mode),
40
#include "hw/qdev-properties.h"
32
value);
41
+#include "hw/intc/sifive_plic.h"
33
- sifive_plic_print_state(plic);
42
#include "target/riscv/cpu.h"
34
}
43
#include "sysemu/sysemu.h"
35
+ sifive_plic_update(plic);
44
-#include "hw/riscv/sifive_plic.h"
36
return value;
45
37
}
46
#define RISCV_DEBUG_PLIC 0
38
}
47
39
@@ -XXX,XX +XXX,XX @@ static void sifive_plic_write(void *opaque, hwaddr addr, uint64_t value,
48
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
40
qemu_log("plic: write priority: irq=%d priority=%d\n",
49
index XXXXXXX..XXXXXXX 100644
41
irq, plic->source_priority[irq]);
50
--- a/hw/riscv/microchip_pfsoc.c
42
}
51
+++ b/hw/riscv/microchip_pfsoc.c
43
+ sifive_plic_update(plic);
52
@@ -XXX,XX +XXX,XX @@
44
return;
53
#include "hw/misc/unimp.h"
45
} else if (addr >= plic->pending_base && /* 1 bit per source */
54
#include "hw/riscv/boot.h"
46
addr < plic->pending_base + (plic->num_sources >> 3))
55
#include "hw/riscv/riscv_hart.h"
56
-#include "hw/riscv/sifive_plic.h"
57
#include "hw/riscv/microchip_pfsoc.h"
58
#include "hw/intc/sifive_clint.h"
59
+#include "hw/intc/sifive_plic.h"
60
#include "sysemu/sysemu.h"
61
62
/*
63
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/hw/riscv/sifive_e.c
66
+++ b/hw/riscv/sifive_e.c
67
@@ -XXX,XX +XXX,XX @@
68
#include "hw/misc/unimp.h"
69
#include "target/riscv/cpu.h"
70
#include "hw/riscv/riscv_hart.h"
71
-#include "hw/riscv/sifive_plic.h"
72
#include "hw/riscv/sifive_uart.h"
73
#include "hw/riscv/sifive_e.h"
74
#include "hw/riscv/boot.h"
75
#include "hw/intc/sifive_clint.h"
76
+#include "hw/intc/sifive_plic.h"
77
#include "hw/misc/sifive_e_prci.h"
78
#include "chardev/char.h"
79
#include "sysemu/arch_init.h"
80
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
81
index XXXXXXX..XXXXXXX 100644
82
--- a/hw/riscv/sifive_u.c
83
+++ b/hw/riscv/sifive_u.c
84
@@ -XXX,XX +XXX,XX @@
85
#include "hw/misc/unimp.h"
86
#include "target/riscv/cpu.h"
87
#include "hw/riscv/riscv_hart.h"
88
-#include "hw/riscv/sifive_plic.h"
89
#include "hw/riscv/sifive_uart.h"
90
#include "hw/riscv/sifive_u.h"
91
#include "hw/riscv/boot.h"
92
#include "hw/intc/sifive_clint.h"
93
+#include "hw/intc/sifive_plic.h"
94
#include "chardev/char.h"
95
#include "net/eth.h"
96
#include "sysemu/arch_init.h"
97
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
98
index XXXXXXX..XXXXXXX 100644
99
--- a/hw/riscv/virt.c
100
+++ b/hw/riscv/virt.c
101
@@ -XXX,XX +XXX,XX @@
102
#include "hw/char/serial.h"
103
#include "target/riscv/cpu.h"
104
#include "hw/riscv/riscv_hart.h"
105
-#include "hw/riscv/sifive_plic.h"
106
#include "hw/riscv/sifive_test.h"
107
#include "hw/riscv/virt.h"
108
#include "hw/riscv/boot.h"
109
#include "hw/riscv/numa.h"
110
#include "hw/intc/sifive_clint.h"
111
+#include "hw/intc/sifive_plic.h"
112
#include "chardev/char.h"
113
#include "sysemu/arch_init.h"
114
#include "sysemu/device_tree.h"
115
diff --git a/hw/intc/Kconfig b/hw/intc/Kconfig
116
index XXXXXXX..XXXXXXX 100644
117
--- a/hw/intc/Kconfig
118
+++ b/hw/intc/Kconfig
119
@@ -XXX,XX +XXX,XX @@ config LOONGSON_LIOINTC
120
121
config SIFIVE_CLINT
122
bool
123
+
124
+config SIFIVE_PLIC
125
+ bool
126
diff --git a/hw/intc/meson.build b/hw/intc/meson.build
127
index XXXXXXX..XXXXXXX 100644
128
--- a/hw/intc/meson.build
129
+++ b/hw/intc/meson.build
130
@@ -XXX,XX +XXX,XX @@ specific_ss.add(when: 'CONFIG_S390_FLIC', if_true: files('s390_flic.c'))
131
specific_ss.add(when: 'CONFIG_S390_FLIC_KVM', if_true: files('s390_flic_kvm.c'))
132
specific_ss.add(when: 'CONFIG_SH4', if_true: files('sh_intc.c'))
133
specific_ss.add(when: 'CONFIG_SIFIVE_CLINT', if_true: files('sifive_clint.c'))
134
+specific_ss.add(when: 'CONFIG_SIFIVE_PLIC', if_true: files('sifive_plic.c'))
135
specific_ss.add(when: 'CONFIG_XICS', if_true: files('xics.c'))
136
specific_ss.add(when: 'CONFIG_XICS_KVM', if_true: files('xics_kvm.c'))
137
specific_ss.add(when: 'CONFIG_XICS_SPAPR', if_true: files('xics_spapr.c'))
138
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
139
index XXXXXXX..XXXXXXX 100644
140
--- a/hw/riscv/Kconfig
141
+++ b/hw/riscv/Kconfig
142
@@ -XXX,XX +XXX,XX @@ config SIFIVE_E
143
select SIFIVE
144
select SIFIVE_CLINT
145
select SIFIVE_GPIO
146
+ select SIFIVE_PLIC
147
select SIFIVE_E_PRCI
148
select UNIMP
149
150
@@ -XXX,XX +XXX,XX @@ config SIFIVE_U
151
select SIFIVE_CLINT
152
select SIFIVE_GPIO
153
select SIFIVE_PDMA
154
+ select SIFIVE_PLIC
155
select SIFIVE_U_OTP
156
select SIFIVE_U_PRCI
157
select UNIMP
158
@@ -XXX,XX +XXX,XX @@ config SPIKE
159
select HTIF
160
select SIFIVE
161
select SIFIVE_CLINT
162
+ select SIFIVE_PLIC
163
164
config OPENTITAN
165
bool
166
@@ -XXX,XX +XXX,XX @@ config RISCV_VIRT
167
select PFLASH_CFI01
168
select SIFIVE
169
select SIFIVE_CLINT
170
+ select SIFIVE_PLIC
171
172
config MICROCHIP_PFSOC
173
bool
174
@@ -XXX,XX +XXX,XX @@ config MICROCHIP_PFSOC
175
select UNIMP
176
select MCHP_PFSOC_MMUART
177
select SIFIVE_PDMA
178
+ select SIFIVE_PLIC
179
select CADENCE_SDHCI
180
diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build
181
index XXXXXXX..XXXXXXX 100644
182
--- a/hw/riscv/meson.build
183
+++ b/hw/riscv/meson.build
184
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(files('numa.c'))
185
riscv_ss.add(when: 'CONFIG_HART', if_true: files('riscv_hart.c'))
186
riscv_ss.add(when: 'CONFIG_OPENTITAN', if_true: files('opentitan.c'))
187
riscv_ss.add(when: 'CONFIG_RISCV_VIRT', if_true: files('virt.c'))
188
-riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_plic.c'))
189
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_test.c'))
190
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_uart.c'))
191
riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e.c'))
192
--
47
--
193
2.28.0
48
2.27.0
194
49
195
50
diff view generated by jsdifflib
1
From: Nathan Chancellor <natechancellor@gmail.com>
1
Commit 5d971f9e672507210e77d020d89e0e89165c8fc9
2
"memory: Revert "memory: accept mismatching sizes in
3
memory_region_access_valid"" broke most RISC-V boards as they do 64 bit
4
accesses to the CLINT and QEMU would trigger a fault. Fix this failure
5
by allowing 8 byte accesses.
2
6
3
When shutting down the machine running a mainline Linux kernel, the
4
following error happens:
5
6
$ build/riscv64-softmmu/qemu-system-riscv64 -bios default -M virt \
7
-display none -initrd rootfs.cpio -kernel Image -m 512m \
8
-nodefaults -serial mon:stdio
9
...
10
Requesting system poweroff
11
[ 4.999630] reboot: Power down
12
sbi_trap_error: hart0: trap handler failed (error -2)
13
sbi_trap_error: hart0: mcause=0x0000000000000007 mtval=0x0000000000100000
14
sbi_trap_error: hart0: mepc=0x000000008000d4cc mstatus=0x0000000000001822
15
sbi_trap_error: hart0: ra=0x000000008000999e sp=0x0000000080015c78
16
sbi_trap_error: hart0: gp=0xffffffe000e76610 tp=0xffffffe0081b89c0
17
sbi_trap_error: hart0: s0=0x0000000080015c88 s1=0x0000000000000040
18
sbi_trap_error: hart0: a0=0x0000000000000000 a1=0x0000000080004024
19
sbi_trap_error: hart0: a2=0x0000000080004024 a3=0x0000000080004024
20
sbi_trap_error: hart0: a4=0x0000000000100000 a5=0x0000000000005555
21
sbi_trap_error: hart0: a6=0x0000000000004024 a7=0x0000000080011158
22
sbi_trap_error: hart0: s2=0x0000000000000000 s3=0x0000000080016000
23
sbi_trap_error: hart0: s4=0x0000000000000000 s5=0x0000000000000000
24
sbi_trap_error: hart0: s6=0x0000000000000001 s7=0x0000000000000000
25
sbi_trap_error: hart0: s8=0x0000000000000000 s9=0x0000000000000000
26
sbi_trap_error: hart0: s10=0x0000000000000000 s11=0x0000000000000008
27
sbi_trap_error: hart0: t0=0x0000000000000000 t1=0x0000000000000000
28
sbi_trap_error: hart0: t2=0x0000000000000000 t3=0x0000000000000000
29
sbi_trap_error: hart0: t4=0x0000000000000000 t5=0x0000000000000000
30
sbi_trap_error: hart0: t6=0x0000000000000000
31
32
The kernel does a 16-bit write when powering off the machine, which
33
was allowed before commit 5d971f9e67 ("memory: Revert "memory: accept
34
mismatching sizes in memory_region_access_valid""). Make min_access_size
35
match reality so that the machine can shut down properly now.
36
37
Cc: qemu-stable@nongnu.org
38
Fixes: 88a07990fa ("SiFive RISC-V Test Finisher")
39
Fixes: 5d971f9e67 ("memory: Revert "memory: accept mismatching sizes in memory_region_access_valid"")
40
Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
41
Acked-by: Michael S. Tsirkin <mst@redhat.com>
42
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
43
Message-Id: <20200901055822.2721209-1-natechancellor@gmail.com>
44
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: LIU Zhiwei<zhiwei_liu@c-sky.com>
9
Message-Id: <122b78825b077e4dfd39b444d3a46fe894a7804c.1593547870.git.alistair.francis@wdc.com>
45
---
10
---
46
hw/riscv/sifive_test.c | 2 +-
11
hw/riscv/sifive_clint.c | 2 +-
47
1 file changed, 1 insertion(+), 1 deletion(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
48
13
49
diff --git a/hw/riscv/sifive_test.c b/hw/riscv/sifive_test.c
14
diff --git a/hw/riscv/sifive_clint.c b/hw/riscv/sifive_clint.c
50
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
51
--- a/hw/riscv/sifive_test.c
16
--- a/hw/riscv/sifive_clint.c
52
+++ b/hw/riscv/sifive_test.c
17
+++ b/hw/riscv/sifive_clint.c
53
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps sifive_test_ops = {
18
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps sifive_clint_ops = {
54
.write = sifive_test_write,
19
.endianness = DEVICE_LITTLE_ENDIAN,
55
.endianness = DEVICE_NATIVE_ENDIAN,
56
.valid = {
20
.valid = {
57
- .min_access_size = 4,
21
.min_access_size = 4,
58
+ .min_access_size = 2,
22
- .max_access_size = 4
59
.max_access_size = 4
23
+ .max_access_size = 8
60
}
24
}
61
};
25
};
26
62
--
27
--
63
2.28.0
28
2.27.0
64
29
65
30
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
Now that we have the newly introduced 'resetvec' property in the
3
The 32 vector registers will be viewed as a continuous memory block.
4
RISC-V CPU and HART, instead of hard-coding the reset vector addr
4
It avoids the convension between element index and (regno, offset).
5
in the CPU's instance_init(), move that to riscv_cpu_realize()
5
Thus elements can be directly accessed by offset from the first vector
6
based on the configured property value from the RISC-V machines.
6
base address.
7
7
8
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Acked-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-Id: <1598924352-89526-4-git-send-email-bmeng.cn@gmail.com>
11
Message-Id: <20200701152549.1218-2-zhiwei_liu@c-sky.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/riscv/opentitan.c | 1 +
14
target/riscv/cpu.h | 12 ++++++++++++
15
hw/riscv/sifive_e.c | 1 +
15
target/riscv/translate.c | 3 ++-
16
hw/riscv/sifive_u.c | 2 ++
16
2 files changed, 14 insertions(+), 1 deletion(-)
17
target/riscv/cpu.c | 7 ++-----
18
4 files changed, 6 insertions(+), 5 deletions(-)
19
17
20
diff --git a/hw/riscv/opentitan.c b/hw/riscv/opentitan.c
18
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
21
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/riscv/opentitan.c
20
--- a/target/riscv/cpu.h
23
+++ b/hw/riscv/opentitan.c
21
+++ b/target/riscv/cpu.h
24
@@ -XXX,XX +XXX,XX @@ static void lowrisc_ibex_soc_realize(DeviceState *dev_soc, Error **errp)
22
@@ -XXX,XX +XXX,XX @@
25
&error_abort);
23
#define RVA RV('A')
26
object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
24
#define RVF RV('F')
27
&error_abort);
25
#define RVD RV('D')
28
+ object_property_set_int(OBJECT(&s->cpus), "resetvec", 0x8090, &error_abort);
26
+#define RVV RV('V')
29
sysbus_realize(SYS_BUS_DEVICE(&s->cpus), &error_abort);
27
#define RVC RV('C')
30
28
#define RVS RV('S')
31
/* Boot ROM */
29
#define RVU RV('U')
32
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
30
@@ -XXX,XX +XXX,XX @@ typedef struct CPURISCVState CPURISCVState;
31
32
#include "pmp.h"
33
34
+#define RV_VLEN_MAX 512
35
+
36
struct CPURISCVState {
37
target_ulong gpr[32];
38
uint64_t fpr[32]; /* assume both F and D extensions */
39
+
40
+ /* vector coprocessor state. */
41
+ uint64_t vreg[32 * RV_VLEN_MAX / 64] QEMU_ALIGNED(16);
42
+ target_ulong vxrm;
43
+ target_ulong vxsat;
44
+ target_ulong vl;
45
+ target_ulong vstart;
46
+ target_ulong vtype;
47
+
48
target_ulong pc;
49
target_ulong load_res;
50
target_ulong load_val;
51
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
33
index XXXXXXX..XXXXXXX 100644
52
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/riscv/sifive_e.c
53
--- a/target/riscv/translate.c
35
+++ b/hw/riscv/sifive_e.c
54
+++ b/target/riscv/translate.c
36
@@ -XXX,XX +XXX,XX @@ static void sifive_e_soc_init(Object *obj)
55
@@ -XXX,XX +XXX,XX @@
37
object_initialize_child(obj, "cpus", &s->cpus, TYPE_RISCV_HART_ARRAY);
56
#include "instmap.h"
38
object_property_set_int(OBJECT(&s->cpus), "num-harts", ms->smp.cpus,
57
39
&error_abort);
58
/* global register indices */
40
+ object_property_set_int(OBJECT(&s->cpus), "resetvec", 0x1004, &error_abort);
59
-static TCGv cpu_gpr[32], cpu_pc;
41
object_initialize_child(obj, "riscv.sifive.e.gpio0", &s->gpio,
60
+static TCGv cpu_gpr[32], cpu_pc, cpu_vl;
42
TYPE_SIFIVE_GPIO);
61
static TCGv_i64 cpu_fpr[32]; /* assume F and D extensions */
43
}
62
static TCGv load_res;
44
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
63
static TCGv load_val;
45
index XXXXXXX..XXXXXXX 100644
64
@@ -XXX,XX +XXX,XX @@ void riscv_translate_init(void)
46
--- a/hw/riscv/sifive_u.c
47
+++ b/hw/riscv/sifive_u.c
48
@@ -XXX,XX +XXX,XX @@ static void sifive_u_soc_instance_init(Object *obj)
49
qdev_prop_set_uint32(DEVICE(&s->e_cpus), "num-harts", 1);
50
qdev_prop_set_uint32(DEVICE(&s->e_cpus), "hartid-base", 0);
51
qdev_prop_set_string(DEVICE(&s->e_cpus), "cpu-type", SIFIVE_E_CPU);
52
+ qdev_prop_set_uint64(DEVICE(&s->e_cpus), "resetvec", 0x1004);
53
54
object_initialize_child(obj, "u-cluster", &s->u_cluster, TYPE_CPU_CLUSTER);
55
qdev_prop_set_uint32(DEVICE(&s->u_cluster), "cluster-id", 1);
56
@@ -XXX,XX +XXX,XX @@ static void sifive_u_soc_instance_init(Object *obj)
57
qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", ms->smp.cpus - 1);
58
qdev_prop_set_uint32(DEVICE(&s->u_cpus), "hartid-base", 1);
59
qdev_prop_set_string(DEVICE(&s->u_cpus), "cpu-type", SIFIVE_U_CPU);
60
+ qdev_prop_set_uint64(DEVICE(&s->u_cpus), "resetvec", 0x1004);
61
62
object_initialize_child(obj, "prci", &s->prci, TYPE_SIFIVE_U_PRCI);
63
object_initialize_child(obj, "otp", &s->otp, TYPE_SIFIVE_U_OTP);
64
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
65
index XXXXXXX..XXXXXXX 100644
66
--- a/target/riscv/cpu.c
67
+++ b/target/riscv/cpu.c
68
@@ -XXX,XX +XXX,XX @@ static void riscv_any_cpu_init(Object *obj)
69
CPURISCVState *env = &RISCV_CPU(obj)->env;
70
set_misa(env, RVXLEN | RVI | RVM | RVA | RVF | RVD | RVC | RVU);
71
set_priv_version(env, PRIV_VERSION_1_11_0);
72
- set_resetvec(env, DEFAULT_RSTVEC);
73
}
74
75
static void riscv_base_cpu_init(Object *obj)
76
@@ -XXX,XX +XXX,XX @@ static void riscv_base_cpu_init(Object *obj)
77
CPURISCVState *env = &RISCV_CPU(obj)->env;
78
/* We set this in the realise function */
79
set_misa(env, 0);
80
- set_resetvec(env, DEFAULT_RSTVEC);
81
}
82
83
static void rvxx_sifive_u_cpu_init(Object *obj)
84
@@ -XXX,XX +XXX,XX @@ static void rvxx_sifive_u_cpu_init(Object *obj)
85
CPURISCVState *env = &RISCV_CPU(obj)->env;
86
set_misa(env, RVXLEN | RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
87
set_priv_version(env, PRIV_VERSION_1_10_0);
88
- set_resetvec(env, 0x1004);
89
}
90
91
static void rvxx_sifive_e_cpu_init(Object *obj)
92
@@ -XXX,XX +XXX,XX @@ static void rvxx_sifive_e_cpu_init(Object *obj)
93
CPURISCVState *env = &RISCV_CPU(obj)->env;
94
set_misa(env, RVXLEN | RVI | RVM | RVA | RVC | RVU);
95
set_priv_version(env, PRIV_VERSION_1_10_0);
96
- set_resetvec(env, 0x1004);
97
qdev_prop_set_bit(DEVICE(obj), "mmu", false);
98
}
99
100
@@ -XXX,XX +XXX,XX @@ static void rv32_ibex_cpu_init(Object *obj)
101
CPURISCVState *env = &RISCV_CPU(obj)->env;
102
set_misa(env, RV32 | RVI | RVM | RVC | RVU);
103
set_priv_version(env, PRIV_VERSION_1_10_0);
104
- set_resetvec(env, 0x8090);
105
qdev_prop_set_bit(DEVICE(obj), "mmu", false);
106
}
107
108
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
109
set_feature(env, RISCV_FEATURE_PMP);
110
}
65
}
111
66
112
+ set_resetvec(env, cpu->cfg.resetvec);
67
cpu_pc = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, pc), "pc");
113
+
68
+ cpu_vl = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, vl), "vl");
114
/* If misa isn't set (rv32 and rv64 machines) set it here */
69
load_res = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, load_res),
115
if (!env->misa) {
70
"load_res");
116
/* Do some ISA extension error checking */
71
load_val = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, load_val),
117
--
72
--
118
2.28.0
73
2.27.0
119
74
120
75
diff view generated by jsdifflib
1
From: Yifei Jiang <jiangyifei@huawei.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
When the cause number is equal to or greater than 23, print "(unknown)" in
3
vlen is the vector register length in bits.
4
trace_riscv_trap. The max valid number of riscv_excp_names is 23, so the last
4
elen is the max element size in bits.
5
excpetion "guest_store_page_fault" can not be printed.
5
vext_spec is the vector specification version, default value is v0.7.1.
6
6
7
In addition, the current check of cause is invalid for riscv_intr_names. So
7
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
8
introduce riscv_cpu_get_trap_name to get the trap cause name.
9
10
Signed-off-by: Yifei Jiang <jiangyifei@huawei.com>
11
Signed-off-by: Yipeng Yin <yinyipeng1@huawei.com>
12
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Message-Id: <20200814035819.1214-1-jiangyifei@huawei.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-Id: <20200701152549.1218-3-zhiwei_liu@c-sky.com>
14
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
15
---
12
---
16
target/riscv/cpu.h | 1 +
13
target/riscv/cpu.h | 5 +++++
17
target/riscv/cpu.c | 11 +++++++++++
14
target/riscv/cpu.c | 7 +++++++
18
target/riscv/cpu_helper.c | 4 ++--
15
2 files changed, 12 insertions(+)
19
3 files changed, 14 insertions(+), 2 deletions(-)
20
16
21
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
17
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
22
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
23
--- a/target/riscv/cpu.h
19
--- a/target/riscv/cpu.h
24
+++ b/target/riscv/cpu.h
20
+++ b/target/riscv/cpu.h
25
@@ -XXX,XX +XXX,XX @@ extern const char * const riscv_fpr_regnames[];
21
@@ -XXX,XX +XXX,XX @@ enum {
26
extern const char * const riscv_excp_names[];
22
#define PRIV_VERSION_1_10_0 0x00011000
27
extern const char * const riscv_intr_names[];
23
#define PRIV_VERSION_1_11_0 0x00011100
28
24
29
+const char *riscv_cpu_get_trap_name(target_ulong cause, bool async);
25
+#define VEXT_VERSION_0_07_1 0x00000701
30
void riscv_cpu_do_interrupt(CPUState *cpu);
26
+
31
int riscv_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
27
#define TRANSLATE_PMP_FAIL 2
32
int riscv_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
28
#define TRANSLATE_FAIL 1
29
#define TRANSLATE_SUCCESS 0
30
@@ -XXX,XX +XXX,XX @@ struct CPURISCVState {
31
target_ulong guest_phys_fault_addr;
32
33
target_ulong priv_ver;
34
+ target_ulong vext_ver;
35
target_ulong misa;
36
target_ulong misa_mask;
37
38
@@ -XXX,XX +XXX,XX @@ typedef struct RISCVCPU {
39
40
char *priv_spec;
41
char *user_spec;
42
+ uint16_t vlen;
43
+ uint16_t elen;
44
bool mmu;
45
bool pmp;
46
} cfg;
33
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
47
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
34
index XXXXXXX..XXXXXXX 100644
48
index XXXXXXX..XXXXXXX 100644
35
--- a/target/riscv/cpu.c
49
--- a/target/riscv/cpu.c
36
+++ b/target/riscv/cpu.c
50
+++ b/target/riscv/cpu.c
37
@@ -XXX,XX +XXX,XX @@ const char * const riscv_intr_names[] = {
51
@@ -XXX,XX +XXX,XX @@ static void set_priv_version(CPURISCVState *env, int priv_ver)
38
"reserved"
52
env->priv_ver = priv_ver;
39
};
53
}
40
54
41
+const char *riscv_cpu_get_trap_name(target_ulong cause, bool async)
55
+static void set_vext_version(CPURISCVState *env, int vext_ver)
42
+{
56
+{
43
+ if (async) {
57
+ env->vext_ver = vext_ver;
44
+ return (cause < ARRAY_SIZE(riscv_intr_names)) ?
45
+ riscv_intr_names[cause] : "(unknown)";
46
+ } else {
47
+ return (cause < ARRAY_SIZE(riscv_excp_names)) ?
48
+ riscv_excp_names[cause] : "(unknown)";
49
+ }
50
+}
58
+}
51
+
59
+
52
static void set_misa(CPURISCVState *env, target_ulong misa)
60
static void set_feature(CPURISCVState *env, int feature)
53
{
61
{
54
env->misa_mask = env->misa = misa;
62
env->features |= (1ULL << feature);
55
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
63
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
56
index XXXXXXX..XXXXXXX 100644
64
CPURISCVState *env = &cpu->env;
57
--- a/target/riscv/cpu_helper.c
65
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(dev);
58
+++ b/target/riscv/cpu_helper.c
66
int priv_version = PRIV_VERSION_1_11_0;
59
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_do_interrupt(CPUState *cs)
67
+ int vext_version = VEXT_VERSION_0_07_1;
60
}
68
target_ulong target_misa = 0;
69
Error *local_err = NULL;
70
71
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
61
}
72
}
62
73
63
- trace_riscv_trap(env->mhartid, async, cause, env->pc, tval, cause < 23 ?
74
set_priv_version(env, priv_version);
64
- (async ? riscv_intr_names : riscv_excp_names)[cause] : "(unknown)");
75
+ set_vext_version(env, vext_version);
65
+ trace_riscv_trap(env->mhartid, async, cause, env->pc, tval,
76
66
+ riscv_cpu_get_trap_name(cause, async));
77
if (cpu->cfg.mmu) {
67
78
set_feature(env, RISCV_FEATURE_MMU);
68
if (env->priv <= PRV_S &&
69
cause < TARGET_LONG_BITS && ((deleg >> cause) & 1)) {
70
--
79
--
71
2.28.0
80
2.27.0
72
81
73
82
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
At present the CLINT timestamp is using a hard-coded timebase
3
The v0.7.1 specification does not define vector status within mstatus.
4
frequency value SIFIVE_CLINT_TIMEBASE_FREQ. This might not be
4
A future revision will define the privileged portion of the vector status.
5
true for all boards.
6
5
7
Add a new 'timebase-freq' property to the CLINT device, and
6
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
8
update various functions to accept this as a parameter.
9
10
Signed-off-by: Bin Meng <bin.meng@windriver.com>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-Id: <1598924352-89526-16-git-send-email-bmeng.cn@gmail.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-Id: <20200701152549.1218-4-zhiwei_liu@c-sky.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
11
---
15
include/hw/riscv/sifive_clint.h | 4 +++-
12
target/riscv/cpu_bits.h | 15 +++++++++
16
target/riscv/cpu.h | 6 ++++--
13
target/riscv/csr.c | 75 ++++++++++++++++++++++++++++++++++++++++-
17
hw/riscv/microchip_pfsoc.c | 6 +++++-
14
2 files changed, 89 insertions(+), 1 deletion(-)
18
hw/riscv/sifive_clint.c | 26 +++++++++++++++-----------
19
hw/riscv/sifive_e.c | 3 ++-
20
hw/riscv/sifive_u.c | 3 ++-
21
hw/riscv/spike.c | 3 ++-
22
hw/riscv/virt.c | 3 ++-
23
target/riscv/cpu_helper.c | 4 +++-
24
target/riscv/csr.c | 4 ++--
25
10 files changed, 40 insertions(+), 22 deletions(-)
26
15
27
diff --git a/include/hw/riscv/sifive_clint.h b/include/hw/riscv/sifive_clint.h
16
diff --git a/target/riscv/cpu_bits.h b/target/riscv/cpu_bits.h
28
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
29
--- a/include/hw/riscv/sifive_clint.h
18
--- a/target/riscv/cpu_bits.h
30
+++ b/include/hw/riscv/sifive_clint.h
19
+++ b/target/riscv/cpu_bits.h
31
@@ -XXX,XX +XXX,XX @@ typedef struct SiFiveCLINTState {
32
uint32_t timecmp_base;
33
uint32_t time_base;
34
uint32_t aperture_size;
35
+ uint32_t timebase_freq;
36
} SiFiveCLINTState;
37
38
DeviceState *sifive_clint_create(hwaddr addr, hwaddr size,
39
uint32_t hartid_base, uint32_t num_harts, uint32_t sip_base,
40
- uint32_t timecmp_base, uint32_t time_base, bool provide_rdtime);
41
+ uint32_t timecmp_base, uint32_t time_base, uint32_t timebase_freq,
42
+ bool provide_rdtime);
43
44
enum {
45
SIFIVE_SIP_BASE = 0x0,
46
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/riscv/cpu.h
49
+++ b/target/riscv/cpu.h
50
@@ -XXX,XX +XXX,XX @@ struct CPURISCVState {
51
pmp_table_t pmp_state;
52
53
/* machine specific rdtime callback */
54
- uint64_t (*rdtime_fn)(void);
55
+ uint64_t (*rdtime_fn)(uint32_t);
56
+ uint32_t rdtime_fn_arg;
57
58
/* True if in debugger mode. */
59
bool debugger;
60
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_swap_hypervisor_regs(CPURISCVState *env);
61
int riscv_cpu_claim_interrupts(RISCVCPU *cpu, uint32_t interrupts);
62
uint32_t riscv_cpu_update_mip(RISCVCPU *cpu, uint32_t mask, uint32_t value);
63
#define BOOL_TO_MASK(x) (-!!(x)) /* helper for riscv_cpu_update_mip value */
64
-void riscv_cpu_set_rdtime_fn(CPURISCVState *env, uint64_t (*fn)(void));
65
+void riscv_cpu_set_rdtime_fn(CPURISCVState *env, uint64_t (*fn)(uint32_t),
66
+ uint32_t arg);
67
#endif
68
void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv);
69
70
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
71
index XXXXXXX..XXXXXXX 100644
72
--- a/hw/riscv/microchip_pfsoc.c
73
+++ b/hw/riscv/microchip_pfsoc.c
74
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@
75
#define BIOS_FILENAME "hss.bin"
21
#define FSR_NXA (FPEXC_NX << FSR_AEXC_SHIFT)
76
#define RESET_VECTOR 0x20220000
22
#define FSR_AEXC (FSR_NVA | FSR_OFA | FSR_UFA | FSR_DZA | FSR_NXA)
77
23
78
+/* CLINT timebase frequency */
24
+/* Vector Fixed-Point round model */
79
+#define CLINT_TIMEBASE_FREQ 1000000
25
+#define FSR_VXRM_SHIFT 9
26
+#define FSR_VXRM (0x3 << FSR_VXRM_SHIFT)
80
+
27
+
81
/* GEM version */
28
+/* Vector Fixed-Point saturation flag */
82
#define GEM_REVISION 0x0107010c
29
+#define FSR_VXSAT_SHIFT 8
83
30
+#define FSR_VXSAT (0x1 << FSR_VXSAT_SHIFT)
84
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
31
+
85
/* CLINT */
32
/* Control and Status Registers */
86
sifive_clint_create(memmap[MICROCHIP_PFSOC_CLINT].base,
33
87
memmap[MICROCHIP_PFSOC_CLINT].size, 0, ms->smp.cpus,
34
/* User Trap Setup */
88
- SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE, false);
89
+ SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE,
90
+ CLINT_TIMEBASE_FREQ, false);
91
92
/* L2 cache controller */
93
create_unimplemented_device("microchip.pfsoc.l2cc",
94
diff --git a/hw/riscv/sifive_clint.c b/hw/riscv/sifive_clint.c
95
index XXXXXXX..XXXXXXX 100644
96
--- a/hw/riscv/sifive_clint.c
97
+++ b/hw/riscv/sifive_clint.c
98
@@ -XXX,XX +XXX,XX @@
35
@@ -XXX,XX +XXX,XX @@
99
#include "hw/riscv/sifive_clint.h"
36
#define CSR_FRM 0x002
100
#include "qemu/timer.h"
37
#define CSR_FCSR 0x003
101
38
102
-static uint64_t cpu_riscv_read_rtc(void)
39
+/* User Vector CSRs */
103
+static uint64_t cpu_riscv_read_rtc(uint32_t timebase_freq)
40
+#define CSR_VSTART 0x008
104
{
41
+#define CSR_VXSAT 0x009
105
return muldiv64(qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL),
42
+#define CSR_VXRM 0x00a
106
- SIFIVE_CLINT_TIMEBASE_FREQ, NANOSECONDS_PER_SECOND);
43
+#define CSR_VL 0xc20
107
+ timebase_freq, NANOSECONDS_PER_SECOND);
44
+#define CSR_VTYPE 0xc21
108
}
45
+
109
46
/* User Timers and Counters */
110
/*
47
#define CSR_CYCLE 0xc00
111
* Called when timecmp is written to update the QEMU timer or immediately
48
#define CSR_TIME 0xc01
112
* trigger timer interrupt if mtimecmp <= current timer value.
113
*/
114
-static void sifive_clint_write_timecmp(RISCVCPU *cpu, uint64_t value)
115
+static void sifive_clint_write_timecmp(RISCVCPU *cpu, uint64_t value,
116
+ uint32_t timebase_freq)
117
{
118
uint64_t next;
119
uint64_t diff;
120
121
- uint64_t rtc_r = cpu_riscv_read_rtc();
122
+ uint64_t rtc_r = cpu_riscv_read_rtc(timebase_freq);
123
124
cpu->env.timecmp = value;
125
if (cpu->env.timecmp <= rtc_r) {
126
@@ -XXX,XX +XXX,XX @@ static void sifive_clint_write_timecmp(RISCVCPU *cpu, uint64_t value)
127
diff = cpu->env.timecmp - rtc_r;
128
/* back to ns (note args switched in muldiv64) */
129
next = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
130
- muldiv64(diff, NANOSECONDS_PER_SECOND, SIFIVE_CLINT_TIMEBASE_FREQ);
131
+ muldiv64(diff, NANOSECONDS_PER_SECOND, timebase_freq);
132
timer_mod(cpu->env.timer, next);
133
}
134
135
@@ -XXX,XX +XXX,XX @@ static uint64_t sifive_clint_read(void *opaque, hwaddr addr, unsigned size)
136
}
137
} else if (addr == clint->time_base) {
138
/* time_lo */
139
- return cpu_riscv_read_rtc() & 0xFFFFFFFF;
140
+ return cpu_riscv_read_rtc(clint->timebase_freq) & 0xFFFFFFFF;
141
} else if (addr == clint->time_base + 4) {
142
/* time_hi */
143
- return (cpu_riscv_read_rtc() >> 32) & 0xFFFFFFFF;
144
+ return (cpu_riscv_read_rtc(clint->timebase_freq) >> 32) & 0xFFFFFFFF;
145
}
146
147
error_report("clint: invalid read: %08x", (uint32_t)addr);
148
@@ -XXX,XX +XXX,XX @@ static void sifive_clint_write(void *opaque, hwaddr addr, uint64_t value,
149
/* timecmp_lo */
150
uint64_t timecmp_hi = env->timecmp >> 32;
151
sifive_clint_write_timecmp(RISCV_CPU(cpu),
152
- timecmp_hi << 32 | (value & 0xFFFFFFFF));
153
+ timecmp_hi << 32 | (value & 0xFFFFFFFF), clint->timebase_freq);
154
return;
155
} else if ((addr & 0x7) == 4) {
156
/* timecmp_hi */
157
uint64_t timecmp_lo = env->timecmp;
158
sifive_clint_write_timecmp(RISCV_CPU(cpu),
159
- value << 32 | (timecmp_lo & 0xFFFFFFFF));
160
+ value << 32 | (timecmp_lo & 0xFFFFFFFF), clint->timebase_freq);
161
} else {
162
error_report("clint: invalid timecmp write: %08x", (uint32_t)addr);
163
}
164
@@ -XXX,XX +XXX,XX @@ static Property sifive_clint_properties[] = {
165
DEFINE_PROP_UINT32("timecmp-base", SiFiveCLINTState, timecmp_base, 0),
166
DEFINE_PROP_UINT32("time-base", SiFiveCLINTState, time_base, 0),
167
DEFINE_PROP_UINT32("aperture-size", SiFiveCLINTState, aperture_size, 0),
168
+ DEFINE_PROP_UINT32("timebase-freq", SiFiveCLINTState, timebase_freq, 0),
169
DEFINE_PROP_END_OF_LIST(),
170
};
171
172
@@ -XXX,XX +XXX,XX @@ type_init(sifive_clint_register_types)
173
*/
174
DeviceState *sifive_clint_create(hwaddr addr, hwaddr size,
175
uint32_t hartid_base, uint32_t num_harts, uint32_t sip_base,
176
- uint32_t timecmp_base, uint32_t time_base, bool provide_rdtime)
177
+ uint32_t timecmp_base, uint32_t time_base, uint32_t timebase_freq,
178
+ bool provide_rdtime)
179
{
180
int i;
181
for (i = 0; i < num_harts; i++) {
182
@@ -XXX,XX +XXX,XX @@ DeviceState *sifive_clint_create(hwaddr addr, hwaddr size,
183
continue;
184
}
185
if (provide_rdtime) {
186
- riscv_cpu_set_rdtime_fn(env, cpu_riscv_read_rtc);
187
+ riscv_cpu_set_rdtime_fn(env, cpu_riscv_read_rtc, timebase_freq);
188
}
189
env->timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
190
&sifive_clint_timer_cb, cpu);
191
@@ -XXX,XX +XXX,XX @@ DeviceState *sifive_clint_create(hwaddr addr, hwaddr size,
192
qdev_prop_set_uint32(dev, "timecmp-base", timecmp_base);
193
qdev_prop_set_uint32(dev, "time-base", time_base);
194
qdev_prop_set_uint32(dev, "aperture-size", size);
195
+ qdev_prop_set_uint32(dev, "timebase-freq", timebase_freq);
196
sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
197
sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, addr);
198
return dev;
199
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
200
index XXXXXXX..XXXXXXX 100644
201
--- a/hw/riscv/sifive_e.c
202
+++ b/hw/riscv/sifive_e.c
203
@@ -XXX,XX +XXX,XX @@ static void sifive_e_soc_realize(DeviceState *dev, Error **errp)
204
memmap[SIFIVE_E_PLIC].size);
205
sifive_clint_create(memmap[SIFIVE_E_CLINT].base,
206
memmap[SIFIVE_E_CLINT].size, 0, ms->smp.cpus,
207
- SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE, false);
208
+ SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE,
209
+ SIFIVE_CLINT_TIMEBASE_FREQ, false);
210
create_unimplemented_device("riscv.sifive.e.aon",
211
memmap[SIFIVE_E_AON].base, memmap[SIFIVE_E_AON].size);
212
sifive_e_prci_create(memmap[SIFIVE_E_PRCI].base);
213
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
214
index XXXXXXX..XXXXXXX 100644
215
--- a/hw/riscv/sifive_u.c
216
+++ b/hw/riscv/sifive_u.c
217
@@ -XXX,XX +XXX,XX @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
218
serial_hd(1), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_U_UART1_IRQ));
219
sifive_clint_create(memmap[SIFIVE_U_CLINT].base,
220
memmap[SIFIVE_U_CLINT].size, 0, ms->smp.cpus,
221
- SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE, false);
222
+ SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE,
223
+ SIFIVE_CLINT_TIMEBASE_FREQ, false);
224
225
if (!sysbus_realize(SYS_BUS_DEVICE(&s->prci), errp)) {
226
return;
227
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
228
index XXXXXXX..XXXXXXX 100644
229
--- a/hw/riscv/spike.c
230
+++ b/hw/riscv/spike.c
231
@@ -XXX,XX +XXX,XX @@ static void spike_board_init(MachineState *machine)
232
sifive_clint_create(
233
memmap[SPIKE_CLINT].base + i * memmap[SPIKE_CLINT].size,
234
memmap[SPIKE_CLINT].size, base_hartid, hart_count,
235
- SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE, false);
236
+ SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE,
237
+ SIFIVE_CLINT_TIMEBASE_FREQ, false);
238
}
239
240
/* register system main memory (actual RAM) */
241
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
242
index XXXXXXX..XXXXXXX 100644
243
--- a/hw/riscv/virt.c
244
+++ b/hw/riscv/virt.c
245
@@ -XXX,XX +XXX,XX @@ static void virt_machine_init(MachineState *machine)
246
sifive_clint_create(
247
memmap[VIRT_CLINT].base + i * memmap[VIRT_CLINT].size,
248
memmap[VIRT_CLINT].size, base_hartid, hart_count,
249
- SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE, true);
250
+ SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE,
251
+ SIFIVE_CLINT_TIMEBASE_FREQ, true);
252
253
/* Per-socket PLIC hart topology configuration string */
254
plic_hart_config_len =
255
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
256
index XXXXXXX..XXXXXXX 100644
257
--- a/target/riscv/cpu_helper.c
258
+++ b/target/riscv/cpu_helper.c
259
@@ -XXX,XX +XXX,XX @@ uint32_t riscv_cpu_update_mip(RISCVCPU *cpu, uint32_t mask, uint32_t value)
260
return old;
261
}
262
263
-void riscv_cpu_set_rdtime_fn(CPURISCVState *env, uint64_t (*fn)(void))
264
+void riscv_cpu_set_rdtime_fn(CPURISCVState *env, uint64_t (*fn)(uint32_t),
265
+ uint32_t arg)
266
{
267
env->rdtime_fn = fn;
268
+ env->rdtime_fn_arg = arg;
269
}
270
271
void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv)
272
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
49
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
273
index XXXXXXX..XXXXXXX 100644
50
index XXXXXXX..XXXXXXX 100644
274
--- a/target/riscv/csr.c
51
--- a/target/riscv/csr.c
275
+++ b/target/riscv/csr.c
52
+++ b/target/riscv/csr.c
276
@@ -XXX,XX +XXX,XX @@ static int read_time(CPURISCVState *env, int csrno, target_ulong *val)
53
@@ -XXX,XX +XXX,XX @@ void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops)
277
return -RISCV_EXCP_ILLEGAL_INST;
54
static int fs(CPURISCVState *env, int csrno)
55
{
56
#if !defined(CONFIG_USER_ONLY)
57
+ /* loose check condition for fcsr in vector extension */
58
+ if ((csrno == CSR_FCSR) && (env->misa & RVV)) {
59
+ return 0;
60
+ }
61
if (!env->debugger && !riscv_cpu_fp_enabled(env)) {
62
return -1;
278
}
63
}
279
64
@@ -XXX,XX +XXX,XX @@ static int fs(CPURISCVState *env, int csrno)
280
- *val = env->rdtime_fn() + delta;
281
+ *val = env->rdtime_fn(env->rdtime_fn_arg) + delta;
282
return 0;
65
return 0;
283
}
66
}
284
67
285
@@ -XXX,XX +XXX,XX @@ static int read_timeh(CPURISCVState *env, int csrno, target_ulong *val)
68
+static int vs(CPURISCVState *env, int csrno)
286
return -RISCV_EXCP_ILLEGAL_INST;
69
+{
287
}
70
+ if (env->misa & RVV) {
288
71
+ return 0;
289
- *val = (env->rdtime_fn() + delta) >> 32;
72
+ }
290
+ *val = (env->rdtime_fn(env->rdtime_fn_arg) + delta) >> 32;
73
+ return -1;
74
+}
75
+
76
static int ctr(CPURISCVState *env, int csrno)
77
{
78
#if !defined(CONFIG_USER_ONLY)
79
@@ -XXX,XX +XXX,XX @@ static int read_fcsr(CPURISCVState *env, int csrno, target_ulong *val)
80
#endif
81
*val = (riscv_cpu_get_fflags(env) << FSR_AEXC_SHIFT)
82
| (env->frm << FSR_RD_SHIFT);
83
+ if (vs(env, csrno) >= 0) {
84
+ *val |= (env->vxrm << FSR_VXRM_SHIFT)
85
+ | (env->vxsat << FSR_VXSAT_SHIFT);
86
+ }
291
return 0;
87
return 0;
292
}
88
}
89
90
@@ -XXX,XX +XXX,XX @@ static int write_fcsr(CPURISCVState *env, int csrno, target_ulong val)
91
env->mstatus |= MSTATUS_FS;
293
#endif
92
#endif
93
env->frm = (val & FSR_RD) >> FSR_RD_SHIFT;
94
+ if (vs(env, csrno) >= 0) {
95
+ env->vxrm = (val & FSR_VXRM) >> FSR_VXRM_SHIFT;
96
+ env->vxsat = (val & FSR_VXSAT) >> FSR_VXSAT_SHIFT;
97
+ }
98
riscv_cpu_set_fflags(env, (val & FSR_AEXC) >> FSR_AEXC_SHIFT);
99
return 0;
100
}
101
102
+static int read_vtype(CPURISCVState *env, int csrno, target_ulong *val)
103
+{
104
+ *val = env->vtype;
105
+ return 0;
106
+}
107
+
108
+static int read_vl(CPURISCVState *env, int csrno, target_ulong *val)
109
+{
110
+ *val = env->vl;
111
+ return 0;
112
+}
113
+
114
+static int read_vxrm(CPURISCVState *env, int csrno, target_ulong *val)
115
+{
116
+ *val = env->vxrm;
117
+ return 0;
118
+}
119
+
120
+static int write_vxrm(CPURISCVState *env, int csrno, target_ulong val)
121
+{
122
+ env->vxrm = val;
123
+ return 0;
124
+}
125
+
126
+static int read_vxsat(CPURISCVState *env, int csrno, target_ulong *val)
127
+{
128
+ *val = env->vxsat;
129
+ return 0;
130
+}
131
+
132
+static int write_vxsat(CPURISCVState *env, int csrno, target_ulong val)
133
+{
134
+ env->vxsat = val;
135
+ return 0;
136
+}
137
+
138
+static int read_vstart(CPURISCVState *env, int csrno, target_ulong *val)
139
+{
140
+ *val = env->vstart;
141
+ return 0;
142
+}
143
+
144
+static int write_vstart(CPURISCVState *env, int csrno, target_ulong val)
145
+{
146
+ env->vstart = val;
147
+ return 0;
148
+}
149
+
150
/* User Timers and Counters */
151
static int read_instret(CPURISCVState *env, int csrno, target_ulong *val)
152
{
153
@@ -XXX,XX +XXX,XX @@ static riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
154
[CSR_FFLAGS] = { fs, read_fflags, write_fflags },
155
[CSR_FRM] = { fs, read_frm, write_frm },
156
[CSR_FCSR] = { fs, read_fcsr, write_fcsr },
157
-
158
+ /* Vector CSRs */
159
+ [CSR_VSTART] = { vs, read_vstart, write_vstart },
160
+ [CSR_VXSAT] = { vs, read_vxsat, write_vxsat },
161
+ [CSR_VXRM] = { vs, read_vxrm, write_vxrm },
162
+ [CSR_VL] = { vs, read_vl },
163
+ [CSR_VTYPE] = { vs, read_vtype },
164
/* User Timers and Counters */
165
[CSR_CYCLE] = { ctr, read_instret },
166
[CSR_INSTRET] = { ctr, read_instret },
294
--
167
--
295
2.28.0
168
2.27.0
296
169
297
170
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
This is an initial support for Microchip PolarFire SoC Icicle Kit.
3
vsetvl and vsetvli are two configure instructions for vl, vtype. TB flags
4
The Icicle Kit board integrates a PolarFire SoC, with one SiFive's
4
should update after configure instructions. The (ill, lmul, sew ) of vtype
5
E51 plus four U54 cores and many on-chip peripherals and an FPGA.
5
and the bit of (VSTART == 0 && VL == VLMAX) will be placed within tb_flags.
6
6
7
For more details about Microchip PolarFire Soc, please see:
7
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
8
https://www.microsemi.com/product-directory/soc-fpgas/5498-polarfire-soc-fpga
9
10
Unlike SiFive FU540, the RISC-V core resect vector is at 0x20220000.
11
The following perepherals are created as an unimplemented device:
12
13
- Bus Error Uint 0/1/2/3/4
14
- L2 cache controller
15
- SYSREG
16
- MPUCFG
17
- IOSCBCFG
18
19
More devices will be added later.
20
21
The BIOS image used by this machine is hss.bin, aka Hart Software
22
Services, which can be built from:
23
https://github.com/polarfire-soc/hart-software-services
24
25
To launch this machine:
26
$ qemu-system-riscv64 -nographic -M microchip-icicle-kit
27
28
The memory is set to 1 GiB by default to match the hardware.
29
A sanity check on ram size is performed in the machine init routine
30
to prompt user to increase the RAM size to > 1 GiB when less than
31
1 GiB ram is detected.
32
33
Signed-off-by: Bin Meng <bin.meng@windriver.com>
34
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
35
Message-Id: <1598924352-89526-5-git-send-email-bmeng.cn@gmail.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-Id: <20200701152549.1218-5-zhiwei_liu@c-sky.com>
36
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
37
---
12
---
38
default-configs/riscv64-softmmu.mak | 1 +
13
target/riscv/cpu.h | 63 +++++++++++++++++---
39
include/hw/riscv/microchip_pfsoc.h | 88 ++++++++
14
target/riscv/helper.h | 3 +
40
hw/riscv/microchip_pfsoc.c | 312 ++++++++++++++++++++++++++++
15
target/riscv/insn32.decode | 5 ++
41
MAINTAINERS | 7 +
16
target/riscv/insn_trans/trans_rvv.inc.c | 79 +++++++++++++++++++++++++
42
hw/riscv/Kconfig | 6 +
17
target/riscv/translate.c | 17 +++++-
43
hw/riscv/meson.build | 1 +
18
target/riscv/vector_helper.c | 53 +++++++++++++++++
44
6 files changed, 415 insertions(+)
19
target/riscv/Makefile.objs | 2 +-
45
create mode 100644 include/hw/riscv/microchip_pfsoc.h
20
7 files changed, 210 insertions(+), 12 deletions(-)
46
create mode 100644 hw/riscv/microchip_pfsoc.c
21
create mode 100644 target/riscv/insn_trans/trans_rvv.inc.c
47
22
create mode 100644 target/riscv/vector_helper.c
48
diff --git a/default-configs/riscv64-softmmu.mak b/default-configs/riscv64-softmmu.mak
23
49
index XXXXXXX..XXXXXXX 100644
24
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
50
--- a/default-configs/riscv64-softmmu.mak
25
index XXXXXXX..XXXXXXX 100644
51
+++ b/default-configs/riscv64-softmmu.mak
26
--- a/target/riscv/cpu.h
52
@@ -XXX,XX +XXX,XX @@ CONFIG_SPIKE=y
27
+++ b/target/riscv/cpu.h
53
CONFIG_SIFIVE_E=y
28
@@ -XXX,XX +XXX,XX @@
54
CONFIG_SIFIVE_U=y
29
#define RISCV_CPU_H
55
CONFIG_RISCV_VIRT=y
30
56
+CONFIG_MICROCHIP_PFSOC=y
31
#include "hw/core/cpu.h"
57
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
32
+#include "hw/registerfields.h"
33
#include "exec/cpu-defs.h"
34
#include "fpu/softfloat-types.h"
35
36
@@ -XXX,XX +XXX,XX @@ typedef struct CPURISCVState CPURISCVState;
37
38
#define RV_VLEN_MAX 512
39
40
+FIELD(VTYPE, VLMUL, 0, 2)
41
+FIELD(VTYPE, VSEW, 2, 3)
42
+FIELD(VTYPE, VEDIV, 5, 2)
43
+FIELD(VTYPE, RESERVED, 7, sizeof(target_ulong) * 8 - 9)
44
+FIELD(VTYPE, VILL, sizeof(target_ulong) * 8 - 2, 1)
45
+
46
struct CPURISCVState {
47
target_ulong gpr[32];
48
uint64_t fpr[32]; /* assume both F and D extensions */
49
@@ -XXX,XX +XXX,XX @@ void riscv_cpu_set_fflags(CPURISCVState *env, target_ulong);
50
#define TB_FLAGS_MMU_MASK 3
51
#define TB_FLAGS_MSTATUS_FS MSTATUS_FS
52
53
+typedef CPURISCVState CPUArchState;
54
+typedef RISCVCPU ArchCPU;
55
+#include "exec/cpu-all.h"
56
+
57
+FIELD(TB_FLAGS, VL_EQ_VLMAX, 2, 1)
58
+FIELD(TB_FLAGS, LMUL, 3, 2)
59
+FIELD(TB_FLAGS, SEW, 5, 3)
60
+FIELD(TB_FLAGS, VILL, 8, 1)
61
+
62
+/*
63
+ * A simplification for VLMAX
64
+ * = (1 << LMUL) * VLEN / (8 * (1 << SEW))
65
+ * = (VLEN << LMUL) / (8 << SEW)
66
+ * = (VLEN << LMUL) >> (SEW + 3)
67
+ * = VLEN >> (SEW + 3 - LMUL)
68
+ */
69
+static inline uint32_t vext_get_vlmax(RISCVCPU *cpu, target_ulong vtype)
70
+{
71
+ uint8_t sew, lmul;
72
+
73
+ sew = FIELD_EX64(vtype, VTYPE, VSEW);
74
+ lmul = FIELD_EX64(vtype, VTYPE, VLMUL);
75
+ return cpu->cfg.vlen >> (sew + 3 - lmul);
76
+}
77
+
78
static inline void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
79
- target_ulong *cs_base, uint32_t *flags)
80
+ target_ulong *cs_base, uint32_t *pflags)
81
{
82
+ uint32_t flags = 0;
83
+
84
*pc = env->pc;
85
*cs_base = 0;
86
+
87
+ if (riscv_has_ext(env, RVV)) {
88
+ uint32_t vlmax = vext_get_vlmax(env_archcpu(env), env->vtype);
89
+ bool vl_eq_vlmax = (env->vstart == 0) && (vlmax == env->vl);
90
+ flags = FIELD_DP32(flags, TB_FLAGS, VILL,
91
+ FIELD_EX64(env->vtype, VTYPE, VILL));
92
+ flags = FIELD_DP32(flags, TB_FLAGS, SEW,
93
+ FIELD_EX64(env->vtype, VTYPE, VSEW));
94
+ flags = FIELD_DP32(flags, TB_FLAGS, LMUL,
95
+ FIELD_EX64(env->vtype, VTYPE, VLMUL));
96
+ flags = FIELD_DP32(flags, TB_FLAGS, VL_EQ_VLMAX, vl_eq_vlmax);
97
+ } else {
98
+ flags = FIELD_DP32(flags, TB_FLAGS, VILL, 1);
99
+ }
100
+
101
#ifdef CONFIG_USER_ONLY
102
- *flags = TB_FLAGS_MSTATUS_FS;
103
+ flags |= TB_FLAGS_MSTATUS_FS;
104
#else
105
- *flags = cpu_mmu_index(env, 0);
106
+ flags |= cpu_mmu_index(env, 0);
107
if (riscv_cpu_fp_enabled(env)) {
108
- *flags |= env->mstatus & MSTATUS_FS;
109
+ flags |= env->mstatus & MSTATUS_FS;
110
}
111
#endif
112
+ *pflags = flags;
113
}
114
115
int riscv_csrrw(CPURISCVState *env, int csrno, target_ulong *ret_value,
116
@@ -XXX,XX +XXX,XX @@ void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops);
117
118
void riscv_cpu_register_gdb_regs_for_features(CPUState *cs);
119
120
-typedef CPURISCVState CPUArchState;
121
-typedef RISCVCPU ArchCPU;
122
-
123
-#include "exec/cpu-all.h"
124
-
125
#endif /* RISCV_CPU_H */
126
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
127
index XXXXXXX..XXXXXXX 100644
128
--- a/target/riscv/helper.h
129
+++ b/target/riscv/helper.h
130
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_1(tlb_flush, void, env)
131
#ifndef CONFIG_USER_ONLY
132
DEF_HELPER_1(hyp_tlb_flush, void, env)
133
#endif
134
+
135
+/* Vector functions */
136
+DEF_HELPER_3(vsetvl, tl, env, tl, tl)
137
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
138
index XXXXXXX..XXXXXXX 100644
139
--- a/target/riscv/insn32.decode
140
+++ b/target/riscv/insn32.decode
141
@@ -XXX,XX +XXX,XX @@
142
@r_rm ....... ..... ..... ... ..... ....... %rs2 %rs1 %rm %rd
143
@r2_rm ....... ..... ..... ... ..... ....... %rs1 %rm %rd
144
@r2 ....... ..... ..... ... ..... ....... %rs1 %rd
145
+@r2_zimm . zimm:11 ..... ... ..... ....... %rs1 %rd
146
147
@hfence_gvma ....... ..... ..... ... ..... ....... %rs2 %rs1
148
@hfence_vvma ....... ..... ..... ... ..... ....... %rs2 %rs1
149
@@ -XXX,XX +XXX,XX @@ fcvt_d_wu 1101001 00001 ..... ... ..... 1010011 @r2_rm
150
# *** RV32H Base Instruction Set ***
151
hfence_gvma 0110001 ..... ..... 000 00000 1110011 @hfence_gvma
152
hfence_vvma 0010001 ..... ..... 000 00000 1110011 @hfence_vvma
153
+
154
+# *** RV32V Extension ***
155
+vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
156
+vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
157
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
58
new file mode 100644
158
new file mode 100644
59
index XXXXXXX..XXXXXXX
159
index XXXXXXX..XXXXXXX
60
--- /dev/null
160
--- /dev/null
61
+++ b/include/hw/riscv/microchip_pfsoc.h
161
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
62
@@ -XXX,XX +XXX,XX @@
162
@@ -XXX,XX +XXX,XX @@
63
+/*
163
+/*
64
+ * Microchip PolarFire SoC machine interface
164
+ * RISC-V translation routines for the RVV Standard Extension.
65
+ *
165
+ *
66
+ * Copyright (c) 2020 Wind River Systems, Inc.
166
+ * Copyright (c) 2020 T-Head Semiconductor Co., Ltd. All rights reserved.
67
+ *
68
+ * Author:
69
+ * Bin Meng <bin.meng@windriver.com>
70
+ *
167
+ *
71
+ * This program is free software; you can redistribute it and/or modify it
168
+ * This program is free software; you can redistribute it and/or modify it
72
+ * under the terms and conditions of the GNU General Public License,
169
+ * under the terms and conditions of the GNU General Public License,
73
+ * version 2 or later, as published by the Free Software Foundation.
170
+ * version 2 or later, as published by the Free Software Foundation.
74
+ *
171
+ *
...
...
79
+ *
176
+ *
80
+ * You should have received a copy of the GNU General Public License along with
177
+ * You should have received a copy of the GNU General Public License along with
81
+ * this program. If not, see <http://www.gnu.org/licenses/>.
178
+ * this program. If not, see <http://www.gnu.org/licenses/>.
82
+ */
179
+ */
83
+
180
+
84
+#ifndef HW_MICROCHIP_PFSOC_H
181
+static bool trans_vsetvl(DisasContext *ctx, arg_vsetvl *a)
85
+#define HW_MICROCHIP_PFSOC_H
182
+{
86
+
183
+ TCGv s1, s2, dst;
87
+typedef struct MicrochipPFSoCState {
184
+
88
+ /*< private >*/
185
+ if (!has_ext(ctx, RVV)) {
89
+ DeviceState parent_obj;
186
+ return false;
90
+
187
+ }
91
+ /*< public >*/
188
+
92
+ CPUClusterState e_cluster;
189
+ s2 = tcg_temp_new();
93
+ CPUClusterState u_cluster;
190
+ dst = tcg_temp_new();
94
+ RISCVHartArrayState e_cpus;
191
+
95
+ RISCVHartArrayState u_cpus;
192
+ /* Using x0 as the rs1 register specifier, encodes an infinite AVL */
96
+ DeviceState *plic;
193
+ if (a->rs1 == 0) {
97
+} MicrochipPFSoCState;
194
+ /* As the mask is at least one bit, RV_VLEN_MAX is >= VLMAX */
98
+
195
+ s1 = tcg_const_tl(RV_VLEN_MAX);
99
+#define TYPE_MICROCHIP_PFSOC "microchip.pfsoc"
196
+ } else {
100
+#define MICROCHIP_PFSOC(obj) \
197
+ s1 = tcg_temp_new();
101
+ OBJECT_CHECK(MicrochipPFSoCState, (obj), TYPE_MICROCHIP_PFSOC)
198
+ gen_get_gpr(s1, a->rs1);
102
+
199
+ }
103
+typedef struct MicrochipIcicleKitState {
200
+ gen_get_gpr(s2, a->rs2);
104
+ /*< private >*/
201
+ gen_helper_vsetvl(dst, cpu_env, s1, s2);
105
+ MachineState parent_obj;
202
+ gen_set_gpr(a->rd, dst);
106
+
203
+ tcg_gen_movi_tl(cpu_pc, ctx->pc_succ_insn);
107
+ /*< public >*/
204
+ lookup_and_goto_ptr(ctx);
108
+ MicrochipPFSoCState soc;
205
+ ctx->base.is_jmp = DISAS_NORETURN;
109
+} MicrochipIcicleKitState;
206
+
110
+
207
+ tcg_temp_free(s1);
111
+#define TYPE_MICROCHIP_ICICLE_KIT_MACHINE \
208
+ tcg_temp_free(s2);
112
+ MACHINE_TYPE_NAME("microchip-icicle-kit")
209
+ tcg_temp_free(dst);
113
+#define MICROCHIP_ICICLE_KIT_MACHINE(obj) \
210
+ return true;
114
+ OBJECT_CHECK(MicrochipIcicleKitState, (obj), \
211
+}
115
+ TYPE_MICROCHIP_ICICLE_KIT_MACHINE)
212
+
116
+
213
+static bool trans_vsetvli(DisasContext *ctx, arg_vsetvli *a)
117
+enum {
214
+{
118
+ MICROCHIP_PFSOC_DEBUG,
215
+ TCGv s1, s2, dst;
119
+ MICROCHIP_PFSOC_E51_DTIM,
216
+
120
+ MICROCHIP_PFSOC_BUSERR_UNIT0,
217
+ if (!has_ext(ctx, RVV)) {
121
+ MICROCHIP_PFSOC_BUSERR_UNIT1,
218
+ return false;
122
+ MICROCHIP_PFSOC_BUSERR_UNIT2,
219
+ }
123
+ MICROCHIP_PFSOC_BUSERR_UNIT3,
220
+
124
+ MICROCHIP_PFSOC_BUSERR_UNIT4,
221
+ s2 = tcg_const_tl(a->zimm);
125
+ MICROCHIP_PFSOC_CLINT,
222
+ dst = tcg_temp_new();
126
+ MICROCHIP_PFSOC_L2CC,
223
+
127
+ MICROCHIP_PFSOC_L2LIM,
224
+ /* Using x0 as the rs1 register specifier, encodes an infinite AVL */
128
+ MICROCHIP_PFSOC_PLIC,
225
+ if (a->rs1 == 0) {
129
+ MICROCHIP_PFSOC_SYSREG,
226
+ /* As the mask is at least one bit, RV_VLEN_MAX is >= VLMAX */
130
+ MICROCHIP_PFSOC_MPUCFG,
227
+ s1 = tcg_const_tl(RV_VLEN_MAX);
131
+ MICROCHIP_PFSOC_ENVM_CFG,
228
+ } else {
132
+ MICROCHIP_PFSOC_ENVM_DATA,
229
+ s1 = tcg_temp_new();
133
+ MICROCHIP_PFSOC_IOSCB_CFG,
230
+ gen_get_gpr(s1, a->rs1);
134
+ MICROCHIP_PFSOC_DRAM,
231
+ }
135
+};
232
+ gen_helper_vsetvl(dst, cpu_env, s1, s2);
136
+
233
+ gen_set_gpr(a->rd, dst);
137
+#define MICROCHIP_PFSOC_MANAGEMENT_CPU_COUNT 1
234
+ gen_goto_tb(ctx, 0, ctx->pc_succ_insn);
138
+#define MICROCHIP_PFSOC_COMPUTE_CPU_COUNT 4
235
+ ctx->base.is_jmp = DISAS_NORETURN;
139
+
236
+
140
+#define MICROCHIP_PFSOC_PLIC_HART_CONFIG "MS"
237
+ tcg_temp_free(s1);
141
+#define MICROCHIP_PFSOC_PLIC_NUM_SOURCES 185
238
+ tcg_temp_free(s2);
142
+#define MICROCHIP_PFSOC_PLIC_NUM_PRIORITIES 7
239
+ tcg_temp_free(dst);
143
+#define MICROCHIP_PFSOC_PLIC_PRIORITY_BASE 0x04
240
+ return true;
144
+#define MICROCHIP_PFSOC_PLIC_PENDING_BASE 0x1000
241
+}
145
+#define MICROCHIP_PFSOC_PLIC_ENABLE_BASE 0x2000
242
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
146
+#define MICROCHIP_PFSOC_PLIC_ENABLE_STRIDE 0x80
243
index XXXXXXX..XXXXXXX 100644
147
+#define MICROCHIP_PFSOC_PLIC_CONTEXT_BASE 0x200000
244
--- a/target/riscv/translate.c
148
+#define MICROCHIP_PFSOC_PLIC_CONTEXT_STRIDE 0x1000
245
+++ b/target/riscv/translate.c
149
+
246
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
150
+#endif /* HW_MICROCHIP_PFSOC_H */
247
to reset this known value. */
151
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
248
int frm;
249
bool ext_ifencei;
250
+ /* vector extension */
251
+ bool vill;
252
+ uint8_t lmul;
253
+ uint8_t sew;
254
+ uint16_t vlen;
255
+ bool vl_eq_vlmax;
256
} DisasContext;
257
258
#ifdef TARGET_RISCV64
259
@@ -XXX,XX +XXX,XX @@ static bool gen_shift(DisasContext *ctx, arg_r *a,
260
#include "insn_trans/trans_rvf.inc.c"
261
#include "insn_trans/trans_rvd.inc.c"
262
#include "insn_trans/trans_rvh.inc.c"
263
+#include "insn_trans/trans_rvv.inc.c"
264
#include "insn_trans/trans_privileged.inc.c"
265
266
/* Include the auto-generated decoder for 16 bit insn */
267
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
268
DisasContext *ctx = container_of(dcbase, DisasContext, base);
269
CPURISCVState *env = cs->env_ptr;
270
RISCVCPU *cpu = RISCV_CPU(cs);
271
+ uint32_t tb_flags = ctx->base.tb->flags;
272
273
ctx->pc_succ_insn = ctx->base.pc_first;
274
- ctx->mem_idx = ctx->base.tb->flags & TB_FLAGS_MMU_MASK;
275
- ctx->mstatus_fs = ctx->base.tb->flags & TB_FLAGS_MSTATUS_FS;
276
+ ctx->mem_idx = tb_flags & TB_FLAGS_MMU_MASK;
277
+ ctx->mstatus_fs = tb_flags & TB_FLAGS_MSTATUS_FS;
278
ctx->priv_ver = env->priv_ver;
279
#if !defined(CONFIG_USER_ONLY)
280
if (riscv_has_ext(env, RVH)) {
281
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
282
ctx->misa = env->misa;
283
ctx->frm = -1; /* unknown rounding mode */
284
ctx->ext_ifencei = cpu->cfg.ext_ifencei;
285
+ ctx->vlen = cpu->cfg.vlen;
286
+ ctx->vill = FIELD_EX32(tb_flags, TB_FLAGS, VILL);
287
+ ctx->sew = FIELD_EX32(tb_flags, TB_FLAGS, SEW);
288
+ ctx->lmul = FIELD_EX32(tb_flags, TB_FLAGS, LMUL);
289
+ ctx->vl_eq_vlmax = FIELD_EX32(tb_flags, TB_FLAGS, VL_EQ_VLMAX);
290
}
291
292
static void riscv_tr_tb_start(DisasContextBase *db, CPUState *cpu)
293
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
152
new file mode 100644
294
new file mode 100644
153
index XXXXXXX..XXXXXXX
295
index XXXXXXX..XXXXXXX
154
--- /dev/null
296
--- /dev/null
155
+++ b/hw/riscv/microchip_pfsoc.c
297
+++ b/target/riscv/vector_helper.c
156
@@ -XXX,XX +XXX,XX @@
298
@@ -XXX,XX +XXX,XX @@
157
+/*
299
+/*
158
+ * QEMU RISC-V Board Compatible with Microchip PolarFire SoC Icicle Kit
300
+ * RISC-V Vector Extension Helpers for QEMU.
159
+ *
301
+ *
160
+ * Copyright (c) 2020 Wind River Systems, Inc.
302
+ * Copyright (c) 2020 T-Head Semiconductor Co., Ltd. All rights reserved.
161
+ *
162
+ * Author:
163
+ * Bin Meng <bin.meng@windriver.com>
164
+ *
165
+ * Provides a board compatible with the Microchip PolarFire SoC Icicle Kit
166
+ *
167
+ * 0) CLINT (Core Level Interruptor)
168
+ * 1) PLIC (Platform Level Interrupt Controller)
169
+ * 2) eNVM (Embedded Non-Volatile Memory)
170
+ *
171
+ * This board currently generates devicetree dynamically that indicates at least
172
+ * two harts and up to five harts.
173
+ *
303
+ *
174
+ * This program is free software; you can redistribute it and/or modify it
304
+ * This program is free software; you can redistribute it and/or modify it
175
+ * under the terms and conditions of the GNU General Public License,
305
+ * under the terms and conditions of the GNU General Public License,
176
+ * version 2 or later, as published by the Free Software Foundation.
306
+ * version 2 or later, as published by the Free Software Foundation.
177
+ *
307
+ *
...
...
183
+ * You should have received a copy of the GNU General Public License along with
313
+ * You should have received a copy of the GNU General Public License along with
184
+ * this program. If not, see <http://www.gnu.org/licenses/>.
314
+ * this program. If not, see <http://www.gnu.org/licenses/>.
185
+ */
315
+ */
186
+
316
+
187
+#include "qemu/osdep.h"
317
+#include "qemu/osdep.h"
188
+#include "qemu/error-report.h"
318
+#include "cpu.h"
189
+#include "qemu/log.h"
319
+#include "exec/exec-all.h"
190
+#include "qemu/units.h"
320
+#include "exec/helper-proto.h"
191
+#include "qemu/cutils.h"
321
+#include <math.h>
192
+#include "qapi/error.h"
322
+
193
+#include "hw/boards.h"
323
+target_ulong HELPER(vsetvl)(CPURISCVState *env, target_ulong s1,
194
+#include "hw/irq.h"
324
+ target_ulong s2)
195
+#include "hw/loader.h"
196
+#include "hw/sysbus.h"
197
+#include "hw/cpu/cluster.h"
198
+#include "target/riscv/cpu.h"
199
+#include "hw/misc/unimp.h"
200
+#include "hw/riscv/boot.h"
201
+#include "hw/riscv/riscv_hart.h"
202
+#include "hw/riscv/sifive_clint.h"
203
+#include "hw/riscv/sifive_plic.h"
204
+#include "hw/riscv/microchip_pfsoc.h"
205
+
206
+/*
207
+ * The BIOS image used by this machine is called Hart Software Services (HSS).
208
+ * See https://github.com/polarfire-soc/hart-software-services
209
+ */
210
+#define BIOS_FILENAME "hss.bin"
211
+#define RESET_VECTOR 0x20220000
212
+
213
+static const struct MemmapEntry {
214
+ hwaddr base;
215
+ hwaddr size;
216
+} microchip_pfsoc_memmap[] = {
217
+ [MICROCHIP_PFSOC_DEBUG] = { 0x0, 0x1000 },
218
+ [MICROCHIP_PFSOC_E51_DTIM] = { 0x1000000, 0x2000 },
219
+ [MICROCHIP_PFSOC_BUSERR_UNIT0] = { 0x1700000, 0x1000 },
220
+ [MICROCHIP_PFSOC_BUSERR_UNIT1] = { 0x1701000, 0x1000 },
221
+ [MICROCHIP_PFSOC_BUSERR_UNIT2] = { 0x1702000, 0x1000 },
222
+ [MICROCHIP_PFSOC_BUSERR_UNIT3] = { 0x1703000, 0x1000 },
223
+ [MICROCHIP_PFSOC_BUSERR_UNIT4] = { 0x1704000, 0x1000 },
224
+ [MICROCHIP_PFSOC_CLINT] = { 0x2000000, 0x10000 },
225
+ [MICROCHIP_PFSOC_L2CC] = { 0x2010000, 0x1000 },
226
+ [MICROCHIP_PFSOC_L2LIM] = { 0x8000000, 0x2000000 },
227
+ [MICROCHIP_PFSOC_PLIC] = { 0xc000000, 0x4000000 },
228
+ [MICROCHIP_PFSOC_SYSREG] = { 0x20002000, 0x2000 },
229
+ [MICROCHIP_PFSOC_MPUCFG] = { 0x20005000, 0x1000 },
230
+ [MICROCHIP_PFSOC_ENVM_CFG] = { 0x20200000, 0x1000 },
231
+ [MICROCHIP_PFSOC_ENVM_DATA] = { 0x20220000, 0x20000 },
232
+ [MICROCHIP_PFSOC_IOSCB_CFG] = { 0x37080000, 0x1000 },
233
+ [MICROCHIP_PFSOC_DRAM] = { 0x80000000, 0x0 },
234
+};
235
+
236
+static void microchip_pfsoc_soc_instance_init(Object *obj)
237
+{
325
+{
238
+ MachineState *ms = MACHINE(qdev_get_machine());
326
+ int vlmax, vl;
239
+ MicrochipPFSoCState *s = MICROCHIP_PFSOC(obj);
327
+ RISCVCPU *cpu = env_archcpu(env);
240
+
328
+ uint16_t sew = 8 << FIELD_EX64(s2, VTYPE, VSEW);
241
+ object_initialize_child(obj, "e-cluster", &s->e_cluster, TYPE_CPU_CLUSTER);
329
+ uint8_t ediv = FIELD_EX64(s2, VTYPE, VEDIV);
242
+ qdev_prop_set_uint32(DEVICE(&s->e_cluster), "cluster-id", 0);
330
+ bool vill = FIELD_EX64(s2, VTYPE, VILL);
243
+
331
+ target_ulong reserved = FIELD_EX64(s2, VTYPE, RESERVED);
244
+ object_initialize_child(OBJECT(&s->e_cluster), "e-cpus", &s->e_cpus,
332
+
245
+ TYPE_RISCV_HART_ARRAY);
333
+ if ((sew > cpu->cfg.elen) || vill || (ediv != 0) || (reserved != 0)) {
246
+ qdev_prop_set_uint32(DEVICE(&s->e_cpus), "num-harts", 1);
334
+ /* only set vill bit. */
247
+ qdev_prop_set_uint32(DEVICE(&s->e_cpus), "hartid-base", 0);
335
+ env->vtype = FIELD_DP64(0, VTYPE, VILL, 1);
248
+ qdev_prop_set_string(DEVICE(&s->e_cpus), "cpu-type",
336
+ env->vl = 0;
249
+ TYPE_RISCV_CPU_SIFIVE_E51);
337
+ env->vstart = 0;
250
+ qdev_prop_set_uint64(DEVICE(&s->e_cpus), "resetvec", RESET_VECTOR);
338
+ return 0;
251
+
339
+ }
252
+ object_initialize_child(obj, "u-cluster", &s->u_cluster, TYPE_CPU_CLUSTER);
340
+
253
+ qdev_prop_set_uint32(DEVICE(&s->u_cluster), "cluster-id", 1);
341
+ vlmax = vext_get_vlmax(cpu, s2);
254
+
342
+ if (s1 <= vlmax) {
255
+ object_initialize_child(OBJECT(&s->u_cluster), "u-cpus", &s->u_cpus,
343
+ vl = s1;
256
+ TYPE_RISCV_HART_ARRAY);
344
+ } else {
257
+ qdev_prop_set_uint32(DEVICE(&s->u_cpus), "num-harts", ms->smp.cpus - 1);
345
+ vl = vlmax;
258
+ qdev_prop_set_uint32(DEVICE(&s->u_cpus), "hartid-base", 1);
346
+ }
259
+ qdev_prop_set_string(DEVICE(&s->u_cpus), "cpu-type",
347
+ env->vl = vl;
260
+ TYPE_RISCV_CPU_SIFIVE_U54);
348
+ env->vtype = s2;
261
+ qdev_prop_set_uint64(DEVICE(&s->u_cpus), "resetvec", RESET_VECTOR);
349
+ env->vstart = 0;
350
+ return vl;
262
+}
351
+}
263
+
352
diff --git a/target/riscv/Makefile.objs b/target/riscv/Makefile.objs
264
+static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
353
index XXXXXXX..XXXXXXX 100644
265
+{
354
--- a/target/riscv/Makefile.objs
266
+ MachineState *ms = MACHINE(qdev_get_machine());
355
+++ b/target/riscv/Makefile.objs
267
+ MicrochipPFSoCState *s = MICROCHIP_PFSOC(dev);
356
@@ -XXX,XX +XXX,XX @@
268
+ const struct MemmapEntry *memmap = microchip_pfsoc_memmap;
357
-obj-y += translate.o op_helper.o cpu_helper.o cpu.o csr.o fpu_helper.o gdbstub.o
269
+ MemoryRegion *system_memory = get_system_memory();
358
+obj-y += translate.o op_helper.o cpu_helper.o cpu.o csr.o fpu_helper.o vector_helper.o gdbstub.o
270
+ MemoryRegion *e51_dtim_mem = g_new(MemoryRegion, 1);
359
obj-$(CONFIG_SOFTMMU) += pmp.o
271
+ MemoryRegion *l2lim_mem = g_new(MemoryRegion, 1);
360
272
+ MemoryRegion *envm_data = g_new(MemoryRegion, 1);
361
ifeq ($(CONFIG_SOFTMMU),y)
273
+ char *plic_hart_config;
274
+ size_t plic_hart_config_len;
275
+ int i;
276
+
277
+ sysbus_realize(SYS_BUS_DEVICE(&s->e_cpus), &error_abort);
278
+ sysbus_realize(SYS_BUS_DEVICE(&s->u_cpus), &error_abort);
279
+ /*
280
+ * The cluster must be realized after the RISC-V hart array container,
281
+ * as the container's CPU object is only created on realize, and the
282
+ * CPU must exist and have been parented into the cluster before the
283
+ * cluster is realized.
284
+ */
285
+ qdev_realize(DEVICE(&s->e_cluster), NULL, &error_abort);
286
+ qdev_realize(DEVICE(&s->u_cluster), NULL, &error_abort);
287
+
288
+ /* E51 DTIM */
289
+ memory_region_init_ram(e51_dtim_mem, NULL, "microchip.pfsoc.e51_dtim_mem",
290
+ memmap[MICROCHIP_PFSOC_E51_DTIM].size, &error_fatal);
291
+ memory_region_add_subregion(system_memory,
292
+ memmap[MICROCHIP_PFSOC_E51_DTIM].base,
293
+ e51_dtim_mem);
294
+
295
+ /* Bus Error Units */
296
+ create_unimplemented_device("microchip.pfsoc.buserr_unit0_mem",
297
+ memmap[MICROCHIP_PFSOC_BUSERR_UNIT0].base,
298
+ memmap[MICROCHIP_PFSOC_BUSERR_UNIT0].size);
299
+ create_unimplemented_device("microchip.pfsoc.buserr_unit1_mem",
300
+ memmap[MICROCHIP_PFSOC_BUSERR_UNIT1].base,
301
+ memmap[MICROCHIP_PFSOC_BUSERR_UNIT1].size);
302
+ create_unimplemented_device("microchip.pfsoc.buserr_unit2_mem",
303
+ memmap[MICROCHIP_PFSOC_BUSERR_UNIT2].base,
304
+ memmap[MICROCHIP_PFSOC_BUSERR_UNIT2].size);
305
+ create_unimplemented_device("microchip.pfsoc.buserr_unit3_mem",
306
+ memmap[MICROCHIP_PFSOC_BUSERR_UNIT3].base,
307
+ memmap[MICROCHIP_PFSOC_BUSERR_UNIT3].size);
308
+ create_unimplemented_device("microchip.pfsoc.buserr_unit4_mem",
309
+ memmap[MICROCHIP_PFSOC_BUSERR_UNIT4].base,
310
+ memmap[MICROCHIP_PFSOC_BUSERR_UNIT4].size);
311
+
312
+ /* CLINT */
313
+ sifive_clint_create(memmap[MICROCHIP_PFSOC_CLINT].base,
314
+ memmap[MICROCHIP_PFSOC_CLINT].size, 0, ms->smp.cpus,
315
+ SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE, false);
316
+
317
+ /* L2 cache controller */
318
+ create_unimplemented_device("microchip.pfsoc.l2cc",
319
+ memmap[MICROCHIP_PFSOC_L2CC].base, memmap[MICROCHIP_PFSOC_L2CC].size);
320
+
321
+ /*
322
+ * Add L2-LIM at reset size.
323
+ * This should be reduced in size as the L2 Cache Controller WayEnable
324
+ * register is incremented. Unfortunately I don't see a nice (or any) way
325
+ * to handle reducing or blocking out the L2 LIM while still allowing it
326
+ * be re returned to all enabled after a reset. For the time being, just
327
+ * leave it enabled all the time. This won't break anything, but will be
328
+ * too generous to misbehaving guests.
329
+ */
330
+ memory_region_init_ram(l2lim_mem, NULL, "microchip.pfsoc.l2lim",
331
+ memmap[MICROCHIP_PFSOC_L2LIM].size, &error_fatal);
332
+ memory_region_add_subregion(system_memory,
333
+ memmap[MICROCHIP_PFSOC_L2LIM].base,
334
+ l2lim_mem);
335
+
336
+ /* create PLIC hart topology configuration string */
337
+ plic_hart_config_len = (strlen(MICROCHIP_PFSOC_PLIC_HART_CONFIG) + 1) *
338
+ ms->smp.cpus;
339
+ plic_hart_config = g_malloc0(plic_hart_config_len);
340
+ for (i = 0; i < ms->smp.cpus; i++) {
341
+ if (i != 0) {
342
+ strncat(plic_hart_config, "," MICROCHIP_PFSOC_PLIC_HART_CONFIG,
343
+ plic_hart_config_len);
344
+ } else {
345
+ strncat(plic_hart_config, "M", plic_hart_config_len);
346
+ }
347
+ plic_hart_config_len -= (strlen(MICROCHIP_PFSOC_PLIC_HART_CONFIG) + 1);
348
+ }
349
+
350
+ /* PLIC */
351
+ s->plic = sifive_plic_create(memmap[MICROCHIP_PFSOC_PLIC].base,
352
+ plic_hart_config, 0,
353
+ MICROCHIP_PFSOC_PLIC_NUM_SOURCES,
354
+ MICROCHIP_PFSOC_PLIC_NUM_PRIORITIES,
355
+ MICROCHIP_PFSOC_PLIC_PRIORITY_BASE,
356
+ MICROCHIP_PFSOC_PLIC_PENDING_BASE,
357
+ MICROCHIP_PFSOC_PLIC_ENABLE_BASE,
358
+ MICROCHIP_PFSOC_PLIC_ENABLE_STRIDE,
359
+ MICROCHIP_PFSOC_PLIC_CONTEXT_BASE,
360
+ MICROCHIP_PFSOC_PLIC_CONTEXT_STRIDE,
361
+ memmap[MICROCHIP_PFSOC_PLIC].size);
362
+ g_free(plic_hart_config);
363
+
364
+ /* SYSREG */
365
+ create_unimplemented_device("microchip.pfsoc.sysreg",
366
+ memmap[MICROCHIP_PFSOC_SYSREG].base,
367
+ memmap[MICROCHIP_PFSOC_SYSREG].size);
368
+
369
+ /* MPUCFG */
370
+ create_unimplemented_device("microchip.pfsoc.mpucfg",
371
+ memmap[MICROCHIP_PFSOC_MPUCFG].base,
372
+ memmap[MICROCHIP_PFSOC_MPUCFG].size);
373
+
374
+ /* eNVM */
375
+ memory_region_init_rom(envm_data, OBJECT(dev), "microchip.pfsoc.envm.data",
376
+ memmap[MICROCHIP_PFSOC_ENVM_DATA].size,
377
+ &error_fatal);
378
+ memory_region_add_subregion(system_memory,
379
+ memmap[MICROCHIP_PFSOC_ENVM_DATA].base,
380
+ envm_data);
381
+
382
+ /* IOSCBCFG */
383
+ create_unimplemented_device("microchip.pfsoc.ioscb.cfg",
384
+ memmap[MICROCHIP_PFSOC_IOSCB_CFG].base,
385
+ memmap[MICROCHIP_PFSOC_IOSCB_CFG].size);
386
+}
387
+
388
+static void microchip_pfsoc_soc_class_init(ObjectClass *oc, void *data)
389
+{
390
+ DeviceClass *dc = DEVICE_CLASS(oc);
391
+
392
+ dc->realize = microchip_pfsoc_soc_realize;
393
+ /* Reason: Uses serial_hds in realize function, thus can't be used twice */
394
+ dc->user_creatable = false;
395
+}
396
+
397
+static const TypeInfo microchip_pfsoc_soc_type_info = {
398
+ .name = TYPE_MICROCHIP_PFSOC,
399
+ .parent = TYPE_DEVICE,
400
+ .instance_size = sizeof(MicrochipPFSoCState),
401
+ .instance_init = microchip_pfsoc_soc_instance_init,
402
+ .class_init = microchip_pfsoc_soc_class_init,
403
+};
404
+
405
+static void microchip_pfsoc_soc_register_types(void)
406
+{
407
+ type_register_static(&microchip_pfsoc_soc_type_info);
408
+}
409
+
410
+type_init(microchip_pfsoc_soc_register_types)
411
+
412
+static void microchip_icicle_kit_machine_init(MachineState *machine)
413
+{
414
+ MachineClass *mc = MACHINE_GET_CLASS(machine);
415
+ const struct MemmapEntry *memmap = microchip_pfsoc_memmap;
416
+ MicrochipIcicleKitState *s = MICROCHIP_ICICLE_KIT_MACHINE(machine);
417
+ MemoryRegion *system_memory = get_system_memory();
418
+ MemoryRegion *main_mem = g_new(MemoryRegion, 1);
419
+
420
+ /* Sanity check on RAM size */
421
+ if (machine->ram_size < mc->default_ram_size) {
422
+ char *sz = size_to_str(mc->default_ram_size);
423
+ error_report("Invalid RAM size, should be bigger than %s", sz);
424
+ g_free(sz);
425
+ exit(EXIT_FAILURE);
426
+ }
427
+
428
+ /* Initialize SoC */
429
+ object_initialize_child(OBJECT(machine), "soc", &s->soc,
430
+ TYPE_MICROCHIP_PFSOC);
431
+ qdev_realize(DEVICE(&s->soc), NULL, &error_abort);
432
+
433
+ /* Register RAM */
434
+ memory_region_init_ram(main_mem, NULL, "microchip.icicle.kit.ram",
435
+ machine->ram_size, &error_fatal);
436
+ memory_region_add_subregion(system_memory,
437
+ memmap[MICROCHIP_PFSOC_DRAM].base, main_mem);
438
+
439
+ /* Load the firmware */
440
+ riscv_find_and_load_firmware(machine, BIOS_FILENAME, RESET_VECTOR, NULL);
441
+}
442
+
443
+static void microchip_icicle_kit_machine_class_init(ObjectClass *oc, void *data)
444
+{
445
+ MachineClass *mc = MACHINE_CLASS(oc);
446
+
447
+ mc->desc = "Microchip PolarFire SoC Icicle Kit";
448
+ mc->init = microchip_icicle_kit_machine_init;
449
+ mc->max_cpus = MICROCHIP_PFSOC_MANAGEMENT_CPU_COUNT +
450
+ MICROCHIP_PFSOC_COMPUTE_CPU_COUNT;
451
+ mc->min_cpus = MICROCHIP_PFSOC_MANAGEMENT_CPU_COUNT + 1;
452
+ mc->default_cpus = mc->min_cpus;
453
+ mc->default_ram_size = 1 * GiB;
454
+}
455
+
456
+static const TypeInfo microchip_icicle_kit_machine_typeinfo = {
457
+ .name = MACHINE_TYPE_NAME("microchip-icicle-kit"),
458
+ .parent = TYPE_MACHINE,
459
+ .class_init = microchip_icicle_kit_machine_class_init,
460
+ .instance_size = sizeof(MicrochipIcicleKitState),
461
+};
462
+
463
+static void microchip_icicle_kit_machine_init_register_types(void)
464
+{
465
+ type_register_static(&microchip_icicle_kit_machine_typeinfo);
466
+}
467
+
468
+type_init(microchip_icicle_kit_machine_init_register_types)
469
diff --git a/MAINTAINERS b/MAINTAINERS
470
index XXXXXXX..XXXXXXX 100644
471
--- a/MAINTAINERS
472
+++ b/MAINTAINERS
473
@@ -XXX,XX +XXX,XX @@ F: include/hw/riscv/opentitan.h
474
F: include/hw/char/ibex_uart.h
475
F: include/hw/intc/ibex_plic.h
476
477
+Microchip PolarFire SoC Icicle Kit
478
+M: Bin Meng <bin.meng@windriver.com>
479
+L: qemu-riscv@nongnu.org
480
+S: Supported
481
+F: hw/riscv/microchip_pfsoc.c
482
+F: include/hw/riscv/microchip_pfsoc.h
483
+
484
RX Machines
485
-----------
486
rx-gdbsim
487
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
488
index XXXXXXX..XXXXXXX 100644
489
--- a/hw/riscv/Kconfig
490
+++ b/hw/riscv/Kconfig
491
@@ -XXX,XX +XXX,XX @@ config RISCV_VIRT
492
select PCI_EXPRESS_GENERIC_BRIDGE
493
select PFLASH_CFI01
494
select SIFIVE
495
+
496
+config MICROCHIP_PFSOC
497
+ bool
498
+ select HART
499
+ select SIFIVE
500
+ select UNIMP
501
diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build
502
index XXXXXXX..XXXXXXX 100644
503
--- a/hw/riscv/meson.build
504
+++ b/hw/riscv/meson.build
505
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u_otp.c'))
506
riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u_prci.c'))
507
riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('riscv_htif.c'))
508
riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('spike.c'))
509
+riscv_ss.add(when: 'CONFIG_MICROCHIP_PFSOC', if_true: files('microchip_pfsoc.c'))
510
511
hw_arch += {'riscv': riscv_ss}
512
--
362
--
513
2.28.0
363
2.27.0
514
364
515
365
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
The internals.h keeps things that are not relevant to the actual architecture,
4
only to the implementation, separate.
5
6
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-Id: <20200701152549.1218-6-zhiwei_liu@c-sky.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
12
target/riscv/internals.h | 24 ++++++++++++++++++++++++
13
1 file changed, 24 insertions(+)
14
create mode 100644 target/riscv/internals.h
15
16
diff --git a/target/riscv/internals.h b/target/riscv/internals.h
17
new file mode 100644
18
index XXXXXXX..XXXXXXX
19
--- /dev/null
20
+++ b/target/riscv/internals.h
21
@@ -XXX,XX +XXX,XX @@
22
+/*
23
+ * QEMU RISC-V CPU -- internal functions and types
24
+ *
25
+ * Copyright (c) 2020 T-Head Semiconductor Co., Ltd. All rights reserved.
26
+ *
27
+ * This program is free software; you can redistribute it and/or modify it
28
+ * under the terms and conditions of the GNU General Public License,
29
+ * version 2 or later, as published by the Free Software Foundation.
30
+ *
31
+ * This program is distributed in the hope it will be useful, but WITHOUT
32
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
33
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
34
+ * more details.
35
+ *
36
+ * You should have received a copy of the GNU General Public License along with
37
+ * this program. If not, see <http://www.gnu.org/licenses/>.
38
+ */
39
+
40
+#ifndef RISCV_CPU_INTERNALS_H
41
+#define RISCV_CPU_INTERNALS_H
42
+
43
+#include "hw/registerfields.h"
44
+
45
+#endif
46
--
47
2.27.0
48
49
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
Microchip PolarFire SoC integrates 2 Candence GEMs to provide
3
Vector strided operations access the first memory element at the base address,
4
IEEE 802.3 standard-compliant 10/100/1000 Mbps ethernet interface.
4
and then access subsequent elements at address increments given by the byte
5
offset contained in the x register specified by rs2.
5
6
6
On the Icicle Kit board, GEM0 connects to a PHY at address 8 while
7
Vector unit-stride operations access elements stored contiguously in memory
7
GEM1 connects to a PHY at address 9.
8
starting from the base effective address. It can been seen as a special
9
case of strided operations.
8
10
9
The 2nd stage bootloader (U-Boot) is using GEM1 by default, so we
11
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
10
must specify 2 '-nic' options from the command line in order to get
12
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
a working ethernet.
12
13
Signed-off-by: Bin Meng <bin.meng@windriver.com>
14
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
15
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
14
Message-Id: <20200701152549.1218-7-zhiwei_liu@c-sky.com>
16
Message-Id: <1598924352-89526-14-git-send-email-bmeng.cn@gmail.com>
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
15
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
18
---
16
---
19
include/hw/riscv/microchip_pfsoc.h | 7 ++++++
17
target/riscv/helper.h | 105 ++++++
20
hw/riscv/microchip_pfsoc.c | 39 ++++++++++++++++++++++++++++++
18
target/riscv/internals.h | 5 +
21
2 files changed, 46 insertions(+)
19
target/riscv/insn32.decode | 32 ++
20
target/riscv/insn_trans/trans_rvv.inc.c | 355 ++++++++++++++++++++
21
target/riscv/translate.c | 7 +
22
target/riscv/vector_helper.c | 410 ++++++++++++++++++++++++
23
6 files changed, 914 insertions(+)
22
24
23
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
25
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
24
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
25
--- a/include/hw/riscv/microchip_pfsoc.h
27
--- a/target/riscv/helper.h
26
+++ b/include/hw/riscv/microchip_pfsoc.h
28
+++ b/target/riscv/helper.h
29
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_1(hyp_tlb_flush, void, env)
30
31
/* Vector functions */
32
DEF_HELPER_3(vsetvl, tl, env, tl, tl)
33
+DEF_HELPER_5(vlb_v_b, void, ptr, ptr, tl, env, i32)
34
+DEF_HELPER_5(vlb_v_b_mask, void, ptr, ptr, tl, env, i32)
35
+DEF_HELPER_5(vlb_v_h, void, ptr, ptr, tl, env, i32)
36
+DEF_HELPER_5(vlb_v_h_mask, void, ptr, ptr, tl, env, i32)
37
+DEF_HELPER_5(vlb_v_w, void, ptr, ptr, tl, env, i32)
38
+DEF_HELPER_5(vlb_v_w_mask, void, ptr, ptr, tl, env, i32)
39
+DEF_HELPER_5(vlb_v_d, void, ptr, ptr, tl, env, i32)
40
+DEF_HELPER_5(vlb_v_d_mask, void, ptr, ptr, tl, env, i32)
41
+DEF_HELPER_5(vlh_v_h, void, ptr, ptr, tl, env, i32)
42
+DEF_HELPER_5(vlh_v_h_mask, void, ptr, ptr, tl, env, i32)
43
+DEF_HELPER_5(vlh_v_w, void, ptr, ptr, tl, env, i32)
44
+DEF_HELPER_5(vlh_v_w_mask, void, ptr, ptr, tl, env, i32)
45
+DEF_HELPER_5(vlh_v_d, void, ptr, ptr, tl, env, i32)
46
+DEF_HELPER_5(vlh_v_d_mask, void, ptr, ptr, tl, env, i32)
47
+DEF_HELPER_5(vlw_v_w, void, ptr, ptr, tl, env, i32)
48
+DEF_HELPER_5(vlw_v_w_mask, void, ptr, ptr, tl, env, i32)
49
+DEF_HELPER_5(vlw_v_d, void, ptr, ptr, tl, env, i32)
50
+DEF_HELPER_5(vlw_v_d_mask, void, ptr, ptr, tl, env, i32)
51
+DEF_HELPER_5(vle_v_b, void, ptr, ptr, tl, env, i32)
52
+DEF_HELPER_5(vle_v_b_mask, void, ptr, ptr, tl, env, i32)
53
+DEF_HELPER_5(vle_v_h, void, ptr, ptr, tl, env, i32)
54
+DEF_HELPER_5(vle_v_h_mask, void, ptr, ptr, tl, env, i32)
55
+DEF_HELPER_5(vle_v_w, void, ptr, ptr, tl, env, i32)
56
+DEF_HELPER_5(vle_v_w_mask, void, ptr, ptr, tl, env, i32)
57
+DEF_HELPER_5(vle_v_d, void, ptr, ptr, tl, env, i32)
58
+DEF_HELPER_5(vle_v_d_mask, void, ptr, ptr, tl, env, i32)
59
+DEF_HELPER_5(vlbu_v_b, void, ptr, ptr, tl, env, i32)
60
+DEF_HELPER_5(vlbu_v_b_mask, void, ptr, ptr, tl, env, i32)
61
+DEF_HELPER_5(vlbu_v_h, void, ptr, ptr, tl, env, i32)
62
+DEF_HELPER_5(vlbu_v_h_mask, void, ptr, ptr, tl, env, i32)
63
+DEF_HELPER_5(vlbu_v_w, void, ptr, ptr, tl, env, i32)
64
+DEF_HELPER_5(vlbu_v_w_mask, void, ptr, ptr, tl, env, i32)
65
+DEF_HELPER_5(vlbu_v_d, void, ptr, ptr, tl, env, i32)
66
+DEF_HELPER_5(vlbu_v_d_mask, void, ptr, ptr, tl, env, i32)
67
+DEF_HELPER_5(vlhu_v_h, void, ptr, ptr, tl, env, i32)
68
+DEF_HELPER_5(vlhu_v_h_mask, void, ptr, ptr, tl, env, i32)
69
+DEF_HELPER_5(vlhu_v_w, void, ptr, ptr, tl, env, i32)
70
+DEF_HELPER_5(vlhu_v_w_mask, void, ptr, ptr, tl, env, i32)
71
+DEF_HELPER_5(vlhu_v_d, void, ptr, ptr, tl, env, i32)
72
+DEF_HELPER_5(vlhu_v_d_mask, void, ptr, ptr, tl, env, i32)
73
+DEF_HELPER_5(vlwu_v_w, void, ptr, ptr, tl, env, i32)
74
+DEF_HELPER_5(vlwu_v_w_mask, void, ptr, ptr, tl, env, i32)
75
+DEF_HELPER_5(vlwu_v_d, void, ptr, ptr, tl, env, i32)
76
+DEF_HELPER_5(vlwu_v_d_mask, void, ptr, ptr, tl, env, i32)
77
+DEF_HELPER_5(vsb_v_b, void, ptr, ptr, tl, env, i32)
78
+DEF_HELPER_5(vsb_v_b_mask, void, ptr, ptr, tl, env, i32)
79
+DEF_HELPER_5(vsb_v_h, void, ptr, ptr, tl, env, i32)
80
+DEF_HELPER_5(vsb_v_h_mask, void, ptr, ptr, tl, env, i32)
81
+DEF_HELPER_5(vsb_v_w, void, ptr, ptr, tl, env, i32)
82
+DEF_HELPER_5(vsb_v_w_mask, void, ptr, ptr, tl, env, i32)
83
+DEF_HELPER_5(vsb_v_d, void, ptr, ptr, tl, env, i32)
84
+DEF_HELPER_5(vsb_v_d_mask, void, ptr, ptr, tl, env, i32)
85
+DEF_HELPER_5(vsh_v_h, void, ptr, ptr, tl, env, i32)
86
+DEF_HELPER_5(vsh_v_h_mask, void, ptr, ptr, tl, env, i32)
87
+DEF_HELPER_5(vsh_v_w, void, ptr, ptr, tl, env, i32)
88
+DEF_HELPER_5(vsh_v_w_mask, void, ptr, ptr, tl, env, i32)
89
+DEF_HELPER_5(vsh_v_d, void, ptr, ptr, tl, env, i32)
90
+DEF_HELPER_5(vsh_v_d_mask, void, ptr, ptr, tl, env, i32)
91
+DEF_HELPER_5(vsw_v_w, void, ptr, ptr, tl, env, i32)
92
+DEF_HELPER_5(vsw_v_w_mask, void, ptr, ptr, tl, env, i32)
93
+DEF_HELPER_5(vsw_v_d, void, ptr, ptr, tl, env, i32)
94
+DEF_HELPER_5(vsw_v_d_mask, void, ptr, ptr, tl, env, i32)
95
+DEF_HELPER_5(vse_v_b, void, ptr, ptr, tl, env, i32)
96
+DEF_HELPER_5(vse_v_b_mask, void, ptr, ptr, tl, env, i32)
97
+DEF_HELPER_5(vse_v_h, void, ptr, ptr, tl, env, i32)
98
+DEF_HELPER_5(vse_v_h_mask, void, ptr, ptr, tl, env, i32)
99
+DEF_HELPER_5(vse_v_w, void, ptr, ptr, tl, env, i32)
100
+DEF_HELPER_5(vse_v_w_mask, void, ptr, ptr, tl, env, i32)
101
+DEF_HELPER_5(vse_v_d, void, ptr, ptr, tl, env, i32)
102
+DEF_HELPER_5(vse_v_d_mask, void, ptr, ptr, tl, env, i32)
103
+DEF_HELPER_6(vlsb_v_b, void, ptr, ptr, tl, tl, env, i32)
104
+DEF_HELPER_6(vlsb_v_h, void, ptr, ptr, tl, tl, env, i32)
105
+DEF_HELPER_6(vlsb_v_w, void, ptr, ptr, tl, tl, env, i32)
106
+DEF_HELPER_6(vlsb_v_d, void, ptr, ptr, tl, tl, env, i32)
107
+DEF_HELPER_6(vlsh_v_h, void, ptr, ptr, tl, tl, env, i32)
108
+DEF_HELPER_6(vlsh_v_w, void, ptr, ptr, tl, tl, env, i32)
109
+DEF_HELPER_6(vlsh_v_d, void, ptr, ptr, tl, tl, env, i32)
110
+DEF_HELPER_6(vlsw_v_w, void, ptr, ptr, tl, tl, env, i32)
111
+DEF_HELPER_6(vlsw_v_d, void, ptr, ptr, tl, tl, env, i32)
112
+DEF_HELPER_6(vlse_v_b, void, ptr, ptr, tl, tl, env, i32)
113
+DEF_HELPER_6(vlse_v_h, void, ptr, ptr, tl, tl, env, i32)
114
+DEF_HELPER_6(vlse_v_w, void, ptr, ptr, tl, tl, env, i32)
115
+DEF_HELPER_6(vlse_v_d, void, ptr, ptr, tl, tl, env, i32)
116
+DEF_HELPER_6(vlsbu_v_b, void, ptr, ptr, tl, tl, env, i32)
117
+DEF_HELPER_6(vlsbu_v_h, void, ptr, ptr, tl, tl, env, i32)
118
+DEF_HELPER_6(vlsbu_v_w, void, ptr, ptr, tl, tl, env, i32)
119
+DEF_HELPER_6(vlsbu_v_d, void, ptr, ptr, tl, tl, env, i32)
120
+DEF_HELPER_6(vlshu_v_h, void, ptr, ptr, tl, tl, env, i32)
121
+DEF_HELPER_6(vlshu_v_w, void, ptr, ptr, tl, tl, env, i32)
122
+DEF_HELPER_6(vlshu_v_d, void, ptr, ptr, tl, tl, env, i32)
123
+DEF_HELPER_6(vlswu_v_w, void, ptr, ptr, tl, tl, env, i32)
124
+DEF_HELPER_6(vlswu_v_d, void, ptr, ptr, tl, tl, env, i32)
125
+DEF_HELPER_6(vssb_v_b, void, ptr, ptr, tl, tl, env, i32)
126
+DEF_HELPER_6(vssb_v_h, void, ptr, ptr, tl, tl, env, i32)
127
+DEF_HELPER_6(vssb_v_w, void, ptr, ptr, tl, tl, env, i32)
128
+DEF_HELPER_6(vssb_v_d, void, ptr, ptr, tl, tl, env, i32)
129
+DEF_HELPER_6(vssh_v_h, void, ptr, ptr, tl, tl, env, i32)
130
+DEF_HELPER_6(vssh_v_w, void, ptr, ptr, tl, tl, env, i32)
131
+DEF_HELPER_6(vssh_v_d, void, ptr, ptr, tl, tl, env, i32)
132
+DEF_HELPER_6(vssw_v_w, void, ptr, ptr, tl, tl, env, i32)
133
+DEF_HELPER_6(vssw_v_d, void, ptr, ptr, tl, tl, env, i32)
134
+DEF_HELPER_6(vsse_v_b, void, ptr, ptr, tl, tl, env, i32)
135
+DEF_HELPER_6(vsse_v_h, void, ptr, ptr, tl, tl, env, i32)
136
+DEF_HELPER_6(vsse_v_w, void, ptr, ptr, tl, tl, env, i32)
137
+DEF_HELPER_6(vsse_v_d, void, ptr, ptr, tl, tl, env, i32)
138
diff --git a/target/riscv/internals.h b/target/riscv/internals.h
139
index XXXXXXX..XXXXXXX 100644
140
--- a/target/riscv/internals.h
141
+++ b/target/riscv/internals.h
27
@@ -XXX,XX +XXX,XX @@
142
@@ -XXX,XX +XXX,XX @@
28
143
29
#include "hw/char/mchp_pfsoc_mmuart.h"
144
#include "hw/registerfields.h"
30
#include "hw/dma/sifive_pdma.h"
145
31
+#include "hw/net/cadence_gem.h"
146
+/* share data between vector helpers and decode code */
32
#include "hw/sd/cadence_sdhci.h"
147
+FIELD(VDATA, MLEN, 0, 8)
33
148
+FIELD(VDATA, VM, 8, 1)
34
typedef struct MicrochipPFSoCState {
149
+FIELD(VDATA, LMUL, 9, 2)
35
@@ -XXX,XX +XXX,XX @@ typedef struct MicrochipPFSoCState {
150
+FIELD(VDATA, NF, 11, 4)
36
MchpPfSoCMMUartState *serial3;
151
#endif
37
MchpPfSoCMMUartState *serial4;
152
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
38
SiFivePDMAState dma;
39
+ CadenceGEMState gem0;
40
+ CadenceGEMState gem1;
41
CadenceSDHCIState sdhci;
42
} MicrochipPFSoCState;
43
44
@@ -XXX,XX +XXX,XX @@ enum {
45
MICROCHIP_PFSOC_MMUART2,
46
MICROCHIP_PFSOC_MMUART3,
47
MICROCHIP_PFSOC_MMUART4,
48
+ MICROCHIP_PFSOC_GEM0,
49
+ MICROCHIP_PFSOC_GEM1,
50
MICROCHIP_PFSOC_ENVM_CFG,
51
MICROCHIP_PFSOC_ENVM_DATA,
52
MICROCHIP_PFSOC_IOSCB_CFG,
53
@@ -XXX,XX +XXX,XX @@ enum {
54
MICROCHIP_PFSOC_DMA_IRQ5 = 10,
55
MICROCHIP_PFSOC_DMA_IRQ6 = 11,
56
MICROCHIP_PFSOC_DMA_IRQ7 = 12,
57
+ MICROCHIP_PFSOC_GEM0_IRQ = 64,
58
+ MICROCHIP_PFSOC_GEM1_IRQ = 70,
59
MICROCHIP_PFSOC_EMMC_SD_IRQ = 88,
60
MICROCHIP_PFSOC_MMUART0_IRQ = 90,
61
MICROCHIP_PFSOC_MMUART1_IRQ = 91,
62
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
63
index XXXXXXX..XXXXXXX 100644
153
index XXXXXXX..XXXXXXX 100644
64
--- a/hw/riscv/microchip_pfsoc.c
154
--- a/target/riscv/insn32.decode
65
+++ b/hw/riscv/microchip_pfsoc.c
155
+++ b/target/riscv/insn32.decode
66
@@ -XXX,XX +XXX,XX @@
156
@@ -XXX,XX +XXX,XX @@
67
* 3) MMUARTs (Multi-Mode UART)
157
%sh10 20:10
68
* 4) Cadence eMMC/SDHC controller and an SD card connected to it
158
%csr 20:12
69
* 5) SiFive Platform DMA (Direct Memory Access Controller)
159
%rm 12:3
70
+ * 6) GEM (Gigabit Ethernet MAC Controller)
160
+%nf 29:3 !function=ex_plus_1
71
*
161
72
* This board currently generates devicetree dynamically that indicates at least
162
# immediates:
73
* two harts and up to five harts.
163
%imm_i 20:s12
74
@@ -XXX,XX +XXX,XX @@
164
@@ -XXX,XX +XXX,XX @@
75
#define BIOS_FILENAME "hss.bin"
165
&u imm rd
76
#define RESET_VECTOR 0x20220000
166
&shift shamt rs1 rd
77
167
&atomic aq rl rs2 rs1 rd
78
+/* GEM version */
168
+&r2nfvm vm rd rs1 nf
79
+#define GEM_REVISION 0x0107010c
169
+&rnfvm vm rd rs1 rs2 nf
80
+
170
81
static const struct MemmapEntry {
171
# Formats 32:
82
hwaddr base;
172
@r ....... ..... ..... ... ..... ....... &r %rs2 %rs1 %rd
83
hwaddr size;
173
@@ -XXX,XX +XXX,XX @@
84
@@ -XXX,XX +XXX,XX @@ static const struct MemmapEntry {
174
@r_rm ....... ..... ..... ... ..... ....... %rs2 %rs1 %rm %rd
85
[MICROCHIP_PFSOC_MMUART2] = { 0x20102000, 0x1000 },
175
@r2_rm ....... ..... ..... ... ..... ....... %rs1 %rm %rd
86
[MICROCHIP_PFSOC_MMUART3] = { 0x20104000, 0x1000 },
176
@r2 ....... ..... ..... ... ..... ....... %rs1 %rd
87
[MICROCHIP_PFSOC_MMUART4] = { 0x20106000, 0x1000 },
177
+@r2_nfvm ... ... vm:1 ..... ..... ... ..... ....... &r2nfvm %nf %rs1 %rd
88
+ [MICROCHIP_PFSOC_GEM0] = { 0x20110000, 0x2000 },
178
+@r_nfvm ... ... vm:1 ..... ..... ... ..... ....... &rnfvm %nf %rs2 %rs1 %rd
89
+ [MICROCHIP_PFSOC_GEM1] = { 0x20112000, 0x2000 },
179
@r2_zimm . zimm:11 ..... ... ..... ....... %rs1 %rd
90
[MICROCHIP_PFSOC_ENVM_CFG] = { 0x20200000, 0x1000 },
180
91
[MICROCHIP_PFSOC_ENVM_DATA] = { 0x20220000, 0x20000 },
181
@hfence_gvma ....... ..... ..... ... ..... ....... %rs2 %rs1
92
[MICROCHIP_PFSOC_IOSCB_CFG] = { 0x37080000, 0x1000 },
182
@@ -XXX,XX +XXX,XX @@ hfence_gvma 0110001 ..... ..... 000 00000 1110011 @hfence_gvma
93
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_instance_init(Object *obj)
183
hfence_vvma 0010001 ..... ..... 000 00000 1110011 @hfence_vvma
94
object_initialize_child(obj, "dma-controller", &s->dma,
184
95
TYPE_SIFIVE_PDMA);
185
# *** RV32V Extension ***
96
186
+
97
+ object_initialize_child(obj, "gem0", &s->gem0, TYPE_CADENCE_GEM);
187
+# *** Vector loads and stores are encoded within LOADFP/STORE-FP ***
98
+ object_initialize_child(obj, "gem1", &s->gem1, TYPE_CADENCE_GEM);
188
+vlb_v ... 100 . 00000 ..... 000 ..... 0000111 @r2_nfvm
99
+
189
+vlh_v ... 100 . 00000 ..... 101 ..... 0000111 @r2_nfvm
100
object_initialize_child(obj, "sd-controller", &s->sdhci,
190
+vlw_v ... 100 . 00000 ..... 110 ..... 0000111 @r2_nfvm
101
TYPE_CADENCE_SDHCI);
191
+vle_v ... 000 . 00000 ..... 111 ..... 0000111 @r2_nfvm
192
+vlbu_v ... 000 . 00000 ..... 000 ..... 0000111 @r2_nfvm
193
+vlhu_v ... 000 . 00000 ..... 101 ..... 0000111 @r2_nfvm
194
+vlwu_v ... 000 . 00000 ..... 110 ..... 0000111 @r2_nfvm
195
+vsb_v ... 000 . 00000 ..... 000 ..... 0100111 @r2_nfvm
196
+vsh_v ... 000 . 00000 ..... 101 ..... 0100111 @r2_nfvm
197
+vsw_v ... 000 . 00000 ..... 110 ..... 0100111 @r2_nfvm
198
+vse_v ... 000 . 00000 ..... 111 ..... 0100111 @r2_nfvm
199
+
200
+vlsb_v ... 110 . ..... ..... 000 ..... 0000111 @r_nfvm
201
+vlsh_v ... 110 . ..... ..... 101 ..... 0000111 @r_nfvm
202
+vlsw_v ... 110 . ..... ..... 110 ..... 0000111 @r_nfvm
203
+vlse_v ... 010 . ..... ..... 111 ..... 0000111 @r_nfvm
204
+vlsbu_v ... 010 . ..... ..... 000 ..... 0000111 @r_nfvm
205
+vlshu_v ... 010 . ..... ..... 101 ..... 0000111 @r_nfvm
206
+vlswu_v ... 010 . ..... ..... 110 ..... 0000111 @r_nfvm
207
+vssb_v ... 010 . ..... ..... 000 ..... 0100111 @r_nfvm
208
+vssh_v ... 010 . ..... ..... 101 ..... 0100111 @r_nfvm
209
+vssw_v ... 010 . ..... ..... 110 ..... 0100111 @r_nfvm
210
+vsse_v ... 010 . ..... ..... 111 ..... 0100111 @r_nfvm
211
+
212
+# *** new major opcode OP-V ***
213
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
214
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
215
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
216
index XXXXXXX..XXXXXXX 100644
217
--- a/target/riscv/insn_trans/trans_rvv.inc.c
218
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
219
@@ -XXX,XX +XXX,XX @@
220
* You should have received a copy of the GNU General Public License along with
221
* this program. If not, see <http://www.gnu.org/licenses/>.
222
*/
223
+#include "tcg/tcg-op-gvec.h"
224
+#include "tcg/tcg-gvec-desc.h"
225
+#include "internals.h"
226
227
static bool trans_vsetvl(DisasContext *ctx, arg_vsetvl *a)
228
{
229
@@ -XXX,XX +XXX,XX @@ static bool trans_vsetvli(DisasContext *ctx, arg_vsetvli *a)
230
tcg_temp_free(dst);
231
return true;
102
}
232
}
103
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
233
+
104
MemoryRegion *envm_data = g_new(MemoryRegion, 1);
234
+/* vector register offset from env */
105
char *plic_hart_config;
235
+static uint32_t vreg_ofs(DisasContext *s, int reg)
106
size_t plic_hart_config_len;
236
+{
107
+ NICInfo *nd;
237
+ return offsetof(CPURISCVState, vreg) + reg * s->vlen / 8;
108
int i;
238
+}
109
239
+
110
sysbus_realize(SYS_BUS_DEVICE(&s->e_cpus), &error_abort);
240
+/* check functions */
111
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
241
+
112
qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART4_IRQ),
242
+/*
113
serial_hd(4));
243
+ * In cpu_get_tb_cpu_state(), set VILL if RVV was not present.
114
244
+ * So RVV is also be checked in this function.
115
+ /* GEMs */
245
+ */
116
+
246
+static bool vext_check_isa_ill(DisasContext *s)
117
+ nd = &nd_table[0];
247
+{
118
+ if (nd->used) {
248
+ return !s->vill;
119
+ qemu_check_nic_model(nd, TYPE_CADENCE_GEM);
249
+}
120
+ qdev_set_nic_properties(DEVICE(&s->gem0), nd);
250
+
251
+/*
252
+ * There are two rules check here.
253
+ *
254
+ * 1. Vector register numbers are multiples of LMUL. (Section 3.2)
255
+ *
256
+ * 2. For all widening instructions, the destination LMUL value must also be
257
+ * a supported LMUL value. (Section 11.2)
258
+ */
259
+static bool vext_check_reg(DisasContext *s, uint32_t reg, bool widen)
260
+{
261
+ /*
262
+ * The destination vector register group results are arranged as if both
263
+ * SEW and LMUL were at twice their current settings. (Section 11.2).
264
+ */
265
+ int legal = widen ? 2 << s->lmul : 1 << s->lmul;
266
+
267
+ return !((s->lmul == 0x3 && widen) || (reg % legal));
268
+}
269
+
270
+/*
271
+ * There are two rules check here.
272
+ *
273
+ * 1. The destination vector register group for a masked vector instruction can
274
+ * only overlap the source mask register (v0) when LMUL=1. (Section 5.3)
275
+ *
276
+ * 2. In widen instructions and some other insturctions, like vslideup.vx,
277
+ * there is no need to check whether LMUL=1.
278
+ */
279
+static bool vext_check_overlap_mask(DisasContext *s, uint32_t vd, bool vm,
280
+ bool force)
281
+{
282
+ return (vm != 0 || vd != 0) || (!force && (s->lmul == 0));
283
+}
284
+
285
+/* The LMUL setting must be such that LMUL * NFIELDS <= 8. (Section 7.8) */
286
+static bool vext_check_nf(DisasContext *s, uint32_t nf)
287
+{
288
+ return (1 << s->lmul) * nf <= 8;
289
+}
290
+
291
+/* common translation macro */
292
+#define GEN_VEXT_TRANS(NAME, SEQ, ARGTYPE, OP, CHECK) \
293
+static bool trans_##NAME(DisasContext *s, arg_##ARGTYPE *a)\
294
+{ \
295
+ if (CHECK(s, a)) { \
296
+ return OP(s, a, SEQ); \
297
+ } \
298
+ return false; \
299
+}
300
+
301
+/*
302
+ *** unit stride load and store
303
+ */
304
+typedef void gen_helper_ldst_us(TCGv_ptr, TCGv_ptr, TCGv,
305
+ TCGv_env, TCGv_i32);
306
+
307
+static bool ldst_us_trans(uint32_t vd, uint32_t rs1, uint32_t data,
308
+ gen_helper_ldst_us *fn, DisasContext *s)
309
+{
310
+ TCGv_ptr dest, mask;
311
+ TCGv base;
312
+ TCGv_i32 desc;
313
+
314
+ TCGLabel *over = gen_new_label();
315
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
316
+
317
+ dest = tcg_temp_new_ptr();
318
+ mask = tcg_temp_new_ptr();
319
+ base = tcg_temp_new();
320
+
321
+ /*
322
+ * As simd_desc supports at most 256 bytes, and in this implementation,
323
+ * the max vector group length is 2048 bytes. So split it into two parts.
324
+ *
325
+ * The first part is vlen in bytes, encoded in maxsz of simd_desc.
326
+ * The second part is lmul, encoded in data of simd_desc.
327
+ */
328
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
329
+
330
+ gen_get_gpr(base, rs1);
331
+ tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
332
+ tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
333
+
334
+ fn(dest, mask, base, cpu_env, desc);
335
+
336
+ tcg_temp_free_ptr(dest);
337
+ tcg_temp_free_ptr(mask);
338
+ tcg_temp_free(base);
339
+ tcg_temp_free_i32(desc);
340
+ gen_set_label(over);
341
+ return true;
342
+}
343
+
344
+static bool ld_us_op(DisasContext *s, arg_r2nfvm *a, uint8_t seq)
345
+{
346
+ uint32_t data = 0;
347
+ gen_helper_ldst_us *fn;
348
+ static gen_helper_ldst_us * const fns[2][7][4] = {
349
+ /* masked unit stride load */
350
+ { { gen_helper_vlb_v_b_mask, gen_helper_vlb_v_h_mask,
351
+ gen_helper_vlb_v_w_mask, gen_helper_vlb_v_d_mask },
352
+ { NULL, gen_helper_vlh_v_h_mask,
353
+ gen_helper_vlh_v_w_mask, gen_helper_vlh_v_d_mask },
354
+ { NULL, NULL,
355
+ gen_helper_vlw_v_w_mask, gen_helper_vlw_v_d_mask },
356
+ { gen_helper_vle_v_b_mask, gen_helper_vle_v_h_mask,
357
+ gen_helper_vle_v_w_mask, gen_helper_vle_v_d_mask },
358
+ { gen_helper_vlbu_v_b_mask, gen_helper_vlbu_v_h_mask,
359
+ gen_helper_vlbu_v_w_mask, gen_helper_vlbu_v_d_mask },
360
+ { NULL, gen_helper_vlhu_v_h_mask,
361
+ gen_helper_vlhu_v_w_mask, gen_helper_vlhu_v_d_mask },
362
+ { NULL, NULL,
363
+ gen_helper_vlwu_v_w_mask, gen_helper_vlwu_v_d_mask } },
364
+ /* unmasked unit stride load */
365
+ { { gen_helper_vlb_v_b, gen_helper_vlb_v_h,
366
+ gen_helper_vlb_v_w, gen_helper_vlb_v_d },
367
+ { NULL, gen_helper_vlh_v_h,
368
+ gen_helper_vlh_v_w, gen_helper_vlh_v_d },
369
+ { NULL, NULL,
370
+ gen_helper_vlw_v_w, gen_helper_vlw_v_d },
371
+ { gen_helper_vle_v_b, gen_helper_vle_v_h,
372
+ gen_helper_vle_v_w, gen_helper_vle_v_d },
373
+ { gen_helper_vlbu_v_b, gen_helper_vlbu_v_h,
374
+ gen_helper_vlbu_v_w, gen_helper_vlbu_v_d },
375
+ { NULL, gen_helper_vlhu_v_h,
376
+ gen_helper_vlhu_v_w, gen_helper_vlhu_v_d },
377
+ { NULL, NULL,
378
+ gen_helper_vlwu_v_w, gen_helper_vlwu_v_d } }
379
+ };
380
+
381
+ fn = fns[a->vm][seq][s->sew];
382
+ if (fn == NULL) {
383
+ return false;
121
+ }
384
+ }
122
+ nd = &nd_table[1];
385
+
123
+ if (nd->used) {
386
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
124
+ qemu_check_nic_model(nd, TYPE_CADENCE_GEM);
387
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
125
+ qdev_set_nic_properties(DEVICE(&s->gem1), nd);
388
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
389
+ data = FIELD_DP32(data, VDATA, NF, a->nf);
390
+ return ldst_us_trans(a->rd, a->rs1, data, fn, s);
391
+}
392
+
393
+static bool ld_us_check(DisasContext *s, arg_r2nfvm* a)
394
+{
395
+ return (vext_check_isa_ill(s) &&
396
+ vext_check_overlap_mask(s, a->rd, a->vm, false) &&
397
+ vext_check_reg(s, a->rd, false) &&
398
+ vext_check_nf(s, a->nf));
399
+}
400
+
401
+GEN_VEXT_TRANS(vlb_v, 0, r2nfvm, ld_us_op, ld_us_check)
402
+GEN_VEXT_TRANS(vlh_v, 1, r2nfvm, ld_us_op, ld_us_check)
403
+GEN_VEXT_TRANS(vlw_v, 2, r2nfvm, ld_us_op, ld_us_check)
404
+GEN_VEXT_TRANS(vle_v, 3, r2nfvm, ld_us_op, ld_us_check)
405
+GEN_VEXT_TRANS(vlbu_v, 4, r2nfvm, ld_us_op, ld_us_check)
406
+GEN_VEXT_TRANS(vlhu_v, 5, r2nfvm, ld_us_op, ld_us_check)
407
+GEN_VEXT_TRANS(vlwu_v, 6, r2nfvm, ld_us_op, ld_us_check)
408
+
409
+static bool st_us_op(DisasContext *s, arg_r2nfvm *a, uint8_t seq)
410
+{
411
+ uint32_t data = 0;
412
+ gen_helper_ldst_us *fn;
413
+ static gen_helper_ldst_us * const fns[2][4][4] = {
414
+ /* masked unit stride load and store */
415
+ { { gen_helper_vsb_v_b_mask, gen_helper_vsb_v_h_mask,
416
+ gen_helper_vsb_v_w_mask, gen_helper_vsb_v_d_mask },
417
+ { NULL, gen_helper_vsh_v_h_mask,
418
+ gen_helper_vsh_v_w_mask, gen_helper_vsh_v_d_mask },
419
+ { NULL, NULL,
420
+ gen_helper_vsw_v_w_mask, gen_helper_vsw_v_d_mask },
421
+ { gen_helper_vse_v_b_mask, gen_helper_vse_v_h_mask,
422
+ gen_helper_vse_v_w_mask, gen_helper_vse_v_d_mask } },
423
+ /* unmasked unit stride store */
424
+ { { gen_helper_vsb_v_b, gen_helper_vsb_v_h,
425
+ gen_helper_vsb_v_w, gen_helper_vsb_v_d },
426
+ { NULL, gen_helper_vsh_v_h,
427
+ gen_helper_vsh_v_w, gen_helper_vsh_v_d },
428
+ { NULL, NULL,
429
+ gen_helper_vsw_v_w, gen_helper_vsw_v_d },
430
+ { gen_helper_vse_v_b, gen_helper_vse_v_h,
431
+ gen_helper_vse_v_w, gen_helper_vse_v_d } }
432
+ };
433
+
434
+ fn = fns[a->vm][seq][s->sew];
435
+ if (fn == NULL) {
436
+ return false;
126
+ }
437
+ }
127
+
438
+
128
+ object_property_set_int(OBJECT(&s->gem0), "revision", GEM_REVISION, errp);
439
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
129
+ object_property_set_int(OBJECT(&s->gem0), "phy-addr", 8, errp);
440
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
130
+ sysbus_realize(SYS_BUS_DEVICE(&s->gem0), errp);
441
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
131
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->gem0), 0,
442
+ data = FIELD_DP32(data, VDATA, NF, a->nf);
132
+ memmap[MICROCHIP_PFSOC_GEM0].base);
443
+ return ldst_us_trans(a->rd, a->rs1, data, fn, s);
133
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->gem0), 0,
444
+}
134
+ qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_GEM0_IRQ));
445
+
135
+
446
+static bool st_us_check(DisasContext *s, arg_r2nfvm* a)
136
+ object_property_set_int(OBJECT(&s->gem1), "revision", GEM_REVISION, errp);
447
+{
137
+ object_property_set_int(OBJECT(&s->gem1), "phy-addr", 9, errp);
448
+ return (vext_check_isa_ill(s) &&
138
+ sysbus_realize(SYS_BUS_DEVICE(&s->gem1), errp);
449
+ vext_check_reg(s, a->rd, false) &&
139
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->gem1), 0,
450
+ vext_check_nf(s, a->nf));
140
+ memmap[MICROCHIP_PFSOC_GEM1].base);
451
+}
141
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->gem1), 0,
452
+
142
+ qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_GEM1_IRQ));
453
+GEN_VEXT_TRANS(vsb_v, 0, r2nfvm, st_us_op, st_us_check)
143
+
454
+GEN_VEXT_TRANS(vsh_v, 1, r2nfvm, st_us_op, st_us_check)
144
/* eNVM */
455
+GEN_VEXT_TRANS(vsw_v, 2, r2nfvm, st_us_op, st_us_check)
145
memory_region_init_rom(envm_data, OBJECT(dev), "microchip.pfsoc.envm.data",
456
+GEN_VEXT_TRANS(vse_v, 3, r2nfvm, st_us_op, st_us_check)
146
memmap[MICROCHIP_PFSOC_ENVM_DATA].size,
457
+
458
+/*
459
+ *** stride load and store
460
+ */
461
+typedef void gen_helper_ldst_stride(TCGv_ptr, TCGv_ptr, TCGv,
462
+ TCGv, TCGv_env, TCGv_i32);
463
+
464
+static bool ldst_stride_trans(uint32_t vd, uint32_t rs1, uint32_t rs2,
465
+ uint32_t data, gen_helper_ldst_stride *fn,
466
+ DisasContext *s)
467
+{
468
+ TCGv_ptr dest, mask;
469
+ TCGv base, stride;
470
+ TCGv_i32 desc;
471
+
472
+ TCGLabel *over = gen_new_label();
473
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
474
+
475
+ dest = tcg_temp_new_ptr();
476
+ mask = tcg_temp_new_ptr();
477
+ base = tcg_temp_new();
478
+ stride = tcg_temp_new();
479
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
480
+
481
+ gen_get_gpr(base, rs1);
482
+ gen_get_gpr(stride, rs2);
483
+ tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
484
+ tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
485
+
486
+ fn(dest, mask, base, stride, cpu_env, desc);
487
+
488
+ tcg_temp_free_ptr(dest);
489
+ tcg_temp_free_ptr(mask);
490
+ tcg_temp_free(base);
491
+ tcg_temp_free(stride);
492
+ tcg_temp_free_i32(desc);
493
+ gen_set_label(over);
494
+ return true;
495
+}
496
+
497
+static bool ld_stride_op(DisasContext *s, arg_rnfvm *a, uint8_t seq)
498
+{
499
+ uint32_t data = 0;
500
+ gen_helper_ldst_stride *fn;
501
+ static gen_helper_ldst_stride * const fns[7][4] = {
502
+ { gen_helper_vlsb_v_b, gen_helper_vlsb_v_h,
503
+ gen_helper_vlsb_v_w, gen_helper_vlsb_v_d },
504
+ { NULL, gen_helper_vlsh_v_h,
505
+ gen_helper_vlsh_v_w, gen_helper_vlsh_v_d },
506
+ { NULL, NULL,
507
+ gen_helper_vlsw_v_w, gen_helper_vlsw_v_d },
508
+ { gen_helper_vlse_v_b, gen_helper_vlse_v_h,
509
+ gen_helper_vlse_v_w, gen_helper_vlse_v_d },
510
+ { gen_helper_vlsbu_v_b, gen_helper_vlsbu_v_h,
511
+ gen_helper_vlsbu_v_w, gen_helper_vlsbu_v_d },
512
+ { NULL, gen_helper_vlshu_v_h,
513
+ gen_helper_vlshu_v_w, gen_helper_vlshu_v_d },
514
+ { NULL, NULL,
515
+ gen_helper_vlswu_v_w, gen_helper_vlswu_v_d },
516
+ };
517
+
518
+ fn = fns[seq][s->sew];
519
+ if (fn == NULL) {
520
+ return false;
521
+ }
522
+
523
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
524
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
525
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
526
+ data = FIELD_DP32(data, VDATA, NF, a->nf);
527
+ return ldst_stride_trans(a->rd, a->rs1, a->rs2, data, fn, s);
528
+}
529
+
530
+static bool ld_stride_check(DisasContext *s, arg_rnfvm* a)
531
+{
532
+ return (vext_check_isa_ill(s) &&
533
+ vext_check_overlap_mask(s, a->rd, a->vm, false) &&
534
+ vext_check_reg(s, a->rd, false) &&
535
+ vext_check_nf(s, a->nf));
536
+}
537
+
538
+GEN_VEXT_TRANS(vlsb_v, 0, rnfvm, ld_stride_op, ld_stride_check)
539
+GEN_VEXT_TRANS(vlsh_v, 1, rnfvm, ld_stride_op, ld_stride_check)
540
+GEN_VEXT_TRANS(vlsw_v, 2, rnfvm, ld_stride_op, ld_stride_check)
541
+GEN_VEXT_TRANS(vlse_v, 3, rnfvm, ld_stride_op, ld_stride_check)
542
+GEN_VEXT_TRANS(vlsbu_v, 4, rnfvm, ld_stride_op, ld_stride_check)
543
+GEN_VEXT_TRANS(vlshu_v, 5, rnfvm, ld_stride_op, ld_stride_check)
544
+GEN_VEXT_TRANS(vlswu_v, 6, rnfvm, ld_stride_op, ld_stride_check)
545
+
546
+static bool st_stride_op(DisasContext *s, arg_rnfvm *a, uint8_t seq)
547
+{
548
+ uint32_t data = 0;
549
+ gen_helper_ldst_stride *fn;
550
+ static gen_helper_ldst_stride * const fns[4][4] = {
551
+ /* masked stride store */
552
+ { gen_helper_vssb_v_b, gen_helper_vssb_v_h,
553
+ gen_helper_vssb_v_w, gen_helper_vssb_v_d },
554
+ { NULL, gen_helper_vssh_v_h,
555
+ gen_helper_vssh_v_w, gen_helper_vssh_v_d },
556
+ { NULL, NULL,
557
+ gen_helper_vssw_v_w, gen_helper_vssw_v_d },
558
+ { gen_helper_vsse_v_b, gen_helper_vsse_v_h,
559
+ gen_helper_vsse_v_w, gen_helper_vsse_v_d }
560
+ };
561
+
562
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
563
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
564
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
565
+ data = FIELD_DP32(data, VDATA, NF, a->nf);
566
+ fn = fns[seq][s->sew];
567
+ if (fn == NULL) {
568
+ return false;
569
+ }
570
+
571
+ return ldst_stride_trans(a->rd, a->rs1, a->rs2, data, fn, s);
572
+}
573
+
574
+static bool st_stride_check(DisasContext *s, arg_rnfvm* a)
575
+{
576
+ return (vext_check_isa_ill(s) &&
577
+ vext_check_reg(s, a->rd, false) &&
578
+ vext_check_nf(s, a->nf));
579
+}
580
+
581
+GEN_VEXT_TRANS(vssb_v, 0, rnfvm, st_stride_op, st_stride_check)
582
+GEN_VEXT_TRANS(vssh_v, 1, rnfvm, st_stride_op, st_stride_check)
583
+GEN_VEXT_TRANS(vssw_v, 2, rnfvm, st_stride_op, st_stride_check)
584
+GEN_VEXT_TRANS(vsse_v, 3, rnfvm, st_stride_op, st_stride_check)
585
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
586
index XXXXXXX..XXXXXXX 100644
587
--- a/target/riscv/translate.c
588
+++ b/target/riscv/translate.c
589
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
590
uint8_t lmul;
591
uint8_t sew;
592
uint16_t vlen;
593
+ uint16_t mlen;
594
bool vl_eq_vlmax;
595
} DisasContext;
596
597
@@ -XXX,XX +XXX,XX @@ static void decode_RV32_64C(DisasContext *ctx, uint16_t opcode)
598
}
599
}
600
601
+static int ex_plus_1(DisasContext *ctx, int nf)
602
+{
603
+ return nf + 1;
604
+}
605
+
606
#define EX_SH(amount) \
607
static int ex_shift_##amount(DisasContext *ctx, int imm) \
608
{ \
609
@@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
610
ctx->vill = FIELD_EX32(tb_flags, TB_FLAGS, VILL);
611
ctx->sew = FIELD_EX32(tb_flags, TB_FLAGS, SEW);
612
ctx->lmul = FIELD_EX32(tb_flags, TB_FLAGS, LMUL);
613
+ ctx->mlen = 1 << (ctx->sew + 3 - ctx->lmul);
614
ctx->vl_eq_vlmax = FIELD_EX32(tb_flags, TB_FLAGS, VL_EQ_VLMAX);
615
}
616
617
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
618
index XXXXXXX..XXXXXXX 100644
619
--- a/target/riscv/vector_helper.c
620
+++ b/target/riscv/vector_helper.c
621
@@ -XXX,XX +XXX,XX @@
622
623
#include "qemu/osdep.h"
624
#include "cpu.h"
625
+#include "exec/memop.h"
626
#include "exec/exec-all.h"
627
#include "exec/helper-proto.h"
628
+#include "tcg/tcg-gvec-desc.h"
629
+#include "internals.h"
630
#include <math.h>
631
632
target_ulong HELPER(vsetvl)(CPURISCVState *env, target_ulong s1,
633
@@ -XXX,XX +XXX,XX @@ target_ulong HELPER(vsetvl)(CPURISCVState *env, target_ulong s1,
634
env->vstart = 0;
635
return vl;
636
}
637
+
638
+/*
639
+ * Note that vector data is stored in host-endian 64-bit chunks,
640
+ * so addressing units smaller than that needs a host-endian fixup.
641
+ */
642
+#ifdef HOST_WORDS_BIGENDIAN
643
+#define H1(x) ((x) ^ 7)
644
+#define H1_2(x) ((x) ^ 6)
645
+#define H1_4(x) ((x) ^ 4)
646
+#define H2(x) ((x) ^ 3)
647
+#define H4(x) ((x) ^ 1)
648
+#define H8(x) ((x))
649
+#else
650
+#define H1(x) (x)
651
+#define H1_2(x) (x)
652
+#define H1_4(x) (x)
653
+#define H2(x) (x)
654
+#define H4(x) (x)
655
+#define H8(x) (x)
656
+#endif
657
+
658
+static inline uint32_t vext_nf(uint32_t desc)
659
+{
660
+ return FIELD_EX32(simd_data(desc), VDATA, NF);
661
+}
662
+
663
+static inline uint32_t vext_mlen(uint32_t desc)
664
+{
665
+ return FIELD_EX32(simd_data(desc), VDATA, MLEN);
666
+}
667
+
668
+static inline uint32_t vext_vm(uint32_t desc)
669
+{
670
+ return FIELD_EX32(simd_data(desc), VDATA, VM);
671
+}
672
+
673
+static inline uint32_t vext_lmul(uint32_t desc)
674
+{
675
+ return FIELD_EX32(simd_data(desc), VDATA, LMUL);
676
+}
677
+
678
+/*
679
+ * Get vector group length in bytes. Its range is [64, 2048].
680
+ *
681
+ * As simd_desc support at most 256, the max vlen is 512 bits.
682
+ * So vlen in bytes is encoded as maxsz.
683
+ */
684
+static inline uint32_t vext_maxsz(uint32_t desc)
685
+{
686
+ return simd_maxsz(desc) << vext_lmul(desc);
687
+}
688
+
689
+/*
690
+ * This function checks watchpoint before real load operation.
691
+ *
692
+ * In softmmu mode, the TLB API probe_access is enough for watchpoint check.
693
+ * In user mode, there is no watchpoint support now.
694
+ *
695
+ * It will trigger an exception if there is no mapping in TLB
696
+ * and page table walk can't fill the TLB entry. Then the guest
697
+ * software can return here after process the exception or never return.
698
+ */
699
+static void probe_pages(CPURISCVState *env, target_ulong addr,
700
+ target_ulong len, uintptr_t ra,
701
+ MMUAccessType access_type)
702
+{
703
+ target_ulong pagelen = -(addr | TARGET_PAGE_MASK);
704
+ target_ulong curlen = MIN(pagelen, len);
705
+
706
+ probe_access(env, addr, curlen, access_type,
707
+ cpu_mmu_index(env, false), ra);
708
+ if (len > curlen) {
709
+ addr += curlen;
710
+ curlen = len - curlen;
711
+ probe_access(env, addr, curlen, access_type,
712
+ cpu_mmu_index(env, false), ra);
713
+ }
714
+}
715
+
716
+#ifdef HOST_WORDS_BIGENDIAN
717
+static void vext_clear(void *tail, uint32_t cnt, uint32_t tot)
718
+{
719
+ /*
720
+ * Split the remaining range to two parts.
721
+ * The first part is in the last uint64_t unit.
722
+ * The second part start from the next uint64_t unit.
723
+ */
724
+ int part1 = 0, part2 = tot - cnt;
725
+ if (cnt % 8) {
726
+ part1 = 8 - (cnt % 8);
727
+ part2 = tot - cnt - part1;
728
+ memset((void *)((uintptr_t)tail & ~(7ULL)), 0, part1);
729
+ memset((void *)(((uintptr_t)tail + 8) & ~(7ULL)), 0, part2);
730
+ } else {
731
+ memset(tail, 0, part2);
732
+ }
733
+}
734
+#else
735
+static void vext_clear(void *tail, uint32_t cnt, uint32_t tot)
736
+{
737
+ memset(tail, 0, tot - cnt);
738
+}
739
+#endif
740
+
741
+static void clearb(void *vd, uint32_t idx, uint32_t cnt, uint32_t tot)
742
+{
743
+ int8_t *cur = ((int8_t *)vd + H1(idx));
744
+ vext_clear(cur, cnt, tot);
745
+}
746
+
747
+static void clearh(void *vd, uint32_t idx, uint32_t cnt, uint32_t tot)
748
+{
749
+ int16_t *cur = ((int16_t *)vd + H2(idx));
750
+ vext_clear(cur, cnt, tot);
751
+}
752
+
753
+static void clearl(void *vd, uint32_t idx, uint32_t cnt, uint32_t tot)
754
+{
755
+ int32_t *cur = ((int32_t *)vd + H4(idx));
756
+ vext_clear(cur, cnt, tot);
757
+}
758
+
759
+static void clearq(void *vd, uint32_t idx, uint32_t cnt, uint32_t tot)
760
+{
761
+ int64_t *cur = (int64_t *)vd + idx;
762
+ vext_clear(cur, cnt, tot);
763
+}
764
+
765
+
766
+static inline int vext_elem_mask(void *v0, int mlen, int index)
767
+{
768
+ int idx = (index * mlen) / 64;
769
+ int pos = (index * mlen) % 64;
770
+ return (((uint64_t *)v0)[idx] >> pos) & 1;
771
+}
772
+
773
+/* elements operations for load and store */
774
+typedef void vext_ldst_elem_fn(CPURISCVState *env, target_ulong addr,
775
+ uint32_t idx, void *vd, uintptr_t retaddr);
776
+typedef void clear_fn(void *vd, uint32_t idx, uint32_t cnt, uint32_t tot);
777
+
778
+#define GEN_VEXT_LD_ELEM(NAME, MTYPE, ETYPE, H, LDSUF) \
779
+static void NAME(CPURISCVState *env, abi_ptr addr, \
780
+ uint32_t idx, void *vd, uintptr_t retaddr)\
781
+{ \
782
+ MTYPE data; \
783
+ ETYPE *cur = ((ETYPE *)vd + H(idx)); \
784
+ data = cpu_##LDSUF##_data_ra(env, addr, retaddr); \
785
+ *cur = data; \
786
+} \
787
+
788
+GEN_VEXT_LD_ELEM(ldb_b, int8_t, int8_t, H1, ldsb)
789
+GEN_VEXT_LD_ELEM(ldb_h, int8_t, int16_t, H2, ldsb)
790
+GEN_VEXT_LD_ELEM(ldb_w, int8_t, int32_t, H4, ldsb)
791
+GEN_VEXT_LD_ELEM(ldb_d, int8_t, int64_t, H8, ldsb)
792
+GEN_VEXT_LD_ELEM(ldh_h, int16_t, int16_t, H2, ldsw)
793
+GEN_VEXT_LD_ELEM(ldh_w, int16_t, int32_t, H4, ldsw)
794
+GEN_VEXT_LD_ELEM(ldh_d, int16_t, int64_t, H8, ldsw)
795
+GEN_VEXT_LD_ELEM(ldw_w, int32_t, int32_t, H4, ldl)
796
+GEN_VEXT_LD_ELEM(ldw_d, int32_t, int64_t, H8, ldl)
797
+GEN_VEXT_LD_ELEM(lde_b, int8_t, int8_t, H1, ldsb)
798
+GEN_VEXT_LD_ELEM(lde_h, int16_t, int16_t, H2, ldsw)
799
+GEN_VEXT_LD_ELEM(lde_w, int32_t, int32_t, H4, ldl)
800
+GEN_VEXT_LD_ELEM(lde_d, int64_t, int64_t, H8, ldq)
801
+GEN_VEXT_LD_ELEM(ldbu_b, uint8_t, uint8_t, H1, ldub)
802
+GEN_VEXT_LD_ELEM(ldbu_h, uint8_t, uint16_t, H2, ldub)
803
+GEN_VEXT_LD_ELEM(ldbu_w, uint8_t, uint32_t, H4, ldub)
804
+GEN_VEXT_LD_ELEM(ldbu_d, uint8_t, uint64_t, H8, ldub)
805
+GEN_VEXT_LD_ELEM(ldhu_h, uint16_t, uint16_t, H2, lduw)
806
+GEN_VEXT_LD_ELEM(ldhu_w, uint16_t, uint32_t, H4, lduw)
807
+GEN_VEXT_LD_ELEM(ldhu_d, uint16_t, uint64_t, H8, lduw)
808
+GEN_VEXT_LD_ELEM(ldwu_w, uint32_t, uint32_t, H4, ldl)
809
+GEN_VEXT_LD_ELEM(ldwu_d, uint32_t, uint64_t, H8, ldl)
810
+
811
+#define GEN_VEXT_ST_ELEM(NAME, ETYPE, H, STSUF) \
812
+static void NAME(CPURISCVState *env, abi_ptr addr, \
813
+ uint32_t idx, void *vd, uintptr_t retaddr)\
814
+{ \
815
+ ETYPE data = *((ETYPE *)vd + H(idx)); \
816
+ cpu_##STSUF##_data_ra(env, addr, data, retaddr); \
817
+}
818
+
819
+GEN_VEXT_ST_ELEM(stb_b, int8_t, H1, stb)
820
+GEN_VEXT_ST_ELEM(stb_h, int16_t, H2, stb)
821
+GEN_VEXT_ST_ELEM(stb_w, int32_t, H4, stb)
822
+GEN_VEXT_ST_ELEM(stb_d, int64_t, H8, stb)
823
+GEN_VEXT_ST_ELEM(sth_h, int16_t, H2, stw)
824
+GEN_VEXT_ST_ELEM(sth_w, int32_t, H4, stw)
825
+GEN_VEXT_ST_ELEM(sth_d, int64_t, H8, stw)
826
+GEN_VEXT_ST_ELEM(stw_w, int32_t, H4, stl)
827
+GEN_VEXT_ST_ELEM(stw_d, int64_t, H8, stl)
828
+GEN_VEXT_ST_ELEM(ste_b, int8_t, H1, stb)
829
+GEN_VEXT_ST_ELEM(ste_h, int16_t, H2, stw)
830
+GEN_VEXT_ST_ELEM(ste_w, int32_t, H4, stl)
831
+GEN_VEXT_ST_ELEM(ste_d, int64_t, H8, stq)
832
+
833
+/*
834
+ *** stride: access vector element from strided memory
835
+ */
836
+static void
837
+vext_ldst_stride(void *vd, void *v0, target_ulong base,
838
+ target_ulong stride, CPURISCVState *env,
839
+ uint32_t desc, uint32_t vm,
840
+ vext_ldst_elem_fn *ldst_elem, clear_fn *clear_elem,
841
+ uint32_t esz, uint32_t msz, uintptr_t ra,
842
+ MMUAccessType access_type)
843
+{
844
+ uint32_t i, k;
845
+ uint32_t nf = vext_nf(desc);
846
+ uint32_t mlen = vext_mlen(desc);
847
+ uint32_t vlmax = vext_maxsz(desc) / esz;
848
+
849
+ /* probe every access*/
850
+ for (i = 0; i < env->vl; i++) {
851
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
852
+ continue;
853
+ }
854
+ probe_pages(env, base + stride * i, nf * msz, ra, access_type);
855
+ }
856
+ /* do real access */
857
+ for (i = 0; i < env->vl; i++) {
858
+ k = 0;
859
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
860
+ continue;
861
+ }
862
+ while (k < nf) {
863
+ target_ulong addr = base + stride * i + k * msz;
864
+ ldst_elem(env, addr, i + k * vlmax, vd, ra);
865
+ k++;
866
+ }
867
+ }
868
+ /* clear tail elements */
869
+ if (clear_elem) {
870
+ for (k = 0; k < nf; k++) {
871
+ clear_elem(vd, env->vl + k * vlmax, env->vl * esz, vlmax * esz);
872
+ }
873
+ }
874
+}
875
+
876
+#define GEN_VEXT_LD_STRIDE(NAME, MTYPE, ETYPE, LOAD_FN, CLEAR_FN) \
877
+void HELPER(NAME)(void *vd, void * v0, target_ulong base, \
878
+ target_ulong stride, CPURISCVState *env, \
879
+ uint32_t desc) \
880
+{ \
881
+ uint32_t vm = vext_vm(desc); \
882
+ vext_ldst_stride(vd, v0, base, stride, env, desc, vm, LOAD_FN, \
883
+ CLEAR_FN, sizeof(ETYPE), sizeof(MTYPE), \
884
+ GETPC(), MMU_DATA_LOAD); \
885
+}
886
+
887
+GEN_VEXT_LD_STRIDE(vlsb_v_b, int8_t, int8_t, ldb_b, clearb)
888
+GEN_VEXT_LD_STRIDE(vlsb_v_h, int8_t, int16_t, ldb_h, clearh)
889
+GEN_VEXT_LD_STRIDE(vlsb_v_w, int8_t, int32_t, ldb_w, clearl)
890
+GEN_VEXT_LD_STRIDE(vlsb_v_d, int8_t, int64_t, ldb_d, clearq)
891
+GEN_VEXT_LD_STRIDE(vlsh_v_h, int16_t, int16_t, ldh_h, clearh)
892
+GEN_VEXT_LD_STRIDE(vlsh_v_w, int16_t, int32_t, ldh_w, clearl)
893
+GEN_VEXT_LD_STRIDE(vlsh_v_d, int16_t, int64_t, ldh_d, clearq)
894
+GEN_VEXT_LD_STRIDE(vlsw_v_w, int32_t, int32_t, ldw_w, clearl)
895
+GEN_VEXT_LD_STRIDE(vlsw_v_d, int32_t, int64_t, ldw_d, clearq)
896
+GEN_VEXT_LD_STRIDE(vlse_v_b, int8_t, int8_t, lde_b, clearb)
897
+GEN_VEXT_LD_STRIDE(vlse_v_h, int16_t, int16_t, lde_h, clearh)
898
+GEN_VEXT_LD_STRIDE(vlse_v_w, int32_t, int32_t, lde_w, clearl)
899
+GEN_VEXT_LD_STRIDE(vlse_v_d, int64_t, int64_t, lde_d, clearq)
900
+GEN_VEXT_LD_STRIDE(vlsbu_v_b, uint8_t, uint8_t, ldbu_b, clearb)
901
+GEN_VEXT_LD_STRIDE(vlsbu_v_h, uint8_t, uint16_t, ldbu_h, clearh)
902
+GEN_VEXT_LD_STRIDE(vlsbu_v_w, uint8_t, uint32_t, ldbu_w, clearl)
903
+GEN_VEXT_LD_STRIDE(vlsbu_v_d, uint8_t, uint64_t, ldbu_d, clearq)
904
+GEN_VEXT_LD_STRIDE(vlshu_v_h, uint16_t, uint16_t, ldhu_h, clearh)
905
+GEN_VEXT_LD_STRIDE(vlshu_v_w, uint16_t, uint32_t, ldhu_w, clearl)
906
+GEN_VEXT_LD_STRIDE(vlshu_v_d, uint16_t, uint64_t, ldhu_d, clearq)
907
+GEN_VEXT_LD_STRIDE(vlswu_v_w, uint32_t, uint32_t, ldwu_w, clearl)
908
+GEN_VEXT_LD_STRIDE(vlswu_v_d, uint32_t, uint64_t, ldwu_d, clearq)
909
+
910
+#define GEN_VEXT_ST_STRIDE(NAME, MTYPE, ETYPE, STORE_FN) \
911
+void HELPER(NAME)(void *vd, void *v0, target_ulong base, \
912
+ target_ulong stride, CPURISCVState *env, \
913
+ uint32_t desc) \
914
+{ \
915
+ uint32_t vm = vext_vm(desc); \
916
+ vext_ldst_stride(vd, v0, base, stride, env, desc, vm, STORE_FN, \
917
+ NULL, sizeof(ETYPE), sizeof(MTYPE), \
918
+ GETPC(), MMU_DATA_STORE); \
919
+}
920
+
921
+GEN_VEXT_ST_STRIDE(vssb_v_b, int8_t, int8_t, stb_b)
922
+GEN_VEXT_ST_STRIDE(vssb_v_h, int8_t, int16_t, stb_h)
923
+GEN_VEXT_ST_STRIDE(vssb_v_w, int8_t, int32_t, stb_w)
924
+GEN_VEXT_ST_STRIDE(vssb_v_d, int8_t, int64_t, stb_d)
925
+GEN_VEXT_ST_STRIDE(vssh_v_h, int16_t, int16_t, sth_h)
926
+GEN_VEXT_ST_STRIDE(vssh_v_w, int16_t, int32_t, sth_w)
927
+GEN_VEXT_ST_STRIDE(vssh_v_d, int16_t, int64_t, sth_d)
928
+GEN_VEXT_ST_STRIDE(vssw_v_w, int32_t, int32_t, stw_w)
929
+GEN_VEXT_ST_STRIDE(vssw_v_d, int32_t, int64_t, stw_d)
930
+GEN_VEXT_ST_STRIDE(vsse_v_b, int8_t, int8_t, ste_b)
931
+GEN_VEXT_ST_STRIDE(vsse_v_h, int16_t, int16_t, ste_h)
932
+GEN_VEXT_ST_STRIDE(vsse_v_w, int32_t, int32_t, ste_w)
933
+GEN_VEXT_ST_STRIDE(vsse_v_d, int64_t, int64_t, ste_d)
934
+
935
+/*
936
+ *** unit-stride: access elements stored contiguously in memory
937
+ */
938
+
939
+/* unmasked unit-stride load and store operation*/
940
+static void
941
+vext_ldst_us(void *vd, target_ulong base, CPURISCVState *env, uint32_t desc,
942
+ vext_ldst_elem_fn *ldst_elem, clear_fn *clear_elem,
943
+ uint32_t esz, uint32_t msz, uintptr_t ra,
944
+ MMUAccessType access_type)
945
+{
946
+ uint32_t i, k;
947
+ uint32_t nf = vext_nf(desc);
948
+ uint32_t vlmax = vext_maxsz(desc) / esz;
949
+
950
+ /* probe every access */
951
+ probe_pages(env, base, env->vl * nf * msz, ra, access_type);
952
+ /* load bytes from guest memory */
953
+ for (i = 0; i < env->vl; i++) {
954
+ k = 0;
955
+ while (k < nf) {
956
+ target_ulong addr = base + (i * nf + k) * msz;
957
+ ldst_elem(env, addr, i + k * vlmax, vd, ra);
958
+ k++;
959
+ }
960
+ }
961
+ /* clear tail elements */
962
+ if (clear_elem) {
963
+ for (k = 0; k < nf; k++) {
964
+ clear_elem(vd, env->vl + k * vlmax, env->vl * esz, vlmax * esz);
965
+ }
966
+ }
967
+}
968
+
969
+/*
970
+ * masked unit-stride load and store operation will be a special case of stride,
971
+ * stride = NF * sizeof (MTYPE)
972
+ */
973
+
974
+#define GEN_VEXT_LD_US(NAME, MTYPE, ETYPE, LOAD_FN, CLEAR_FN) \
975
+void HELPER(NAME##_mask)(void *vd, void *v0, target_ulong base, \
976
+ CPURISCVState *env, uint32_t desc) \
977
+{ \
978
+ uint32_t stride = vext_nf(desc) * sizeof(MTYPE); \
979
+ vext_ldst_stride(vd, v0, base, stride, env, desc, false, LOAD_FN, \
980
+ CLEAR_FN, sizeof(ETYPE), sizeof(MTYPE), \
981
+ GETPC(), MMU_DATA_LOAD); \
982
+} \
983
+ \
984
+void HELPER(NAME)(void *vd, void *v0, target_ulong base, \
985
+ CPURISCVState *env, uint32_t desc) \
986
+{ \
987
+ vext_ldst_us(vd, base, env, desc, LOAD_FN, CLEAR_FN, \
988
+ sizeof(ETYPE), sizeof(MTYPE), GETPC(), MMU_DATA_LOAD); \
989
+}
990
+
991
+GEN_VEXT_LD_US(vlb_v_b, int8_t, int8_t, ldb_b, clearb)
992
+GEN_VEXT_LD_US(vlb_v_h, int8_t, int16_t, ldb_h, clearh)
993
+GEN_VEXT_LD_US(vlb_v_w, int8_t, int32_t, ldb_w, clearl)
994
+GEN_VEXT_LD_US(vlb_v_d, int8_t, int64_t, ldb_d, clearq)
995
+GEN_VEXT_LD_US(vlh_v_h, int16_t, int16_t, ldh_h, clearh)
996
+GEN_VEXT_LD_US(vlh_v_w, int16_t, int32_t, ldh_w, clearl)
997
+GEN_VEXT_LD_US(vlh_v_d, int16_t, int64_t, ldh_d, clearq)
998
+GEN_VEXT_LD_US(vlw_v_w, int32_t, int32_t, ldw_w, clearl)
999
+GEN_VEXT_LD_US(vlw_v_d, int32_t, int64_t, ldw_d, clearq)
1000
+GEN_VEXT_LD_US(vle_v_b, int8_t, int8_t, lde_b, clearb)
1001
+GEN_VEXT_LD_US(vle_v_h, int16_t, int16_t, lde_h, clearh)
1002
+GEN_VEXT_LD_US(vle_v_w, int32_t, int32_t, lde_w, clearl)
1003
+GEN_VEXT_LD_US(vle_v_d, int64_t, int64_t, lde_d, clearq)
1004
+GEN_VEXT_LD_US(vlbu_v_b, uint8_t, uint8_t, ldbu_b, clearb)
1005
+GEN_VEXT_LD_US(vlbu_v_h, uint8_t, uint16_t, ldbu_h, clearh)
1006
+GEN_VEXT_LD_US(vlbu_v_w, uint8_t, uint32_t, ldbu_w, clearl)
1007
+GEN_VEXT_LD_US(vlbu_v_d, uint8_t, uint64_t, ldbu_d, clearq)
1008
+GEN_VEXT_LD_US(vlhu_v_h, uint16_t, uint16_t, ldhu_h, clearh)
1009
+GEN_VEXT_LD_US(vlhu_v_w, uint16_t, uint32_t, ldhu_w, clearl)
1010
+GEN_VEXT_LD_US(vlhu_v_d, uint16_t, uint64_t, ldhu_d, clearq)
1011
+GEN_VEXT_LD_US(vlwu_v_w, uint32_t, uint32_t, ldwu_w, clearl)
1012
+GEN_VEXT_LD_US(vlwu_v_d, uint32_t, uint64_t, ldwu_d, clearq)
1013
+
1014
+#define GEN_VEXT_ST_US(NAME, MTYPE, ETYPE, STORE_FN) \
1015
+void HELPER(NAME##_mask)(void *vd, void *v0, target_ulong base, \
1016
+ CPURISCVState *env, uint32_t desc) \
1017
+{ \
1018
+ uint32_t stride = vext_nf(desc) * sizeof(MTYPE); \
1019
+ vext_ldst_stride(vd, v0, base, stride, env, desc, false, STORE_FN, \
1020
+ NULL, sizeof(ETYPE), sizeof(MTYPE), \
1021
+ GETPC(), MMU_DATA_STORE); \
1022
+} \
1023
+ \
1024
+void HELPER(NAME)(void *vd, void *v0, target_ulong base, \
1025
+ CPURISCVState *env, uint32_t desc) \
1026
+{ \
1027
+ vext_ldst_us(vd, base, env, desc, STORE_FN, NULL, \
1028
+ sizeof(ETYPE), sizeof(MTYPE), GETPC(), MMU_DATA_STORE);\
1029
+}
1030
+
1031
+GEN_VEXT_ST_US(vsb_v_b, int8_t, int8_t , stb_b)
1032
+GEN_VEXT_ST_US(vsb_v_h, int8_t, int16_t, stb_h)
1033
+GEN_VEXT_ST_US(vsb_v_w, int8_t, int32_t, stb_w)
1034
+GEN_VEXT_ST_US(vsb_v_d, int8_t, int64_t, stb_d)
1035
+GEN_VEXT_ST_US(vsh_v_h, int16_t, int16_t, sth_h)
1036
+GEN_VEXT_ST_US(vsh_v_w, int16_t, int32_t, sth_w)
1037
+GEN_VEXT_ST_US(vsh_v_d, int16_t, int64_t, sth_d)
1038
+GEN_VEXT_ST_US(vsw_v_w, int32_t, int32_t, stw_w)
1039
+GEN_VEXT_ST_US(vsw_v_d, int32_t, int64_t, stw_d)
1040
+GEN_VEXT_ST_US(vse_v_b, int8_t, int8_t , ste_b)
1041
+GEN_VEXT_ST_US(vse_v_h, int16_t, int16_t, ste_h)
1042
+GEN_VEXT_ST_US(vse_v_w, int32_t, int32_t, ste_w)
1043
+GEN_VEXT_ST_US(vse_v_d, int64_t, int64_t, ste_d)
147
--
1044
--
148
2.28.0
1045
2.27.0
149
1046
150
1047
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Vector indexed operations add the contents of each element of the
4
vector offset operand specified by vs2 to the base effective address
5
to give the effective address of each element.
6
7
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Message-Id: <20200701152549.1218-8-zhiwei_liu@c-sky.com>
11
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
12
---
13
target/riscv/helper.h | 35 +++++++
14
target/riscv/insn32.decode | 13 +++
15
target/riscv/insn_trans/trans_rvv.inc.c | 129 ++++++++++++++++++++++++
16
target/riscv/vector_helper.c | 116 +++++++++++++++++++++
17
4 files changed, 293 insertions(+)
18
19
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/target/riscv/helper.h
22
+++ b/target/riscv/helper.h
23
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vsse_v_b, void, ptr, ptr, tl, tl, env, i32)
24
DEF_HELPER_6(vsse_v_h, void, ptr, ptr, tl, tl, env, i32)
25
DEF_HELPER_6(vsse_v_w, void, ptr, ptr, tl, tl, env, i32)
26
DEF_HELPER_6(vsse_v_d, void, ptr, ptr, tl, tl, env, i32)
27
+DEF_HELPER_6(vlxb_v_b, void, ptr, ptr, tl, ptr, env, i32)
28
+DEF_HELPER_6(vlxb_v_h, void, ptr, ptr, tl, ptr, env, i32)
29
+DEF_HELPER_6(vlxb_v_w, void, ptr, ptr, tl, ptr, env, i32)
30
+DEF_HELPER_6(vlxb_v_d, void, ptr, ptr, tl, ptr, env, i32)
31
+DEF_HELPER_6(vlxh_v_h, void, ptr, ptr, tl, ptr, env, i32)
32
+DEF_HELPER_6(vlxh_v_w, void, ptr, ptr, tl, ptr, env, i32)
33
+DEF_HELPER_6(vlxh_v_d, void, ptr, ptr, tl, ptr, env, i32)
34
+DEF_HELPER_6(vlxw_v_w, void, ptr, ptr, tl, ptr, env, i32)
35
+DEF_HELPER_6(vlxw_v_d, void, ptr, ptr, tl, ptr, env, i32)
36
+DEF_HELPER_6(vlxe_v_b, void, ptr, ptr, tl, ptr, env, i32)
37
+DEF_HELPER_6(vlxe_v_h, void, ptr, ptr, tl, ptr, env, i32)
38
+DEF_HELPER_6(vlxe_v_w, void, ptr, ptr, tl, ptr, env, i32)
39
+DEF_HELPER_6(vlxe_v_d, void, ptr, ptr, tl, ptr, env, i32)
40
+DEF_HELPER_6(vlxbu_v_b, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vlxbu_v_h, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vlxbu_v_w, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vlxbu_v_d, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vlxhu_v_h, void, ptr, ptr, tl, ptr, env, i32)
45
+DEF_HELPER_6(vlxhu_v_w, void, ptr, ptr, tl, ptr, env, i32)
46
+DEF_HELPER_6(vlxhu_v_d, void, ptr, ptr, tl, ptr, env, i32)
47
+DEF_HELPER_6(vlxwu_v_w, void, ptr, ptr, tl, ptr, env, i32)
48
+DEF_HELPER_6(vlxwu_v_d, void, ptr, ptr, tl, ptr, env, i32)
49
+DEF_HELPER_6(vsxb_v_b, void, ptr, ptr, tl, ptr, env, i32)
50
+DEF_HELPER_6(vsxb_v_h, void, ptr, ptr, tl, ptr, env, i32)
51
+DEF_HELPER_6(vsxb_v_w, void, ptr, ptr, tl, ptr, env, i32)
52
+DEF_HELPER_6(vsxb_v_d, void, ptr, ptr, tl, ptr, env, i32)
53
+DEF_HELPER_6(vsxh_v_h, void, ptr, ptr, tl, ptr, env, i32)
54
+DEF_HELPER_6(vsxh_v_w, void, ptr, ptr, tl, ptr, env, i32)
55
+DEF_HELPER_6(vsxh_v_d, void, ptr, ptr, tl, ptr, env, i32)
56
+DEF_HELPER_6(vsxw_v_w, void, ptr, ptr, tl, ptr, env, i32)
57
+DEF_HELPER_6(vsxw_v_d, void, ptr, ptr, tl, ptr, env, i32)
58
+DEF_HELPER_6(vsxe_v_b, void, ptr, ptr, tl, ptr, env, i32)
59
+DEF_HELPER_6(vsxe_v_h, void, ptr, ptr, tl, ptr, env, i32)
60
+DEF_HELPER_6(vsxe_v_w, void, ptr, ptr, tl, ptr, env, i32)
61
+DEF_HELPER_6(vsxe_v_d, void, ptr, ptr, tl, ptr, env, i32)
62
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
63
index XXXXXXX..XXXXXXX 100644
64
--- a/target/riscv/insn32.decode
65
+++ b/target/riscv/insn32.decode
66
@@ -XXX,XX +XXX,XX @@ vssh_v ... 010 . ..... ..... 101 ..... 0100111 @r_nfvm
67
vssw_v ... 010 . ..... ..... 110 ..... 0100111 @r_nfvm
68
vsse_v ... 010 . ..... ..... 111 ..... 0100111 @r_nfvm
69
70
+vlxb_v ... 111 . ..... ..... 000 ..... 0000111 @r_nfvm
71
+vlxh_v ... 111 . ..... ..... 101 ..... 0000111 @r_nfvm
72
+vlxw_v ... 111 . ..... ..... 110 ..... 0000111 @r_nfvm
73
+vlxe_v ... 011 . ..... ..... 111 ..... 0000111 @r_nfvm
74
+vlxbu_v ... 011 . ..... ..... 000 ..... 0000111 @r_nfvm
75
+vlxhu_v ... 011 . ..... ..... 101 ..... 0000111 @r_nfvm
76
+vlxwu_v ... 011 . ..... ..... 110 ..... 0000111 @r_nfvm
77
+# Vector ordered-indexed and unordered-indexed store insns.
78
+vsxb_v ... -11 . ..... ..... 000 ..... 0100111 @r_nfvm
79
+vsxh_v ... -11 . ..... ..... 101 ..... 0100111 @r_nfvm
80
+vsxw_v ... -11 . ..... ..... 110 ..... 0100111 @r_nfvm
81
+vsxe_v ... -11 . ..... ..... 111 ..... 0100111 @r_nfvm
82
+
83
# *** new major opcode OP-V ***
84
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
85
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
86
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/target/riscv/insn_trans/trans_rvv.inc.c
89
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
90
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_TRANS(vssb_v, 0, rnfvm, st_stride_op, st_stride_check)
91
GEN_VEXT_TRANS(vssh_v, 1, rnfvm, st_stride_op, st_stride_check)
92
GEN_VEXT_TRANS(vssw_v, 2, rnfvm, st_stride_op, st_stride_check)
93
GEN_VEXT_TRANS(vsse_v, 3, rnfvm, st_stride_op, st_stride_check)
94
+
95
+/*
96
+ *** index load and store
97
+ */
98
+typedef void gen_helper_ldst_index(TCGv_ptr, TCGv_ptr, TCGv,
99
+ TCGv_ptr, TCGv_env, TCGv_i32);
100
+
101
+static bool ldst_index_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
102
+ uint32_t data, gen_helper_ldst_index *fn,
103
+ DisasContext *s)
104
+{
105
+ TCGv_ptr dest, mask, index;
106
+ TCGv base;
107
+ TCGv_i32 desc;
108
+
109
+ TCGLabel *over = gen_new_label();
110
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
111
+
112
+ dest = tcg_temp_new_ptr();
113
+ mask = tcg_temp_new_ptr();
114
+ index = tcg_temp_new_ptr();
115
+ base = tcg_temp_new();
116
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
117
+
118
+ gen_get_gpr(base, rs1);
119
+ tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
120
+ tcg_gen_addi_ptr(index, cpu_env, vreg_ofs(s, vs2));
121
+ tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
122
+
123
+ fn(dest, mask, base, index, cpu_env, desc);
124
+
125
+ tcg_temp_free_ptr(dest);
126
+ tcg_temp_free_ptr(mask);
127
+ tcg_temp_free_ptr(index);
128
+ tcg_temp_free(base);
129
+ tcg_temp_free_i32(desc);
130
+ gen_set_label(over);
131
+ return true;
132
+}
133
+
134
+static bool ld_index_op(DisasContext *s, arg_rnfvm *a, uint8_t seq)
135
+{
136
+ uint32_t data = 0;
137
+ gen_helper_ldst_index *fn;
138
+ static gen_helper_ldst_index * const fns[7][4] = {
139
+ { gen_helper_vlxb_v_b, gen_helper_vlxb_v_h,
140
+ gen_helper_vlxb_v_w, gen_helper_vlxb_v_d },
141
+ { NULL, gen_helper_vlxh_v_h,
142
+ gen_helper_vlxh_v_w, gen_helper_vlxh_v_d },
143
+ { NULL, NULL,
144
+ gen_helper_vlxw_v_w, gen_helper_vlxw_v_d },
145
+ { gen_helper_vlxe_v_b, gen_helper_vlxe_v_h,
146
+ gen_helper_vlxe_v_w, gen_helper_vlxe_v_d },
147
+ { gen_helper_vlxbu_v_b, gen_helper_vlxbu_v_h,
148
+ gen_helper_vlxbu_v_w, gen_helper_vlxbu_v_d },
149
+ { NULL, gen_helper_vlxhu_v_h,
150
+ gen_helper_vlxhu_v_w, gen_helper_vlxhu_v_d },
151
+ { NULL, NULL,
152
+ gen_helper_vlxwu_v_w, gen_helper_vlxwu_v_d },
153
+ };
154
+
155
+ fn = fns[seq][s->sew];
156
+ if (fn == NULL) {
157
+ return false;
158
+ }
159
+
160
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
161
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
162
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
163
+ data = FIELD_DP32(data, VDATA, NF, a->nf);
164
+ return ldst_index_trans(a->rd, a->rs1, a->rs2, data, fn, s);
165
+}
166
+
167
+static bool ld_index_check(DisasContext *s, arg_rnfvm* a)
168
+{
169
+ return (vext_check_isa_ill(s) &&
170
+ vext_check_overlap_mask(s, a->rd, a->vm, false) &&
171
+ vext_check_reg(s, a->rd, false) &&
172
+ vext_check_reg(s, a->rs2, false) &&
173
+ vext_check_nf(s, a->nf));
174
+}
175
+
176
+GEN_VEXT_TRANS(vlxb_v, 0, rnfvm, ld_index_op, ld_index_check)
177
+GEN_VEXT_TRANS(vlxh_v, 1, rnfvm, ld_index_op, ld_index_check)
178
+GEN_VEXT_TRANS(vlxw_v, 2, rnfvm, ld_index_op, ld_index_check)
179
+GEN_VEXT_TRANS(vlxe_v, 3, rnfvm, ld_index_op, ld_index_check)
180
+GEN_VEXT_TRANS(vlxbu_v, 4, rnfvm, ld_index_op, ld_index_check)
181
+GEN_VEXT_TRANS(vlxhu_v, 5, rnfvm, ld_index_op, ld_index_check)
182
+GEN_VEXT_TRANS(vlxwu_v, 6, rnfvm, ld_index_op, ld_index_check)
183
+
184
+static bool st_index_op(DisasContext *s, arg_rnfvm *a, uint8_t seq)
185
+{
186
+ uint32_t data = 0;
187
+ gen_helper_ldst_index *fn;
188
+ static gen_helper_ldst_index * const fns[4][4] = {
189
+ { gen_helper_vsxb_v_b, gen_helper_vsxb_v_h,
190
+ gen_helper_vsxb_v_w, gen_helper_vsxb_v_d },
191
+ { NULL, gen_helper_vsxh_v_h,
192
+ gen_helper_vsxh_v_w, gen_helper_vsxh_v_d },
193
+ { NULL, NULL,
194
+ gen_helper_vsxw_v_w, gen_helper_vsxw_v_d },
195
+ { gen_helper_vsxe_v_b, gen_helper_vsxe_v_h,
196
+ gen_helper_vsxe_v_w, gen_helper_vsxe_v_d }
197
+ };
198
+
199
+ fn = fns[seq][s->sew];
200
+ if (fn == NULL) {
201
+ return false;
202
+ }
203
+
204
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
205
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
206
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
207
+ data = FIELD_DP32(data, VDATA, NF, a->nf);
208
+ return ldst_index_trans(a->rd, a->rs1, a->rs2, data, fn, s);
209
+}
210
+
211
+static bool st_index_check(DisasContext *s, arg_rnfvm* a)
212
+{
213
+ return (vext_check_isa_ill(s) &&
214
+ vext_check_reg(s, a->rd, false) &&
215
+ vext_check_reg(s, a->rs2, false) &&
216
+ vext_check_nf(s, a->nf));
217
+}
218
+
219
+GEN_VEXT_TRANS(vsxb_v, 0, rnfvm, st_index_op, st_index_check)
220
+GEN_VEXT_TRANS(vsxh_v, 1, rnfvm, st_index_op, st_index_check)
221
+GEN_VEXT_TRANS(vsxw_v, 2, rnfvm, st_index_op, st_index_check)
222
+GEN_VEXT_TRANS(vsxe_v, 3, rnfvm, st_index_op, st_index_check)
223
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
224
index XXXXXXX..XXXXXXX 100644
225
--- a/target/riscv/vector_helper.c
226
+++ b/target/riscv/vector_helper.c
227
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_ST_US(vse_v_b, int8_t, int8_t , ste_b)
228
GEN_VEXT_ST_US(vse_v_h, int16_t, int16_t, ste_h)
229
GEN_VEXT_ST_US(vse_v_w, int32_t, int32_t, ste_w)
230
GEN_VEXT_ST_US(vse_v_d, int64_t, int64_t, ste_d)
231
+
232
+/*
233
+ *** index: access vector element from indexed memory
234
+ */
235
+typedef target_ulong vext_get_index_addr(target_ulong base,
236
+ uint32_t idx, void *vs2);
237
+
238
+#define GEN_VEXT_GET_INDEX_ADDR(NAME, ETYPE, H) \
239
+static target_ulong NAME(target_ulong base, \
240
+ uint32_t idx, void *vs2) \
241
+{ \
242
+ return (base + *((ETYPE *)vs2 + H(idx))); \
243
+}
244
+
245
+GEN_VEXT_GET_INDEX_ADDR(idx_b, int8_t, H1)
246
+GEN_VEXT_GET_INDEX_ADDR(idx_h, int16_t, H2)
247
+GEN_VEXT_GET_INDEX_ADDR(idx_w, int32_t, H4)
248
+GEN_VEXT_GET_INDEX_ADDR(idx_d, int64_t, H8)
249
+
250
+static inline void
251
+vext_ldst_index(void *vd, void *v0, target_ulong base,
252
+ void *vs2, CPURISCVState *env, uint32_t desc,
253
+ vext_get_index_addr get_index_addr,
254
+ vext_ldst_elem_fn *ldst_elem,
255
+ clear_fn *clear_elem,
256
+ uint32_t esz, uint32_t msz, uintptr_t ra,
257
+ MMUAccessType access_type)
258
+{
259
+ uint32_t i, k;
260
+ uint32_t nf = vext_nf(desc);
261
+ uint32_t vm = vext_vm(desc);
262
+ uint32_t mlen = vext_mlen(desc);
263
+ uint32_t vlmax = vext_maxsz(desc) / esz;
264
+
265
+ /* probe every access*/
266
+ for (i = 0; i < env->vl; i++) {
267
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
268
+ continue;
269
+ }
270
+ probe_pages(env, get_index_addr(base, i, vs2), nf * msz, ra,
271
+ access_type);
272
+ }
273
+ /* load bytes from guest memory */
274
+ for (i = 0; i < env->vl; i++) {
275
+ k = 0;
276
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
277
+ continue;
278
+ }
279
+ while (k < nf) {
280
+ abi_ptr addr = get_index_addr(base, i, vs2) + k * msz;
281
+ ldst_elem(env, addr, i + k * vlmax, vd, ra);
282
+ k++;
283
+ }
284
+ }
285
+ /* clear tail elements */
286
+ if (clear_elem) {
287
+ for (k = 0; k < nf; k++) {
288
+ clear_elem(vd, env->vl + k * vlmax, env->vl * esz, vlmax * esz);
289
+ }
290
+ }
291
+}
292
+
293
+#define GEN_VEXT_LD_INDEX(NAME, MTYPE, ETYPE, INDEX_FN, LOAD_FN, CLEAR_FN) \
294
+void HELPER(NAME)(void *vd, void *v0, target_ulong base, \
295
+ void *vs2, CPURISCVState *env, uint32_t desc) \
296
+{ \
297
+ vext_ldst_index(vd, v0, base, vs2, env, desc, INDEX_FN, \
298
+ LOAD_FN, CLEAR_FN, sizeof(ETYPE), sizeof(MTYPE), \
299
+ GETPC(), MMU_DATA_LOAD); \
300
+}
301
+
302
+GEN_VEXT_LD_INDEX(vlxb_v_b, int8_t, int8_t, idx_b, ldb_b, clearb)
303
+GEN_VEXT_LD_INDEX(vlxb_v_h, int8_t, int16_t, idx_h, ldb_h, clearh)
304
+GEN_VEXT_LD_INDEX(vlxb_v_w, int8_t, int32_t, idx_w, ldb_w, clearl)
305
+GEN_VEXT_LD_INDEX(vlxb_v_d, int8_t, int64_t, idx_d, ldb_d, clearq)
306
+GEN_VEXT_LD_INDEX(vlxh_v_h, int16_t, int16_t, idx_h, ldh_h, clearh)
307
+GEN_VEXT_LD_INDEX(vlxh_v_w, int16_t, int32_t, idx_w, ldh_w, clearl)
308
+GEN_VEXT_LD_INDEX(vlxh_v_d, int16_t, int64_t, idx_d, ldh_d, clearq)
309
+GEN_VEXT_LD_INDEX(vlxw_v_w, int32_t, int32_t, idx_w, ldw_w, clearl)
310
+GEN_VEXT_LD_INDEX(vlxw_v_d, int32_t, int64_t, idx_d, ldw_d, clearq)
311
+GEN_VEXT_LD_INDEX(vlxe_v_b, int8_t, int8_t, idx_b, lde_b, clearb)
312
+GEN_VEXT_LD_INDEX(vlxe_v_h, int16_t, int16_t, idx_h, lde_h, clearh)
313
+GEN_VEXT_LD_INDEX(vlxe_v_w, int32_t, int32_t, idx_w, lde_w, clearl)
314
+GEN_VEXT_LD_INDEX(vlxe_v_d, int64_t, int64_t, idx_d, lde_d, clearq)
315
+GEN_VEXT_LD_INDEX(vlxbu_v_b, uint8_t, uint8_t, idx_b, ldbu_b, clearb)
316
+GEN_VEXT_LD_INDEX(vlxbu_v_h, uint8_t, uint16_t, idx_h, ldbu_h, clearh)
317
+GEN_VEXT_LD_INDEX(vlxbu_v_w, uint8_t, uint32_t, idx_w, ldbu_w, clearl)
318
+GEN_VEXT_LD_INDEX(vlxbu_v_d, uint8_t, uint64_t, idx_d, ldbu_d, clearq)
319
+GEN_VEXT_LD_INDEX(vlxhu_v_h, uint16_t, uint16_t, idx_h, ldhu_h, clearh)
320
+GEN_VEXT_LD_INDEX(vlxhu_v_w, uint16_t, uint32_t, idx_w, ldhu_w, clearl)
321
+GEN_VEXT_LD_INDEX(vlxhu_v_d, uint16_t, uint64_t, idx_d, ldhu_d, clearq)
322
+GEN_VEXT_LD_INDEX(vlxwu_v_w, uint32_t, uint32_t, idx_w, ldwu_w, clearl)
323
+GEN_VEXT_LD_INDEX(vlxwu_v_d, uint32_t, uint64_t, idx_d, ldwu_d, clearq)
324
+
325
+#define GEN_VEXT_ST_INDEX(NAME, MTYPE, ETYPE, INDEX_FN, STORE_FN)\
326
+void HELPER(NAME)(void *vd, void *v0, target_ulong base, \
327
+ void *vs2, CPURISCVState *env, uint32_t desc) \
328
+{ \
329
+ vext_ldst_index(vd, v0, base, vs2, env, desc, INDEX_FN, \
330
+ STORE_FN, NULL, sizeof(ETYPE), sizeof(MTYPE),\
331
+ GETPC(), MMU_DATA_STORE); \
332
+}
333
+
334
+GEN_VEXT_ST_INDEX(vsxb_v_b, int8_t, int8_t, idx_b, stb_b)
335
+GEN_VEXT_ST_INDEX(vsxb_v_h, int8_t, int16_t, idx_h, stb_h)
336
+GEN_VEXT_ST_INDEX(vsxb_v_w, int8_t, int32_t, idx_w, stb_w)
337
+GEN_VEXT_ST_INDEX(vsxb_v_d, int8_t, int64_t, idx_d, stb_d)
338
+GEN_VEXT_ST_INDEX(vsxh_v_h, int16_t, int16_t, idx_h, sth_h)
339
+GEN_VEXT_ST_INDEX(vsxh_v_w, int16_t, int32_t, idx_w, sth_w)
340
+GEN_VEXT_ST_INDEX(vsxh_v_d, int16_t, int64_t, idx_d, sth_d)
341
+GEN_VEXT_ST_INDEX(vsxw_v_w, int32_t, int32_t, idx_w, stw_w)
342
+GEN_VEXT_ST_INDEX(vsxw_v_d, int32_t, int64_t, idx_d, stw_d)
343
+GEN_VEXT_ST_INDEX(vsxe_v_b, int8_t, int8_t, idx_b, ste_b)
344
+GEN_VEXT_ST_INDEX(vsxe_v_h, int16_t, int16_t, idx_h, ste_h)
345
+GEN_VEXT_ST_INDEX(vsxe_v_w, int32_t, int32_t, idx_w, ste_w)
346
+GEN_VEXT_ST_INDEX(vsxe_v_d, int64_t, int64_t, idx_d, ste_d)
347
--
348
2.27.0
349
350
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
The unit-stride fault-only-fault load instructions are used to
4
vectorize loops with data-dependent exit conditions(while loops).
5
These instructions execute as a regular load except that they
6
will only take a trap on element 0.
7
8
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-Id: <20200701152549.1218-9-zhiwei_liu@c-sky.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
14
target/riscv/helper.h | 22 +++++
15
target/riscv/insn32.decode | 7 ++
16
target/riscv/insn_trans/trans_rvv.inc.c | 73 ++++++++++++++++
17
target/riscv/vector_helper.c | 110 ++++++++++++++++++++++++
18
4 files changed, 212 insertions(+)
19
20
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
21
index XXXXXXX..XXXXXXX 100644
22
--- a/target/riscv/helper.h
23
+++ b/target/riscv/helper.h
24
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vsxe_v_b, void, ptr, ptr, tl, ptr, env, i32)
25
DEF_HELPER_6(vsxe_v_h, void, ptr, ptr, tl, ptr, env, i32)
26
DEF_HELPER_6(vsxe_v_w, void, ptr, ptr, tl, ptr, env, i32)
27
DEF_HELPER_6(vsxe_v_d, void, ptr, ptr, tl, ptr, env, i32)
28
+DEF_HELPER_5(vlbff_v_b, void, ptr, ptr, tl, env, i32)
29
+DEF_HELPER_5(vlbff_v_h, void, ptr, ptr, tl, env, i32)
30
+DEF_HELPER_5(vlbff_v_w, void, ptr, ptr, tl, env, i32)
31
+DEF_HELPER_5(vlbff_v_d, void, ptr, ptr, tl, env, i32)
32
+DEF_HELPER_5(vlhff_v_h, void, ptr, ptr, tl, env, i32)
33
+DEF_HELPER_5(vlhff_v_w, void, ptr, ptr, tl, env, i32)
34
+DEF_HELPER_5(vlhff_v_d, void, ptr, ptr, tl, env, i32)
35
+DEF_HELPER_5(vlwff_v_w, void, ptr, ptr, tl, env, i32)
36
+DEF_HELPER_5(vlwff_v_d, void, ptr, ptr, tl, env, i32)
37
+DEF_HELPER_5(vleff_v_b, void, ptr, ptr, tl, env, i32)
38
+DEF_HELPER_5(vleff_v_h, void, ptr, ptr, tl, env, i32)
39
+DEF_HELPER_5(vleff_v_w, void, ptr, ptr, tl, env, i32)
40
+DEF_HELPER_5(vleff_v_d, void, ptr, ptr, tl, env, i32)
41
+DEF_HELPER_5(vlbuff_v_b, void, ptr, ptr, tl, env, i32)
42
+DEF_HELPER_5(vlbuff_v_h, void, ptr, ptr, tl, env, i32)
43
+DEF_HELPER_5(vlbuff_v_w, void, ptr, ptr, tl, env, i32)
44
+DEF_HELPER_5(vlbuff_v_d, void, ptr, ptr, tl, env, i32)
45
+DEF_HELPER_5(vlhuff_v_h, void, ptr, ptr, tl, env, i32)
46
+DEF_HELPER_5(vlhuff_v_w, void, ptr, ptr, tl, env, i32)
47
+DEF_HELPER_5(vlhuff_v_d, void, ptr, ptr, tl, env, i32)
48
+DEF_HELPER_5(vlwuff_v_w, void, ptr, ptr, tl, env, i32)
49
+DEF_HELPER_5(vlwuff_v_d, void, ptr, ptr, tl, env, i32)
50
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
51
index XXXXXXX..XXXXXXX 100644
52
--- a/target/riscv/insn32.decode
53
+++ b/target/riscv/insn32.decode
54
@@ -XXX,XX +XXX,XX @@ vle_v ... 000 . 00000 ..... 111 ..... 0000111 @r2_nfvm
55
vlbu_v ... 000 . 00000 ..... 000 ..... 0000111 @r2_nfvm
56
vlhu_v ... 000 . 00000 ..... 101 ..... 0000111 @r2_nfvm
57
vlwu_v ... 000 . 00000 ..... 110 ..... 0000111 @r2_nfvm
58
+vlbff_v ... 100 . 10000 ..... 000 ..... 0000111 @r2_nfvm
59
+vlhff_v ... 100 . 10000 ..... 101 ..... 0000111 @r2_nfvm
60
+vlwff_v ... 100 . 10000 ..... 110 ..... 0000111 @r2_nfvm
61
+vleff_v ... 000 . 10000 ..... 111 ..... 0000111 @r2_nfvm
62
+vlbuff_v ... 000 . 10000 ..... 000 ..... 0000111 @r2_nfvm
63
+vlhuff_v ... 000 . 10000 ..... 101 ..... 0000111 @r2_nfvm
64
+vlwuff_v ... 000 . 10000 ..... 110 ..... 0000111 @r2_nfvm
65
vsb_v ... 000 . 00000 ..... 000 ..... 0100111 @r2_nfvm
66
vsh_v ... 000 . 00000 ..... 101 ..... 0100111 @r2_nfvm
67
vsw_v ... 000 . 00000 ..... 110 ..... 0100111 @r2_nfvm
68
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/target/riscv/insn_trans/trans_rvv.inc.c
71
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
72
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_TRANS(vsxb_v, 0, rnfvm, st_index_op, st_index_check)
73
GEN_VEXT_TRANS(vsxh_v, 1, rnfvm, st_index_op, st_index_check)
74
GEN_VEXT_TRANS(vsxw_v, 2, rnfvm, st_index_op, st_index_check)
75
GEN_VEXT_TRANS(vsxe_v, 3, rnfvm, st_index_op, st_index_check)
76
+
77
+/*
78
+ *** unit stride fault-only-first load
79
+ */
80
+static bool ldff_trans(uint32_t vd, uint32_t rs1, uint32_t data,
81
+ gen_helper_ldst_us *fn, DisasContext *s)
82
+{
83
+ TCGv_ptr dest, mask;
84
+ TCGv base;
85
+ TCGv_i32 desc;
86
+
87
+ TCGLabel *over = gen_new_label();
88
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
89
+
90
+ dest = tcg_temp_new_ptr();
91
+ mask = tcg_temp_new_ptr();
92
+ base = tcg_temp_new();
93
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
94
+
95
+ gen_get_gpr(base, rs1);
96
+ tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
97
+ tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
98
+
99
+ fn(dest, mask, base, cpu_env, desc);
100
+
101
+ tcg_temp_free_ptr(dest);
102
+ tcg_temp_free_ptr(mask);
103
+ tcg_temp_free(base);
104
+ tcg_temp_free_i32(desc);
105
+ gen_set_label(over);
106
+ return true;
107
+}
108
+
109
+static bool ldff_op(DisasContext *s, arg_r2nfvm *a, uint8_t seq)
110
+{
111
+ uint32_t data = 0;
112
+ gen_helper_ldst_us *fn;
113
+ static gen_helper_ldst_us * const fns[7][4] = {
114
+ { gen_helper_vlbff_v_b, gen_helper_vlbff_v_h,
115
+ gen_helper_vlbff_v_w, gen_helper_vlbff_v_d },
116
+ { NULL, gen_helper_vlhff_v_h,
117
+ gen_helper_vlhff_v_w, gen_helper_vlhff_v_d },
118
+ { NULL, NULL,
119
+ gen_helper_vlwff_v_w, gen_helper_vlwff_v_d },
120
+ { gen_helper_vleff_v_b, gen_helper_vleff_v_h,
121
+ gen_helper_vleff_v_w, gen_helper_vleff_v_d },
122
+ { gen_helper_vlbuff_v_b, gen_helper_vlbuff_v_h,
123
+ gen_helper_vlbuff_v_w, gen_helper_vlbuff_v_d },
124
+ { NULL, gen_helper_vlhuff_v_h,
125
+ gen_helper_vlhuff_v_w, gen_helper_vlhuff_v_d },
126
+ { NULL, NULL,
127
+ gen_helper_vlwuff_v_w, gen_helper_vlwuff_v_d }
128
+ };
129
+
130
+ fn = fns[seq][s->sew];
131
+ if (fn == NULL) {
132
+ return false;
133
+ }
134
+
135
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
136
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
137
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
138
+ data = FIELD_DP32(data, VDATA, NF, a->nf);
139
+ return ldff_trans(a->rd, a->rs1, data, fn, s);
140
+}
141
+
142
+GEN_VEXT_TRANS(vlbff_v, 0, r2nfvm, ldff_op, ld_us_check)
143
+GEN_VEXT_TRANS(vlhff_v, 1, r2nfvm, ldff_op, ld_us_check)
144
+GEN_VEXT_TRANS(vlwff_v, 2, r2nfvm, ldff_op, ld_us_check)
145
+GEN_VEXT_TRANS(vleff_v, 3, r2nfvm, ldff_op, ld_us_check)
146
+GEN_VEXT_TRANS(vlbuff_v, 4, r2nfvm, ldff_op, ld_us_check)
147
+GEN_VEXT_TRANS(vlhuff_v, 5, r2nfvm, ldff_op, ld_us_check)
148
+GEN_VEXT_TRANS(vlwuff_v, 6, r2nfvm, ldff_op, ld_us_check)
149
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
150
index XXXXXXX..XXXXXXX 100644
151
--- a/target/riscv/vector_helper.c
152
+++ b/target/riscv/vector_helper.c
153
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_ST_INDEX(vsxe_v_b, int8_t, int8_t, idx_b, ste_b)
154
GEN_VEXT_ST_INDEX(vsxe_v_h, int16_t, int16_t, idx_h, ste_h)
155
GEN_VEXT_ST_INDEX(vsxe_v_w, int32_t, int32_t, idx_w, ste_w)
156
GEN_VEXT_ST_INDEX(vsxe_v_d, int64_t, int64_t, idx_d, ste_d)
157
+
158
+/*
159
+ *** unit-stride fault-only-fisrt load instructions
160
+ */
161
+static inline void
162
+vext_ldff(void *vd, void *v0, target_ulong base,
163
+ CPURISCVState *env, uint32_t desc,
164
+ vext_ldst_elem_fn *ldst_elem,
165
+ clear_fn *clear_elem,
166
+ uint32_t esz, uint32_t msz, uintptr_t ra)
167
+{
168
+ void *host;
169
+ uint32_t i, k, vl = 0;
170
+ uint32_t mlen = vext_mlen(desc);
171
+ uint32_t nf = vext_nf(desc);
172
+ uint32_t vm = vext_vm(desc);
173
+ uint32_t vlmax = vext_maxsz(desc) / esz;
174
+ target_ulong addr, offset, remain;
175
+
176
+ /* probe every access*/
177
+ for (i = 0; i < env->vl; i++) {
178
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
179
+ continue;
180
+ }
181
+ addr = base + nf * i * msz;
182
+ if (i == 0) {
183
+ probe_pages(env, addr, nf * msz, ra, MMU_DATA_LOAD);
184
+ } else {
185
+ /* if it triggers an exception, no need to check watchpoint */
186
+ remain = nf * msz;
187
+ while (remain > 0) {
188
+ offset = -(addr | TARGET_PAGE_MASK);
189
+ host = tlb_vaddr_to_host(env, addr, MMU_DATA_LOAD,
190
+ cpu_mmu_index(env, false));
191
+ if (host) {
192
+#ifdef CONFIG_USER_ONLY
193
+ if (page_check_range(addr, nf * msz, PAGE_READ) < 0) {
194
+ vl = i;
195
+ goto ProbeSuccess;
196
+ }
197
+#else
198
+ probe_pages(env, addr, nf * msz, ra, MMU_DATA_LOAD);
199
+#endif
200
+ } else {
201
+ vl = i;
202
+ goto ProbeSuccess;
203
+ }
204
+ if (remain <= offset) {
205
+ break;
206
+ }
207
+ remain -= offset;
208
+ addr += offset;
209
+ }
210
+ }
211
+ }
212
+ProbeSuccess:
213
+ /* load bytes from guest memory */
214
+ if (vl != 0) {
215
+ env->vl = vl;
216
+ }
217
+ for (i = 0; i < env->vl; i++) {
218
+ k = 0;
219
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
220
+ continue;
221
+ }
222
+ while (k < nf) {
223
+ target_ulong addr = base + (i * nf + k) * msz;
224
+ ldst_elem(env, addr, i + k * vlmax, vd, ra);
225
+ k++;
226
+ }
227
+ }
228
+ /* clear tail elements */
229
+ if (vl != 0) {
230
+ return;
231
+ }
232
+ for (k = 0; k < nf; k++) {
233
+ clear_elem(vd, env->vl + k * vlmax, env->vl * esz, vlmax * esz);
234
+ }
235
+}
236
+
237
+#define GEN_VEXT_LDFF(NAME, MTYPE, ETYPE, LOAD_FN, CLEAR_FN) \
238
+void HELPER(NAME)(void *vd, void *v0, target_ulong base, \
239
+ CPURISCVState *env, uint32_t desc) \
240
+{ \
241
+ vext_ldff(vd, v0, base, env, desc, LOAD_FN, CLEAR_FN, \
242
+ sizeof(ETYPE), sizeof(MTYPE), GETPC()); \
243
+}
244
+
245
+GEN_VEXT_LDFF(vlbff_v_b, int8_t, int8_t, ldb_b, clearb)
246
+GEN_VEXT_LDFF(vlbff_v_h, int8_t, int16_t, ldb_h, clearh)
247
+GEN_VEXT_LDFF(vlbff_v_w, int8_t, int32_t, ldb_w, clearl)
248
+GEN_VEXT_LDFF(vlbff_v_d, int8_t, int64_t, ldb_d, clearq)
249
+GEN_VEXT_LDFF(vlhff_v_h, int16_t, int16_t, ldh_h, clearh)
250
+GEN_VEXT_LDFF(vlhff_v_w, int16_t, int32_t, ldh_w, clearl)
251
+GEN_VEXT_LDFF(vlhff_v_d, int16_t, int64_t, ldh_d, clearq)
252
+GEN_VEXT_LDFF(vlwff_v_w, int32_t, int32_t, ldw_w, clearl)
253
+GEN_VEXT_LDFF(vlwff_v_d, int32_t, int64_t, ldw_d, clearq)
254
+GEN_VEXT_LDFF(vleff_v_b, int8_t, int8_t, lde_b, clearb)
255
+GEN_VEXT_LDFF(vleff_v_h, int16_t, int16_t, lde_h, clearh)
256
+GEN_VEXT_LDFF(vleff_v_w, int32_t, int32_t, lde_w, clearl)
257
+GEN_VEXT_LDFF(vleff_v_d, int64_t, int64_t, lde_d, clearq)
258
+GEN_VEXT_LDFF(vlbuff_v_b, uint8_t, uint8_t, ldbu_b, clearb)
259
+GEN_VEXT_LDFF(vlbuff_v_h, uint8_t, uint16_t, ldbu_h, clearh)
260
+GEN_VEXT_LDFF(vlbuff_v_w, uint8_t, uint32_t, ldbu_w, clearl)
261
+GEN_VEXT_LDFF(vlbuff_v_d, uint8_t, uint64_t, ldbu_d, clearq)
262
+GEN_VEXT_LDFF(vlhuff_v_h, uint16_t, uint16_t, ldhu_h, clearh)
263
+GEN_VEXT_LDFF(vlhuff_v_w, uint16_t, uint32_t, ldhu_w, clearl)
264
+GEN_VEXT_LDFF(vlhuff_v_d, uint16_t, uint64_t, ldhu_d, clearq)
265
+GEN_VEXT_LDFF(vlwuff_v_w, uint32_t, uint32_t, ldwu_w, clearl)
266
+GEN_VEXT_LDFF(vlwuff_v_d, uint32_t, uint64_t, ldwu_d, clearq)
267
--
268
2.27.0
269
270
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Vector AMOs operate as if aq and rl bits were zero on each element
4
with regard to ordering relative to other instructions in the same hart.
5
Vector AMOs provide no ordering guarantee between element operations
6
in the same vector AMO instruction
7
8
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-Id: <20200701152549.1218-10-zhiwei_liu@c-sky.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
14
target/riscv/helper.h | 29 +++++
15
target/riscv/internals.h | 1 +
16
target/riscv/insn32-64.decode | 11 ++
17
target/riscv/insn32.decode | 13 +++
18
target/riscv/insn_trans/trans_rvv.inc.c | 138 ++++++++++++++++++++++
19
target/riscv/vector_helper.c | 147 ++++++++++++++++++++++++
20
6 files changed, 339 insertions(+)
21
22
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
23
index XXXXXXX..XXXXXXX 100644
24
--- a/target/riscv/helper.h
25
+++ b/target/riscv/helper.h
26
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_5(vlhuff_v_w, void, ptr, ptr, tl, env, i32)
27
DEF_HELPER_5(vlhuff_v_d, void, ptr, ptr, tl, env, i32)
28
DEF_HELPER_5(vlwuff_v_w, void, ptr, ptr, tl, env, i32)
29
DEF_HELPER_5(vlwuff_v_d, void, ptr, ptr, tl, env, i32)
30
+#ifdef TARGET_RISCV64
31
+DEF_HELPER_6(vamoswapw_v_d, void, ptr, ptr, tl, ptr, env, i32)
32
+DEF_HELPER_6(vamoswapd_v_d, void, ptr, ptr, tl, ptr, env, i32)
33
+DEF_HELPER_6(vamoaddw_v_d, void, ptr, ptr, tl, ptr, env, i32)
34
+DEF_HELPER_6(vamoaddd_v_d, void, ptr, ptr, tl, ptr, env, i32)
35
+DEF_HELPER_6(vamoxorw_v_d, void, ptr, ptr, tl, ptr, env, i32)
36
+DEF_HELPER_6(vamoxord_v_d, void, ptr, ptr, tl, ptr, env, i32)
37
+DEF_HELPER_6(vamoandw_v_d, void, ptr, ptr, tl, ptr, env, i32)
38
+DEF_HELPER_6(vamoandd_v_d, void, ptr, ptr, tl, ptr, env, i32)
39
+DEF_HELPER_6(vamoorw_v_d, void, ptr, ptr, tl, ptr, env, i32)
40
+DEF_HELPER_6(vamoord_v_d, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vamominw_v_d, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vamomind_v_d, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vamomaxw_v_d, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vamomaxd_v_d, void, ptr, ptr, tl, ptr, env, i32)
45
+DEF_HELPER_6(vamominuw_v_d, void, ptr, ptr, tl, ptr, env, i32)
46
+DEF_HELPER_6(vamominud_v_d, void, ptr, ptr, tl, ptr, env, i32)
47
+DEF_HELPER_6(vamomaxuw_v_d, void, ptr, ptr, tl, ptr, env, i32)
48
+DEF_HELPER_6(vamomaxud_v_d, void, ptr, ptr, tl, ptr, env, i32)
49
+#endif
50
+DEF_HELPER_6(vamoswapw_v_w, void, ptr, ptr, tl, ptr, env, i32)
51
+DEF_HELPER_6(vamoaddw_v_w, void, ptr, ptr, tl, ptr, env, i32)
52
+DEF_HELPER_6(vamoxorw_v_w, void, ptr, ptr, tl, ptr, env, i32)
53
+DEF_HELPER_6(vamoandw_v_w, void, ptr, ptr, tl, ptr, env, i32)
54
+DEF_HELPER_6(vamoorw_v_w, void, ptr, ptr, tl, ptr, env, i32)
55
+DEF_HELPER_6(vamominw_v_w, void, ptr, ptr, tl, ptr, env, i32)
56
+DEF_HELPER_6(vamomaxw_v_w, void, ptr, ptr, tl, ptr, env, i32)
57
+DEF_HELPER_6(vamominuw_v_w, void, ptr, ptr, tl, ptr, env, i32)
58
+DEF_HELPER_6(vamomaxuw_v_w, void, ptr, ptr, tl, ptr, env, i32)
59
diff --git a/target/riscv/internals.h b/target/riscv/internals.h
60
index XXXXXXX..XXXXXXX 100644
61
--- a/target/riscv/internals.h
62
+++ b/target/riscv/internals.h
63
@@ -XXX,XX +XXX,XX @@ FIELD(VDATA, MLEN, 0, 8)
64
FIELD(VDATA, VM, 8, 1)
65
FIELD(VDATA, LMUL, 9, 2)
66
FIELD(VDATA, NF, 11, 4)
67
+FIELD(VDATA, WD, 11, 1)
68
#endif
69
diff --git a/target/riscv/insn32-64.decode b/target/riscv/insn32-64.decode
70
index XXXXXXX..XXXXXXX 100644
71
--- a/target/riscv/insn32-64.decode
72
+++ b/target/riscv/insn32-64.decode
73
@@ -XXX,XX +XXX,XX @@ amomax_d 10100 . . ..... ..... 011 ..... 0101111 @atom_st
74
amominu_d 11000 . . ..... ..... 011 ..... 0101111 @atom_st
75
amomaxu_d 11100 . . ..... ..... 011 ..... 0101111 @atom_st
76
77
+#*** Vector AMO operations (in addition to Zvamo) ***
78
+vamoswapd_v 00001 . . ..... ..... 111 ..... 0101111 @r_wdvm
79
+vamoaddd_v 00000 . . ..... ..... 111 ..... 0101111 @r_wdvm
80
+vamoxord_v 00100 . . ..... ..... 111 ..... 0101111 @r_wdvm
81
+vamoandd_v 01100 . . ..... ..... 111 ..... 0101111 @r_wdvm
82
+vamoord_v 01000 . . ..... ..... 111 ..... 0101111 @r_wdvm
83
+vamomind_v 10000 . . ..... ..... 111 ..... 0101111 @r_wdvm
84
+vamomaxd_v 10100 . . ..... ..... 111 ..... 0101111 @r_wdvm
85
+vamominud_v 11000 . . ..... ..... 111 ..... 0101111 @r_wdvm
86
+vamomaxud_v 11100 . . ..... ..... 111 ..... 0101111 @r_wdvm
87
+
88
# *** RV64F Standard Extension (in addition to RV32F) ***
89
fcvt_l_s 1100000 00010 ..... ... ..... 1010011 @r2_rm
90
fcvt_lu_s 1100000 00011 ..... ... ..... 1010011 @r2_rm
91
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
92
index XXXXXXX..XXXXXXX 100644
93
--- a/target/riscv/insn32.decode
94
+++ b/target/riscv/insn32.decode
95
@@ -XXX,XX +XXX,XX @@
96
&u imm rd
97
&shift shamt rs1 rd
98
&atomic aq rl rs2 rs1 rd
99
+&rwdvm vm wd rd rs1 rs2
100
&r2nfvm vm rd rs1 nf
101
&rnfvm vm rd rs1 rs2 nf
102
103
@@ -XXX,XX +XXX,XX @@
104
@r2 ....... ..... ..... ... ..... ....... %rs1 %rd
105
@r2_nfvm ... ... vm:1 ..... ..... ... ..... ....... &r2nfvm %nf %rs1 %rd
106
@r_nfvm ... ... vm:1 ..... ..... ... ..... ....... &rnfvm %nf %rs2 %rs1 %rd
107
+@r_wdvm ..... wd:1 vm:1 ..... ..... ... ..... ....... &rwdvm %rs2 %rs1 %rd
108
@r2_zimm . zimm:11 ..... ... ..... ....... %rs1 %rd
109
110
@hfence_gvma ....... ..... ..... ... ..... ....... %rs2 %rs1
111
@@ -XXX,XX +XXX,XX @@ vsxh_v ... -11 . ..... ..... 101 ..... 0100111 @r_nfvm
112
vsxw_v ... -11 . ..... ..... 110 ..... 0100111 @r_nfvm
113
vsxe_v ... -11 . ..... ..... 111 ..... 0100111 @r_nfvm
114
115
+#*** Vector AMO operations are encoded under the standard AMO major opcode ***
116
+vamoswapw_v 00001 . . ..... ..... 110 ..... 0101111 @r_wdvm
117
+vamoaddw_v 00000 . . ..... ..... 110 ..... 0101111 @r_wdvm
118
+vamoxorw_v 00100 . . ..... ..... 110 ..... 0101111 @r_wdvm
119
+vamoandw_v 01100 . . ..... ..... 110 ..... 0101111 @r_wdvm
120
+vamoorw_v 01000 . . ..... ..... 110 ..... 0101111 @r_wdvm
121
+vamominw_v 10000 . . ..... ..... 110 ..... 0101111 @r_wdvm
122
+vamomaxw_v 10100 . . ..... ..... 110 ..... 0101111 @r_wdvm
123
+vamominuw_v 11000 . . ..... ..... 110 ..... 0101111 @r_wdvm
124
+vamomaxuw_v 11100 . . ..... ..... 110 ..... 0101111 @r_wdvm
125
+
126
# *** new major opcode OP-V ***
127
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
128
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
129
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
130
index XXXXXXX..XXXXXXX 100644
131
--- a/target/riscv/insn_trans/trans_rvv.inc.c
132
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
133
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_TRANS(vleff_v, 3, r2nfvm, ldff_op, ld_us_check)
134
GEN_VEXT_TRANS(vlbuff_v, 4, r2nfvm, ldff_op, ld_us_check)
135
GEN_VEXT_TRANS(vlhuff_v, 5, r2nfvm, ldff_op, ld_us_check)
136
GEN_VEXT_TRANS(vlwuff_v, 6, r2nfvm, ldff_op, ld_us_check)
137
+
138
+/*
139
+ *** vector atomic operation
140
+ */
141
+typedef void gen_helper_amo(TCGv_ptr, TCGv_ptr, TCGv, TCGv_ptr,
142
+ TCGv_env, TCGv_i32);
143
+
144
+static bool amo_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
145
+ uint32_t data, gen_helper_amo *fn, DisasContext *s)
146
+{
147
+ TCGv_ptr dest, mask, index;
148
+ TCGv base;
149
+ TCGv_i32 desc;
150
+
151
+ TCGLabel *over = gen_new_label();
152
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
153
+
154
+ dest = tcg_temp_new_ptr();
155
+ mask = tcg_temp_new_ptr();
156
+ index = tcg_temp_new_ptr();
157
+ base = tcg_temp_new();
158
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
159
+
160
+ gen_get_gpr(base, rs1);
161
+ tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
162
+ tcg_gen_addi_ptr(index, cpu_env, vreg_ofs(s, vs2));
163
+ tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
164
+
165
+ fn(dest, mask, base, index, cpu_env, desc);
166
+
167
+ tcg_temp_free_ptr(dest);
168
+ tcg_temp_free_ptr(mask);
169
+ tcg_temp_free_ptr(index);
170
+ tcg_temp_free(base);
171
+ tcg_temp_free_i32(desc);
172
+ gen_set_label(over);
173
+ return true;
174
+}
175
+
176
+static bool amo_op(DisasContext *s, arg_rwdvm *a, uint8_t seq)
177
+{
178
+ uint32_t data = 0;
179
+ gen_helper_amo *fn;
180
+ static gen_helper_amo *const fnsw[9] = {
181
+ /* no atomic operation */
182
+ gen_helper_vamoswapw_v_w,
183
+ gen_helper_vamoaddw_v_w,
184
+ gen_helper_vamoxorw_v_w,
185
+ gen_helper_vamoandw_v_w,
186
+ gen_helper_vamoorw_v_w,
187
+ gen_helper_vamominw_v_w,
188
+ gen_helper_vamomaxw_v_w,
189
+ gen_helper_vamominuw_v_w,
190
+ gen_helper_vamomaxuw_v_w
191
+ };
192
+#ifdef TARGET_RISCV64
193
+ static gen_helper_amo *const fnsd[18] = {
194
+ gen_helper_vamoswapw_v_d,
195
+ gen_helper_vamoaddw_v_d,
196
+ gen_helper_vamoxorw_v_d,
197
+ gen_helper_vamoandw_v_d,
198
+ gen_helper_vamoorw_v_d,
199
+ gen_helper_vamominw_v_d,
200
+ gen_helper_vamomaxw_v_d,
201
+ gen_helper_vamominuw_v_d,
202
+ gen_helper_vamomaxuw_v_d,
203
+ gen_helper_vamoswapd_v_d,
204
+ gen_helper_vamoaddd_v_d,
205
+ gen_helper_vamoxord_v_d,
206
+ gen_helper_vamoandd_v_d,
207
+ gen_helper_vamoord_v_d,
208
+ gen_helper_vamomind_v_d,
209
+ gen_helper_vamomaxd_v_d,
210
+ gen_helper_vamominud_v_d,
211
+ gen_helper_vamomaxud_v_d
212
+ };
213
+#endif
214
+
215
+ if (tb_cflags(s->base.tb) & CF_PARALLEL) {
216
+ gen_helper_exit_atomic(cpu_env);
217
+ s->base.is_jmp = DISAS_NORETURN;
218
+ return true;
219
+ } else {
220
+ if (s->sew == 3) {
221
+#ifdef TARGET_RISCV64
222
+ fn = fnsd[seq];
223
+#else
224
+ /* Check done in amo_check(). */
225
+ g_assert_not_reached();
226
+#endif
227
+ } else {
228
+ fn = fnsw[seq];
229
+ }
230
+ }
231
+
232
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
233
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
234
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
235
+ data = FIELD_DP32(data, VDATA, WD, a->wd);
236
+ return amo_trans(a->rd, a->rs1, a->rs2, data, fn, s);
237
+}
238
+/*
239
+ * There are two rules check here.
240
+ *
241
+ * 1. SEW must be at least as wide as the AMO memory element size.
242
+ *
243
+ * 2. If SEW is greater than XLEN, an illegal instruction exception is raised.
244
+ */
245
+static bool amo_check(DisasContext *s, arg_rwdvm* a)
246
+{
247
+ return (!s->vill && has_ext(s, RVA) &&
248
+ (!a->wd || vext_check_overlap_mask(s, a->rd, a->vm, false)) &&
249
+ vext_check_reg(s, a->rd, false) &&
250
+ vext_check_reg(s, a->rs2, false) &&
251
+ ((1 << s->sew) <= sizeof(target_ulong)) &&
252
+ ((1 << s->sew) >= 4));
253
+}
254
+
255
+GEN_VEXT_TRANS(vamoswapw_v, 0, rwdvm, amo_op, amo_check)
256
+GEN_VEXT_TRANS(vamoaddw_v, 1, rwdvm, amo_op, amo_check)
257
+GEN_VEXT_TRANS(vamoxorw_v, 2, rwdvm, amo_op, amo_check)
258
+GEN_VEXT_TRANS(vamoandw_v, 3, rwdvm, amo_op, amo_check)
259
+GEN_VEXT_TRANS(vamoorw_v, 4, rwdvm, amo_op, amo_check)
260
+GEN_VEXT_TRANS(vamominw_v, 5, rwdvm, amo_op, amo_check)
261
+GEN_VEXT_TRANS(vamomaxw_v, 6, rwdvm, amo_op, amo_check)
262
+GEN_VEXT_TRANS(vamominuw_v, 7, rwdvm, amo_op, amo_check)
263
+GEN_VEXT_TRANS(vamomaxuw_v, 8, rwdvm, amo_op, amo_check)
264
+#ifdef TARGET_RISCV64
265
+GEN_VEXT_TRANS(vamoswapd_v, 9, rwdvm, amo_op, amo_check)
266
+GEN_VEXT_TRANS(vamoaddd_v, 10, rwdvm, amo_op, amo_check)
267
+GEN_VEXT_TRANS(vamoxord_v, 11, rwdvm, amo_op, amo_check)
268
+GEN_VEXT_TRANS(vamoandd_v, 12, rwdvm, amo_op, amo_check)
269
+GEN_VEXT_TRANS(vamoord_v, 13, rwdvm, amo_op, amo_check)
270
+GEN_VEXT_TRANS(vamomind_v, 14, rwdvm, amo_op, amo_check)
271
+GEN_VEXT_TRANS(vamomaxd_v, 15, rwdvm, amo_op, amo_check)
272
+GEN_VEXT_TRANS(vamominud_v, 16, rwdvm, amo_op, amo_check)
273
+GEN_VEXT_TRANS(vamomaxud_v, 17, rwdvm, amo_op, amo_check)
274
+#endif
275
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
276
index XXXXXXX..XXXXXXX 100644
277
--- a/target/riscv/vector_helper.c
278
+++ b/target/riscv/vector_helper.c
279
@@ -XXX,XX +XXX,XX @@ static inline uint32_t vext_lmul(uint32_t desc)
280
return FIELD_EX32(simd_data(desc), VDATA, LMUL);
281
}
282
283
+static uint32_t vext_wd(uint32_t desc)
284
+{
285
+ return (simd_data(desc) >> 11) & 0x1;
286
+}
287
+
288
/*
289
* Get vector group length in bytes. Its range is [64, 2048].
290
*
291
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_LDFF(vlhuff_v_w, uint16_t, uint32_t, ldhu_w, clearl)
292
GEN_VEXT_LDFF(vlhuff_v_d, uint16_t, uint64_t, ldhu_d, clearq)
293
GEN_VEXT_LDFF(vlwuff_v_w, uint32_t, uint32_t, ldwu_w, clearl)
294
GEN_VEXT_LDFF(vlwuff_v_d, uint32_t, uint64_t, ldwu_d, clearq)
295
+
296
+/*
297
+ *** Vector AMO Operations (Zvamo)
298
+ */
299
+typedef void vext_amo_noatomic_fn(void *vs3, target_ulong addr,
300
+ uint32_t wd, uint32_t idx, CPURISCVState *env,
301
+ uintptr_t retaddr);
302
+
303
+/* no atomic opreation for vector atomic insructions */
304
+#define DO_SWAP(N, M) (M)
305
+#define DO_AND(N, M) (N & M)
306
+#define DO_XOR(N, M) (N ^ M)
307
+#define DO_OR(N, M) (N | M)
308
+#define DO_ADD(N, M) (N + M)
309
+
310
+#define GEN_VEXT_AMO_NOATOMIC_OP(NAME, ESZ, MSZ, H, DO_OP, SUF) \
311
+static void \
312
+vext_##NAME##_noatomic_op(void *vs3, target_ulong addr, \
313
+ uint32_t wd, uint32_t idx, \
314
+ CPURISCVState *env, uintptr_t retaddr)\
315
+{ \
316
+ typedef int##ESZ##_t ETYPE; \
317
+ typedef int##MSZ##_t MTYPE; \
318
+ typedef uint##MSZ##_t UMTYPE __attribute__((unused)); \
319
+ ETYPE *pe3 = (ETYPE *)vs3 + H(idx); \
320
+ MTYPE a = cpu_ld##SUF##_data(env, addr), b = *pe3; \
321
+ \
322
+ cpu_st##SUF##_data(env, addr, DO_OP(a, b)); \
323
+ if (wd) { \
324
+ *pe3 = a; \
325
+ } \
326
+}
327
+
328
+/* Signed min/max */
329
+#define DO_MAX(N, M) ((N) >= (M) ? (N) : (M))
330
+#define DO_MIN(N, M) ((N) >= (M) ? (M) : (N))
331
+
332
+/* Unsigned min/max */
333
+#define DO_MAXU(N, M) DO_MAX((UMTYPE)N, (UMTYPE)M)
334
+#define DO_MINU(N, M) DO_MIN((UMTYPE)N, (UMTYPE)M)
335
+
336
+GEN_VEXT_AMO_NOATOMIC_OP(vamoswapw_v_w, 32, 32, H4, DO_SWAP, l)
337
+GEN_VEXT_AMO_NOATOMIC_OP(vamoaddw_v_w, 32, 32, H4, DO_ADD, l)
338
+GEN_VEXT_AMO_NOATOMIC_OP(vamoxorw_v_w, 32, 32, H4, DO_XOR, l)
339
+GEN_VEXT_AMO_NOATOMIC_OP(vamoandw_v_w, 32, 32, H4, DO_AND, l)
340
+GEN_VEXT_AMO_NOATOMIC_OP(vamoorw_v_w, 32, 32, H4, DO_OR, l)
341
+GEN_VEXT_AMO_NOATOMIC_OP(vamominw_v_w, 32, 32, H4, DO_MIN, l)
342
+GEN_VEXT_AMO_NOATOMIC_OP(vamomaxw_v_w, 32, 32, H4, DO_MAX, l)
343
+GEN_VEXT_AMO_NOATOMIC_OP(vamominuw_v_w, 32, 32, H4, DO_MINU, l)
344
+GEN_VEXT_AMO_NOATOMIC_OP(vamomaxuw_v_w, 32, 32, H4, DO_MAXU, l)
345
+#ifdef TARGET_RISCV64
346
+GEN_VEXT_AMO_NOATOMIC_OP(vamoswapw_v_d, 64, 32, H8, DO_SWAP, l)
347
+GEN_VEXT_AMO_NOATOMIC_OP(vamoswapd_v_d, 64, 64, H8, DO_SWAP, q)
348
+GEN_VEXT_AMO_NOATOMIC_OP(vamoaddw_v_d, 64, 32, H8, DO_ADD, l)
349
+GEN_VEXT_AMO_NOATOMIC_OP(vamoaddd_v_d, 64, 64, H8, DO_ADD, q)
350
+GEN_VEXT_AMO_NOATOMIC_OP(vamoxorw_v_d, 64, 32, H8, DO_XOR, l)
351
+GEN_VEXT_AMO_NOATOMIC_OP(vamoxord_v_d, 64, 64, H8, DO_XOR, q)
352
+GEN_VEXT_AMO_NOATOMIC_OP(vamoandw_v_d, 64, 32, H8, DO_AND, l)
353
+GEN_VEXT_AMO_NOATOMIC_OP(vamoandd_v_d, 64, 64, H8, DO_AND, q)
354
+GEN_VEXT_AMO_NOATOMIC_OP(vamoorw_v_d, 64, 32, H8, DO_OR, l)
355
+GEN_VEXT_AMO_NOATOMIC_OP(vamoord_v_d, 64, 64, H8, DO_OR, q)
356
+GEN_VEXT_AMO_NOATOMIC_OP(vamominw_v_d, 64, 32, H8, DO_MIN, l)
357
+GEN_VEXT_AMO_NOATOMIC_OP(vamomind_v_d, 64, 64, H8, DO_MIN, q)
358
+GEN_VEXT_AMO_NOATOMIC_OP(vamomaxw_v_d, 64, 32, H8, DO_MAX, l)
359
+GEN_VEXT_AMO_NOATOMIC_OP(vamomaxd_v_d, 64, 64, H8, DO_MAX, q)
360
+GEN_VEXT_AMO_NOATOMIC_OP(vamominuw_v_d, 64, 32, H8, DO_MINU, l)
361
+GEN_VEXT_AMO_NOATOMIC_OP(vamominud_v_d, 64, 64, H8, DO_MINU, q)
362
+GEN_VEXT_AMO_NOATOMIC_OP(vamomaxuw_v_d, 64, 32, H8, DO_MAXU, l)
363
+GEN_VEXT_AMO_NOATOMIC_OP(vamomaxud_v_d, 64, 64, H8, DO_MAXU, q)
364
+#endif
365
+
366
+static inline void
367
+vext_amo_noatomic(void *vs3, void *v0, target_ulong base,
368
+ void *vs2, CPURISCVState *env, uint32_t desc,
369
+ vext_get_index_addr get_index_addr,
370
+ vext_amo_noatomic_fn *noatomic_op,
371
+ clear_fn *clear_elem,
372
+ uint32_t esz, uint32_t msz, uintptr_t ra)
373
+{
374
+ uint32_t i;
375
+ target_long addr;
376
+ uint32_t wd = vext_wd(desc);
377
+ uint32_t vm = vext_vm(desc);
378
+ uint32_t mlen = vext_mlen(desc);
379
+ uint32_t vlmax = vext_maxsz(desc) / esz;
380
+
381
+ for (i = 0; i < env->vl; i++) {
382
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
383
+ continue;
384
+ }
385
+ probe_pages(env, get_index_addr(base, i, vs2), msz, ra, MMU_DATA_LOAD);
386
+ probe_pages(env, get_index_addr(base, i, vs2), msz, ra, MMU_DATA_STORE);
387
+ }
388
+ for (i = 0; i < env->vl; i++) {
389
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
390
+ continue;
391
+ }
392
+ addr = get_index_addr(base, i, vs2);
393
+ noatomic_op(vs3, addr, wd, i, env, ra);
394
+ }
395
+ clear_elem(vs3, env->vl, env->vl * esz, vlmax * esz);
396
+}
397
+
398
+#define GEN_VEXT_AMO(NAME, MTYPE, ETYPE, INDEX_FN, CLEAR_FN) \
399
+void HELPER(NAME)(void *vs3, void *v0, target_ulong base, \
400
+ void *vs2, CPURISCVState *env, uint32_t desc) \
401
+{ \
402
+ vext_amo_noatomic(vs3, v0, base, vs2, env, desc, \
403
+ INDEX_FN, vext_##NAME##_noatomic_op, \
404
+ CLEAR_FN, sizeof(ETYPE), sizeof(MTYPE), \
405
+ GETPC()); \
406
+}
407
+
408
+#ifdef TARGET_RISCV64
409
+GEN_VEXT_AMO(vamoswapw_v_d, int32_t, int64_t, idx_d, clearq)
410
+GEN_VEXT_AMO(vamoswapd_v_d, int64_t, int64_t, idx_d, clearq)
411
+GEN_VEXT_AMO(vamoaddw_v_d, int32_t, int64_t, idx_d, clearq)
412
+GEN_VEXT_AMO(vamoaddd_v_d, int64_t, int64_t, idx_d, clearq)
413
+GEN_VEXT_AMO(vamoxorw_v_d, int32_t, int64_t, idx_d, clearq)
414
+GEN_VEXT_AMO(vamoxord_v_d, int64_t, int64_t, idx_d, clearq)
415
+GEN_VEXT_AMO(vamoandw_v_d, int32_t, int64_t, idx_d, clearq)
416
+GEN_VEXT_AMO(vamoandd_v_d, int64_t, int64_t, idx_d, clearq)
417
+GEN_VEXT_AMO(vamoorw_v_d, int32_t, int64_t, idx_d, clearq)
418
+GEN_VEXT_AMO(vamoord_v_d, int64_t, int64_t, idx_d, clearq)
419
+GEN_VEXT_AMO(vamominw_v_d, int32_t, int64_t, idx_d, clearq)
420
+GEN_VEXT_AMO(vamomind_v_d, int64_t, int64_t, idx_d, clearq)
421
+GEN_VEXT_AMO(vamomaxw_v_d, int32_t, int64_t, idx_d, clearq)
422
+GEN_VEXT_AMO(vamomaxd_v_d, int64_t, int64_t, idx_d, clearq)
423
+GEN_VEXT_AMO(vamominuw_v_d, uint32_t, uint64_t, idx_d, clearq)
424
+GEN_VEXT_AMO(vamominud_v_d, uint64_t, uint64_t, idx_d, clearq)
425
+GEN_VEXT_AMO(vamomaxuw_v_d, uint32_t, uint64_t, idx_d, clearq)
426
+GEN_VEXT_AMO(vamomaxud_v_d, uint64_t, uint64_t, idx_d, clearq)
427
+#endif
428
+GEN_VEXT_AMO(vamoswapw_v_w, int32_t, int32_t, idx_w, clearl)
429
+GEN_VEXT_AMO(vamoaddw_v_w, int32_t, int32_t, idx_w, clearl)
430
+GEN_VEXT_AMO(vamoxorw_v_w, int32_t, int32_t, idx_w, clearl)
431
+GEN_VEXT_AMO(vamoandw_v_w, int32_t, int32_t, idx_w, clearl)
432
+GEN_VEXT_AMO(vamoorw_v_w, int32_t, int32_t, idx_w, clearl)
433
+GEN_VEXT_AMO(vamominw_v_w, int32_t, int32_t, idx_w, clearl)
434
+GEN_VEXT_AMO(vamomaxw_v_w, int32_t, int32_t, idx_w, clearl)
435
+GEN_VEXT_AMO(vamominuw_v_w, uint32_t, uint32_t, idx_w, clearl)
436
+GEN_VEXT_AMO(vamomaxuw_v_w, uint32_t, uint32_t, idx_w, clearl)
437
--
438
2.27.0
439
440
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-Id: <20200701152549.1218-11-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 25 ++
10
target/riscv/insn32.decode | 10 +
11
target/riscv/insn_trans/trans_rvv.inc.c | 291 ++++++++++++++++++++++++
12
target/riscv/vector_helper.c | 183 +++++++++++++++
13
4 files changed, 509 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vamominw_v_w, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vamomaxw_v_w, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vamominuw_v_w, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vamomaxuw_v_w, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vadd_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vadd_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vadd_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vadd_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vsub_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vsub_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vsub_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vsub_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vadd_vx_b, void, ptr, ptr, tl, ptr, env, i32)
33
+DEF_HELPER_6(vadd_vx_h, void, ptr, ptr, tl, ptr, env, i32)
34
+DEF_HELPER_6(vadd_vx_w, void, ptr, ptr, tl, ptr, env, i32)
35
+DEF_HELPER_6(vadd_vx_d, void, ptr, ptr, tl, ptr, env, i32)
36
+DEF_HELPER_6(vsub_vx_b, void, ptr, ptr, tl, ptr, env, i32)
37
+DEF_HELPER_6(vsub_vx_h, void, ptr, ptr, tl, ptr, env, i32)
38
+DEF_HELPER_6(vsub_vx_w, void, ptr, ptr, tl, ptr, env, i32)
39
+DEF_HELPER_6(vsub_vx_d, void, ptr, ptr, tl, ptr, env, i32)
40
+DEF_HELPER_6(vrsub_vx_b, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vrsub_vx_h, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vrsub_vx_w, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vrsub_vx_d, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_FLAGS_4(vec_rsubs8, TCG_CALL_NO_RWG, void, ptr, ptr, i64, i32)
45
+DEF_HELPER_FLAGS_4(vec_rsubs16, TCG_CALL_NO_RWG, void, ptr, ptr, i64, i32)
46
+DEF_HELPER_FLAGS_4(vec_rsubs32, TCG_CALL_NO_RWG, void, ptr, ptr, i64, i32)
47
+DEF_HELPER_FLAGS_4(vec_rsubs64, TCG_CALL_NO_RWG, void, ptr, ptr, i64, i32)
48
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
49
index XXXXXXX..XXXXXXX 100644
50
--- a/target/riscv/insn32.decode
51
+++ b/target/riscv/insn32.decode
52
@@ -XXX,XX +XXX,XX @@
53
&u imm rd
54
&shift shamt rs1 rd
55
&atomic aq rl rs2 rs1 rd
56
+&rmrr vm rd rs1 rs2
57
&rwdvm vm wd rd rs1 rs2
58
&r2nfvm vm rd rs1 nf
59
&rnfvm vm rd rs1 rs2 nf
60
@@ -XXX,XX +XXX,XX @@
61
@r2 ....... ..... ..... ... ..... ....... %rs1 %rd
62
@r2_nfvm ... ... vm:1 ..... ..... ... ..... ....... &r2nfvm %nf %rs1 %rd
63
@r_nfvm ... ... vm:1 ..... ..... ... ..... ....... &rnfvm %nf %rs2 %rs1 %rd
64
+@r_vm ...... vm:1 ..... ..... ... ..... ....... &rmrr %rs2 %rs1 %rd
65
@r_wdvm ..... wd:1 vm:1 ..... ..... ... ..... ....... &rwdvm %rs2 %rs1 %rd
66
@r2_zimm . zimm:11 ..... ... ..... ....... %rs1 %rd
67
68
@@ -XXX,XX +XXX,XX @@ vamominuw_v 11000 . . ..... ..... 110 ..... 0101111 @r_wdvm
69
vamomaxuw_v 11100 . . ..... ..... 110 ..... 0101111 @r_wdvm
70
71
# *** new major opcode OP-V ***
72
+vadd_vv 000000 . ..... ..... 000 ..... 1010111 @r_vm
73
+vadd_vx 000000 . ..... ..... 100 ..... 1010111 @r_vm
74
+vadd_vi 000000 . ..... ..... 011 ..... 1010111 @r_vm
75
+vsub_vv 000010 . ..... ..... 000 ..... 1010111 @r_vm
76
+vsub_vx 000010 . ..... ..... 100 ..... 1010111 @r_vm
77
+vrsub_vx 000011 . ..... ..... 100 ..... 1010111 @r_vm
78
+vrsub_vi 000011 . ..... ..... 011 ..... 1010111 @r_vm
79
+
80
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
81
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
82
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
83
index XXXXXXX..XXXXXXX 100644
84
--- a/target/riscv/insn_trans/trans_rvv.inc.c
85
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
86
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_TRANS(vamomaxd_v, 15, rwdvm, amo_op, amo_check)
87
GEN_VEXT_TRANS(vamominud_v, 16, rwdvm, amo_op, amo_check)
88
GEN_VEXT_TRANS(vamomaxud_v, 17, rwdvm, amo_op, amo_check)
89
#endif
90
+
91
+/*
92
+ *** Vector Integer Arithmetic Instructions
93
+ */
94
+#define MAXSZ(s) (s->vlen >> (3 - s->lmul))
95
+
96
+static bool opivv_check(DisasContext *s, arg_rmrr *a)
97
+{
98
+ return (vext_check_isa_ill(s) &&
99
+ vext_check_overlap_mask(s, a->rd, a->vm, false) &&
100
+ vext_check_reg(s, a->rd, false) &&
101
+ vext_check_reg(s, a->rs2, false) &&
102
+ vext_check_reg(s, a->rs1, false));
103
+}
104
+
105
+typedef void GVecGen3Fn(unsigned, uint32_t, uint32_t,
106
+ uint32_t, uint32_t, uint32_t);
107
+
108
+static inline bool
109
+do_opivv_gvec(DisasContext *s, arg_rmrr *a, GVecGen3Fn *gvec_fn,
110
+ gen_helper_gvec_4_ptr *fn)
111
+{
112
+ TCGLabel *over = gen_new_label();
113
+ if (!opivv_check(s, a)) {
114
+ return false;
115
+ }
116
+
117
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
118
+
119
+ if (a->vm && s->vl_eq_vlmax) {
120
+ gvec_fn(s->sew, vreg_ofs(s, a->rd),
121
+ vreg_ofs(s, a->rs2), vreg_ofs(s, a->rs1),
122
+ MAXSZ(s), MAXSZ(s));
123
+ } else {
124
+ uint32_t data = 0;
125
+
126
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
127
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
128
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
129
+ tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
130
+ vreg_ofs(s, a->rs1), vreg_ofs(s, a->rs2),
131
+ cpu_env, 0, s->vlen / 8, data, fn);
132
+ }
133
+ gen_set_label(over);
134
+ return true;
135
+}
136
+
137
+/* OPIVV with GVEC IR */
138
+#define GEN_OPIVV_GVEC_TRANS(NAME, SUF) \
139
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
140
+{ \
141
+ static gen_helper_gvec_4_ptr * const fns[4] = { \
142
+ gen_helper_##NAME##_b, gen_helper_##NAME##_h, \
143
+ gen_helper_##NAME##_w, gen_helper_##NAME##_d, \
144
+ }; \
145
+ return do_opivv_gvec(s, a, tcg_gen_gvec_##SUF, fns[s->sew]); \
146
+}
147
+
148
+GEN_OPIVV_GVEC_TRANS(vadd_vv, add)
149
+GEN_OPIVV_GVEC_TRANS(vsub_vv, sub)
150
+
151
+typedef void gen_helper_opivx(TCGv_ptr, TCGv_ptr, TCGv, TCGv_ptr,
152
+ TCGv_env, TCGv_i32);
153
+
154
+static bool opivx_trans(uint32_t vd, uint32_t rs1, uint32_t vs2, uint32_t vm,
155
+ gen_helper_opivx *fn, DisasContext *s)
156
+{
157
+ TCGv_ptr dest, src2, mask;
158
+ TCGv src1;
159
+ TCGv_i32 desc;
160
+ uint32_t data = 0;
161
+
162
+ TCGLabel *over = gen_new_label();
163
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
164
+
165
+ dest = tcg_temp_new_ptr();
166
+ mask = tcg_temp_new_ptr();
167
+ src2 = tcg_temp_new_ptr();
168
+ src1 = tcg_temp_new();
169
+ gen_get_gpr(src1, rs1);
170
+
171
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
172
+ data = FIELD_DP32(data, VDATA, VM, vm);
173
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
174
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
175
+
176
+ tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
177
+ tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, vs2));
178
+ tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
179
+
180
+ fn(dest, mask, src1, src2, cpu_env, desc);
181
+
182
+ tcg_temp_free_ptr(dest);
183
+ tcg_temp_free_ptr(mask);
184
+ tcg_temp_free_ptr(src2);
185
+ tcg_temp_free(src1);
186
+ tcg_temp_free_i32(desc);
187
+ gen_set_label(over);
188
+ return true;
189
+}
190
+
191
+static bool opivx_check(DisasContext *s, arg_rmrr *a)
192
+{
193
+ return (vext_check_isa_ill(s) &&
194
+ vext_check_overlap_mask(s, a->rd, a->vm, false) &&
195
+ vext_check_reg(s, a->rd, false) &&
196
+ vext_check_reg(s, a->rs2, false));
197
+}
198
+
199
+typedef void GVecGen2sFn(unsigned, uint32_t, uint32_t, TCGv_i64,
200
+ uint32_t, uint32_t);
201
+
202
+static inline bool
203
+do_opivx_gvec(DisasContext *s, arg_rmrr *a, GVecGen2sFn *gvec_fn,
204
+ gen_helper_opivx *fn)
205
+{
206
+ if (!opivx_check(s, a)) {
207
+ return false;
208
+ }
209
+
210
+ if (a->vm && s->vl_eq_vlmax) {
211
+ TCGv_i64 src1 = tcg_temp_new_i64();
212
+ TCGv tmp = tcg_temp_new();
213
+
214
+ gen_get_gpr(tmp, a->rs1);
215
+ tcg_gen_ext_tl_i64(src1, tmp);
216
+ gvec_fn(s->sew, vreg_ofs(s, a->rd), vreg_ofs(s, a->rs2),
217
+ src1, MAXSZ(s), MAXSZ(s));
218
+
219
+ tcg_temp_free_i64(src1);
220
+ tcg_temp_free(tmp);
221
+ return true;
222
+ }
223
+ return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fn, s);
224
+}
225
+
226
+/* OPIVX with GVEC IR */
227
+#define GEN_OPIVX_GVEC_TRANS(NAME, SUF) \
228
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
229
+{ \
230
+ static gen_helper_opivx * const fns[4] = { \
231
+ gen_helper_##NAME##_b, gen_helper_##NAME##_h, \
232
+ gen_helper_##NAME##_w, gen_helper_##NAME##_d, \
233
+ }; \
234
+ return do_opivx_gvec(s, a, tcg_gen_gvec_##SUF, fns[s->sew]); \
235
+}
236
+
237
+GEN_OPIVX_GVEC_TRANS(vadd_vx, adds)
238
+GEN_OPIVX_GVEC_TRANS(vsub_vx, subs)
239
+
240
+static void gen_vec_rsub8_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b)
241
+{
242
+ tcg_gen_vec_sub8_i64(d, b, a);
243
+}
244
+
245
+static void gen_vec_rsub16_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b)
246
+{
247
+ tcg_gen_vec_sub8_i64(d, b, a);
248
+}
249
+
250
+static void gen_rsub_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2)
251
+{
252
+ tcg_gen_sub_i32(ret, arg2, arg1);
253
+}
254
+
255
+static void gen_rsub_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2)
256
+{
257
+ tcg_gen_sub_i64(ret, arg2, arg1);
258
+}
259
+
260
+static void gen_rsub_vec(unsigned vece, TCGv_vec r, TCGv_vec a, TCGv_vec b)
261
+{
262
+ tcg_gen_sub_vec(vece, r, b, a);
263
+}
264
+
265
+static void tcg_gen_gvec_rsubs(unsigned vece, uint32_t dofs, uint32_t aofs,
266
+ TCGv_i64 c, uint32_t oprsz, uint32_t maxsz)
267
+{
268
+ static const GVecGen2s rsub_op[4] = {
269
+ { .fni8 = gen_vec_rsub8_i64,
270
+ .fniv = gen_rsub_vec,
271
+ .fno = gen_helper_vec_rsubs8,
272
+ .vece = MO_8 },
273
+ { .fni8 = gen_vec_rsub16_i64,
274
+ .fniv = gen_rsub_vec,
275
+ .fno = gen_helper_vec_rsubs16,
276
+ .vece = MO_16 },
277
+ { .fni4 = gen_rsub_i32,
278
+ .fniv = gen_rsub_vec,
279
+ .fno = gen_helper_vec_rsubs32,
280
+ .vece = MO_32 },
281
+ { .fni8 = gen_rsub_i64,
282
+ .fniv = gen_rsub_vec,
283
+ .fno = gen_helper_vec_rsubs64,
284
+ .prefer_i64 = TCG_TARGET_REG_BITS == 64,
285
+ .vece = MO_64 },
286
+ };
287
+
288
+ tcg_debug_assert(vece <= MO_64);
289
+ tcg_gen_gvec_2s(dofs, aofs, oprsz, maxsz, c, &rsub_op[vece]);
290
+}
291
+
292
+GEN_OPIVX_GVEC_TRANS(vrsub_vx, rsubs)
293
+
294
+static bool opivi_trans(uint32_t vd, uint32_t imm, uint32_t vs2, uint32_t vm,
295
+ gen_helper_opivx *fn, DisasContext *s, int zx)
296
+{
297
+ TCGv_ptr dest, src2, mask;
298
+ TCGv src1;
299
+ TCGv_i32 desc;
300
+ uint32_t data = 0;
301
+
302
+ TCGLabel *over = gen_new_label();
303
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
304
+
305
+ dest = tcg_temp_new_ptr();
306
+ mask = tcg_temp_new_ptr();
307
+ src2 = tcg_temp_new_ptr();
308
+ if (zx) {
309
+ src1 = tcg_const_tl(imm);
310
+ } else {
311
+ src1 = tcg_const_tl(sextract64(imm, 0, 5));
312
+ }
313
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
314
+ data = FIELD_DP32(data, VDATA, VM, vm);
315
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
316
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
317
+
318
+ tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
319
+ tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, vs2));
320
+ tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
321
+
322
+ fn(dest, mask, src1, src2, cpu_env, desc);
323
+
324
+ tcg_temp_free_ptr(dest);
325
+ tcg_temp_free_ptr(mask);
326
+ tcg_temp_free_ptr(src2);
327
+ tcg_temp_free(src1);
328
+ tcg_temp_free_i32(desc);
329
+ gen_set_label(over);
330
+ return true;
331
+}
332
+
333
+typedef void GVecGen2iFn(unsigned, uint32_t, uint32_t, int64_t,
334
+ uint32_t, uint32_t);
335
+
336
+static inline bool
337
+do_opivi_gvec(DisasContext *s, arg_rmrr *a, GVecGen2iFn *gvec_fn,
338
+ gen_helper_opivx *fn, int zx)
339
+{
340
+ if (!opivx_check(s, a)) {
341
+ return false;
342
+ }
343
+
344
+ if (a->vm && s->vl_eq_vlmax) {
345
+ if (zx) {
346
+ gvec_fn(s->sew, vreg_ofs(s, a->rd), vreg_ofs(s, a->rs2),
347
+ extract64(a->rs1, 0, 5), MAXSZ(s), MAXSZ(s));
348
+ } else {
349
+ gvec_fn(s->sew, vreg_ofs(s, a->rd), vreg_ofs(s, a->rs2),
350
+ sextract64(a->rs1, 0, 5), MAXSZ(s), MAXSZ(s));
351
+ }
352
+ } else {
353
+ return opivi_trans(a->rd, a->rs1, a->rs2, a->vm, fn, s, zx);
354
+ }
355
+ return true;
356
+}
357
+
358
+/* OPIVI with GVEC IR */
359
+#define GEN_OPIVI_GVEC_TRANS(NAME, ZX, OPIVX, SUF) \
360
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
361
+{ \
362
+ static gen_helper_opivx * const fns[4] = { \
363
+ gen_helper_##OPIVX##_b, gen_helper_##OPIVX##_h, \
364
+ gen_helper_##OPIVX##_w, gen_helper_##OPIVX##_d, \
365
+ }; \
366
+ return do_opivi_gvec(s, a, tcg_gen_gvec_##SUF, \
367
+ fns[s->sew], ZX); \
368
+}
369
+
370
+GEN_OPIVI_GVEC_TRANS(vadd_vi, 0, vadd_vx, addi)
371
+
372
+static void tcg_gen_gvec_rsubi(unsigned vece, uint32_t dofs, uint32_t aofs,
373
+ int64_t c, uint32_t oprsz, uint32_t maxsz)
374
+{
375
+ TCGv_i64 tmp = tcg_const_i64(c);
376
+ tcg_gen_gvec_rsubs(vece, dofs, aofs, tmp, oprsz, maxsz);
377
+ tcg_temp_free_i64(tmp);
378
+}
379
+
380
+GEN_OPIVI_GVEC_TRANS(vrsub_vi, 0, vrsub_vx, rsubi)
381
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
382
index XXXXXXX..XXXXXXX 100644
383
--- a/target/riscv/vector_helper.c
384
+++ b/target/riscv/vector_helper.c
385
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_AMO(vamominw_v_w, int32_t, int32_t, idx_w, clearl)
386
GEN_VEXT_AMO(vamomaxw_v_w, int32_t, int32_t, idx_w, clearl)
387
GEN_VEXT_AMO(vamominuw_v_w, uint32_t, uint32_t, idx_w, clearl)
388
GEN_VEXT_AMO(vamomaxuw_v_w, uint32_t, uint32_t, idx_w, clearl)
389
+
390
+/*
391
+ *** Vector Integer Arithmetic Instructions
392
+ */
393
+
394
+/* expand macro args before macro */
395
+#define RVVCALL(macro, ...) macro(__VA_ARGS__)
396
+
397
+/* (TD, T1, T2, TX1, TX2) */
398
+#define OP_SSS_B int8_t, int8_t, int8_t, int8_t, int8_t
399
+#define OP_SSS_H int16_t, int16_t, int16_t, int16_t, int16_t
400
+#define OP_SSS_W int32_t, int32_t, int32_t, int32_t, int32_t
401
+#define OP_SSS_D int64_t, int64_t, int64_t, int64_t, int64_t
402
+
403
+/* operation of two vector elements */
404
+typedef void opivv2_fn(void *vd, void *vs1, void *vs2, int i);
405
+
406
+#define OPIVV2(NAME, TD, T1, T2, TX1, TX2, HD, HS1, HS2, OP) \
407
+static void do_##NAME(void *vd, void *vs1, void *vs2, int i) \
408
+{ \
409
+ TX1 s1 = *((T1 *)vs1 + HS1(i)); \
410
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
411
+ *((TD *)vd + HD(i)) = OP(s2, s1); \
412
+}
413
+#define DO_SUB(N, M) (N - M)
414
+#define DO_RSUB(N, M) (M - N)
415
+
416
+RVVCALL(OPIVV2, vadd_vv_b, OP_SSS_B, H1, H1, H1, DO_ADD)
417
+RVVCALL(OPIVV2, vadd_vv_h, OP_SSS_H, H2, H2, H2, DO_ADD)
418
+RVVCALL(OPIVV2, vadd_vv_w, OP_SSS_W, H4, H4, H4, DO_ADD)
419
+RVVCALL(OPIVV2, vadd_vv_d, OP_SSS_D, H8, H8, H8, DO_ADD)
420
+RVVCALL(OPIVV2, vsub_vv_b, OP_SSS_B, H1, H1, H1, DO_SUB)
421
+RVVCALL(OPIVV2, vsub_vv_h, OP_SSS_H, H2, H2, H2, DO_SUB)
422
+RVVCALL(OPIVV2, vsub_vv_w, OP_SSS_W, H4, H4, H4, DO_SUB)
423
+RVVCALL(OPIVV2, vsub_vv_d, OP_SSS_D, H8, H8, H8, DO_SUB)
424
+
425
+static void do_vext_vv(void *vd, void *v0, void *vs1, void *vs2,
426
+ CPURISCVState *env, uint32_t desc,
427
+ uint32_t esz, uint32_t dsz,
428
+ opivv2_fn *fn, clear_fn *clearfn)
429
+{
430
+ uint32_t vlmax = vext_maxsz(desc) / esz;
431
+ uint32_t mlen = vext_mlen(desc);
432
+ uint32_t vm = vext_vm(desc);
433
+ uint32_t vl = env->vl;
434
+ uint32_t i;
435
+
436
+ for (i = 0; i < vl; i++) {
437
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
438
+ continue;
439
+ }
440
+ fn(vd, vs1, vs2, i);
441
+ }
442
+ clearfn(vd, vl, vl * dsz, vlmax * dsz);
443
+}
444
+
445
+/* generate the helpers for OPIVV */
446
+#define GEN_VEXT_VV(NAME, ESZ, DSZ, CLEAR_FN) \
447
+void HELPER(NAME)(void *vd, void *v0, void *vs1, \
448
+ void *vs2, CPURISCVState *env, \
449
+ uint32_t desc) \
450
+{ \
451
+ do_vext_vv(vd, v0, vs1, vs2, env, desc, ESZ, DSZ, \
452
+ do_##NAME, CLEAR_FN); \
453
+}
454
+
455
+GEN_VEXT_VV(vadd_vv_b, 1, 1, clearb)
456
+GEN_VEXT_VV(vadd_vv_h, 2, 2, clearh)
457
+GEN_VEXT_VV(vadd_vv_w, 4, 4, clearl)
458
+GEN_VEXT_VV(vadd_vv_d, 8, 8, clearq)
459
+GEN_VEXT_VV(vsub_vv_b, 1, 1, clearb)
460
+GEN_VEXT_VV(vsub_vv_h, 2, 2, clearh)
461
+GEN_VEXT_VV(vsub_vv_w, 4, 4, clearl)
462
+GEN_VEXT_VV(vsub_vv_d, 8, 8, clearq)
463
+
464
+typedef void opivx2_fn(void *vd, target_long s1, void *vs2, int i);
465
+
466
+/*
467
+ * (T1)s1 gives the real operator type.
468
+ * (TX1)(T1)s1 expands the operator type of widen or narrow operations.
469
+ */
470
+#define OPIVX2(NAME, TD, T1, T2, TX1, TX2, HD, HS2, OP) \
471
+static void do_##NAME(void *vd, target_long s1, void *vs2, int i) \
472
+{ \
473
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
474
+ *((TD *)vd + HD(i)) = OP(s2, (TX1)(T1)s1); \
475
+}
476
+
477
+RVVCALL(OPIVX2, vadd_vx_b, OP_SSS_B, H1, H1, DO_ADD)
478
+RVVCALL(OPIVX2, vadd_vx_h, OP_SSS_H, H2, H2, DO_ADD)
479
+RVVCALL(OPIVX2, vadd_vx_w, OP_SSS_W, H4, H4, DO_ADD)
480
+RVVCALL(OPIVX2, vadd_vx_d, OP_SSS_D, H8, H8, DO_ADD)
481
+RVVCALL(OPIVX2, vsub_vx_b, OP_SSS_B, H1, H1, DO_SUB)
482
+RVVCALL(OPIVX2, vsub_vx_h, OP_SSS_H, H2, H2, DO_SUB)
483
+RVVCALL(OPIVX2, vsub_vx_w, OP_SSS_W, H4, H4, DO_SUB)
484
+RVVCALL(OPIVX2, vsub_vx_d, OP_SSS_D, H8, H8, DO_SUB)
485
+RVVCALL(OPIVX2, vrsub_vx_b, OP_SSS_B, H1, H1, DO_RSUB)
486
+RVVCALL(OPIVX2, vrsub_vx_h, OP_SSS_H, H2, H2, DO_RSUB)
487
+RVVCALL(OPIVX2, vrsub_vx_w, OP_SSS_W, H4, H4, DO_RSUB)
488
+RVVCALL(OPIVX2, vrsub_vx_d, OP_SSS_D, H8, H8, DO_RSUB)
489
+
490
+static void do_vext_vx(void *vd, void *v0, target_long s1, void *vs2,
491
+ CPURISCVState *env, uint32_t desc,
492
+ uint32_t esz, uint32_t dsz,
493
+ opivx2_fn fn, clear_fn *clearfn)
494
+{
495
+ uint32_t vlmax = vext_maxsz(desc) / esz;
496
+ uint32_t mlen = vext_mlen(desc);
497
+ uint32_t vm = vext_vm(desc);
498
+ uint32_t vl = env->vl;
499
+ uint32_t i;
500
+
501
+ for (i = 0; i < vl; i++) {
502
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
503
+ continue;
504
+ }
505
+ fn(vd, s1, vs2, i);
506
+ }
507
+ clearfn(vd, vl, vl * dsz, vlmax * dsz);
508
+}
509
+
510
+/* generate the helpers for OPIVX */
511
+#define GEN_VEXT_VX(NAME, ESZ, DSZ, CLEAR_FN) \
512
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, \
513
+ void *vs2, CPURISCVState *env, \
514
+ uint32_t desc) \
515
+{ \
516
+ do_vext_vx(vd, v0, s1, vs2, env, desc, ESZ, DSZ, \
517
+ do_##NAME, CLEAR_FN); \
518
+}
519
+
520
+GEN_VEXT_VX(vadd_vx_b, 1, 1, clearb)
521
+GEN_VEXT_VX(vadd_vx_h, 2, 2, clearh)
522
+GEN_VEXT_VX(vadd_vx_w, 4, 4, clearl)
523
+GEN_VEXT_VX(vadd_vx_d, 8, 8, clearq)
524
+GEN_VEXT_VX(vsub_vx_b, 1, 1, clearb)
525
+GEN_VEXT_VX(vsub_vx_h, 2, 2, clearh)
526
+GEN_VEXT_VX(vsub_vx_w, 4, 4, clearl)
527
+GEN_VEXT_VX(vsub_vx_d, 8, 8, clearq)
528
+GEN_VEXT_VX(vrsub_vx_b, 1, 1, clearb)
529
+GEN_VEXT_VX(vrsub_vx_h, 2, 2, clearh)
530
+GEN_VEXT_VX(vrsub_vx_w, 4, 4, clearl)
531
+GEN_VEXT_VX(vrsub_vx_d, 8, 8, clearq)
532
+
533
+void HELPER(vec_rsubs8)(void *d, void *a, uint64_t b, uint32_t desc)
534
+{
535
+ intptr_t oprsz = simd_oprsz(desc);
536
+ intptr_t i;
537
+
538
+ for (i = 0; i < oprsz; i += sizeof(uint8_t)) {
539
+ *(uint8_t *)(d + i) = (uint8_t)b - *(uint8_t *)(a + i);
540
+ }
541
+}
542
+
543
+void HELPER(vec_rsubs16)(void *d, void *a, uint64_t b, uint32_t desc)
544
+{
545
+ intptr_t oprsz = simd_oprsz(desc);
546
+ intptr_t i;
547
+
548
+ for (i = 0; i < oprsz; i += sizeof(uint16_t)) {
549
+ *(uint16_t *)(d + i) = (uint16_t)b - *(uint16_t *)(a + i);
550
+ }
551
+}
552
+
553
+void HELPER(vec_rsubs32)(void *d, void *a, uint64_t b, uint32_t desc)
554
+{
555
+ intptr_t oprsz = simd_oprsz(desc);
556
+ intptr_t i;
557
+
558
+ for (i = 0; i < oprsz; i += sizeof(uint32_t)) {
559
+ *(uint32_t *)(d + i) = (uint32_t)b - *(uint32_t *)(a + i);
560
+ }
561
+}
562
+
563
+void HELPER(vec_rsubs64)(void *d, void *a, uint64_t b, uint32_t desc)
564
+{
565
+ intptr_t oprsz = simd_oprsz(desc);
566
+ intptr_t i;
567
+
568
+ for (i = 0; i < oprsz; i += sizeof(uint64_t)) {
569
+ *(uint64_t *)(d + i) = b - *(uint64_t *)(a + i);
570
+ }
571
+}
572
--
573
2.27.0
574
575
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
SiFive FU540 SoC integrates a platform DMA controller with 4 DMA
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
channels. This connects the exsiting SiFive PDMA model to the SoC,
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
and adds its device tree data as well.
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1598924352-89526-17-git-send-email-bmeng.cn@gmail.com>
6
Message-Id: <20200701152549.1218-12-zhiwei_liu@c-sky.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
8
---
12
include/hw/riscv/sifive_u.h | 11 +++++++++++
9
target/riscv/helper.h | 49 +++++++
13
hw/riscv/sifive_u.c | 30 ++++++++++++++++++++++++++++++
10
target/riscv/insn32.decode | 16 ++
14
hw/riscv/Kconfig | 1 +
11
target/riscv/insn_trans/trans_rvv.inc.c | 186 ++++++++++++++++++++++++
15
3 files changed, 42 insertions(+)
12
target/riscv/vector_helper.c | 111 ++++++++++++++
13
4 files changed, 362 insertions(+)
16
14
17
diff --git a/include/hw/riscv/sifive_u.h b/include/hw/riscv/sifive_u.h
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/riscv/sifive_u.h
17
--- a/target/riscv/helper.h
20
+++ b/include/hw/riscv/sifive_u.h
18
+++ b/target/riscv/helper.h
21
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(vec_rsubs8, TCG_CALL_NO_RWG, void, ptr, ptr, i64, i32)
22
#ifndef HW_SIFIVE_U_H
20
DEF_HELPER_FLAGS_4(vec_rsubs16, TCG_CALL_NO_RWG, void, ptr, ptr, i64, i32)
23
#define HW_SIFIVE_U_H
21
DEF_HELPER_FLAGS_4(vec_rsubs32, TCG_CALL_NO_RWG, void, ptr, ptr, i64, i32)
24
22
DEF_HELPER_FLAGS_4(vec_rsubs64, TCG_CALL_NO_RWG, void, ptr, ptr, i64, i32)
25
+#include "hw/dma/sifive_pdma.h"
23
+
26
#include "hw/net/cadence_gem.h"
24
+DEF_HELPER_6(vwaddu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
27
#include "hw/riscv/riscv_hart.h"
25
+DEF_HELPER_6(vwaddu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
28
#include "hw/riscv/sifive_cpu.h"
26
+DEF_HELPER_6(vwaddu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
29
@@ -XXX,XX +XXX,XX @@ typedef struct SiFiveUSoCState {
27
+DEF_HELPER_6(vwsubu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
30
SiFiveUPRCIState prci;
28
+DEF_HELPER_6(vwsubu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
31
SIFIVEGPIOState gpio;
29
+DEF_HELPER_6(vwsubu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
32
SiFiveUOTPState otp;
30
+DEF_HELPER_6(vwadd_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
33
+ SiFivePDMAState dma;
31
+DEF_HELPER_6(vwadd_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
34
CadenceGEMState gem;
32
+DEF_HELPER_6(vwadd_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
35
33
+DEF_HELPER_6(vwsub_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
36
uint32_t serial;
34
+DEF_HELPER_6(vwsub_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
37
@@ -XXX,XX +XXX,XX @@ enum {
35
+DEF_HELPER_6(vwsub_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
38
SIFIVE_U_MROM,
36
+DEF_HELPER_6(vwaddu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
39
SIFIVE_U_CLINT,
37
+DEF_HELPER_6(vwaddu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
40
SIFIVE_U_L2CC,
38
+DEF_HELPER_6(vwaddu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
41
+ SIFIVE_U_PDMA,
39
+DEF_HELPER_6(vwsubu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
42
SIFIVE_U_L2LIM,
40
+DEF_HELPER_6(vwsubu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
43
SIFIVE_U_PLIC,
41
+DEF_HELPER_6(vwsubu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
44
SIFIVE_U_PRCI,
42
+DEF_HELPER_6(vwadd_vx_b, void, ptr, ptr, tl, ptr, env, i32)
45
@@ -XXX,XX +XXX,XX @@ enum {
43
+DEF_HELPER_6(vwadd_vx_h, void, ptr, ptr, tl, ptr, env, i32)
46
SIFIVE_U_GPIO_IRQ13 = 20,
44
+DEF_HELPER_6(vwadd_vx_w, void, ptr, ptr, tl, ptr, env, i32)
47
SIFIVE_U_GPIO_IRQ14 = 21,
45
+DEF_HELPER_6(vwsub_vx_b, void, ptr, ptr, tl, ptr, env, i32)
48
SIFIVE_U_GPIO_IRQ15 = 22,
46
+DEF_HELPER_6(vwsub_vx_h, void, ptr, ptr, tl, ptr, env, i32)
49
+ SIFIVE_U_PDMA_IRQ0 = 23,
47
+DEF_HELPER_6(vwsub_vx_w, void, ptr, ptr, tl, ptr, env, i32)
50
+ SIFIVE_U_PDMA_IRQ1 = 24,
48
+DEF_HELPER_6(vwaddu_wv_b, void, ptr, ptr, ptr, ptr, env, i32)
51
+ SIFIVE_U_PDMA_IRQ2 = 25,
49
+DEF_HELPER_6(vwaddu_wv_h, void, ptr, ptr, ptr, ptr, env, i32)
52
+ SIFIVE_U_PDMA_IRQ3 = 26,
50
+DEF_HELPER_6(vwaddu_wv_w, void, ptr, ptr, ptr, ptr, env, i32)
53
+ SIFIVE_U_PDMA_IRQ4 = 27,
51
+DEF_HELPER_6(vwsubu_wv_b, void, ptr, ptr, ptr, ptr, env, i32)
54
+ SIFIVE_U_PDMA_IRQ5 = 28,
52
+DEF_HELPER_6(vwsubu_wv_h, void, ptr, ptr, ptr, ptr, env, i32)
55
+ SIFIVE_U_PDMA_IRQ6 = 29,
53
+DEF_HELPER_6(vwsubu_wv_w, void, ptr, ptr, ptr, ptr, env, i32)
56
+ SIFIVE_U_PDMA_IRQ7 = 30,
54
+DEF_HELPER_6(vwadd_wv_b, void, ptr, ptr, ptr, ptr, env, i32)
57
SIFIVE_U_GEM_IRQ = 0x35
55
+DEF_HELPER_6(vwadd_wv_h, void, ptr, ptr, ptr, ptr, env, i32)
58
};
56
+DEF_HELPER_6(vwadd_wv_w, void, ptr, ptr, ptr, ptr, env, i32)
59
57
+DEF_HELPER_6(vwsub_wv_b, void, ptr, ptr, ptr, ptr, env, i32)
60
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
58
+DEF_HELPER_6(vwsub_wv_h, void, ptr, ptr, ptr, ptr, env, i32)
59
+DEF_HELPER_6(vwsub_wv_w, void, ptr, ptr, ptr, ptr, env, i32)
60
+DEF_HELPER_6(vwaddu_wx_b, void, ptr, ptr, tl, ptr, env, i32)
61
+DEF_HELPER_6(vwaddu_wx_h, void, ptr, ptr, tl, ptr, env, i32)
62
+DEF_HELPER_6(vwaddu_wx_w, void, ptr, ptr, tl, ptr, env, i32)
63
+DEF_HELPER_6(vwsubu_wx_b, void, ptr, ptr, tl, ptr, env, i32)
64
+DEF_HELPER_6(vwsubu_wx_h, void, ptr, ptr, tl, ptr, env, i32)
65
+DEF_HELPER_6(vwsubu_wx_w, void, ptr, ptr, tl, ptr, env, i32)
66
+DEF_HELPER_6(vwadd_wx_b, void, ptr, ptr, tl, ptr, env, i32)
67
+DEF_HELPER_6(vwadd_wx_h, void, ptr, ptr, tl, ptr, env, i32)
68
+DEF_HELPER_6(vwadd_wx_w, void, ptr, ptr, tl, ptr, env, i32)
69
+DEF_HELPER_6(vwsub_wx_b, void, ptr, ptr, tl, ptr, env, i32)
70
+DEF_HELPER_6(vwsub_wx_h, void, ptr, ptr, tl, ptr, env, i32)
71
+DEF_HELPER_6(vwsub_wx_w, void, ptr, ptr, tl, ptr, env, i32)
72
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
61
index XXXXXXX..XXXXXXX 100644
73
index XXXXXXX..XXXXXXX 100644
62
--- a/hw/riscv/sifive_u.c
74
--- a/target/riscv/insn32.decode
63
+++ b/hw/riscv/sifive_u.c
75
+++ b/target/riscv/insn32.decode
64
@@ -XXX,XX +XXX,XX @@
76
@@ -XXX,XX +XXX,XX @@ vsub_vv 000010 . ..... ..... 000 ..... 1010111 @r_vm
65
* 4) GPIO (General Purpose Input/Output Controller)
77
vsub_vx 000010 . ..... ..... 100 ..... 1010111 @r_vm
66
* 5) OTP (One-Time Programmable) memory with stored serial number
78
vrsub_vx 000011 . ..... ..... 100 ..... 1010111 @r_vm
67
* 6) GEM (Gigabit Ethernet Controller) and management block
79
vrsub_vi 000011 . ..... ..... 011 ..... 1010111 @r_vm
68
+ * 7) DMA (Direct Memory Access Controller)
80
+vwaddu_vv 110000 . ..... ..... 010 ..... 1010111 @r_vm
69
*
81
+vwaddu_vx 110000 . ..... ..... 110 ..... 1010111 @r_vm
70
* This board currently generates devicetree dynamically that indicates at least
82
+vwadd_vv 110001 . ..... ..... 010 ..... 1010111 @r_vm
71
* two harts and up to five harts.
83
+vwadd_vx 110001 . ..... ..... 110 ..... 1010111 @r_vm
72
@@ -XXX,XX +XXX,XX @@ static const struct MemmapEntry {
84
+vwsubu_vv 110010 . ..... ..... 010 ..... 1010111 @r_vm
73
[SIFIVE_U_MROM] = { 0x1000, 0xf000 },
85
+vwsubu_vx 110010 . ..... ..... 110 ..... 1010111 @r_vm
74
[SIFIVE_U_CLINT] = { 0x2000000, 0x10000 },
86
+vwsub_vv 110011 . ..... ..... 010 ..... 1010111 @r_vm
75
[SIFIVE_U_L2CC] = { 0x2010000, 0x1000 },
87
+vwsub_vx 110011 . ..... ..... 110 ..... 1010111 @r_vm
76
+ [SIFIVE_U_PDMA] = { 0x3000000, 0x100000 },
88
+vwaddu_wv 110100 . ..... ..... 010 ..... 1010111 @r_vm
77
[SIFIVE_U_L2LIM] = { 0x8000000, 0x2000000 },
89
+vwaddu_wx 110100 . ..... ..... 110 ..... 1010111 @r_vm
78
[SIFIVE_U_PLIC] = { 0xc000000, 0x4000000 },
90
+vwadd_wv 110101 . ..... ..... 010 ..... 1010111 @r_vm
79
[SIFIVE_U_PRCI] = { 0x10000000, 0x1000 },
91
+vwadd_wx 110101 . ..... ..... 110 ..... 1010111 @r_vm
80
@@ -XXX,XX +XXX,XX @@ static void create_fdt(SiFiveUState *s, const struct MemmapEntry *memmap,
92
+vwsubu_wv 110110 . ..... ..... 010 ..... 1010111 @r_vm
81
qemu_fdt_setprop_string(fdt, nodename, "compatible", "gpio-restart");
93
+vwsubu_wx 110110 . ..... ..... 110 ..... 1010111 @r_vm
82
g_free(nodename);
94
+vwsub_wv 110111 . ..... ..... 010 ..... 1010111 @r_vm
83
95
+vwsub_wx 110111 . ..... ..... 110 ..... 1010111 @r_vm
84
+ nodename = g_strdup_printf("/soc/dma@%lx",
96
85
+ (long)memmap[SIFIVE_U_PDMA].base);
97
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
86
+ qemu_fdt_add_subnode(fdt, nodename);
98
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
87
+ qemu_fdt_setprop_cell(fdt, nodename, "#dma-cells", 1);
99
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
88
+ qemu_fdt_setprop_cells(fdt, nodename, "interrupts",
100
index XXXXXXX..XXXXXXX 100644
89
+ SIFIVE_U_PDMA_IRQ0, SIFIVE_U_PDMA_IRQ1, SIFIVE_U_PDMA_IRQ2,
101
--- a/target/riscv/insn_trans/trans_rvv.inc.c
90
+ SIFIVE_U_PDMA_IRQ3, SIFIVE_U_PDMA_IRQ4, SIFIVE_U_PDMA_IRQ5,
102
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
91
+ SIFIVE_U_PDMA_IRQ6, SIFIVE_U_PDMA_IRQ7);
103
@@ -XXX,XX +XXX,XX @@ static bool vext_check_nf(DisasContext *s, uint32_t nf)
92
+ qemu_fdt_setprop_cell(fdt, nodename, "interrupt-parent", plic_phandle);
104
return (1 << s->lmul) * nf <= 8;
93
+ qemu_fdt_setprop_cells(fdt, nodename, "reg",
94
+ 0x0, memmap[SIFIVE_U_PDMA].base,
95
+ 0x0, memmap[SIFIVE_U_PDMA].size);
96
+ qemu_fdt_setprop_string(fdt, nodename, "compatible",
97
+ "sifive,fu540-c000-pdma");
98
+ g_free(nodename);
99
+
100
nodename = g_strdup_printf("/soc/cache-controller@%lx",
101
(long)memmap[SIFIVE_U_L2CC].base);
102
qemu_fdt_add_subnode(fdt, nodename);
103
@@ -XXX,XX +XXX,XX @@ static void sifive_u_soc_instance_init(Object *obj)
104
object_initialize_child(obj, "otp", &s->otp, TYPE_SIFIVE_U_OTP);
105
object_initialize_child(obj, "gem", &s->gem, TYPE_CADENCE_GEM);
106
object_initialize_child(obj, "gpio", &s->gpio, TYPE_SIFIVE_GPIO);
107
+ object_initialize_child(obj, "pdma", &s->dma, TYPE_SIFIVE_PDMA);
108
}
105
}
109
106
110
static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
107
+/*
111
@@ -XXX,XX +XXX,XX @@ static void sifive_u_soc_realize(DeviceState *dev, Error **errp)
108
+ * The destination vector register group cannot overlap a source vector register
112
SIFIVE_U_GPIO_IRQ0 + i));
109
+ * group of a different element width. (Section 11.2)
110
+ */
111
+static inline bool vext_check_overlap_group(int rd, int dlen, int rs, int slen)
112
+{
113
+ return ((rd >= rs + slen) || (rs >= rd + dlen));
114
+}
115
/* common translation macro */
116
#define GEN_VEXT_TRANS(NAME, SEQ, ARGTYPE, OP, CHECK) \
117
static bool trans_##NAME(DisasContext *s, arg_##ARGTYPE *a)\
118
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_gvec_rsubi(unsigned vece, uint32_t dofs, uint32_t aofs,
119
}
120
121
GEN_OPIVI_GVEC_TRANS(vrsub_vi, 0, vrsub_vx, rsubi)
122
+
123
+/* Vector Widening Integer Add/Subtract */
124
+
125
+/* OPIVV with WIDEN */
126
+static bool opivv_widen_check(DisasContext *s, arg_rmrr *a)
127
+{
128
+ return (vext_check_isa_ill(s) &&
129
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
130
+ vext_check_reg(s, a->rd, true) &&
131
+ vext_check_reg(s, a->rs2, false) &&
132
+ vext_check_reg(s, a->rs1, false) &&
133
+ vext_check_overlap_group(a->rd, 2 << s->lmul, a->rs2,
134
+ 1 << s->lmul) &&
135
+ vext_check_overlap_group(a->rd, 2 << s->lmul, a->rs1,
136
+ 1 << s->lmul) &&
137
+ (s->lmul < 0x3) && (s->sew < 0x3));
138
+}
139
+
140
+static bool do_opivv_widen(DisasContext *s, arg_rmrr *a,
141
+ gen_helper_gvec_4_ptr *fn,
142
+ bool (*checkfn)(DisasContext *, arg_rmrr *))
143
+{
144
+ if (checkfn(s, a)) {
145
+ uint32_t data = 0;
146
+ TCGLabel *over = gen_new_label();
147
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
148
+
149
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
150
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
151
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
152
+ tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
153
+ vreg_ofs(s, a->rs1),
154
+ vreg_ofs(s, a->rs2),
155
+ cpu_env, 0, s->vlen / 8,
156
+ data, fn);
157
+ gen_set_label(over);
158
+ return true;
159
+ }
160
+ return false;
161
+}
162
+
163
+#define GEN_OPIVV_WIDEN_TRANS(NAME, CHECK) \
164
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
165
+{ \
166
+ static gen_helper_gvec_4_ptr * const fns[3] = { \
167
+ gen_helper_##NAME##_b, \
168
+ gen_helper_##NAME##_h, \
169
+ gen_helper_##NAME##_w \
170
+ }; \
171
+ return do_opivv_widen(s, a, fns[s->sew], CHECK); \
172
+}
173
+
174
+GEN_OPIVV_WIDEN_TRANS(vwaddu_vv, opivv_widen_check)
175
+GEN_OPIVV_WIDEN_TRANS(vwadd_vv, opivv_widen_check)
176
+GEN_OPIVV_WIDEN_TRANS(vwsubu_vv, opivv_widen_check)
177
+GEN_OPIVV_WIDEN_TRANS(vwsub_vv, opivv_widen_check)
178
+
179
+/* OPIVX with WIDEN */
180
+static bool opivx_widen_check(DisasContext *s, arg_rmrr *a)
181
+{
182
+ return (vext_check_isa_ill(s) &&
183
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
184
+ vext_check_reg(s, a->rd, true) &&
185
+ vext_check_reg(s, a->rs2, false) &&
186
+ vext_check_overlap_group(a->rd, 2 << s->lmul, a->rs2,
187
+ 1 << s->lmul) &&
188
+ (s->lmul < 0x3) && (s->sew < 0x3));
189
+}
190
+
191
+static bool do_opivx_widen(DisasContext *s, arg_rmrr *a,
192
+ gen_helper_opivx *fn)
193
+{
194
+ if (opivx_widen_check(s, a)) {
195
+ return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fn, s);
196
+ }
197
+ return true;
198
+}
199
+
200
+#define GEN_OPIVX_WIDEN_TRANS(NAME) \
201
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
202
+{ \
203
+ static gen_helper_opivx * const fns[3] = { \
204
+ gen_helper_##NAME##_b, \
205
+ gen_helper_##NAME##_h, \
206
+ gen_helper_##NAME##_w \
207
+ }; \
208
+ return do_opivx_widen(s, a, fns[s->sew]); \
209
+}
210
+
211
+GEN_OPIVX_WIDEN_TRANS(vwaddu_vx)
212
+GEN_OPIVX_WIDEN_TRANS(vwadd_vx)
213
+GEN_OPIVX_WIDEN_TRANS(vwsubu_vx)
214
+GEN_OPIVX_WIDEN_TRANS(vwsub_vx)
215
+
216
+/* WIDEN OPIVV with WIDEN */
217
+static bool opiwv_widen_check(DisasContext *s, arg_rmrr *a)
218
+{
219
+ return (vext_check_isa_ill(s) &&
220
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
221
+ vext_check_reg(s, a->rd, true) &&
222
+ vext_check_reg(s, a->rs2, true) &&
223
+ vext_check_reg(s, a->rs1, false) &&
224
+ vext_check_overlap_group(a->rd, 2 << s->lmul, a->rs1,
225
+ 1 << s->lmul) &&
226
+ (s->lmul < 0x3) && (s->sew < 0x3));
227
+}
228
+
229
+static bool do_opiwv_widen(DisasContext *s, arg_rmrr *a,
230
+ gen_helper_gvec_4_ptr *fn)
231
+{
232
+ if (opiwv_widen_check(s, a)) {
233
+ uint32_t data = 0;
234
+ TCGLabel *over = gen_new_label();
235
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
236
+
237
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
238
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
239
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
240
+ tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
241
+ vreg_ofs(s, a->rs1),
242
+ vreg_ofs(s, a->rs2),
243
+ cpu_env, 0, s->vlen / 8, data, fn);
244
+ gen_set_label(over);
245
+ return true;
246
+ }
247
+ return false;
248
+}
249
+
250
+#define GEN_OPIWV_WIDEN_TRANS(NAME) \
251
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
252
+{ \
253
+ static gen_helper_gvec_4_ptr * const fns[3] = { \
254
+ gen_helper_##NAME##_b, \
255
+ gen_helper_##NAME##_h, \
256
+ gen_helper_##NAME##_w \
257
+ }; \
258
+ return do_opiwv_widen(s, a, fns[s->sew]); \
259
+}
260
+
261
+GEN_OPIWV_WIDEN_TRANS(vwaddu_wv)
262
+GEN_OPIWV_WIDEN_TRANS(vwadd_wv)
263
+GEN_OPIWV_WIDEN_TRANS(vwsubu_wv)
264
+GEN_OPIWV_WIDEN_TRANS(vwsub_wv)
265
+
266
+/* WIDEN OPIVX with WIDEN */
267
+static bool opiwx_widen_check(DisasContext *s, arg_rmrr *a)
268
+{
269
+ return (vext_check_isa_ill(s) &&
270
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
271
+ vext_check_reg(s, a->rd, true) &&
272
+ vext_check_reg(s, a->rs2, true) &&
273
+ (s->lmul < 0x3) && (s->sew < 0x3));
274
+}
275
+
276
+static bool do_opiwx_widen(DisasContext *s, arg_rmrr *a,
277
+ gen_helper_opivx *fn)
278
+{
279
+ if (opiwx_widen_check(s, a)) {
280
+ return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fn, s);
281
+ }
282
+ return false;
283
+}
284
+
285
+#define GEN_OPIWX_WIDEN_TRANS(NAME) \
286
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
287
+{ \
288
+ static gen_helper_opivx * const fns[3] = { \
289
+ gen_helper_##NAME##_b, \
290
+ gen_helper_##NAME##_h, \
291
+ gen_helper_##NAME##_w \
292
+ }; \
293
+ return do_opiwx_widen(s, a, fns[s->sew]); \
294
+}
295
+
296
+GEN_OPIWX_WIDEN_TRANS(vwaddu_wx)
297
+GEN_OPIWX_WIDEN_TRANS(vwadd_wx)
298
+GEN_OPIWX_WIDEN_TRANS(vwsubu_wx)
299
+GEN_OPIWX_WIDEN_TRANS(vwsub_wx)
300
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
301
index XXXXXXX..XXXXXXX 100644
302
--- a/target/riscv/vector_helper.c
303
+++ b/target/riscv/vector_helper.c
304
@@ -XXX,XX +XXX,XX @@ void HELPER(vec_rsubs64)(void *d, void *a, uint64_t b, uint32_t desc)
305
*(uint64_t *)(d + i) = b - *(uint64_t *)(a + i);
113
}
306
}
114
307
}
115
+ /* PDMA */
308
+
116
+ sysbus_realize(SYS_BUS_DEVICE(&s->dma), errp);
309
+/* Vector Widening Integer Add/Subtract */
117
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->dma), 0, memmap[SIFIVE_U_PDMA].base);
310
+#define WOP_UUU_B uint16_t, uint8_t, uint8_t, uint16_t, uint16_t
118
+
311
+#define WOP_UUU_H uint32_t, uint16_t, uint16_t, uint32_t, uint32_t
119
+ /* Connect PDMA interrupts to the PLIC */
312
+#define WOP_UUU_W uint64_t, uint32_t, uint32_t, uint64_t, uint64_t
120
+ for (i = 0; i < SIFIVE_PDMA_IRQS; i++) {
313
+#define WOP_SSS_B int16_t, int8_t, int8_t, int16_t, int16_t
121
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), i,
314
+#define WOP_SSS_H int32_t, int16_t, int16_t, int32_t, int32_t
122
+ qdev_get_gpio_in(DEVICE(s->plic),
315
+#define WOP_SSS_W int64_t, int32_t, int32_t, int64_t, int64_t
123
+ SIFIVE_U_PDMA_IRQ0 + i));
316
+#define WOP_WUUU_B uint16_t, uint8_t, uint16_t, uint16_t, uint16_t
124
+ }
317
+#define WOP_WUUU_H uint32_t, uint16_t, uint32_t, uint32_t, uint32_t
125
+
318
+#define WOP_WUUU_W uint64_t, uint32_t, uint64_t, uint64_t, uint64_t
126
qdev_prop_set_uint32(DEVICE(&s->otp), "serial", s->serial);
319
+#define WOP_WSSS_B int16_t, int8_t, int16_t, int16_t, int16_t
127
if (!sysbus_realize(SYS_BUS_DEVICE(&s->otp), errp)) {
320
+#define WOP_WSSS_H int32_t, int16_t, int32_t, int32_t, int32_t
128
return;
321
+#define WOP_WSSS_W int64_t, int32_t, int64_t, int64_t, int64_t
129
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
322
+RVVCALL(OPIVV2, vwaddu_vv_b, WOP_UUU_B, H2, H1, H1, DO_ADD)
130
index XXXXXXX..XXXXXXX 100644
323
+RVVCALL(OPIVV2, vwaddu_vv_h, WOP_UUU_H, H4, H2, H2, DO_ADD)
131
--- a/hw/riscv/Kconfig
324
+RVVCALL(OPIVV2, vwaddu_vv_w, WOP_UUU_W, H8, H4, H4, DO_ADD)
132
+++ b/hw/riscv/Kconfig
325
+RVVCALL(OPIVV2, vwsubu_vv_b, WOP_UUU_B, H2, H1, H1, DO_SUB)
133
@@ -XXX,XX +XXX,XX @@ config SIFIVE_U
326
+RVVCALL(OPIVV2, vwsubu_vv_h, WOP_UUU_H, H4, H2, H2, DO_SUB)
134
select CADENCE
327
+RVVCALL(OPIVV2, vwsubu_vv_w, WOP_UUU_W, H8, H4, H4, DO_SUB)
135
select HART
328
+RVVCALL(OPIVV2, vwadd_vv_b, WOP_SSS_B, H2, H1, H1, DO_ADD)
136
select SIFIVE
329
+RVVCALL(OPIVV2, vwadd_vv_h, WOP_SSS_H, H4, H2, H2, DO_ADD)
137
+ select SIFIVE_PDMA
330
+RVVCALL(OPIVV2, vwadd_vv_w, WOP_SSS_W, H8, H4, H4, DO_ADD)
138
select UNIMP
331
+RVVCALL(OPIVV2, vwsub_vv_b, WOP_SSS_B, H2, H1, H1, DO_SUB)
139
332
+RVVCALL(OPIVV2, vwsub_vv_h, WOP_SSS_H, H4, H2, H2, DO_SUB)
140
config SPIKE
333
+RVVCALL(OPIVV2, vwsub_vv_w, WOP_SSS_W, H8, H4, H4, DO_SUB)
334
+RVVCALL(OPIVV2, vwaddu_wv_b, WOP_WUUU_B, H2, H1, H1, DO_ADD)
335
+RVVCALL(OPIVV2, vwaddu_wv_h, WOP_WUUU_H, H4, H2, H2, DO_ADD)
336
+RVVCALL(OPIVV2, vwaddu_wv_w, WOP_WUUU_W, H8, H4, H4, DO_ADD)
337
+RVVCALL(OPIVV2, vwsubu_wv_b, WOP_WUUU_B, H2, H1, H1, DO_SUB)
338
+RVVCALL(OPIVV2, vwsubu_wv_h, WOP_WUUU_H, H4, H2, H2, DO_SUB)
339
+RVVCALL(OPIVV2, vwsubu_wv_w, WOP_WUUU_W, H8, H4, H4, DO_SUB)
340
+RVVCALL(OPIVV2, vwadd_wv_b, WOP_WSSS_B, H2, H1, H1, DO_ADD)
341
+RVVCALL(OPIVV2, vwadd_wv_h, WOP_WSSS_H, H4, H2, H2, DO_ADD)
342
+RVVCALL(OPIVV2, vwadd_wv_w, WOP_WSSS_W, H8, H4, H4, DO_ADD)
343
+RVVCALL(OPIVV2, vwsub_wv_b, WOP_WSSS_B, H2, H1, H1, DO_SUB)
344
+RVVCALL(OPIVV2, vwsub_wv_h, WOP_WSSS_H, H4, H2, H2, DO_SUB)
345
+RVVCALL(OPIVV2, vwsub_wv_w, WOP_WSSS_W, H8, H4, H4, DO_SUB)
346
+GEN_VEXT_VV(vwaddu_vv_b, 1, 2, clearh)
347
+GEN_VEXT_VV(vwaddu_vv_h, 2, 4, clearl)
348
+GEN_VEXT_VV(vwaddu_vv_w, 4, 8, clearq)
349
+GEN_VEXT_VV(vwsubu_vv_b, 1, 2, clearh)
350
+GEN_VEXT_VV(vwsubu_vv_h, 2, 4, clearl)
351
+GEN_VEXT_VV(vwsubu_vv_w, 4, 8, clearq)
352
+GEN_VEXT_VV(vwadd_vv_b, 1, 2, clearh)
353
+GEN_VEXT_VV(vwadd_vv_h, 2, 4, clearl)
354
+GEN_VEXT_VV(vwadd_vv_w, 4, 8, clearq)
355
+GEN_VEXT_VV(vwsub_vv_b, 1, 2, clearh)
356
+GEN_VEXT_VV(vwsub_vv_h, 2, 4, clearl)
357
+GEN_VEXT_VV(vwsub_vv_w, 4, 8, clearq)
358
+GEN_VEXT_VV(vwaddu_wv_b, 1, 2, clearh)
359
+GEN_VEXT_VV(vwaddu_wv_h, 2, 4, clearl)
360
+GEN_VEXT_VV(vwaddu_wv_w, 4, 8, clearq)
361
+GEN_VEXT_VV(vwsubu_wv_b, 1, 2, clearh)
362
+GEN_VEXT_VV(vwsubu_wv_h, 2, 4, clearl)
363
+GEN_VEXT_VV(vwsubu_wv_w, 4, 8, clearq)
364
+GEN_VEXT_VV(vwadd_wv_b, 1, 2, clearh)
365
+GEN_VEXT_VV(vwadd_wv_h, 2, 4, clearl)
366
+GEN_VEXT_VV(vwadd_wv_w, 4, 8, clearq)
367
+GEN_VEXT_VV(vwsub_wv_b, 1, 2, clearh)
368
+GEN_VEXT_VV(vwsub_wv_h, 2, 4, clearl)
369
+GEN_VEXT_VV(vwsub_wv_w, 4, 8, clearq)
370
+
371
+RVVCALL(OPIVX2, vwaddu_vx_b, WOP_UUU_B, H2, H1, DO_ADD)
372
+RVVCALL(OPIVX2, vwaddu_vx_h, WOP_UUU_H, H4, H2, DO_ADD)
373
+RVVCALL(OPIVX2, vwaddu_vx_w, WOP_UUU_W, H8, H4, DO_ADD)
374
+RVVCALL(OPIVX2, vwsubu_vx_b, WOP_UUU_B, H2, H1, DO_SUB)
375
+RVVCALL(OPIVX2, vwsubu_vx_h, WOP_UUU_H, H4, H2, DO_SUB)
376
+RVVCALL(OPIVX2, vwsubu_vx_w, WOP_UUU_W, H8, H4, DO_SUB)
377
+RVVCALL(OPIVX2, vwadd_vx_b, WOP_SSS_B, H2, H1, DO_ADD)
378
+RVVCALL(OPIVX2, vwadd_vx_h, WOP_SSS_H, H4, H2, DO_ADD)
379
+RVVCALL(OPIVX2, vwadd_vx_w, WOP_SSS_W, H8, H4, DO_ADD)
380
+RVVCALL(OPIVX2, vwsub_vx_b, WOP_SSS_B, H2, H1, DO_SUB)
381
+RVVCALL(OPIVX2, vwsub_vx_h, WOP_SSS_H, H4, H2, DO_SUB)
382
+RVVCALL(OPIVX2, vwsub_vx_w, WOP_SSS_W, H8, H4, DO_SUB)
383
+RVVCALL(OPIVX2, vwaddu_wx_b, WOP_WUUU_B, H2, H1, DO_ADD)
384
+RVVCALL(OPIVX2, vwaddu_wx_h, WOP_WUUU_H, H4, H2, DO_ADD)
385
+RVVCALL(OPIVX2, vwaddu_wx_w, WOP_WUUU_W, H8, H4, DO_ADD)
386
+RVVCALL(OPIVX2, vwsubu_wx_b, WOP_WUUU_B, H2, H1, DO_SUB)
387
+RVVCALL(OPIVX2, vwsubu_wx_h, WOP_WUUU_H, H4, H2, DO_SUB)
388
+RVVCALL(OPIVX2, vwsubu_wx_w, WOP_WUUU_W, H8, H4, DO_SUB)
389
+RVVCALL(OPIVX2, vwadd_wx_b, WOP_WSSS_B, H2, H1, DO_ADD)
390
+RVVCALL(OPIVX2, vwadd_wx_h, WOP_WSSS_H, H4, H2, DO_ADD)
391
+RVVCALL(OPIVX2, vwadd_wx_w, WOP_WSSS_W, H8, H4, DO_ADD)
392
+RVVCALL(OPIVX2, vwsub_wx_b, WOP_WSSS_B, H2, H1, DO_SUB)
393
+RVVCALL(OPIVX2, vwsub_wx_h, WOP_WSSS_H, H4, H2, DO_SUB)
394
+RVVCALL(OPIVX2, vwsub_wx_w, WOP_WSSS_W, H8, H4, DO_SUB)
395
+GEN_VEXT_VX(vwaddu_vx_b, 1, 2, clearh)
396
+GEN_VEXT_VX(vwaddu_vx_h, 2, 4, clearl)
397
+GEN_VEXT_VX(vwaddu_vx_w, 4, 8, clearq)
398
+GEN_VEXT_VX(vwsubu_vx_b, 1, 2, clearh)
399
+GEN_VEXT_VX(vwsubu_vx_h, 2, 4, clearl)
400
+GEN_VEXT_VX(vwsubu_vx_w, 4, 8, clearq)
401
+GEN_VEXT_VX(vwadd_vx_b, 1, 2, clearh)
402
+GEN_VEXT_VX(vwadd_vx_h, 2, 4, clearl)
403
+GEN_VEXT_VX(vwadd_vx_w, 4, 8, clearq)
404
+GEN_VEXT_VX(vwsub_vx_b, 1, 2, clearh)
405
+GEN_VEXT_VX(vwsub_vx_h, 2, 4, clearl)
406
+GEN_VEXT_VX(vwsub_vx_w, 4, 8, clearq)
407
+GEN_VEXT_VX(vwaddu_wx_b, 1, 2, clearh)
408
+GEN_VEXT_VX(vwaddu_wx_h, 2, 4, clearl)
409
+GEN_VEXT_VX(vwaddu_wx_w, 4, 8, clearq)
410
+GEN_VEXT_VX(vwsubu_wx_b, 1, 2, clearh)
411
+GEN_VEXT_VX(vwsubu_wx_h, 2, 4, clearl)
412
+GEN_VEXT_VX(vwsubu_wx_w, 4, 8, clearq)
413
+GEN_VEXT_VX(vwadd_wx_b, 1, 2, clearh)
414
+GEN_VEXT_VX(vwadd_wx_h, 2, 4, clearl)
415
+GEN_VEXT_VX(vwadd_wx_w, 4, 8, clearq)
416
+GEN_VEXT_VX(vwsub_wx_b, 1, 2, clearh)
417
+GEN_VEXT_VX(vwsub_wx_h, 2, 4, clearl)
418
+GEN_VEXT_VX(vwsub_wx_w, 4, 8, clearq)
141
--
419
--
142
2.28.0
420
2.27.0
143
421
144
422
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
Microchip PolarFire SoC integrates one Cadence SDHCI controller.
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
On the Icicle Kit board, one eMMC chip and an external SD card
5
connect to this controller depending on different configuration.
6
7
As QEMU does not support eMMC yet, we just emulate the SD card
8
configuration. To test this, the Hart Software Services (HSS)
9
should choose the SD card configuration:
10
11
$ cp boards/icicle-kit-es/def_config.sdcard .config
12
$ make BOARD=icicle-kit-es
13
14
The SD card image can be built from the Yocto BSP at:
15
https://github.com/polarfire-soc/meta-polarfire-soc-yocto-bsp
16
17
Note the generated SD card image should be resized before use:
18
$ qemu-img resize /path/to/sdcard.img 4G
19
20
Launch QEMU with the following command:
21
$ qemu-system-riscv64 -nographic -M microchip-icicle-kit -sd sdcard.img
22
23
Signed-off-by: Bin Meng <bin.meng@windriver.com>
24
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
25
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
26
Message-Id: <1598924352-89526-9-git-send-email-bmeng.cn@gmail.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-Id: <20200701152549.1218-13-zhiwei_liu@c-sky.com>
27
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
28
---
8
---
29
include/hw/riscv/microchip_pfsoc.h | 4 ++++
9
target/riscv/helper.h | 33 ++++++
30
hw/riscv/microchip_pfsoc.c | 23 +++++++++++++++++++++++
10
target/riscv/insn32.decode | 11 ++
31
hw/riscv/Kconfig | 1 +
11
target/riscv/insn_trans/trans_rvv.inc.c | 113 +++++++++++++++++++
32
3 files changed, 28 insertions(+)
12
target/riscv/vector_helper.c | 137 ++++++++++++++++++++++++
13
4 files changed, 294 insertions(+)
33
14
34
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
35
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
36
--- a/include/hw/riscv/microchip_pfsoc.h
17
--- a/target/riscv/helper.h
37
+++ b/include/hw/riscv/microchip_pfsoc.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vwadd_wx_w, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vwsub_wx_b, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vwsub_wx_h, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vwsub_wx_w, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vadc_vvm_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vadc_vvm_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vadc_vvm_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vadc_vvm_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vsbc_vvm_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vsbc_vvm_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vsbc_vvm_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vsbc_vvm_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vmadc_vvm_b, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vmadc_vvm_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vmadc_vvm_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vmadc_vvm_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vmsbc_vvm_b, void, ptr, ptr, ptr, ptr, env, i32)
37
+DEF_HELPER_6(vmsbc_vvm_h, void, ptr, ptr, ptr, ptr, env, i32)
38
+DEF_HELPER_6(vmsbc_vvm_w, void, ptr, ptr, ptr, ptr, env, i32)
39
+DEF_HELPER_6(vmsbc_vvm_d, void, ptr, ptr, ptr, ptr, env, i32)
40
+DEF_HELPER_6(vadc_vxm_b, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vadc_vxm_h, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vadc_vxm_w, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vadc_vxm_d, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vsbc_vxm_b, void, ptr, ptr, tl, ptr, env, i32)
45
+DEF_HELPER_6(vsbc_vxm_h, void, ptr, ptr, tl, ptr, env, i32)
46
+DEF_HELPER_6(vsbc_vxm_w, void, ptr, ptr, tl, ptr, env, i32)
47
+DEF_HELPER_6(vsbc_vxm_d, void, ptr, ptr, tl, ptr, env, i32)
48
+DEF_HELPER_6(vmadc_vxm_b, void, ptr, ptr, tl, ptr, env, i32)
49
+DEF_HELPER_6(vmadc_vxm_h, void, ptr, ptr, tl, ptr, env, i32)
50
+DEF_HELPER_6(vmadc_vxm_w, void, ptr, ptr, tl, ptr, env, i32)
51
+DEF_HELPER_6(vmadc_vxm_d, void, ptr, ptr, tl, ptr, env, i32)
52
+DEF_HELPER_6(vmsbc_vxm_b, void, ptr, ptr, tl, ptr, env, i32)
53
+DEF_HELPER_6(vmsbc_vxm_h, void, ptr, ptr, tl, ptr, env, i32)
54
+DEF_HELPER_6(vmsbc_vxm_w, void, ptr, ptr, tl, ptr, env, i32)
55
+DEF_HELPER_6(vmsbc_vxm_d, void, ptr, ptr, tl, ptr, env, i32)
56
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/riscv/insn32.decode
59
+++ b/target/riscv/insn32.decode
38
@@ -XXX,XX +XXX,XX @@
60
@@ -XXX,XX +XXX,XX @@
39
#define HW_MICROCHIP_PFSOC_H
61
@r2_nfvm ... ... vm:1 ..... ..... ... ..... ....... &r2nfvm %nf %rs1 %rd
40
62
@r_nfvm ... ... vm:1 ..... ..... ... ..... ....... &rnfvm %nf %rs2 %rs1 %rd
41
#include "hw/char/mchp_pfsoc_mmuart.h"
63
@r_vm ...... vm:1 ..... ..... ... ..... ....... &rmrr %rs2 %rs1 %rd
42
+#include "hw/sd/cadence_sdhci.h"
64
+@r_vm_1 ...... . ..... ..... ... ..... ....... &rmrr vm=1 %rs2 %rs1 %rd
43
65
@r_wdvm ..... wd:1 vm:1 ..... ..... ... ..... ....... &rwdvm %rs2 %rs1 %rd
44
typedef struct MicrochipPFSoCState {
66
@r2_zimm . zimm:11 ..... ... ..... ....... %rs1 %rd
45
/*< private >*/
67
46
@@ -XXX,XX +XXX,XX @@ typedef struct MicrochipPFSoCState {
68
@@ -XXX,XX +XXX,XX @@ vwsubu_wv 110110 . ..... ..... 010 ..... 1010111 @r_vm
47
MchpPfSoCMMUartState *serial2;
69
vwsubu_wx 110110 . ..... ..... 110 ..... 1010111 @r_vm
48
MchpPfSoCMMUartState *serial3;
70
vwsub_wv 110111 . ..... ..... 010 ..... 1010111 @r_vm
49
MchpPfSoCMMUartState *serial4;
71
vwsub_wx 110111 . ..... ..... 110 ..... 1010111 @r_vm
50
+ CadenceSDHCIState sdhci;
72
+vadc_vvm 010000 1 ..... ..... 000 ..... 1010111 @r_vm_1
51
} MicrochipPFSoCState;
73
+vadc_vxm 010000 1 ..... ..... 100 ..... 1010111 @r_vm_1
52
74
+vadc_vim 010000 1 ..... ..... 011 ..... 1010111 @r_vm_1
53
#define TYPE_MICROCHIP_PFSOC "microchip.pfsoc"
75
+vmadc_vvm 010001 1 ..... ..... 000 ..... 1010111 @r_vm_1
54
@@ -XXX,XX +XXX,XX @@ enum {
76
+vmadc_vxm 010001 1 ..... ..... 100 ..... 1010111 @r_vm_1
55
MICROCHIP_PFSOC_MMUART0,
77
+vmadc_vim 010001 1 ..... ..... 011 ..... 1010111 @r_vm_1
56
MICROCHIP_PFSOC_SYSREG,
78
+vsbc_vvm 010010 1 ..... ..... 000 ..... 1010111 @r_vm_1
57
MICROCHIP_PFSOC_MPUCFG,
79
+vsbc_vxm 010010 1 ..... ..... 100 ..... 1010111 @r_vm_1
58
+ MICROCHIP_PFSOC_EMMC_SD,
80
+vmsbc_vvm 010011 1 ..... ..... 000 ..... 1010111 @r_vm_1
59
MICROCHIP_PFSOC_MMUART1,
81
+vmsbc_vxm 010011 1 ..... ..... 100 ..... 1010111 @r_vm_1
60
MICROCHIP_PFSOC_MMUART2,
82
61
MICROCHIP_PFSOC_MMUART3,
83
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
62
@@ -XXX,XX +XXX,XX @@ enum {
84
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
63
};
85
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
64
65
enum {
66
+ MICROCHIP_PFSOC_EMMC_SD_IRQ = 88,
67
MICROCHIP_PFSOC_MMUART0_IRQ = 90,
68
MICROCHIP_PFSOC_MMUART1_IRQ = 91,
69
MICROCHIP_PFSOC_MMUART2_IRQ = 92,
70
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
71
index XXXXXXX..XXXXXXX 100644
86
index XXXXXXX..XXXXXXX 100644
72
--- a/hw/riscv/microchip_pfsoc.c
87
--- a/target/riscv/insn_trans/trans_rvv.inc.c
73
+++ b/hw/riscv/microchip_pfsoc.c
88
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
74
@@ -XXX,XX +XXX,XX @@
89
@@ -XXX,XX +XXX,XX @@ GEN_OPIWX_WIDEN_TRANS(vwaddu_wx)
75
* 1) PLIC (Platform Level Interrupt Controller)
90
GEN_OPIWX_WIDEN_TRANS(vwadd_wx)
76
* 2) eNVM (Embedded Non-Volatile Memory)
91
GEN_OPIWX_WIDEN_TRANS(vwsubu_wx)
77
* 3) MMUARTs (Multi-Mode UART)
92
GEN_OPIWX_WIDEN_TRANS(vwsub_wx)
78
+ * 4) Cadence eMMC/SDHC controller and an SD card connected to it
93
+
79
*
94
+/* Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions */
80
* This board currently generates devicetree dynamically that indicates at least
95
+/* OPIVV without GVEC IR */
81
* two harts and up to five harts.
96
+#define GEN_OPIVV_TRANS(NAME, CHECK) \
82
@@ -XXX,XX +XXX,XX @@ static const struct MemmapEntry {
97
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
83
[MICROCHIP_PFSOC_MMUART0] = { 0x20000000, 0x1000 },
98
+{ \
84
[MICROCHIP_PFSOC_SYSREG] = { 0x20002000, 0x2000 },
99
+ if (CHECK(s, a)) { \
85
[MICROCHIP_PFSOC_MPUCFG] = { 0x20005000, 0x1000 },
100
+ uint32_t data = 0; \
86
+ [MICROCHIP_PFSOC_EMMC_SD] = { 0x20008000, 0x1000 },
101
+ static gen_helper_gvec_4_ptr * const fns[4] = { \
87
[MICROCHIP_PFSOC_MMUART1] = { 0x20100000, 0x1000 },
102
+ gen_helper_##NAME##_b, gen_helper_##NAME##_h, \
88
[MICROCHIP_PFSOC_MMUART2] = { 0x20102000, 0x1000 },
103
+ gen_helper_##NAME##_w, gen_helper_##NAME##_d, \
89
[MICROCHIP_PFSOC_MMUART3] = { 0x20104000, 0x1000 },
104
+ }; \
90
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_instance_init(Object *obj)
105
+ TCGLabel *over = gen_new_label(); \
91
qdev_prop_set_string(DEVICE(&s->u_cpus), "cpu-type",
106
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
92
TYPE_RISCV_CPU_SIFIVE_U54);
107
+ \
93
qdev_prop_set_uint64(DEVICE(&s->u_cpus), "resetvec", RESET_VECTOR);
108
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
94
+
109
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
95
+ object_initialize_child(obj, "sd-controller", &s->sdhci,
110
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
96
+ TYPE_CADENCE_SDHCI);
111
+ tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
112
+ vreg_ofs(s, a->rs1), \
113
+ vreg_ofs(s, a->rs2), cpu_env, 0, \
114
+ s->vlen / 8, data, fns[s->sew]); \
115
+ gen_set_label(over); \
116
+ return true; \
117
+ } \
118
+ return false; \
119
+}
120
+
121
+/*
122
+ * For vadc and vsbc, an illegal instruction exception is raised if the
123
+ * destination vector register is v0 and LMUL > 1. (Section 12.3)
124
+ */
125
+static bool opivv_vadc_check(DisasContext *s, arg_rmrr *a)
126
+{
127
+ return (vext_check_isa_ill(s) &&
128
+ vext_check_reg(s, a->rd, false) &&
129
+ vext_check_reg(s, a->rs2, false) &&
130
+ vext_check_reg(s, a->rs1, false) &&
131
+ ((a->rd != 0) || (s->lmul == 0)));
132
+}
133
+
134
+GEN_OPIVV_TRANS(vadc_vvm, opivv_vadc_check)
135
+GEN_OPIVV_TRANS(vsbc_vvm, opivv_vadc_check)
136
+
137
+/*
138
+ * For vmadc and vmsbc, an illegal instruction exception is raised if the
139
+ * destination vector register overlaps a source vector register group.
140
+ */
141
+static bool opivv_vmadc_check(DisasContext *s, arg_rmrr *a)
142
+{
143
+ return (vext_check_isa_ill(s) &&
144
+ vext_check_reg(s, a->rs2, false) &&
145
+ vext_check_reg(s, a->rs1, false) &&
146
+ vext_check_overlap_group(a->rd, 1, a->rs1, 1 << s->lmul) &&
147
+ vext_check_overlap_group(a->rd, 1, a->rs2, 1 << s->lmul));
148
+}
149
+
150
+GEN_OPIVV_TRANS(vmadc_vvm, opivv_vmadc_check)
151
+GEN_OPIVV_TRANS(vmsbc_vvm, opivv_vmadc_check)
152
+
153
+static bool opivx_vadc_check(DisasContext *s, arg_rmrr *a)
154
+{
155
+ return (vext_check_isa_ill(s) &&
156
+ vext_check_reg(s, a->rd, false) &&
157
+ vext_check_reg(s, a->rs2, false) &&
158
+ ((a->rd != 0) || (s->lmul == 0)));
159
+}
160
+
161
+/* OPIVX without GVEC IR */
162
+#define GEN_OPIVX_TRANS(NAME, CHECK) \
163
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
164
+{ \
165
+ if (CHECK(s, a)) { \
166
+ static gen_helper_opivx * const fns[4] = { \
167
+ gen_helper_##NAME##_b, gen_helper_##NAME##_h, \
168
+ gen_helper_##NAME##_w, gen_helper_##NAME##_d, \
169
+ }; \
170
+ \
171
+ return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fns[s->sew], s);\
172
+ } \
173
+ return false; \
174
+}
175
+
176
+GEN_OPIVX_TRANS(vadc_vxm, opivx_vadc_check)
177
+GEN_OPIVX_TRANS(vsbc_vxm, opivx_vadc_check)
178
+
179
+static bool opivx_vmadc_check(DisasContext *s, arg_rmrr *a)
180
+{
181
+ return (vext_check_isa_ill(s) &&
182
+ vext_check_reg(s, a->rs2, false) &&
183
+ vext_check_overlap_group(a->rd, 1, a->rs2, 1 << s->lmul));
184
+}
185
+
186
+GEN_OPIVX_TRANS(vmadc_vxm, opivx_vmadc_check)
187
+GEN_OPIVX_TRANS(vmsbc_vxm, opivx_vmadc_check)
188
+
189
+/* OPIVI without GVEC IR */
190
+#define GEN_OPIVI_TRANS(NAME, ZX, OPIVX, CHECK) \
191
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
192
+{ \
193
+ if (CHECK(s, a)) { \
194
+ static gen_helper_opivx * const fns[4] = { \
195
+ gen_helper_##OPIVX##_b, gen_helper_##OPIVX##_h, \
196
+ gen_helper_##OPIVX##_w, gen_helper_##OPIVX##_d, \
197
+ }; \
198
+ return opivi_trans(a->rd, a->rs1, a->rs2, a->vm, \
199
+ fns[s->sew], s, ZX); \
200
+ } \
201
+ return false; \
202
+}
203
+
204
+GEN_OPIVI_TRANS(vadc_vim, 0, vadc_vxm, opivx_vadc_check)
205
+GEN_OPIVI_TRANS(vmadc_vim, 0, vmadc_vxm, opivx_vmadc_check)
206
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
207
index XXXXXXX..XXXXXXX 100644
208
--- a/target/riscv/vector_helper.c
209
+++ b/target/riscv/vector_helper.c
210
@@ -XXX,XX +XXX,XX @@ static void clearq(void *vd, uint32_t idx, uint32_t cnt, uint32_t tot)
211
vext_clear(cur, cnt, tot);
97
}
212
}
98
213
99
static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
214
+static inline void vext_set_elem_mask(void *v0, int mlen, int index,
100
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
215
+ uint8_t value)
101
memmap[MICROCHIP_PFSOC_MPUCFG].base,
216
+{
102
memmap[MICROCHIP_PFSOC_MPUCFG].size);
217
+ int idx = (index * mlen) / 64;
103
218
+ int pos = (index * mlen) % 64;
104
+ /* SDHCI */
219
+ uint64_t old = ((uint64_t *)v0)[idx];
105
+ sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp);
220
+ ((uint64_t *)v0)[idx] = deposit64(old, pos, mlen, value);
106
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->sdhci), 0,
221
+}
107
+ memmap[MICROCHIP_PFSOC_EMMC_SD].base);
222
108
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
223
static inline int vext_elem_mask(void *v0, int mlen, int index)
109
+ qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_EMMC_SD_IRQ));
224
{
110
+
225
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX(vwadd_wx_w, 4, 8, clearq)
111
/* MMUARTs */
226
GEN_VEXT_VX(vwsub_wx_b, 1, 2, clearh)
112
s->serial0 = mchp_pfsoc_mmuart_create(system_memory,
227
GEN_VEXT_VX(vwsub_wx_h, 2, 4, clearl)
113
memmap[MICROCHIP_PFSOC_MMUART0].base,
228
GEN_VEXT_VX(vwsub_wx_w, 4, 8, clearq)
114
@@ -XXX,XX +XXX,XX @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
229
+
115
MicrochipIcicleKitState *s = MICROCHIP_ICICLE_KIT_MACHINE(machine);
230
+/* Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions */
116
MemoryRegion *system_memory = get_system_memory();
231
+#define DO_VADC(N, M, C) (N + M + C)
117
MemoryRegion *main_mem = g_new(MemoryRegion, 1);
232
+#define DO_VSBC(N, M, C) (N - M - C)
118
+ DriveInfo *dinfo = drive_get_next(IF_SD);
233
+
119
234
+#define GEN_VEXT_VADC_VVM(NAME, ETYPE, H, DO_OP, CLEAR_FN) \
120
/* Sanity check on RAM size */
235
+void HELPER(NAME)(void *vd, void *v0, void *vs1, void *vs2, \
121
if (machine->ram_size < mc->default_ram_size) {
236
+ CPURISCVState *env, uint32_t desc) \
122
@@ -XXX,XX +XXX,XX @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
237
+{ \
123
238
+ uint32_t mlen = vext_mlen(desc); \
124
/* Load the firmware */
239
+ uint32_t vl = env->vl; \
125
riscv_find_and_load_firmware(machine, BIOS_FILENAME, RESET_VECTOR, NULL);
240
+ uint32_t esz = sizeof(ETYPE); \
126
+
241
+ uint32_t vlmax = vext_maxsz(desc) / esz; \
127
+ /* Attach an SD card */
242
+ uint32_t i; \
128
+ if (dinfo) {
243
+ \
129
+ CadenceSDHCIState *sdhci = &(s->soc.sdhci);
244
+ for (i = 0; i < vl; i++) { \
130
+ DeviceState *card = qdev_new(TYPE_SD_CARD);
245
+ ETYPE s1 = *((ETYPE *)vs1 + H(i)); \
131
+
246
+ ETYPE s2 = *((ETYPE *)vs2 + H(i)); \
132
+ qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
247
+ uint8_t carry = vext_elem_mask(v0, mlen, i); \
133
+ &error_fatal);
248
+ \
134
+ qdev_realize_and_unref(card, sdhci->bus, &error_fatal);
249
+ *((ETYPE *)vd + H(i)) = DO_OP(s2, s1, carry); \
135
+ }
250
+ } \
136
}
251
+ CLEAR_FN(vd, vl, vl * esz, vlmax * esz); \
137
252
+}
138
static void microchip_icicle_kit_machine_class_init(ObjectClass *oc, void *data)
253
+
139
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
254
+GEN_VEXT_VADC_VVM(vadc_vvm_b, uint8_t, H1, DO_VADC, clearb)
140
index XXXXXXX..XXXXXXX 100644
255
+GEN_VEXT_VADC_VVM(vadc_vvm_h, uint16_t, H2, DO_VADC, clearh)
141
--- a/hw/riscv/Kconfig
256
+GEN_VEXT_VADC_VVM(vadc_vvm_w, uint32_t, H4, DO_VADC, clearl)
142
+++ b/hw/riscv/Kconfig
257
+GEN_VEXT_VADC_VVM(vadc_vvm_d, uint64_t, H8, DO_VADC, clearq)
143
@@ -XXX,XX +XXX,XX @@ config MICROCHIP_PFSOC
258
+
144
select SIFIVE
259
+GEN_VEXT_VADC_VVM(vsbc_vvm_b, uint8_t, H1, DO_VSBC, clearb)
145
select UNIMP
260
+GEN_VEXT_VADC_VVM(vsbc_vvm_h, uint16_t, H2, DO_VSBC, clearh)
146
select MCHP_PFSOC_MMUART
261
+GEN_VEXT_VADC_VVM(vsbc_vvm_w, uint32_t, H4, DO_VSBC, clearl)
147
+ select CADENCE_SDHCI
262
+GEN_VEXT_VADC_VVM(vsbc_vvm_d, uint64_t, H8, DO_VSBC, clearq)
263
+
264
+#define GEN_VEXT_VADC_VXM(NAME, ETYPE, H, DO_OP, CLEAR_FN) \
265
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, void *vs2, \
266
+ CPURISCVState *env, uint32_t desc) \
267
+{ \
268
+ uint32_t mlen = vext_mlen(desc); \
269
+ uint32_t vl = env->vl; \
270
+ uint32_t esz = sizeof(ETYPE); \
271
+ uint32_t vlmax = vext_maxsz(desc) / esz; \
272
+ uint32_t i; \
273
+ \
274
+ for (i = 0; i < vl; i++) { \
275
+ ETYPE s2 = *((ETYPE *)vs2 + H(i)); \
276
+ uint8_t carry = vext_elem_mask(v0, mlen, i); \
277
+ \
278
+ *((ETYPE *)vd + H(i)) = DO_OP(s2, (ETYPE)(target_long)s1, carry);\
279
+ } \
280
+ CLEAR_FN(vd, vl, vl * esz, vlmax * esz); \
281
+}
282
+
283
+GEN_VEXT_VADC_VXM(vadc_vxm_b, uint8_t, H1, DO_VADC, clearb)
284
+GEN_VEXT_VADC_VXM(vadc_vxm_h, uint16_t, H2, DO_VADC, clearh)
285
+GEN_VEXT_VADC_VXM(vadc_vxm_w, uint32_t, H4, DO_VADC, clearl)
286
+GEN_VEXT_VADC_VXM(vadc_vxm_d, uint64_t, H8, DO_VADC, clearq)
287
+
288
+GEN_VEXT_VADC_VXM(vsbc_vxm_b, uint8_t, H1, DO_VSBC, clearb)
289
+GEN_VEXT_VADC_VXM(vsbc_vxm_h, uint16_t, H2, DO_VSBC, clearh)
290
+GEN_VEXT_VADC_VXM(vsbc_vxm_w, uint32_t, H4, DO_VSBC, clearl)
291
+GEN_VEXT_VADC_VXM(vsbc_vxm_d, uint64_t, H8, DO_VSBC, clearq)
292
+
293
+#define DO_MADC(N, M, C) (C ? (__typeof(N))(N + M + 1) <= N : \
294
+ (__typeof(N))(N + M) < N)
295
+#define DO_MSBC(N, M, C) (C ? N <= M : N < M)
296
+
297
+#define GEN_VEXT_VMADC_VVM(NAME, ETYPE, H, DO_OP) \
298
+void HELPER(NAME)(void *vd, void *v0, void *vs1, void *vs2, \
299
+ CPURISCVState *env, uint32_t desc) \
300
+{ \
301
+ uint32_t mlen = vext_mlen(desc); \
302
+ uint32_t vl = env->vl; \
303
+ uint32_t vlmax = vext_maxsz(desc) / sizeof(ETYPE); \
304
+ uint32_t i; \
305
+ \
306
+ for (i = 0; i < vl; i++) { \
307
+ ETYPE s1 = *((ETYPE *)vs1 + H(i)); \
308
+ ETYPE s2 = *((ETYPE *)vs2 + H(i)); \
309
+ uint8_t carry = vext_elem_mask(v0, mlen, i); \
310
+ \
311
+ vext_set_elem_mask(vd, mlen, i, DO_OP(s2, s1, carry));\
312
+ } \
313
+ for (; i < vlmax; i++) { \
314
+ vext_set_elem_mask(vd, mlen, i, 0); \
315
+ } \
316
+}
317
+
318
+GEN_VEXT_VMADC_VVM(vmadc_vvm_b, uint8_t, H1, DO_MADC)
319
+GEN_VEXT_VMADC_VVM(vmadc_vvm_h, uint16_t, H2, DO_MADC)
320
+GEN_VEXT_VMADC_VVM(vmadc_vvm_w, uint32_t, H4, DO_MADC)
321
+GEN_VEXT_VMADC_VVM(vmadc_vvm_d, uint64_t, H8, DO_MADC)
322
+
323
+GEN_VEXT_VMADC_VVM(vmsbc_vvm_b, uint8_t, H1, DO_MSBC)
324
+GEN_VEXT_VMADC_VVM(vmsbc_vvm_h, uint16_t, H2, DO_MSBC)
325
+GEN_VEXT_VMADC_VVM(vmsbc_vvm_w, uint32_t, H4, DO_MSBC)
326
+GEN_VEXT_VMADC_VVM(vmsbc_vvm_d, uint64_t, H8, DO_MSBC)
327
+
328
+#define GEN_VEXT_VMADC_VXM(NAME, ETYPE, H, DO_OP) \
329
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, \
330
+ void *vs2, CPURISCVState *env, uint32_t desc) \
331
+{ \
332
+ uint32_t mlen = vext_mlen(desc); \
333
+ uint32_t vl = env->vl; \
334
+ uint32_t vlmax = vext_maxsz(desc) / sizeof(ETYPE); \
335
+ uint32_t i; \
336
+ \
337
+ for (i = 0; i < vl; i++) { \
338
+ ETYPE s2 = *((ETYPE *)vs2 + H(i)); \
339
+ uint8_t carry = vext_elem_mask(v0, mlen, i); \
340
+ \
341
+ vext_set_elem_mask(vd, mlen, i, \
342
+ DO_OP(s2, (ETYPE)(target_long)s1, carry)); \
343
+ } \
344
+ for (; i < vlmax; i++) { \
345
+ vext_set_elem_mask(vd, mlen, i, 0); \
346
+ } \
347
+}
348
+
349
+GEN_VEXT_VMADC_VXM(vmadc_vxm_b, uint8_t, H1, DO_MADC)
350
+GEN_VEXT_VMADC_VXM(vmadc_vxm_h, uint16_t, H2, DO_MADC)
351
+GEN_VEXT_VMADC_VXM(vmadc_vxm_w, uint32_t, H4, DO_MADC)
352
+GEN_VEXT_VMADC_VXM(vmadc_vxm_d, uint64_t, H8, DO_MADC)
353
+
354
+GEN_VEXT_VMADC_VXM(vmsbc_vxm_b, uint8_t, H1, DO_MSBC)
355
+GEN_VEXT_VMADC_VXM(vmsbc_vxm_h, uint16_t, H2, DO_MSBC)
356
+GEN_VEXT_VMADC_VXM(vmsbc_vxm_w, uint32_t, H4, DO_MSBC)
357
+GEN_VEXT_VMADC_VXM(vmsbc_vxm_d, uint64_t, H8, DO_MSBC)
148
--
358
--
149
2.28.0
359
2.27.0
150
360
151
361
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-14-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 25 ++++++++++++
10
target/riscv/insn32.decode | 9 +++++
11
target/riscv/insn_trans/trans_rvv.inc.c | 11 ++++++
12
target/riscv/vector_helper.c | 51 +++++++++++++++++++++++++
13
4 files changed, 96 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vmsbc_vxm_b, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vmsbc_vxm_h, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vmsbc_vxm_w, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vmsbc_vxm_d, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vand_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vand_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vand_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vand_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vor_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vor_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vor_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vor_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vxor_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vxor_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vxor_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vxor_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vand_vx_b, void, ptr, ptr, tl, ptr, env, i32)
37
+DEF_HELPER_6(vand_vx_h, void, ptr, ptr, tl, ptr, env, i32)
38
+DEF_HELPER_6(vand_vx_w, void, ptr, ptr, tl, ptr, env, i32)
39
+DEF_HELPER_6(vand_vx_d, void, ptr, ptr, tl, ptr, env, i32)
40
+DEF_HELPER_6(vor_vx_b, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vor_vx_h, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vor_vx_w, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vor_vx_d, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vxor_vx_b, void, ptr, ptr, tl, ptr, env, i32)
45
+DEF_HELPER_6(vxor_vx_h, void, ptr, ptr, tl, ptr, env, i32)
46
+DEF_HELPER_6(vxor_vx_w, void, ptr, ptr, tl, ptr, env, i32)
47
+DEF_HELPER_6(vxor_vx_d, void, ptr, ptr, tl, ptr, env, i32)
48
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
49
index XXXXXXX..XXXXXXX 100644
50
--- a/target/riscv/insn32.decode
51
+++ b/target/riscv/insn32.decode
52
@@ -XXX,XX +XXX,XX @@ vsbc_vvm 010010 1 ..... ..... 000 ..... 1010111 @r_vm_1
53
vsbc_vxm 010010 1 ..... ..... 100 ..... 1010111 @r_vm_1
54
vmsbc_vvm 010011 1 ..... ..... 000 ..... 1010111 @r_vm_1
55
vmsbc_vxm 010011 1 ..... ..... 100 ..... 1010111 @r_vm_1
56
+vand_vv 001001 . ..... ..... 000 ..... 1010111 @r_vm
57
+vand_vx 001001 . ..... ..... 100 ..... 1010111 @r_vm
58
+vand_vi 001001 . ..... ..... 011 ..... 1010111 @r_vm
59
+vor_vv 001010 . ..... ..... 000 ..... 1010111 @r_vm
60
+vor_vx 001010 . ..... ..... 100 ..... 1010111 @r_vm
61
+vor_vi 001010 . ..... ..... 011 ..... 1010111 @r_vm
62
+vxor_vv 001011 . ..... ..... 000 ..... 1010111 @r_vm
63
+vxor_vx 001011 . ..... ..... 100 ..... 1010111 @r_vm
64
+vxor_vi 001011 . ..... ..... 011 ..... 1010111 @r_vm
65
66
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
67
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
68
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/target/riscv/insn_trans/trans_rvv.inc.c
71
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
72
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
73
74
GEN_OPIVI_TRANS(vadc_vim, 0, vadc_vxm, opivx_vadc_check)
75
GEN_OPIVI_TRANS(vmadc_vim, 0, vmadc_vxm, opivx_vmadc_check)
76
+
77
+/* Vector Bitwise Logical Instructions */
78
+GEN_OPIVV_GVEC_TRANS(vand_vv, and)
79
+GEN_OPIVV_GVEC_TRANS(vor_vv, or)
80
+GEN_OPIVV_GVEC_TRANS(vxor_vv, xor)
81
+GEN_OPIVX_GVEC_TRANS(vand_vx, ands)
82
+GEN_OPIVX_GVEC_TRANS(vor_vx, ors)
83
+GEN_OPIVX_GVEC_TRANS(vxor_vx, xors)
84
+GEN_OPIVI_GVEC_TRANS(vand_vi, 0, vand_vx, andi)
85
+GEN_OPIVI_GVEC_TRANS(vor_vi, 0, vor_vx, ori)
86
+GEN_OPIVI_GVEC_TRANS(vxor_vi, 0, vxor_vx, xori)
87
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
88
index XXXXXXX..XXXXXXX 100644
89
--- a/target/riscv/vector_helper.c
90
+++ b/target/riscv/vector_helper.c
91
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VMADC_VXM(vmsbc_vxm_b, uint8_t, H1, DO_MSBC)
92
GEN_VEXT_VMADC_VXM(vmsbc_vxm_h, uint16_t, H2, DO_MSBC)
93
GEN_VEXT_VMADC_VXM(vmsbc_vxm_w, uint32_t, H4, DO_MSBC)
94
GEN_VEXT_VMADC_VXM(vmsbc_vxm_d, uint64_t, H8, DO_MSBC)
95
+
96
+/* Vector Bitwise Logical Instructions */
97
+RVVCALL(OPIVV2, vand_vv_b, OP_SSS_B, H1, H1, H1, DO_AND)
98
+RVVCALL(OPIVV2, vand_vv_h, OP_SSS_H, H2, H2, H2, DO_AND)
99
+RVVCALL(OPIVV2, vand_vv_w, OP_SSS_W, H4, H4, H4, DO_AND)
100
+RVVCALL(OPIVV2, vand_vv_d, OP_SSS_D, H8, H8, H8, DO_AND)
101
+RVVCALL(OPIVV2, vor_vv_b, OP_SSS_B, H1, H1, H1, DO_OR)
102
+RVVCALL(OPIVV2, vor_vv_h, OP_SSS_H, H2, H2, H2, DO_OR)
103
+RVVCALL(OPIVV2, vor_vv_w, OP_SSS_W, H4, H4, H4, DO_OR)
104
+RVVCALL(OPIVV2, vor_vv_d, OP_SSS_D, H8, H8, H8, DO_OR)
105
+RVVCALL(OPIVV2, vxor_vv_b, OP_SSS_B, H1, H1, H1, DO_XOR)
106
+RVVCALL(OPIVV2, vxor_vv_h, OP_SSS_H, H2, H2, H2, DO_XOR)
107
+RVVCALL(OPIVV2, vxor_vv_w, OP_SSS_W, H4, H4, H4, DO_XOR)
108
+RVVCALL(OPIVV2, vxor_vv_d, OP_SSS_D, H8, H8, H8, DO_XOR)
109
+GEN_VEXT_VV(vand_vv_b, 1, 1, clearb)
110
+GEN_VEXT_VV(vand_vv_h, 2, 2, clearh)
111
+GEN_VEXT_VV(vand_vv_w, 4, 4, clearl)
112
+GEN_VEXT_VV(vand_vv_d, 8, 8, clearq)
113
+GEN_VEXT_VV(vor_vv_b, 1, 1, clearb)
114
+GEN_VEXT_VV(vor_vv_h, 2, 2, clearh)
115
+GEN_VEXT_VV(vor_vv_w, 4, 4, clearl)
116
+GEN_VEXT_VV(vor_vv_d, 8, 8, clearq)
117
+GEN_VEXT_VV(vxor_vv_b, 1, 1, clearb)
118
+GEN_VEXT_VV(vxor_vv_h, 2, 2, clearh)
119
+GEN_VEXT_VV(vxor_vv_w, 4, 4, clearl)
120
+GEN_VEXT_VV(vxor_vv_d, 8, 8, clearq)
121
+
122
+RVVCALL(OPIVX2, vand_vx_b, OP_SSS_B, H1, H1, DO_AND)
123
+RVVCALL(OPIVX2, vand_vx_h, OP_SSS_H, H2, H2, DO_AND)
124
+RVVCALL(OPIVX2, vand_vx_w, OP_SSS_W, H4, H4, DO_AND)
125
+RVVCALL(OPIVX2, vand_vx_d, OP_SSS_D, H8, H8, DO_AND)
126
+RVVCALL(OPIVX2, vor_vx_b, OP_SSS_B, H1, H1, DO_OR)
127
+RVVCALL(OPIVX2, vor_vx_h, OP_SSS_H, H2, H2, DO_OR)
128
+RVVCALL(OPIVX2, vor_vx_w, OP_SSS_W, H4, H4, DO_OR)
129
+RVVCALL(OPIVX2, vor_vx_d, OP_SSS_D, H8, H8, DO_OR)
130
+RVVCALL(OPIVX2, vxor_vx_b, OP_SSS_B, H1, H1, DO_XOR)
131
+RVVCALL(OPIVX2, vxor_vx_h, OP_SSS_H, H2, H2, DO_XOR)
132
+RVVCALL(OPIVX2, vxor_vx_w, OP_SSS_W, H4, H4, DO_XOR)
133
+RVVCALL(OPIVX2, vxor_vx_d, OP_SSS_D, H8, H8, DO_XOR)
134
+GEN_VEXT_VX(vand_vx_b, 1, 1, clearb)
135
+GEN_VEXT_VX(vand_vx_h, 2, 2, clearh)
136
+GEN_VEXT_VX(vand_vx_w, 4, 4, clearl)
137
+GEN_VEXT_VX(vand_vx_d, 8, 8, clearq)
138
+GEN_VEXT_VX(vor_vx_b, 1, 1, clearb)
139
+GEN_VEXT_VX(vor_vx_h, 2, 2, clearh)
140
+GEN_VEXT_VX(vor_vx_w, 4, 4, clearl)
141
+GEN_VEXT_VX(vor_vx_d, 8, 8, clearq)
142
+GEN_VEXT_VX(vxor_vx_b, 1, 1, clearb)
143
+GEN_VEXT_VX(vxor_vx_h, 2, 2, clearh)
144
+GEN_VEXT_VX(vxor_vx_w, 4, 4, clearl)
145
+GEN_VEXT_VX(vxor_vx_d, 8, 8, clearq)
146
--
147
2.27.0
148
149
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-15-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 25 ++++++++
10
target/riscv/insn32.decode | 9 +++
11
target/riscv/insn_trans/trans_rvv.inc.c | 52 ++++++++++++++++
12
target/riscv/vector_helper.c | 79 +++++++++++++++++++++++++
13
4 files changed, 165 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vxor_vx_b, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vxor_vx_h, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vxor_vx_w, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vxor_vx_d, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vsll_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vsll_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vsll_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vsll_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vsrl_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vsrl_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vsrl_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vsrl_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vsra_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vsra_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vsra_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vsra_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vsll_vx_b, void, ptr, ptr, tl, ptr, env, i32)
37
+DEF_HELPER_6(vsll_vx_h, void, ptr, ptr, tl, ptr, env, i32)
38
+DEF_HELPER_6(vsll_vx_w, void, ptr, ptr, tl, ptr, env, i32)
39
+DEF_HELPER_6(vsll_vx_d, void, ptr, ptr, tl, ptr, env, i32)
40
+DEF_HELPER_6(vsrl_vx_b, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vsrl_vx_h, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vsrl_vx_w, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vsrl_vx_d, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vsra_vx_b, void, ptr, ptr, tl, ptr, env, i32)
45
+DEF_HELPER_6(vsra_vx_h, void, ptr, ptr, tl, ptr, env, i32)
46
+DEF_HELPER_6(vsra_vx_w, void, ptr, ptr, tl, ptr, env, i32)
47
+DEF_HELPER_6(vsra_vx_d, void, ptr, ptr, tl, ptr, env, i32)
48
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
49
index XXXXXXX..XXXXXXX 100644
50
--- a/target/riscv/insn32.decode
51
+++ b/target/riscv/insn32.decode
52
@@ -XXX,XX +XXX,XX @@ vor_vi 001010 . ..... ..... 011 ..... 1010111 @r_vm
53
vxor_vv 001011 . ..... ..... 000 ..... 1010111 @r_vm
54
vxor_vx 001011 . ..... ..... 100 ..... 1010111 @r_vm
55
vxor_vi 001011 . ..... ..... 011 ..... 1010111 @r_vm
56
+vsll_vv 100101 . ..... ..... 000 ..... 1010111 @r_vm
57
+vsll_vx 100101 . ..... ..... 100 ..... 1010111 @r_vm
58
+vsll_vi 100101 . ..... ..... 011 ..... 1010111 @r_vm
59
+vsrl_vv 101000 . ..... ..... 000 ..... 1010111 @r_vm
60
+vsrl_vx 101000 . ..... ..... 100 ..... 1010111 @r_vm
61
+vsrl_vi 101000 . ..... ..... 011 ..... 1010111 @r_vm
62
+vsra_vv 101001 . ..... ..... 000 ..... 1010111 @r_vm
63
+vsra_vx 101001 . ..... ..... 100 ..... 1010111 @r_vm
64
+vsra_vi 101001 . ..... ..... 011 ..... 1010111 @r_vm
65
66
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
67
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
68
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/target/riscv/insn_trans/trans_rvv.inc.c
71
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
72
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_GVEC_TRANS(vxor_vx, xors)
73
GEN_OPIVI_GVEC_TRANS(vand_vi, 0, vand_vx, andi)
74
GEN_OPIVI_GVEC_TRANS(vor_vi, 0, vor_vx, ori)
75
GEN_OPIVI_GVEC_TRANS(vxor_vi, 0, vxor_vx, xori)
76
+
77
+/* Vector Single-Width Bit Shift Instructions */
78
+GEN_OPIVV_GVEC_TRANS(vsll_vv, shlv)
79
+GEN_OPIVV_GVEC_TRANS(vsrl_vv, shrv)
80
+GEN_OPIVV_GVEC_TRANS(vsra_vv, sarv)
81
+
82
+typedef void GVecGen2sFn32(unsigned, uint32_t, uint32_t, TCGv_i32,
83
+ uint32_t, uint32_t);
84
+
85
+static inline bool
86
+do_opivx_gvec_shift(DisasContext *s, arg_rmrr *a, GVecGen2sFn32 *gvec_fn,
87
+ gen_helper_opivx *fn)
88
+{
89
+ if (!opivx_check(s, a)) {
90
+ return false;
91
+ }
92
+
93
+ if (a->vm && s->vl_eq_vlmax) {
94
+ TCGv_i32 src1 = tcg_temp_new_i32();
95
+ TCGv tmp = tcg_temp_new();
96
+
97
+ gen_get_gpr(tmp, a->rs1);
98
+ tcg_gen_trunc_tl_i32(src1, tmp);
99
+ tcg_gen_extract_i32(src1, src1, 0, s->sew + 3);
100
+ gvec_fn(s->sew, vreg_ofs(s, a->rd), vreg_ofs(s, a->rs2),
101
+ src1, MAXSZ(s), MAXSZ(s));
102
+
103
+ tcg_temp_free_i32(src1);
104
+ tcg_temp_free(tmp);
105
+ return true;
106
+ }
107
+ return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fn, s);
108
+}
109
+
110
+#define GEN_OPIVX_GVEC_SHIFT_TRANS(NAME, SUF) \
111
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
112
+{ \
113
+ static gen_helper_opivx * const fns[4] = { \
114
+ gen_helper_##NAME##_b, gen_helper_##NAME##_h, \
115
+ gen_helper_##NAME##_w, gen_helper_##NAME##_d, \
116
+ }; \
117
+ \
118
+ return do_opivx_gvec_shift(s, a, tcg_gen_gvec_##SUF, fns[s->sew]); \
119
+}
120
+
121
+GEN_OPIVX_GVEC_SHIFT_TRANS(vsll_vx, shls)
122
+GEN_OPIVX_GVEC_SHIFT_TRANS(vsrl_vx, shrs)
123
+GEN_OPIVX_GVEC_SHIFT_TRANS(vsra_vx, sars)
124
+
125
+GEN_OPIVI_GVEC_TRANS(vsll_vi, 1, vsll_vx, shli)
126
+GEN_OPIVI_GVEC_TRANS(vsrl_vi, 1, vsrl_vx, shri)
127
+GEN_OPIVI_GVEC_TRANS(vsra_vi, 1, vsra_vx, sari)
128
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
129
index XXXXXXX..XXXXXXX 100644
130
--- a/target/riscv/vector_helper.c
131
+++ b/target/riscv/vector_helper.c
132
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX(vxor_vx_b, 1, 1, clearb)
133
GEN_VEXT_VX(vxor_vx_h, 2, 2, clearh)
134
GEN_VEXT_VX(vxor_vx_w, 4, 4, clearl)
135
GEN_VEXT_VX(vxor_vx_d, 8, 8, clearq)
136
+
137
+/* Vector Single-Width Bit Shift Instructions */
138
+#define DO_SLL(N, M) (N << (M))
139
+#define DO_SRL(N, M) (N >> (M))
140
+
141
+/* generate the helpers for shift instructions with two vector operators */
142
+#define GEN_VEXT_SHIFT_VV(NAME, TS1, TS2, HS1, HS2, OP, MASK, CLEAR_FN) \
143
+void HELPER(NAME)(void *vd, void *v0, void *vs1, \
144
+ void *vs2, CPURISCVState *env, uint32_t desc) \
145
+{ \
146
+ uint32_t mlen = vext_mlen(desc); \
147
+ uint32_t vm = vext_vm(desc); \
148
+ uint32_t vl = env->vl; \
149
+ uint32_t esz = sizeof(TS1); \
150
+ uint32_t vlmax = vext_maxsz(desc) / esz; \
151
+ uint32_t i; \
152
+ \
153
+ for (i = 0; i < vl; i++) { \
154
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
155
+ continue; \
156
+ } \
157
+ TS1 s1 = *((TS1 *)vs1 + HS1(i)); \
158
+ TS2 s2 = *((TS2 *)vs2 + HS2(i)); \
159
+ *((TS1 *)vd + HS1(i)) = OP(s2, s1 & MASK); \
160
+ } \
161
+ CLEAR_FN(vd, vl, vl * esz, vlmax * esz); \
162
+}
163
+
164
+GEN_VEXT_SHIFT_VV(vsll_vv_b, uint8_t, uint8_t, H1, H1, DO_SLL, 0x7, clearb)
165
+GEN_VEXT_SHIFT_VV(vsll_vv_h, uint16_t, uint16_t, H2, H2, DO_SLL, 0xf, clearh)
166
+GEN_VEXT_SHIFT_VV(vsll_vv_w, uint32_t, uint32_t, H4, H4, DO_SLL, 0x1f, clearl)
167
+GEN_VEXT_SHIFT_VV(vsll_vv_d, uint64_t, uint64_t, H8, H8, DO_SLL, 0x3f, clearq)
168
+
169
+GEN_VEXT_SHIFT_VV(vsrl_vv_b, uint8_t, uint8_t, H1, H1, DO_SRL, 0x7, clearb)
170
+GEN_VEXT_SHIFT_VV(vsrl_vv_h, uint16_t, uint16_t, H2, H2, DO_SRL, 0xf, clearh)
171
+GEN_VEXT_SHIFT_VV(vsrl_vv_w, uint32_t, uint32_t, H4, H4, DO_SRL, 0x1f, clearl)
172
+GEN_VEXT_SHIFT_VV(vsrl_vv_d, uint64_t, uint64_t, H8, H8, DO_SRL, 0x3f, clearq)
173
+
174
+GEN_VEXT_SHIFT_VV(vsra_vv_b, uint8_t, int8_t, H1, H1, DO_SRL, 0x7, clearb)
175
+GEN_VEXT_SHIFT_VV(vsra_vv_h, uint16_t, int16_t, H2, H2, DO_SRL, 0xf, clearh)
176
+GEN_VEXT_SHIFT_VV(vsra_vv_w, uint32_t, int32_t, H4, H4, DO_SRL, 0x1f, clearl)
177
+GEN_VEXT_SHIFT_VV(vsra_vv_d, uint64_t, int64_t, H8, H8, DO_SRL, 0x3f, clearq)
178
+
179
+/* generate the helpers for shift instructions with one vector and one scalar */
180
+#define GEN_VEXT_SHIFT_VX(NAME, TD, TS2, HD, HS2, OP, MASK, CLEAR_FN) \
181
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, \
182
+ void *vs2, CPURISCVState *env, uint32_t desc) \
183
+{ \
184
+ uint32_t mlen = vext_mlen(desc); \
185
+ uint32_t vm = vext_vm(desc); \
186
+ uint32_t vl = env->vl; \
187
+ uint32_t esz = sizeof(TD); \
188
+ uint32_t vlmax = vext_maxsz(desc) / esz; \
189
+ uint32_t i; \
190
+ \
191
+ for (i = 0; i < vl; i++) { \
192
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
193
+ continue; \
194
+ } \
195
+ TS2 s2 = *((TS2 *)vs2 + HS2(i)); \
196
+ *((TD *)vd + HD(i)) = OP(s2, s1 & MASK); \
197
+ } \
198
+ CLEAR_FN(vd, vl, vl * esz, vlmax * esz); \
199
+}
200
+
201
+GEN_VEXT_SHIFT_VX(vsll_vx_b, uint8_t, int8_t, H1, H1, DO_SLL, 0x7, clearb)
202
+GEN_VEXT_SHIFT_VX(vsll_vx_h, uint16_t, int16_t, H2, H2, DO_SLL, 0xf, clearh)
203
+GEN_VEXT_SHIFT_VX(vsll_vx_w, uint32_t, int32_t, H4, H4, DO_SLL, 0x1f, clearl)
204
+GEN_VEXT_SHIFT_VX(vsll_vx_d, uint64_t, int64_t, H8, H8, DO_SLL, 0x3f, clearq)
205
+
206
+GEN_VEXT_SHIFT_VX(vsrl_vx_b, uint8_t, uint8_t, H1, H1, DO_SRL, 0x7, clearb)
207
+GEN_VEXT_SHIFT_VX(vsrl_vx_h, uint16_t, uint16_t, H2, H2, DO_SRL, 0xf, clearh)
208
+GEN_VEXT_SHIFT_VX(vsrl_vx_w, uint32_t, uint32_t, H4, H4, DO_SRL, 0x1f, clearl)
209
+GEN_VEXT_SHIFT_VX(vsrl_vx_d, uint64_t, uint64_t, H8, H8, DO_SRL, 0x3f, clearq)
210
+
211
+GEN_VEXT_SHIFT_VX(vsra_vx_b, int8_t, int8_t, H1, H1, DO_SRL, 0x7, clearb)
212
+GEN_VEXT_SHIFT_VX(vsra_vx_h, int16_t, int16_t, H2, H2, DO_SRL, 0xf, clearh)
213
+GEN_VEXT_SHIFT_VX(vsra_vx_w, int32_t, int32_t, H4, H4, DO_SRL, 0x1f, clearl)
214
+GEN_VEXT_SHIFT_VX(vsra_vx_d, int64_t, int64_t, H8, H8, DO_SRL, 0x3f, clearq)
215
--
216
2.27.0
217
218
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-16-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 13 ++++
10
target/riscv/insn32.decode | 6 ++
11
target/riscv/insn_trans/trans_rvv.inc.c | 90 +++++++++++++++++++++++++
12
target/riscv/vector_helper.c | 14 ++++
13
4 files changed, 123 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vsra_vx_b, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vsra_vx_h, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vsra_vx_w, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vsra_vx_d, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vnsrl_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vnsrl_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vnsrl_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vnsra_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vnsra_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vnsra_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vnsrl_vx_b, void, ptr, ptr, tl, ptr, env, i32)
31
+DEF_HELPER_6(vnsrl_vx_h, void, ptr, ptr, tl, ptr, env, i32)
32
+DEF_HELPER_6(vnsrl_vx_w, void, ptr, ptr, tl, ptr, env, i32)
33
+DEF_HELPER_6(vnsra_vx_b, void, ptr, ptr, tl, ptr, env, i32)
34
+DEF_HELPER_6(vnsra_vx_h, void, ptr, ptr, tl, ptr, env, i32)
35
+DEF_HELPER_6(vnsra_vx_w, void, ptr, ptr, tl, ptr, env, i32)
36
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/riscv/insn32.decode
39
+++ b/target/riscv/insn32.decode
40
@@ -XXX,XX +XXX,XX @@ vsrl_vi 101000 . ..... ..... 011 ..... 1010111 @r_vm
41
vsra_vv 101001 . ..... ..... 000 ..... 1010111 @r_vm
42
vsra_vx 101001 . ..... ..... 100 ..... 1010111 @r_vm
43
vsra_vi 101001 . ..... ..... 011 ..... 1010111 @r_vm
44
+vnsrl_vv 101100 . ..... ..... 000 ..... 1010111 @r_vm
45
+vnsrl_vx 101100 . ..... ..... 100 ..... 1010111 @r_vm
46
+vnsrl_vi 101100 . ..... ..... 011 ..... 1010111 @r_vm
47
+vnsra_vv 101101 . ..... ..... 000 ..... 1010111 @r_vm
48
+vnsra_vx 101101 . ..... ..... 100 ..... 1010111 @r_vm
49
+vnsra_vi 101101 . ..... ..... 011 ..... 1010111 @r_vm
50
51
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
52
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
53
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/target/riscv/insn_trans/trans_rvv.inc.c
56
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
57
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_GVEC_SHIFT_TRANS(vsra_vx, sars)
58
GEN_OPIVI_GVEC_TRANS(vsll_vi, 1, vsll_vx, shli)
59
GEN_OPIVI_GVEC_TRANS(vsrl_vi, 1, vsrl_vx, shri)
60
GEN_OPIVI_GVEC_TRANS(vsra_vi, 1, vsra_vx, sari)
61
+
62
+/* Vector Narrowing Integer Right Shift Instructions */
63
+static bool opivv_narrow_check(DisasContext *s, arg_rmrr *a)
64
+{
65
+ return (vext_check_isa_ill(s) &&
66
+ vext_check_overlap_mask(s, a->rd, a->vm, false) &&
67
+ vext_check_reg(s, a->rd, false) &&
68
+ vext_check_reg(s, a->rs2, true) &&
69
+ vext_check_reg(s, a->rs1, false) &&
70
+ vext_check_overlap_group(a->rd, 1 << s->lmul, a->rs2,
71
+ 2 << s->lmul) &&
72
+ (s->lmul < 0x3) && (s->sew < 0x3));
73
+}
74
+
75
+/* OPIVV with NARROW */
76
+#define GEN_OPIVV_NARROW_TRANS(NAME) \
77
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
78
+{ \
79
+ if (opivv_narrow_check(s, a)) { \
80
+ uint32_t data = 0; \
81
+ static gen_helper_gvec_4_ptr * const fns[3] = { \
82
+ gen_helper_##NAME##_b, \
83
+ gen_helper_##NAME##_h, \
84
+ gen_helper_##NAME##_w, \
85
+ }; \
86
+ TCGLabel *over = gen_new_label(); \
87
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
88
+ \
89
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
90
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
91
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
92
+ tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
93
+ vreg_ofs(s, a->rs1), \
94
+ vreg_ofs(s, a->rs2), cpu_env, 0, \
95
+ s->vlen / 8, data, fns[s->sew]); \
96
+ gen_set_label(over); \
97
+ return true; \
98
+ } \
99
+ return false; \
100
+}
101
+GEN_OPIVV_NARROW_TRANS(vnsra_vv)
102
+GEN_OPIVV_NARROW_TRANS(vnsrl_vv)
103
+
104
+static bool opivx_narrow_check(DisasContext *s, arg_rmrr *a)
105
+{
106
+ return (vext_check_isa_ill(s) &&
107
+ vext_check_overlap_mask(s, a->rd, a->vm, false) &&
108
+ vext_check_reg(s, a->rd, false) &&
109
+ vext_check_reg(s, a->rs2, true) &&
110
+ vext_check_overlap_group(a->rd, 1 << s->lmul, a->rs2,
111
+ 2 << s->lmul) &&
112
+ (s->lmul < 0x3) && (s->sew < 0x3));
113
+}
114
+
115
+/* OPIVX with NARROW */
116
+#define GEN_OPIVX_NARROW_TRANS(NAME) \
117
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
118
+{ \
119
+ if (opivx_narrow_check(s, a)) { \
120
+ static gen_helper_opivx * const fns[3] = { \
121
+ gen_helper_##NAME##_b, \
122
+ gen_helper_##NAME##_h, \
123
+ gen_helper_##NAME##_w, \
124
+ }; \
125
+ return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fns[s->sew], s);\
126
+ } \
127
+ return false; \
128
+}
129
+
130
+GEN_OPIVX_NARROW_TRANS(vnsra_vx)
131
+GEN_OPIVX_NARROW_TRANS(vnsrl_vx)
132
+
133
+/* OPIVI with NARROW */
134
+#define GEN_OPIVI_NARROW_TRANS(NAME, ZX, OPIVX) \
135
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
136
+{ \
137
+ if (opivx_narrow_check(s, a)) { \
138
+ static gen_helper_opivx * const fns[3] = { \
139
+ gen_helper_##OPIVX##_b, \
140
+ gen_helper_##OPIVX##_h, \
141
+ gen_helper_##OPIVX##_w, \
142
+ }; \
143
+ return opivi_trans(a->rd, a->rs1, a->rs2, a->vm, \
144
+ fns[s->sew], s, ZX); \
145
+ } \
146
+ return false; \
147
+}
148
+
149
+GEN_OPIVI_NARROW_TRANS(vnsra_vi, 1, vnsra_vx)
150
+GEN_OPIVI_NARROW_TRANS(vnsrl_vi, 1, vnsrl_vx)
151
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
152
index XXXXXXX..XXXXXXX 100644
153
--- a/target/riscv/vector_helper.c
154
+++ b/target/riscv/vector_helper.c
155
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_SHIFT_VX(vsra_vx_b, int8_t, int8_t, H1, H1, DO_SRL, 0x7, clearb)
156
GEN_VEXT_SHIFT_VX(vsra_vx_h, int16_t, int16_t, H2, H2, DO_SRL, 0xf, clearh)
157
GEN_VEXT_SHIFT_VX(vsra_vx_w, int32_t, int32_t, H4, H4, DO_SRL, 0x1f, clearl)
158
GEN_VEXT_SHIFT_VX(vsra_vx_d, int64_t, int64_t, H8, H8, DO_SRL, 0x3f, clearq)
159
+
160
+/* Vector Narrowing Integer Right Shift Instructions */
161
+GEN_VEXT_SHIFT_VV(vnsrl_vv_b, uint8_t, uint16_t, H1, H2, DO_SRL, 0xf, clearb)
162
+GEN_VEXT_SHIFT_VV(vnsrl_vv_h, uint16_t, uint32_t, H2, H4, DO_SRL, 0x1f, clearh)
163
+GEN_VEXT_SHIFT_VV(vnsrl_vv_w, uint32_t, uint64_t, H4, H8, DO_SRL, 0x3f, clearl)
164
+GEN_VEXT_SHIFT_VV(vnsra_vv_b, uint8_t, int16_t, H1, H2, DO_SRL, 0xf, clearb)
165
+GEN_VEXT_SHIFT_VV(vnsra_vv_h, uint16_t, int32_t, H2, H4, DO_SRL, 0x1f, clearh)
166
+GEN_VEXT_SHIFT_VV(vnsra_vv_w, uint32_t, int64_t, H4, H8, DO_SRL, 0x3f, clearl)
167
+GEN_VEXT_SHIFT_VX(vnsrl_vx_b, uint8_t, uint16_t, H1, H2, DO_SRL, 0xf, clearb)
168
+GEN_VEXT_SHIFT_VX(vnsrl_vx_h, uint16_t, uint32_t, H2, H4, DO_SRL, 0x1f, clearh)
169
+GEN_VEXT_SHIFT_VX(vnsrl_vx_w, uint32_t, uint64_t, H4, H8, DO_SRL, 0x3f, clearl)
170
+GEN_VEXT_SHIFT_VX(vnsra_vx_b, int8_t, int16_t, H1, H2, DO_SRL, 0xf, clearb)
171
+GEN_VEXT_SHIFT_VX(vnsra_vx_h, int16_t, int32_t, H2, H4, DO_SRL, 0x1f, clearh)
172
+GEN_VEXT_SHIFT_VX(vnsra_vx_w, int32_t, int64_t, H4, H8, DO_SRL, 0x3f, clearl)
173
--
174
2.27.0
175
176
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-17-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 57 +++++++++++
10
target/riscv/insn32.decode | 20 ++++
11
target/riscv/insn_trans/trans_rvv.inc.c | 46 +++++++++
12
target/riscv/vector_helper.c | 123 ++++++++++++++++++++++++
13
4 files changed, 246 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vnsrl_vx_w, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vnsra_vx_b, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vnsra_vx_h, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vnsra_vx_w, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vmseq_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vmseq_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vmseq_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vmseq_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vmsne_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vmsne_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vmsne_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vmsne_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vmsltu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vmsltu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vmsltu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vmsltu_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vmslt_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
37
+DEF_HELPER_6(vmslt_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
38
+DEF_HELPER_6(vmslt_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
39
+DEF_HELPER_6(vmslt_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
40
+DEF_HELPER_6(vmsleu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
41
+DEF_HELPER_6(vmsleu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
42
+DEF_HELPER_6(vmsleu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
43
+DEF_HELPER_6(vmsleu_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
44
+DEF_HELPER_6(vmsle_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
45
+DEF_HELPER_6(vmsle_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
46
+DEF_HELPER_6(vmsle_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
47
+DEF_HELPER_6(vmsle_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
48
+DEF_HELPER_6(vmseq_vx_b, void, ptr, ptr, tl, ptr, env, i32)
49
+DEF_HELPER_6(vmseq_vx_h, void, ptr, ptr, tl, ptr, env, i32)
50
+DEF_HELPER_6(vmseq_vx_w, void, ptr, ptr, tl, ptr, env, i32)
51
+DEF_HELPER_6(vmseq_vx_d, void, ptr, ptr, tl, ptr, env, i32)
52
+DEF_HELPER_6(vmsne_vx_b, void, ptr, ptr, tl, ptr, env, i32)
53
+DEF_HELPER_6(vmsne_vx_h, void, ptr, ptr, tl, ptr, env, i32)
54
+DEF_HELPER_6(vmsne_vx_w, void, ptr, ptr, tl, ptr, env, i32)
55
+DEF_HELPER_6(vmsne_vx_d, void, ptr, ptr, tl, ptr, env, i32)
56
+DEF_HELPER_6(vmsltu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
57
+DEF_HELPER_6(vmsltu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
58
+DEF_HELPER_6(vmsltu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
59
+DEF_HELPER_6(vmsltu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
60
+DEF_HELPER_6(vmslt_vx_b, void, ptr, ptr, tl, ptr, env, i32)
61
+DEF_HELPER_6(vmslt_vx_h, void, ptr, ptr, tl, ptr, env, i32)
62
+DEF_HELPER_6(vmslt_vx_w, void, ptr, ptr, tl, ptr, env, i32)
63
+DEF_HELPER_6(vmslt_vx_d, void, ptr, ptr, tl, ptr, env, i32)
64
+DEF_HELPER_6(vmsleu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
65
+DEF_HELPER_6(vmsleu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
66
+DEF_HELPER_6(vmsleu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
67
+DEF_HELPER_6(vmsleu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
68
+DEF_HELPER_6(vmsle_vx_b, void, ptr, ptr, tl, ptr, env, i32)
69
+DEF_HELPER_6(vmsle_vx_h, void, ptr, ptr, tl, ptr, env, i32)
70
+DEF_HELPER_6(vmsle_vx_w, void, ptr, ptr, tl, ptr, env, i32)
71
+DEF_HELPER_6(vmsle_vx_d, void, ptr, ptr, tl, ptr, env, i32)
72
+DEF_HELPER_6(vmsgtu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
73
+DEF_HELPER_6(vmsgtu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
74
+DEF_HELPER_6(vmsgtu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
75
+DEF_HELPER_6(vmsgtu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
76
+DEF_HELPER_6(vmsgt_vx_b, void, ptr, ptr, tl, ptr, env, i32)
77
+DEF_HELPER_6(vmsgt_vx_h, void, ptr, ptr, tl, ptr, env, i32)
78
+DEF_HELPER_6(vmsgt_vx_w, void, ptr, ptr, tl, ptr, env, i32)
79
+DEF_HELPER_6(vmsgt_vx_d, void, ptr, ptr, tl, ptr, env, i32)
80
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
81
index XXXXXXX..XXXXXXX 100644
82
--- a/target/riscv/insn32.decode
83
+++ b/target/riscv/insn32.decode
84
@@ -XXX,XX +XXX,XX @@ vnsrl_vi 101100 . ..... ..... 011 ..... 1010111 @r_vm
85
vnsra_vv 101101 . ..... ..... 000 ..... 1010111 @r_vm
86
vnsra_vx 101101 . ..... ..... 100 ..... 1010111 @r_vm
87
vnsra_vi 101101 . ..... ..... 011 ..... 1010111 @r_vm
88
+vmseq_vv 011000 . ..... ..... 000 ..... 1010111 @r_vm
89
+vmseq_vx 011000 . ..... ..... 100 ..... 1010111 @r_vm
90
+vmseq_vi 011000 . ..... ..... 011 ..... 1010111 @r_vm
91
+vmsne_vv 011001 . ..... ..... 000 ..... 1010111 @r_vm
92
+vmsne_vx 011001 . ..... ..... 100 ..... 1010111 @r_vm
93
+vmsne_vi 011001 . ..... ..... 011 ..... 1010111 @r_vm
94
+vmsltu_vv 011010 . ..... ..... 000 ..... 1010111 @r_vm
95
+vmsltu_vx 011010 . ..... ..... 100 ..... 1010111 @r_vm
96
+vmslt_vv 011011 . ..... ..... 000 ..... 1010111 @r_vm
97
+vmslt_vx 011011 . ..... ..... 100 ..... 1010111 @r_vm
98
+vmsleu_vv 011100 . ..... ..... 000 ..... 1010111 @r_vm
99
+vmsleu_vx 011100 . ..... ..... 100 ..... 1010111 @r_vm
100
+vmsleu_vi 011100 . ..... ..... 011 ..... 1010111 @r_vm
101
+vmsle_vv 011101 . ..... ..... 000 ..... 1010111 @r_vm
102
+vmsle_vx 011101 . ..... ..... 100 ..... 1010111 @r_vm
103
+vmsle_vi 011101 . ..... ..... 011 ..... 1010111 @r_vm
104
+vmsgtu_vx 011110 . ..... ..... 100 ..... 1010111 @r_vm
105
+vmsgtu_vi 011110 . ..... ..... 011 ..... 1010111 @r_vm
106
+vmsgt_vx 011111 . ..... ..... 100 ..... 1010111 @r_vm
107
+vmsgt_vi 011111 . ..... ..... 011 ..... 1010111 @r_vm
108
109
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
110
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
111
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
112
index XXXXXXX..XXXXXXX 100644
113
--- a/target/riscv/insn_trans/trans_rvv.inc.c
114
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
115
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
116
117
GEN_OPIVI_NARROW_TRANS(vnsra_vi, 1, vnsra_vx)
118
GEN_OPIVI_NARROW_TRANS(vnsrl_vi, 1, vnsrl_vx)
119
+
120
+/* Vector Integer Comparison Instructions */
121
+/*
122
+ * For all comparison instructions, an illegal instruction exception is raised
123
+ * if the destination vector register overlaps a source vector register group
124
+ * and LMUL > 1.
125
+ */
126
+static bool opivv_cmp_check(DisasContext *s, arg_rmrr *a)
127
+{
128
+ return (vext_check_isa_ill(s) &&
129
+ vext_check_reg(s, a->rs2, false) &&
130
+ vext_check_reg(s, a->rs1, false) &&
131
+ ((vext_check_overlap_group(a->rd, 1, a->rs1, 1 << s->lmul) &&
132
+ vext_check_overlap_group(a->rd, 1, a->rs2, 1 << s->lmul)) ||
133
+ (s->lmul == 0)));
134
+}
135
+GEN_OPIVV_TRANS(vmseq_vv, opivv_cmp_check)
136
+GEN_OPIVV_TRANS(vmsne_vv, opivv_cmp_check)
137
+GEN_OPIVV_TRANS(vmsltu_vv, opivv_cmp_check)
138
+GEN_OPIVV_TRANS(vmslt_vv, opivv_cmp_check)
139
+GEN_OPIVV_TRANS(vmsleu_vv, opivv_cmp_check)
140
+GEN_OPIVV_TRANS(vmsle_vv, opivv_cmp_check)
141
+
142
+static bool opivx_cmp_check(DisasContext *s, arg_rmrr *a)
143
+{
144
+ return (vext_check_isa_ill(s) &&
145
+ vext_check_reg(s, a->rs2, false) &&
146
+ (vext_check_overlap_group(a->rd, 1, a->rs2, 1 << s->lmul) ||
147
+ (s->lmul == 0)));
148
+}
149
+
150
+GEN_OPIVX_TRANS(vmseq_vx, opivx_cmp_check)
151
+GEN_OPIVX_TRANS(vmsne_vx, opivx_cmp_check)
152
+GEN_OPIVX_TRANS(vmsltu_vx, opivx_cmp_check)
153
+GEN_OPIVX_TRANS(vmslt_vx, opivx_cmp_check)
154
+GEN_OPIVX_TRANS(vmsleu_vx, opivx_cmp_check)
155
+GEN_OPIVX_TRANS(vmsle_vx, opivx_cmp_check)
156
+GEN_OPIVX_TRANS(vmsgtu_vx, opivx_cmp_check)
157
+GEN_OPIVX_TRANS(vmsgt_vx, opivx_cmp_check)
158
+
159
+GEN_OPIVI_TRANS(vmseq_vi, 0, vmseq_vx, opivx_cmp_check)
160
+GEN_OPIVI_TRANS(vmsne_vi, 0, vmsne_vx, opivx_cmp_check)
161
+GEN_OPIVI_TRANS(vmsleu_vi, 1, vmsleu_vx, opivx_cmp_check)
162
+GEN_OPIVI_TRANS(vmsle_vi, 0, vmsle_vx, opivx_cmp_check)
163
+GEN_OPIVI_TRANS(vmsgtu_vi, 1, vmsgtu_vx, opivx_cmp_check)
164
+GEN_OPIVI_TRANS(vmsgt_vi, 0, vmsgt_vx, opivx_cmp_check)
165
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
166
index XXXXXXX..XXXXXXX 100644
167
--- a/target/riscv/vector_helper.c
168
+++ b/target/riscv/vector_helper.c
169
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_SHIFT_VX(vnsrl_vx_w, uint32_t, uint64_t, H4, H8, DO_SRL, 0x3f, clearl)
170
GEN_VEXT_SHIFT_VX(vnsra_vx_b, int8_t, int16_t, H1, H2, DO_SRL, 0xf, clearb)
171
GEN_VEXT_SHIFT_VX(vnsra_vx_h, int16_t, int32_t, H2, H4, DO_SRL, 0x1f, clearh)
172
GEN_VEXT_SHIFT_VX(vnsra_vx_w, int32_t, int64_t, H4, H8, DO_SRL, 0x3f, clearl)
173
+
174
+/* Vector Integer Comparison Instructions */
175
+#define DO_MSEQ(N, M) (N == M)
176
+#define DO_MSNE(N, M) (N != M)
177
+#define DO_MSLT(N, M) (N < M)
178
+#define DO_MSLE(N, M) (N <= M)
179
+#define DO_MSGT(N, M) (N > M)
180
+
181
+#define GEN_VEXT_CMP_VV(NAME, ETYPE, H, DO_OP) \
182
+void HELPER(NAME)(void *vd, void *v0, void *vs1, void *vs2, \
183
+ CPURISCVState *env, uint32_t desc) \
184
+{ \
185
+ uint32_t mlen = vext_mlen(desc); \
186
+ uint32_t vm = vext_vm(desc); \
187
+ uint32_t vl = env->vl; \
188
+ uint32_t vlmax = vext_maxsz(desc) / sizeof(ETYPE); \
189
+ uint32_t i; \
190
+ \
191
+ for (i = 0; i < vl; i++) { \
192
+ ETYPE s1 = *((ETYPE *)vs1 + H(i)); \
193
+ ETYPE s2 = *((ETYPE *)vs2 + H(i)); \
194
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
195
+ continue; \
196
+ } \
197
+ vext_set_elem_mask(vd, mlen, i, DO_OP(s2, s1)); \
198
+ } \
199
+ for (; i < vlmax; i++) { \
200
+ vext_set_elem_mask(vd, mlen, i, 0); \
201
+ } \
202
+}
203
+
204
+GEN_VEXT_CMP_VV(vmseq_vv_b, uint8_t, H1, DO_MSEQ)
205
+GEN_VEXT_CMP_VV(vmseq_vv_h, uint16_t, H2, DO_MSEQ)
206
+GEN_VEXT_CMP_VV(vmseq_vv_w, uint32_t, H4, DO_MSEQ)
207
+GEN_VEXT_CMP_VV(vmseq_vv_d, uint64_t, H8, DO_MSEQ)
208
+
209
+GEN_VEXT_CMP_VV(vmsne_vv_b, uint8_t, H1, DO_MSNE)
210
+GEN_VEXT_CMP_VV(vmsne_vv_h, uint16_t, H2, DO_MSNE)
211
+GEN_VEXT_CMP_VV(vmsne_vv_w, uint32_t, H4, DO_MSNE)
212
+GEN_VEXT_CMP_VV(vmsne_vv_d, uint64_t, H8, DO_MSNE)
213
+
214
+GEN_VEXT_CMP_VV(vmsltu_vv_b, uint8_t, H1, DO_MSLT)
215
+GEN_VEXT_CMP_VV(vmsltu_vv_h, uint16_t, H2, DO_MSLT)
216
+GEN_VEXT_CMP_VV(vmsltu_vv_w, uint32_t, H4, DO_MSLT)
217
+GEN_VEXT_CMP_VV(vmsltu_vv_d, uint64_t, H8, DO_MSLT)
218
+
219
+GEN_VEXT_CMP_VV(vmslt_vv_b, int8_t, H1, DO_MSLT)
220
+GEN_VEXT_CMP_VV(vmslt_vv_h, int16_t, H2, DO_MSLT)
221
+GEN_VEXT_CMP_VV(vmslt_vv_w, int32_t, H4, DO_MSLT)
222
+GEN_VEXT_CMP_VV(vmslt_vv_d, int64_t, H8, DO_MSLT)
223
+
224
+GEN_VEXT_CMP_VV(vmsleu_vv_b, uint8_t, H1, DO_MSLE)
225
+GEN_VEXT_CMP_VV(vmsleu_vv_h, uint16_t, H2, DO_MSLE)
226
+GEN_VEXT_CMP_VV(vmsleu_vv_w, uint32_t, H4, DO_MSLE)
227
+GEN_VEXT_CMP_VV(vmsleu_vv_d, uint64_t, H8, DO_MSLE)
228
+
229
+GEN_VEXT_CMP_VV(vmsle_vv_b, int8_t, H1, DO_MSLE)
230
+GEN_VEXT_CMP_VV(vmsle_vv_h, int16_t, H2, DO_MSLE)
231
+GEN_VEXT_CMP_VV(vmsle_vv_w, int32_t, H4, DO_MSLE)
232
+GEN_VEXT_CMP_VV(vmsle_vv_d, int64_t, H8, DO_MSLE)
233
+
234
+#define GEN_VEXT_CMP_VX(NAME, ETYPE, H, DO_OP) \
235
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, void *vs2, \
236
+ CPURISCVState *env, uint32_t desc) \
237
+{ \
238
+ uint32_t mlen = vext_mlen(desc); \
239
+ uint32_t vm = vext_vm(desc); \
240
+ uint32_t vl = env->vl; \
241
+ uint32_t vlmax = vext_maxsz(desc) / sizeof(ETYPE); \
242
+ uint32_t i; \
243
+ \
244
+ for (i = 0; i < vl; i++) { \
245
+ ETYPE s2 = *((ETYPE *)vs2 + H(i)); \
246
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
247
+ continue; \
248
+ } \
249
+ vext_set_elem_mask(vd, mlen, i, \
250
+ DO_OP(s2, (ETYPE)(target_long)s1)); \
251
+ } \
252
+ for (; i < vlmax; i++) { \
253
+ vext_set_elem_mask(vd, mlen, i, 0); \
254
+ } \
255
+}
256
+
257
+GEN_VEXT_CMP_VX(vmseq_vx_b, uint8_t, H1, DO_MSEQ)
258
+GEN_VEXT_CMP_VX(vmseq_vx_h, uint16_t, H2, DO_MSEQ)
259
+GEN_VEXT_CMP_VX(vmseq_vx_w, uint32_t, H4, DO_MSEQ)
260
+GEN_VEXT_CMP_VX(vmseq_vx_d, uint64_t, H8, DO_MSEQ)
261
+
262
+GEN_VEXT_CMP_VX(vmsne_vx_b, uint8_t, H1, DO_MSNE)
263
+GEN_VEXT_CMP_VX(vmsne_vx_h, uint16_t, H2, DO_MSNE)
264
+GEN_VEXT_CMP_VX(vmsne_vx_w, uint32_t, H4, DO_MSNE)
265
+GEN_VEXT_CMP_VX(vmsne_vx_d, uint64_t, H8, DO_MSNE)
266
+
267
+GEN_VEXT_CMP_VX(vmsltu_vx_b, uint8_t, H1, DO_MSLT)
268
+GEN_VEXT_CMP_VX(vmsltu_vx_h, uint16_t, H2, DO_MSLT)
269
+GEN_VEXT_CMP_VX(vmsltu_vx_w, uint32_t, H4, DO_MSLT)
270
+GEN_VEXT_CMP_VX(vmsltu_vx_d, uint64_t, H8, DO_MSLT)
271
+
272
+GEN_VEXT_CMP_VX(vmslt_vx_b, int8_t, H1, DO_MSLT)
273
+GEN_VEXT_CMP_VX(vmslt_vx_h, int16_t, H2, DO_MSLT)
274
+GEN_VEXT_CMP_VX(vmslt_vx_w, int32_t, H4, DO_MSLT)
275
+GEN_VEXT_CMP_VX(vmslt_vx_d, int64_t, H8, DO_MSLT)
276
+
277
+GEN_VEXT_CMP_VX(vmsleu_vx_b, uint8_t, H1, DO_MSLE)
278
+GEN_VEXT_CMP_VX(vmsleu_vx_h, uint16_t, H2, DO_MSLE)
279
+GEN_VEXT_CMP_VX(vmsleu_vx_w, uint32_t, H4, DO_MSLE)
280
+GEN_VEXT_CMP_VX(vmsleu_vx_d, uint64_t, H8, DO_MSLE)
281
+
282
+GEN_VEXT_CMP_VX(vmsle_vx_b, int8_t, H1, DO_MSLE)
283
+GEN_VEXT_CMP_VX(vmsle_vx_h, int16_t, H2, DO_MSLE)
284
+GEN_VEXT_CMP_VX(vmsle_vx_w, int32_t, H4, DO_MSLE)
285
+GEN_VEXT_CMP_VX(vmsle_vx_d, int64_t, H8, DO_MSLE)
286
+
287
+GEN_VEXT_CMP_VX(vmsgtu_vx_b, uint8_t, H1, DO_MSGT)
288
+GEN_VEXT_CMP_VX(vmsgtu_vx_h, uint16_t, H2, DO_MSGT)
289
+GEN_VEXT_CMP_VX(vmsgtu_vx_w, uint32_t, H4, DO_MSGT)
290
+GEN_VEXT_CMP_VX(vmsgtu_vx_d, uint64_t, H8, DO_MSGT)
291
+
292
+GEN_VEXT_CMP_VX(vmsgt_vx_b, int8_t, H1, DO_MSGT)
293
+GEN_VEXT_CMP_VX(vmsgt_vx_h, int16_t, H2, DO_MSGT)
294
+GEN_VEXT_CMP_VX(vmsgt_vx_w, int32_t, H4, DO_MSGT)
295
+GEN_VEXT_CMP_VX(vmsgt_vx_d, int64_t, H8, DO_MSGT)
296
--
297
2.27.0
298
299
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-18-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 33 ++++++++++++
10
target/riscv/insn32.decode | 8 +++
11
target/riscv/insn_trans/trans_rvv.inc.c | 10 ++++
12
target/riscv/vector_helper.c | 71 +++++++++++++++++++++++++
13
4 files changed, 122 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vmsgt_vx_b, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vmsgt_vx_h, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vmsgt_vx_w, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vmsgt_vx_d, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vminu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vminu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vminu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vminu_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vmin_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vmin_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vmin_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vmin_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vmaxu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vmaxu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vmaxu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vmaxu_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vmax_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
37
+DEF_HELPER_6(vmax_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
38
+DEF_HELPER_6(vmax_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
39
+DEF_HELPER_6(vmax_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
40
+DEF_HELPER_6(vminu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vminu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vminu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vminu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vmin_vx_b, void, ptr, ptr, tl, ptr, env, i32)
45
+DEF_HELPER_6(vmin_vx_h, void, ptr, ptr, tl, ptr, env, i32)
46
+DEF_HELPER_6(vmin_vx_w, void, ptr, ptr, tl, ptr, env, i32)
47
+DEF_HELPER_6(vmin_vx_d, void, ptr, ptr, tl, ptr, env, i32)
48
+DEF_HELPER_6(vmaxu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
49
+DEF_HELPER_6(vmaxu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
50
+DEF_HELPER_6(vmaxu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
51
+DEF_HELPER_6(vmaxu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
52
+DEF_HELPER_6(vmax_vx_b, void, ptr, ptr, tl, ptr, env, i32)
53
+DEF_HELPER_6(vmax_vx_h, void, ptr, ptr, tl, ptr, env, i32)
54
+DEF_HELPER_6(vmax_vx_w, void, ptr, ptr, tl, ptr, env, i32)
55
+DEF_HELPER_6(vmax_vx_d, void, ptr, ptr, tl, ptr, env, i32)
56
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/riscv/insn32.decode
59
+++ b/target/riscv/insn32.decode
60
@@ -XXX,XX +XXX,XX @@ vmsgtu_vx 011110 . ..... ..... 100 ..... 1010111 @r_vm
61
vmsgtu_vi 011110 . ..... ..... 011 ..... 1010111 @r_vm
62
vmsgt_vx 011111 . ..... ..... 100 ..... 1010111 @r_vm
63
vmsgt_vi 011111 . ..... ..... 011 ..... 1010111 @r_vm
64
+vminu_vv 000100 . ..... ..... 000 ..... 1010111 @r_vm
65
+vminu_vx 000100 . ..... ..... 100 ..... 1010111 @r_vm
66
+vmin_vv 000101 . ..... ..... 000 ..... 1010111 @r_vm
67
+vmin_vx 000101 . ..... ..... 100 ..... 1010111 @r_vm
68
+vmaxu_vv 000110 . ..... ..... 000 ..... 1010111 @r_vm
69
+vmaxu_vx 000110 . ..... ..... 100 ..... 1010111 @r_vm
70
+vmax_vv 000111 . ..... ..... 000 ..... 1010111 @r_vm
71
+vmax_vx 000111 . ..... ..... 100 ..... 1010111 @r_vm
72
73
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
74
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
75
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/riscv/insn_trans/trans_rvv.inc.c
78
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
79
@@ -XXX,XX +XXX,XX @@ GEN_OPIVI_TRANS(vmsleu_vi, 1, vmsleu_vx, opivx_cmp_check)
80
GEN_OPIVI_TRANS(vmsle_vi, 0, vmsle_vx, opivx_cmp_check)
81
GEN_OPIVI_TRANS(vmsgtu_vi, 1, vmsgtu_vx, opivx_cmp_check)
82
GEN_OPIVI_TRANS(vmsgt_vi, 0, vmsgt_vx, opivx_cmp_check)
83
+
84
+/* Vector Integer Min/Max Instructions */
85
+GEN_OPIVV_GVEC_TRANS(vminu_vv, umin)
86
+GEN_OPIVV_GVEC_TRANS(vmin_vv, smin)
87
+GEN_OPIVV_GVEC_TRANS(vmaxu_vv, umax)
88
+GEN_OPIVV_GVEC_TRANS(vmax_vv, smax)
89
+GEN_OPIVX_TRANS(vminu_vx, opivx_check)
90
+GEN_OPIVX_TRANS(vmin_vx, opivx_check)
91
+GEN_OPIVX_TRANS(vmaxu_vx, opivx_check)
92
+GEN_OPIVX_TRANS(vmax_vx, opivx_check)
93
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/target/riscv/vector_helper.c
96
+++ b/target/riscv/vector_helper.c
97
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_AMO(vamomaxuw_v_w, uint32_t, uint32_t, idx_w, clearl)
98
#define OP_SSS_H int16_t, int16_t, int16_t, int16_t, int16_t
99
#define OP_SSS_W int32_t, int32_t, int32_t, int32_t, int32_t
100
#define OP_SSS_D int64_t, int64_t, int64_t, int64_t, int64_t
101
+#define OP_UUU_B uint8_t, uint8_t, uint8_t, uint8_t, uint8_t
102
+#define OP_UUU_H uint16_t, uint16_t, uint16_t, uint16_t, uint16_t
103
+#define OP_UUU_W uint32_t, uint32_t, uint32_t, uint32_t, uint32_t
104
+#define OP_UUU_D uint64_t, uint64_t, uint64_t, uint64_t, uint64_t
105
106
/* operation of two vector elements */
107
typedef void opivv2_fn(void *vd, void *vs1, void *vs2, int i);
108
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_CMP_VX(vmsgt_vx_b, int8_t, H1, DO_MSGT)
109
GEN_VEXT_CMP_VX(vmsgt_vx_h, int16_t, H2, DO_MSGT)
110
GEN_VEXT_CMP_VX(vmsgt_vx_w, int32_t, H4, DO_MSGT)
111
GEN_VEXT_CMP_VX(vmsgt_vx_d, int64_t, H8, DO_MSGT)
112
+
113
+/* Vector Integer Min/Max Instructions */
114
+RVVCALL(OPIVV2, vminu_vv_b, OP_UUU_B, H1, H1, H1, DO_MIN)
115
+RVVCALL(OPIVV2, vminu_vv_h, OP_UUU_H, H2, H2, H2, DO_MIN)
116
+RVVCALL(OPIVV2, vminu_vv_w, OP_UUU_W, H4, H4, H4, DO_MIN)
117
+RVVCALL(OPIVV2, vminu_vv_d, OP_UUU_D, H8, H8, H8, DO_MIN)
118
+RVVCALL(OPIVV2, vmin_vv_b, OP_SSS_B, H1, H1, H1, DO_MIN)
119
+RVVCALL(OPIVV2, vmin_vv_h, OP_SSS_H, H2, H2, H2, DO_MIN)
120
+RVVCALL(OPIVV2, vmin_vv_w, OP_SSS_W, H4, H4, H4, DO_MIN)
121
+RVVCALL(OPIVV2, vmin_vv_d, OP_SSS_D, H8, H8, H8, DO_MIN)
122
+RVVCALL(OPIVV2, vmaxu_vv_b, OP_UUU_B, H1, H1, H1, DO_MAX)
123
+RVVCALL(OPIVV2, vmaxu_vv_h, OP_UUU_H, H2, H2, H2, DO_MAX)
124
+RVVCALL(OPIVV2, vmaxu_vv_w, OP_UUU_W, H4, H4, H4, DO_MAX)
125
+RVVCALL(OPIVV2, vmaxu_vv_d, OP_UUU_D, H8, H8, H8, DO_MAX)
126
+RVVCALL(OPIVV2, vmax_vv_b, OP_SSS_B, H1, H1, H1, DO_MAX)
127
+RVVCALL(OPIVV2, vmax_vv_h, OP_SSS_H, H2, H2, H2, DO_MAX)
128
+RVVCALL(OPIVV2, vmax_vv_w, OP_SSS_W, H4, H4, H4, DO_MAX)
129
+RVVCALL(OPIVV2, vmax_vv_d, OP_SSS_D, H8, H8, H8, DO_MAX)
130
+GEN_VEXT_VV(vminu_vv_b, 1, 1, clearb)
131
+GEN_VEXT_VV(vminu_vv_h, 2, 2, clearh)
132
+GEN_VEXT_VV(vminu_vv_w, 4, 4, clearl)
133
+GEN_VEXT_VV(vminu_vv_d, 8, 8, clearq)
134
+GEN_VEXT_VV(vmin_vv_b, 1, 1, clearb)
135
+GEN_VEXT_VV(vmin_vv_h, 2, 2, clearh)
136
+GEN_VEXT_VV(vmin_vv_w, 4, 4, clearl)
137
+GEN_VEXT_VV(vmin_vv_d, 8, 8, clearq)
138
+GEN_VEXT_VV(vmaxu_vv_b, 1, 1, clearb)
139
+GEN_VEXT_VV(vmaxu_vv_h, 2, 2, clearh)
140
+GEN_VEXT_VV(vmaxu_vv_w, 4, 4, clearl)
141
+GEN_VEXT_VV(vmaxu_vv_d, 8, 8, clearq)
142
+GEN_VEXT_VV(vmax_vv_b, 1, 1, clearb)
143
+GEN_VEXT_VV(vmax_vv_h, 2, 2, clearh)
144
+GEN_VEXT_VV(vmax_vv_w, 4, 4, clearl)
145
+GEN_VEXT_VV(vmax_vv_d, 8, 8, clearq)
146
+
147
+RVVCALL(OPIVX2, vminu_vx_b, OP_UUU_B, H1, H1, DO_MIN)
148
+RVVCALL(OPIVX2, vminu_vx_h, OP_UUU_H, H2, H2, DO_MIN)
149
+RVVCALL(OPIVX2, vminu_vx_w, OP_UUU_W, H4, H4, DO_MIN)
150
+RVVCALL(OPIVX2, vminu_vx_d, OP_UUU_D, H8, H8, DO_MIN)
151
+RVVCALL(OPIVX2, vmin_vx_b, OP_SSS_B, H1, H1, DO_MIN)
152
+RVVCALL(OPIVX2, vmin_vx_h, OP_SSS_H, H2, H2, DO_MIN)
153
+RVVCALL(OPIVX2, vmin_vx_w, OP_SSS_W, H4, H4, DO_MIN)
154
+RVVCALL(OPIVX2, vmin_vx_d, OP_SSS_D, H8, H8, DO_MIN)
155
+RVVCALL(OPIVX2, vmaxu_vx_b, OP_UUU_B, H1, H1, DO_MAX)
156
+RVVCALL(OPIVX2, vmaxu_vx_h, OP_UUU_H, H2, H2, DO_MAX)
157
+RVVCALL(OPIVX2, vmaxu_vx_w, OP_UUU_W, H4, H4, DO_MAX)
158
+RVVCALL(OPIVX2, vmaxu_vx_d, OP_UUU_D, H8, H8, DO_MAX)
159
+RVVCALL(OPIVX2, vmax_vx_b, OP_SSS_B, H1, H1, DO_MAX)
160
+RVVCALL(OPIVX2, vmax_vx_h, OP_SSS_H, H2, H2, DO_MAX)
161
+RVVCALL(OPIVX2, vmax_vx_w, OP_SSS_W, H4, H4, DO_MAX)
162
+RVVCALL(OPIVX2, vmax_vx_d, OP_SSS_D, H8, H8, DO_MAX)
163
+GEN_VEXT_VX(vminu_vx_b, 1, 1, clearb)
164
+GEN_VEXT_VX(vminu_vx_h, 2, 2, clearh)
165
+GEN_VEXT_VX(vminu_vx_w, 4, 4, clearl)
166
+GEN_VEXT_VX(vminu_vx_d, 8, 8, clearq)
167
+GEN_VEXT_VX(vmin_vx_b, 1, 1, clearb)
168
+GEN_VEXT_VX(vmin_vx_h, 2, 2, clearh)
169
+GEN_VEXT_VX(vmin_vx_w, 4, 4, clearl)
170
+GEN_VEXT_VX(vmin_vx_d, 8, 8, clearq)
171
+GEN_VEXT_VX(vmaxu_vx_b, 1, 1, clearb)
172
+GEN_VEXT_VX(vmaxu_vx_h, 2, 2, clearh)
173
+GEN_VEXT_VX(vmaxu_vx_w, 4, 4, clearl)
174
+GEN_VEXT_VX(vmaxu_vx_d, 8, 8, clearq)
175
+GEN_VEXT_VX(vmax_vx_b, 1, 1, clearb)
176
+GEN_VEXT_VX(vmax_vx_h, 2, 2, clearh)
177
+GEN_VEXT_VX(vmax_vx_w, 4, 4, clearl)
178
+GEN_VEXT_VX(vmax_vx_d, 8, 8, clearq)
179
--
180
2.27.0
181
182
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-Id: <20200701152549.1218-19-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 33 +++++
10
target/riscv/insn32.decode | 8 ++
11
target/riscv/insn_trans/trans_rvv.inc.c | 10 ++
12
target/riscv/vector_helper.c | 163 ++++++++++++++++++++++++
13
4 files changed, 214 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vmax_vx_b, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vmax_vx_h, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vmax_vx_w, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vmax_vx_d, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vmul_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vmul_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vmul_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vmul_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vmulh_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vmulh_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vmulh_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vmulh_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vmulhu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vmulhu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vmulhu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vmulhu_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vmulhsu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
37
+DEF_HELPER_6(vmulhsu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
38
+DEF_HELPER_6(vmulhsu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
39
+DEF_HELPER_6(vmulhsu_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
40
+DEF_HELPER_6(vmul_vx_b, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vmul_vx_h, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vmul_vx_w, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vmul_vx_d, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vmulh_vx_b, void, ptr, ptr, tl, ptr, env, i32)
45
+DEF_HELPER_6(vmulh_vx_h, void, ptr, ptr, tl, ptr, env, i32)
46
+DEF_HELPER_6(vmulh_vx_w, void, ptr, ptr, tl, ptr, env, i32)
47
+DEF_HELPER_6(vmulh_vx_d, void, ptr, ptr, tl, ptr, env, i32)
48
+DEF_HELPER_6(vmulhu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
49
+DEF_HELPER_6(vmulhu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
50
+DEF_HELPER_6(vmulhu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
51
+DEF_HELPER_6(vmulhu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
52
+DEF_HELPER_6(vmulhsu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
53
+DEF_HELPER_6(vmulhsu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
54
+DEF_HELPER_6(vmulhsu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
55
+DEF_HELPER_6(vmulhsu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
56
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/riscv/insn32.decode
59
+++ b/target/riscv/insn32.decode
60
@@ -XXX,XX +XXX,XX @@ vmaxu_vv 000110 . ..... ..... 000 ..... 1010111 @r_vm
61
vmaxu_vx 000110 . ..... ..... 100 ..... 1010111 @r_vm
62
vmax_vv 000111 . ..... ..... 000 ..... 1010111 @r_vm
63
vmax_vx 000111 . ..... ..... 100 ..... 1010111 @r_vm
64
+vmul_vv 100101 . ..... ..... 010 ..... 1010111 @r_vm
65
+vmul_vx 100101 . ..... ..... 110 ..... 1010111 @r_vm
66
+vmulh_vv 100111 . ..... ..... 010 ..... 1010111 @r_vm
67
+vmulh_vx 100111 . ..... ..... 110 ..... 1010111 @r_vm
68
+vmulhu_vv 100100 . ..... ..... 010 ..... 1010111 @r_vm
69
+vmulhu_vx 100100 . ..... ..... 110 ..... 1010111 @r_vm
70
+vmulhsu_vv 100110 . ..... ..... 010 ..... 1010111 @r_vm
71
+vmulhsu_vx 100110 . ..... ..... 110 ..... 1010111 @r_vm
72
73
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
74
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
75
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/riscv/insn_trans/trans_rvv.inc.c
78
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
79
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_TRANS(vminu_vx, opivx_check)
80
GEN_OPIVX_TRANS(vmin_vx, opivx_check)
81
GEN_OPIVX_TRANS(vmaxu_vx, opivx_check)
82
GEN_OPIVX_TRANS(vmax_vx, opivx_check)
83
+
84
+/* Vector Single-Width Integer Multiply Instructions */
85
+GEN_OPIVV_GVEC_TRANS(vmul_vv, mul)
86
+GEN_OPIVV_TRANS(vmulh_vv, opivv_check)
87
+GEN_OPIVV_TRANS(vmulhu_vv, opivv_check)
88
+GEN_OPIVV_TRANS(vmulhsu_vv, opivv_check)
89
+GEN_OPIVX_GVEC_TRANS(vmul_vx, muls)
90
+GEN_OPIVX_TRANS(vmulh_vx, opivx_check)
91
+GEN_OPIVX_TRANS(vmulhu_vx, opivx_check)
92
+GEN_OPIVX_TRANS(vmulhsu_vx, opivx_check)
93
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/target/riscv/vector_helper.c
96
+++ b/target/riscv/vector_helper.c
97
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_AMO(vamomaxuw_v_w, uint32_t, uint32_t, idx_w, clearl)
98
#define OP_UUU_H uint16_t, uint16_t, uint16_t, uint16_t, uint16_t
99
#define OP_UUU_W uint32_t, uint32_t, uint32_t, uint32_t, uint32_t
100
#define OP_UUU_D uint64_t, uint64_t, uint64_t, uint64_t, uint64_t
101
+#define OP_SUS_B int8_t, uint8_t, int8_t, uint8_t, int8_t
102
+#define OP_SUS_H int16_t, uint16_t, int16_t, uint16_t, int16_t
103
+#define OP_SUS_W int32_t, uint32_t, int32_t, uint32_t, int32_t
104
+#define OP_SUS_D int64_t, uint64_t, int64_t, uint64_t, int64_t
105
106
/* operation of two vector elements */
107
typedef void opivv2_fn(void *vd, void *vs1, void *vs2, int i);
108
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX(vmax_vx_b, 1, 1, clearb)
109
GEN_VEXT_VX(vmax_vx_h, 2, 2, clearh)
110
GEN_VEXT_VX(vmax_vx_w, 4, 4, clearl)
111
GEN_VEXT_VX(vmax_vx_d, 8, 8, clearq)
112
+
113
+/* Vector Single-Width Integer Multiply Instructions */
114
+#define DO_MUL(N, M) (N * M)
115
+RVVCALL(OPIVV2, vmul_vv_b, OP_SSS_B, H1, H1, H1, DO_MUL)
116
+RVVCALL(OPIVV2, vmul_vv_h, OP_SSS_H, H2, H2, H2, DO_MUL)
117
+RVVCALL(OPIVV2, vmul_vv_w, OP_SSS_W, H4, H4, H4, DO_MUL)
118
+RVVCALL(OPIVV2, vmul_vv_d, OP_SSS_D, H8, H8, H8, DO_MUL)
119
+GEN_VEXT_VV(vmul_vv_b, 1, 1, clearb)
120
+GEN_VEXT_VV(vmul_vv_h, 2, 2, clearh)
121
+GEN_VEXT_VV(vmul_vv_w, 4, 4, clearl)
122
+GEN_VEXT_VV(vmul_vv_d, 8, 8, clearq)
123
+
124
+static int8_t do_mulh_b(int8_t s2, int8_t s1)
125
+{
126
+ return (int16_t)s2 * (int16_t)s1 >> 8;
127
+}
128
+
129
+static int16_t do_mulh_h(int16_t s2, int16_t s1)
130
+{
131
+ return (int32_t)s2 * (int32_t)s1 >> 16;
132
+}
133
+
134
+static int32_t do_mulh_w(int32_t s2, int32_t s1)
135
+{
136
+ return (int64_t)s2 * (int64_t)s1 >> 32;
137
+}
138
+
139
+static int64_t do_mulh_d(int64_t s2, int64_t s1)
140
+{
141
+ uint64_t hi_64, lo_64;
142
+
143
+ muls64(&lo_64, &hi_64, s1, s2);
144
+ return hi_64;
145
+}
146
+
147
+static uint8_t do_mulhu_b(uint8_t s2, uint8_t s1)
148
+{
149
+ return (uint16_t)s2 * (uint16_t)s1 >> 8;
150
+}
151
+
152
+static uint16_t do_mulhu_h(uint16_t s2, uint16_t s1)
153
+{
154
+ return (uint32_t)s2 * (uint32_t)s1 >> 16;
155
+}
156
+
157
+static uint32_t do_mulhu_w(uint32_t s2, uint32_t s1)
158
+{
159
+ return (uint64_t)s2 * (uint64_t)s1 >> 32;
160
+}
161
+
162
+static uint64_t do_mulhu_d(uint64_t s2, uint64_t s1)
163
+{
164
+ uint64_t hi_64, lo_64;
165
+
166
+ mulu64(&lo_64, &hi_64, s2, s1);
167
+ return hi_64;
168
+}
169
+
170
+static int8_t do_mulhsu_b(int8_t s2, uint8_t s1)
171
+{
172
+ return (int16_t)s2 * (uint16_t)s1 >> 8;
173
+}
174
+
175
+static int16_t do_mulhsu_h(int16_t s2, uint16_t s1)
176
+{
177
+ return (int32_t)s2 * (uint32_t)s1 >> 16;
178
+}
179
+
180
+static int32_t do_mulhsu_w(int32_t s2, uint32_t s1)
181
+{
182
+ return (int64_t)s2 * (uint64_t)s1 >> 32;
183
+}
184
+
185
+/*
186
+ * Let A = signed operand,
187
+ * B = unsigned operand
188
+ * P = mulu64(A, B), unsigned product
189
+ *
190
+ * LET X = 2 ** 64 - A, 2's complement of A
191
+ * SP = signed product
192
+ * THEN
193
+ * IF A < 0
194
+ * SP = -X * B
195
+ * = -(2 ** 64 - A) * B
196
+ * = A * B - 2 ** 64 * B
197
+ * = P - 2 ** 64 * B
198
+ * ELSE
199
+ * SP = P
200
+ * THEN
201
+ * HI_P -= (A < 0 ? B : 0)
202
+ */
203
+
204
+static int64_t do_mulhsu_d(int64_t s2, uint64_t s1)
205
+{
206
+ uint64_t hi_64, lo_64;
207
+
208
+ mulu64(&lo_64, &hi_64, s2, s1);
209
+
210
+ hi_64 -= s2 < 0 ? s1 : 0;
211
+ return hi_64;
212
+}
213
+
214
+RVVCALL(OPIVV2, vmulh_vv_b, OP_SSS_B, H1, H1, H1, do_mulh_b)
215
+RVVCALL(OPIVV2, vmulh_vv_h, OP_SSS_H, H2, H2, H2, do_mulh_h)
216
+RVVCALL(OPIVV2, vmulh_vv_w, OP_SSS_W, H4, H4, H4, do_mulh_w)
217
+RVVCALL(OPIVV2, vmulh_vv_d, OP_SSS_D, H8, H8, H8, do_mulh_d)
218
+RVVCALL(OPIVV2, vmulhu_vv_b, OP_UUU_B, H1, H1, H1, do_mulhu_b)
219
+RVVCALL(OPIVV2, vmulhu_vv_h, OP_UUU_H, H2, H2, H2, do_mulhu_h)
220
+RVVCALL(OPIVV2, vmulhu_vv_w, OP_UUU_W, H4, H4, H4, do_mulhu_w)
221
+RVVCALL(OPIVV2, vmulhu_vv_d, OP_UUU_D, H8, H8, H8, do_mulhu_d)
222
+RVVCALL(OPIVV2, vmulhsu_vv_b, OP_SUS_B, H1, H1, H1, do_mulhsu_b)
223
+RVVCALL(OPIVV2, vmulhsu_vv_h, OP_SUS_H, H2, H2, H2, do_mulhsu_h)
224
+RVVCALL(OPIVV2, vmulhsu_vv_w, OP_SUS_W, H4, H4, H4, do_mulhsu_w)
225
+RVVCALL(OPIVV2, vmulhsu_vv_d, OP_SUS_D, H8, H8, H8, do_mulhsu_d)
226
+GEN_VEXT_VV(vmulh_vv_b, 1, 1, clearb)
227
+GEN_VEXT_VV(vmulh_vv_h, 2, 2, clearh)
228
+GEN_VEXT_VV(vmulh_vv_w, 4, 4, clearl)
229
+GEN_VEXT_VV(vmulh_vv_d, 8, 8, clearq)
230
+GEN_VEXT_VV(vmulhu_vv_b, 1, 1, clearb)
231
+GEN_VEXT_VV(vmulhu_vv_h, 2, 2, clearh)
232
+GEN_VEXT_VV(vmulhu_vv_w, 4, 4, clearl)
233
+GEN_VEXT_VV(vmulhu_vv_d, 8, 8, clearq)
234
+GEN_VEXT_VV(vmulhsu_vv_b, 1, 1, clearb)
235
+GEN_VEXT_VV(vmulhsu_vv_h, 2, 2, clearh)
236
+GEN_VEXT_VV(vmulhsu_vv_w, 4, 4, clearl)
237
+GEN_VEXT_VV(vmulhsu_vv_d, 8, 8, clearq)
238
+
239
+RVVCALL(OPIVX2, vmul_vx_b, OP_SSS_B, H1, H1, DO_MUL)
240
+RVVCALL(OPIVX2, vmul_vx_h, OP_SSS_H, H2, H2, DO_MUL)
241
+RVVCALL(OPIVX2, vmul_vx_w, OP_SSS_W, H4, H4, DO_MUL)
242
+RVVCALL(OPIVX2, vmul_vx_d, OP_SSS_D, H8, H8, DO_MUL)
243
+RVVCALL(OPIVX2, vmulh_vx_b, OP_SSS_B, H1, H1, do_mulh_b)
244
+RVVCALL(OPIVX2, vmulh_vx_h, OP_SSS_H, H2, H2, do_mulh_h)
245
+RVVCALL(OPIVX2, vmulh_vx_w, OP_SSS_W, H4, H4, do_mulh_w)
246
+RVVCALL(OPIVX2, vmulh_vx_d, OP_SSS_D, H8, H8, do_mulh_d)
247
+RVVCALL(OPIVX2, vmulhu_vx_b, OP_UUU_B, H1, H1, do_mulhu_b)
248
+RVVCALL(OPIVX2, vmulhu_vx_h, OP_UUU_H, H2, H2, do_mulhu_h)
249
+RVVCALL(OPIVX2, vmulhu_vx_w, OP_UUU_W, H4, H4, do_mulhu_w)
250
+RVVCALL(OPIVX2, vmulhu_vx_d, OP_UUU_D, H8, H8, do_mulhu_d)
251
+RVVCALL(OPIVX2, vmulhsu_vx_b, OP_SUS_B, H1, H1, do_mulhsu_b)
252
+RVVCALL(OPIVX2, vmulhsu_vx_h, OP_SUS_H, H2, H2, do_mulhsu_h)
253
+RVVCALL(OPIVX2, vmulhsu_vx_w, OP_SUS_W, H4, H4, do_mulhsu_w)
254
+RVVCALL(OPIVX2, vmulhsu_vx_d, OP_SUS_D, H8, H8, do_mulhsu_d)
255
+GEN_VEXT_VX(vmul_vx_b, 1, 1, clearb)
256
+GEN_VEXT_VX(vmul_vx_h, 2, 2, clearh)
257
+GEN_VEXT_VX(vmul_vx_w, 4, 4, clearl)
258
+GEN_VEXT_VX(vmul_vx_d, 8, 8, clearq)
259
+GEN_VEXT_VX(vmulh_vx_b, 1, 1, clearb)
260
+GEN_VEXT_VX(vmulh_vx_h, 2, 2, clearh)
261
+GEN_VEXT_VX(vmulh_vx_w, 4, 4, clearl)
262
+GEN_VEXT_VX(vmulh_vx_d, 8, 8, clearq)
263
+GEN_VEXT_VX(vmulhu_vx_b, 1, 1, clearb)
264
+GEN_VEXT_VX(vmulhu_vx_h, 2, 2, clearh)
265
+GEN_VEXT_VX(vmulhu_vx_w, 4, 4, clearl)
266
+GEN_VEXT_VX(vmulhu_vx_d, 8, 8, clearq)
267
+GEN_VEXT_VX(vmulhsu_vx_b, 1, 1, clearb)
268
+GEN_VEXT_VX(vmulhsu_vx_h, 2, 2, clearh)
269
+GEN_VEXT_VX(vmulhsu_vx_w, 4, 4, clearl)
270
+GEN_VEXT_VX(vmulhsu_vx_d, 8, 8, clearq)
271
--
272
2.27.0
273
274
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-20-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 33 +++++++++++
10
target/riscv/insn32.decode | 8 +++
11
target/riscv/insn_trans/trans_rvv.inc.c | 10 ++++
12
target/riscv/vector_helper.c | 74 +++++++++++++++++++++++++
13
4 files changed, 125 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vmulhsu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vmulhsu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vmulhsu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vmulhsu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vdivu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vdivu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vdivu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vdivu_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vdiv_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vdiv_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vdiv_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vdiv_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vremu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vremu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vremu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vremu_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vrem_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
37
+DEF_HELPER_6(vrem_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
38
+DEF_HELPER_6(vrem_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
39
+DEF_HELPER_6(vrem_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
40
+DEF_HELPER_6(vdivu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vdivu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vdivu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vdivu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vdiv_vx_b, void, ptr, ptr, tl, ptr, env, i32)
45
+DEF_HELPER_6(vdiv_vx_h, void, ptr, ptr, tl, ptr, env, i32)
46
+DEF_HELPER_6(vdiv_vx_w, void, ptr, ptr, tl, ptr, env, i32)
47
+DEF_HELPER_6(vdiv_vx_d, void, ptr, ptr, tl, ptr, env, i32)
48
+DEF_HELPER_6(vremu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
49
+DEF_HELPER_6(vremu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
50
+DEF_HELPER_6(vremu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
51
+DEF_HELPER_6(vremu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
52
+DEF_HELPER_6(vrem_vx_b, void, ptr, ptr, tl, ptr, env, i32)
53
+DEF_HELPER_6(vrem_vx_h, void, ptr, ptr, tl, ptr, env, i32)
54
+DEF_HELPER_6(vrem_vx_w, void, ptr, ptr, tl, ptr, env, i32)
55
+DEF_HELPER_6(vrem_vx_d, void, ptr, ptr, tl, ptr, env, i32)
56
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/riscv/insn32.decode
59
+++ b/target/riscv/insn32.decode
60
@@ -XXX,XX +XXX,XX @@ vmulhu_vv 100100 . ..... ..... 010 ..... 1010111 @r_vm
61
vmulhu_vx 100100 . ..... ..... 110 ..... 1010111 @r_vm
62
vmulhsu_vv 100110 . ..... ..... 010 ..... 1010111 @r_vm
63
vmulhsu_vx 100110 . ..... ..... 110 ..... 1010111 @r_vm
64
+vdivu_vv 100000 . ..... ..... 010 ..... 1010111 @r_vm
65
+vdivu_vx 100000 . ..... ..... 110 ..... 1010111 @r_vm
66
+vdiv_vv 100001 . ..... ..... 010 ..... 1010111 @r_vm
67
+vdiv_vx 100001 . ..... ..... 110 ..... 1010111 @r_vm
68
+vremu_vv 100010 . ..... ..... 010 ..... 1010111 @r_vm
69
+vremu_vx 100010 . ..... ..... 110 ..... 1010111 @r_vm
70
+vrem_vv 100011 . ..... ..... 010 ..... 1010111 @r_vm
71
+vrem_vx 100011 . ..... ..... 110 ..... 1010111 @r_vm
72
73
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
74
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
75
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/riscv/insn_trans/trans_rvv.inc.c
78
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
79
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_GVEC_TRANS(vmul_vx, muls)
80
GEN_OPIVX_TRANS(vmulh_vx, opivx_check)
81
GEN_OPIVX_TRANS(vmulhu_vx, opivx_check)
82
GEN_OPIVX_TRANS(vmulhsu_vx, opivx_check)
83
+
84
+/* Vector Integer Divide Instructions */
85
+GEN_OPIVV_TRANS(vdivu_vv, opivv_check)
86
+GEN_OPIVV_TRANS(vdiv_vv, opivv_check)
87
+GEN_OPIVV_TRANS(vremu_vv, opivv_check)
88
+GEN_OPIVV_TRANS(vrem_vv, opivv_check)
89
+GEN_OPIVX_TRANS(vdivu_vx, opivx_check)
90
+GEN_OPIVX_TRANS(vdiv_vx, opivx_check)
91
+GEN_OPIVX_TRANS(vremu_vx, opivx_check)
92
+GEN_OPIVX_TRANS(vrem_vx, opivx_check)
93
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/target/riscv/vector_helper.c
96
+++ b/target/riscv/vector_helper.c
97
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX(vmulhsu_vx_b, 1, 1, clearb)
98
GEN_VEXT_VX(vmulhsu_vx_h, 2, 2, clearh)
99
GEN_VEXT_VX(vmulhsu_vx_w, 4, 4, clearl)
100
GEN_VEXT_VX(vmulhsu_vx_d, 8, 8, clearq)
101
+
102
+/* Vector Integer Divide Instructions */
103
+#define DO_DIVU(N, M) (unlikely(M == 0) ? (__typeof(N))(-1) : N / M)
104
+#define DO_REMU(N, M) (unlikely(M == 0) ? N : N % M)
105
+#define DO_DIV(N, M) (unlikely(M == 0) ? (__typeof(N))(-1) :\
106
+ unlikely((N == -N) && (M == (__typeof(N))(-1))) ? N : N / M)
107
+#define DO_REM(N, M) (unlikely(M == 0) ? N :\
108
+ unlikely((N == -N) && (M == (__typeof(N))(-1))) ? 0 : N % M)
109
+
110
+RVVCALL(OPIVV2, vdivu_vv_b, OP_UUU_B, H1, H1, H1, DO_DIVU)
111
+RVVCALL(OPIVV2, vdivu_vv_h, OP_UUU_H, H2, H2, H2, DO_DIVU)
112
+RVVCALL(OPIVV2, vdivu_vv_w, OP_UUU_W, H4, H4, H4, DO_DIVU)
113
+RVVCALL(OPIVV2, vdivu_vv_d, OP_UUU_D, H8, H8, H8, DO_DIVU)
114
+RVVCALL(OPIVV2, vdiv_vv_b, OP_SSS_B, H1, H1, H1, DO_DIV)
115
+RVVCALL(OPIVV2, vdiv_vv_h, OP_SSS_H, H2, H2, H2, DO_DIV)
116
+RVVCALL(OPIVV2, vdiv_vv_w, OP_SSS_W, H4, H4, H4, DO_DIV)
117
+RVVCALL(OPIVV2, vdiv_vv_d, OP_SSS_D, H8, H8, H8, DO_DIV)
118
+RVVCALL(OPIVV2, vremu_vv_b, OP_UUU_B, H1, H1, H1, DO_REMU)
119
+RVVCALL(OPIVV2, vremu_vv_h, OP_UUU_H, H2, H2, H2, DO_REMU)
120
+RVVCALL(OPIVV2, vremu_vv_w, OP_UUU_W, H4, H4, H4, DO_REMU)
121
+RVVCALL(OPIVV2, vremu_vv_d, OP_UUU_D, H8, H8, H8, DO_REMU)
122
+RVVCALL(OPIVV2, vrem_vv_b, OP_SSS_B, H1, H1, H1, DO_REM)
123
+RVVCALL(OPIVV2, vrem_vv_h, OP_SSS_H, H2, H2, H2, DO_REM)
124
+RVVCALL(OPIVV2, vrem_vv_w, OP_SSS_W, H4, H4, H4, DO_REM)
125
+RVVCALL(OPIVV2, vrem_vv_d, OP_SSS_D, H8, H8, H8, DO_REM)
126
+GEN_VEXT_VV(vdivu_vv_b, 1, 1, clearb)
127
+GEN_VEXT_VV(vdivu_vv_h, 2, 2, clearh)
128
+GEN_VEXT_VV(vdivu_vv_w, 4, 4, clearl)
129
+GEN_VEXT_VV(vdivu_vv_d, 8, 8, clearq)
130
+GEN_VEXT_VV(vdiv_vv_b, 1, 1, clearb)
131
+GEN_VEXT_VV(vdiv_vv_h, 2, 2, clearh)
132
+GEN_VEXT_VV(vdiv_vv_w, 4, 4, clearl)
133
+GEN_VEXT_VV(vdiv_vv_d, 8, 8, clearq)
134
+GEN_VEXT_VV(vremu_vv_b, 1, 1, clearb)
135
+GEN_VEXT_VV(vremu_vv_h, 2, 2, clearh)
136
+GEN_VEXT_VV(vremu_vv_w, 4, 4, clearl)
137
+GEN_VEXT_VV(vremu_vv_d, 8, 8, clearq)
138
+GEN_VEXT_VV(vrem_vv_b, 1, 1, clearb)
139
+GEN_VEXT_VV(vrem_vv_h, 2, 2, clearh)
140
+GEN_VEXT_VV(vrem_vv_w, 4, 4, clearl)
141
+GEN_VEXT_VV(vrem_vv_d, 8, 8, clearq)
142
+
143
+RVVCALL(OPIVX2, vdivu_vx_b, OP_UUU_B, H1, H1, DO_DIVU)
144
+RVVCALL(OPIVX2, vdivu_vx_h, OP_UUU_H, H2, H2, DO_DIVU)
145
+RVVCALL(OPIVX2, vdivu_vx_w, OP_UUU_W, H4, H4, DO_DIVU)
146
+RVVCALL(OPIVX2, vdivu_vx_d, OP_UUU_D, H8, H8, DO_DIVU)
147
+RVVCALL(OPIVX2, vdiv_vx_b, OP_SSS_B, H1, H1, DO_DIV)
148
+RVVCALL(OPIVX2, vdiv_vx_h, OP_SSS_H, H2, H2, DO_DIV)
149
+RVVCALL(OPIVX2, vdiv_vx_w, OP_SSS_W, H4, H4, DO_DIV)
150
+RVVCALL(OPIVX2, vdiv_vx_d, OP_SSS_D, H8, H8, DO_DIV)
151
+RVVCALL(OPIVX2, vremu_vx_b, OP_UUU_B, H1, H1, DO_REMU)
152
+RVVCALL(OPIVX2, vremu_vx_h, OP_UUU_H, H2, H2, DO_REMU)
153
+RVVCALL(OPIVX2, vremu_vx_w, OP_UUU_W, H4, H4, DO_REMU)
154
+RVVCALL(OPIVX2, vremu_vx_d, OP_UUU_D, H8, H8, DO_REMU)
155
+RVVCALL(OPIVX2, vrem_vx_b, OP_SSS_B, H1, H1, DO_REM)
156
+RVVCALL(OPIVX2, vrem_vx_h, OP_SSS_H, H2, H2, DO_REM)
157
+RVVCALL(OPIVX2, vrem_vx_w, OP_SSS_W, H4, H4, DO_REM)
158
+RVVCALL(OPIVX2, vrem_vx_d, OP_SSS_D, H8, H8, DO_REM)
159
+GEN_VEXT_VX(vdivu_vx_b, 1, 1, clearb)
160
+GEN_VEXT_VX(vdivu_vx_h, 2, 2, clearh)
161
+GEN_VEXT_VX(vdivu_vx_w, 4, 4, clearl)
162
+GEN_VEXT_VX(vdivu_vx_d, 8, 8, clearq)
163
+GEN_VEXT_VX(vdiv_vx_b, 1, 1, clearb)
164
+GEN_VEXT_VX(vdiv_vx_h, 2, 2, clearh)
165
+GEN_VEXT_VX(vdiv_vx_w, 4, 4, clearl)
166
+GEN_VEXT_VX(vdiv_vx_d, 8, 8, clearq)
167
+GEN_VEXT_VX(vremu_vx_b, 1, 1, clearb)
168
+GEN_VEXT_VX(vremu_vx_h, 2, 2, clearh)
169
+GEN_VEXT_VX(vremu_vx_w, 4, 4, clearl)
170
+GEN_VEXT_VX(vremu_vx_d, 8, 8, clearq)
171
+GEN_VEXT_VX(vrem_vx_b, 1, 1, clearb)
172
+GEN_VEXT_VX(vrem_vx_h, 2, 2, clearh)
173
+GEN_VEXT_VX(vrem_vx_w, 4, 4, clearl)
174
+GEN_VEXT_VX(vrem_vx_d, 8, 8, clearq)
175
--
176
2.27.0
177
178
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-21-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 19 +++++++++
10
target/riscv/insn32.decode | 6 +++
11
target/riscv/insn_trans/trans_rvv.inc.c | 8 ++++
12
target/riscv/vector_helper.c | 51 +++++++++++++++++++++++++
13
4 files changed, 84 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vrem_vx_b, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vrem_vx_h, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vrem_vx_w, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vrem_vx_d, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vwmul_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vwmul_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vwmul_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vwmulu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vwmulu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vwmulu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vwmulsu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vwmulsu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vwmulsu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vwmul_vx_b, void, ptr, ptr, tl, ptr, env, i32)
34
+DEF_HELPER_6(vwmul_vx_h, void, ptr, ptr, tl, ptr, env, i32)
35
+DEF_HELPER_6(vwmul_vx_w, void, ptr, ptr, tl, ptr, env, i32)
36
+DEF_HELPER_6(vwmulu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
37
+DEF_HELPER_6(vwmulu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
38
+DEF_HELPER_6(vwmulu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
39
+DEF_HELPER_6(vwmulsu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
40
+DEF_HELPER_6(vwmulsu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vwmulsu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
42
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/riscv/insn32.decode
45
+++ b/target/riscv/insn32.decode
46
@@ -XXX,XX +XXX,XX @@ vremu_vv 100010 . ..... ..... 010 ..... 1010111 @r_vm
47
vremu_vx 100010 . ..... ..... 110 ..... 1010111 @r_vm
48
vrem_vv 100011 . ..... ..... 010 ..... 1010111 @r_vm
49
vrem_vx 100011 . ..... ..... 110 ..... 1010111 @r_vm
50
+vwmulu_vv 111000 . ..... ..... 010 ..... 1010111 @r_vm
51
+vwmulu_vx 111000 . ..... ..... 110 ..... 1010111 @r_vm
52
+vwmulsu_vv 111010 . ..... ..... 010 ..... 1010111 @r_vm
53
+vwmulsu_vx 111010 . ..... ..... 110 ..... 1010111 @r_vm
54
+vwmul_vv 111011 . ..... ..... 010 ..... 1010111 @r_vm
55
+vwmul_vx 111011 . ..... ..... 110 ..... 1010111 @r_vm
56
57
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
58
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
59
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/target/riscv/insn_trans/trans_rvv.inc.c
62
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
63
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_TRANS(vdivu_vx, opivx_check)
64
GEN_OPIVX_TRANS(vdiv_vx, opivx_check)
65
GEN_OPIVX_TRANS(vremu_vx, opivx_check)
66
GEN_OPIVX_TRANS(vrem_vx, opivx_check)
67
+
68
+/* Vector Widening Integer Multiply Instructions */
69
+GEN_OPIVV_WIDEN_TRANS(vwmul_vv, opivv_widen_check)
70
+GEN_OPIVV_WIDEN_TRANS(vwmulu_vv, opivv_widen_check)
71
+GEN_OPIVV_WIDEN_TRANS(vwmulsu_vv, opivv_widen_check)
72
+GEN_OPIVX_WIDEN_TRANS(vwmul_vx)
73
+GEN_OPIVX_WIDEN_TRANS(vwmulu_vx)
74
+GEN_OPIVX_WIDEN_TRANS(vwmulsu_vx)
75
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/riscv/vector_helper.c
78
+++ b/target/riscv/vector_helper.c
79
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_AMO(vamomaxuw_v_w, uint32_t, uint32_t, idx_w, clearl)
80
#define OP_SUS_H int16_t, uint16_t, int16_t, uint16_t, int16_t
81
#define OP_SUS_W int32_t, uint32_t, int32_t, uint32_t, int32_t
82
#define OP_SUS_D int64_t, uint64_t, int64_t, uint64_t, int64_t
83
+#define WOP_UUU_B uint16_t, uint8_t, uint8_t, uint16_t, uint16_t
84
+#define WOP_UUU_H uint32_t, uint16_t, uint16_t, uint32_t, uint32_t
85
+#define WOP_UUU_W uint64_t, uint32_t, uint32_t, uint64_t, uint64_t
86
+#define WOP_SSS_B int16_t, int8_t, int8_t, int16_t, int16_t
87
+#define WOP_SSS_H int32_t, int16_t, int16_t, int32_t, int32_t
88
+#define WOP_SSS_W int64_t, int32_t, int32_t, int64_t, int64_t
89
+#define WOP_SUS_B int16_t, uint8_t, int8_t, uint16_t, int16_t
90
+#define WOP_SUS_H int32_t, uint16_t, int16_t, uint32_t, int32_t
91
+#define WOP_SUS_W int64_t, uint32_t, int32_t, uint64_t, int64_t
92
+#define WOP_SSU_B int16_t, int8_t, uint8_t, int16_t, uint16_t
93
+#define WOP_SSU_H int32_t, int16_t, uint16_t, int32_t, uint32_t
94
+#define WOP_SSU_W int64_t, int32_t, uint32_t, int64_t, uint64_t
95
96
/* operation of two vector elements */
97
typedef void opivv2_fn(void *vd, void *vs1, void *vs2, int i);
98
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX(vrem_vx_b, 1, 1, clearb)
99
GEN_VEXT_VX(vrem_vx_h, 2, 2, clearh)
100
GEN_VEXT_VX(vrem_vx_w, 4, 4, clearl)
101
GEN_VEXT_VX(vrem_vx_d, 8, 8, clearq)
102
+
103
+/* Vector Widening Integer Multiply Instructions */
104
+RVVCALL(OPIVV2, vwmul_vv_b, WOP_SSS_B, H2, H1, H1, DO_MUL)
105
+RVVCALL(OPIVV2, vwmul_vv_h, WOP_SSS_H, H4, H2, H2, DO_MUL)
106
+RVVCALL(OPIVV2, vwmul_vv_w, WOP_SSS_W, H8, H4, H4, DO_MUL)
107
+RVVCALL(OPIVV2, vwmulu_vv_b, WOP_UUU_B, H2, H1, H1, DO_MUL)
108
+RVVCALL(OPIVV2, vwmulu_vv_h, WOP_UUU_H, H4, H2, H2, DO_MUL)
109
+RVVCALL(OPIVV2, vwmulu_vv_w, WOP_UUU_W, H8, H4, H4, DO_MUL)
110
+RVVCALL(OPIVV2, vwmulsu_vv_b, WOP_SUS_B, H2, H1, H1, DO_MUL)
111
+RVVCALL(OPIVV2, vwmulsu_vv_h, WOP_SUS_H, H4, H2, H2, DO_MUL)
112
+RVVCALL(OPIVV2, vwmulsu_vv_w, WOP_SUS_W, H8, H4, H4, DO_MUL)
113
+GEN_VEXT_VV(vwmul_vv_b, 1, 2, clearh)
114
+GEN_VEXT_VV(vwmul_vv_h, 2, 4, clearl)
115
+GEN_VEXT_VV(vwmul_vv_w, 4, 8, clearq)
116
+GEN_VEXT_VV(vwmulu_vv_b, 1, 2, clearh)
117
+GEN_VEXT_VV(vwmulu_vv_h, 2, 4, clearl)
118
+GEN_VEXT_VV(vwmulu_vv_w, 4, 8, clearq)
119
+GEN_VEXT_VV(vwmulsu_vv_b, 1, 2, clearh)
120
+GEN_VEXT_VV(vwmulsu_vv_h, 2, 4, clearl)
121
+GEN_VEXT_VV(vwmulsu_vv_w, 4, 8, clearq)
122
+
123
+RVVCALL(OPIVX2, vwmul_vx_b, WOP_SSS_B, H2, H1, DO_MUL)
124
+RVVCALL(OPIVX2, vwmul_vx_h, WOP_SSS_H, H4, H2, DO_MUL)
125
+RVVCALL(OPIVX2, vwmul_vx_w, WOP_SSS_W, H8, H4, DO_MUL)
126
+RVVCALL(OPIVX2, vwmulu_vx_b, WOP_UUU_B, H2, H1, DO_MUL)
127
+RVVCALL(OPIVX2, vwmulu_vx_h, WOP_UUU_H, H4, H2, DO_MUL)
128
+RVVCALL(OPIVX2, vwmulu_vx_w, WOP_UUU_W, H8, H4, DO_MUL)
129
+RVVCALL(OPIVX2, vwmulsu_vx_b, WOP_SUS_B, H2, H1, DO_MUL)
130
+RVVCALL(OPIVX2, vwmulsu_vx_h, WOP_SUS_H, H4, H2, DO_MUL)
131
+RVVCALL(OPIVX2, vwmulsu_vx_w, WOP_SUS_W, H8, H4, DO_MUL)
132
+GEN_VEXT_VX(vwmul_vx_b, 1, 2, clearh)
133
+GEN_VEXT_VX(vwmul_vx_h, 2, 4, clearl)
134
+GEN_VEXT_VX(vwmul_vx_w, 4, 8, clearq)
135
+GEN_VEXT_VX(vwmulu_vx_b, 1, 2, clearh)
136
+GEN_VEXT_VX(vwmulu_vx_h, 2, 4, clearl)
137
+GEN_VEXT_VX(vwmulu_vx_w, 4, 8, clearq)
138
+GEN_VEXT_VX(vwmulsu_vx_b, 1, 2, clearh)
139
+GEN_VEXT_VX(vwmulsu_vx_h, 2, 4, clearl)
140
+GEN_VEXT_VX(vwmulsu_vx_w, 4, 8, clearq)
141
--
142
2.27.0
143
144
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-22-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 33 ++++++++++
10
target/riscv/insn32.decode | 8 +++
11
target/riscv/insn_trans/trans_rvv.inc.c | 10 +++
12
target/riscv/vector_helper.c | 88 +++++++++++++++++++++++++
13
4 files changed, 139 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vwmulu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vwmulsu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vwmulsu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vwmulsu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vmacc_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vmacc_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vmacc_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vmacc_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vnmsac_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vnmsac_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vnmsac_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vnmsac_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vmadd_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vmadd_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vmadd_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vmadd_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vnmsub_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
37
+DEF_HELPER_6(vnmsub_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
38
+DEF_HELPER_6(vnmsub_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
39
+DEF_HELPER_6(vnmsub_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
40
+DEF_HELPER_6(vmacc_vx_b, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vmacc_vx_h, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vmacc_vx_w, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vmacc_vx_d, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vnmsac_vx_b, void, ptr, ptr, tl, ptr, env, i32)
45
+DEF_HELPER_6(vnmsac_vx_h, void, ptr, ptr, tl, ptr, env, i32)
46
+DEF_HELPER_6(vnmsac_vx_w, void, ptr, ptr, tl, ptr, env, i32)
47
+DEF_HELPER_6(vnmsac_vx_d, void, ptr, ptr, tl, ptr, env, i32)
48
+DEF_HELPER_6(vmadd_vx_b, void, ptr, ptr, tl, ptr, env, i32)
49
+DEF_HELPER_6(vmadd_vx_h, void, ptr, ptr, tl, ptr, env, i32)
50
+DEF_HELPER_6(vmadd_vx_w, void, ptr, ptr, tl, ptr, env, i32)
51
+DEF_HELPER_6(vmadd_vx_d, void, ptr, ptr, tl, ptr, env, i32)
52
+DEF_HELPER_6(vnmsub_vx_b, void, ptr, ptr, tl, ptr, env, i32)
53
+DEF_HELPER_6(vnmsub_vx_h, void, ptr, ptr, tl, ptr, env, i32)
54
+DEF_HELPER_6(vnmsub_vx_w, void, ptr, ptr, tl, ptr, env, i32)
55
+DEF_HELPER_6(vnmsub_vx_d, void, ptr, ptr, tl, ptr, env, i32)
56
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/riscv/insn32.decode
59
+++ b/target/riscv/insn32.decode
60
@@ -XXX,XX +XXX,XX @@ vwmulsu_vv 111010 . ..... ..... 010 ..... 1010111 @r_vm
61
vwmulsu_vx 111010 . ..... ..... 110 ..... 1010111 @r_vm
62
vwmul_vv 111011 . ..... ..... 010 ..... 1010111 @r_vm
63
vwmul_vx 111011 . ..... ..... 110 ..... 1010111 @r_vm
64
+vmacc_vv 101101 . ..... ..... 010 ..... 1010111 @r_vm
65
+vmacc_vx 101101 . ..... ..... 110 ..... 1010111 @r_vm
66
+vnmsac_vv 101111 . ..... ..... 010 ..... 1010111 @r_vm
67
+vnmsac_vx 101111 . ..... ..... 110 ..... 1010111 @r_vm
68
+vmadd_vv 101001 . ..... ..... 010 ..... 1010111 @r_vm
69
+vmadd_vx 101001 . ..... ..... 110 ..... 1010111 @r_vm
70
+vnmsub_vv 101011 . ..... ..... 010 ..... 1010111 @r_vm
71
+vnmsub_vx 101011 . ..... ..... 110 ..... 1010111 @r_vm
72
73
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
74
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
75
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/riscv/insn_trans/trans_rvv.inc.c
78
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
79
@@ -XXX,XX +XXX,XX @@ GEN_OPIVV_WIDEN_TRANS(vwmulsu_vv, opivv_widen_check)
80
GEN_OPIVX_WIDEN_TRANS(vwmul_vx)
81
GEN_OPIVX_WIDEN_TRANS(vwmulu_vx)
82
GEN_OPIVX_WIDEN_TRANS(vwmulsu_vx)
83
+
84
+/* Vector Single-Width Integer Multiply-Add Instructions */
85
+GEN_OPIVV_TRANS(vmacc_vv, opivv_check)
86
+GEN_OPIVV_TRANS(vnmsac_vv, opivv_check)
87
+GEN_OPIVV_TRANS(vmadd_vv, opivv_check)
88
+GEN_OPIVV_TRANS(vnmsub_vv, opivv_check)
89
+GEN_OPIVX_TRANS(vmacc_vx, opivx_check)
90
+GEN_OPIVX_TRANS(vnmsac_vx, opivx_check)
91
+GEN_OPIVX_TRANS(vmadd_vx, opivx_check)
92
+GEN_OPIVX_TRANS(vnmsub_vx, opivx_check)
93
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/target/riscv/vector_helper.c
96
+++ b/target/riscv/vector_helper.c
97
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX(vwmulu_vx_w, 4, 8, clearq)
98
GEN_VEXT_VX(vwmulsu_vx_b, 1, 2, clearh)
99
GEN_VEXT_VX(vwmulsu_vx_h, 2, 4, clearl)
100
GEN_VEXT_VX(vwmulsu_vx_w, 4, 8, clearq)
101
+
102
+/* Vector Single-Width Integer Multiply-Add Instructions */
103
+#define OPIVV3(NAME, TD, T1, T2, TX1, TX2, HD, HS1, HS2, OP) \
104
+static void do_##NAME(void *vd, void *vs1, void *vs2, int i) \
105
+{ \
106
+ TX1 s1 = *((T1 *)vs1 + HS1(i)); \
107
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
108
+ TD d = *((TD *)vd + HD(i)); \
109
+ *((TD *)vd + HD(i)) = OP(s2, s1, d); \
110
+}
111
+
112
+#define DO_MACC(N, M, D) (M * N + D)
113
+#define DO_NMSAC(N, M, D) (-(M * N) + D)
114
+#define DO_MADD(N, M, D) (M * D + N)
115
+#define DO_NMSUB(N, M, D) (-(M * D) + N)
116
+RVVCALL(OPIVV3, vmacc_vv_b, OP_SSS_B, H1, H1, H1, DO_MACC)
117
+RVVCALL(OPIVV3, vmacc_vv_h, OP_SSS_H, H2, H2, H2, DO_MACC)
118
+RVVCALL(OPIVV3, vmacc_vv_w, OP_SSS_W, H4, H4, H4, DO_MACC)
119
+RVVCALL(OPIVV3, vmacc_vv_d, OP_SSS_D, H8, H8, H8, DO_MACC)
120
+RVVCALL(OPIVV3, vnmsac_vv_b, OP_SSS_B, H1, H1, H1, DO_NMSAC)
121
+RVVCALL(OPIVV3, vnmsac_vv_h, OP_SSS_H, H2, H2, H2, DO_NMSAC)
122
+RVVCALL(OPIVV3, vnmsac_vv_w, OP_SSS_W, H4, H4, H4, DO_NMSAC)
123
+RVVCALL(OPIVV3, vnmsac_vv_d, OP_SSS_D, H8, H8, H8, DO_NMSAC)
124
+RVVCALL(OPIVV3, vmadd_vv_b, OP_SSS_B, H1, H1, H1, DO_MADD)
125
+RVVCALL(OPIVV3, vmadd_vv_h, OP_SSS_H, H2, H2, H2, DO_MADD)
126
+RVVCALL(OPIVV3, vmadd_vv_w, OP_SSS_W, H4, H4, H4, DO_MADD)
127
+RVVCALL(OPIVV3, vmadd_vv_d, OP_SSS_D, H8, H8, H8, DO_MADD)
128
+RVVCALL(OPIVV3, vnmsub_vv_b, OP_SSS_B, H1, H1, H1, DO_NMSUB)
129
+RVVCALL(OPIVV3, vnmsub_vv_h, OP_SSS_H, H2, H2, H2, DO_NMSUB)
130
+RVVCALL(OPIVV3, vnmsub_vv_w, OP_SSS_W, H4, H4, H4, DO_NMSUB)
131
+RVVCALL(OPIVV3, vnmsub_vv_d, OP_SSS_D, H8, H8, H8, DO_NMSUB)
132
+GEN_VEXT_VV(vmacc_vv_b, 1, 1, clearb)
133
+GEN_VEXT_VV(vmacc_vv_h, 2, 2, clearh)
134
+GEN_VEXT_VV(vmacc_vv_w, 4, 4, clearl)
135
+GEN_VEXT_VV(vmacc_vv_d, 8, 8, clearq)
136
+GEN_VEXT_VV(vnmsac_vv_b, 1, 1, clearb)
137
+GEN_VEXT_VV(vnmsac_vv_h, 2, 2, clearh)
138
+GEN_VEXT_VV(vnmsac_vv_w, 4, 4, clearl)
139
+GEN_VEXT_VV(vnmsac_vv_d, 8, 8, clearq)
140
+GEN_VEXT_VV(vmadd_vv_b, 1, 1, clearb)
141
+GEN_VEXT_VV(vmadd_vv_h, 2, 2, clearh)
142
+GEN_VEXT_VV(vmadd_vv_w, 4, 4, clearl)
143
+GEN_VEXT_VV(vmadd_vv_d, 8, 8, clearq)
144
+GEN_VEXT_VV(vnmsub_vv_b, 1, 1, clearb)
145
+GEN_VEXT_VV(vnmsub_vv_h, 2, 2, clearh)
146
+GEN_VEXT_VV(vnmsub_vv_w, 4, 4, clearl)
147
+GEN_VEXT_VV(vnmsub_vv_d, 8, 8, clearq)
148
+
149
+#define OPIVX3(NAME, TD, T1, T2, TX1, TX2, HD, HS2, OP) \
150
+static void do_##NAME(void *vd, target_long s1, void *vs2, int i) \
151
+{ \
152
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
153
+ TD d = *((TD *)vd + HD(i)); \
154
+ *((TD *)vd + HD(i)) = OP(s2, (TX1)(T1)s1, d); \
155
+}
156
+
157
+RVVCALL(OPIVX3, vmacc_vx_b, OP_SSS_B, H1, H1, DO_MACC)
158
+RVVCALL(OPIVX3, vmacc_vx_h, OP_SSS_H, H2, H2, DO_MACC)
159
+RVVCALL(OPIVX3, vmacc_vx_w, OP_SSS_W, H4, H4, DO_MACC)
160
+RVVCALL(OPIVX3, vmacc_vx_d, OP_SSS_D, H8, H8, DO_MACC)
161
+RVVCALL(OPIVX3, vnmsac_vx_b, OP_SSS_B, H1, H1, DO_NMSAC)
162
+RVVCALL(OPIVX3, vnmsac_vx_h, OP_SSS_H, H2, H2, DO_NMSAC)
163
+RVVCALL(OPIVX3, vnmsac_vx_w, OP_SSS_W, H4, H4, DO_NMSAC)
164
+RVVCALL(OPIVX3, vnmsac_vx_d, OP_SSS_D, H8, H8, DO_NMSAC)
165
+RVVCALL(OPIVX3, vmadd_vx_b, OP_SSS_B, H1, H1, DO_MADD)
166
+RVVCALL(OPIVX3, vmadd_vx_h, OP_SSS_H, H2, H2, DO_MADD)
167
+RVVCALL(OPIVX3, vmadd_vx_w, OP_SSS_W, H4, H4, DO_MADD)
168
+RVVCALL(OPIVX3, vmadd_vx_d, OP_SSS_D, H8, H8, DO_MADD)
169
+RVVCALL(OPIVX3, vnmsub_vx_b, OP_SSS_B, H1, H1, DO_NMSUB)
170
+RVVCALL(OPIVX3, vnmsub_vx_h, OP_SSS_H, H2, H2, DO_NMSUB)
171
+RVVCALL(OPIVX3, vnmsub_vx_w, OP_SSS_W, H4, H4, DO_NMSUB)
172
+RVVCALL(OPIVX3, vnmsub_vx_d, OP_SSS_D, H8, H8, DO_NMSUB)
173
+GEN_VEXT_VX(vmacc_vx_b, 1, 1, clearb)
174
+GEN_VEXT_VX(vmacc_vx_h, 2, 2, clearh)
175
+GEN_VEXT_VX(vmacc_vx_w, 4, 4, clearl)
176
+GEN_VEXT_VX(vmacc_vx_d, 8, 8, clearq)
177
+GEN_VEXT_VX(vnmsac_vx_b, 1, 1, clearb)
178
+GEN_VEXT_VX(vnmsac_vx_h, 2, 2, clearh)
179
+GEN_VEXT_VX(vnmsac_vx_w, 4, 4, clearl)
180
+GEN_VEXT_VX(vnmsac_vx_d, 8, 8, clearq)
181
+GEN_VEXT_VX(vmadd_vx_b, 1, 1, clearb)
182
+GEN_VEXT_VX(vmadd_vx_h, 2, 2, clearh)
183
+GEN_VEXT_VX(vmadd_vx_w, 4, 4, clearl)
184
+GEN_VEXT_VX(vmadd_vx_d, 8, 8, clearq)
185
+GEN_VEXT_VX(vnmsub_vx_b, 1, 1, clearb)
186
+GEN_VEXT_VX(vnmsub_vx_h, 2, 2, clearh)
187
+GEN_VEXT_VX(vnmsub_vx_w, 4, 4, clearl)
188
+GEN_VEXT_VX(vnmsub_vx_d, 8, 8, clearq)
189
--
190
2.27.0
191
192
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-23-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 22 ++++++++++++
10
target/riscv/insn32.decode | 7 ++++
11
target/riscv/insn_trans/trans_rvv.inc.c | 9 +++++
12
target/riscv/vector_helper.c | 45 +++++++++++++++++++++++++
13
4 files changed, 83 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vnmsub_vx_b, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vnmsub_vx_h, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vnmsub_vx_w, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vnmsub_vx_d, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vwmaccu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vwmaccu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vwmaccu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vwmacc_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vwmacc_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vwmacc_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vwmaccsu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vwmaccsu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vwmaccsu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vwmaccu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
34
+DEF_HELPER_6(vwmaccu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
35
+DEF_HELPER_6(vwmaccu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
36
+DEF_HELPER_6(vwmacc_vx_b, void, ptr, ptr, tl, ptr, env, i32)
37
+DEF_HELPER_6(vwmacc_vx_h, void, ptr, ptr, tl, ptr, env, i32)
38
+DEF_HELPER_6(vwmacc_vx_w, void, ptr, ptr, tl, ptr, env, i32)
39
+DEF_HELPER_6(vwmaccsu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
40
+DEF_HELPER_6(vwmaccsu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vwmaccsu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vwmaccus_vx_b, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vwmaccus_vx_h, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vwmaccus_vx_w, void, ptr, ptr, tl, ptr, env, i32)
45
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/riscv/insn32.decode
48
+++ b/target/riscv/insn32.decode
49
@@ -XXX,XX +XXX,XX @@ vmadd_vv 101001 . ..... ..... 010 ..... 1010111 @r_vm
50
vmadd_vx 101001 . ..... ..... 110 ..... 1010111 @r_vm
51
vnmsub_vv 101011 . ..... ..... 010 ..... 1010111 @r_vm
52
vnmsub_vx 101011 . ..... ..... 110 ..... 1010111 @r_vm
53
+vwmaccu_vv 111100 . ..... ..... 010 ..... 1010111 @r_vm
54
+vwmaccu_vx 111100 . ..... ..... 110 ..... 1010111 @r_vm
55
+vwmacc_vv 111101 . ..... ..... 010 ..... 1010111 @r_vm
56
+vwmacc_vx 111101 . ..... ..... 110 ..... 1010111 @r_vm
57
+vwmaccsu_vv 111110 . ..... ..... 010 ..... 1010111 @r_vm
58
+vwmaccsu_vx 111110 . ..... ..... 110 ..... 1010111 @r_vm
59
+vwmaccus_vx 111111 . ..... ..... 110 ..... 1010111 @r_vm
60
61
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
62
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
63
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/target/riscv/insn_trans/trans_rvv.inc.c
66
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
67
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_TRANS(vmacc_vx, opivx_check)
68
GEN_OPIVX_TRANS(vnmsac_vx, opivx_check)
69
GEN_OPIVX_TRANS(vmadd_vx, opivx_check)
70
GEN_OPIVX_TRANS(vnmsub_vx, opivx_check)
71
+
72
+/* Vector Widening Integer Multiply-Add Instructions */
73
+GEN_OPIVV_WIDEN_TRANS(vwmaccu_vv, opivv_widen_check)
74
+GEN_OPIVV_WIDEN_TRANS(vwmacc_vv, opivv_widen_check)
75
+GEN_OPIVV_WIDEN_TRANS(vwmaccsu_vv, opivv_widen_check)
76
+GEN_OPIVX_WIDEN_TRANS(vwmaccu_vx)
77
+GEN_OPIVX_WIDEN_TRANS(vwmacc_vx)
78
+GEN_OPIVX_WIDEN_TRANS(vwmaccsu_vx)
79
+GEN_OPIVX_WIDEN_TRANS(vwmaccus_vx)
80
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
81
index XXXXXXX..XXXXXXX 100644
82
--- a/target/riscv/vector_helper.c
83
+++ b/target/riscv/vector_helper.c
84
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX(vnmsub_vx_b, 1, 1, clearb)
85
GEN_VEXT_VX(vnmsub_vx_h, 2, 2, clearh)
86
GEN_VEXT_VX(vnmsub_vx_w, 4, 4, clearl)
87
GEN_VEXT_VX(vnmsub_vx_d, 8, 8, clearq)
88
+
89
+/* Vector Widening Integer Multiply-Add Instructions */
90
+RVVCALL(OPIVV3, vwmaccu_vv_b, WOP_UUU_B, H2, H1, H1, DO_MACC)
91
+RVVCALL(OPIVV3, vwmaccu_vv_h, WOP_UUU_H, H4, H2, H2, DO_MACC)
92
+RVVCALL(OPIVV3, vwmaccu_vv_w, WOP_UUU_W, H8, H4, H4, DO_MACC)
93
+RVVCALL(OPIVV3, vwmacc_vv_b, WOP_SSS_B, H2, H1, H1, DO_MACC)
94
+RVVCALL(OPIVV3, vwmacc_vv_h, WOP_SSS_H, H4, H2, H2, DO_MACC)
95
+RVVCALL(OPIVV3, vwmacc_vv_w, WOP_SSS_W, H8, H4, H4, DO_MACC)
96
+RVVCALL(OPIVV3, vwmaccsu_vv_b, WOP_SSU_B, H2, H1, H1, DO_MACC)
97
+RVVCALL(OPIVV3, vwmaccsu_vv_h, WOP_SSU_H, H4, H2, H2, DO_MACC)
98
+RVVCALL(OPIVV3, vwmaccsu_vv_w, WOP_SSU_W, H8, H4, H4, DO_MACC)
99
+GEN_VEXT_VV(vwmaccu_vv_b, 1, 2, clearh)
100
+GEN_VEXT_VV(vwmaccu_vv_h, 2, 4, clearl)
101
+GEN_VEXT_VV(vwmaccu_vv_w, 4, 8, clearq)
102
+GEN_VEXT_VV(vwmacc_vv_b, 1, 2, clearh)
103
+GEN_VEXT_VV(vwmacc_vv_h, 2, 4, clearl)
104
+GEN_VEXT_VV(vwmacc_vv_w, 4, 8, clearq)
105
+GEN_VEXT_VV(vwmaccsu_vv_b, 1, 2, clearh)
106
+GEN_VEXT_VV(vwmaccsu_vv_h, 2, 4, clearl)
107
+GEN_VEXT_VV(vwmaccsu_vv_w, 4, 8, clearq)
108
+
109
+RVVCALL(OPIVX3, vwmaccu_vx_b, WOP_UUU_B, H2, H1, DO_MACC)
110
+RVVCALL(OPIVX3, vwmaccu_vx_h, WOP_UUU_H, H4, H2, DO_MACC)
111
+RVVCALL(OPIVX3, vwmaccu_vx_w, WOP_UUU_W, H8, H4, DO_MACC)
112
+RVVCALL(OPIVX3, vwmacc_vx_b, WOP_SSS_B, H2, H1, DO_MACC)
113
+RVVCALL(OPIVX3, vwmacc_vx_h, WOP_SSS_H, H4, H2, DO_MACC)
114
+RVVCALL(OPIVX3, vwmacc_vx_w, WOP_SSS_W, H8, H4, DO_MACC)
115
+RVVCALL(OPIVX3, vwmaccsu_vx_b, WOP_SSU_B, H2, H1, DO_MACC)
116
+RVVCALL(OPIVX3, vwmaccsu_vx_h, WOP_SSU_H, H4, H2, DO_MACC)
117
+RVVCALL(OPIVX3, vwmaccsu_vx_w, WOP_SSU_W, H8, H4, DO_MACC)
118
+RVVCALL(OPIVX3, vwmaccus_vx_b, WOP_SUS_B, H2, H1, DO_MACC)
119
+RVVCALL(OPIVX3, vwmaccus_vx_h, WOP_SUS_H, H4, H2, DO_MACC)
120
+RVVCALL(OPIVX3, vwmaccus_vx_w, WOP_SUS_W, H8, H4, DO_MACC)
121
+GEN_VEXT_VX(vwmaccu_vx_b, 1, 2, clearh)
122
+GEN_VEXT_VX(vwmaccu_vx_h, 2, 4, clearl)
123
+GEN_VEXT_VX(vwmaccu_vx_w, 4, 8, clearq)
124
+GEN_VEXT_VX(vwmacc_vx_b, 1, 2, clearh)
125
+GEN_VEXT_VX(vwmacc_vx_h, 2, 4, clearl)
126
+GEN_VEXT_VX(vwmacc_vx_w, 4, 8, clearq)
127
+GEN_VEXT_VX(vwmaccsu_vx_b, 1, 2, clearh)
128
+GEN_VEXT_VX(vwmaccsu_vx_h, 2, 4, clearl)
129
+GEN_VEXT_VX(vwmaccsu_vx_w, 4, 8, clearq)
130
+GEN_VEXT_VX(vwmaccus_vx_b, 1, 2, clearh)
131
+GEN_VEXT_VX(vwmaccus_vx_h, 2, 4, clearl)
132
+GEN_VEXT_VX(vwmaccus_vx_w, 4, 8, clearq)
133
--
134
2.27.0
135
136
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-Id: <20200701152549.1218-24-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 17 ++++
10
target/riscv/insn32.decode | 7 ++
11
target/riscv/insn_trans/trans_rvv.inc.c | 113 ++++++++++++++++++++++++
12
target/riscv/vector_helper.c | 88 ++++++++++++++++++
13
4 files changed, 225 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vwmaccsu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vwmaccus_vx_b, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vwmaccus_vx_h, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vwmaccus_vx_w, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vmerge_vvm_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vmerge_vvm_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vmerge_vvm_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vmerge_vvm_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vmerge_vxm_b, void, ptr, ptr, tl, ptr, env, i32)
29
+DEF_HELPER_6(vmerge_vxm_h, void, ptr, ptr, tl, ptr, env, i32)
30
+DEF_HELPER_6(vmerge_vxm_w, void, ptr, ptr, tl, ptr, env, i32)
31
+DEF_HELPER_6(vmerge_vxm_d, void, ptr, ptr, tl, ptr, env, i32)
32
+DEF_HELPER_4(vmv_v_v_b, void, ptr, ptr, env, i32)
33
+DEF_HELPER_4(vmv_v_v_h, void, ptr, ptr, env, i32)
34
+DEF_HELPER_4(vmv_v_v_w, void, ptr, ptr, env, i32)
35
+DEF_HELPER_4(vmv_v_v_d, void, ptr, ptr, env, i32)
36
+DEF_HELPER_4(vmv_v_x_b, void, ptr, i64, env, i32)
37
+DEF_HELPER_4(vmv_v_x_h, void, ptr, i64, env, i32)
38
+DEF_HELPER_4(vmv_v_x_w, void, ptr, i64, env, i32)
39
+DEF_HELPER_4(vmv_v_x_d, void, ptr, i64, env, i32)
40
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/riscv/insn32.decode
43
+++ b/target/riscv/insn32.decode
44
@@ -XXX,XX +XXX,XX @@
45
@r_nfvm ... ... vm:1 ..... ..... ... ..... ....... &rnfvm %nf %rs2 %rs1 %rd
46
@r_vm ...... vm:1 ..... ..... ... ..... ....... &rmrr %rs2 %rs1 %rd
47
@r_vm_1 ...... . ..... ..... ... ..... ....... &rmrr vm=1 %rs2 %rs1 %rd
48
+@r_vm_0 ...... . ..... ..... ... ..... ....... &rmrr vm=0 %rs2 %rs1 %rd
49
@r_wdvm ..... wd:1 vm:1 ..... ..... ... ..... ....... &rwdvm %rs2 %rs1 %rd
50
@r2_zimm . zimm:11 ..... ... ..... ....... %rs1 %rd
51
52
@@ -XXX,XX +XXX,XX @@ vwmacc_vx 111101 . ..... ..... 110 ..... 1010111 @r_vm
53
vwmaccsu_vv 111110 . ..... ..... 010 ..... 1010111 @r_vm
54
vwmaccsu_vx 111110 . ..... ..... 110 ..... 1010111 @r_vm
55
vwmaccus_vx 111111 . ..... ..... 110 ..... 1010111 @r_vm
56
+vmv_v_v 010111 1 00000 ..... 000 ..... 1010111 @r2
57
+vmv_v_x 010111 1 00000 ..... 100 ..... 1010111 @r2
58
+vmv_v_i 010111 1 00000 ..... 011 ..... 1010111 @r2
59
+vmerge_vvm 010111 0 ..... ..... 000 ..... 1010111 @r_vm_0
60
+vmerge_vxm 010111 0 ..... ..... 100 ..... 1010111 @r_vm_0
61
+vmerge_vim 010111 0 ..... ..... 011 ..... 1010111 @r_vm_0
62
63
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
64
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
65
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/target/riscv/insn_trans/trans_rvv.inc.c
68
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
69
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_WIDEN_TRANS(vwmaccu_vx)
70
GEN_OPIVX_WIDEN_TRANS(vwmacc_vx)
71
GEN_OPIVX_WIDEN_TRANS(vwmaccsu_vx)
72
GEN_OPIVX_WIDEN_TRANS(vwmaccus_vx)
73
+
74
+/* Vector Integer Merge and Move Instructions */
75
+static bool trans_vmv_v_v(DisasContext *s, arg_vmv_v_v *a)
76
+{
77
+ if (vext_check_isa_ill(s) &&
78
+ vext_check_reg(s, a->rd, false) &&
79
+ vext_check_reg(s, a->rs1, false)) {
80
+
81
+ if (s->vl_eq_vlmax) {
82
+ tcg_gen_gvec_mov(s->sew, vreg_ofs(s, a->rd),
83
+ vreg_ofs(s, a->rs1),
84
+ MAXSZ(s), MAXSZ(s));
85
+ } else {
86
+ uint32_t data = FIELD_DP32(0, VDATA, LMUL, s->lmul);
87
+ static gen_helper_gvec_2_ptr * const fns[4] = {
88
+ gen_helper_vmv_v_v_b, gen_helper_vmv_v_v_h,
89
+ gen_helper_vmv_v_v_w, gen_helper_vmv_v_v_d,
90
+ };
91
+ TCGLabel *over = gen_new_label();
92
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
93
+
94
+ tcg_gen_gvec_2_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, a->rs1),
95
+ cpu_env, 0, s->vlen / 8, data, fns[s->sew]);
96
+ gen_set_label(over);
97
+ }
98
+ return true;
99
+ }
100
+ return false;
101
+}
102
+
103
+typedef void gen_helper_vmv_vx(TCGv_ptr, TCGv_i64, TCGv_env, TCGv_i32);
104
+static bool trans_vmv_v_x(DisasContext *s, arg_vmv_v_x *a)
105
+{
106
+ if (vext_check_isa_ill(s) &&
107
+ vext_check_reg(s, a->rd, false)) {
108
+
109
+ TCGv s1;
110
+ TCGLabel *over = gen_new_label();
111
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
112
+
113
+ s1 = tcg_temp_new();
114
+ gen_get_gpr(s1, a->rs1);
115
+
116
+ if (s->vl_eq_vlmax) {
117
+ tcg_gen_gvec_dup_tl(s->sew, vreg_ofs(s, a->rd),
118
+ MAXSZ(s), MAXSZ(s), s1);
119
+ } else {
120
+ TCGv_i32 desc ;
121
+ TCGv_i64 s1_i64 = tcg_temp_new_i64();
122
+ TCGv_ptr dest = tcg_temp_new_ptr();
123
+ uint32_t data = FIELD_DP32(0, VDATA, LMUL, s->lmul);
124
+ static gen_helper_vmv_vx * const fns[4] = {
125
+ gen_helper_vmv_v_x_b, gen_helper_vmv_v_x_h,
126
+ gen_helper_vmv_v_x_w, gen_helper_vmv_v_x_d,
127
+ };
128
+
129
+ tcg_gen_ext_tl_i64(s1_i64, s1);
130
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
131
+ tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd));
132
+ fns[s->sew](dest, s1_i64, cpu_env, desc);
133
+
134
+ tcg_temp_free_ptr(dest);
135
+ tcg_temp_free_i32(desc);
136
+ tcg_temp_free_i64(s1_i64);
137
+ }
138
+
139
+ tcg_temp_free(s1);
140
+ gen_set_label(over);
141
+ return true;
142
+ }
143
+ return false;
144
+}
145
+
146
+static bool trans_vmv_v_i(DisasContext *s, arg_vmv_v_i *a)
147
+{
148
+ if (vext_check_isa_ill(s) &&
149
+ vext_check_reg(s, a->rd, false)) {
150
+
151
+ int64_t simm = sextract64(a->rs1, 0, 5);
152
+ if (s->vl_eq_vlmax) {
153
+ tcg_gen_gvec_dup_imm(s->sew, vreg_ofs(s, a->rd),
154
+ MAXSZ(s), MAXSZ(s), simm);
155
+ } else {
156
+ TCGv_i32 desc;
157
+ TCGv_i64 s1;
158
+ TCGv_ptr dest;
159
+ uint32_t data = FIELD_DP32(0, VDATA, LMUL, s->lmul);
160
+ static gen_helper_vmv_vx * const fns[4] = {
161
+ gen_helper_vmv_v_x_b, gen_helper_vmv_v_x_h,
162
+ gen_helper_vmv_v_x_w, gen_helper_vmv_v_x_d,
163
+ };
164
+ TCGLabel *over = gen_new_label();
165
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
166
+
167
+ s1 = tcg_const_i64(simm);
168
+ dest = tcg_temp_new_ptr();
169
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
170
+ tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd));
171
+ fns[s->sew](dest, s1, cpu_env, desc);
172
+
173
+ tcg_temp_free_ptr(dest);
174
+ tcg_temp_free_i32(desc);
175
+ tcg_temp_free_i64(s1);
176
+ gen_set_label(over);
177
+ }
178
+ return true;
179
+ }
180
+ return false;
181
+}
182
+
183
+GEN_OPIVV_TRANS(vmerge_vvm, opivv_vadc_check)
184
+GEN_OPIVX_TRANS(vmerge_vxm, opivx_vadc_check)
185
+GEN_OPIVI_TRANS(vmerge_vim, 0, vmerge_vxm, opivx_vadc_check)
186
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
187
index XXXXXXX..XXXXXXX 100644
188
--- a/target/riscv/vector_helper.c
189
+++ b/target/riscv/vector_helper.c
190
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX(vwmaccsu_vx_w, 4, 8, clearq)
191
GEN_VEXT_VX(vwmaccus_vx_b, 1, 2, clearh)
192
GEN_VEXT_VX(vwmaccus_vx_h, 2, 4, clearl)
193
GEN_VEXT_VX(vwmaccus_vx_w, 4, 8, clearq)
194
+
195
+/* Vector Integer Merge and Move Instructions */
196
+#define GEN_VEXT_VMV_VV(NAME, ETYPE, H, CLEAR_FN) \
197
+void HELPER(NAME)(void *vd, void *vs1, CPURISCVState *env, \
198
+ uint32_t desc) \
199
+{ \
200
+ uint32_t vl = env->vl; \
201
+ uint32_t esz = sizeof(ETYPE); \
202
+ uint32_t vlmax = vext_maxsz(desc) / esz; \
203
+ uint32_t i; \
204
+ \
205
+ for (i = 0; i < vl; i++) { \
206
+ ETYPE s1 = *((ETYPE *)vs1 + H(i)); \
207
+ *((ETYPE *)vd + H(i)) = s1; \
208
+ } \
209
+ CLEAR_FN(vd, vl, vl * esz, vlmax * esz); \
210
+}
211
+
212
+GEN_VEXT_VMV_VV(vmv_v_v_b, int8_t, H1, clearb)
213
+GEN_VEXT_VMV_VV(vmv_v_v_h, int16_t, H2, clearh)
214
+GEN_VEXT_VMV_VV(vmv_v_v_w, int32_t, H4, clearl)
215
+GEN_VEXT_VMV_VV(vmv_v_v_d, int64_t, H8, clearq)
216
+
217
+#define GEN_VEXT_VMV_VX(NAME, ETYPE, H, CLEAR_FN) \
218
+void HELPER(NAME)(void *vd, uint64_t s1, CPURISCVState *env, \
219
+ uint32_t desc) \
220
+{ \
221
+ uint32_t vl = env->vl; \
222
+ uint32_t esz = sizeof(ETYPE); \
223
+ uint32_t vlmax = vext_maxsz(desc) / esz; \
224
+ uint32_t i; \
225
+ \
226
+ for (i = 0; i < vl; i++) { \
227
+ *((ETYPE *)vd + H(i)) = (ETYPE)s1; \
228
+ } \
229
+ CLEAR_FN(vd, vl, vl * esz, vlmax * esz); \
230
+}
231
+
232
+GEN_VEXT_VMV_VX(vmv_v_x_b, int8_t, H1, clearb)
233
+GEN_VEXT_VMV_VX(vmv_v_x_h, int16_t, H2, clearh)
234
+GEN_VEXT_VMV_VX(vmv_v_x_w, int32_t, H4, clearl)
235
+GEN_VEXT_VMV_VX(vmv_v_x_d, int64_t, H8, clearq)
236
+
237
+#define GEN_VEXT_VMERGE_VV(NAME, ETYPE, H, CLEAR_FN) \
238
+void HELPER(NAME)(void *vd, void *v0, void *vs1, void *vs2, \
239
+ CPURISCVState *env, uint32_t desc) \
240
+{ \
241
+ uint32_t mlen = vext_mlen(desc); \
242
+ uint32_t vl = env->vl; \
243
+ uint32_t esz = sizeof(ETYPE); \
244
+ uint32_t vlmax = vext_maxsz(desc) / esz; \
245
+ uint32_t i; \
246
+ \
247
+ for (i = 0; i < vl; i++) { \
248
+ ETYPE *vt = (!vext_elem_mask(v0, mlen, i) ? vs2 : vs1); \
249
+ *((ETYPE *)vd + H(i)) = *(vt + H(i)); \
250
+ } \
251
+ CLEAR_FN(vd, vl, vl * esz, vlmax * esz); \
252
+}
253
+
254
+GEN_VEXT_VMERGE_VV(vmerge_vvm_b, int8_t, H1, clearb)
255
+GEN_VEXT_VMERGE_VV(vmerge_vvm_h, int16_t, H2, clearh)
256
+GEN_VEXT_VMERGE_VV(vmerge_vvm_w, int32_t, H4, clearl)
257
+GEN_VEXT_VMERGE_VV(vmerge_vvm_d, int64_t, H8, clearq)
258
+
259
+#define GEN_VEXT_VMERGE_VX(NAME, ETYPE, H, CLEAR_FN) \
260
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, \
261
+ void *vs2, CPURISCVState *env, uint32_t desc) \
262
+{ \
263
+ uint32_t mlen = vext_mlen(desc); \
264
+ uint32_t vl = env->vl; \
265
+ uint32_t esz = sizeof(ETYPE); \
266
+ uint32_t vlmax = vext_maxsz(desc) / esz; \
267
+ uint32_t i; \
268
+ \
269
+ for (i = 0; i < vl; i++) { \
270
+ ETYPE s2 = *((ETYPE *)vs2 + H(i)); \
271
+ ETYPE d = (!vext_elem_mask(v0, mlen, i) ? s2 : \
272
+ (ETYPE)(target_long)s1); \
273
+ *((ETYPE *)vd + H(i)) = d; \
274
+ } \
275
+ CLEAR_FN(vd, vl, vl * esz, vlmax * esz); \
276
+}
277
+
278
+GEN_VEXT_VMERGE_VX(vmerge_vxm_b, int8_t, H1, clearb)
279
+GEN_VEXT_VMERGE_VX(vmerge_vxm_h, int16_t, H2, clearh)
280
+GEN_VEXT_VMERGE_VX(vmerge_vxm_w, int32_t, H4, clearl)
281
+GEN_VEXT_VMERGE_VX(vmerge_vxm_d, int64_t, H8, clearq)
282
--
283
2.27.0
284
285
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-25-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 33 ++
10
target/riscv/insn32.decode | 10 +
11
target/riscv/insn_trans/trans_rvv.inc.c | 16 +
12
target/riscv/vector_helper.c | 385 ++++++++++++++++++++++++
13
4 files changed, 444 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_4(vmv_v_x_b, void, ptr, i64, env, i32)
20
DEF_HELPER_4(vmv_v_x_h, void, ptr, i64, env, i32)
21
DEF_HELPER_4(vmv_v_x_w, void, ptr, i64, env, i32)
22
DEF_HELPER_4(vmv_v_x_d, void, ptr, i64, env, i32)
23
+
24
+DEF_HELPER_6(vsaddu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vsaddu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vsaddu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vsaddu_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vsadd_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vsadd_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vsadd_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vsadd_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vssubu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vssubu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vssubu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vssubu_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vssub_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
37
+DEF_HELPER_6(vssub_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
38
+DEF_HELPER_6(vssub_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
39
+DEF_HELPER_6(vssub_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
40
+DEF_HELPER_6(vsaddu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vsaddu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vsaddu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vsaddu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vsadd_vx_b, void, ptr, ptr, tl, ptr, env, i32)
45
+DEF_HELPER_6(vsadd_vx_h, void, ptr, ptr, tl, ptr, env, i32)
46
+DEF_HELPER_6(vsadd_vx_w, void, ptr, ptr, tl, ptr, env, i32)
47
+DEF_HELPER_6(vsadd_vx_d, void, ptr, ptr, tl, ptr, env, i32)
48
+DEF_HELPER_6(vssubu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
49
+DEF_HELPER_6(vssubu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
50
+DEF_HELPER_6(vssubu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
51
+DEF_HELPER_6(vssubu_vx_d, void, ptr, ptr, tl, ptr, env, i32)
52
+DEF_HELPER_6(vssub_vx_b, void, ptr, ptr, tl, ptr, env, i32)
53
+DEF_HELPER_6(vssub_vx_h, void, ptr, ptr, tl, ptr, env, i32)
54
+DEF_HELPER_6(vssub_vx_w, void, ptr, ptr, tl, ptr, env, i32)
55
+DEF_HELPER_6(vssub_vx_d, void, ptr, ptr, tl, ptr, env, i32)
56
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/riscv/insn32.decode
59
+++ b/target/riscv/insn32.decode
60
@@ -XXX,XX +XXX,XX @@ vmv_v_i 010111 1 00000 ..... 011 ..... 1010111 @r2
61
vmerge_vvm 010111 0 ..... ..... 000 ..... 1010111 @r_vm_0
62
vmerge_vxm 010111 0 ..... ..... 100 ..... 1010111 @r_vm_0
63
vmerge_vim 010111 0 ..... ..... 011 ..... 1010111 @r_vm_0
64
+vsaddu_vv 100000 . ..... ..... 000 ..... 1010111 @r_vm
65
+vsaddu_vx 100000 . ..... ..... 100 ..... 1010111 @r_vm
66
+vsaddu_vi 100000 . ..... ..... 011 ..... 1010111 @r_vm
67
+vsadd_vv 100001 . ..... ..... 000 ..... 1010111 @r_vm
68
+vsadd_vx 100001 . ..... ..... 100 ..... 1010111 @r_vm
69
+vsadd_vi 100001 . ..... ..... 011 ..... 1010111 @r_vm
70
+vssubu_vv 100010 . ..... ..... 000 ..... 1010111 @r_vm
71
+vssubu_vx 100010 . ..... ..... 100 ..... 1010111 @r_vm
72
+vssub_vv 100011 . ..... ..... 000 ..... 1010111 @r_vm
73
+vssub_vx 100011 . ..... ..... 100 ..... 1010111 @r_vm
74
75
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
76
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
77
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/target/riscv/insn_trans/trans_rvv.inc.c
80
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
81
@@ -XXX,XX +XXX,XX @@ static bool trans_vmv_v_i(DisasContext *s, arg_vmv_v_i *a)
82
GEN_OPIVV_TRANS(vmerge_vvm, opivv_vadc_check)
83
GEN_OPIVX_TRANS(vmerge_vxm, opivx_vadc_check)
84
GEN_OPIVI_TRANS(vmerge_vim, 0, vmerge_vxm, opivx_vadc_check)
85
+
86
+/*
87
+ *** Vector Fixed-Point Arithmetic Instructions
88
+ */
89
+
90
+/* Vector Single-Width Saturating Add and Subtract */
91
+GEN_OPIVV_TRANS(vsaddu_vv, opivv_check)
92
+GEN_OPIVV_TRANS(vsadd_vv, opivv_check)
93
+GEN_OPIVV_TRANS(vssubu_vv, opivv_check)
94
+GEN_OPIVV_TRANS(vssub_vv, opivv_check)
95
+GEN_OPIVX_TRANS(vsaddu_vx, opivx_check)
96
+GEN_OPIVX_TRANS(vsadd_vx, opivx_check)
97
+GEN_OPIVX_TRANS(vssubu_vx, opivx_check)
98
+GEN_OPIVX_TRANS(vssub_vx, opivx_check)
99
+GEN_OPIVI_TRANS(vsaddu_vi, 1, vsaddu_vx, opivx_check)
100
+GEN_OPIVI_TRANS(vsadd_vi, 0, vsadd_vx, opivx_check)
101
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
102
index XXXXXXX..XXXXXXX 100644
103
--- a/target/riscv/vector_helper.c
104
+++ b/target/riscv/vector_helper.c
105
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VMERGE_VX(vmerge_vxm_b, int8_t, H1, clearb)
106
GEN_VEXT_VMERGE_VX(vmerge_vxm_h, int16_t, H2, clearh)
107
GEN_VEXT_VMERGE_VX(vmerge_vxm_w, int32_t, H4, clearl)
108
GEN_VEXT_VMERGE_VX(vmerge_vxm_d, int64_t, H8, clearq)
109
+
110
+/*
111
+ *** Vector Fixed-Point Arithmetic Instructions
112
+ */
113
+
114
+/* Vector Single-Width Saturating Add and Subtract */
115
+
116
+/*
117
+ * As fixed point instructions probably have round mode and saturation,
118
+ * define common macros for fixed point here.
119
+ */
120
+typedef void opivv2_rm_fn(void *vd, void *vs1, void *vs2, int i,
121
+ CPURISCVState *env, int vxrm);
122
+
123
+#define OPIVV2_RM(NAME, TD, T1, T2, TX1, TX2, HD, HS1, HS2, OP) \
124
+static inline void \
125
+do_##NAME(void *vd, void *vs1, void *vs2, int i, \
126
+ CPURISCVState *env, int vxrm) \
127
+{ \
128
+ TX1 s1 = *((T1 *)vs1 + HS1(i)); \
129
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
130
+ *((TD *)vd + HD(i)) = OP(env, vxrm, s2, s1); \
131
+}
132
+
133
+static inline void
134
+vext_vv_rm_1(void *vd, void *v0, void *vs1, void *vs2,
135
+ CPURISCVState *env,
136
+ uint32_t vl, uint32_t vm, uint32_t mlen, int vxrm,
137
+ opivv2_rm_fn *fn)
138
+{
139
+ for (uint32_t i = 0; i < vl; i++) {
140
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
141
+ continue;
142
+ }
143
+ fn(vd, vs1, vs2, i, env, vxrm);
144
+ }
145
+}
146
+
147
+static inline void
148
+vext_vv_rm_2(void *vd, void *v0, void *vs1, void *vs2,
149
+ CPURISCVState *env,
150
+ uint32_t desc, uint32_t esz, uint32_t dsz,
151
+ opivv2_rm_fn *fn, clear_fn *clearfn)
152
+{
153
+ uint32_t vlmax = vext_maxsz(desc) / esz;
154
+ uint32_t mlen = vext_mlen(desc);
155
+ uint32_t vm = vext_vm(desc);
156
+ uint32_t vl = env->vl;
157
+
158
+ switch (env->vxrm) {
159
+ case 0: /* rnu */
160
+ vext_vv_rm_1(vd, v0, vs1, vs2,
161
+ env, vl, vm, mlen, 0, fn);
162
+ break;
163
+ case 1: /* rne */
164
+ vext_vv_rm_1(vd, v0, vs1, vs2,
165
+ env, vl, vm, mlen, 1, fn);
166
+ break;
167
+ case 2: /* rdn */
168
+ vext_vv_rm_1(vd, v0, vs1, vs2,
169
+ env, vl, vm, mlen, 2, fn);
170
+ break;
171
+ default: /* rod */
172
+ vext_vv_rm_1(vd, v0, vs1, vs2,
173
+ env, vl, vm, mlen, 3, fn);
174
+ break;
175
+ }
176
+
177
+ clearfn(vd, vl, vl * dsz, vlmax * dsz);
178
+}
179
+
180
+/* generate helpers for fixed point instructions with OPIVV format */
181
+#define GEN_VEXT_VV_RM(NAME, ESZ, DSZ, CLEAR_FN) \
182
+void HELPER(NAME)(void *vd, void *v0, void *vs1, void *vs2, \
183
+ CPURISCVState *env, uint32_t desc) \
184
+{ \
185
+ vext_vv_rm_2(vd, v0, vs1, vs2, env, desc, ESZ, DSZ, \
186
+ do_##NAME, CLEAR_FN); \
187
+}
188
+
189
+static inline uint8_t saddu8(CPURISCVState *env, int vxrm, uint8_t a, uint8_t b)
190
+{
191
+ uint8_t res = a + b;
192
+ if (res < a) {
193
+ res = UINT8_MAX;
194
+ env->vxsat = 0x1;
195
+ }
196
+ return res;
197
+}
198
+
199
+static inline uint16_t saddu16(CPURISCVState *env, int vxrm, uint16_t a,
200
+ uint16_t b)
201
+{
202
+ uint16_t res = a + b;
203
+ if (res < a) {
204
+ res = UINT16_MAX;
205
+ env->vxsat = 0x1;
206
+ }
207
+ return res;
208
+}
209
+
210
+static inline uint32_t saddu32(CPURISCVState *env, int vxrm, uint32_t a,
211
+ uint32_t b)
212
+{
213
+ uint32_t res = a + b;
214
+ if (res < a) {
215
+ res = UINT32_MAX;
216
+ env->vxsat = 0x1;
217
+ }
218
+ return res;
219
+}
220
+
221
+static inline uint64_t saddu64(CPURISCVState *env, int vxrm, uint64_t a,
222
+ uint64_t b)
223
+{
224
+ uint64_t res = a + b;
225
+ if (res < a) {
226
+ res = UINT64_MAX;
227
+ env->vxsat = 0x1;
228
+ }
229
+ return res;
230
+}
231
+
232
+RVVCALL(OPIVV2_RM, vsaddu_vv_b, OP_UUU_B, H1, H1, H1, saddu8)
233
+RVVCALL(OPIVV2_RM, vsaddu_vv_h, OP_UUU_H, H2, H2, H2, saddu16)
234
+RVVCALL(OPIVV2_RM, vsaddu_vv_w, OP_UUU_W, H4, H4, H4, saddu32)
235
+RVVCALL(OPIVV2_RM, vsaddu_vv_d, OP_UUU_D, H8, H8, H8, saddu64)
236
+GEN_VEXT_VV_RM(vsaddu_vv_b, 1, 1, clearb)
237
+GEN_VEXT_VV_RM(vsaddu_vv_h, 2, 2, clearh)
238
+GEN_VEXT_VV_RM(vsaddu_vv_w, 4, 4, clearl)
239
+GEN_VEXT_VV_RM(vsaddu_vv_d, 8, 8, clearq)
240
+
241
+typedef void opivx2_rm_fn(void *vd, target_long s1, void *vs2, int i,
242
+ CPURISCVState *env, int vxrm);
243
+
244
+#define OPIVX2_RM(NAME, TD, T1, T2, TX1, TX2, HD, HS2, OP) \
245
+static inline void \
246
+do_##NAME(void *vd, target_long s1, void *vs2, int i, \
247
+ CPURISCVState *env, int vxrm) \
248
+{ \
249
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
250
+ *((TD *)vd + HD(i)) = OP(env, vxrm, s2, (TX1)(T1)s1); \
251
+}
252
+
253
+static inline void
254
+vext_vx_rm_1(void *vd, void *v0, target_long s1, void *vs2,
255
+ CPURISCVState *env,
256
+ uint32_t vl, uint32_t vm, uint32_t mlen, int vxrm,
257
+ opivx2_rm_fn *fn)
258
+{
259
+ for (uint32_t i = 0; i < vl; i++) {
260
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
261
+ continue;
262
+ }
263
+ fn(vd, s1, vs2, i, env, vxrm);
264
+ }
265
+}
266
+
267
+static inline void
268
+vext_vx_rm_2(void *vd, void *v0, target_long s1, void *vs2,
269
+ CPURISCVState *env,
270
+ uint32_t desc, uint32_t esz, uint32_t dsz,
271
+ opivx2_rm_fn *fn, clear_fn *clearfn)
272
+{
273
+ uint32_t vlmax = vext_maxsz(desc) / esz;
274
+ uint32_t mlen = vext_mlen(desc);
275
+ uint32_t vm = vext_vm(desc);
276
+ uint32_t vl = env->vl;
277
+
278
+ switch (env->vxrm) {
279
+ case 0: /* rnu */
280
+ vext_vx_rm_1(vd, v0, s1, vs2,
281
+ env, vl, vm, mlen, 0, fn);
282
+ break;
283
+ case 1: /* rne */
284
+ vext_vx_rm_1(vd, v0, s1, vs2,
285
+ env, vl, vm, mlen, 1, fn);
286
+ break;
287
+ case 2: /* rdn */
288
+ vext_vx_rm_1(vd, v0, s1, vs2,
289
+ env, vl, vm, mlen, 2, fn);
290
+ break;
291
+ default: /* rod */
292
+ vext_vx_rm_1(vd, v0, s1, vs2,
293
+ env, vl, vm, mlen, 3, fn);
294
+ break;
295
+ }
296
+
297
+ clearfn(vd, vl, vl * dsz, vlmax * dsz);
298
+}
299
+
300
+/* generate helpers for fixed point instructions with OPIVX format */
301
+#define GEN_VEXT_VX_RM(NAME, ESZ, DSZ, CLEAR_FN) \
302
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, \
303
+ void *vs2, CPURISCVState *env, uint32_t desc) \
304
+{ \
305
+ vext_vx_rm_2(vd, v0, s1, vs2, env, desc, ESZ, DSZ, \
306
+ do_##NAME, CLEAR_FN); \
307
+}
308
+
309
+RVVCALL(OPIVX2_RM, vsaddu_vx_b, OP_UUU_B, H1, H1, saddu8)
310
+RVVCALL(OPIVX2_RM, vsaddu_vx_h, OP_UUU_H, H2, H2, saddu16)
311
+RVVCALL(OPIVX2_RM, vsaddu_vx_w, OP_UUU_W, H4, H4, saddu32)
312
+RVVCALL(OPIVX2_RM, vsaddu_vx_d, OP_UUU_D, H8, H8, saddu64)
313
+GEN_VEXT_VX_RM(vsaddu_vx_b, 1, 1, clearb)
314
+GEN_VEXT_VX_RM(vsaddu_vx_h, 2, 2, clearh)
315
+GEN_VEXT_VX_RM(vsaddu_vx_w, 4, 4, clearl)
316
+GEN_VEXT_VX_RM(vsaddu_vx_d, 8, 8, clearq)
317
+
318
+static inline int8_t sadd8(CPURISCVState *env, int vxrm, int8_t a, int8_t b)
319
+{
320
+ int8_t res = a + b;
321
+ if ((res ^ a) & (res ^ b) & INT8_MIN) {
322
+ res = a > 0 ? INT8_MAX : INT8_MIN;
323
+ env->vxsat = 0x1;
324
+ }
325
+ return res;
326
+}
327
+
328
+static inline int16_t sadd16(CPURISCVState *env, int vxrm, int16_t a, int16_t b)
329
+{
330
+ int16_t res = a + b;
331
+ if ((res ^ a) & (res ^ b) & INT16_MIN) {
332
+ res = a > 0 ? INT16_MAX : INT16_MIN;
333
+ env->vxsat = 0x1;
334
+ }
335
+ return res;
336
+}
337
+
338
+static inline int32_t sadd32(CPURISCVState *env, int vxrm, int32_t a, int32_t b)
339
+{
340
+ int32_t res = a + b;
341
+ if ((res ^ a) & (res ^ b) & INT32_MIN) {
342
+ res = a > 0 ? INT32_MAX : INT32_MIN;
343
+ env->vxsat = 0x1;
344
+ }
345
+ return res;
346
+}
347
+
348
+static inline int64_t sadd64(CPURISCVState *env, int vxrm, int64_t a, int64_t b)
349
+{
350
+ int64_t res = a + b;
351
+ if ((res ^ a) & (res ^ b) & INT64_MIN) {
352
+ res = a > 0 ? INT64_MAX : INT64_MIN;
353
+ env->vxsat = 0x1;
354
+ }
355
+ return res;
356
+}
357
+
358
+RVVCALL(OPIVV2_RM, vsadd_vv_b, OP_SSS_B, H1, H1, H1, sadd8)
359
+RVVCALL(OPIVV2_RM, vsadd_vv_h, OP_SSS_H, H2, H2, H2, sadd16)
360
+RVVCALL(OPIVV2_RM, vsadd_vv_w, OP_SSS_W, H4, H4, H4, sadd32)
361
+RVVCALL(OPIVV2_RM, vsadd_vv_d, OP_SSS_D, H8, H8, H8, sadd64)
362
+GEN_VEXT_VV_RM(vsadd_vv_b, 1, 1, clearb)
363
+GEN_VEXT_VV_RM(vsadd_vv_h, 2, 2, clearh)
364
+GEN_VEXT_VV_RM(vsadd_vv_w, 4, 4, clearl)
365
+GEN_VEXT_VV_RM(vsadd_vv_d, 8, 8, clearq)
366
+
367
+RVVCALL(OPIVX2_RM, vsadd_vx_b, OP_SSS_B, H1, H1, sadd8)
368
+RVVCALL(OPIVX2_RM, vsadd_vx_h, OP_SSS_H, H2, H2, sadd16)
369
+RVVCALL(OPIVX2_RM, vsadd_vx_w, OP_SSS_W, H4, H4, sadd32)
370
+RVVCALL(OPIVX2_RM, vsadd_vx_d, OP_SSS_D, H8, H8, sadd64)
371
+GEN_VEXT_VX_RM(vsadd_vx_b, 1, 1, clearb)
372
+GEN_VEXT_VX_RM(vsadd_vx_h, 2, 2, clearh)
373
+GEN_VEXT_VX_RM(vsadd_vx_w, 4, 4, clearl)
374
+GEN_VEXT_VX_RM(vsadd_vx_d, 8, 8, clearq)
375
+
376
+static inline uint8_t ssubu8(CPURISCVState *env, int vxrm, uint8_t a, uint8_t b)
377
+{
378
+ uint8_t res = a - b;
379
+ if (res > a) {
380
+ res = 0;
381
+ env->vxsat = 0x1;
382
+ }
383
+ return res;
384
+}
385
+
386
+static inline uint16_t ssubu16(CPURISCVState *env, int vxrm, uint16_t a,
387
+ uint16_t b)
388
+{
389
+ uint16_t res = a - b;
390
+ if (res > a) {
391
+ res = 0;
392
+ env->vxsat = 0x1;
393
+ }
394
+ return res;
395
+}
396
+
397
+static inline uint32_t ssubu32(CPURISCVState *env, int vxrm, uint32_t a,
398
+ uint32_t b)
399
+{
400
+ uint32_t res = a - b;
401
+ if (res > a) {
402
+ res = 0;
403
+ env->vxsat = 0x1;
404
+ }
405
+ return res;
406
+}
407
+
408
+static inline uint64_t ssubu64(CPURISCVState *env, int vxrm, uint64_t a,
409
+ uint64_t b)
410
+{
411
+ uint64_t res = a - b;
412
+ if (res > a) {
413
+ res = 0;
414
+ env->vxsat = 0x1;
415
+ }
416
+ return res;
417
+}
418
+
419
+RVVCALL(OPIVV2_RM, vssubu_vv_b, OP_UUU_B, H1, H1, H1, ssubu8)
420
+RVVCALL(OPIVV2_RM, vssubu_vv_h, OP_UUU_H, H2, H2, H2, ssubu16)
421
+RVVCALL(OPIVV2_RM, vssubu_vv_w, OP_UUU_W, H4, H4, H4, ssubu32)
422
+RVVCALL(OPIVV2_RM, vssubu_vv_d, OP_UUU_D, H8, H8, H8, ssubu64)
423
+GEN_VEXT_VV_RM(vssubu_vv_b, 1, 1, clearb)
424
+GEN_VEXT_VV_RM(vssubu_vv_h, 2, 2, clearh)
425
+GEN_VEXT_VV_RM(vssubu_vv_w, 4, 4, clearl)
426
+GEN_VEXT_VV_RM(vssubu_vv_d, 8, 8, clearq)
427
+
428
+RVVCALL(OPIVX2_RM, vssubu_vx_b, OP_UUU_B, H1, H1, ssubu8)
429
+RVVCALL(OPIVX2_RM, vssubu_vx_h, OP_UUU_H, H2, H2, ssubu16)
430
+RVVCALL(OPIVX2_RM, vssubu_vx_w, OP_UUU_W, H4, H4, ssubu32)
431
+RVVCALL(OPIVX2_RM, vssubu_vx_d, OP_UUU_D, H8, H8, ssubu64)
432
+GEN_VEXT_VX_RM(vssubu_vx_b, 1, 1, clearb)
433
+GEN_VEXT_VX_RM(vssubu_vx_h, 2, 2, clearh)
434
+GEN_VEXT_VX_RM(vssubu_vx_w, 4, 4, clearl)
435
+GEN_VEXT_VX_RM(vssubu_vx_d, 8, 8, clearq)
436
+
437
+static inline int8_t ssub8(CPURISCVState *env, int vxrm, int8_t a, int8_t b)
438
+{
439
+ int8_t res = a - b;
440
+ if ((res ^ a) & (a ^ b) & INT8_MIN) {
441
+ res = a > 0 ? INT8_MAX : INT8_MIN;
442
+ env->vxsat = 0x1;
443
+ }
444
+ return res;
445
+}
446
+
447
+static inline int16_t ssub16(CPURISCVState *env, int vxrm, int16_t a, int16_t b)
448
+{
449
+ int16_t res = a - b;
450
+ if ((res ^ a) & (a ^ b) & INT16_MIN) {
451
+ res = a > 0 ? INT16_MAX : INT16_MIN;
452
+ env->vxsat = 0x1;
453
+ }
454
+ return res;
455
+}
456
+
457
+static inline int32_t ssub32(CPURISCVState *env, int vxrm, int32_t a, int32_t b)
458
+{
459
+ int32_t res = a - b;
460
+ if ((res ^ a) & (a ^ b) & INT32_MIN) {
461
+ res = a > 0 ? INT32_MAX : INT32_MIN;
462
+ env->vxsat = 0x1;
463
+ }
464
+ return res;
465
+}
466
+
467
+static inline int64_t ssub64(CPURISCVState *env, int vxrm, int64_t a, int64_t b)
468
+{
469
+ int64_t res = a - b;
470
+ if ((res ^ a) & (a ^ b) & INT64_MIN) {
471
+ res = a > 0 ? INT64_MAX : INT64_MIN;
472
+ env->vxsat = 0x1;
473
+ }
474
+ return res;
475
+}
476
+
477
+RVVCALL(OPIVV2_RM, vssub_vv_b, OP_SSS_B, H1, H1, H1, ssub8)
478
+RVVCALL(OPIVV2_RM, vssub_vv_h, OP_SSS_H, H2, H2, H2, ssub16)
479
+RVVCALL(OPIVV2_RM, vssub_vv_w, OP_SSS_W, H4, H4, H4, ssub32)
480
+RVVCALL(OPIVV2_RM, vssub_vv_d, OP_SSS_D, H8, H8, H8, ssub64)
481
+GEN_VEXT_VV_RM(vssub_vv_b, 1, 1, clearb)
482
+GEN_VEXT_VV_RM(vssub_vv_h, 2, 2, clearh)
483
+GEN_VEXT_VV_RM(vssub_vv_w, 4, 4, clearl)
484
+GEN_VEXT_VV_RM(vssub_vv_d, 8, 8, clearq)
485
+
486
+RVVCALL(OPIVX2_RM, vssub_vx_b, OP_SSS_B, H1, H1, ssub8)
487
+RVVCALL(OPIVX2_RM, vssub_vx_h, OP_SSS_H, H2, H2, ssub16)
488
+RVVCALL(OPIVX2_RM, vssub_vx_w, OP_SSS_W, H4, H4, ssub32)
489
+RVVCALL(OPIVX2_RM, vssub_vx_d, OP_SSS_D, H8, H8, ssub64)
490
+GEN_VEXT_VX_RM(vssub_vx_b, 1, 1, clearb)
491
+GEN_VEXT_VX_RM(vssub_vx_h, 2, 2, clearh)
492
+GEN_VEXT_VX_RM(vssub_vx_w, 4, 4, clearl)
493
+GEN_VEXT_VX_RM(vssub_vx_d, 8, 8, clearq)
494
--
495
2.27.0
496
497
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
Microchip PolarFire SoC MMUART is ns16550 compatible, with some
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
additional registers. Create a simple MMUART model built on top
5
of the existing ns16550 model.
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1598924352-89526-6-git-send-email-bmeng.cn@gmail.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-Id: <20200701152549.1218-26-zhiwei_liu@c-sky.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
8
---
12
include/hw/char/mchp_pfsoc_mmuart.h | 61 ++++++++++++++++++++
9
target/riscv/helper.h | 17 ++++
13
hw/char/mchp_pfsoc_mmuart.c | 86 +++++++++++++++++++++++++++++
10
target/riscv/insn32.decode | 5 ++
14
MAINTAINERS | 2 +
11
target/riscv/insn_trans/trans_rvv.inc.c | 7 ++
15
hw/char/Kconfig | 3 +
12
target/riscv/vector_helper.c | 100 ++++++++++++++++++++++++
16
hw/char/meson.build | 1 +
13
4 files changed, 129 insertions(+)
17
5 files changed, 153 insertions(+)
18
create mode 100644 include/hw/char/mchp_pfsoc_mmuart.h
19
create mode 100644 hw/char/mchp_pfsoc_mmuart.c
20
14
21
diff --git a/include/hw/char/mchp_pfsoc_mmuart.h b/include/hw/char/mchp_pfsoc_mmuart.h
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
22
new file mode 100644
16
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX
17
--- a/target/riscv/helper.h
24
--- /dev/null
18
+++ b/target/riscv/helper.h
25
+++ b/include/hw/char/mchp_pfsoc_mmuart.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vssub_vx_b, void, ptr, ptr, tl, ptr, env, i32)
26
@@ -XXX,XX +XXX,XX @@
20
DEF_HELPER_6(vssub_vx_h, void, ptr, ptr, tl, ptr, env, i32)
27
+/*
21
DEF_HELPER_6(vssub_vx_w, void, ptr, ptr, tl, ptr, env, i32)
28
+ * Microchip PolarFire SoC MMUART emulation
22
DEF_HELPER_6(vssub_vx_d, void, ptr, ptr, tl, ptr, env, i32)
29
+ *
30
+ * Copyright (c) 2020 Wind River Systems, Inc.
31
+ *
32
+ * Author:
33
+ * Bin Meng <bin.meng@windriver.com>
34
+ *
35
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
36
+ * of this software and associated documentation files (the "Software"), to deal
37
+ * in the Software without restriction, including without limitation the rights
38
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
39
+ * copies of the Software, and to permit persons to whom the Software is
40
+ * furnished to do so, subject to the following conditions:
41
+ *
42
+ * The above copyright notice and this permission notice shall be included in
43
+ * all copies or substantial portions of the Software.
44
+ *
45
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
46
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
47
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
48
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
49
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
50
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
51
+ * THE SOFTWARE.
52
+ */
53
+
23
+
54
+#ifndef HW_MCHP_PFSOC_MMUART_H
24
+DEF_HELPER_6(vaadd_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
55
+#define HW_MCHP_PFSOC_MMUART_H
25
+DEF_HELPER_6(vaadd_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vaadd_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vaadd_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vasub_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vasub_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vasub_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vasub_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vaadd_vx_b, void, ptr, ptr, tl, ptr, env, i32)
33
+DEF_HELPER_6(vaadd_vx_h, void, ptr, ptr, tl, ptr, env, i32)
34
+DEF_HELPER_6(vaadd_vx_w, void, ptr, ptr, tl, ptr, env, i32)
35
+DEF_HELPER_6(vaadd_vx_d, void, ptr, ptr, tl, ptr, env, i32)
36
+DEF_HELPER_6(vasub_vx_b, void, ptr, ptr, tl, ptr, env, i32)
37
+DEF_HELPER_6(vasub_vx_h, void, ptr, ptr, tl, ptr, env, i32)
38
+DEF_HELPER_6(vasub_vx_w, void, ptr, ptr, tl, ptr, env, i32)
39
+DEF_HELPER_6(vasub_vx_d, void, ptr, ptr, tl, ptr, env, i32)
40
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/riscv/insn32.decode
43
+++ b/target/riscv/insn32.decode
44
@@ -XXX,XX +XXX,XX @@ vssubu_vv 100010 . ..... ..... 000 ..... 1010111 @r_vm
45
vssubu_vx 100010 . ..... ..... 100 ..... 1010111 @r_vm
46
vssub_vv 100011 . ..... ..... 000 ..... 1010111 @r_vm
47
vssub_vx 100011 . ..... ..... 100 ..... 1010111 @r_vm
48
+vaadd_vv 100100 . ..... ..... 000 ..... 1010111 @r_vm
49
+vaadd_vx 100100 . ..... ..... 100 ..... 1010111 @r_vm
50
+vaadd_vi 100100 . ..... ..... 011 ..... 1010111 @r_vm
51
+vasub_vv 100110 . ..... ..... 000 ..... 1010111 @r_vm
52
+vasub_vx 100110 . ..... ..... 100 ..... 1010111 @r_vm
53
54
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
55
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
56
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/riscv/insn_trans/trans_rvv.inc.c
59
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
60
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_TRANS(vssubu_vx, opivx_check)
61
GEN_OPIVX_TRANS(vssub_vx, opivx_check)
62
GEN_OPIVI_TRANS(vsaddu_vi, 1, vsaddu_vx, opivx_check)
63
GEN_OPIVI_TRANS(vsadd_vi, 0, vsadd_vx, opivx_check)
56
+
64
+
57
+#include "hw/char/serial.h"
65
+/* Vector Single-Width Averaging Add and Subtract */
66
+GEN_OPIVV_TRANS(vaadd_vv, opivv_check)
67
+GEN_OPIVV_TRANS(vasub_vv, opivv_check)
68
+GEN_OPIVX_TRANS(vaadd_vx, opivx_check)
69
+GEN_OPIVX_TRANS(vasub_vx, opivx_check)
70
+GEN_OPIVI_TRANS(vaadd_vi, 0, vaadd_vx, opivx_check)
71
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
72
index XXXXXXX..XXXXXXX 100644
73
--- a/target/riscv/vector_helper.c
74
+++ b/target/riscv/vector_helper.c
75
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX_RM(vssub_vx_b, 1, 1, clearb)
76
GEN_VEXT_VX_RM(vssub_vx_h, 2, 2, clearh)
77
GEN_VEXT_VX_RM(vssub_vx_w, 4, 4, clearl)
78
GEN_VEXT_VX_RM(vssub_vx_d, 8, 8, clearq)
58
+
79
+
59
+#define MCHP_PFSOC_MMUART_REG_SIZE 52
80
+/* Vector Single-Width Averaging Add and Subtract */
81
+static inline uint8_t get_round(int vxrm, uint64_t v, uint8_t shift)
82
+{
83
+ uint8_t d = extract64(v, shift, 1);
84
+ uint8_t d1;
85
+ uint64_t D1, D2;
60
+
86
+
61
+typedef struct MchpPfSoCMMUartState {
87
+ if (shift == 0 || shift > 64) {
62
+ MemoryRegion iomem;
63
+ hwaddr base;
64
+ qemu_irq irq;
65
+
66
+ SerialMM *serial;
67
+
68
+ uint32_t reg[MCHP_PFSOC_MMUART_REG_SIZE / sizeof(uint32_t)];
69
+} MchpPfSoCMMUartState;
70
+
71
+/**
72
+ * mchp_pfsoc_mmuart_create - Create a Microchip PolarFire SoC MMUART
73
+ *
74
+ * This is a helper routine for board to create a MMUART device that is
75
+ * compatible with Microchip PolarFire SoC.
76
+ *
77
+ * @sysmem: system memory region to map
78
+ * @base: base address of the MMUART registers
79
+ * @irq: IRQ number of the MMUART device
80
+ * @chr: character device to associate to
81
+ *
82
+ * @return: a pointer to the device specific control structure
83
+ */
84
+MchpPfSoCMMUartState *mchp_pfsoc_mmuart_create(MemoryRegion *sysmem,
85
+ hwaddr base, qemu_irq irq, Chardev *chr);
86
+
87
+#endif /* HW_MCHP_PFSOC_MMUART_H */
88
diff --git a/hw/char/mchp_pfsoc_mmuart.c b/hw/char/mchp_pfsoc_mmuart.c
89
new file mode 100644
90
index XXXXXXX..XXXXXXX
91
--- /dev/null
92
+++ b/hw/char/mchp_pfsoc_mmuart.c
93
@@ -XXX,XX +XXX,XX @@
94
+/*
95
+ * Microchip PolarFire SoC MMUART emulation
96
+ *
97
+ * Copyright (c) 2020 Wind River Systems, Inc.
98
+ *
99
+ * Author:
100
+ * Bin Meng <bin.meng@windriver.com>
101
+ *
102
+ * This program is free software; you can redistribute it and/or
103
+ * modify it under the terms of the GNU General Public License as
104
+ * published by the Free Software Foundation; either version 2 or
105
+ * (at your option) version 3 of the License.
106
+ *
107
+ * This program is distributed in the hope that it will be useful,
108
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
109
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
110
+ * GNU General Public License for more details.
111
+ *
112
+ * You should have received a copy of the GNU General Public License along
113
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
114
+ */
115
+
116
+#include "qemu/osdep.h"
117
+#include "qemu/log.h"
118
+#include "chardev/char.h"
119
+#include "exec/address-spaces.h"
120
+#include "hw/char/mchp_pfsoc_mmuart.h"
121
+
122
+static uint64_t mchp_pfsoc_mmuart_read(void *opaque, hwaddr addr, unsigned size)
123
+{
124
+ MchpPfSoCMMUartState *s = opaque;
125
+
126
+ if (addr >= MCHP_PFSOC_MMUART_REG_SIZE) {
127
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: read: addr=0x%" HWADDR_PRIx "\n",
128
+ __func__, addr);
129
+ return 0;
88
+ return 0;
130
+ }
89
+ }
131
+
90
+
132
+ return s->reg[addr / sizeof(uint32_t)];
91
+ d1 = extract64(v, shift - 1, 1);
92
+ D1 = extract64(v, 0, shift);
93
+ if (vxrm == 0) { /* round-to-nearest-up (add +0.5 LSB) */
94
+ return d1;
95
+ } else if (vxrm == 1) { /* round-to-nearest-even */
96
+ if (shift > 1) {
97
+ D2 = extract64(v, 0, shift - 1);
98
+ return d1 & ((D2 != 0) | d);
99
+ } else {
100
+ return d1 & d;
101
+ }
102
+ } else if (vxrm == 3) { /* round-to-odd (OR bits into LSB, aka "jam") */
103
+ return !d & (D1 != 0);
104
+ }
105
+ return 0; /* round-down (truncate) */
133
+}
106
+}
134
+
107
+
135
+static void mchp_pfsoc_mmuart_write(void *opaque, hwaddr addr,
108
+static inline int32_t aadd32(CPURISCVState *env, int vxrm, int32_t a, int32_t b)
136
+ uint64_t value, unsigned size)
137
+{
109
+{
138
+ MchpPfSoCMMUartState *s = opaque;
110
+ int64_t res = (int64_t)a + b;
139
+ uint32_t val32 = (uint32_t)value;
111
+ uint8_t round = get_round(vxrm, res, 1);
140
+
112
+
141
+ if (addr >= MCHP_PFSOC_MMUART_REG_SIZE) {
113
+ return (res >> 1) + round;
142
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: bad write: addr=0x%" HWADDR_PRIx
143
+ " v=0x%x\n", __func__, addr, val32);
144
+ return;
145
+ }
146
+
147
+ s->reg[addr / sizeof(uint32_t)] = val32;
148
+}
114
+}
149
+
115
+
150
+static const MemoryRegionOps mchp_pfsoc_mmuart_ops = {
116
+static inline int64_t aadd64(CPURISCVState *env, int vxrm, int64_t a, int64_t b)
151
+ .read = mchp_pfsoc_mmuart_read,
117
+{
152
+ .write = mchp_pfsoc_mmuart_write,
118
+ int64_t res = a + b;
153
+ .endianness = DEVICE_LITTLE_ENDIAN,
119
+ uint8_t round = get_round(vxrm, res, 1);
154
+ .impl = {
120
+ int64_t over = (res ^ a) & (res ^ b) & INT64_MIN;
155
+ .min_access_size = 4,
156
+ .max_access_size = 4,
157
+ },
158
+};
159
+
121
+
160
+MchpPfSoCMMUartState *mchp_pfsoc_mmuart_create(MemoryRegion *sysmem,
122
+ /* With signed overflow, bit 64 is inverse of bit 63. */
161
+ hwaddr base, qemu_irq irq, Chardev *chr)
123
+ return ((res >> 1) ^ over) + round;
124
+}
125
+
126
+RVVCALL(OPIVV2_RM, vaadd_vv_b, OP_SSS_B, H1, H1, H1, aadd32)
127
+RVVCALL(OPIVV2_RM, vaadd_vv_h, OP_SSS_H, H2, H2, H2, aadd32)
128
+RVVCALL(OPIVV2_RM, vaadd_vv_w, OP_SSS_W, H4, H4, H4, aadd32)
129
+RVVCALL(OPIVV2_RM, vaadd_vv_d, OP_SSS_D, H8, H8, H8, aadd64)
130
+GEN_VEXT_VV_RM(vaadd_vv_b, 1, 1, clearb)
131
+GEN_VEXT_VV_RM(vaadd_vv_h, 2, 2, clearh)
132
+GEN_VEXT_VV_RM(vaadd_vv_w, 4, 4, clearl)
133
+GEN_VEXT_VV_RM(vaadd_vv_d, 8, 8, clearq)
134
+
135
+RVVCALL(OPIVX2_RM, vaadd_vx_b, OP_SSS_B, H1, H1, aadd32)
136
+RVVCALL(OPIVX2_RM, vaadd_vx_h, OP_SSS_H, H2, H2, aadd32)
137
+RVVCALL(OPIVX2_RM, vaadd_vx_w, OP_SSS_W, H4, H4, aadd32)
138
+RVVCALL(OPIVX2_RM, vaadd_vx_d, OP_SSS_D, H8, H8, aadd64)
139
+GEN_VEXT_VX_RM(vaadd_vx_b, 1, 1, clearb)
140
+GEN_VEXT_VX_RM(vaadd_vx_h, 2, 2, clearh)
141
+GEN_VEXT_VX_RM(vaadd_vx_w, 4, 4, clearl)
142
+GEN_VEXT_VX_RM(vaadd_vx_d, 8, 8, clearq)
143
+
144
+static inline int32_t asub32(CPURISCVState *env, int vxrm, int32_t a, int32_t b)
162
+{
145
+{
163
+ MchpPfSoCMMUartState *s;
146
+ int64_t res = (int64_t)a - b;
147
+ uint8_t round = get_round(vxrm, res, 1);
164
+
148
+
165
+ s = g_new0(MchpPfSoCMMUartState, 1);
149
+ return (res >> 1) + round;
150
+}
166
+
151
+
167
+ memory_region_init_io(&s->iomem, NULL, &mchp_pfsoc_mmuart_ops, s,
152
+static inline int64_t asub64(CPURISCVState *env, int vxrm, int64_t a, int64_t b)
168
+ "mchp.pfsoc.mmuart", 0x1000);
153
+{
154
+ int64_t res = (int64_t)a - b;
155
+ uint8_t round = get_round(vxrm, res, 1);
156
+ int64_t over = (res ^ a) & (a ^ b) & INT64_MIN;
169
+
157
+
170
+ s->base = base;
158
+ /* With signed overflow, bit 64 is inverse of bit 63. */
171
+ s->irq = irq;
159
+ return ((res >> 1) ^ over) + round;
160
+}
172
+
161
+
173
+ s->serial = serial_mm_init(sysmem, base, 2, irq, 399193, chr,
162
+RVVCALL(OPIVV2_RM, vasub_vv_b, OP_SSS_B, H1, H1, H1, asub32)
174
+ DEVICE_LITTLE_ENDIAN);
163
+RVVCALL(OPIVV2_RM, vasub_vv_h, OP_SSS_H, H2, H2, H2, asub32)
164
+RVVCALL(OPIVV2_RM, vasub_vv_w, OP_SSS_W, H4, H4, H4, asub32)
165
+RVVCALL(OPIVV2_RM, vasub_vv_d, OP_SSS_D, H8, H8, H8, asub64)
166
+GEN_VEXT_VV_RM(vasub_vv_b, 1, 1, clearb)
167
+GEN_VEXT_VV_RM(vasub_vv_h, 2, 2, clearh)
168
+GEN_VEXT_VV_RM(vasub_vv_w, 4, 4, clearl)
169
+GEN_VEXT_VV_RM(vasub_vv_d, 8, 8, clearq)
175
+
170
+
176
+ memory_region_add_subregion(sysmem, base + 0x20, &s->iomem);
171
+RVVCALL(OPIVX2_RM, vasub_vx_b, OP_SSS_B, H1, H1, asub32)
177
+
172
+RVVCALL(OPIVX2_RM, vasub_vx_h, OP_SSS_H, H2, H2, asub32)
178
+ return s;
173
+RVVCALL(OPIVX2_RM, vasub_vx_w, OP_SSS_W, H4, H4, asub32)
179
+}
174
+RVVCALL(OPIVX2_RM, vasub_vx_d, OP_SSS_D, H8, H8, asub64)
180
diff --git a/MAINTAINERS b/MAINTAINERS
175
+GEN_VEXT_VX_RM(vasub_vx_b, 1, 1, clearb)
181
index XXXXXXX..XXXXXXX 100644
176
+GEN_VEXT_VX_RM(vasub_vx_h, 2, 2, clearh)
182
--- a/MAINTAINERS
177
+GEN_VEXT_VX_RM(vasub_vx_w, 4, 4, clearl)
183
+++ b/MAINTAINERS
178
+GEN_VEXT_VX_RM(vasub_vx_d, 8, 8, clearq)
184
@@ -XXX,XX +XXX,XX @@ M: Bin Meng <bin.meng@windriver.com>
185
L: qemu-riscv@nongnu.org
186
S: Supported
187
F: hw/riscv/microchip_pfsoc.c
188
+F: hw/char/mchp_pfsoc_mmuart.c
189
F: include/hw/riscv/microchip_pfsoc.h
190
+F: include/hw/char/mchp_pfsoc_mmuart.h
191
192
RX Machines
193
-----------
194
diff --git a/hw/char/Kconfig b/hw/char/Kconfig
195
index XXXXXXX..XXXXXXX 100644
196
--- a/hw/char/Kconfig
197
+++ b/hw/char/Kconfig
198
@@ -XXX,XX +XXX,XX @@ config RENESAS_SCI
199
200
config AVR_USART
201
bool
202
+
203
+config MCHP_PFSOC_MMUART
204
+ bool
205
diff --git a/hw/char/meson.build b/hw/char/meson.build
206
index XXXXXXX..XXXXXXX 100644
207
--- a/hw/char/meson.build
208
+++ b/hw/char/meson.build
209
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_aux.c'))
210
softmmu_ss.add(when: 'CONFIG_RENESAS_SCI', if_true: files('renesas_sci.c'))
211
softmmu_ss.add(when: 'CONFIG_SH4', if_true: files('sh_serial.c'))
212
softmmu_ss.add(when: 'CONFIG_STM32F2XX_USART', if_true: files('stm32f2xx_usart.c'))
213
+softmmu_ss.add(when: 'CONFIG_MCHP_PFSOC_MMUART', if_true: files('mchp_pfsoc_mmuart.c'))
214
215
specific_ss.add(when: 'CONFIG_TERMINAL3270', if_true: files('terminal3270.c'))
216
specific_ss.add(when: 'CONFIG_VIRTIO', if_true: files('virtio-serial-bus.c'))
217
--
179
--
218
2.28.0
180
2.27.0
219
181
220
182
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
On the Icicle Kit board, the HSS firmware utilizes the on-chip DMA
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
controller to move the 2nd stage bootloader in the system memory.
5
Let's connect a DMA controller to Microchip PolarFire SoC.
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1598924352-89526-11-git-send-email-bmeng.cn@gmail.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-Id: <20200701152549.1218-27-zhiwei_liu@c-sky.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
8
---
12
include/hw/riscv/microchip_pfsoc.h | 11 +++++++++++
9
target/riscv/helper.h | 9 ++
13
hw/riscv/microchip_pfsoc.c | 15 +++++++++++++++
10
target/riscv/insn32.decode | 2 +
14
hw/riscv/Kconfig | 1 +
11
target/riscv/insn_trans/trans_rvv.inc.c | 4 +
15
3 files changed, 27 insertions(+)
12
target/riscv/vector_helper.c | 107 ++++++++++++++++++++++++
13
4 files changed, 122 insertions(+)
16
14
17
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
18
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/riscv/microchip_pfsoc.h
17
--- a/target/riscv/helper.h
20
+++ b/include/hw/riscv/microchip_pfsoc.h
18
+++ b/target/riscv/helper.h
21
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vasub_vx_b, void, ptr, ptr, tl, ptr, env, i32)
22
#define HW_MICROCHIP_PFSOC_H
20
DEF_HELPER_6(vasub_vx_h, void, ptr, ptr, tl, ptr, env, i32)
23
21
DEF_HELPER_6(vasub_vx_w, void, ptr, ptr, tl, ptr, env, i32)
24
#include "hw/char/mchp_pfsoc_mmuart.h"
22
DEF_HELPER_6(vasub_vx_d, void, ptr, ptr, tl, ptr, env, i32)
25
+#include "hw/dma/sifive_pdma.h"
23
+
26
#include "hw/sd/cadence_sdhci.h"
24
+DEF_HELPER_6(vsmul_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
27
25
+DEF_HELPER_6(vsmul_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
28
typedef struct MicrochipPFSoCState {
26
+DEF_HELPER_6(vsmul_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
29
@@ -XXX,XX +XXX,XX @@ typedef struct MicrochipPFSoCState {
27
+DEF_HELPER_6(vsmul_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
30
MchpPfSoCMMUartState *serial2;
28
+DEF_HELPER_6(vsmul_vx_b, void, ptr, ptr, tl, ptr, env, i32)
31
MchpPfSoCMMUartState *serial3;
29
+DEF_HELPER_6(vsmul_vx_h, void, ptr, ptr, tl, ptr, env, i32)
32
MchpPfSoCMMUartState *serial4;
30
+DEF_HELPER_6(vsmul_vx_w, void, ptr, ptr, tl, ptr, env, i32)
33
+ SiFivePDMAState dma;
31
+DEF_HELPER_6(vsmul_vx_d, void, ptr, ptr, tl, ptr, env, i32)
34
CadenceSDHCIState sdhci;
32
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
35
} MicrochipPFSoCState;
36
37
@@ -XXX,XX +XXX,XX @@ enum {
38
MICROCHIP_PFSOC_BUSERR_UNIT4,
39
MICROCHIP_PFSOC_CLINT,
40
MICROCHIP_PFSOC_L2CC,
41
+ MICROCHIP_PFSOC_DMA,
42
MICROCHIP_PFSOC_L2LIM,
43
MICROCHIP_PFSOC_PLIC,
44
MICROCHIP_PFSOC_MMUART0,
45
@@ -XXX,XX +XXX,XX @@ enum {
46
};
47
48
enum {
49
+ MICROCHIP_PFSOC_DMA_IRQ0 = 5,
50
+ MICROCHIP_PFSOC_DMA_IRQ1 = 6,
51
+ MICROCHIP_PFSOC_DMA_IRQ2 = 7,
52
+ MICROCHIP_PFSOC_DMA_IRQ3 = 8,
53
+ MICROCHIP_PFSOC_DMA_IRQ4 = 9,
54
+ MICROCHIP_PFSOC_DMA_IRQ5 = 10,
55
+ MICROCHIP_PFSOC_DMA_IRQ6 = 11,
56
+ MICROCHIP_PFSOC_DMA_IRQ7 = 12,
57
MICROCHIP_PFSOC_EMMC_SD_IRQ = 88,
58
MICROCHIP_PFSOC_MMUART0_IRQ = 90,
59
MICROCHIP_PFSOC_MMUART1_IRQ = 91,
60
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
61
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
62
--- a/hw/riscv/microchip_pfsoc.c
34
--- a/target/riscv/insn32.decode
63
+++ b/hw/riscv/microchip_pfsoc.c
35
+++ b/target/riscv/insn32.decode
64
@@ -XXX,XX +XXX,XX @@
36
@@ -XXX,XX +XXX,XX @@ vaadd_vx 100100 . ..... ..... 100 ..... 1010111 @r_vm
65
* 2) eNVM (Embedded Non-Volatile Memory)
37
vaadd_vi 100100 . ..... ..... 011 ..... 1010111 @r_vm
66
* 3) MMUARTs (Multi-Mode UART)
38
vasub_vv 100110 . ..... ..... 000 ..... 1010111 @r_vm
67
* 4) Cadence eMMC/SDHC controller and an SD card connected to it
39
vasub_vx 100110 . ..... ..... 100 ..... 1010111 @r_vm
68
+ * 5) SiFive Platform DMA (Direct Memory Access Controller)
40
+vsmul_vv 100111 . ..... ..... 000 ..... 1010111 @r_vm
69
*
41
+vsmul_vx 100111 . ..... ..... 100 ..... 1010111 @r_vm
70
* This board currently generates devicetree dynamically that indicates at least
42
71
* two harts and up to five harts.
43
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
72
@@ -XXX,XX +XXX,XX @@ static const struct MemmapEntry {
44
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
73
[MICROCHIP_PFSOC_BUSERR_UNIT4] = { 0x1704000, 0x1000 },
45
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
74
[MICROCHIP_PFSOC_CLINT] = { 0x2000000, 0x10000 },
46
index XXXXXXX..XXXXXXX 100644
75
[MICROCHIP_PFSOC_L2CC] = { 0x2010000, 0x1000 },
47
--- a/target/riscv/insn_trans/trans_rvv.inc.c
76
+ [MICROCHIP_PFSOC_DMA] = { 0x3000000, 0x100000 },
48
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
77
[MICROCHIP_PFSOC_L2LIM] = { 0x8000000, 0x2000000 },
49
@@ -XXX,XX +XXX,XX @@ GEN_OPIVV_TRANS(vasub_vv, opivv_check)
78
[MICROCHIP_PFSOC_PLIC] = { 0xc000000, 0x4000000 },
50
GEN_OPIVX_TRANS(vaadd_vx, opivx_check)
79
[MICROCHIP_PFSOC_MMUART0] = { 0x20000000, 0x1000 },
51
GEN_OPIVX_TRANS(vasub_vx, opivx_check)
80
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_instance_init(Object *obj)
52
GEN_OPIVI_TRANS(vaadd_vi, 0, vaadd_vx, opivx_check)
81
TYPE_RISCV_CPU_SIFIVE_U54);
82
qdev_prop_set_uint64(DEVICE(&s->u_cpus), "resetvec", RESET_VECTOR);
83
84
+ object_initialize_child(obj, "dma-controller", &s->dma,
85
+ TYPE_SIFIVE_PDMA);
86
+
53
+
87
object_initialize_child(obj, "sd-controller", &s->sdhci,
54
+/* Vector Single-Width Fractional Multiply with Rounding and Saturation */
88
TYPE_CADENCE_SDHCI);
55
+GEN_OPIVV_TRANS(vsmul_vv, opivv_check)
89
}
56
+GEN_OPIVX_TRANS(vsmul_vx, opivx_check)
90
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
57
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
91
memmap[MICROCHIP_PFSOC_PLIC].size);
58
index XXXXXXX..XXXXXXX 100644
92
g_free(plic_hart_config);
59
--- a/target/riscv/vector_helper.c
93
60
+++ b/target/riscv/vector_helper.c
94
+ /* DMA */
61
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX_RM(vasub_vx_b, 1, 1, clearb)
95
+ sysbus_realize(SYS_BUS_DEVICE(&s->dma), errp);
62
GEN_VEXT_VX_RM(vasub_vx_h, 2, 2, clearh)
96
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->dma), 0,
63
GEN_VEXT_VX_RM(vasub_vx_w, 4, 4, clearl)
97
+ memmap[MICROCHIP_PFSOC_DMA].base);
64
GEN_VEXT_VX_RM(vasub_vx_d, 8, 8, clearq)
98
+ for (i = 0; i < SIFIVE_PDMA_IRQS; i++) {
65
+
99
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->dma), i,
66
+/* Vector Single-Width Fractional Multiply with Rounding and Saturation */
100
+ qdev_get_gpio_in(DEVICE(s->plic),
67
+static inline int8_t vsmul8(CPURISCVState *env, int vxrm, int8_t a, int8_t b)
101
+ MICROCHIP_PFSOC_DMA_IRQ0 + i));
68
+{
69
+ uint8_t round;
70
+ int16_t res;
71
+
72
+ res = (int16_t)a * (int16_t)b;
73
+ round = get_round(vxrm, res, 7);
74
+ res = (res >> 7) + round;
75
+
76
+ if (res > INT8_MAX) {
77
+ env->vxsat = 0x1;
78
+ return INT8_MAX;
79
+ } else if (res < INT8_MIN) {
80
+ env->vxsat = 0x1;
81
+ return INT8_MIN;
82
+ } else {
83
+ return res;
84
+ }
85
+}
86
+
87
+static int16_t vsmul16(CPURISCVState *env, int vxrm, int16_t a, int16_t b)
88
+{
89
+ uint8_t round;
90
+ int32_t res;
91
+
92
+ res = (int32_t)a * (int32_t)b;
93
+ round = get_round(vxrm, res, 15);
94
+ res = (res >> 15) + round;
95
+
96
+ if (res > INT16_MAX) {
97
+ env->vxsat = 0x1;
98
+ return INT16_MAX;
99
+ } else if (res < INT16_MIN) {
100
+ env->vxsat = 0x1;
101
+ return INT16_MIN;
102
+ } else {
103
+ return res;
104
+ }
105
+}
106
+
107
+static int32_t vsmul32(CPURISCVState *env, int vxrm, int32_t a, int32_t b)
108
+{
109
+ uint8_t round;
110
+ int64_t res;
111
+
112
+ res = (int64_t)a * (int64_t)b;
113
+ round = get_round(vxrm, res, 31);
114
+ res = (res >> 31) + round;
115
+
116
+ if (res > INT32_MAX) {
117
+ env->vxsat = 0x1;
118
+ return INT32_MAX;
119
+ } else if (res < INT32_MIN) {
120
+ env->vxsat = 0x1;
121
+ return INT32_MIN;
122
+ } else {
123
+ return res;
124
+ }
125
+}
126
+
127
+static int64_t vsmul64(CPURISCVState *env, int vxrm, int64_t a, int64_t b)
128
+{
129
+ uint8_t round;
130
+ uint64_t hi_64, lo_64;
131
+ int64_t res;
132
+
133
+ if (a == INT64_MIN && b == INT64_MIN) {
134
+ env->vxsat = 1;
135
+ return INT64_MAX;
102
+ }
136
+ }
103
+
137
+
104
/* SYSREG */
138
+ muls64(&lo_64, &hi_64, a, b);
105
create_unimplemented_device("microchip.pfsoc.sysreg",
139
+ round = get_round(vxrm, lo_64, 63);
106
memmap[MICROCHIP_PFSOC_SYSREG].base,
140
+ /*
107
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
141
+ * Cannot overflow, as there are always
108
index XXXXXXX..XXXXXXX 100644
142
+ * 2 sign bits after multiply.
109
--- a/hw/riscv/Kconfig
143
+ */
110
+++ b/hw/riscv/Kconfig
144
+ res = (hi_64 << 1) | (lo_64 >> 63);
111
@@ -XXX,XX +XXX,XX @@ config MICROCHIP_PFSOC
145
+ if (round) {
112
select SIFIVE
146
+ if (res == INT64_MAX) {
113
select UNIMP
147
+ env->vxsat = 1;
114
select MCHP_PFSOC_MMUART
148
+ } else {
115
+ select SIFIVE_PDMA
149
+ res += 1;
116
select CADENCE_SDHCI
150
+ }
151
+ }
152
+ return res;
153
+}
154
+
155
+RVVCALL(OPIVV2_RM, vsmul_vv_b, OP_SSS_B, H1, H1, H1, vsmul8)
156
+RVVCALL(OPIVV2_RM, vsmul_vv_h, OP_SSS_H, H2, H2, H2, vsmul16)
157
+RVVCALL(OPIVV2_RM, vsmul_vv_w, OP_SSS_W, H4, H4, H4, vsmul32)
158
+RVVCALL(OPIVV2_RM, vsmul_vv_d, OP_SSS_D, H8, H8, H8, vsmul64)
159
+GEN_VEXT_VV_RM(vsmul_vv_b, 1, 1, clearb)
160
+GEN_VEXT_VV_RM(vsmul_vv_h, 2, 2, clearh)
161
+GEN_VEXT_VV_RM(vsmul_vv_w, 4, 4, clearl)
162
+GEN_VEXT_VV_RM(vsmul_vv_d, 8, 8, clearq)
163
+
164
+RVVCALL(OPIVX2_RM, vsmul_vx_b, OP_SSS_B, H1, H1, vsmul8)
165
+RVVCALL(OPIVX2_RM, vsmul_vx_h, OP_SSS_H, H2, H2, vsmul16)
166
+RVVCALL(OPIVX2_RM, vsmul_vx_w, OP_SSS_W, H4, H4, vsmul32)
167
+RVVCALL(OPIVX2_RM, vsmul_vx_d, OP_SSS_D, H8, H8, vsmul64)
168
+GEN_VEXT_VX_RM(vsmul_vx_b, 1, 1, clearb)
169
+GEN_VEXT_VX_RM(vsmul_vx_h, 2, 2, clearh)
170
+GEN_VEXT_VX_RM(vsmul_vx_w, 4, 4, clearl)
171
+GEN_VEXT_VX_RM(vsmul_vx_d, 8, 8, clearq)
117
--
172
--
118
2.28.0
173
2.27.0
119
174
120
175
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-28-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 22 +++
10
target/riscv/insn32.decode | 7 +
11
target/riscv/insn_trans/trans_rvv.inc.c | 9 ++
12
target/riscv/vector_helper.c | 205 ++++++++++++++++++++++++
13
4 files changed, 243 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vsmul_vx_b, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vsmul_vx_h, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vsmul_vx_w, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vsmul_vx_d, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vwsmaccu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vwsmaccu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vwsmaccu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vwsmacc_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vwsmacc_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vwsmacc_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vwsmaccsu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vwsmaccsu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vwsmaccsu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vwsmaccu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
34
+DEF_HELPER_6(vwsmaccu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
35
+DEF_HELPER_6(vwsmaccu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
36
+DEF_HELPER_6(vwsmacc_vx_b, void, ptr, ptr, tl, ptr, env, i32)
37
+DEF_HELPER_6(vwsmacc_vx_h, void, ptr, ptr, tl, ptr, env, i32)
38
+DEF_HELPER_6(vwsmacc_vx_w, void, ptr, ptr, tl, ptr, env, i32)
39
+DEF_HELPER_6(vwsmaccsu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
40
+DEF_HELPER_6(vwsmaccsu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
41
+DEF_HELPER_6(vwsmaccsu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
42
+DEF_HELPER_6(vwsmaccus_vx_b, void, ptr, ptr, tl, ptr, env, i32)
43
+DEF_HELPER_6(vwsmaccus_vx_h, void, ptr, ptr, tl, ptr, env, i32)
44
+DEF_HELPER_6(vwsmaccus_vx_w, void, ptr, ptr, tl, ptr, env, i32)
45
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/riscv/insn32.decode
48
+++ b/target/riscv/insn32.decode
49
@@ -XXX,XX +XXX,XX @@ vasub_vv 100110 . ..... ..... 000 ..... 1010111 @r_vm
50
vasub_vx 100110 . ..... ..... 100 ..... 1010111 @r_vm
51
vsmul_vv 100111 . ..... ..... 000 ..... 1010111 @r_vm
52
vsmul_vx 100111 . ..... ..... 100 ..... 1010111 @r_vm
53
+vwsmaccu_vv 111100 . ..... ..... 000 ..... 1010111 @r_vm
54
+vwsmaccu_vx 111100 . ..... ..... 100 ..... 1010111 @r_vm
55
+vwsmacc_vv 111101 . ..... ..... 000 ..... 1010111 @r_vm
56
+vwsmacc_vx 111101 . ..... ..... 100 ..... 1010111 @r_vm
57
+vwsmaccsu_vv 111110 . ..... ..... 000 ..... 1010111 @r_vm
58
+vwsmaccsu_vx 111110 . ..... ..... 100 ..... 1010111 @r_vm
59
+vwsmaccus_vx 111111 . ..... ..... 100 ..... 1010111 @r_vm
60
61
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
62
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
63
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/target/riscv/insn_trans/trans_rvv.inc.c
66
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
67
@@ -XXX,XX +XXX,XX @@ GEN_OPIVI_TRANS(vaadd_vi, 0, vaadd_vx, opivx_check)
68
/* Vector Single-Width Fractional Multiply with Rounding and Saturation */
69
GEN_OPIVV_TRANS(vsmul_vv, opivv_check)
70
GEN_OPIVX_TRANS(vsmul_vx, opivx_check)
71
+
72
+/* Vector Widening Saturating Scaled Multiply-Add */
73
+GEN_OPIVV_WIDEN_TRANS(vwsmaccu_vv, opivv_widen_check)
74
+GEN_OPIVV_WIDEN_TRANS(vwsmacc_vv, opivv_widen_check)
75
+GEN_OPIVV_WIDEN_TRANS(vwsmaccsu_vv, opivv_widen_check)
76
+GEN_OPIVX_WIDEN_TRANS(vwsmaccu_vx)
77
+GEN_OPIVX_WIDEN_TRANS(vwsmacc_vx)
78
+GEN_OPIVX_WIDEN_TRANS(vwsmaccsu_vx)
79
+GEN_OPIVX_WIDEN_TRANS(vwsmaccus_vx)
80
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
81
index XXXXXXX..XXXXXXX 100644
82
--- a/target/riscv/vector_helper.c
83
+++ b/target/riscv/vector_helper.c
84
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX_RM(vsmul_vx_b, 1, 1, clearb)
85
GEN_VEXT_VX_RM(vsmul_vx_h, 2, 2, clearh)
86
GEN_VEXT_VX_RM(vsmul_vx_w, 4, 4, clearl)
87
GEN_VEXT_VX_RM(vsmul_vx_d, 8, 8, clearq)
88
+
89
+/* Vector Widening Saturating Scaled Multiply-Add */
90
+static inline uint16_t
91
+vwsmaccu8(CPURISCVState *env, int vxrm, uint8_t a, uint8_t b,
92
+ uint16_t c)
93
+{
94
+ uint8_t round;
95
+ uint16_t res = (uint16_t)a * b;
96
+
97
+ round = get_round(vxrm, res, 4);
98
+ res = (res >> 4) + round;
99
+ return saddu16(env, vxrm, c, res);
100
+}
101
+
102
+static inline uint32_t
103
+vwsmaccu16(CPURISCVState *env, int vxrm, uint16_t a, uint16_t b,
104
+ uint32_t c)
105
+{
106
+ uint8_t round;
107
+ uint32_t res = (uint32_t)a * b;
108
+
109
+ round = get_round(vxrm, res, 8);
110
+ res = (res >> 8) + round;
111
+ return saddu32(env, vxrm, c, res);
112
+}
113
+
114
+static inline uint64_t
115
+vwsmaccu32(CPURISCVState *env, int vxrm, uint32_t a, uint32_t b,
116
+ uint64_t c)
117
+{
118
+ uint8_t round;
119
+ uint64_t res = (uint64_t)a * b;
120
+
121
+ round = get_round(vxrm, res, 16);
122
+ res = (res >> 16) + round;
123
+ return saddu64(env, vxrm, c, res);
124
+}
125
+
126
+#define OPIVV3_RM(NAME, TD, T1, T2, TX1, TX2, HD, HS1, HS2, OP) \
127
+static inline void \
128
+do_##NAME(void *vd, void *vs1, void *vs2, int i, \
129
+ CPURISCVState *env, int vxrm) \
130
+{ \
131
+ TX1 s1 = *((T1 *)vs1 + HS1(i)); \
132
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
133
+ TD d = *((TD *)vd + HD(i)); \
134
+ *((TD *)vd + HD(i)) = OP(env, vxrm, s2, s1, d); \
135
+}
136
+
137
+RVVCALL(OPIVV3_RM, vwsmaccu_vv_b, WOP_UUU_B, H2, H1, H1, vwsmaccu8)
138
+RVVCALL(OPIVV3_RM, vwsmaccu_vv_h, WOP_UUU_H, H4, H2, H2, vwsmaccu16)
139
+RVVCALL(OPIVV3_RM, vwsmaccu_vv_w, WOP_UUU_W, H8, H4, H4, vwsmaccu32)
140
+GEN_VEXT_VV_RM(vwsmaccu_vv_b, 1, 2, clearh)
141
+GEN_VEXT_VV_RM(vwsmaccu_vv_h, 2, 4, clearl)
142
+GEN_VEXT_VV_RM(vwsmaccu_vv_w, 4, 8, clearq)
143
+
144
+#define OPIVX3_RM(NAME, TD, T1, T2, TX1, TX2, HD, HS2, OP) \
145
+static inline void \
146
+do_##NAME(void *vd, target_long s1, void *vs2, int i, \
147
+ CPURISCVState *env, int vxrm) \
148
+{ \
149
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
150
+ TD d = *((TD *)vd + HD(i)); \
151
+ *((TD *)vd + HD(i)) = OP(env, vxrm, s2, (TX1)(T1)s1, d); \
152
+}
153
+
154
+RVVCALL(OPIVX3_RM, vwsmaccu_vx_b, WOP_UUU_B, H2, H1, vwsmaccu8)
155
+RVVCALL(OPIVX3_RM, vwsmaccu_vx_h, WOP_UUU_H, H4, H2, vwsmaccu16)
156
+RVVCALL(OPIVX3_RM, vwsmaccu_vx_w, WOP_UUU_W, H8, H4, vwsmaccu32)
157
+GEN_VEXT_VX_RM(vwsmaccu_vx_b, 1, 2, clearh)
158
+GEN_VEXT_VX_RM(vwsmaccu_vx_h, 2, 4, clearl)
159
+GEN_VEXT_VX_RM(vwsmaccu_vx_w, 4, 8, clearq)
160
+
161
+static inline int16_t
162
+vwsmacc8(CPURISCVState *env, int vxrm, int8_t a, int8_t b, int16_t c)
163
+{
164
+ uint8_t round;
165
+ int16_t res = (int16_t)a * b;
166
+
167
+ round = get_round(vxrm, res, 4);
168
+ res = (res >> 4) + round;
169
+ return sadd16(env, vxrm, c, res);
170
+}
171
+
172
+static inline int32_t
173
+vwsmacc16(CPURISCVState *env, int vxrm, int16_t a, int16_t b, int32_t c)
174
+{
175
+ uint8_t round;
176
+ int32_t res = (int32_t)a * b;
177
+
178
+ round = get_round(vxrm, res, 8);
179
+ res = (res >> 8) + round;
180
+ return sadd32(env, vxrm, c, res);
181
+
182
+}
183
+
184
+static inline int64_t
185
+vwsmacc32(CPURISCVState *env, int vxrm, int32_t a, int32_t b, int64_t c)
186
+{
187
+ uint8_t round;
188
+ int64_t res = (int64_t)a * b;
189
+
190
+ round = get_round(vxrm, res, 16);
191
+ res = (res >> 16) + round;
192
+ return sadd64(env, vxrm, c, res);
193
+}
194
+
195
+RVVCALL(OPIVV3_RM, vwsmacc_vv_b, WOP_SSS_B, H2, H1, H1, vwsmacc8)
196
+RVVCALL(OPIVV3_RM, vwsmacc_vv_h, WOP_SSS_H, H4, H2, H2, vwsmacc16)
197
+RVVCALL(OPIVV3_RM, vwsmacc_vv_w, WOP_SSS_W, H8, H4, H4, vwsmacc32)
198
+GEN_VEXT_VV_RM(vwsmacc_vv_b, 1, 2, clearh)
199
+GEN_VEXT_VV_RM(vwsmacc_vv_h, 2, 4, clearl)
200
+GEN_VEXT_VV_RM(vwsmacc_vv_w, 4, 8, clearq)
201
+RVVCALL(OPIVX3_RM, vwsmacc_vx_b, WOP_SSS_B, H2, H1, vwsmacc8)
202
+RVVCALL(OPIVX3_RM, vwsmacc_vx_h, WOP_SSS_H, H4, H2, vwsmacc16)
203
+RVVCALL(OPIVX3_RM, vwsmacc_vx_w, WOP_SSS_W, H8, H4, vwsmacc32)
204
+GEN_VEXT_VX_RM(vwsmacc_vx_b, 1, 2, clearh)
205
+GEN_VEXT_VX_RM(vwsmacc_vx_h, 2, 4, clearl)
206
+GEN_VEXT_VX_RM(vwsmacc_vx_w, 4, 8, clearq)
207
+
208
+static inline int16_t
209
+vwsmaccsu8(CPURISCVState *env, int vxrm, uint8_t a, int8_t b, int16_t c)
210
+{
211
+ uint8_t round;
212
+ int16_t res = a * (int16_t)b;
213
+
214
+ round = get_round(vxrm, res, 4);
215
+ res = (res >> 4) + round;
216
+ return ssub16(env, vxrm, c, res);
217
+}
218
+
219
+static inline int32_t
220
+vwsmaccsu16(CPURISCVState *env, int vxrm, uint16_t a, int16_t b, uint32_t c)
221
+{
222
+ uint8_t round;
223
+ int32_t res = a * (int32_t)b;
224
+
225
+ round = get_round(vxrm, res, 8);
226
+ res = (res >> 8) + round;
227
+ return ssub32(env, vxrm, c, res);
228
+}
229
+
230
+static inline int64_t
231
+vwsmaccsu32(CPURISCVState *env, int vxrm, uint32_t a, int32_t b, int64_t c)
232
+{
233
+ uint8_t round;
234
+ int64_t res = a * (int64_t)b;
235
+
236
+ round = get_round(vxrm, res, 16);
237
+ res = (res >> 16) + round;
238
+ return ssub64(env, vxrm, c, res);
239
+}
240
+
241
+RVVCALL(OPIVV3_RM, vwsmaccsu_vv_b, WOP_SSU_B, H2, H1, H1, vwsmaccsu8)
242
+RVVCALL(OPIVV3_RM, vwsmaccsu_vv_h, WOP_SSU_H, H4, H2, H2, vwsmaccsu16)
243
+RVVCALL(OPIVV3_RM, vwsmaccsu_vv_w, WOP_SSU_W, H8, H4, H4, vwsmaccsu32)
244
+GEN_VEXT_VV_RM(vwsmaccsu_vv_b, 1, 2, clearh)
245
+GEN_VEXT_VV_RM(vwsmaccsu_vv_h, 2, 4, clearl)
246
+GEN_VEXT_VV_RM(vwsmaccsu_vv_w, 4, 8, clearq)
247
+RVVCALL(OPIVX3_RM, vwsmaccsu_vx_b, WOP_SSU_B, H2, H1, vwsmaccsu8)
248
+RVVCALL(OPIVX3_RM, vwsmaccsu_vx_h, WOP_SSU_H, H4, H2, vwsmaccsu16)
249
+RVVCALL(OPIVX3_RM, vwsmaccsu_vx_w, WOP_SSU_W, H8, H4, vwsmaccsu32)
250
+GEN_VEXT_VX_RM(vwsmaccsu_vx_b, 1, 2, clearh)
251
+GEN_VEXT_VX_RM(vwsmaccsu_vx_h, 2, 4, clearl)
252
+GEN_VEXT_VX_RM(vwsmaccsu_vx_w, 4, 8, clearq)
253
+
254
+static inline int16_t
255
+vwsmaccus8(CPURISCVState *env, int vxrm, int8_t a, uint8_t b, int16_t c)
256
+{
257
+ uint8_t round;
258
+ int16_t res = (int16_t)a * b;
259
+
260
+ round = get_round(vxrm, res, 4);
261
+ res = (res >> 4) + round;
262
+ return ssub16(env, vxrm, c, res);
263
+}
264
+
265
+static inline int32_t
266
+vwsmaccus16(CPURISCVState *env, int vxrm, int16_t a, uint16_t b, int32_t c)
267
+{
268
+ uint8_t round;
269
+ int32_t res = (int32_t)a * b;
270
+
271
+ round = get_round(vxrm, res, 8);
272
+ res = (res >> 8) + round;
273
+ return ssub32(env, vxrm, c, res);
274
+}
275
+
276
+static inline int64_t
277
+vwsmaccus32(CPURISCVState *env, int vxrm, int32_t a, uint32_t b, int64_t c)
278
+{
279
+ uint8_t round;
280
+ int64_t res = (int64_t)a * b;
281
+
282
+ round = get_round(vxrm, res, 16);
283
+ res = (res >> 16) + round;
284
+ return ssub64(env, vxrm, c, res);
285
+}
286
+
287
+RVVCALL(OPIVX3_RM, vwsmaccus_vx_b, WOP_SUS_B, H2, H1, vwsmaccus8)
288
+RVVCALL(OPIVX3_RM, vwsmaccus_vx_h, WOP_SUS_H, H4, H2, vwsmaccus16)
289
+RVVCALL(OPIVX3_RM, vwsmaccus_vx_w, WOP_SUS_W, H8, H4, vwsmaccus32)
290
+GEN_VEXT_VX_RM(vwsmaccus_vx_b, 1, 2, clearh)
291
+GEN_VEXT_VX_RM(vwsmaccus_vx_h, 2, 4, clearl)
292
+GEN_VEXT_VX_RM(vwsmaccus_vx_w, 4, 8, clearq)
293
--
294
2.27.0
295
296
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-29-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 17 ++++
10
target/riscv/insn32.decode | 6 ++
11
target/riscv/insn_trans/trans_rvv.inc.c | 8 ++
12
target/riscv/vector_helper.c | 117 ++++++++++++++++++++++++
13
4 files changed, 148 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vwsmaccsu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vwsmaccus_vx_b, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vwsmaccus_vx_h, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vwsmaccus_vx_w, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vssrl_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vssrl_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vssrl_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vssrl_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vssra_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vssra_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vssra_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vssra_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vssrl_vx_b, void, ptr, ptr, tl, ptr, env, i32)
33
+DEF_HELPER_6(vssrl_vx_h, void, ptr, ptr, tl, ptr, env, i32)
34
+DEF_HELPER_6(vssrl_vx_w, void, ptr, ptr, tl, ptr, env, i32)
35
+DEF_HELPER_6(vssrl_vx_d, void, ptr, ptr, tl, ptr, env, i32)
36
+DEF_HELPER_6(vssra_vx_b, void, ptr, ptr, tl, ptr, env, i32)
37
+DEF_HELPER_6(vssra_vx_h, void, ptr, ptr, tl, ptr, env, i32)
38
+DEF_HELPER_6(vssra_vx_w, void, ptr, ptr, tl, ptr, env, i32)
39
+DEF_HELPER_6(vssra_vx_d, void, ptr, ptr, tl, ptr, env, i32)
40
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/riscv/insn32.decode
43
+++ b/target/riscv/insn32.decode
44
@@ -XXX,XX +XXX,XX @@ vwsmacc_vx 111101 . ..... ..... 100 ..... 1010111 @r_vm
45
vwsmaccsu_vv 111110 . ..... ..... 000 ..... 1010111 @r_vm
46
vwsmaccsu_vx 111110 . ..... ..... 100 ..... 1010111 @r_vm
47
vwsmaccus_vx 111111 . ..... ..... 100 ..... 1010111 @r_vm
48
+vssrl_vv 101010 . ..... ..... 000 ..... 1010111 @r_vm
49
+vssrl_vx 101010 . ..... ..... 100 ..... 1010111 @r_vm
50
+vssrl_vi 101010 . ..... ..... 011 ..... 1010111 @r_vm
51
+vssra_vv 101011 . ..... ..... 000 ..... 1010111 @r_vm
52
+vssra_vx 101011 . ..... ..... 100 ..... 1010111 @r_vm
53
+vssra_vi 101011 . ..... ..... 011 ..... 1010111 @r_vm
54
55
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
56
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
57
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/target/riscv/insn_trans/trans_rvv.inc.c
60
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
61
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_WIDEN_TRANS(vwsmaccu_vx)
62
GEN_OPIVX_WIDEN_TRANS(vwsmacc_vx)
63
GEN_OPIVX_WIDEN_TRANS(vwsmaccsu_vx)
64
GEN_OPIVX_WIDEN_TRANS(vwsmaccus_vx)
65
+
66
+/* Vector Single-Width Scaling Shift Instructions */
67
+GEN_OPIVV_TRANS(vssrl_vv, opivv_check)
68
+GEN_OPIVV_TRANS(vssra_vv, opivv_check)
69
+GEN_OPIVX_TRANS(vssrl_vx, opivx_check)
70
+GEN_OPIVX_TRANS(vssra_vx, opivx_check)
71
+GEN_OPIVI_TRANS(vssrl_vi, 1, vssrl_vx, opivx_check)
72
+GEN_OPIVI_TRANS(vssra_vi, 0, vssra_vx, opivx_check)
73
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
74
index XXXXXXX..XXXXXXX 100644
75
--- a/target/riscv/vector_helper.c
76
+++ b/target/riscv/vector_helper.c
77
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPIVX3_RM, vwsmaccus_vx_w, WOP_SUS_W, H8, H4, vwsmaccus32)
78
GEN_VEXT_VX_RM(vwsmaccus_vx_b, 1, 2, clearh)
79
GEN_VEXT_VX_RM(vwsmaccus_vx_h, 2, 4, clearl)
80
GEN_VEXT_VX_RM(vwsmaccus_vx_w, 4, 8, clearq)
81
+
82
+/* Vector Single-Width Scaling Shift Instructions */
83
+static inline uint8_t
84
+vssrl8(CPURISCVState *env, int vxrm, uint8_t a, uint8_t b)
85
+{
86
+ uint8_t round, shift = b & 0x7;
87
+ uint8_t res;
88
+
89
+ round = get_round(vxrm, a, shift);
90
+ res = (a >> shift) + round;
91
+ return res;
92
+}
93
+static inline uint16_t
94
+vssrl16(CPURISCVState *env, int vxrm, uint16_t a, uint16_t b)
95
+{
96
+ uint8_t round, shift = b & 0xf;
97
+ uint16_t res;
98
+
99
+ round = get_round(vxrm, a, shift);
100
+ res = (a >> shift) + round;
101
+ return res;
102
+}
103
+static inline uint32_t
104
+vssrl32(CPURISCVState *env, int vxrm, uint32_t a, uint32_t b)
105
+{
106
+ uint8_t round, shift = b & 0x1f;
107
+ uint32_t res;
108
+
109
+ round = get_round(vxrm, a, shift);
110
+ res = (a >> shift) + round;
111
+ return res;
112
+}
113
+static inline uint64_t
114
+vssrl64(CPURISCVState *env, int vxrm, uint64_t a, uint64_t b)
115
+{
116
+ uint8_t round, shift = b & 0x3f;
117
+ uint64_t res;
118
+
119
+ round = get_round(vxrm, a, shift);
120
+ res = (a >> shift) + round;
121
+ return res;
122
+}
123
+RVVCALL(OPIVV2_RM, vssrl_vv_b, OP_UUU_B, H1, H1, H1, vssrl8)
124
+RVVCALL(OPIVV2_RM, vssrl_vv_h, OP_UUU_H, H2, H2, H2, vssrl16)
125
+RVVCALL(OPIVV2_RM, vssrl_vv_w, OP_UUU_W, H4, H4, H4, vssrl32)
126
+RVVCALL(OPIVV2_RM, vssrl_vv_d, OP_UUU_D, H8, H8, H8, vssrl64)
127
+GEN_VEXT_VV_RM(vssrl_vv_b, 1, 1, clearb)
128
+GEN_VEXT_VV_RM(vssrl_vv_h, 2, 2, clearh)
129
+GEN_VEXT_VV_RM(vssrl_vv_w, 4, 4, clearl)
130
+GEN_VEXT_VV_RM(vssrl_vv_d, 8, 8, clearq)
131
+
132
+RVVCALL(OPIVX2_RM, vssrl_vx_b, OP_UUU_B, H1, H1, vssrl8)
133
+RVVCALL(OPIVX2_RM, vssrl_vx_h, OP_UUU_H, H2, H2, vssrl16)
134
+RVVCALL(OPIVX2_RM, vssrl_vx_w, OP_UUU_W, H4, H4, vssrl32)
135
+RVVCALL(OPIVX2_RM, vssrl_vx_d, OP_UUU_D, H8, H8, vssrl64)
136
+GEN_VEXT_VX_RM(vssrl_vx_b, 1, 1, clearb)
137
+GEN_VEXT_VX_RM(vssrl_vx_h, 2, 2, clearh)
138
+GEN_VEXT_VX_RM(vssrl_vx_w, 4, 4, clearl)
139
+GEN_VEXT_VX_RM(vssrl_vx_d, 8, 8, clearq)
140
+
141
+static inline int8_t
142
+vssra8(CPURISCVState *env, int vxrm, int8_t a, int8_t b)
143
+{
144
+ uint8_t round, shift = b & 0x7;
145
+ int8_t res;
146
+
147
+ round = get_round(vxrm, a, shift);
148
+ res = (a >> shift) + round;
149
+ return res;
150
+}
151
+static inline int16_t
152
+vssra16(CPURISCVState *env, int vxrm, int16_t a, int16_t b)
153
+{
154
+ uint8_t round, shift = b & 0xf;
155
+ int16_t res;
156
+
157
+ round = get_round(vxrm, a, shift);
158
+ res = (a >> shift) + round;
159
+ return res;
160
+}
161
+static inline int32_t
162
+vssra32(CPURISCVState *env, int vxrm, int32_t a, int32_t b)
163
+{
164
+ uint8_t round, shift = b & 0x1f;
165
+ int32_t res;
166
+
167
+ round = get_round(vxrm, a, shift);
168
+ res = (a >> shift) + round;
169
+ return res;
170
+}
171
+static inline int64_t
172
+vssra64(CPURISCVState *env, int vxrm, int64_t a, int64_t b)
173
+{
174
+ uint8_t round, shift = b & 0x3f;
175
+ int64_t res;
176
+
177
+ round = get_round(vxrm, a, shift);
178
+ res = (a >> shift) + round;
179
+ return res;
180
+}
181
+RVVCALL(OPIVV2_RM, vssra_vv_b, OP_SSS_B, H1, H1, H1, vssra8)
182
+RVVCALL(OPIVV2_RM, vssra_vv_h, OP_SSS_H, H2, H2, H2, vssra16)
183
+RVVCALL(OPIVV2_RM, vssra_vv_w, OP_SSS_W, H4, H4, H4, vssra32)
184
+RVVCALL(OPIVV2_RM, vssra_vv_d, OP_SSS_D, H8, H8, H8, vssra64)
185
+GEN_VEXT_VV_RM(vssra_vv_b, 1, 1, clearb)
186
+GEN_VEXT_VV_RM(vssra_vv_h, 2, 2, clearh)
187
+GEN_VEXT_VV_RM(vssra_vv_w, 4, 4, clearl)
188
+GEN_VEXT_VV_RM(vssra_vv_d, 8, 8, clearq)
189
+
190
+RVVCALL(OPIVX2_RM, vssra_vx_b, OP_SSS_B, H1, H1, vssra8)
191
+RVVCALL(OPIVX2_RM, vssra_vx_h, OP_SSS_H, H2, H2, vssra16)
192
+RVVCALL(OPIVX2_RM, vssra_vx_w, OP_SSS_W, H4, H4, vssra32)
193
+RVVCALL(OPIVX2_RM, vssra_vx_d, OP_SSS_D, H8, H8, vssra64)
194
+GEN_VEXT_VX_RM(vssra_vx_b, 1, 1, clearb)
195
+GEN_VEXT_VX_RM(vssra_vx_h, 2, 2, clearh)
196
+GEN_VEXT_VX_RM(vssra_vx_w, 4, 4, clearl)
197
+GEN_VEXT_VX_RM(vssra_vx_d, 8, 8, clearq)
198
--
199
2.27.0
200
201
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-30-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 13 +++
10
target/riscv/insn32.decode | 6 +
11
target/riscv/insn_trans/trans_rvv.inc.c | 8 ++
12
target/riscv/vector_helper.c | 141 ++++++++++++++++++++++++
13
4 files changed, 168 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vssra_vx_b, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vssra_vx_h, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vssra_vx_w, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vssra_vx_d, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vnclip_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vnclip_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vnclip_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vnclipu_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vnclipu_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vnclipu_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vnclipu_vx_b, void, ptr, ptr, tl, ptr, env, i32)
31
+DEF_HELPER_6(vnclipu_vx_h, void, ptr, ptr, tl, ptr, env, i32)
32
+DEF_HELPER_6(vnclipu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
33
+DEF_HELPER_6(vnclip_vx_b, void, ptr, ptr, tl, ptr, env, i32)
34
+DEF_HELPER_6(vnclip_vx_h, void, ptr, ptr, tl, ptr, env, i32)
35
+DEF_HELPER_6(vnclip_vx_w, void, ptr, ptr, tl, ptr, env, i32)
36
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/riscv/insn32.decode
39
+++ b/target/riscv/insn32.decode
40
@@ -XXX,XX +XXX,XX @@ vssrl_vi 101010 . ..... ..... 011 ..... 1010111 @r_vm
41
vssra_vv 101011 . ..... ..... 000 ..... 1010111 @r_vm
42
vssra_vx 101011 . ..... ..... 100 ..... 1010111 @r_vm
43
vssra_vi 101011 . ..... ..... 011 ..... 1010111 @r_vm
44
+vnclipu_vv 101110 . ..... ..... 000 ..... 1010111 @r_vm
45
+vnclipu_vx 101110 . ..... ..... 100 ..... 1010111 @r_vm
46
+vnclipu_vi 101110 . ..... ..... 011 ..... 1010111 @r_vm
47
+vnclip_vv 101111 . ..... ..... 000 ..... 1010111 @r_vm
48
+vnclip_vx 101111 . ..... ..... 100 ..... 1010111 @r_vm
49
+vnclip_vi 101111 . ..... ..... 011 ..... 1010111 @r_vm
50
51
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
52
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
53
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/target/riscv/insn_trans/trans_rvv.inc.c
56
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
57
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_TRANS(vssrl_vx, opivx_check)
58
GEN_OPIVX_TRANS(vssra_vx, opivx_check)
59
GEN_OPIVI_TRANS(vssrl_vi, 1, vssrl_vx, opivx_check)
60
GEN_OPIVI_TRANS(vssra_vi, 0, vssra_vx, opivx_check)
61
+
62
+/* Vector Narrowing Fixed-Point Clip Instructions */
63
+GEN_OPIVV_NARROW_TRANS(vnclipu_vv)
64
+GEN_OPIVV_NARROW_TRANS(vnclip_vv)
65
+GEN_OPIVX_NARROW_TRANS(vnclipu_vx)
66
+GEN_OPIVX_NARROW_TRANS(vnclip_vx)
67
+GEN_OPIVI_NARROW_TRANS(vnclipu_vi, 1, vnclipu_vx)
68
+GEN_OPIVI_NARROW_TRANS(vnclip_vi, 1, vnclip_vx)
69
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
70
index XXXXXXX..XXXXXXX 100644
71
--- a/target/riscv/vector_helper.c
72
+++ b/target/riscv/vector_helper.c
73
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_AMO(vamomaxuw_v_w, uint32_t, uint32_t, idx_w, clearl)
74
#define WOP_SSU_B int16_t, int8_t, uint8_t, int16_t, uint16_t
75
#define WOP_SSU_H int32_t, int16_t, uint16_t, int32_t, uint32_t
76
#define WOP_SSU_W int64_t, int32_t, uint32_t, int64_t, uint64_t
77
+#define NOP_SSS_B int8_t, int8_t, int16_t, int8_t, int16_t
78
+#define NOP_SSS_H int16_t, int16_t, int32_t, int16_t, int32_t
79
+#define NOP_SSS_W int32_t, int32_t, int64_t, int32_t, int64_t
80
+#define NOP_UUU_B uint8_t, uint8_t, uint16_t, uint8_t, uint16_t
81
+#define NOP_UUU_H uint16_t, uint16_t, uint32_t, uint16_t, uint32_t
82
+#define NOP_UUU_W uint32_t, uint32_t, uint64_t, uint32_t, uint64_t
83
84
/* operation of two vector elements */
85
typedef void opivv2_fn(void *vd, void *vs1, void *vs2, int i);
86
@@ -XXX,XX +XXX,XX @@ vssra64(CPURISCVState *env, int vxrm, int64_t a, int64_t b)
87
res = (a >> shift) + round;
88
return res;
89
}
90
+
91
RVVCALL(OPIVV2_RM, vssra_vv_b, OP_SSS_B, H1, H1, H1, vssra8)
92
RVVCALL(OPIVV2_RM, vssra_vv_h, OP_SSS_H, H2, H2, H2, vssra16)
93
RVVCALL(OPIVV2_RM, vssra_vv_w, OP_SSS_W, H4, H4, H4, vssra32)
94
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VX_RM(vssra_vx_b, 1, 1, clearb)
95
GEN_VEXT_VX_RM(vssra_vx_h, 2, 2, clearh)
96
GEN_VEXT_VX_RM(vssra_vx_w, 4, 4, clearl)
97
GEN_VEXT_VX_RM(vssra_vx_d, 8, 8, clearq)
98
+
99
+/* Vector Narrowing Fixed-Point Clip Instructions */
100
+static inline int8_t
101
+vnclip8(CPURISCVState *env, int vxrm, int16_t a, int8_t b)
102
+{
103
+ uint8_t round, shift = b & 0xf;
104
+ int16_t res;
105
+
106
+ round = get_round(vxrm, a, shift);
107
+ res = (a >> shift) + round;
108
+ if (res > INT8_MAX) {
109
+ env->vxsat = 0x1;
110
+ return INT8_MAX;
111
+ } else if (res < INT8_MIN) {
112
+ env->vxsat = 0x1;
113
+ return INT8_MIN;
114
+ } else {
115
+ return res;
116
+ }
117
+}
118
+
119
+static inline int16_t
120
+vnclip16(CPURISCVState *env, int vxrm, int32_t a, int16_t b)
121
+{
122
+ uint8_t round, shift = b & 0x1f;
123
+ int32_t res;
124
+
125
+ round = get_round(vxrm, a, shift);
126
+ res = (a >> shift) + round;
127
+ if (res > INT16_MAX) {
128
+ env->vxsat = 0x1;
129
+ return INT16_MAX;
130
+ } else if (res < INT16_MIN) {
131
+ env->vxsat = 0x1;
132
+ return INT16_MIN;
133
+ } else {
134
+ return res;
135
+ }
136
+}
137
+
138
+static inline int32_t
139
+vnclip32(CPURISCVState *env, int vxrm, int64_t a, int32_t b)
140
+{
141
+ uint8_t round, shift = b & 0x3f;
142
+ int64_t res;
143
+
144
+ round = get_round(vxrm, a, shift);
145
+ res = (a >> shift) + round;
146
+ if (res > INT32_MAX) {
147
+ env->vxsat = 0x1;
148
+ return INT32_MAX;
149
+ } else if (res < INT32_MIN) {
150
+ env->vxsat = 0x1;
151
+ return INT32_MIN;
152
+ } else {
153
+ return res;
154
+ }
155
+}
156
+
157
+RVVCALL(OPIVV2_RM, vnclip_vv_b, NOP_SSS_B, H1, H2, H1, vnclip8)
158
+RVVCALL(OPIVV2_RM, vnclip_vv_h, NOP_SSS_H, H2, H4, H2, vnclip16)
159
+RVVCALL(OPIVV2_RM, vnclip_vv_w, NOP_SSS_W, H4, H8, H4, vnclip32)
160
+GEN_VEXT_VV_RM(vnclip_vv_b, 1, 1, clearb)
161
+GEN_VEXT_VV_RM(vnclip_vv_h, 2, 2, clearh)
162
+GEN_VEXT_VV_RM(vnclip_vv_w, 4, 4, clearl)
163
+
164
+RVVCALL(OPIVX2_RM, vnclip_vx_b, NOP_SSS_B, H1, H2, vnclip8)
165
+RVVCALL(OPIVX2_RM, vnclip_vx_h, NOP_SSS_H, H2, H4, vnclip16)
166
+RVVCALL(OPIVX2_RM, vnclip_vx_w, NOP_SSS_W, H4, H8, vnclip32)
167
+GEN_VEXT_VX_RM(vnclip_vx_b, 1, 1, clearb)
168
+GEN_VEXT_VX_RM(vnclip_vx_h, 2, 2, clearh)
169
+GEN_VEXT_VX_RM(vnclip_vx_w, 4, 4, clearl)
170
+
171
+static inline uint8_t
172
+vnclipu8(CPURISCVState *env, int vxrm, uint16_t a, uint8_t b)
173
+{
174
+ uint8_t round, shift = b & 0xf;
175
+ uint16_t res;
176
+
177
+ round = get_round(vxrm, a, shift);
178
+ res = (a >> shift) + round;
179
+ if (res > UINT8_MAX) {
180
+ env->vxsat = 0x1;
181
+ return UINT8_MAX;
182
+ } else {
183
+ return res;
184
+ }
185
+}
186
+
187
+static inline uint16_t
188
+vnclipu16(CPURISCVState *env, int vxrm, uint32_t a, uint16_t b)
189
+{
190
+ uint8_t round, shift = b & 0x1f;
191
+ uint32_t res;
192
+
193
+ round = get_round(vxrm, a, shift);
194
+ res = (a >> shift) + round;
195
+ if (res > UINT16_MAX) {
196
+ env->vxsat = 0x1;
197
+ return UINT16_MAX;
198
+ } else {
199
+ return res;
200
+ }
201
+}
202
+
203
+static inline uint32_t
204
+vnclipu32(CPURISCVState *env, int vxrm, uint64_t a, uint32_t b)
205
+{
206
+ uint8_t round, shift = b & 0x3f;
207
+ int64_t res;
208
+
209
+ round = get_round(vxrm, a, shift);
210
+ res = (a >> shift) + round;
211
+ if (res > UINT32_MAX) {
212
+ env->vxsat = 0x1;
213
+ return UINT32_MAX;
214
+ } else {
215
+ return res;
216
+ }
217
+}
218
+
219
+RVVCALL(OPIVV2_RM, vnclipu_vv_b, NOP_UUU_B, H1, H2, H1, vnclipu8)
220
+RVVCALL(OPIVV2_RM, vnclipu_vv_h, NOP_UUU_H, H2, H4, H2, vnclipu16)
221
+RVVCALL(OPIVV2_RM, vnclipu_vv_w, NOP_UUU_W, H4, H8, H4, vnclipu32)
222
+GEN_VEXT_VV_RM(vnclipu_vv_b, 1, 1, clearb)
223
+GEN_VEXT_VV_RM(vnclipu_vv_h, 2, 2, clearh)
224
+GEN_VEXT_VV_RM(vnclipu_vv_w, 4, 4, clearl)
225
+
226
+RVVCALL(OPIVX2_RM, vnclipu_vx_b, NOP_UUU_B, H1, H2, vnclipu8)
227
+RVVCALL(OPIVX2_RM, vnclipu_vx_h, NOP_UUU_H, H2, H4, vnclipu16)
228
+RVVCALL(OPIVX2_RM, vnclipu_vx_w, NOP_UUU_W, H4, H8, vnclipu32)
229
+GEN_VEXT_VX_RM(vnclipu_vx_b, 1, 1, clearb)
230
+GEN_VEXT_VX_RM(vnclipu_vx_h, 2, 2, clearh)
231
+GEN_VEXT_VX_RM(vnclipu_vx_w, 4, 4, clearl)
232
--
233
2.27.0
234
235
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-31-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 16 ++++
10
target/riscv/insn32.decode | 5 +
11
target/riscv/insn_trans/trans_rvv.inc.c | 118 ++++++++++++++++++++++++
12
target/riscv/vector_helper.c | 111 ++++++++++++++++++++++
13
4 files changed, 250 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vnclipu_vx_w, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vnclip_vx_b, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vnclip_vx_h, void, ptr, ptr, tl, ptr, env, i32)
22
DEF_HELPER_6(vnclip_vx_w, void, ptr, ptr, tl, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vfadd_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vfadd_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vfadd_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vfsub_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vfsub_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vfsub_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vfadd_vf_h, void, ptr, ptr, i64, ptr, env, i32)
31
+DEF_HELPER_6(vfadd_vf_w, void, ptr, ptr, i64, ptr, env, i32)
32
+DEF_HELPER_6(vfadd_vf_d, void, ptr, ptr, i64, ptr, env, i32)
33
+DEF_HELPER_6(vfsub_vf_h, void, ptr, ptr, i64, ptr, env, i32)
34
+DEF_HELPER_6(vfsub_vf_w, void, ptr, ptr, i64, ptr, env, i32)
35
+DEF_HELPER_6(vfsub_vf_d, void, ptr, ptr, i64, ptr, env, i32)
36
+DEF_HELPER_6(vfrsub_vf_h, void, ptr, ptr, i64, ptr, env, i32)
37
+DEF_HELPER_6(vfrsub_vf_w, void, ptr, ptr, i64, ptr, env, i32)
38
+DEF_HELPER_6(vfrsub_vf_d, void, ptr, ptr, i64, ptr, env, i32)
39
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/riscv/insn32.decode
42
+++ b/target/riscv/insn32.decode
43
@@ -XXX,XX +XXX,XX @@ vnclipu_vi 101110 . ..... ..... 011 ..... 1010111 @r_vm
44
vnclip_vv 101111 . ..... ..... 000 ..... 1010111 @r_vm
45
vnclip_vx 101111 . ..... ..... 100 ..... 1010111 @r_vm
46
vnclip_vi 101111 . ..... ..... 011 ..... 1010111 @r_vm
47
+vfadd_vv 000000 . ..... ..... 001 ..... 1010111 @r_vm
48
+vfadd_vf 000000 . ..... ..... 101 ..... 1010111 @r_vm
49
+vfsub_vv 000010 . ..... ..... 001 ..... 1010111 @r_vm
50
+vfsub_vf 000010 . ..... ..... 101 ..... 1010111 @r_vm
51
+vfrsub_vf 100111 . ..... ..... 101 ..... 1010111 @r_vm
52
53
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
54
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
55
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
56
index XXXXXXX..XXXXXXX 100644
57
--- a/target/riscv/insn_trans/trans_rvv.inc.c
58
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
59
@@ -XXX,XX +XXX,XX @@ GEN_OPIVX_NARROW_TRANS(vnclipu_vx)
60
GEN_OPIVX_NARROW_TRANS(vnclip_vx)
61
GEN_OPIVI_NARROW_TRANS(vnclipu_vi, 1, vnclipu_vx)
62
GEN_OPIVI_NARROW_TRANS(vnclip_vi, 1, vnclip_vx)
63
+
64
+/*
65
+ *** Vector Float Point Arithmetic Instructions
66
+ */
67
+/* Vector Single-Width Floating-Point Add/Subtract Instructions */
68
+
69
+/*
70
+ * If the current SEW does not correspond to a supported IEEE floating-point
71
+ * type, an illegal instruction exception is raised.
72
+ */
73
+static bool opfvv_check(DisasContext *s, arg_rmrr *a)
74
+{
75
+ return (vext_check_isa_ill(s) &&
76
+ vext_check_overlap_mask(s, a->rd, a->vm, false) &&
77
+ vext_check_reg(s, a->rd, false) &&
78
+ vext_check_reg(s, a->rs2, false) &&
79
+ vext_check_reg(s, a->rs1, false) &&
80
+ (s->sew != 0));
81
+}
82
+
83
+/* OPFVV without GVEC IR */
84
+#define GEN_OPFVV_TRANS(NAME, CHECK) \
85
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
86
+{ \
87
+ if (CHECK(s, a)) { \
88
+ uint32_t data = 0; \
89
+ static gen_helper_gvec_4_ptr * const fns[3] = { \
90
+ gen_helper_##NAME##_h, \
91
+ gen_helper_##NAME##_w, \
92
+ gen_helper_##NAME##_d, \
93
+ }; \
94
+ TCGLabel *over = gen_new_label(); \
95
+ gen_set_rm(s, 7); \
96
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
97
+ \
98
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
99
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
100
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
101
+ tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
102
+ vreg_ofs(s, a->rs1), \
103
+ vreg_ofs(s, a->rs2), cpu_env, 0, \
104
+ s->vlen / 8, data, fns[s->sew - 1]); \
105
+ gen_set_label(over); \
106
+ return true; \
107
+ } \
108
+ return false; \
109
+}
110
+GEN_OPFVV_TRANS(vfadd_vv, opfvv_check)
111
+GEN_OPFVV_TRANS(vfsub_vv, opfvv_check)
112
+
113
+typedef void gen_helper_opfvf(TCGv_ptr, TCGv_ptr, TCGv_i64, TCGv_ptr,
114
+ TCGv_env, TCGv_i32);
115
+
116
+static bool opfvf_trans(uint32_t vd, uint32_t rs1, uint32_t vs2,
117
+ uint32_t data, gen_helper_opfvf *fn, DisasContext *s)
118
+{
119
+ TCGv_ptr dest, src2, mask;
120
+ TCGv_i32 desc;
121
+
122
+ TCGLabel *over = gen_new_label();
123
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
124
+
125
+ dest = tcg_temp_new_ptr();
126
+ mask = tcg_temp_new_ptr();
127
+ src2 = tcg_temp_new_ptr();
128
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
129
+
130
+ tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
131
+ tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, vs2));
132
+ tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
133
+
134
+ fn(dest, mask, cpu_fpr[rs1], src2, cpu_env, desc);
135
+
136
+ tcg_temp_free_ptr(dest);
137
+ tcg_temp_free_ptr(mask);
138
+ tcg_temp_free_ptr(src2);
139
+ tcg_temp_free_i32(desc);
140
+ gen_set_label(over);
141
+ return true;
142
+}
143
+
144
+static bool opfvf_check(DisasContext *s, arg_rmrr *a)
145
+{
146
+/*
147
+ * If the current SEW does not correspond to a supported IEEE floating-point
148
+ * type, an illegal instruction exception is raised
149
+ */
150
+ return (vext_check_isa_ill(s) &&
151
+ vext_check_overlap_mask(s, a->rd, a->vm, false) &&
152
+ vext_check_reg(s, a->rd, false) &&
153
+ vext_check_reg(s, a->rs2, false) &&
154
+ (s->sew != 0));
155
+}
156
+
157
+/* OPFVF without GVEC IR */
158
+#define GEN_OPFVF_TRANS(NAME, CHECK) \
159
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
160
+{ \
161
+ if (CHECK(s, a)) { \
162
+ uint32_t data = 0; \
163
+ static gen_helper_opfvf *const fns[3] = { \
164
+ gen_helper_##NAME##_h, \
165
+ gen_helper_##NAME##_w, \
166
+ gen_helper_##NAME##_d, \
167
+ }; \
168
+ gen_set_rm(s, 7); \
169
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
170
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
171
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
172
+ return opfvf_trans(a->rd, a->rs1, a->rs2, data, \
173
+ fns[s->sew - 1], s); \
174
+ } \
175
+ return false; \
176
+}
177
+
178
+GEN_OPFVF_TRANS(vfadd_vf, opfvf_check)
179
+GEN_OPFVF_TRANS(vfsub_vf, opfvf_check)
180
+GEN_OPFVF_TRANS(vfrsub_vf, opfvf_check)
181
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
182
index XXXXXXX..XXXXXXX 100644
183
--- a/target/riscv/vector_helper.c
184
+++ b/target/riscv/vector_helper.c
185
@@ -XXX,XX +XXX,XX @@
186
#include "exec/memop.h"
187
#include "exec/exec-all.h"
188
#include "exec/helper-proto.h"
189
+#include "fpu/softfloat.h"
190
#include "tcg/tcg-gvec-desc.h"
191
#include "internals.h"
192
#include <math.h>
193
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPIVX2_RM, vnclipu_vx_w, NOP_UUU_W, H4, H8, vnclipu32)
194
GEN_VEXT_VX_RM(vnclipu_vx_b, 1, 1, clearb)
195
GEN_VEXT_VX_RM(vnclipu_vx_h, 2, 2, clearh)
196
GEN_VEXT_VX_RM(vnclipu_vx_w, 4, 4, clearl)
197
+
198
+/*
199
+ *** Vector Float Point Arithmetic Instructions
200
+ */
201
+/* Vector Single-Width Floating-Point Add/Subtract Instructions */
202
+#define OPFVV2(NAME, TD, T1, T2, TX1, TX2, HD, HS1, HS2, OP) \
203
+static void do_##NAME(void *vd, void *vs1, void *vs2, int i, \
204
+ CPURISCVState *env) \
205
+{ \
206
+ TX1 s1 = *((T1 *)vs1 + HS1(i)); \
207
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
208
+ *((TD *)vd + HD(i)) = OP(s2, s1, &env->fp_status); \
209
+}
210
+
211
+#define GEN_VEXT_VV_ENV(NAME, ESZ, DSZ, CLEAR_FN) \
212
+void HELPER(NAME)(void *vd, void *v0, void *vs1, \
213
+ void *vs2, CPURISCVState *env, \
214
+ uint32_t desc) \
215
+{ \
216
+ uint32_t vlmax = vext_maxsz(desc) / ESZ; \
217
+ uint32_t mlen = vext_mlen(desc); \
218
+ uint32_t vm = vext_vm(desc); \
219
+ uint32_t vl = env->vl; \
220
+ uint32_t i; \
221
+ \
222
+ for (i = 0; i < vl; i++) { \
223
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
224
+ continue; \
225
+ } \
226
+ do_##NAME(vd, vs1, vs2, i, env); \
227
+ } \
228
+ CLEAR_FN(vd, vl, vl * DSZ, vlmax * DSZ); \
229
+}
230
+
231
+RVVCALL(OPFVV2, vfadd_vv_h, OP_UUU_H, H2, H2, H2, float16_add)
232
+RVVCALL(OPFVV2, vfadd_vv_w, OP_UUU_W, H4, H4, H4, float32_add)
233
+RVVCALL(OPFVV2, vfadd_vv_d, OP_UUU_D, H8, H8, H8, float64_add)
234
+GEN_VEXT_VV_ENV(vfadd_vv_h, 2, 2, clearh)
235
+GEN_VEXT_VV_ENV(vfadd_vv_w, 4, 4, clearl)
236
+GEN_VEXT_VV_ENV(vfadd_vv_d, 8, 8, clearq)
237
+
238
+#define OPFVF2(NAME, TD, T1, T2, TX1, TX2, HD, HS2, OP) \
239
+static void do_##NAME(void *vd, uint64_t s1, void *vs2, int i, \
240
+ CPURISCVState *env) \
241
+{ \
242
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
243
+ *((TD *)vd + HD(i)) = OP(s2, (TX1)(T1)s1, &env->fp_status);\
244
+}
245
+
246
+#define GEN_VEXT_VF(NAME, ESZ, DSZ, CLEAR_FN) \
247
+void HELPER(NAME)(void *vd, void *v0, uint64_t s1, \
248
+ void *vs2, CPURISCVState *env, \
249
+ uint32_t desc) \
250
+{ \
251
+ uint32_t vlmax = vext_maxsz(desc) / ESZ; \
252
+ uint32_t mlen = vext_mlen(desc); \
253
+ uint32_t vm = vext_vm(desc); \
254
+ uint32_t vl = env->vl; \
255
+ uint32_t i; \
256
+ \
257
+ for (i = 0; i < vl; i++) { \
258
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
259
+ continue; \
260
+ } \
261
+ do_##NAME(vd, s1, vs2, i, env); \
262
+ } \
263
+ CLEAR_FN(vd, vl, vl * DSZ, vlmax * DSZ); \
264
+}
265
+
266
+RVVCALL(OPFVF2, vfadd_vf_h, OP_UUU_H, H2, H2, float16_add)
267
+RVVCALL(OPFVF2, vfadd_vf_w, OP_UUU_W, H4, H4, float32_add)
268
+RVVCALL(OPFVF2, vfadd_vf_d, OP_UUU_D, H8, H8, float64_add)
269
+GEN_VEXT_VF(vfadd_vf_h, 2, 2, clearh)
270
+GEN_VEXT_VF(vfadd_vf_w, 4, 4, clearl)
271
+GEN_VEXT_VF(vfadd_vf_d, 8, 8, clearq)
272
+
273
+RVVCALL(OPFVV2, vfsub_vv_h, OP_UUU_H, H2, H2, H2, float16_sub)
274
+RVVCALL(OPFVV2, vfsub_vv_w, OP_UUU_W, H4, H4, H4, float32_sub)
275
+RVVCALL(OPFVV2, vfsub_vv_d, OP_UUU_D, H8, H8, H8, float64_sub)
276
+GEN_VEXT_VV_ENV(vfsub_vv_h, 2, 2, clearh)
277
+GEN_VEXT_VV_ENV(vfsub_vv_w, 4, 4, clearl)
278
+GEN_VEXT_VV_ENV(vfsub_vv_d, 8, 8, clearq)
279
+RVVCALL(OPFVF2, vfsub_vf_h, OP_UUU_H, H2, H2, float16_sub)
280
+RVVCALL(OPFVF2, vfsub_vf_w, OP_UUU_W, H4, H4, float32_sub)
281
+RVVCALL(OPFVF2, vfsub_vf_d, OP_UUU_D, H8, H8, float64_sub)
282
+GEN_VEXT_VF(vfsub_vf_h, 2, 2, clearh)
283
+GEN_VEXT_VF(vfsub_vf_w, 4, 4, clearl)
284
+GEN_VEXT_VF(vfsub_vf_d, 8, 8, clearq)
285
+
286
+static uint16_t float16_rsub(uint16_t a, uint16_t b, float_status *s)
287
+{
288
+ return float16_sub(b, a, s);
289
+}
290
+
291
+static uint32_t float32_rsub(uint32_t a, uint32_t b, float_status *s)
292
+{
293
+ return float32_sub(b, a, s);
294
+}
295
+
296
+static uint64_t float64_rsub(uint64_t a, uint64_t b, float_status *s)
297
+{
298
+ return float64_sub(b, a, s);
299
+}
300
+
301
+RVVCALL(OPFVF2, vfrsub_vf_h, OP_UUU_H, H2, H2, float16_rsub)
302
+RVVCALL(OPFVF2, vfrsub_vf_w, OP_UUU_W, H4, H4, float32_rsub)
303
+RVVCALL(OPFVF2, vfrsub_vf_d, OP_UUU_D, H8, H8, float64_rsub)
304
+GEN_VEXT_VF(vfrsub_vf_h, 2, 2, clearh)
305
+GEN_VEXT_VF(vfrsub_vf_w, 4, 4, clearl)
306
+GEN_VEXT_VF(vfrsub_vf_d, 8, 8, clearq)
307
--
308
2.27.0
309
310
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-32-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 17 +++
10
target/riscv/insn32.decode | 8 ++
11
target/riscv/insn_trans/trans_rvv.inc.c | 149 ++++++++++++++++++++++++
12
target/riscv/vector_helper.c | 83 +++++++++++++
13
4 files changed, 257 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vfsub_vf_d, void, ptr, ptr, i64, ptr, env, i32)
20
DEF_HELPER_6(vfrsub_vf_h, void, ptr, ptr, i64, ptr, env, i32)
21
DEF_HELPER_6(vfrsub_vf_w, void, ptr, ptr, i64, ptr, env, i32)
22
DEF_HELPER_6(vfrsub_vf_d, void, ptr, ptr, i64, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vfwadd_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vfwadd_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vfwsub_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vfwsub_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vfwadd_wv_h, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vfwadd_wv_w, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vfwsub_wv_h, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vfwsub_wv_w, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vfwadd_vf_h, void, ptr, ptr, i64, ptr, env, i32)
33
+DEF_HELPER_6(vfwadd_vf_w, void, ptr, ptr, i64, ptr, env, i32)
34
+DEF_HELPER_6(vfwsub_vf_h, void, ptr, ptr, i64, ptr, env, i32)
35
+DEF_HELPER_6(vfwsub_vf_w, void, ptr, ptr, i64, ptr, env, i32)
36
+DEF_HELPER_6(vfwadd_wf_h, void, ptr, ptr, i64, ptr, env, i32)
37
+DEF_HELPER_6(vfwadd_wf_w, void, ptr, ptr, i64, ptr, env, i32)
38
+DEF_HELPER_6(vfwsub_wf_h, void, ptr, ptr, i64, ptr, env, i32)
39
+DEF_HELPER_6(vfwsub_wf_w, void, ptr, ptr, i64, ptr, env, i32)
40
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/riscv/insn32.decode
43
+++ b/target/riscv/insn32.decode
44
@@ -XXX,XX +XXX,XX @@ vfadd_vf 000000 . ..... ..... 101 ..... 1010111 @r_vm
45
vfsub_vv 000010 . ..... ..... 001 ..... 1010111 @r_vm
46
vfsub_vf 000010 . ..... ..... 101 ..... 1010111 @r_vm
47
vfrsub_vf 100111 . ..... ..... 101 ..... 1010111 @r_vm
48
+vfwadd_vv 110000 . ..... ..... 001 ..... 1010111 @r_vm
49
+vfwadd_vf 110000 . ..... ..... 101 ..... 1010111 @r_vm
50
+vfwadd_wv 110100 . ..... ..... 001 ..... 1010111 @r_vm
51
+vfwadd_wf 110100 . ..... ..... 101 ..... 1010111 @r_vm
52
+vfwsub_vv 110010 . ..... ..... 001 ..... 1010111 @r_vm
53
+vfwsub_vf 110010 . ..... ..... 101 ..... 1010111 @r_vm
54
+vfwsub_wv 110110 . ..... ..... 001 ..... 1010111 @r_vm
55
+vfwsub_wf 110110 . ..... ..... 101 ..... 1010111 @r_vm
56
57
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
58
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
59
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/target/riscv/insn_trans/trans_rvv.inc.c
62
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
63
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
64
GEN_OPFVF_TRANS(vfadd_vf, opfvf_check)
65
GEN_OPFVF_TRANS(vfsub_vf, opfvf_check)
66
GEN_OPFVF_TRANS(vfrsub_vf, opfvf_check)
67
+
68
+/* Vector Widening Floating-Point Add/Subtract Instructions */
69
+static bool opfvv_widen_check(DisasContext *s, arg_rmrr *a)
70
+{
71
+ return (vext_check_isa_ill(s) &&
72
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
73
+ vext_check_reg(s, a->rd, true) &&
74
+ vext_check_reg(s, a->rs2, false) &&
75
+ vext_check_reg(s, a->rs1, false) &&
76
+ vext_check_overlap_group(a->rd, 2 << s->lmul, a->rs2,
77
+ 1 << s->lmul) &&
78
+ vext_check_overlap_group(a->rd, 2 << s->lmul, a->rs1,
79
+ 1 << s->lmul) &&
80
+ (s->lmul < 0x3) && (s->sew < 0x3) && (s->sew != 0));
81
+}
82
+
83
+/* OPFVV with WIDEN */
84
+#define GEN_OPFVV_WIDEN_TRANS(NAME, CHECK) \
85
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
86
+{ \
87
+ if (CHECK(s, a)) { \
88
+ uint32_t data = 0; \
89
+ static gen_helper_gvec_4_ptr * const fns[2] = { \
90
+ gen_helper_##NAME##_h, gen_helper_##NAME##_w, \
91
+ }; \
92
+ TCGLabel *over = gen_new_label(); \
93
+ gen_set_rm(s, 7); \
94
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
95
+ \
96
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
97
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
98
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
99
+ tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
100
+ vreg_ofs(s, a->rs1), \
101
+ vreg_ofs(s, a->rs2), cpu_env, 0, \
102
+ s->vlen / 8, data, fns[s->sew - 1]); \
103
+ gen_set_label(over); \
104
+ return true; \
105
+ } \
106
+ return false; \
107
+}
108
+
109
+GEN_OPFVV_WIDEN_TRANS(vfwadd_vv, opfvv_widen_check)
110
+GEN_OPFVV_WIDEN_TRANS(vfwsub_vv, opfvv_widen_check)
111
+
112
+static bool opfvf_widen_check(DisasContext *s, arg_rmrr *a)
113
+{
114
+ return (vext_check_isa_ill(s) &&
115
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
116
+ vext_check_reg(s, a->rd, true) &&
117
+ vext_check_reg(s, a->rs2, false) &&
118
+ vext_check_overlap_group(a->rd, 2 << s->lmul, a->rs2,
119
+ 1 << s->lmul) &&
120
+ (s->lmul < 0x3) && (s->sew < 0x3) && (s->sew != 0));
121
+}
122
+
123
+/* OPFVF with WIDEN */
124
+#define GEN_OPFVF_WIDEN_TRANS(NAME) \
125
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
126
+{ \
127
+ if (opfvf_widen_check(s, a)) { \
128
+ uint32_t data = 0; \
129
+ static gen_helper_opfvf *const fns[2] = { \
130
+ gen_helper_##NAME##_h, gen_helper_##NAME##_w, \
131
+ }; \
132
+ gen_set_rm(s, 7); \
133
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
134
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
135
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
136
+ return opfvf_trans(a->rd, a->rs1, a->rs2, data, \
137
+ fns[s->sew - 1], s); \
138
+ } \
139
+ return false; \
140
+}
141
+
142
+GEN_OPFVF_WIDEN_TRANS(vfwadd_vf)
143
+GEN_OPFVF_WIDEN_TRANS(vfwsub_vf)
144
+
145
+static bool opfwv_widen_check(DisasContext *s, arg_rmrr *a)
146
+{
147
+ return (vext_check_isa_ill(s) &&
148
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
149
+ vext_check_reg(s, a->rd, true) &&
150
+ vext_check_reg(s, a->rs2, true) &&
151
+ vext_check_reg(s, a->rs1, false) &&
152
+ vext_check_overlap_group(a->rd, 2 << s->lmul, a->rs1,
153
+ 1 << s->lmul) &&
154
+ (s->lmul < 0x3) && (s->sew < 0x3) && (s->sew != 0));
155
+}
156
+
157
+/* WIDEN OPFVV with WIDEN */
158
+#define GEN_OPFWV_WIDEN_TRANS(NAME) \
159
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
160
+{ \
161
+ if (opfwv_widen_check(s, a)) { \
162
+ uint32_t data = 0; \
163
+ static gen_helper_gvec_4_ptr * const fns[2] = { \
164
+ gen_helper_##NAME##_h, gen_helper_##NAME##_w, \
165
+ }; \
166
+ TCGLabel *over = gen_new_label(); \
167
+ gen_set_rm(s, 7); \
168
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
169
+ \
170
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
171
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
172
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
173
+ tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
174
+ vreg_ofs(s, a->rs1), \
175
+ vreg_ofs(s, a->rs2), cpu_env, 0, \
176
+ s->vlen / 8, data, fns[s->sew - 1]); \
177
+ gen_set_label(over); \
178
+ return true; \
179
+ } \
180
+ return false; \
181
+}
182
+
183
+GEN_OPFWV_WIDEN_TRANS(vfwadd_wv)
184
+GEN_OPFWV_WIDEN_TRANS(vfwsub_wv)
185
+
186
+static bool opfwf_widen_check(DisasContext *s, arg_rmrr *a)
187
+{
188
+ return (vext_check_isa_ill(s) &&
189
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
190
+ vext_check_reg(s, a->rd, true) &&
191
+ vext_check_reg(s, a->rs2, true) &&
192
+ (s->lmul < 0x3) && (s->sew < 0x3) && (s->sew != 0));
193
+}
194
+
195
+/* WIDEN OPFVF with WIDEN */
196
+#define GEN_OPFWF_WIDEN_TRANS(NAME) \
197
+static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
198
+{ \
199
+ if (opfwf_widen_check(s, a)) { \
200
+ uint32_t data = 0; \
201
+ static gen_helper_opfvf *const fns[2] = { \
202
+ gen_helper_##NAME##_h, gen_helper_##NAME##_w, \
203
+ }; \
204
+ gen_set_rm(s, 7); \
205
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
206
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
207
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
208
+ return opfvf_trans(a->rd, a->rs1, a->rs2, data, \
209
+ fns[s->sew - 1], s); \
210
+ } \
211
+ return false; \
212
+}
213
+
214
+GEN_OPFWF_WIDEN_TRANS(vfwadd_wf)
215
+GEN_OPFWF_WIDEN_TRANS(vfwsub_wf)
216
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
217
index XXXXXXX..XXXXXXX 100644
218
--- a/target/riscv/vector_helper.c
219
+++ b/target/riscv/vector_helper.c
220
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVF2, vfrsub_vf_d, OP_UUU_D, H8, H8, float64_rsub)
221
GEN_VEXT_VF(vfrsub_vf_h, 2, 2, clearh)
222
GEN_VEXT_VF(vfrsub_vf_w, 4, 4, clearl)
223
GEN_VEXT_VF(vfrsub_vf_d, 8, 8, clearq)
224
+
225
+/* Vector Widening Floating-Point Add/Subtract Instructions */
226
+static uint32_t vfwadd16(uint16_t a, uint16_t b, float_status *s)
227
+{
228
+ return float32_add(float16_to_float32(a, true, s),
229
+ float16_to_float32(b, true, s), s);
230
+}
231
+
232
+static uint64_t vfwadd32(uint32_t a, uint32_t b, float_status *s)
233
+{
234
+ return float64_add(float32_to_float64(a, s),
235
+ float32_to_float64(b, s), s);
236
+
237
+}
238
+
239
+RVVCALL(OPFVV2, vfwadd_vv_h, WOP_UUU_H, H4, H2, H2, vfwadd16)
240
+RVVCALL(OPFVV2, vfwadd_vv_w, WOP_UUU_W, H8, H4, H4, vfwadd32)
241
+GEN_VEXT_VV_ENV(vfwadd_vv_h, 2, 4, clearl)
242
+GEN_VEXT_VV_ENV(vfwadd_vv_w, 4, 8, clearq)
243
+RVVCALL(OPFVF2, vfwadd_vf_h, WOP_UUU_H, H4, H2, vfwadd16)
244
+RVVCALL(OPFVF2, vfwadd_vf_w, WOP_UUU_W, H8, H4, vfwadd32)
245
+GEN_VEXT_VF(vfwadd_vf_h, 2, 4, clearl)
246
+GEN_VEXT_VF(vfwadd_vf_w, 4, 8, clearq)
247
+
248
+static uint32_t vfwsub16(uint16_t a, uint16_t b, float_status *s)
249
+{
250
+ return float32_sub(float16_to_float32(a, true, s),
251
+ float16_to_float32(b, true, s), s);
252
+}
253
+
254
+static uint64_t vfwsub32(uint32_t a, uint32_t b, float_status *s)
255
+{
256
+ return float64_sub(float32_to_float64(a, s),
257
+ float32_to_float64(b, s), s);
258
+
259
+}
260
+
261
+RVVCALL(OPFVV2, vfwsub_vv_h, WOP_UUU_H, H4, H2, H2, vfwsub16)
262
+RVVCALL(OPFVV2, vfwsub_vv_w, WOP_UUU_W, H8, H4, H4, vfwsub32)
263
+GEN_VEXT_VV_ENV(vfwsub_vv_h, 2, 4, clearl)
264
+GEN_VEXT_VV_ENV(vfwsub_vv_w, 4, 8, clearq)
265
+RVVCALL(OPFVF2, vfwsub_vf_h, WOP_UUU_H, H4, H2, vfwsub16)
266
+RVVCALL(OPFVF2, vfwsub_vf_w, WOP_UUU_W, H8, H4, vfwsub32)
267
+GEN_VEXT_VF(vfwsub_vf_h, 2, 4, clearl)
268
+GEN_VEXT_VF(vfwsub_vf_w, 4, 8, clearq)
269
+
270
+static uint32_t vfwaddw16(uint32_t a, uint16_t b, float_status *s)
271
+{
272
+ return float32_add(a, float16_to_float32(b, true, s), s);
273
+}
274
+
275
+static uint64_t vfwaddw32(uint64_t a, uint32_t b, float_status *s)
276
+{
277
+ return float64_add(a, float32_to_float64(b, s), s);
278
+}
279
+
280
+RVVCALL(OPFVV2, vfwadd_wv_h, WOP_WUUU_H, H4, H2, H2, vfwaddw16)
281
+RVVCALL(OPFVV2, vfwadd_wv_w, WOP_WUUU_W, H8, H4, H4, vfwaddw32)
282
+GEN_VEXT_VV_ENV(vfwadd_wv_h, 2, 4, clearl)
283
+GEN_VEXT_VV_ENV(vfwadd_wv_w, 4, 8, clearq)
284
+RVVCALL(OPFVF2, vfwadd_wf_h, WOP_WUUU_H, H4, H2, vfwaddw16)
285
+RVVCALL(OPFVF2, vfwadd_wf_w, WOP_WUUU_W, H8, H4, vfwaddw32)
286
+GEN_VEXT_VF(vfwadd_wf_h, 2, 4, clearl)
287
+GEN_VEXT_VF(vfwadd_wf_w, 4, 8, clearq)
288
+
289
+static uint32_t vfwsubw16(uint32_t a, uint16_t b, float_status *s)
290
+{
291
+ return float32_sub(a, float16_to_float32(b, true, s), s);
292
+}
293
+
294
+static uint64_t vfwsubw32(uint64_t a, uint32_t b, float_status *s)
295
+{
296
+ return float64_sub(a, float32_to_float64(b, s), s);
297
+}
298
+
299
+RVVCALL(OPFVV2, vfwsub_wv_h, WOP_WUUU_H, H4, H2, H2, vfwsubw16)
300
+RVVCALL(OPFVV2, vfwsub_wv_w, WOP_WUUU_W, H8, H4, H4, vfwsubw32)
301
+GEN_VEXT_VV_ENV(vfwsub_wv_h, 2, 4, clearl)
302
+GEN_VEXT_VV_ENV(vfwsub_wv_w, 4, 8, clearq)
303
+RVVCALL(OPFVF2, vfwsub_wf_h, WOP_WUUU_H, H4, H2, vfwsubw16)
304
+RVVCALL(OPFVF2, vfwsub_wf_w, WOP_WUUU_W, H8, H4, vfwsubw32)
305
+GEN_VEXT_VF(vfwsub_wf_h, 2, 4, clearl)
306
+GEN_VEXT_VF(vfwsub_wf_w, 4, 8, clearq)
307
--
308
2.27.0
309
310
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-33-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 16 ++++++++
10
target/riscv/insn32.decode | 5 +++
11
target/riscv/insn_trans/trans_rvv.inc.c | 7 ++++
12
target/riscv/vector_helper.c | 49 +++++++++++++++++++++++++
13
4 files changed, 77 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vfwadd_wf_h, void, ptr, ptr, i64, ptr, env, i32)
20
DEF_HELPER_6(vfwadd_wf_w, void, ptr, ptr, i64, ptr, env, i32)
21
DEF_HELPER_6(vfwsub_wf_h, void, ptr, ptr, i64, ptr, env, i32)
22
DEF_HELPER_6(vfwsub_wf_w, void, ptr, ptr, i64, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vfmul_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vfmul_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vfmul_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vfdiv_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vfdiv_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vfdiv_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vfmul_vf_h, void, ptr, ptr, i64, ptr, env, i32)
31
+DEF_HELPER_6(vfmul_vf_w, void, ptr, ptr, i64, ptr, env, i32)
32
+DEF_HELPER_6(vfmul_vf_d, void, ptr, ptr, i64, ptr, env, i32)
33
+DEF_HELPER_6(vfdiv_vf_h, void, ptr, ptr, i64, ptr, env, i32)
34
+DEF_HELPER_6(vfdiv_vf_w, void, ptr, ptr, i64, ptr, env, i32)
35
+DEF_HELPER_6(vfdiv_vf_d, void, ptr, ptr, i64, ptr, env, i32)
36
+DEF_HELPER_6(vfrdiv_vf_h, void, ptr, ptr, i64, ptr, env, i32)
37
+DEF_HELPER_6(vfrdiv_vf_w, void, ptr, ptr, i64, ptr, env, i32)
38
+DEF_HELPER_6(vfrdiv_vf_d, void, ptr, ptr, i64, ptr, env, i32)
39
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/riscv/insn32.decode
42
+++ b/target/riscv/insn32.decode
43
@@ -XXX,XX +XXX,XX @@ vfwsub_vv 110010 . ..... ..... 001 ..... 1010111 @r_vm
44
vfwsub_vf 110010 . ..... ..... 101 ..... 1010111 @r_vm
45
vfwsub_wv 110110 . ..... ..... 001 ..... 1010111 @r_vm
46
vfwsub_wf 110110 . ..... ..... 101 ..... 1010111 @r_vm
47
+vfmul_vv 100100 . ..... ..... 001 ..... 1010111 @r_vm
48
+vfmul_vf 100100 . ..... ..... 101 ..... 1010111 @r_vm
49
+vfdiv_vv 100000 . ..... ..... 001 ..... 1010111 @r_vm
50
+vfdiv_vf 100000 . ..... ..... 101 ..... 1010111 @r_vm
51
+vfrdiv_vf 100001 . ..... ..... 101 ..... 1010111 @r_vm
52
53
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
54
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
55
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
56
index XXXXXXX..XXXXXXX 100644
57
--- a/target/riscv/insn_trans/trans_rvv.inc.c
58
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
59
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmrr *a) \
60
61
GEN_OPFWF_WIDEN_TRANS(vfwadd_wf)
62
GEN_OPFWF_WIDEN_TRANS(vfwsub_wf)
63
+
64
+/* Vector Single-Width Floating-Point Multiply/Divide Instructions */
65
+GEN_OPFVV_TRANS(vfmul_vv, opfvv_check)
66
+GEN_OPFVV_TRANS(vfdiv_vv, opfvv_check)
67
+GEN_OPFVF_TRANS(vfmul_vf, opfvf_check)
68
+GEN_OPFVF_TRANS(vfdiv_vf, opfvf_check)
69
+GEN_OPFVF_TRANS(vfrdiv_vf, opfvf_check)
70
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
71
index XXXXXXX..XXXXXXX 100644
72
--- a/target/riscv/vector_helper.c
73
+++ b/target/riscv/vector_helper.c
74
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVF2, vfwsub_wf_h, WOP_WUUU_H, H4, H2, vfwsubw16)
75
RVVCALL(OPFVF2, vfwsub_wf_w, WOP_WUUU_W, H8, H4, vfwsubw32)
76
GEN_VEXT_VF(vfwsub_wf_h, 2, 4, clearl)
77
GEN_VEXT_VF(vfwsub_wf_w, 4, 8, clearq)
78
+
79
+/* Vector Single-Width Floating-Point Multiply/Divide Instructions */
80
+RVVCALL(OPFVV2, vfmul_vv_h, OP_UUU_H, H2, H2, H2, float16_mul)
81
+RVVCALL(OPFVV2, vfmul_vv_w, OP_UUU_W, H4, H4, H4, float32_mul)
82
+RVVCALL(OPFVV2, vfmul_vv_d, OP_UUU_D, H8, H8, H8, float64_mul)
83
+GEN_VEXT_VV_ENV(vfmul_vv_h, 2, 2, clearh)
84
+GEN_VEXT_VV_ENV(vfmul_vv_w, 4, 4, clearl)
85
+GEN_VEXT_VV_ENV(vfmul_vv_d, 8, 8, clearq)
86
+RVVCALL(OPFVF2, vfmul_vf_h, OP_UUU_H, H2, H2, float16_mul)
87
+RVVCALL(OPFVF2, vfmul_vf_w, OP_UUU_W, H4, H4, float32_mul)
88
+RVVCALL(OPFVF2, vfmul_vf_d, OP_UUU_D, H8, H8, float64_mul)
89
+GEN_VEXT_VF(vfmul_vf_h, 2, 2, clearh)
90
+GEN_VEXT_VF(vfmul_vf_w, 4, 4, clearl)
91
+GEN_VEXT_VF(vfmul_vf_d, 8, 8, clearq)
92
+
93
+RVVCALL(OPFVV2, vfdiv_vv_h, OP_UUU_H, H2, H2, H2, float16_div)
94
+RVVCALL(OPFVV2, vfdiv_vv_w, OP_UUU_W, H4, H4, H4, float32_div)
95
+RVVCALL(OPFVV2, vfdiv_vv_d, OP_UUU_D, H8, H8, H8, float64_div)
96
+GEN_VEXT_VV_ENV(vfdiv_vv_h, 2, 2, clearh)
97
+GEN_VEXT_VV_ENV(vfdiv_vv_w, 4, 4, clearl)
98
+GEN_VEXT_VV_ENV(vfdiv_vv_d, 8, 8, clearq)
99
+RVVCALL(OPFVF2, vfdiv_vf_h, OP_UUU_H, H2, H2, float16_div)
100
+RVVCALL(OPFVF2, vfdiv_vf_w, OP_UUU_W, H4, H4, float32_div)
101
+RVVCALL(OPFVF2, vfdiv_vf_d, OP_UUU_D, H8, H8, float64_div)
102
+GEN_VEXT_VF(vfdiv_vf_h, 2, 2, clearh)
103
+GEN_VEXT_VF(vfdiv_vf_w, 4, 4, clearl)
104
+GEN_VEXT_VF(vfdiv_vf_d, 8, 8, clearq)
105
+
106
+static uint16_t float16_rdiv(uint16_t a, uint16_t b, float_status *s)
107
+{
108
+ return float16_div(b, a, s);
109
+}
110
+
111
+static uint32_t float32_rdiv(uint32_t a, uint32_t b, float_status *s)
112
+{
113
+ return float32_div(b, a, s);
114
+}
115
+
116
+static uint64_t float64_rdiv(uint64_t a, uint64_t b, float_status *s)
117
+{
118
+ return float64_div(b, a, s);
119
+}
120
+
121
+RVVCALL(OPFVF2, vfrdiv_vf_h, OP_UUU_H, H2, H2, float16_rdiv)
122
+RVVCALL(OPFVF2, vfrdiv_vf_w, OP_UUU_W, H4, H4, float32_rdiv)
123
+RVVCALL(OPFVF2, vfrdiv_vf_d, OP_UUU_D, H8, H8, float64_rdiv)
124
+GEN_VEXT_VF(vfrdiv_vf_h, 2, 2, clearh)
125
+GEN_VEXT_VF(vfrdiv_vf_w, 4, 4, clearl)
126
+GEN_VEXT_VF(vfrdiv_vf_d, 8, 8, clearq)
127
--
128
2.27.0
129
130
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-34-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 5 +++++
10
target/riscv/insn32.decode | 2 ++
11
target/riscv/insn_trans/trans_rvv.inc.c | 4 ++++
12
target/riscv/vector_helper.c | 22 ++++++++++++++++++++++
13
4 files changed, 33 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vfdiv_vf_d, void, ptr, ptr, i64, ptr, env, i32)
20
DEF_HELPER_6(vfrdiv_vf_h, void, ptr, ptr, i64, ptr, env, i32)
21
DEF_HELPER_6(vfrdiv_vf_w, void, ptr, ptr, i64, ptr, env, i32)
22
DEF_HELPER_6(vfrdiv_vf_d, void, ptr, ptr, i64, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vfwmul_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vfwmul_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vfwmul_vf_h, void, ptr, ptr, i64, ptr, env, i32)
27
+DEF_HELPER_6(vfwmul_vf_w, void, ptr, ptr, i64, ptr, env, i32)
28
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/riscv/insn32.decode
31
+++ b/target/riscv/insn32.decode
32
@@ -XXX,XX +XXX,XX @@ vfmul_vf 100100 . ..... ..... 101 ..... 1010111 @r_vm
33
vfdiv_vv 100000 . ..... ..... 001 ..... 1010111 @r_vm
34
vfdiv_vf 100000 . ..... ..... 101 ..... 1010111 @r_vm
35
vfrdiv_vf 100001 . ..... ..... 101 ..... 1010111 @r_vm
36
+vfwmul_vv 111000 . ..... ..... 001 ..... 1010111 @r_vm
37
+vfwmul_vf 111000 . ..... ..... 101 ..... 1010111 @r_vm
38
39
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
40
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
41
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
42
index XXXXXXX..XXXXXXX 100644
43
--- a/target/riscv/insn_trans/trans_rvv.inc.c
44
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
45
@@ -XXX,XX +XXX,XX @@ GEN_OPFVV_TRANS(vfdiv_vv, opfvv_check)
46
GEN_OPFVF_TRANS(vfmul_vf, opfvf_check)
47
GEN_OPFVF_TRANS(vfdiv_vf, opfvf_check)
48
GEN_OPFVF_TRANS(vfrdiv_vf, opfvf_check)
49
+
50
+/* Vector Widening Floating-Point Multiply */
51
+GEN_OPFVV_WIDEN_TRANS(vfwmul_vv, opfvv_widen_check)
52
+GEN_OPFVF_WIDEN_TRANS(vfwmul_vf)
53
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/target/riscv/vector_helper.c
56
+++ b/target/riscv/vector_helper.c
57
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVF2, vfrdiv_vf_d, OP_UUU_D, H8, H8, float64_rdiv)
58
GEN_VEXT_VF(vfrdiv_vf_h, 2, 2, clearh)
59
GEN_VEXT_VF(vfrdiv_vf_w, 4, 4, clearl)
60
GEN_VEXT_VF(vfrdiv_vf_d, 8, 8, clearq)
61
+
62
+/* Vector Widening Floating-Point Multiply */
63
+static uint32_t vfwmul16(uint16_t a, uint16_t b, float_status *s)
64
+{
65
+ return float32_mul(float16_to_float32(a, true, s),
66
+ float16_to_float32(b, true, s), s);
67
+}
68
+
69
+static uint64_t vfwmul32(uint32_t a, uint32_t b, float_status *s)
70
+{
71
+ return float64_mul(float32_to_float64(a, s),
72
+ float32_to_float64(b, s), s);
73
+
74
+}
75
+RVVCALL(OPFVV2, vfwmul_vv_h, WOP_UUU_H, H4, H2, H2, vfwmul16)
76
+RVVCALL(OPFVV2, vfwmul_vv_w, WOP_UUU_W, H8, H4, H4, vfwmul32)
77
+GEN_VEXT_VV_ENV(vfwmul_vv_h, 2, 4, clearl)
78
+GEN_VEXT_VV_ENV(vfwmul_vv_w, 4, 8, clearq)
79
+RVVCALL(OPFVF2, vfwmul_vf_h, WOP_UUU_H, H4, H2, vfwmul16)
80
+RVVCALL(OPFVF2, vfwmul_vf_w, WOP_UUU_W, H8, H4, vfwmul32)
81
+GEN_VEXT_VF(vfwmul_vf_h, 2, 4, clearl)
82
+GEN_VEXT_VF(vfwmul_vf_w, 4, 8, clearq)
83
--
84
2.27.0
85
86
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-35-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 49 +++++
10
target/riscv/insn32.decode | 16 ++
11
target/riscv/insn_trans/trans_rvv.inc.c | 18 ++
12
target/riscv/vector_helper.c | 251 ++++++++++++++++++++++++
13
4 files changed, 334 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vfwmul_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
20
DEF_HELPER_6(vfwmul_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
21
DEF_HELPER_6(vfwmul_vf_h, void, ptr, ptr, i64, ptr, env, i32)
22
DEF_HELPER_6(vfwmul_vf_w, void, ptr, ptr, i64, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vfmacc_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vfmacc_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vfmacc_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vfnmacc_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vfnmacc_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vfnmacc_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vfmsac_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vfmsac_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vfmsac_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vfnmsac_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vfnmsac_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vfnmsac_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vfmadd_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
37
+DEF_HELPER_6(vfmadd_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
38
+DEF_HELPER_6(vfmadd_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
39
+DEF_HELPER_6(vfnmadd_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
40
+DEF_HELPER_6(vfnmadd_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
41
+DEF_HELPER_6(vfnmadd_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
42
+DEF_HELPER_6(vfmsub_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
43
+DEF_HELPER_6(vfmsub_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
44
+DEF_HELPER_6(vfmsub_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
45
+DEF_HELPER_6(vfnmsub_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
46
+DEF_HELPER_6(vfnmsub_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
47
+DEF_HELPER_6(vfnmsub_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
48
+DEF_HELPER_6(vfmacc_vf_h, void, ptr, ptr, i64, ptr, env, i32)
49
+DEF_HELPER_6(vfmacc_vf_w, void, ptr, ptr, i64, ptr, env, i32)
50
+DEF_HELPER_6(vfmacc_vf_d, void, ptr, ptr, i64, ptr, env, i32)
51
+DEF_HELPER_6(vfnmacc_vf_h, void, ptr, ptr, i64, ptr, env, i32)
52
+DEF_HELPER_6(vfnmacc_vf_w, void, ptr, ptr, i64, ptr, env, i32)
53
+DEF_HELPER_6(vfnmacc_vf_d, void, ptr, ptr, i64, ptr, env, i32)
54
+DEF_HELPER_6(vfmsac_vf_h, void, ptr, ptr, i64, ptr, env, i32)
55
+DEF_HELPER_6(vfmsac_vf_w, void, ptr, ptr, i64, ptr, env, i32)
56
+DEF_HELPER_6(vfmsac_vf_d, void, ptr, ptr, i64, ptr, env, i32)
57
+DEF_HELPER_6(vfnmsac_vf_h, void, ptr, ptr, i64, ptr, env, i32)
58
+DEF_HELPER_6(vfnmsac_vf_w, void, ptr, ptr, i64, ptr, env, i32)
59
+DEF_HELPER_6(vfnmsac_vf_d, void, ptr, ptr, i64, ptr, env, i32)
60
+DEF_HELPER_6(vfmadd_vf_h, void, ptr, ptr, i64, ptr, env, i32)
61
+DEF_HELPER_6(vfmadd_vf_w, void, ptr, ptr, i64, ptr, env, i32)
62
+DEF_HELPER_6(vfmadd_vf_d, void, ptr, ptr, i64, ptr, env, i32)
63
+DEF_HELPER_6(vfnmadd_vf_h, void, ptr, ptr, i64, ptr, env, i32)
64
+DEF_HELPER_6(vfnmadd_vf_w, void, ptr, ptr, i64, ptr, env, i32)
65
+DEF_HELPER_6(vfnmadd_vf_d, void, ptr, ptr, i64, ptr, env, i32)
66
+DEF_HELPER_6(vfmsub_vf_h, void, ptr, ptr, i64, ptr, env, i32)
67
+DEF_HELPER_6(vfmsub_vf_w, void, ptr, ptr, i64, ptr, env, i32)
68
+DEF_HELPER_6(vfmsub_vf_d, void, ptr, ptr, i64, ptr, env, i32)
69
+DEF_HELPER_6(vfnmsub_vf_h, void, ptr, ptr, i64, ptr, env, i32)
70
+DEF_HELPER_6(vfnmsub_vf_w, void, ptr, ptr, i64, ptr, env, i32)
71
+DEF_HELPER_6(vfnmsub_vf_d, void, ptr, ptr, i64, ptr, env, i32)
72
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
73
index XXXXXXX..XXXXXXX 100644
74
--- a/target/riscv/insn32.decode
75
+++ b/target/riscv/insn32.decode
76
@@ -XXX,XX +XXX,XX @@ vfdiv_vf 100000 . ..... ..... 101 ..... 1010111 @r_vm
77
vfrdiv_vf 100001 . ..... ..... 101 ..... 1010111 @r_vm
78
vfwmul_vv 111000 . ..... ..... 001 ..... 1010111 @r_vm
79
vfwmul_vf 111000 . ..... ..... 101 ..... 1010111 @r_vm
80
+vfmacc_vv 101100 . ..... ..... 001 ..... 1010111 @r_vm
81
+vfnmacc_vv 101101 . ..... ..... 001 ..... 1010111 @r_vm
82
+vfnmacc_vf 101101 . ..... ..... 101 ..... 1010111 @r_vm
83
+vfmacc_vf 101100 . ..... ..... 101 ..... 1010111 @r_vm
84
+vfmsac_vv 101110 . ..... ..... 001 ..... 1010111 @r_vm
85
+vfmsac_vf 101110 . ..... ..... 101 ..... 1010111 @r_vm
86
+vfnmsac_vv 101111 . ..... ..... 001 ..... 1010111 @r_vm
87
+vfnmsac_vf 101111 . ..... ..... 101 ..... 1010111 @r_vm
88
+vfmadd_vv 101000 . ..... ..... 001 ..... 1010111 @r_vm
89
+vfmadd_vf 101000 . ..... ..... 101 ..... 1010111 @r_vm
90
+vfnmadd_vv 101001 . ..... ..... 001 ..... 1010111 @r_vm
91
+vfnmadd_vf 101001 . ..... ..... 101 ..... 1010111 @r_vm
92
+vfmsub_vv 101010 . ..... ..... 001 ..... 1010111 @r_vm
93
+vfmsub_vf 101010 . ..... ..... 101 ..... 1010111 @r_vm
94
+vfnmsub_vv 101011 . ..... ..... 001 ..... 1010111 @r_vm
95
+vfnmsub_vf 101011 . ..... ..... 101 ..... 1010111 @r_vm
96
97
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
98
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
99
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
100
index XXXXXXX..XXXXXXX 100644
101
--- a/target/riscv/insn_trans/trans_rvv.inc.c
102
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
103
@@ -XXX,XX +XXX,XX @@ GEN_OPFVF_TRANS(vfrdiv_vf, opfvf_check)
104
/* Vector Widening Floating-Point Multiply */
105
GEN_OPFVV_WIDEN_TRANS(vfwmul_vv, opfvv_widen_check)
106
GEN_OPFVF_WIDEN_TRANS(vfwmul_vf)
107
+
108
+/* Vector Single-Width Floating-Point Fused Multiply-Add Instructions */
109
+GEN_OPFVV_TRANS(vfmacc_vv, opfvv_check)
110
+GEN_OPFVV_TRANS(vfnmacc_vv, opfvv_check)
111
+GEN_OPFVV_TRANS(vfmsac_vv, opfvv_check)
112
+GEN_OPFVV_TRANS(vfnmsac_vv, opfvv_check)
113
+GEN_OPFVV_TRANS(vfmadd_vv, opfvv_check)
114
+GEN_OPFVV_TRANS(vfnmadd_vv, opfvv_check)
115
+GEN_OPFVV_TRANS(vfmsub_vv, opfvv_check)
116
+GEN_OPFVV_TRANS(vfnmsub_vv, opfvv_check)
117
+GEN_OPFVF_TRANS(vfmacc_vf, opfvf_check)
118
+GEN_OPFVF_TRANS(vfnmacc_vf, opfvf_check)
119
+GEN_OPFVF_TRANS(vfmsac_vf, opfvf_check)
120
+GEN_OPFVF_TRANS(vfnmsac_vf, opfvf_check)
121
+GEN_OPFVF_TRANS(vfmadd_vf, opfvf_check)
122
+GEN_OPFVF_TRANS(vfnmadd_vf, opfvf_check)
123
+GEN_OPFVF_TRANS(vfmsub_vf, opfvf_check)
124
+GEN_OPFVF_TRANS(vfnmsub_vf, opfvf_check)
125
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
126
index XXXXXXX..XXXXXXX 100644
127
--- a/target/riscv/vector_helper.c
128
+++ b/target/riscv/vector_helper.c
129
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVF2, vfwmul_vf_h, WOP_UUU_H, H4, H2, vfwmul16)
130
RVVCALL(OPFVF2, vfwmul_vf_w, WOP_UUU_W, H8, H4, vfwmul32)
131
GEN_VEXT_VF(vfwmul_vf_h, 2, 4, clearl)
132
GEN_VEXT_VF(vfwmul_vf_w, 4, 8, clearq)
133
+
134
+/* Vector Single-Width Floating-Point Fused Multiply-Add Instructions */
135
+#define OPFVV3(NAME, TD, T1, T2, TX1, TX2, HD, HS1, HS2, OP) \
136
+static void do_##NAME(void *vd, void *vs1, void *vs2, int i, \
137
+ CPURISCVState *env) \
138
+{ \
139
+ TX1 s1 = *((T1 *)vs1 + HS1(i)); \
140
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
141
+ TD d = *((TD *)vd + HD(i)); \
142
+ *((TD *)vd + HD(i)) = OP(s2, s1, d, &env->fp_status); \
143
+}
144
+
145
+static uint16_t fmacc16(uint16_t a, uint16_t b, uint16_t d, float_status *s)
146
+{
147
+ return float16_muladd(a, b, d, 0, s);
148
+}
149
+
150
+static uint32_t fmacc32(uint32_t a, uint32_t b, uint32_t d, float_status *s)
151
+{
152
+ return float32_muladd(a, b, d, 0, s);
153
+}
154
+
155
+static uint64_t fmacc64(uint64_t a, uint64_t b, uint64_t d, float_status *s)
156
+{
157
+ return float64_muladd(a, b, d, 0, s);
158
+}
159
+
160
+RVVCALL(OPFVV3, vfmacc_vv_h, OP_UUU_H, H2, H2, H2, fmacc16)
161
+RVVCALL(OPFVV3, vfmacc_vv_w, OP_UUU_W, H4, H4, H4, fmacc32)
162
+RVVCALL(OPFVV3, vfmacc_vv_d, OP_UUU_D, H8, H8, H8, fmacc64)
163
+GEN_VEXT_VV_ENV(vfmacc_vv_h, 2, 2, clearh)
164
+GEN_VEXT_VV_ENV(vfmacc_vv_w, 4, 4, clearl)
165
+GEN_VEXT_VV_ENV(vfmacc_vv_d, 8, 8, clearq)
166
+
167
+#define OPFVF3(NAME, TD, T1, T2, TX1, TX2, HD, HS2, OP) \
168
+static void do_##NAME(void *vd, uint64_t s1, void *vs2, int i, \
169
+ CPURISCVState *env) \
170
+{ \
171
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
172
+ TD d = *((TD *)vd + HD(i)); \
173
+ *((TD *)vd + HD(i)) = OP(s2, (TX1)(T1)s1, d, &env->fp_status);\
174
+}
175
+
176
+RVVCALL(OPFVF3, vfmacc_vf_h, OP_UUU_H, H2, H2, fmacc16)
177
+RVVCALL(OPFVF3, vfmacc_vf_w, OP_UUU_W, H4, H4, fmacc32)
178
+RVVCALL(OPFVF3, vfmacc_vf_d, OP_UUU_D, H8, H8, fmacc64)
179
+GEN_VEXT_VF(vfmacc_vf_h, 2, 2, clearh)
180
+GEN_VEXT_VF(vfmacc_vf_w, 4, 4, clearl)
181
+GEN_VEXT_VF(vfmacc_vf_d, 8, 8, clearq)
182
+
183
+static uint16_t fnmacc16(uint16_t a, uint16_t b, uint16_t d, float_status *s)
184
+{
185
+ return float16_muladd(a, b, d,
186
+ float_muladd_negate_c | float_muladd_negate_product, s);
187
+}
188
+
189
+static uint32_t fnmacc32(uint32_t a, uint32_t b, uint32_t d, float_status *s)
190
+{
191
+ return float32_muladd(a, b, d,
192
+ float_muladd_negate_c | float_muladd_negate_product, s);
193
+}
194
+
195
+static uint64_t fnmacc64(uint64_t a, uint64_t b, uint64_t d, float_status *s)
196
+{
197
+ return float64_muladd(a, b, d,
198
+ float_muladd_negate_c | float_muladd_negate_product, s);
199
+}
200
+
201
+RVVCALL(OPFVV3, vfnmacc_vv_h, OP_UUU_H, H2, H2, H2, fnmacc16)
202
+RVVCALL(OPFVV3, vfnmacc_vv_w, OP_UUU_W, H4, H4, H4, fnmacc32)
203
+RVVCALL(OPFVV3, vfnmacc_vv_d, OP_UUU_D, H8, H8, H8, fnmacc64)
204
+GEN_VEXT_VV_ENV(vfnmacc_vv_h, 2, 2, clearh)
205
+GEN_VEXT_VV_ENV(vfnmacc_vv_w, 4, 4, clearl)
206
+GEN_VEXT_VV_ENV(vfnmacc_vv_d, 8, 8, clearq)
207
+RVVCALL(OPFVF3, vfnmacc_vf_h, OP_UUU_H, H2, H2, fnmacc16)
208
+RVVCALL(OPFVF3, vfnmacc_vf_w, OP_UUU_W, H4, H4, fnmacc32)
209
+RVVCALL(OPFVF3, vfnmacc_vf_d, OP_UUU_D, H8, H8, fnmacc64)
210
+GEN_VEXT_VF(vfnmacc_vf_h, 2, 2, clearh)
211
+GEN_VEXT_VF(vfnmacc_vf_w, 4, 4, clearl)
212
+GEN_VEXT_VF(vfnmacc_vf_d, 8, 8, clearq)
213
+
214
+static uint16_t fmsac16(uint16_t a, uint16_t b, uint16_t d, float_status *s)
215
+{
216
+ return float16_muladd(a, b, d, float_muladd_negate_c, s);
217
+}
218
+
219
+static uint32_t fmsac32(uint32_t a, uint32_t b, uint32_t d, float_status *s)
220
+{
221
+ return float32_muladd(a, b, d, float_muladd_negate_c, s);
222
+}
223
+
224
+static uint64_t fmsac64(uint64_t a, uint64_t b, uint64_t d, float_status *s)
225
+{
226
+ return float64_muladd(a, b, d, float_muladd_negate_c, s);
227
+}
228
+
229
+RVVCALL(OPFVV3, vfmsac_vv_h, OP_UUU_H, H2, H2, H2, fmsac16)
230
+RVVCALL(OPFVV3, vfmsac_vv_w, OP_UUU_W, H4, H4, H4, fmsac32)
231
+RVVCALL(OPFVV3, vfmsac_vv_d, OP_UUU_D, H8, H8, H8, fmsac64)
232
+GEN_VEXT_VV_ENV(vfmsac_vv_h, 2, 2, clearh)
233
+GEN_VEXT_VV_ENV(vfmsac_vv_w, 4, 4, clearl)
234
+GEN_VEXT_VV_ENV(vfmsac_vv_d, 8, 8, clearq)
235
+RVVCALL(OPFVF3, vfmsac_vf_h, OP_UUU_H, H2, H2, fmsac16)
236
+RVVCALL(OPFVF3, vfmsac_vf_w, OP_UUU_W, H4, H4, fmsac32)
237
+RVVCALL(OPFVF3, vfmsac_vf_d, OP_UUU_D, H8, H8, fmsac64)
238
+GEN_VEXT_VF(vfmsac_vf_h, 2, 2, clearh)
239
+GEN_VEXT_VF(vfmsac_vf_w, 4, 4, clearl)
240
+GEN_VEXT_VF(vfmsac_vf_d, 8, 8, clearq)
241
+
242
+static uint16_t fnmsac16(uint16_t a, uint16_t b, uint16_t d, float_status *s)
243
+{
244
+ return float16_muladd(a, b, d, float_muladd_negate_product, s);
245
+}
246
+
247
+static uint32_t fnmsac32(uint32_t a, uint32_t b, uint32_t d, float_status *s)
248
+{
249
+ return float32_muladd(a, b, d, float_muladd_negate_product, s);
250
+}
251
+
252
+static uint64_t fnmsac64(uint64_t a, uint64_t b, uint64_t d, float_status *s)
253
+{
254
+ return float64_muladd(a, b, d, float_muladd_negate_product, s);
255
+}
256
+
257
+RVVCALL(OPFVV3, vfnmsac_vv_h, OP_UUU_H, H2, H2, H2, fnmsac16)
258
+RVVCALL(OPFVV3, vfnmsac_vv_w, OP_UUU_W, H4, H4, H4, fnmsac32)
259
+RVVCALL(OPFVV3, vfnmsac_vv_d, OP_UUU_D, H8, H8, H8, fnmsac64)
260
+GEN_VEXT_VV_ENV(vfnmsac_vv_h, 2, 2, clearh)
261
+GEN_VEXT_VV_ENV(vfnmsac_vv_w, 4, 4, clearl)
262
+GEN_VEXT_VV_ENV(vfnmsac_vv_d, 8, 8, clearq)
263
+RVVCALL(OPFVF3, vfnmsac_vf_h, OP_UUU_H, H2, H2, fnmsac16)
264
+RVVCALL(OPFVF3, vfnmsac_vf_w, OP_UUU_W, H4, H4, fnmsac32)
265
+RVVCALL(OPFVF3, vfnmsac_vf_d, OP_UUU_D, H8, H8, fnmsac64)
266
+GEN_VEXT_VF(vfnmsac_vf_h, 2, 2, clearh)
267
+GEN_VEXT_VF(vfnmsac_vf_w, 4, 4, clearl)
268
+GEN_VEXT_VF(vfnmsac_vf_d, 8, 8, clearq)
269
+
270
+static uint16_t fmadd16(uint16_t a, uint16_t b, uint16_t d, float_status *s)
271
+{
272
+ return float16_muladd(d, b, a, 0, s);
273
+}
274
+
275
+static uint32_t fmadd32(uint32_t a, uint32_t b, uint32_t d, float_status *s)
276
+{
277
+ return float32_muladd(d, b, a, 0, s);
278
+}
279
+
280
+static uint64_t fmadd64(uint64_t a, uint64_t b, uint64_t d, float_status *s)
281
+{
282
+ return float64_muladd(d, b, a, 0, s);
283
+}
284
+
285
+RVVCALL(OPFVV3, vfmadd_vv_h, OP_UUU_H, H2, H2, H2, fmadd16)
286
+RVVCALL(OPFVV3, vfmadd_vv_w, OP_UUU_W, H4, H4, H4, fmadd32)
287
+RVVCALL(OPFVV3, vfmadd_vv_d, OP_UUU_D, H8, H8, H8, fmadd64)
288
+GEN_VEXT_VV_ENV(vfmadd_vv_h, 2, 2, clearh)
289
+GEN_VEXT_VV_ENV(vfmadd_vv_w, 4, 4, clearl)
290
+GEN_VEXT_VV_ENV(vfmadd_vv_d, 8, 8, clearq)
291
+RVVCALL(OPFVF3, vfmadd_vf_h, OP_UUU_H, H2, H2, fmadd16)
292
+RVVCALL(OPFVF3, vfmadd_vf_w, OP_UUU_W, H4, H4, fmadd32)
293
+RVVCALL(OPFVF3, vfmadd_vf_d, OP_UUU_D, H8, H8, fmadd64)
294
+GEN_VEXT_VF(vfmadd_vf_h, 2, 2, clearh)
295
+GEN_VEXT_VF(vfmadd_vf_w, 4, 4, clearl)
296
+GEN_VEXT_VF(vfmadd_vf_d, 8, 8, clearq)
297
+
298
+static uint16_t fnmadd16(uint16_t a, uint16_t b, uint16_t d, float_status *s)
299
+{
300
+ return float16_muladd(d, b, a,
301
+ float_muladd_negate_c | float_muladd_negate_product, s);
302
+}
303
+
304
+static uint32_t fnmadd32(uint32_t a, uint32_t b, uint32_t d, float_status *s)
305
+{
306
+ return float32_muladd(d, b, a,
307
+ float_muladd_negate_c | float_muladd_negate_product, s);
308
+}
309
+
310
+static uint64_t fnmadd64(uint64_t a, uint64_t b, uint64_t d, float_status *s)
311
+{
312
+ return float64_muladd(d, b, a,
313
+ float_muladd_negate_c | float_muladd_negate_product, s);
314
+}
315
+
316
+RVVCALL(OPFVV3, vfnmadd_vv_h, OP_UUU_H, H2, H2, H2, fnmadd16)
317
+RVVCALL(OPFVV3, vfnmadd_vv_w, OP_UUU_W, H4, H4, H4, fnmadd32)
318
+RVVCALL(OPFVV3, vfnmadd_vv_d, OP_UUU_D, H8, H8, H8, fnmadd64)
319
+GEN_VEXT_VV_ENV(vfnmadd_vv_h, 2, 2, clearh)
320
+GEN_VEXT_VV_ENV(vfnmadd_vv_w, 4, 4, clearl)
321
+GEN_VEXT_VV_ENV(vfnmadd_vv_d, 8, 8, clearq)
322
+RVVCALL(OPFVF3, vfnmadd_vf_h, OP_UUU_H, H2, H2, fnmadd16)
323
+RVVCALL(OPFVF3, vfnmadd_vf_w, OP_UUU_W, H4, H4, fnmadd32)
324
+RVVCALL(OPFVF3, vfnmadd_vf_d, OP_UUU_D, H8, H8, fnmadd64)
325
+GEN_VEXT_VF(vfnmadd_vf_h, 2, 2, clearh)
326
+GEN_VEXT_VF(vfnmadd_vf_w, 4, 4, clearl)
327
+GEN_VEXT_VF(vfnmadd_vf_d, 8, 8, clearq)
328
+
329
+static uint16_t fmsub16(uint16_t a, uint16_t b, uint16_t d, float_status *s)
330
+{
331
+ return float16_muladd(d, b, a, float_muladd_negate_c, s);
332
+}
333
+
334
+static uint32_t fmsub32(uint32_t a, uint32_t b, uint32_t d, float_status *s)
335
+{
336
+ return float32_muladd(d, b, a, float_muladd_negate_c, s);
337
+}
338
+
339
+static uint64_t fmsub64(uint64_t a, uint64_t b, uint64_t d, float_status *s)
340
+{
341
+ return float64_muladd(d, b, a, float_muladd_negate_c, s);
342
+}
343
+
344
+RVVCALL(OPFVV3, vfmsub_vv_h, OP_UUU_H, H2, H2, H2, fmsub16)
345
+RVVCALL(OPFVV3, vfmsub_vv_w, OP_UUU_W, H4, H4, H4, fmsub32)
346
+RVVCALL(OPFVV3, vfmsub_vv_d, OP_UUU_D, H8, H8, H8, fmsub64)
347
+GEN_VEXT_VV_ENV(vfmsub_vv_h, 2, 2, clearh)
348
+GEN_VEXT_VV_ENV(vfmsub_vv_w, 4, 4, clearl)
349
+GEN_VEXT_VV_ENV(vfmsub_vv_d, 8, 8, clearq)
350
+RVVCALL(OPFVF3, vfmsub_vf_h, OP_UUU_H, H2, H2, fmsub16)
351
+RVVCALL(OPFVF3, vfmsub_vf_w, OP_UUU_W, H4, H4, fmsub32)
352
+RVVCALL(OPFVF3, vfmsub_vf_d, OP_UUU_D, H8, H8, fmsub64)
353
+GEN_VEXT_VF(vfmsub_vf_h, 2, 2, clearh)
354
+GEN_VEXT_VF(vfmsub_vf_w, 4, 4, clearl)
355
+GEN_VEXT_VF(vfmsub_vf_d, 8, 8, clearq)
356
+
357
+static uint16_t fnmsub16(uint16_t a, uint16_t b, uint16_t d, float_status *s)
358
+{
359
+ return float16_muladd(d, b, a, float_muladd_negate_product, s);
360
+}
361
+
362
+static uint32_t fnmsub32(uint32_t a, uint32_t b, uint32_t d, float_status *s)
363
+{
364
+ return float32_muladd(d, b, a, float_muladd_negate_product, s);
365
+}
366
+
367
+static uint64_t fnmsub64(uint64_t a, uint64_t b, uint64_t d, float_status *s)
368
+{
369
+ return float64_muladd(d, b, a, float_muladd_negate_product, s);
370
+}
371
+
372
+RVVCALL(OPFVV3, vfnmsub_vv_h, OP_UUU_H, H2, H2, H2, fnmsub16)
373
+RVVCALL(OPFVV3, vfnmsub_vv_w, OP_UUU_W, H4, H4, H4, fnmsub32)
374
+RVVCALL(OPFVV3, vfnmsub_vv_d, OP_UUU_D, H8, H8, H8, fnmsub64)
375
+GEN_VEXT_VV_ENV(vfnmsub_vv_h, 2, 2, clearh)
376
+GEN_VEXT_VV_ENV(vfnmsub_vv_w, 4, 4, clearl)
377
+GEN_VEXT_VV_ENV(vfnmsub_vv_d, 8, 8, clearq)
378
+RVVCALL(OPFVF3, vfnmsub_vf_h, OP_UUU_H, H2, H2, fnmsub16)
379
+RVVCALL(OPFVF3, vfnmsub_vf_w, OP_UUU_W, H4, H4, fnmsub32)
380
+RVVCALL(OPFVF3, vfnmsub_vf_d, OP_UUU_D, H8, H8, fnmsub64)
381
+GEN_VEXT_VF(vfnmsub_vf_h, 2, 2, clearh)
382
+GEN_VEXT_VF(vfnmsub_vf_w, 4, 4, clearl)
383
+GEN_VEXT_VF(vfnmsub_vf_d, 8, 8, clearq)
384
--
385
2.27.0
386
387
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-36-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 17 +++++
10
target/riscv/insn32.decode | 8 +++
11
target/riscv/insn_trans/trans_rvv.inc.c | 10 +++
12
target/riscv/vector_helper.c | 91 +++++++++++++++++++++++++
13
4 files changed, 126 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vfmsub_vf_d, void, ptr, ptr, i64, ptr, env, i32)
20
DEF_HELPER_6(vfnmsub_vf_h, void, ptr, ptr, i64, ptr, env, i32)
21
DEF_HELPER_6(vfnmsub_vf_w, void, ptr, ptr, i64, ptr, env, i32)
22
DEF_HELPER_6(vfnmsub_vf_d, void, ptr, ptr, i64, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vfwmacc_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vfwmacc_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vfwnmacc_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vfwnmacc_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vfwmsac_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vfwmsac_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vfwnmsac_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vfwnmsac_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vfwmacc_vf_h, void, ptr, ptr, i64, ptr, env, i32)
33
+DEF_HELPER_6(vfwmacc_vf_w, void, ptr, ptr, i64, ptr, env, i32)
34
+DEF_HELPER_6(vfwnmacc_vf_h, void, ptr, ptr, i64, ptr, env, i32)
35
+DEF_HELPER_6(vfwnmacc_vf_w, void, ptr, ptr, i64, ptr, env, i32)
36
+DEF_HELPER_6(vfwmsac_vf_h, void, ptr, ptr, i64, ptr, env, i32)
37
+DEF_HELPER_6(vfwmsac_vf_w, void, ptr, ptr, i64, ptr, env, i32)
38
+DEF_HELPER_6(vfwnmsac_vf_h, void, ptr, ptr, i64, ptr, env, i32)
39
+DEF_HELPER_6(vfwnmsac_vf_w, void, ptr, ptr, i64, ptr, env, i32)
40
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/riscv/insn32.decode
43
+++ b/target/riscv/insn32.decode
44
@@ -XXX,XX +XXX,XX @@ vfmsub_vv 101010 . ..... ..... 001 ..... 1010111 @r_vm
45
vfmsub_vf 101010 . ..... ..... 101 ..... 1010111 @r_vm
46
vfnmsub_vv 101011 . ..... ..... 001 ..... 1010111 @r_vm
47
vfnmsub_vf 101011 . ..... ..... 101 ..... 1010111 @r_vm
48
+vfwmacc_vv 111100 . ..... ..... 001 ..... 1010111 @r_vm
49
+vfwmacc_vf 111100 . ..... ..... 101 ..... 1010111 @r_vm
50
+vfwnmacc_vv 111101 . ..... ..... 001 ..... 1010111 @r_vm
51
+vfwnmacc_vf 111101 . ..... ..... 101 ..... 1010111 @r_vm
52
+vfwmsac_vv 111110 . ..... ..... 001 ..... 1010111 @r_vm
53
+vfwmsac_vf 111110 . ..... ..... 101 ..... 1010111 @r_vm
54
+vfwnmsac_vv 111111 . ..... ..... 001 ..... 1010111 @r_vm
55
+vfwnmsac_vf 111111 . ..... ..... 101 ..... 1010111 @r_vm
56
57
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
58
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
59
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/target/riscv/insn_trans/trans_rvv.inc.c
62
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
63
@@ -XXX,XX +XXX,XX @@ GEN_OPFVF_TRANS(vfmadd_vf, opfvf_check)
64
GEN_OPFVF_TRANS(vfnmadd_vf, opfvf_check)
65
GEN_OPFVF_TRANS(vfmsub_vf, opfvf_check)
66
GEN_OPFVF_TRANS(vfnmsub_vf, opfvf_check)
67
+
68
+/* Vector Widening Floating-Point Fused Multiply-Add Instructions */
69
+GEN_OPFVV_WIDEN_TRANS(vfwmacc_vv, opfvv_widen_check)
70
+GEN_OPFVV_WIDEN_TRANS(vfwnmacc_vv, opfvv_widen_check)
71
+GEN_OPFVV_WIDEN_TRANS(vfwmsac_vv, opfvv_widen_check)
72
+GEN_OPFVV_WIDEN_TRANS(vfwnmsac_vv, opfvv_widen_check)
73
+GEN_OPFVF_WIDEN_TRANS(vfwmacc_vf)
74
+GEN_OPFVF_WIDEN_TRANS(vfwnmacc_vf)
75
+GEN_OPFVF_WIDEN_TRANS(vfwmsac_vf)
76
+GEN_OPFVF_WIDEN_TRANS(vfwnmsac_vf)
77
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/target/riscv/vector_helper.c
80
+++ b/target/riscv/vector_helper.c
81
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVF3, vfnmsub_vf_d, OP_UUU_D, H8, H8, fnmsub64)
82
GEN_VEXT_VF(vfnmsub_vf_h, 2, 2, clearh)
83
GEN_VEXT_VF(vfnmsub_vf_w, 4, 4, clearl)
84
GEN_VEXT_VF(vfnmsub_vf_d, 8, 8, clearq)
85
+
86
+/* Vector Widening Floating-Point Fused Multiply-Add Instructions */
87
+static uint32_t fwmacc16(uint16_t a, uint16_t b, uint32_t d, float_status *s)
88
+{
89
+ return float32_muladd(float16_to_float32(a, true, s),
90
+ float16_to_float32(b, true, s), d, 0, s);
91
+}
92
+
93
+static uint64_t fwmacc32(uint32_t a, uint32_t b, uint64_t d, float_status *s)
94
+{
95
+ return float64_muladd(float32_to_float64(a, s),
96
+ float32_to_float64(b, s), d, 0, s);
97
+}
98
+
99
+RVVCALL(OPFVV3, vfwmacc_vv_h, WOP_UUU_H, H4, H2, H2, fwmacc16)
100
+RVVCALL(OPFVV3, vfwmacc_vv_w, WOP_UUU_W, H8, H4, H4, fwmacc32)
101
+GEN_VEXT_VV_ENV(vfwmacc_vv_h, 2, 4, clearl)
102
+GEN_VEXT_VV_ENV(vfwmacc_vv_w, 4, 8, clearq)
103
+RVVCALL(OPFVF3, vfwmacc_vf_h, WOP_UUU_H, H4, H2, fwmacc16)
104
+RVVCALL(OPFVF3, vfwmacc_vf_w, WOP_UUU_W, H8, H4, fwmacc32)
105
+GEN_VEXT_VF(vfwmacc_vf_h, 2, 4, clearl)
106
+GEN_VEXT_VF(vfwmacc_vf_w, 4, 8, clearq)
107
+
108
+static uint32_t fwnmacc16(uint16_t a, uint16_t b, uint32_t d, float_status *s)
109
+{
110
+ return float32_muladd(float16_to_float32(a, true, s),
111
+ float16_to_float32(b, true, s), d,
112
+ float_muladd_negate_c | float_muladd_negate_product, s);
113
+}
114
+
115
+static uint64_t fwnmacc32(uint32_t a, uint32_t b, uint64_t d, float_status *s)
116
+{
117
+ return float64_muladd(float32_to_float64(a, s),
118
+ float32_to_float64(b, s), d,
119
+ float_muladd_negate_c | float_muladd_negate_product, s);
120
+}
121
+
122
+RVVCALL(OPFVV3, vfwnmacc_vv_h, WOP_UUU_H, H4, H2, H2, fwnmacc16)
123
+RVVCALL(OPFVV3, vfwnmacc_vv_w, WOP_UUU_W, H8, H4, H4, fwnmacc32)
124
+GEN_VEXT_VV_ENV(vfwnmacc_vv_h, 2, 4, clearl)
125
+GEN_VEXT_VV_ENV(vfwnmacc_vv_w, 4, 8, clearq)
126
+RVVCALL(OPFVF3, vfwnmacc_vf_h, WOP_UUU_H, H4, H2, fwnmacc16)
127
+RVVCALL(OPFVF3, vfwnmacc_vf_w, WOP_UUU_W, H8, H4, fwnmacc32)
128
+GEN_VEXT_VF(vfwnmacc_vf_h, 2, 4, clearl)
129
+GEN_VEXT_VF(vfwnmacc_vf_w, 4, 8, clearq)
130
+
131
+static uint32_t fwmsac16(uint16_t a, uint16_t b, uint32_t d, float_status *s)
132
+{
133
+ return float32_muladd(float16_to_float32(a, true, s),
134
+ float16_to_float32(b, true, s), d,
135
+ float_muladd_negate_c, s);
136
+}
137
+
138
+static uint64_t fwmsac32(uint32_t a, uint32_t b, uint64_t d, float_status *s)
139
+{
140
+ return float64_muladd(float32_to_float64(a, s),
141
+ float32_to_float64(b, s), d,
142
+ float_muladd_negate_c, s);
143
+}
144
+
145
+RVVCALL(OPFVV3, vfwmsac_vv_h, WOP_UUU_H, H4, H2, H2, fwmsac16)
146
+RVVCALL(OPFVV3, vfwmsac_vv_w, WOP_UUU_W, H8, H4, H4, fwmsac32)
147
+GEN_VEXT_VV_ENV(vfwmsac_vv_h, 2, 4, clearl)
148
+GEN_VEXT_VV_ENV(vfwmsac_vv_w, 4, 8, clearq)
149
+RVVCALL(OPFVF3, vfwmsac_vf_h, WOP_UUU_H, H4, H2, fwmsac16)
150
+RVVCALL(OPFVF3, vfwmsac_vf_w, WOP_UUU_W, H8, H4, fwmsac32)
151
+GEN_VEXT_VF(vfwmsac_vf_h, 2, 4, clearl)
152
+GEN_VEXT_VF(vfwmsac_vf_w, 4, 8, clearq)
153
+
154
+static uint32_t fwnmsac16(uint16_t a, uint16_t b, uint32_t d, float_status *s)
155
+{
156
+ return float32_muladd(float16_to_float32(a, true, s),
157
+ float16_to_float32(b, true, s), d,
158
+ float_muladd_negate_product, s);
159
+}
160
+
161
+static uint64_t fwnmsac32(uint32_t a, uint32_t b, uint64_t d, float_status *s)
162
+{
163
+ return float64_muladd(float32_to_float64(a, s),
164
+ float32_to_float64(b, s), d,
165
+ float_muladd_negate_product, s);
166
+}
167
+
168
+RVVCALL(OPFVV3, vfwnmsac_vv_h, WOP_UUU_H, H4, H2, H2, fwnmsac16)
169
+RVVCALL(OPFVV3, vfwnmsac_vv_w, WOP_UUU_W, H8, H4, H4, fwnmsac32)
170
+GEN_VEXT_VV_ENV(vfwnmsac_vv_h, 2, 4, clearl)
171
+GEN_VEXT_VV_ENV(vfwnmsac_vv_w, 4, 8, clearq)
172
+RVVCALL(OPFVF3, vfwnmsac_vf_h, WOP_UUU_H, H4, H2, fwnmsac16)
173
+RVVCALL(OPFVF3, vfwnmsac_vf_w, WOP_UUU_W, H8, H4, fwnmsac32)
174
+GEN_VEXT_VF(vfwnmsac_vf_h, 2, 4, clearl)
175
+GEN_VEXT_VF(vfwnmsac_vf_w, 4, 8, clearq)
176
--
177
2.27.0
178
179
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-37-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 4 +++
10
target/riscv/insn32.decode | 3 ++
11
target/riscv/insn_trans/trans_rvv.inc.c | 43 +++++++++++++++++++++++++
12
target/riscv/vector_helper.c | 43 +++++++++++++++++++++++++
13
4 files changed, 93 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vfwmsac_vf_h, void, ptr, ptr, i64, ptr, env, i32)
20
DEF_HELPER_6(vfwmsac_vf_w, void, ptr, ptr, i64, ptr, env, i32)
21
DEF_HELPER_6(vfwnmsac_vf_h, void, ptr, ptr, i64, ptr, env, i32)
22
DEF_HELPER_6(vfwnmsac_vf_w, void, ptr, ptr, i64, ptr, env, i32)
23
+
24
+DEF_HELPER_5(vfsqrt_v_h, void, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_5(vfsqrt_v_w, void, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_5(vfsqrt_v_d, void, ptr, ptr, ptr, env, i32)
27
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/riscv/insn32.decode
30
+++ b/target/riscv/insn32.decode
31
@@ -XXX,XX +XXX,XX @@
32
&shift shamt rs1 rd
33
&atomic aq rl rs2 rs1 rd
34
&rmrr vm rd rs1 rs2
35
+&rmr vm rd rs2
36
&rwdvm vm wd rd rs1 rs2
37
&r2nfvm vm rd rs1 nf
38
&rnfvm vm rd rs1 rs2 nf
39
@@ -XXX,XX +XXX,XX @@
40
@r2_rm ....... ..... ..... ... ..... ....... %rs1 %rm %rd
41
@r2 ....... ..... ..... ... ..... ....... %rs1 %rd
42
@r2_nfvm ... ... vm:1 ..... ..... ... ..... ....... &r2nfvm %nf %rs1 %rd
43
+@r2_vm ...... vm:1 ..... ..... ... ..... ....... &rmr %rs2 %rd
44
@r_nfvm ... ... vm:1 ..... ..... ... ..... ....... &rnfvm %nf %rs2 %rs1 %rd
45
@r_vm ...... vm:1 ..... ..... ... ..... ....... &rmrr %rs2 %rs1 %rd
46
@r_vm_1 ...... . ..... ..... ... ..... ....... &rmrr vm=1 %rs2 %rs1 %rd
47
@@ -XXX,XX +XXX,XX @@ vfwmsac_vv 111110 . ..... ..... 001 ..... 1010111 @r_vm
48
vfwmsac_vf 111110 . ..... ..... 101 ..... 1010111 @r_vm
49
vfwnmsac_vv 111111 . ..... ..... 001 ..... 1010111 @r_vm
50
vfwnmsac_vf 111111 . ..... ..... 101 ..... 1010111 @r_vm
51
+vfsqrt_v 100011 . ..... 00000 001 ..... 1010111 @r2_vm
52
53
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
54
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
55
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
56
index XXXXXXX..XXXXXXX 100644
57
--- a/target/riscv/insn_trans/trans_rvv.inc.c
58
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
59
@@ -XXX,XX +XXX,XX @@ GEN_OPFVF_WIDEN_TRANS(vfwmacc_vf)
60
GEN_OPFVF_WIDEN_TRANS(vfwnmacc_vf)
61
GEN_OPFVF_WIDEN_TRANS(vfwmsac_vf)
62
GEN_OPFVF_WIDEN_TRANS(vfwnmsac_vf)
63
+
64
+/* Vector Floating-Point Square-Root Instruction */
65
+
66
+/*
67
+ * If the current SEW does not correspond to a supported IEEE floating-point
68
+ * type, an illegal instruction exception is raised
69
+ */
70
+static bool opfv_check(DisasContext *s, arg_rmr *a)
71
+{
72
+ return (vext_check_isa_ill(s) &&
73
+ vext_check_overlap_mask(s, a->rd, a->vm, false) &&
74
+ vext_check_reg(s, a->rd, false) &&
75
+ vext_check_reg(s, a->rs2, false) &&
76
+ (s->sew != 0));
77
+}
78
+
79
+#define GEN_OPFV_TRANS(NAME, CHECK) \
80
+static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
81
+{ \
82
+ if (CHECK(s, a)) { \
83
+ uint32_t data = 0; \
84
+ static gen_helper_gvec_3_ptr * const fns[3] = { \
85
+ gen_helper_##NAME##_h, \
86
+ gen_helper_##NAME##_w, \
87
+ gen_helper_##NAME##_d, \
88
+ }; \
89
+ TCGLabel *over = gen_new_label(); \
90
+ gen_set_rm(s, 7); \
91
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
92
+ \
93
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
94
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
95
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
96
+ tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
97
+ vreg_ofs(s, a->rs2), cpu_env, 0, \
98
+ s->vlen / 8, data, fns[s->sew - 1]); \
99
+ gen_set_label(over); \
100
+ return true; \
101
+ } \
102
+ return false; \
103
+}
104
+
105
+GEN_OPFV_TRANS(vfsqrt_v, opfv_check)
106
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/target/riscv/vector_helper.c
109
+++ b/target/riscv/vector_helper.c
110
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVF3, vfwnmsac_vf_h, WOP_UUU_H, H4, H2, fwnmsac16)
111
RVVCALL(OPFVF3, vfwnmsac_vf_w, WOP_UUU_W, H8, H4, fwnmsac32)
112
GEN_VEXT_VF(vfwnmsac_vf_h, 2, 4, clearl)
113
GEN_VEXT_VF(vfwnmsac_vf_w, 4, 8, clearq)
114
+
115
+/* Vector Floating-Point Square-Root Instruction */
116
+/* (TD, T2, TX2) */
117
+#define OP_UU_H uint16_t, uint16_t, uint16_t
118
+#define OP_UU_W uint32_t, uint32_t, uint32_t
119
+#define OP_UU_D uint64_t, uint64_t, uint64_t
120
+
121
+#define OPFVV1(NAME, TD, T2, TX2, HD, HS2, OP) \
122
+static void do_##NAME(void *vd, void *vs2, int i, \
123
+ CPURISCVState *env) \
124
+{ \
125
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
126
+ *((TD *)vd + HD(i)) = OP(s2, &env->fp_status); \
127
+}
128
+
129
+#define GEN_VEXT_V_ENV(NAME, ESZ, DSZ, CLEAR_FN) \
130
+void HELPER(NAME)(void *vd, void *v0, void *vs2, \
131
+ CPURISCVState *env, uint32_t desc) \
132
+{ \
133
+ uint32_t vlmax = vext_maxsz(desc) / ESZ; \
134
+ uint32_t mlen = vext_mlen(desc); \
135
+ uint32_t vm = vext_vm(desc); \
136
+ uint32_t vl = env->vl; \
137
+ uint32_t i; \
138
+ \
139
+ if (vl == 0) { \
140
+ return; \
141
+ } \
142
+ for (i = 0; i < vl; i++) { \
143
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
144
+ continue; \
145
+ } \
146
+ do_##NAME(vd, vs2, i, env); \
147
+ } \
148
+ CLEAR_FN(vd, vl, vl * DSZ, vlmax * DSZ); \
149
+}
150
+
151
+RVVCALL(OPFVV1, vfsqrt_v_h, OP_UU_H, H2, H2, float16_sqrt)
152
+RVVCALL(OPFVV1, vfsqrt_v_w, OP_UU_W, H4, H4, float32_sqrt)
153
+RVVCALL(OPFVV1, vfsqrt_v_d, OP_UU_D, H8, H8, float64_sqrt)
154
+GEN_VEXT_V_ENV(vfsqrt_v_h, 2, 2, clearh)
155
+GEN_VEXT_V_ENV(vfsqrt_v_w, 4, 4, clearl)
156
+GEN_VEXT_V_ENV(vfsqrt_v_d, 8, 8, clearq)
157
--
158
2.27.0
159
160
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-38-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 13 ++++++++++++
10
target/riscv/insn32.decode | 4 ++++
11
target/riscv/insn_trans/trans_rvv.inc.c | 6 ++++++
12
target/riscv/vector_helper.c | 27 +++++++++++++++++++++++++
13
4 files changed, 50 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vfwnmsac_vf_w, void, ptr, ptr, i64, ptr, env, i32)
20
DEF_HELPER_5(vfsqrt_v_h, void, ptr, ptr, ptr, env, i32)
21
DEF_HELPER_5(vfsqrt_v_w, void, ptr, ptr, ptr, env, i32)
22
DEF_HELPER_5(vfsqrt_v_d, void, ptr, ptr, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vfmin_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vfmin_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vfmin_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vfmax_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vfmax_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vfmax_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vfmin_vf_h, void, ptr, ptr, i64, ptr, env, i32)
31
+DEF_HELPER_6(vfmin_vf_w, void, ptr, ptr, i64, ptr, env, i32)
32
+DEF_HELPER_6(vfmin_vf_d, void, ptr, ptr, i64, ptr, env, i32)
33
+DEF_HELPER_6(vfmax_vf_h, void, ptr, ptr, i64, ptr, env, i32)
34
+DEF_HELPER_6(vfmax_vf_w, void, ptr, ptr, i64, ptr, env, i32)
35
+DEF_HELPER_6(vfmax_vf_d, void, ptr, ptr, i64, ptr, env, i32)
36
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/riscv/insn32.decode
39
+++ b/target/riscv/insn32.decode
40
@@ -XXX,XX +XXX,XX @@ vfwmsac_vf 111110 . ..... ..... 101 ..... 1010111 @r_vm
41
vfwnmsac_vv 111111 . ..... ..... 001 ..... 1010111 @r_vm
42
vfwnmsac_vf 111111 . ..... ..... 101 ..... 1010111 @r_vm
43
vfsqrt_v 100011 . ..... 00000 001 ..... 1010111 @r2_vm
44
+vfmin_vv 000100 . ..... ..... 001 ..... 1010111 @r_vm
45
+vfmin_vf 000100 . ..... ..... 101 ..... 1010111 @r_vm
46
+vfmax_vv 000110 . ..... ..... 001 ..... 1010111 @r_vm
47
+vfmax_vf 000110 . ..... ..... 101 ..... 1010111 @r_vm
48
49
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
50
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
51
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/target/riscv/insn_trans/trans_rvv.inc.c
54
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
55
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
56
}
57
58
GEN_OPFV_TRANS(vfsqrt_v, opfv_check)
59
+
60
+/* Vector Floating-Point MIN/MAX Instructions */
61
+GEN_OPFVV_TRANS(vfmin_vv, opfvv_check)
62
+GEN_OPFVV_TRANS(vfmax_vv, opfvv_check)
63
+GEN_OPFVF_TRANS(vfmin_vf, opfvf_check)
64
+GEN_OPFVF_TRANS(vfmax_vf, opfvf_check)
65
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/target/riscv/vector_helper.c
68
+++ b/target/riscv/vector_helper.c
69
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVV1, vfsqrt_v_d, OP_UU_D, H8, H8, float64_sqrt)
70
GEN_VEXT_V_ENV(vfsqrt_v_h, 2, 2, clearh)
71
GEN_VEXT_V_ENV(vfsqrt_v_w, 4, 4, clearl)
72
GEN_VEXT_V_ENV(vfsqrt_v_d, 8, 8, clearq)
73
+
74
+/* Vector Floating-Point MIN/MAX Instructions */
75
+RVVCALL(OPFVV2, vfmin_vv_h, OP_UUU_H, H2, H2, H2, float16_minnum)
76
+RVVCALL(OPFVV2, vfmin_vv_w, OP_UUU_W, H4, H4, H4, float32_minnum)
77
+RVVCALL(OPFVV2, vfmin_vv_d, OP_UUU_D, H8, H8, H8, float64_minnum)
78
+GEN_VEXT_VV_ENV(vfmin_vv_h, 2, 2, clearh)
79
+GEN_VEXT_VV_ENV(vfmin_vv_w, 4, 4, clearl)
80
+GEN_VEXT_VV_ENV(vfmin_vv_d, 8, 8, clearq)
81
+RVVCALL(OPFVF2, vfmin_vf_h, OP_UUU_H, H2, H2, float16_minnum)
82
+RVVCALL(OPFVF2, vfmin_vf_w, OP_UUU_W, H4, H4, float32_minnum)
83
+RVVCALL(OPFVF2, vfmin_vf_d, OP_UUU_D, H8, H8, float64_minnum)
84
+GEN_VEXT_VF(vfmin_vf_h, 2, 2, clearh)
85
+GEN_VEXT_VF(vfmin_vf_w, 4, 4, clearl)
86
+GEN_VEXT_VF(vfmin_vf_d, 8, 8, clearq)
87
+
88
+RVVCALL(OPFVV2, vfmax_vv_h, OP_UUU_H, H2, H2, H2, float16_maxnum)
89
+RVVCALL(OPFVV2, vfmax_vv_w, OP_UUU_W, H4, H4, H4, float32_maxnum)
90
+RVVCALL(OPFVV2, vfmax_vv_d, OP_UUU_D, H8, H8, H8, float64_maxnum)
91
+GEN_VEXT_VV_ENV(vfmax_vv_h, 2, 2, clearh)
92
+GEN_VEXT_VV_ENV(vfmax_vv_w, 4, 4, clearl)
93
+GEN_VEXT_VV_ENV(vfmax_vv_d, 8, 8, clearq)
94
+RVVCALL(OPFVF2, vfmax_vf_h, OP_UUU_H, H2, H2, float16_maxnum)
95
+RVVCALL(OPFVF2, vfmax_vf_w, OP_UUU_W, H4, H4, float32_maxnum)
96
+RVVCALL(OPFVF2, vfmax_vf_d, OP_UUU_D, H8, H8, float64_maxnum)
97
+GEN_VEXT_VF(vfmax_vf_h, 2, 2, clearh)
98
+GEN_VEXT_VF(vfmax_vf_w, 4, 4, clearl)
99
+GEN_VEXT_VF(vfmax_vf_d, 8, 8, clearq)
100
--
101
2.27.0
102
103
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
Microchip PolarFire SoC integrates a DMA engine that supports:
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
* Independent concurrent DMA transfers using 4 DMA channels
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
* Generation of interrupts on various conditions during execution
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
which is actually an IP reused from the SiFive FU540 chip.
6
Message-Id: <20200701152549.1218-39-zhiwei_liu@c-sky.com>
7
8
This creates a model to support both polling and interrupt modes.
9
10
Signed-off-by: Bin Meng <bin.meng@windriver.com>
11
Acked-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-Id: <1598924352-89526-10-git-send-email-bmeng.cn@gmail.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
8
---
15
include/hw/dma/sifive_pdma.h | 57 +++++++
9
target/riscv/helper.h | 19 ++++++
16
hw/dma/sifive_pdma.c | 313 +++++++++++++++++++++++++++++++++++
10
target/riscv/insn32.decode | 6 ++
17
hw/dma/Kconfig | 3 +
11
target/riscv/insn_trans/trans_rvv.inc.c | 8 +++
18
hw/dma/meson.build | 1 +
12
target/riscv/vector_helper.c | 85 +++++++++++++++++++++++++
19
4 files changed, 374 insertions(+)
13
4 files changed, 118 insertions(+)
20
create mode 100644 include/hw/dma/sifive_pdma.h
21
create mode 100644 hw/dma/sifive_pdma.c
22
14
23
diff --git a/include/hw/dma/sifive_pdma.h b/include/hw/dma/sifive_pdma.h
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
24
new file mode 100644
16
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX
17
--- a/target/riscv/helper.h
26
--- /dev/null
18
+++ b/target/riscv/helper.h
27
+++ b/include/hw/dma/sifive_pdma.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vfmin_vf_d, void, ptr, ptr, i64, ptr, env, i32)
28
@@ -XXX,XX +XXX,XX @@
20
DEF_HELPER_6(vfmax_vf_h, void, ptr, ptr, i64, ptr, env, i32)
29
+/*
21
DEF_HELPER_6(vfmax_vf_w, void, ptr, ptr, i64, ptr, env, i32)
30
+ * SiFive Platform DMA emulation
22
DEF_HELPER_6(vfmax_vf_d, void, ptr, ptr, i64, ptr, env, i32)
31
+ *
32
+ * Copyright (c) 2020 Wind River Systems, Inc.
33
+ *
34
+ * Author:
35
+ * Bin Meng <bin.meng@windriver.com>
36
+ *
37
+ * This program is free software; you can redistribute it and/or
38
+ * modify it under the terms of the GNU General Public License as
39
+ * published by the Free Software Foundation; either version 2 or
40
+ * (at your option) version 3 of the License.
41
+ *
42
+ * This program is distributed in the hope that it will be useful,
43
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
44
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
45
+ * GNU General Public License for more details.
46
+ *
47
+ * You should have received a copy of the GNU General Public License along
48
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
49
+ */
50
+
23
+
51
+#ifndef SIFIVE_PDMA_H
24
+DEF_HELPER_6(vfsgnj_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
52
+#define SIFIVE_PDMA_H
25
+DEF_HELPER_6(vfsgnj_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vfsgnj_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vfsgnjn_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vfsgnjn_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vfsgnjn_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vfsgnjx_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vfsgnjx_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vfsgnjx_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vfsgnj_vf_h, void, ptr, ptr, i64, ptr, env, i32)
34
+DEF_HELPER_6(vfsgnj_vf_w, void, ptr, ptr, i64, ptr, env, i32)
35
+DEF_HELPER_6(vfsgnj_vf_d, void, ptr, ptr, i64, ptr, env, i32)
36
+DEF_HELPER_6(vfsgnjn_vf_h, void, ptr, ptr, i64, ptr, env, i32)
37
+DEF_HELPER_6(vfsgnjn_vf_w, void, ptr, ptr, i64, ptr, env, i32)
38
+DEF_HELPER_6(vfsgnjn_vf_d, void, ptr, ptr, i64, ptr, env, i32)
39
+DEF_HELPER_6(vfsgnjx_vf_h, void, ptr, ptr, i64, ptr, env, i32)
40
+DEF_HELPER_6(vfsgnjx_vf_w, void, ptr, ptr, i64, ptr, env, i32)
41
+DEF_HELPER_6(vfsgnjx_vf_d, void, ptr, ptr, i64, ptr, env, i32)
42
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/riscv/insn32.decode
45
+++ b/target/riscv/insn32.decode
46
@@ -XXX,XX +XXX,XX @@ vfmin_vv 000100 . ..... ..... 001 ..... 1010111 @r_vm
47
vfmin_vf 000100 . ..... ..... 101 ..... 1010111 @r_vm
48
vfmax_vv 000110 . ..... ..... 001 ..... 1010111 @r_vm
49
vfmax_vf 000110 . ..... ..... 101 ..... 1010111 @r_vm
50
+vfsgnj_vv 001000 . ..... ..... 001 ..... 1010111 @r_vm
51
+vfsgnj_vf 001000 . ..... ..... 101 ..... 1010111 @r_vm
52
+vfsgnjn_vv 001001 . ..... ..... 001 ..... 1010111 @r_vm
53
+vfsgnjn_vf 001001 . ..... ..... 101 ..... 1010111 @r_vm
54
+vfsgnjx_vv 001010 . ..... ..... 001 ..... 1010111 @r_vm
55
+vfsgnjx_vf 001010 . ..... ..... 101 ..... 1010111 @r_vm
56
57
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
58
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
59
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/target/riscv/insn_trans/trans_rvv.inc.c
62
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
63
@@ -XXX,XX +XXX,XX @@ GEN_OPFVV_TRANS(vfmin_vv, opfvv_check)
64
GEN_OPFVV_TRANS(vfmax_vv, opfvv_check)
65
GEN_OPFVF_TRANS(vfmin_vf, opfvf_check)
66
GEN_OPFVF_TRANS(vfmax_vf, opfvf_check)
53
+
67
+
54
+struct sifive_pdma_chan {
68
+/* Vector Floating-Point Sign-Injection Instructions */
55
+ uint32_t control;
69
+GEN_OPFVV_TRANS(vfsgnj_vv, opfvv_check)
56
+ uint32_t next_config;
70
+GEN_OPFVV_TRANS(vfsgnjn_vv, opfvv_check)
57
+ uint64_t next_bytes;
71
+GEN_OPFVV_TRANS(vfsgnjx_vv, opfvv_check)
58
+ uint64_t next_dst;
72
+GEN_OPFVF_TRANS(vfsgnj_vf, opfvf_check)
59
+ uint64_t next_src;
73
+GEN_OPFVF_TRANS(vfsgnjn_vf, opfvf_check)
60
+ uint32_t exec_config;
74
+GEN_OPFVF_TRANS(vfsgnjx_vf, opfvf_check)
61
+ uint64_t exec_bytes;
75
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
62
+ uint64_t exec_dst;
76
index XXXXXXX..XXXXXXX 100644
63
+ uint64_t exec_src;
77
--- a/target/riscv/vector_helper.c
64
+ int state;
78
+++ b/target/riscv/vector_helper.c
65
+};
79
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVF2, vfmax_vf_d, OP_UUU_D, H8, H8, float64_maxnum)
80
GEN_VEXT_VF(vfmax_vf_h, 2, 2, clearh)
81
GEN_VEXT_VF(vfmax_vf_w, 4, 4, clearl)
82
GEN_VEXT_VF(vfmax_vf_d, 8, 8, clearq)
66
+
83
+
67
+#define SIFIVE_PDMA_CHANS 4
84
+/* Vector Floating-Point Sign-Injection Instructions */
68
+#define SIFIVE_PDMA_IRQS (SIFIVE_PDMA_CHANS * 2)
85
+static uint16_t fsgnj16(uint16_t a, uint16_t b, float_status *s)
69
+#define SIFIVE_PDMA_REG_SIZE 0x100000
70
+#define SIFIVE_PDMA_CHAN_NO(reg) ((reg & (SIFIVE_PDMA_REG_SIZE - 1)) >> 12)
71
+
72
+typedef struct SiFivePDMAState {
73
+ SysBusDevice parent;
74
+ MemoryRegion iomem;
75
+ qemu_irq irq[SIFIVE_PDMA_IRQS];
76
+
77
+ struct sifive_pdma_chan chan[SIFIVE_PDMA_CHANS];
78
+} SiFivePDMAState;
79
+
80
+#define TYPE_SIFIVE_PDMA "sifive.pdma"
81
+
82
+#define SIFIVE_PDMA(obj) \
83
+ OBJECT_CHECK(SiFivePDMAState, (obj), TYPE_SIFIVE_PDMA)
84
+
85
+#endif /* SIFIVE_PDMA_H */
86
diff --git a/hw/dma/sifive_pdma.c b/hw/dma/sifive_pdma.c
87
new file mode 100644
88
index XXXXXXX..XXXXXXX
89
--- /dev/null
90
+++ b/hw/dma/sifive_pdma.c
91
@@ -XXX,XX +XXX,XX @@
92
+/*
93
+ * SiFive Platform DMA emulation
94
+ *
95
+ * Copyright (c) 2020 Wind River Systems, Inc.
96
+ *
97
+ * Author:
98
+ * Bin Meng <bin.meng@windriver.com>
99
+ *
100
+ * This program is free software; you can redistribute it and/or
101
+ * modify it under the terms of the GNU General Public License as
102
+ * published by the Free Software Foundation; either version 2 or
103
+ * (at your option) version 3 of the License.
104
+ *
105
+ * This program is distributed in the hope that it will be useful,
106
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
107
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
108
+ * GNU General Public License for more details.
109
+ *
110
+ * You should have received a copy of the GNU General Public License along
111
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
112
+ */
113
+
114
+#include "qemu/osdep.h"
115
+#include "qemu/bitops.h"
116
+#include "qemu/log.h"
117
+#include "qapi/error.h"
118
+#include "hw/hw.h"
119
+#include "hw/irq.h"
120
+#include "hw/qdev-properties.h"
121
+#include "hw/sysbus.h"
122
+#include "migration/vmstate.h"
123
+#include "sysemu/dma.h"
124
+#include "hw/dma/sifive_pdma.h"
125
+
126
+#define DMA_CONTROL 0x000
127
+#define CONTROL_CLAIM BIT(0)
128
+#define CONTROL_RUN BIT(1)
129
+#define CONTROL_DONE_IE BIT(14)
130
+#define CONTROL_ERR_IE BIT(15)
131
+#define CONTROL_DONE BIT(30)
132
+#define CONTROL_ERR BIT(31)
133
+
134
+#define DMA_NEXT_CONFIG 0x004
135
+#define CONFIG_REPEAT BIT(2)
136
+#define CONFIG_ORDER BIT(3)
137
+#define CONFIG_WRSZ_SHIFT 24
138
+#define CONFIG_RDSZ_SHIFT 28
139
+#define CONFIG_SZ_MASK 0xf
140
+
141
+#define DMA_NEXT_BYTES 0x008
142
+#define DMA_NEXT_DST 0x010
143
+#define DMA_NEXT_SRC 0x018
144
+#define DMA_EXEC_CONFIG 0x104
145
+#define DMA_EXEC_BYTES 0x108
146
+#define DMA_EXEC_DST 0x110
147
+#define DMA_EXEC_SRC 0x118
148
+
149
+enum dma_chan_state {
150
+ DMA_CHAN_STATE_IDLE,
151
+ DMA_CHAN_STATE_STARTED,
152
+ DMA_CHAN_STATE_ERROR,
153
+ DMA_CHAN_STATE_DONE
154
+};
155
+
156
+static void sifive_pdma_run(SiFivePDMAState *s, int ch)
157
+{
86
+{
158
+ uint64_t bytes = s->chan[ch].next_bytes;
87
+ return deposit64(b, 0, 15, a);
159
+ uint64_t dst = s->chan[ch].next_dst;
160
+ uint64_t src = s->chan[ch].next_src;
161
+ uint32_t config = s->chan[ch].next_config;
162
+ int wsize, rsize, size;
163
+ uint8_t buf[64];
164
+ int n;
165
+
166
+ /* do nothing if bytes to transfer is zero */
167
+ if (!bytes) {
168
+ goto error;
169
+ }
170
+
171
+ /*
172
+ * The manual does not describe how the hardware behaviors when
173
+ * config.wsize and config.rsize are given different values.
174
+ * A common case is memory to memory DMA, and in this case they
175
+ * are normally the same. Abort if this expectation fails.
176
+ */
177
+ wsize = (config >> CONFIG_WRSZ_SHIFT) & CONFIG_SZ_MASK;
178
+ rsize = (config >> CONFIG_RDSZ_SHIFT) & CONFIG_SZ_MASK;
179
+ if (wsize != rsize) {
180
+ goto error;
181
+ }
182
+
183
+ /*
184
+ * Calculate the transaction size
185
+ *
186
+ * size field is base 2 logarithm of DMA transaction size,
187
+ * but there is an upper limit of 64 bytes per transaction.
188
+ */
189
+ size = wsize;
190
+ if (size > 6) {
191
+ size = 6;
192
+ }
193
+ size = 1 << size;
194
+
195
+ /* the bytes to transfer should be multiple of transaction size */
196
+ if (bytes % size) {
197
+ goto error;
198
+ }
199
+
200
+ /* indicate a DMA transfer is started */
201
+ s->chan[ch].state = DMA_CHAN_STATE_STARTED;
202
+ s->chan[ch].control &= ~CONTROL_DONE;
203
+ s->chan[ch].control &= ~CONTROL_ERR;
204
+
205
+ /* load the next_ registers into their exec_ counterparts */
206
+ s->chan[ch].exec_config = config;
207
+ s->chan[ch].exec_bytes = bytes;
208
+ s->chan[ch].exec_dst = dst;
209
+ s->chan[ch].exec_src = src;
210
+
211
+ for (n = 0; n < bytes / size; n++) {
212
+ cpu_physical_memory_read(s->chan[ch].exec_src, buf, size);
213
+ cpu_physical_memory_write(s->chan[ch].exec_dst, buf, size);
214
+ s->chan[ch].exec_src += size;
215
+ s->chan[ch].exec_dst += size;
216
+ s->chan[ch].exec_bytes -= size;
217
+ }
218
+
219
+ /* indicate a DMA transfer is done */
220
+ s->chan[ch].state = DMA_CHAN_STATE_DONE;
221
+ s->chan[ch].control &= ~CONTROL_RUN;
222
+ s->chan[ch].control |= CONTROL_DONE;
223
+
224
+ /* reload exec_ registers if repeat is required */
225
+ if (s->chan[ch].next_config & CONFIG_REPEAT) {
226
+ s->chan[ch].exec_bytes = bytes;
227
+ s->chan[ch].exec_dst = dst;
228
+ s->chan[ch].exec_src = src;
229
+ }
230
+
231
+ return;
232
+
233
+error:
234
+ s->chan[ch].state = DMA_CHAN_STATE_ERROR;
235
+ s->chan[ch].control |= CONTROL_ERR;
236
+ return;
237
+}
88
+}
238
+
89
+
239
+static inline void sifive_pdma_update_irq(SiFivePDMAState *s, int ch)
90
+static uint32_t fsgnj32(uint32_t a, uint32_t b, float_status *s)
240
+{
91
+{
241
+ bool done_ie, err_ie;
92
+ return deposit64(b, 0, 31, a);
242
+
243
+ done_ie = !!(s->chan[ch].control & CONTROL_DONE_IE);
244
+ err_ie = !!(s->chan[ch].control & CONTROL_ERR_IE);
245
+
246
+ if (done_ie && (s->chan[ch].control & CONTROL_DONE)) {
247
+ qemu_irq_raise(s->irq[ch * 2]);
248
+ } else {
249
+ qemu_irq_lower(s->irq[ch * 2]);
250
+ }
251
+
252
+ if (err_ie && (s->chan[ch].control & CONTROL_ERR)) {
253
+ qemu_irq_raise(s->irq[ch * 2 + 1]);
254
+ } else {
255
+ qemu_irq_lower(s->irq[ch * 2 + 1]);
256
+ }
257
+
258
+ s->chan[ch].state = DMA_CHAN_STATE_IDLE;
259
+}
93
+}
260
+
94
+
261
+static uint64_t sifive_pdma_read(void *opaque, hwaddr offset, unsigned size)
95
+static uint64_t fsgnj64(uint64_t a, uint64_t b, float_status *s)
262
+{
96
+{
263
+ SiFivePDMAState *s = opaque;
97
+ return deposit64(b, 0, 63, a);
264
+ int ch = SIFIVE_PDMA_CHAN_NO(offset);
265
+ uint64_t val = 0;
266
+
267
+ if (ch >= SIFIVE_PDMA_CHANS) {
268
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Invalid channel no %d\n",
269
+ __func__, ch);
270
+ return 0;
271
+ }
272
+
273
+ offset &= 0xfff;
274
+ switch (offset) {
275
+ case DMA_CONTROL:
276
+ val = s->chan[ch].control;
277
+ break;
278
+ case DMA_NEXT_CONFIG:
279
+ val = s->chan[ch].next_config;
280
+ break;
281
+ case DMA_NEXT_BYTES:
282
+ val = s->chan[ch].next_bytes;
283
+ break;
284
+ case DMA_NEXT_DST:
285
+ val = s->chan[ch].next_dst;
286
+ break;
287
+ case DMA_NEXT_SRC:
288
+ val = s->chan[ch].next_src;
289
+ break;
290
+ case DMA_EXEC_CONFIG:
291
+ val = s->chan[ch].exec_config;
292
+ break;
293
+ case DMA_EXEC_BYTES:
294
+ val = s->chan[ch].exec_bytes;
295
+ break;
296
+ case DMA_EXEC_DST:
297
+ val = s->chan[ch].exec_dst;
298
+ break;
299
+ case DMA_EXEC_SRC:
300
+ val = s->chan[ch].exec_src;
301
+ break;
302
+ default:
303
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIX "\n",
304
+ __func__, offset);
305
+ break;
306
+ }
307
+
308
+ return val;
309
+}
98
+}
310
+
99
+
311
+static void sifive_pdma_write(void *opaque, hwaddr offset,
100
+RVVCALL(OPFVV2, vfsgnj_vv_h, OP_UUU_H, H2, H2, H2, fsgnj16)
312
+ uint64_t value, unsigned size)
101
+RVVCALL(OPFVV2, vfsgnj_vv_w, OP_UUU_W, H4, H4, H4, fsgnj32)
102
+RVVCALL(OPFVV2, vfsgnj_vv_d, OP_UUU_D, H8, H8, H8, fsgnj64)
103
+GEN_VEXT_VV_ENV(vfsgnj_vv_h, 2, 2, clearh)
104
+GEN_VEXT_VV_ENV(vfsgnj_vv_w, 4, 4, clearl)
105
+GEN_VEXT_VV_ENV(vfsgnj_vv_d, 8, 8, clearq)
106
+RVVCALL(OPFVF2, vfsgnj_vf_h, OP_UUU_H, H2, H2, fsgnj16)
107
+RVVCALL(OPFVF2, vfsgnj_vf_w, OP_UUU_W, H4, H4, fsgnj32)
108
+RVVCALL(OPFVF2, vfsgnj_vf_d, OP_UUU_D, H8, H8, fsgnj64)
109
+GEN_VEXT_VF(vfsgnj_vf_h, 2, 2, clearh)
110
+GEN_VEXT_VF(vfsgnj_vf_w, 4, 4, clearl)
111
+GEN_VEXT_VF(vfsgnj_vf_d, 8, 8, clearq)
112
+
113
+static uint16_t fsgnjn16(uint16_t a, uint16_t b, float_status *s)
313
+{
114
+{
314
+ SiFivePDMAState *s = opaque;
115
+ return deposit64(~b, 0, 15, a);
315
+ int ch = SIFIVE_PDMA_CHAN_NO(offset);
316
+
317
+ if (ch >= SIFIVE_PDMA_CHANS) {
318
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Invalid channel no %d\n",
319
+ __func__, ch);
320
+ return;
321
+ }
322
+
323
+ offset &= 0xfff;
324
+ switch (offset) {
325
+ case DMA_CONTROL:
326
+ s->chan[ch].control = value;
327
+
328
+ if (value & CONTROL_RUN) {
329
+ sifive_pdma_run(s, ch);
330
+ }
331
+
332
+ sifive_pdma_update_irq(s, ch);
333
+ break;
334
+ case DMA_NEXT_CONFIG:
335
+ s->chan[ch].next_config = value;
336
+ break;
337
+ case DMA_NEXT_BYTES:
338
+ s->chan[ch].next_bytes = value;
339
+ break;
340
+ case DMA_NEXT_DST:
341
+ s->chan[ch].next_dst = value;
342
+ break;
343
+ case DMA_NEXT_SRC:
344
+ s->chan[ch].next_src = value;
345
+ break;
346
+ case DMA_EXEC_CONFIG:
347
+ case DMA_EXEC_BYTES:
348
+ case DMA_EXEC_DST:
349
+ case DMA_EXEC_SRC:
350
+ /* these are read-only registers */
351
+ break;
352
+ default:
353
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIX "\n",
354
+ __func__, offset);
355
+ break;
356
+ }
357
+}
116
+}
358
+
117
+
359
+static const MemoryRegionOps sifive_pdma_ops = {
118
+static uint32_t fsgnjn32(uint32_t a, uint32_t b, float_status *s)
360
+ .read = sifive_pdma_read,
361
+ .write = sifive_pdma_write,
362
+ .endianness = DEVICE_LITTLE_ENDIAN,
363
+ /* there are 32-bit and 64-bit wide registers */
364
+ .impl = {
365
+ .min_access_size = 4,
366
+ .max_access_size = 8,
367
+ }
368
+};
369
+
370
+static void sifive_pdma_realize(DeviceState *dev, Error **errp)
371
+{
119
+{
372
+ SiFivePDMAState *s = SIFIVE_PDMA(dev);
120
+ return deposit64(~b, 0, 31, a);
373
+ int i;
374
+
375
+ memory_region_init_io(&s->iomem, OBJECT(dev), &sifive_pdma_ops, s,
376
+ TYPE_SIFIVE_PDMA, SIFIVE_PDMA_REG_SIZE);
377
+ sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem);
378
+
379
+ for (i = 0; i < SIFIVE_PDMA_IRQS; i++) {
380
+ sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq[i]);
381
+ }
382
+}
121
+}
383
+
122
+
384
+static void sifive_pdma_class_init(ObjectClass *klass, void *data)
123
+static uint64_t fsgnjn64(uint64_t a, uint64_t b, float_status *s)
385
+{
124
+{
386
+ DeviceClass *dc = DEVICE_CLASS(klass);
125
+ return deposit64(~b, 0, 63, a);
387
+
388
+ dc->desc = "SiFive Platform DMA controller";
389
+ dc->realize = sifive_pdma_realize;
390
+}
126
+}
391
+
127
+
392
+static const TypeInfo sifive_pdma_info = {
128
+RVVCALL(OPFVV2, vfsgnjn_vv_h, OP_UUU_H, H2, H2, H2, fsgnjn16)
393
+ .name = TYPE_SIFIVE_PDMA,
129
+RVVCALL(OPFVV2, vfsgnjn_vv_w, OP_UUU_W, H4, H4, H4, fsgnjn32)
394
+ .parent = TYPE_SYS_BUS_DEVICE,
130
+RVVCALL(OPFVV2, vfsgnjn_vv_d, OP_UUU_D, H8, H8, H8, fsgnjn64)
395
+ .instance_size = sizeof(SiFivePDMAState),
131
+GEN_VEXT_VV_ENV(vfsgnjn_vv_h, 2, 2, clearh)
396
+ .class_init = sifive_pdma_class_init,
132
+GEN_VEXT_VV_ENV(vfsgnjn_vv_w, 4, 4, clearl)
397
+};
133
+GEN_VEXT_VV_ENV(vfsgnjn_vv_d, 8, 8, clearq)
134
+RVVCALL(OPFVF2, vfsgnjn_vf_h, OP_UUU_H, H2, H2, fsgnjn16)
135
+RVVCALL(OPFVF2, vfsgnjn_vf_w, OP_UUU_W, H4, H4, fsgnjn32)
136
+RVVCALL(OPFVF2, vfsgnjn_vf_d, OP_UUU_D, H8, H8, fsgnjn64)
137
+GEN_VEXT_VF(vfsgnjn_vf_h, 2, 2, clearh)
138
+GEN_VEXT_VF(vfsgnjn_vf_w, 4, 4, clearl)
139
+GEN_VEXT_VF(vfsgnjn_vf_d, 8, 8, clearq)
398
+
140
+
399
+static void sifive_pdma_register_types(void)
141
+static uint16_t fsgnjx16(uint16_t a, uint16_t b, float_status *s)
400
+{
142
+{
401
+ type_register_static(&sifive_pdma_info);
143
+ return deposit64(b ^ a, 0, 15, a);
402
+}
144
+}
403
+
145
+
404
+type_init(sifive_pdma_register_types)
146
+static uint32_t fsgnjx32(uint32_t a, uint32_t b, float_status *s)
405
diff --git a/hw/dma/Kconfig b/hw/dma/Kconfig
147
+{
406
index XXXXXXX..XXXXXXX 100644
148
+ return deposit64(b ^ a, 0, 31, a);
407
--- a/hw/dma/Kconfig
149
+}
408
+++ b/hw/dma/Kconfig
409
@@ -XXX,XX +XXX,XX @@ config ZYNQ_DEVCFG
410
411
config STP2000
412
bool
413
+
150
+
414
+config SIFIVE_PDMA
151
+static uint64_t fsgnjx64(uint64_t a, uint64_t b, float_status *s)
415
+ bool
152
+{
416
diff --git a/hw/dma/meson.build b/hw/dma/meson.build
153
+ return deposit64(b ^ a, 0, 63, a);
417
index XXXXXXX..XXXXXXX 100644
154
+}
418
--- a/hw/dma/meson.build
155
+
419
+++ b/hw/dma/meson.build
156
+RVVCALL(OPFVV2, vfsgnjx_vv_h, OP_UUU_H, H2, H2, H2, fsgnjx16)
420
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_XLNX_ZYNQMP_ARM', if_true: files('xlnx-zdma.c'))
157
+RVVCALL(OPFVV2, vfsgnjx_vv_w, OP_UUU_W, H4, H4, H4, fsgnjx32)
421
softmmu_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_dma.c', 'soc_dma.c'))
158
+RVVCALL(OPFVV2, vfsgnjx_vv_d, OP_UUU_D, H8, H8, H8, fsgnjx64)
422
softmmu_ss.add(when: 'CONFIG_PXA2XX', if_true: files('pxa2xx_dma.c'))
159
+GEN_VEXT_VV_ENV(vfsgnjx_vv_h, 2, 2, clearh)
423
softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_dma.c'))
160
+GEN_VEXT_VV_ENV(vfsgnjx_vv_w, 4, 4, clearl)
424
+softmmu_ss.add(when: 'CONFIG_SIFIVE_PDMA', if_true: files('sifive_pdma.c'))
161
+GEN_VEXT_VV_ENV(vfsgnjx_vv_d, 8, 8, clearq)
162
+RVVCALL(OPFVF2, vfsgnjx_vf_h, OP_UUU_H, H2, H2, fsgnjx16)
163
+RVVCALL(OPFVF2, vfsgnjx_vf_w, OP_UUU_W, H4, H4, fsgnjx32)
164
+RVVCALL(OPFVF2, vfsgnjx_vf_d, OP_UUU_D, H8, H8, fsgnjx64)
165
+GEN_VEXT_VF(vfsgnjx_vf_h, 2, 2, clearh)
166
+GEN_VEXT_VF(vfsgnjx_vf_w, 4, 4, clearl)
167
+GEN_VEXT_VF(vfsgnjx_vf_d, 8, 8, clearq)
425
--
168
--
426
2.28.0
169
2.27.0
427
170
428
171
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-Id: <20200701152549.1218-40-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 37 +++++
10
target/riscv/insn32.decode | 12 ++
11
target/riscv/insn_trans/trans_rvv.inc.c | 35 +++++
12
target/riscv/vector_helper.c | 174 ++++++++++++++++++++++++
13
4 files changed, 258 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vfsgnjn_vf_d, void, ptr, ptr, i64, ptr, env, i32)
20
DEF_HELPER_6(vfsgnjx_vf_h, void, ptr, ptr, i64, ptr, env, i32)
21
DEF_HELPER_6(vfsgnjx_vf_w, void, ptr, ptr, i64, ptr, env, i32)
22
DEF_HELPER_6(vfsgnjx_vf_d, void, ptr, ptr, i64, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vmfeq_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vmfeq_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vmfeq_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vmfne_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vmfne_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vmfne_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vmflt_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vmflt_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vmflt_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vmfle_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vmfle_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vmfle_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vmfeq_vf_h, void, ptr, ptr, i64, ptr, env, i32)
37
+DEF_HELPER_6(vmfeq_vf_w, void, ptr, ptr, i64, ptr, env, i32)
38
+DEF_HELPER_6(vmfeq_vf_d, void, ptr, ptr, i64, ptr, env, i32)
39
+DEF_HELPER_6(vmfne_vf_h, void, ptr, ptr, i64, ptr, env, i32)
40
+DEF_HELPER_6(vmfne_vf_w, void, ptr, ptr, i64, ptr, env, i32)
41
+DEF_HELPER_6(vmfne_vf_d, void, ptr, ptr, i64, ptr, env, i32)
42
+DEF_HELPER_6(vmflt_vf_h, void, ptr, ptr, i64, ptr, env, i32)
43
+DEF_HELPER_6(vmflt_vf_w, void, ptr, ptr, i64, ptr, env, i32)
44
+DEF_HELPER_6(vmflt_vf_d, void, ptr, ptr, i64, ptr, env, i32)
45
+DEF_HELPER_6(vmfle_vf_h, void, ptr, ptr, i64, ptr, env, i32)
46
+DEF_HELPER_6(vmfle_vf_w, void, ptr, ptr, i64, ptr, env, i32)
47
+DEF_HELPER_6(vmfle_vf_d, void, ptr, ptr, i64, ptr, env, i32)
48
+DEF_HELPER_6(vmfgt_vf_h, void, ptr, ptr, i64, ptr, env, i32)
49
+DEF_HELPER_6(vmfgt_vf_w, void, ptr, ptr, i64, ptr, env, i32)
50
+DEF_HELPER_6(vmfgt_vf_d, void, ptr, ptr, i64, ptr, env, i32)
51
+DEF_HELPER_6(vmfge_vf_h, void, ptr, ptr, i64, ptr, env, i32)
52
+DEF_HELPER_6(vmfge_vf_w, void, ptr, ptr, i64, ptr, env, i32)
53
+DEF_HELPER_6(vmfge_vf_d, void, ptr, ptr, i64, ptr, env, i32)
54
+DEF_HELPER_6(vmford_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
55
+DEF_HELPER_6(vmford_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
56
+DEF_HELPER_6(vmford_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
57
+DEF_HELPER_6(vmford_vf_h, void, ptr, ptr, i64, ptr, env, i32)
58
+DEF_HELPER_6(vmford_vf_w, void, ptr, ptr, i64, ptr, env, i32)
59
+DEF_HELPER_6(vmford_vf_d, void, ptr, ptr, i64, ptr, env, i32)
60
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
61
index XXXXXXX..XXXXXXX 100644
62
--- a/target/riscv/insn32.decode
63
+++ b/target/riscv/insn32.decode
64
@@ -XXX,XX +XXX,XX @@ vfsgnjn_vv 001001 . ..... ..... 001 ..... 1010111 @r_vm
65
vfsgnjn_vf 001001 . ..... ..... 101 ..... 1010111 @r_vm
66
vfsgnjx_vv 001010 . ..... ..... 001 ..... 1010111 @r_vm
67
vfsgnjx_vf 001010 . ..... ..... 101 ..... 1010111 @r_vm
68
+vmfeq_vv 011000 . ..... ..... 001 ..... 1010111 @r_vm
69
+vmfeq_vf 011000 . ..... ..... 101 ..... 1010111 @r_vm
70
+vmfne_vv 011100 . ..... ..... 001 ..... 1010111 @r_vm
71
+vmfne_vf 011100 . ..... ..... 101 ..... 1010111 @r_vm
72
+vmflt_vv 011011 . ..... ..... 001 ..... 1010111 @r_vm
73
+vmflt_vf 011011 . ..... ..... 101 ..... 1010111 @r_vm
74
+vmfle_vv 011001 . ..... ..... 001 ..... 1010111 @r_vm
75
+vmfle_vf 011001 . ..... ..... 101 ..... 1010111 @r_vm
76
+vmfgt_vf 011101 . ..... ..... 101 ..... 1010111 @r_vm
77
+vmfge_vf 011111 . ..... ..... 101 ..... 1010111 @r_vm
78
+vmford_vv 011010 . ..... ..... 001 ..... 1010111 @r_vm
79
+vmford_vf 011010 . ..... ..... 101 ..... 1010111 @r_vm
80
81
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
82
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
83
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
84
index XXXXXXX..XXXXXXX 100644
85
--- a/target/riscv/insn_trans/trans_rvv.inc.c
86
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
87
@@ -XXX,XX +XXX,XX @@ GEN_OPFVV_TRANS(vfsgnjx_vv, opfvv_check)
88
GEN_OPFVF_TRANS(vfsgnj_vf, opfvf_check)
89
GEN_OPFVF_TRANS(vfsgnjn_vf, opfvf_check)
90
GEN_OPFVF_TRANS(vfsgnjx_vf, opfvf_check)
91
+
92
+/* Vector Floating-Point Compare Instructions */
93
+static bool opfvv_cmp_check(DisasContext *s, arg_rmrr *a)
94
+{
95
+ return (vext_check_isa_ill(s) &&
96
+ vext_check_reg(s, a->rs2, false) &&
97
+ vext_check_reg(s, a->rs1, false) &&
98
+ (s->sew != 0) &&
99
+ ((vext_check_overlap_group(a->rd, 1, a->rs1, 1 << s->lmul) &&
100
+ vext_check_overlap_group(a->rd, 1, a->rs2, 1 << s->lmul)) ||
101
+ (s->lmul == 0)));
102
+}
103
+
104
+GEN_OPFVV_TRANS(vmfeq_vv, opfvv_cmp_check)
105
+GEN_OPFVV_TRANS(vmfne_vv, opfvv_cmp_check)
106
+GEN_OPFVV_TRANS(vmflt_vv, opfvv_cmp_check)
107
+GEN_OPFVV_TRANS(vmfle_vv, opfvv_cmp_check)
108
+GEN_OPFVV_TRANS(vmford_vv, opfvv_cmp_check)
109
+
110
+static bool opfvf_cmp_check(DisasContext *s, arg_rmrr *a)
111
+{
112
+ return (vext_check_isa_ill(s) &&
113
+ vext_check_reg(s, a->rs2, false) &&
114
+ (s->sew != 0) &&
115
+ (vext_check_overlap_group(a->rd, 1, a->rs2, 1 << s->lmul) ||
116
+ (s->lmul == 0)));
117
+}
118
+
119
+GEN_OPFVF_TRANS(vmfeq_vf, opfvf_cmp_check)
120
+GEN_OPFVF_TRANS(vmfne_vf, opfvf_cmp_check)
121
+GEN_OPFVF_TRANS(vmflt_vf, opfvf_cmp_check)
122
+GEN_OPFVF_TRANS(vmfle_vf, opfvf_cmp_check)
123
+GEN_OPFVF_TRANS(vmfgt_vf, opfvf_cmp_check)
124
+GEN_OPFVF_TRANS(vmfge_vf, opfvf_cmp_check)
125
+GEN_OPFVF_TRANS(vmford_vf, opfvf_cmp_check)
126
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
127
index XXXXXXX..XXXXXXX 100644
128
--- a/target/riscv/vector_helper.c
129
+++ b/target/riscv/vector_helper.c
130
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVF2, vfsgnjx_vf_d, OP_UUU_D, H8, H8, fsgnjx64)
131
GEN_VEXT_VF(vfsgnjx_vf_h, 2, 2, clearh)
132
GEN_VEXT_VF(vfsgnjx_vf_w, 4, 4, clearl)
133
GEN_VEXT_VF(vfsgnjx_vf_d, 8, 8, clearq)
134
+
135
+/* Vector Floating-Point Compare Instructions */
136
+#define GEN_VEXT_CMP_VV_ENV(NAME, ETYPE, H, DO_OP) \
137
+void HELPER(NAME)(void *vd, void *v0, void *vs1, void *vs2, \
138
+ CPURISCVState *env, uint32_t desc) \
139
+{ \
140
+ uint32_t mlen = vext_mlen(desc); \
141
+ uint32_t vm = vext_vm(desc); \
142
+ uint32_t vl = env->vl; \
143
+ uint32_t vlmax = vext_maxsz(desc) / sizeof(ETYPE); \
144
+ uint32_t i; \
145
+ \
146
+ for (i = 0; i < vl; i++) { \
147
+ ETYPE s1 = *((ETYPE *)vs1 + H(i)); \
148
+ ETYPE s2 = *((ETYPE *)vs2 + H(i)); \
149
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
150
+ continue; \
151
+ } \
152
+ vext_set_elem_mask(vd, mlen, i, \
153
+ DO_OP(s2, s1, &env->fp_status)); \
154
+ } \
155
+ for (; i < vlmax; i++) { \
156
+ vext_set_elem_mask(vd, mlen, i, 0); \
157
+ } \
158
+}
159
+
160
+static bool float16_eq_quiet(uint16_t a, uint16_t b, float_status *s)
161
+{
162
+ FloatRelation compare = float16_compare_quiet(a, b, s);
163
+ return compare == float_relation_equal;
164
+}
165
+
166
+GEN_VEXT_CMP_VV_ENV(vmfeq_vv_h, uint16_t, H2, float16_eq_quiet)
167
+GEN_VEXT_CMP_VV_ENV(vmfeq_vv_w, uint32_t, H4, float32_eq_quiet)
168
+GEN_VEXT_CMP_VV_ENV(vmfeq_vv_d, uint64_t, H8, float64_eq_quiet)
169
+
170
+#define GEN_VEXT_CMP_VF(NAME, ETYPE, H, DO_OP) \
171
+void HELPER(NAME)(void *vd, void *v0, uint64_t s1, void *vs2, \
172
+ CPURISCVState *env, uint32_t desc) \
173
+{ \
174
+ uint32_t mlen = vext_mlen(desc); \
175
+ uint32_t vm = vext_vm(desc); \
176
+ uint32_t vl = env->vl; \
177
+ uint32_t vlmax = vext_maxsz(desc) / sizeof(ETYPE); \
178
+ uint32_t i; \
179
+ \
180
+ for (i = 0; i < vl; i++) { \
181
+ ETYPE s2 = *((ETYPE *)vs2 + H(i)); \
182
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
183
+ continue; \
184
+ } \
185
+ vext_set_elem_mask(vd, mlen, i, \
186
+ DO_OP(s2, (ETYPE)s1, &env->fp_status)); \
187
+ } \
188
+ for (; i < vlmax; i++) { \
189
+ vext_set_elem_mask(vd, mlen, i, 0); \
190
+ } \
191
+}
192
+
193
+GEN_VEXT_CMP_VF(vmfeq_vf_h, uint16_t, H2, float16_eq_quiet)
194
+GEN_VEXT_CMP_VF(vmfeq_vf_w, uint32_t, H4, float32_eq_quiet)
195
+GEN_VEXT_CMP_VF(vmfeq_vf_d, uint64_t, H8, float64_eq_quiet)
196
+
197
+static bool vmfne16(uint16_t a, uint16_t b, float_status *s)
198
+{
199
+ FloatRelation compare = float16_compare_quiet(a, b, s);
200
+ return compare != float_relation_equal;
201
+}
202
+
203
+static bool vmfne32(uint32_t a, uint32_t b, float_status *s)
204
+{
205
+ FloatRelation compare = float32_compare_quiet(a, b, s);
206
+ return compare != float_relation_equal;
207
+}
208
+
209
+static bool vmfne64(uint64_t a, uint64_t b, float_status *s)
210
+{
211
+ FloatRelation compare = float64_compare_quiet(a, b, s);
212
+ return compare != float_relation_equal;
213
+}
214
+
215
+GEN_VEXT_CMP_VV_ENV(vmfne_vv_h, uint16_t, H2, vmfne16)
216
+GEN_VEXT_CMP_VV_ENV(vmfne_vv_w, uint32_t, H4, vmfne32)
217
+GEN_VEXT_CMP_VV_ENV(vmfne_vv_d, uint64_t, H8, vmfne64)
218
+GEN_VEXT_CMP_VF(vmfne_vf_h, uint16_t, H2, vmfne16)
219
+GEN_VEXT_CMP_VF(vmfne_vf_w, uint32_t, H4, vmfne32)
220
+GEN_VEXT_CMP_VF(vmfne_vf_d, uint64_t, H8, vmfne64)
221
+
222
+static bool float16_lt(uint16_t a, uint16_t b, float_status *s)
223
+{
224
+ FloatRelation compare = float16_compare(a, b, s);
225
+ return compare == float_relation_less;
226
+}
227
+
228
+GEN_VEXT_CMP_VV_ENV(vmflt_vv_h, uint16_t, H2, float16_lt)
229
+GEN_VEXT_CMP_VV_ENV(vmflt_vv_w, uint32_t, H4, float32_lt)
230
+GEN_VEXT_CMP_VV_ENV(vmflt_vv_d, uint64_t, H8, float64_lt)
231
+GEN_VEXT_CMP_VF(vmflt_vf_h, uint16_t, H2, float16_lt)
232
+GEN_VEXT_CMP_VF(vmflt_vf_w, uint32_t, H4, float32_lt)
233
+GEN_VEXT_CMP_VF(vmflt_vf_d, uint64_t, H8, float64_lt)
234
+
235
+static bool float16_le(uint16_t a, uint16_t b, float_status *s)
236
+{
237
+ FloatRelation compare = float16_compare(a, b, s);
238
+ return compare == float_relation_less ||
239
+ compare == float_relation_equal;
240
+}
241
+
242
+GEN_VEXT_CMP_VV_ENV(vmfle_vv_h, uint16_t, H2, float16_le)
243
+GEN_VEXT_CMP_VV_ENV(vmfle_vv_w, uint32_t, H4, float32_le)
244
+GEN_VEXT_CMP_VV_ENV(vmfle_vv_d, uint64_t, H8, float64_le)
245
+GEN_VEXT_CMP_VF(vmfle_vf_h, uint16_t, H2, float16_le)
246
+GEN_VEXT_CMP_VF(vmfle_vf_w, uint32_t, H4, float32_le)
247
+GEN_VEXT_CMP_VF(vmfle_vf_d, uint64_t, H8, float64_le)
248
+
249
+static bool vmfgt16(uint16_t a, uint16_t b, float_status *s)
250
+{
251
+ FloatRelation compare = float16_compare(a, b, s);
252
+ return compare == float_relation_greater;
253
+}
254
+
255
+static bool vmfgt32(uint32_t a, uint32_t b, float_status *s)
256
+{
257
+ FloatRelation compare = float32_compare(a, b, s);
258
+ return compare == float_relation_greater;
259
+}
260
+
261
+static bool vmfgt64(uint64_t a, uint64_t b, float_status *s)
262
+{
263
+ FloatRelation compare = float64_compare(a, b, s);
264
+ return compare == float_relation_greater;
265
+}
266
+
267
+GEN_VEXT_CMP_VF(vmfgt_vf_h, uint16_t, H2, vmfgt16)
268
+GEN_VEXT_CMP_VF(vmfgt_vf_w, uint32_t, H4, vmfgt32)
269
+GEN_VEXT_CMP_VF(vmfgt_vf_d, uint64_t, H8, vmfgt64)
270
+
271
+static bool vmfge16(uint16_t a, uint16_t b, float_status *s)
272
+{
273
+ FloatRelation compare = float16_compare(a, b, s);
274
+ return compare == float_relation_greater ||
275
+ compare == float_relation_equal;
276
+}
277
+
278
+static bool vmfge32(uint32_t a, uint32_t b, float_status *s)
279
+{
280
+ FloatRelation compare = float32_compare(a, b, s);
281
+ return compare == float_relation_greater ||
282
+ compare == float_relation_equal;
283
+}
284
+
285
+static bool vmfge64(uint64_t a, uint64_t b, float_status *s)
286
+{
287
+ FloatRelation compare = float64_compare(a, b, s);
288
+ return compare == float_relation_greater ||
289
+ compare == float_relation_equal;
290
+}
291
+
292
+GEN_VEXT_CMP_VF(vmfge_vf_h, uint16_t, H2, vmfge16)
293
+GEN_VEXT_CMP_VF(vmfge_vf_w, uint32_t, H4, vmfge32)
294
+GEN_VEXT_CMP_VF(vmfge_vf_d, uint64_t, H8, vmfge64)
295
+
296
+static bool float16_unordered_quiet(uint16_t a, uint16_t b, float_status *s)
297
+{
298
+ FloatRelation compare = float16_compare_quiet(a, b, s);
299
+ return compare == float_relation_unordered;
300
+}
301
+
302
+GEN_VEXT_CMP_VV_ENV(vmford_vv_h, uint16_t, H2, !float16_unordered_quiet)
303
+GEN_VEXT_CMP_VV_ENV(vmford_vv_w, uint32_t, H4, !float32_unordered_quiet)
304
+GEN_VEXT_CMP_VV_ENV(vmford_vv_d, uint64_t, H8, !float64_unordered_quiet)
305
+GEN_VEXT_CMP_VF(vmford_vf_h, uint16_t, H2, !float16_unordered_quiet)
306
+GEN_VEXT_CMP_VF(vmford_vf_w, uint32_t, H4, !float32_unordered_quiet)
307
+GEN_VEXT_CMP_VF(vmford_vf_d, uint64_t, H8, !float64_unordered_quiet)
308
--
309
2.27.0
310
311
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
6
Message-Id: <20200701152549.1218-41-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 4 ++
10
target/riscv/internals.h | 5 ++
11
target/riscv/insn32.decode | 1 +
12
target/riscv/fpu_helper.c | 33 +--------
13
target/riscv/insn_trans/trans_rvv.inc.c | 3 +
14
target/riscv/vector_helper.c | 91 +++++++++++++++++++++++++
15
6 files changed, 107 insertions(+), 30 deletions(-)
16
17
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/riscv/helper.h
20
+++ b/target/riscv/helper.h
21
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vmford_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
22
DEF_HELPER_6(vmford_vf_h, void, ptr, ptr, i64, ptr, env, i32)
23
DEF_HELPER_6(vmford_vf_w, void, ptr, ptr, i64, ptr, env, i32)
24
DEF_HELPER_6(vmford_vf_d, void, ptr, ptr, i64, ptr, env, i32)
25
+
26
+DEF_HELPER_5(vfclass_v_h, void, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_5(vfclass_v_w, void, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_5(vfclass_v_d, void, ptr, ptr, ptr, env, i32)
29
diff --git a/target/riscv/internals.h b/target/riscv/internals.h
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/riscv/internals.h
32
+++ b/target/riscv/internals.h
33
@@ -XXX,XX +XXX,XX @@ FIELD(VDATA, VM, 8, 1)
34
FIELD(VDATA, LMUL, 9, 2)
35
FIELD(VDATA, NF, 11, 4)
36
FIELD(VDATA, WD, 11, 1)
37
+
38
+/* float point classify helpers */
39
+target_ulong fclass_h(uint64_t frs1);
40
+target_ulong fclass_s(uint64_t frs1);
41
+target_ulong fclass_d(uint64_t frs1);
42
#endif
43
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
44
index XXXXXXX..XXXXXXX 100644
45
--- a/target/riscv/insn32.decode
46
+++ b/target/riscv/insn32.decode
47
@@ -XXX,XX +XXX,XX @@ vmfgt_vf 011101 . ..... ..... 101 ..... 1010111 @r_vm
48
vmfge_vf 011111 . ..... ..... 101 ..... 1010111 @r_vm
49
vmford_vv 011010 . ..... ..... 001 ..... 1010111 @r_vm
50
vmford_vf 011010 . ..... ..... 101 ..... 1010111 @r_vm
51
+vfclass_v 100011 . ..... 10000 001 ..... 1010111 @r2_vm
52
53
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
54
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
55
diff --git a/target/riscv/fpu_helper.c b/target/riscv/fpu_helper.c
56
index XXXXXXX..XXXXXXX 100644
57
--- a/target/riscv/fpu_helper.c
58
+++ b/target/riscv/fpu_helper.c
59
@@ -XXX,XX +XXX,XX @@
60
#include "exec/exec-all.h"
61
#include "exec/helper-proto.h"
62
#include "fpu/softfloat.h"
63
+#include "internals.h"
64
65
target_ulong riscv_cpu_get_fflags(CPURISCVState *env)
66
{
67
@@ -XXX,XX +XXX,XX @@ uint64_t helper_fcvt_s_lu(CPURISCVState *env, uint64_t rs1)
68
69
target_ulong helper_fclass_s(uint64_t frs1)
70
{
71
- float32 f = frs1;
72
- bool sign = float32_is_neg(f);
73
-
74
- if (float32_is_infinity(f)) {
75
- return sign ? 1 << 0 : 1 << 7;
76
- } else if (float32_is_zero(f)) {
77
- return sign ? 1 << 3 : 1 << 4;
78
- } else if (float32_is_zero_or_denormal(f)) {
79
- return sign ? 1 << 2 : 1 << 5;
80
- } else if (float32_is_any_nan(f)) {
81
- float_status s = { }; /* for snan_bit_is_one */
82
- return float32_is_quiet_nan(f, &s) ? 1 << 9 : 1 << 8;
83
- } else {
84
- return sign ? 1 << 1 : 1 << 6;
85
- }
86
+ return fclass_s(frs1);
87
}
88
89
uint64_t helper_fadd_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
90
@@ -XXX,XX +XXX,XX @@ uint64_t helper_fcvt_d_lu(CPURISCVState *env, uint64_t rs1)
91
92
target_ulong helper_fclass_d(uint64_t frs1)
93
{
94
- float64 f = frs1;
95
- bool sign = float64_is_neg(f);
96
-
97
- if (float64_is_infinity(f)) {
98
- return sign ? 1 << 0 : 1 << 7;
99
- } else if (float64_is_zero(f)) {
100
- return sign ? 1 << 3 : 1 << 4;
101
- } else if (float64_is_zero_or_denormal(f)) {
102
- return sign ? 1 << 2 : 1 << 5;
103
- } else if (float64_is_any_nan(f)) {
104
- float_status s = { }; /* for snan_bit_is_one */
105
- return float64_is_quiet_nan(f, &s) ? 1 << 9 : 1 << 8;
106
- } else {
107
- return sign ? 1 << 1 : 1 << 6;
108
- }
109
+ return fclass_d(frs1);
110
}
111
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
112
index XXXXXXX..XXXXXXX 100644
113
--- a/target/riscv/insn_trans/trans_rvv.inc.c
114
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
115
@@ -XXX,XX +XXX,XX @@ GEN_OPFVF_TRANS(vmfle_vf, opfvf_cmp_check)
116
GEN_OPFVF_TRANS(vmfgt_vf, opfvf_cmp_check)
117
GEN_OPFVF_TRANS(vmfge_vf, opfvf_cmp_check)
118
GEN_OPFVF_TRANS(vmford_vf, opfvf_cmp_check)
119
+
120
+/* Vector Floating-Point Classify Instruction */
121
+GEN_OPFV_TRANS(vfclass_v, opfv_check)
122
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
123
index XXXXXXX..XXXXXXX 100644
124
--- a/target/riscv/vector_helper.c
125
+++ b/target/riscv/vector_helper.c
126
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_CMP_VV_ENV(vmford_vv_d, uint64_t, H8, !float64_unordered_quiet)
127
GEN_VEXT_CMP_VF(vmford_vf_h, uint16_t, H2, !float16_unordered_quiet)
128
GEN_VEXT_CMP_VF(vmford_vf_w, uint32_t, H4, !float32_unordered_quiet)
129
GEN_VEXT_CMP_VF(vmford_vf_d, uint64_t, H8, !float64_unordered_quiet)
130
+
131
+/* Vector Floating-Point Classify Instruction */
132
+#define OPIVV1(NAME, TD, T2, TX2, HD, HS2, OP) \
133
+static void do_##NAME(void *vd, void *vs2, int i) \
134
+{ \
135
+ TX2 s2 = *((T2 *)vs2 + HS2(i)); \
136
+ *((TD *)vd + HD(i)) = OP(s2); \
137
+}
138
+
139
+#define GEN_VEXT_V(NAME, ESZ, DSZ, CLEAR_FN) \
140
+void HELPER(NAME)(void *vd, void *v0, void *vs2, \
141
+ CPURISCVState *env, uint32_t desc) \
142
+{ \
143
+ uint32_t vlmax = vext_maxsz(desc) / ESZ; \
144
+ uint32_t mlen = vext_mlen(desc); \
145
+ uint32_t vm = vext_vm(desc); \
146
+ uint32_t vl = env->vl; \
147
+ uint32_t i; \
148
+ \
149
+ for (i = 0; i < vl; i++) { \
150
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
151
+ continue; \
152
+ } \
153
+ do_##NAME(vd, vs2, i); \
154
+ } \
155
+ CLEAR_FN(vd, vl, vl * DSZ, vlmax * DSZ); \
156
+}
157
+
158
+target_ulong fclass_h(uint64_t frs1)
159
+{
160
+ float16 f = frs1;
161
+ bool sign = float16_is_neg(f);
162
+
163
+ if (float16_is_infinity(f)) {
164
+ return sign ? 1 << 0 : 1 << 7;
165
+ } else if (float16_is_zero(f)) {
166
+ return sign ? 1 << 3 : 1 << 4;
167
+ } else if (float16_is_zero_or_denormal(f)) {
168
+ return sign ? 1 << 2 : 1 << 5;
169
+ } else if (float16_is_any_nan(f)) {
170
+ float_status s = { }; /* for snan_bit_is_one */
171
+ return float16_is_quiet_nan(f, &s) ? 1 << 9 : 1 << 8;
172
+ } else {
173
+ return sign ? 1 << 1 : 1 << 6;
174
+ }
175
+}
176
+
177
+target_ulong fclass_s(uint64_t frs1)
178
+{
179
+ float32 f = frs1;
180
+ bool sign = float32_is_neg(f);
181
+
182
+ if (float32_is_infinity(f)) {
183
+ return sign ? 1 << 0 : 1 << 7;
184
+ } else if (float32_is_zero(f)) {
185
+ return sign ? 1 << 3 : 1 << 4;
186
+ } else if (float32_is_zero_or_denormal(f)) {
187
+ return sign ? 1 << 2 : 1 << 5;
188
+ } else if (float32_is_any_nan(f)) {
189
+ float_status s = { }; /* for snan_bit_is_one */
190
+ return float32_is_quiet_nan(f, &s) ? 1 << 9 : 1 << 8;
191
+ } else {
192
+ return sign ? 1 << 1 : 1 << 6;
193
+ }
194
+}
195
+
196
+target_ulong fclass_d(uint64_t frs1)
197
+{
198
+ float64 f = frs1;
199
+ bool sign = float64_is_neg(f);
200
+
201
+ if (float64_is_infinity(f)) {
202
+ return sign ? 1 << 0 : 1 << 7;
203
+ } else if (float64_is_zero(f)) {
204
+ return sign ? 1 << 3 : 1 << 4;
205
+ } else if (float64_is_zero_or_denormal(f)) {
206
+ return sign ? 1 << 2 : 1 << 5;
207
+ } else if (float64_is_any_nan(f)) {
208
+ float_status s = { }; /* for snan_bit_is_one */
209
+ return float64_is_quiet_nan(f, &s) ? 1 << 9 : 1 << 8;
210
+ } else {
211
+ return sign ? 1 << 1 : 1 << 6;
212
+ }
213
+}
214
+
215
+RVVCALL(OPIVV1, vfclass_v_h, OP_UU_H, H2, H2, fclass_h)
216
+RVVCALL(OPIVV1, vfclass_v_w, OP_UU_W, H4, H4, fclass_s)
217
+RVVCALL(OPIVV1, vfclass_v_d, OP_UU_D, H8, H8, fclass_d)
218
+GEN_VEXT_V(vfclass_v_h, 2, 2, clearh)
219
+GEN_VEXT_V(vfclass_v_w, 4, 4, clearl)
220
+GEN_VEXT_V(vfclass_v_d, 8, 8, clearq)
221
--
222
2.27.0
223
224
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
1
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-Id: <20200701152549.1218-42-zhiwei_liu@c-sky.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
8
---
9
target/riscv/helper.h | 4 +++
10
target/riscv/insn32.decode | 2 ++
11
target/riscv/insn_trans/trans_rvv.inc.c | 38 +++++++++++++++++++++++++
12
target/riscv/vector_helper.c | 24 ++++++++++++++++
13
4 files changed, 68 insertions(+)
14
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/riscv/helper.h
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vmford_vf_d, void, ptr, ptr, i64, ptr, env, i32)
20
DEF_HELPER_5(vfclass_v_h, void, ptr, ptr, ptr, env, i32)
21
DEF_HELPER_5(vfclass_v_w, void, ptr, ptr, ptr, env, i32)
22
DEF_HELPER_5(vfclass_v_d, void, ptr, ptr, ptr, env, i32)
23
+
24
+DEF_HELPER_6(vfmerge_vfm_h, void, ptr, ptr, i64, ptr, env, i32)
25
+DEF_HELPER_6(vfmerge_vfm_w, void, ptr, ptr, i64, ptr, env, i32)
26
+DEF_HELPER_6(vfmerge_vfm_d, void, ptr, ptr, i64, ptr, env, i32)
27
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/riscv/insn32.decode
30
+++ b/target/riscv/insn32.decode
31
@@ -XXX,XX +XXX,XX @@ vmfge_vf 011111 . ..... ..... 101 ..... 1010111 @r_vm
32
vmford_vv 011010 . ..... ..... 001 ..... 1010111 @r_vm
33
vmford_vf 011010 . ..... ..... 101 ..... 1010111 @r_vm
34
vfclass_v 100011 . ..... 10000 001 ..... 1010111 @r2_vm
35
+vfmerge_vfm 010111 0 ..... ..... 101 ..... 1010111 @r_vm_0
36
+vfmv_v_f 010111 1 00000 ..... 101 ..... 1010111 @r2
37
38
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
39
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
40
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/riscv/insn_trans/trans_rvv.inc.c
43
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
44
@@ -XXX,XX +XXX,XX @@ GEN_OPFVF_TRANS(vmford_vf, opfvf_cmp_check)
45
46
/* Vector Floating-Point Classify Instruction */
47
GEN_OPFV_TRANS(vfclass_v, opfv_check)
48
+
49
+/* Vector Floating-Point Merge Instruction */
50
+GEN_OPFVF_TRANS(vfmerge_vfm, opfvf_check)
51
+
52
+static bool trans_vfmv_v_f(DisasContext *s, arg_vfmv_v_f *a)
53
+{
54
+ if (vext_check_isa_ill(s) &&
55
+ vext_check_reg(s, a->rd, false) &&
56
+ (s->sew != 0)) {
57
+
58
+ if (s->vl_eq_vlmax) {
59
+ tcg_gen_gvec_dup_i64(s->sew, vreg_ofs(s, a->rd),
60
+ MAXSZ(s), MAXSZ(s), cpu_fpr[a->rs1]);
61
+ } else {
62
+ TCGv_ptr dest;
63
+ TCGv_i32 desc;
64
+ uint32_t data = FIELD_DP32(0, VDATA, LMUL, s->lmul);
65
+ static gen_helper_vmv_vx * const fns[3] = {
66
+ gen_helper_vmv_v_x_h,
67
+ gen_helper_vmv_v_x_w,
68
+ gen_helper_vmv_v_x_d,
69
+ };
70
+ TCGLabel *over = gen_new_label();
71
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
72
+
73
+ dest = tcg_temp_new_ptr();
74
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
75
+ tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd));
76
+ fns[s->sew - 1](dest, cpu_fpr[a->rs1], cpu_env, desc);
77
+
78
+ tcg_temp_free_ptr(dest);
79
+ tcg_temp_free_i32(desc);
80
+ gen_set_label(over);
81
+ }
82
+ return true;
83
+ }
84
+ return false;
85
+}
86
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
87
index XXXXXXX..XXXXXXX 100644
88
--- a/target/riscv/vector_helper.c
89
+++ b/target/riscv/vector_helper.c
90
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPIVV1, vfclass_v_d, OP_UU_D, H8, H8, fclass_d)
91
GEN_VEXT_V(vfclass_v_h, 2, 2, clearh)
92
GEN_VEXT_V(vfclass_v_w, 4, 4, clearl)
93
GEN_VEXT_V(vfclass_v_d, 8, 8, clearq)
94
+
95
+/* Vector Floating-Point Merge Instruction */
96
+#define GEN_VFMERGE_VF(NAME, ETYPE, H, CLEAR_FN) \
97
+void HELPER(NAME)(void *vd, void *v0, uint64_t s1, void *vs2, \
98
+ CPURISCVState *env, uint32_t desc) \
99
+{ \
100
+ uint32_t mlen = vext_mlen(desc); \
101
+ uint32_t vm = vext_vm(desc); \
102
+ uint32_t vl = env->vl; \
103
+ uint32_t esz = sizeof(ETYPE); \
104
+ uint32_t vlmax = vext_maxsz(desc) / esz; \
105
+ uint32_t i; \
106
+ \
107
+ for (i = 0; i < vl; i++) { \
108
+ ETYPE s2 = *((ETYPE *)vs2 + H(i)); \
109
+ *((ETYPE *)vd + H(i)) \
110
+ = (!vm && !vext_elem_mask(v0, mlen, i) ? s2 : s1); \
111
+ } \
112
+ CLEAR_FN(vd, vl, vl * esz, vlmax * esz); \
113
+}
114
+
115
+GEN_VFMERGE_VF(vfmerge_vfm_h, int16_t, H2, clearh)
116
+GEN_VFMERGE_VF(vfmerge_vfm_w, int32_t, H4, clearl)
117
+GEN_VFMERGE_VF(vfmerge_vfm_d, int64_t, H8, clearq)
118
--
119
2.27.0
120
121
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
At present the Kconfig file is in disorder. Let's sort the options.
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Bin Meng <bin.meng@windriver.com>
6
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
7
Message-Id: <1599129623-68957-13-git-send-email-bmeng.cn@gmail.com>
6
Message-Id: <20200701152549.1218-43-zhiwei_liu@c-sky.com>
8
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
9
---
8
---
10
hw/riscv/Kconfig | 58 ++++++++++++++++++++++++------------------------
9
target/riscv/helper.h | 13 ++++++++++
11
1 file changed, 29 insertions(+), 29 deletions(-)
10
target/riscv/insn32.decode | 4 +++
11
target/riscv/insn_trans/trans_rvv.inc.c | 6 +++++
12
target/riscv/vector_helper.c | 33 +++++++++++++++++++++++++
13
4 files changed, 56 insertions(+)
12
14
13
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/riscv/Kconfig
17
--- a/target/riscv/helper.h
16
+++ b/hw/riscv/Kconfig
18
+++ b/target/riscv/helper.h
17
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_5(vfclass_v_d, void, ptr, ptr, ptr, env, i32)
18
config IBEX
20
DEF_HELPER_6(vfmerge_vfm_h, void, ptr, ptr, i64, ptr, env, i32)
19
bool
21
DEF_HELPER_6(vfmerge_vfm_w, void, ptr, ptr, i64, ptr, env, i32)
20
22
DEF_HELPER_6(vfmerge_vfm_d, void, ptr, ptr, i64, ptr, env, i32)
21
-config SIFIVE_E
22
- bool
23
- select MSI_NONBROKEN
24
- select SIFIVE_CLINT
25
- select SIFIVE_GPIO
26
- select SIFIVE_PLIC
27
- select SIFIVE_UART
28
- select SIFIVE_E_PRCI
29
- select UNIMP
30
-
31
-config SIFIVE_U
32
+config MICROCHIP_PFSOC
33
bool
34
- select CADENCE
35
+ select CADENCE_SDHCI
36
+ select MCHP_PFSOC_MMUART
37
select MSI_NONBROKEN
38
select SIFIVE_CLINT
39
- select SIFIVE_GPIO
40
select SIFIVE_PDMA
41
select SIFIVE_PLIC
42
- select SIFIVE_UART
43
- select SIFIVE_U_OTP
44
- select SIFIVE_U_PRCI
45
select UNIMP
46
47
-config SPIKE
48
- bool
49
- select HTIF
50
- select MSI_NONBROKEN
51
- select SIFIVE_CLINT
52
- select SIFIVE_PLIC
53
-
54
config OPENTITAN
55
bool
56
select IBEX
57
@@ -XXX,XX +XXX,XX @@ config RISCV_VIRT
58
bool
59
imply PCI_DEVICES
60
imply TEST_DEVICES
61
+ select GOLDFISH_RTC
62
select MSI_NONBROKEN
63
select PCI
64
- select SERIAL
65
- select GOLDFISH_RTC
66
- select VIRTIO_MMIO
67
select PCI_EXPRESS_GENERIC_BRIDGE
68
select PFLASH_CFI01
69
+ select SERIAL
70
select SIFIVE_CLINT
71
select SIFIVE_PLIC
72
select SIFIVE_TEST
73
+ select VIRTIO_MMIO
74
75
-config MICROCHIP_PFSOC
76
+config SIFIVE_E
77
bool
78
select MSI_NONBROKEN
79
select SIFIVE_CLINT
80
+ select SIFIVE_GPIO
81
+ select SIFIVE_PLIC
82
+ select SIFIVE_UART
83
+ select SIFIVE_E_PRCI
84
select UNIMP
85
- select MCHP_PFSOC_MMUART
86
+
23
+
87
+config SIFIVE_U
24
+DEF_HELPER_5(vfcvt_xu_f_v_h, void, ptr, ptr, ptr, env, i32)
88
+ bool
25
+DEF_HELPER_5(vfcvt_xu_f_v_w, void, ptr, ptr, ptr, env, i32)
89
+ select CADENCE
26
+DEF_HELPER_5(vfcvt_xu_f_v_d, void, ptr, ptr, ptr, env, i32)
90
+ select MSI_NONBROKEN
27
+DEF_HELPER_5(vfcvt_x_f_v_h, void, ptr, ptr, ptr, env, i32)
91
+ select SIFIVE_CLINT
28
+DEF_HELPER_5(vfcvt_x_f_v_w, void, ptr, ptr, ptr, env, i32)
92
+ select SIFIVE_GPIO
29
+DEF_HELPER_5(vfcvt_x_f_v_d, void, ptr, ptr, ptr, env, i32)
93
select SIFIVE_PDMA
30
+DEF_HELPER_5(vfcvt_f_xu_v_h, void, ptr, ptr, ptr, env, i32)
94
select SIFIVE_PLIC
31
+DEF_HELPER_5(vfcvt_f_xu_v_w, void, ptr, ptr, ptr, env, i32)
95
- select CADENCE_SDHCI
32
+DEF_HELPER_5(vfcvt_f_xu_v_d, void, ptr, ptr, ptr, env, i32)
96
+ select SIFIVE_UART
33
+DEF_HELPER_5(vfcvt_f_x_v_h, void, ptr, ptr, ptr, env, i32)
97
+ select SIFIVE_U_OTP
34
+DEF_HELPER_5(vfcvt_f_x_v_w, void, ptr, ptr, ptr, env, i32)
98
+ select SIFIVE_U_PRCI
35
+DEF_HELPER_5(vfcvt_f_x_v_d, void, ptr, ptr, ptr, env, i32)
99
+ select UNIMP
36
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/riscv/insn32.decode
39
+++ b/target/riscv/insn32.decode
40
@@ -XXX,XX +XXX,XX @@ vmford_vf 011010 . ..... ..... 101 ..... 1010111 @r_vm
41
vfclass_v 100011 . ..... 10000 001 ..... 1010111 @r2_vm
42
vfmerge_vfm 010111 0 ..... ..... 101 ..... 1010111 @r_vm_0
43
vfmv_v_f 010111 1 00000 ..... 101 ..... 1010111 @r2
44
+vfcvt_xu_f_v 100010 . ..... 00000 001 ..... 1010111 @r2_vm
45
+vfcvt_x_f_v 100010 . ..... 00001 001 ..... 1010111 @r2_vm
46
+vfcvt_f_xu_v 100010 . ..... 00010 001 ..... 1010111 @r2_vm
47
+vfcvt_f_x_v 100010 . ..... 00011 001 ..... 1010111 @r2_vm
48
49
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
50
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
51
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/target/riscv/insn_trans/trans_rvv.inc.c
54
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
55
@@ -XXX,XX +XXX,XX @@ static bool trans_vfmv_v_f(DisasContext *s, arg_vfmv_v_f *a)
56
}
57
return false;
58
}
100
+
59
+
101
+config SPIKE
60
+/* Single-Width Floating-Point/Integer Type-Convert Instructions */
102
+ bool
61
+GEN_OPFV_TRANS(vfcvt_xu_f_v, opfv_check)
103
+ select HTIF
62
+GEN_OPFV_TRANS(vfcvt_x_f_v, opfv_check)
104
+ select MSI_NONBROKEN
63
+GEN_OPFV_TRANS(vfcvt_f_xu_v, opfv_check)
105
+ select SIFIVE_CLINT
64
+GEN_OPFV_TRANS(vfcvt_f_x_v, opfv_check)
106
+ select SIFIVE_PLIC
65
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/target/riscv/vector_helper.c
68
+++ b/target/riscv/vector_helper.c
69
@@ -XXX,XX +XXX,XX @@ void HELPER(NAME)(void *vd, void *v0, uint64_t s1, void *vs2, \
70
GEN_VFMERGE_VF(vfmerge_vfm_h, int16_t, H2, clearh)
71
GEN_VFMERGE_VF(vfmerge_vfm_w, int32_t, H4, clearl)
72
GEN_VFMERGE_VF(vfmerge_vfm_d, int64_t, H8, clearq)
73
+
74
+/* Single-Width Floating-Point/Integer Type-Convert Instructions */
75
+/* vfcvt.xu.f.v vd, vs2, vm # Convert float to unsigned integer. */
76
+RVVCALL(OPFVV1, vfcvt_xu_f_v_h, OP_UU_H, H2, H2, float16_to_uint16)
77
+RVVCALL(OPFVV1, vfcvt_xu_f_v_w, OP_UU_W, H4, H4, float32_to_uint32)
78
+RVVCALL(OPFVV1, vfcvt_xu_f_v_d, OP_UU_D, H8, H8, float64_to_uint64)
79
+GEN_VEXT_V_ENV(vfcvt_xu_f_v_h, 2, 2, clearh)
80
+GEN_VEXT_V_ENV(vfcvt_xu_f_v_w, 4, 4, clearl)
81
+GEN_VEXT_V_ENV(vfcvt_xu_f_v_d, 8, 8, clearq)
82
+
83
+/* vfcvt.x.f.v vd, vs2, vm # Convert float to signed integer. */
84
+RVVCALL(OPFVV1, vfcvt_x_f_v_h, OP_UU_H, H2, H2, float16_to_int16)
85
+RVVCALL(OPFVV1, vfcvt_x_f_v_w, OP_UU_W, H4, H4, float32_to_int32)
86
+RVVCALL(OPFVV1, vfcvt_x_f_v_d, OP_UU_D, H8, H8, float64_to_int64)
87
+GEN_VEXT_V_ENV(vfcvt_x_f_v_h, 2, 2, clearh)
88
+GEN_VEXT_V_ENV(vfcvt_x_f_v_w, 4, 4, clearl)
89
+GEN_VEXT_V_ENV(vfcvt_x_f_v_d, 8, 8, clearq)
90
+
91
+/* vfcvt.f.xu.v vd, vs2, vm # Convert unsigned integer to float. */
92
+RVVCALL(OPFVV1, vfcvt_f_xu_v_h, OP_UU_H, H2, H2, uint16_to_float16)
93
+RVVCALL(OPFVV1, vfcvt_f_xu_v_w, OP_UU_W, H4, H4, uint32_to_float32)
94
+RVVCALL(OPFVV1, vfcvt_f_xu_v_d, OP_UU_D, H8, H8, uint64_to_float64)
95
+GEN_VEXT_V_ENV(vfcvt_f_xu_v_h, 2, 2, clearh)
96
+GEN_VEXT_V_ENV(vfcvt_f_xu_v_w, 4, 4, clearl)
97
+GEN_VEXT_V_ENV(vfcvt_f_xu_v_d, 8, 8, clearq)
98
+
99
+/* vfcvt.f.x.v vd, vs2, vm # Convert integer to float. */
100
+RVVCALL(OPFVV1, vfcvt_f_x_v_h, OP_UU_H, H2, H2, int16_to_float16)
101
+RVVCALL(OPFVV1, vfcvt_f_x_v_w, OP_UU_W, H4, H4, int32_to_float32)
102
+RVVCALL(OPFVV1, vfcvt_f_x_v_d, OP_UU_D, H8, H8, int64_to_float64)
103
+GEN_VEXT_V_ENV(vfcvt_f_x_v_h, 2, 2, clearh)
104
+GEN_VEXT_V_ENV(vfcvt_f_x_v_w, 4, 4, clearl)
105
+GEN_VEXT_V_ENV(vfcvt_f_x_v_d, 8, 8, clearq)
107
--
106
--
108
2.28.0
107
2.27.0
109
108
110
109
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
The name SIFIVE is too vague to convey the required component of
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
MSI_NONBROKEN. Let's drop the option, and select MSI_NONBROKEN in
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
each machine instead.
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1599129623-68957-12-git-send-email-bmeng.cn@gmail.com>
6
Message-Id: <20200701152549.1218-44-zhiwei_liu@c-sky.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
8
---
12
hw/riscv/Kconfig | 14 +++++---------
9
target/riscv/helper.h | 11 ++++++
13
1 file changed, 5 insertions(+), 9 deletions(-)
10
target/riscv/insn32.decode | 5 +++
11
target/riscv/insn_trans/trans_rvv.inc.c | 48 +++++++++++++++++++++++++
12
target/riscv/vector_helper.c | 42 ++++++++++++++++++++++
13
4 files changed, 106 insertions(+)
14
14
15
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/riscv/Kconfig
17
--- a/target/riscv/helper.h
18
+++ b/hw/riscv/Kconfig
18
+++ b/target/riscv/helper.h
19
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_5(vfcvt_f_xu_v_d, void, ptr, ptr, ptr, env, i32)
20
config IBEX
20
DEF_HELPER_5(vfcvt_f_x_v_h, void, ptr, ptr, ptr, env, i32)
21
bool
21
DEF_HELPER_5(vfcvt_f_x_v_w, void, ptr, ptr, ptr, env, i32)
22
22
DEF_HELPER_5(vfcvt_f_x_v_d, void, ptr, ptr, ptr, env, i32)
23
-config SIFIVE
23
+
24
- bool
24
+DEF_HELPER_5(vfwcvt_xu_f_v_h, void, ptr, ptr, ptr, env, i32)
25
- select MSI_NONBROKEN
25
+DEF_HELPER_5(vfwcvt_xu_f_v_w, void, ptr, ptr, ptr, env, i32)
26
-
26
+DEF_HELPER_5(vfwcvt_x_f_v_h, void, ptr, ptr, ptr, env, i32)
27
config SIFIVE_E
27
+DEF_HELPER_5(vfwcvt_x_f_v_w, void, ptr, ptr, ptr, env, i32)
28
bool
28
+DEF_HELPER_5(vfwcvt_f_xu_v_h, void, ptr, ptr, ptr, env, i32)
29
- select SIFIVE
29
+DEF_HELPER_5(vfwcvt_f_xu_v_w, void, ptr, ptr, ptr, env, i32)
30
+ select MSI_NONBROKEN
30
+DEF_HELPER_5(vfwcvt_f_x_v_h, void, ptr, ptr, ptr, env, i32)
31
select SIFIVE_CLINT
31
+DEF_HELPER_5(vfwcvt_f_x_v_w, void, ptr, ptr, ptr, env, i32)
32
select SIFIVE_GPIO
32
+DEF_HELPER_5(vfwcvt_f_f_v_h, void, ptr, ptr, ptr, env, i32)
33
select SIFIVE_PLIC
33
+DEF_HELPER_5(vfwcvt_f_f_v_w, void, ptr, ptr, ptr, env, i32)
34
@@ -XXX,XX +XXX,XX @@ config SIFIVE_E
34
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
35
config SIFIVE_U
35
index XXXXXXX..XXXXXXX 100644
36
bool
36
--- a/target/riscv/insn32.decode
37
select CADENCE
37
+++ b/target/riscv/insn32.decode
38
- select SIFIVE
38
@@ -XXX,XX +XXX,XX @@ vfcvt_xu_f_v 100010 . ..... 00000 001 ..... 1010111 @r2_vm
39
+ select MSI_NONBROKEN
39
vfcvt_x_f_v 100010 . ..... 00001 001 ..... 1010111 @r2_vm
40
select SIFIVE_CLINT
40
vfcvt_f_xu_v 100010 . ..... 00010 001 ..... 1010111 @r2_vm
41
select SIFIVE_GPIO
41
vfcvt_f_x_v 100010 . ..... 00011 001 ..... 1010111 @r2_vm
42
select SIFIVE_PDMA
42
+vfwcvt_xu_f_v 100010 . ..... 01000 001 ..... 1010111 @r2_vm
43
@@ -XXX,XX +XXX,XX @@ config SIFIVE_U
43
+vfwcvt_x_f_v 100010 . ..... 01001 001 ..... 1010111 @r2_vm
44
config SPIKE
44
+vfwcvt_f_xu_v 100010 . ..... 01010 001 ..... 1010111 @r2_vm
45
bool
45
+vfwcvt_f_x_v 100010 . ..... 01011 001 ..... 1010111 @r2_vm
46
select HTIF
46
+vfwcvt_f_f_v 100010 . ..... 01100 001 ..... 1010111 @r2_vm
47
- select SIFIVE
47
48
+ select MSI_NONBROKEN
48
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
49
select SIFIVE_CLINT
49
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
50
select SIFIVE_PLIC
50
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
51
51
index XXXXXXX..XXXXXXX 100644
52
@@ -XXX,XX +XXX,XX @@ config RISCV_VIRT
52
--- a/target/riscv/insn_trans/trans_rvv.inc.c
53
bool
53
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
54
imply PCI_DEVICES
54
@@ -XXX,XX +XXX,XX @@ GEN_OPFV_TRANS(vfcvt_xu_f_v, opfv_check)
55
imply TEST_DEVICES
55
GEN_OPFV_TRANS(vfcvt_x_f_v, opfv_check)
56
+ select MSI_NONBROKEN
56
GEN_OPFV_TRANS(vfcvt_f_xu_v, opfv_check)
57
select PCI
57
GEN_OPFV_TRANS(vfcvt_f_x_v, opfv_check)
58
select SERIAL
58
+
59
select GOLDFISH_RTC
59
+/* Widening Floating-Point/Integer Type-Convert Instructions */
60
select VIRTIO_MMIO
60
+
61
select PCI_EXPRESS_GENERIC_BRIDGE
61
+/*
62
select PFLASH_CFI01
62
+ * If the current SEW does not correspond to a supported IEEE floating-point
63
- select SIFIVE
63
+ * type, an illegal instruction exception is raised
64
select SIFIVE_CLINT
64
+ */
65
select SIFIVE_PLIC
65
+static bool opfv_widen_check(DisasContext *s, arg_rmr *a)
66
select SIFIVE_TEST
66
+{
67
67
+ return (vext_check_isa_ill(s) &&
68
config MICROCHIP_PFSOC
68
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
69
bool
69
+ vext_check_reg(s, a->rd, true) &&
70
- select SIFIVE
70
+ vext_check_reg(s, a->rs2, false) &&
71
+ select MSI_NONBROKEN
71
+ vext_check_overlap_group(a->rd, 2 << s->lmul, a->rs2,
72
select SIFIVE_CLINT
72
+ 1 << s->lmul) &&
73
select UNIMP
73
+ (s->lmul < 0x3) && (s->sew < 0x3) && (s->sew != 0));
74
select MCHP_PFSOC_MMUART
74
+}
75
+
76
+#define GEN_OPFV_WIDEN_TRANS(NAME) \
77
+static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
78
+{ \
79
+ if (opfv_widen_check(s, a)) { \
80
+ uint32_t data = 0; \
81
+ static gen_helper_gvec_3_ptr * const fns[2] = { \
82
+ gen_helper_##NAME##_h, \
83
+ gen_helper_##NAME##_w, \
84
+ }; \
85
+ TCGLabel *over = gen_new_label(); \
86
+ gen_set_rm(s, 7); \
87
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
88
+ \
89
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
90
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
91
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
92
+ tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
93
+ vreg_ofs(s, a->rs2), cpu_env, 0, \
94
+ s->vlen / 8, data, fns[s->sew - 1]); \
95
+ gen_set_label(over); \
96
+ return true; \
97
+ } \
98
+ return false; \
99
+}
100
+
101
+GEN_OPFV_WIDEN_TRANS(vfwcvt_xu_f_v)
102
+GEN_OPFV_WIDEN_TRANS(vfwcvt_x_f_v)
103
+GEN_OPFV_WIDEN_TRANS(vfwcvt_f_xu_v)
104
+GEN_OPFV_WIDEN_TRANS(vfwcvt_f_x_v)
105
+GEN_OPFV_WIDEN_TRANS(vfwcvt_f_f_v)
106
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/target/riscv/vector_helper.c
109
+++ b/target/riscv/vector_helper.c
110
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVV1, vfcvt_f_x_v_d, OP_UU_D, H8, H8, int64_to_float64)
111
GEN_VEXT_V_ENV(vfcvt_f_x_v_h, 2, 2, clearh)
112
GEN_VEXT_V_ENV(vfcvt_f_x_v_w, 4, 4, clearl)
113
GEN_VEXT_V_ENV(vfcvt_f_x_v_d, 8, 8, clearq)
114
+
115
+/* Widening Floating-Point/Integer Type-Convert Instructions */
116
+/* (TD, T2, TX2) */
117
+#define WOP_UU_H uint32_t, uint16_t, uint16_t
118
+#define WOP_UU_W uint64_t, uint32_t, uint32_t
119
+/* vfwcvt.xu.f.v vd, vs2, vm # Convert float to double-width unsigned integer.*/
120
+RVVCALL(OPFVV1, vfwcvt_xu_f_v_h, WOP_UU_H, H4, H2, float16_to_uint32)
121
+RVVCALL(OPFVV1, vfwcvt_xu_f_v_w, WOP_UU_W, H8, H4, float32_to_uint64)
122
+GEN_VEXT_V_ENV(vfwcvt_xu_f_v_h, 2, 4, clearl)
123
+GEN_VEXT_V_ENV(vfwcvt_xu_f_v_w, 4, 8, clearq)
124
+
125
+/* vfwcvt.x.f.v vd, vs2, vm # Convert float to double-width signed integer. */
126
+RVVCALL(OPFVV1, vfwcvt_x_f_v_h, WOP_UU_H, H4, H2, float16_to_int32)
127
+RVVCALL(OPFVV1, vfwcvt_x_f_v_w, WOP_UU_W, H8, H4, float32_to_int64)
128
+GEN_VEXT_V_ENV(vfwcvt_x_f_v_h, 2, 4, clearl)
129
+GEN_VEXT_V_ENV(vfwcvt_x_f_v_w, 4, 8, clearq)
130
+
131
+/* vfwcvt.f.xu.v vd, vs2, vm # Convert unsigned integer to double-width float */
132
+RVVCALL(OPFVV1, vfwcvt_f_xu_v_h, WOP_UU_H, H4, H2, uint16_to_float32)
133
+RVVCALL(OPFVV1, vfwcvt_f_xu_v_w, WOP_UU_W, H8, H4, uint32_to_float64)
134
+GEN_VEXT_V_ENV(vfwcvt_f_xu_v_h, 2, 4, clearl)
135
+GEN_VEXT_V_ENV(vfwcvt_f_xu_v_w, 4, 8, clearq)
136
+
137
+/* vfwcvt.f.x.v vd, vs2, vm # Convert integer to double-width float. */
138
+RVVCALL(OPFVV1, vfwcvt_f_x_v_h, WOP_UU_H, H4, H2, int16_to_float32)
139
+RVVCALL(OPFVV1, vfwcvt_f_x_v_w, WOP_UU_W, H8, H4, int32_to_float64)
140
+GEN_VEXT_V_ENV(vfwcvt_f_x_v_h, 2, 4, clearl)
141
+GEN_VEXT_V_ENV(vfwcvt_f_x_v_w, 4, 8, clearq)
142
+
143
+/*
144
+ * vfwcvt.f.f.v vd, vs2, vm #
145
+ * Convert single-width float to double-width float.
146
+ */
147
+static uint32_t vfwcvtffv16(uint16_t a, float_status *s)
148
+{
149
+ return float16_to_float32(a, true, s);
150
+}
151
+
152
+RVVCALL(OPFVV1, vfwcvt_f_f_v_h, WOP_UU_H, H4, H2, vfwcvtffv16)
153
+RVVCALL(OPFVV1, vfwcvt_f_f_v_w, WOP_UU_W, H8, H4, float32_to_float64)
154
+GEN_VEXT_V_ENV(vfwcvt_f_f_v_h, 2, 4, clearl)
155
+GEN_VEXT_V_ENV(vfwcvt_f_f_v_w, 4, 8, clearq)
75
--
156
--
76
2.28.0
157
2.27.0
77
158
78
159
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
Every RISC-V machine needs riscv_hart hence there is no need to
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
have a dedicated Kconfig option for it. Drop the Kconfig option
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
and always build riscv_hart.c.
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1599129623-68957-11-git-send-email-bmeng.cn@gmail.com>
6
Message-Id: <20200701152549.1218-45-zhiwei_liu@c-sky.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
8
---
12
hw/riscv/Kconfig | 9 ---------
9
target/riscv/helper.h | 11 ++++++
13
hw/riscv/meson.build | 2 +-
10
target/riscv/insn32.decode | 5 +++
14
2 files changed, 1 insertion(+), 10 deletions(-)
11
target/riscv/insn_trans/trans_rvv.inc.c | 48 +++++++++++++++++++++++++
12
target/riscv/vector_helper.c | 39 ++++++++++++++++++++
13
4 files changed, 103 insertions(+)
15
14
16
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/riscv/Kconfig
17
--- a/target/riscv/helper.h
19
+++ b/hw/riscv/Kconfig
18
+++ b/target/riscv/helper.h
20
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_5(vfwcvt_f_x_v_h, void, ptr, ptr, ptr, env, i32)
21
-config HART
20
DEF_HELPER_5(vfwcvt_f_x_v_w, void, ptr, ptr, ptr, env, i32)
22
- bool
21
DEF_HELPER_5(vfwcvt_f_f_v_h, void, ptr, ptr, ptr, env, i32)
23
-
22
DEF_HELPER_5(vfwcvt_f_f_v_w, void, ptr, ptr, ptr, env, i32)
24
config IBEX
23
+
25
bool
24
+DEF_HELPER_5(vfncvt_xu_f_v_h, void, ptr, ptr, ptr, env, i32)
26
25
+DEF_HELPER_5(vfncvt_xu_f_v_w, void, ptr, ptr, ptr, env, i32)
27
@@ -XXX,XX +XXX,XX @@ config SIFIVE
26
+DEF_HELPER_5(vfncvt_x_f_v_h, void, ptr, ptr, ptr, env, i32)
28
27
+DEF_HELPER_5(vfncvt_x_f_v_w, void, ptr, ptr, ptr, env, i32)
29
config SIFIVE_E
28
+DEF_HELPER_5(vfncvt_f_xu_v_h, void, ptr, ptr, ptr, env, i32)
30
bool
29
+DEF_HELPER_5(vfncvt_f_xu_v_w, void, ptr, ptr, ptr, env, i32)
31
- select HART
30
+DEF_HELPER_5(vfncvt_f_x_v_h, void, ptr, ptr, ptr, env, i32)
32
select SIFIVE
31
+DEF_HELPER_5(vfncvt_f_x_v_w, void, ptr, ptr, ptr, env, i32)
33
select SIFIVE_CLINT
32
+DEF_HELPER_5(vfncvt_f_f_v_h, void, ptr, ptr, ptr, env, i32)
34
select SIFIVE_GPIO
33
+DEF_HELPER_5(vfncvt_f_f_v_w, void, ptr, ptr, ptr, env, i32)
35
@@ -XXX,XX +XXX,XX @@ config SIFIVE_E
34
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
36
config SIFIVE_U
37
bool
38
select CADENCE
39
- select HART
40
select SIFIVE
41
select SIFIVE_CLINT
42
select SIFIVE_GPIO
43
@@ -XXX,XX +XXX,XX @@ config SIFIVE_U
44
45
config SPIKE
46
bool
47
- select HART
48
select HTIF
49
select SIFIVE
50
select SIFIVE_CLINT
51
@@ -XXX,XX +XXX,XX @@ config SPIKE
52
config OPENTITAN
53
bool
54
select IBEX
55
- select HART
56
select UNIMP
57
58
config RISCV_VIRT
59
@@ -XXX,XX +XXX,XX @@ config RISCV_VIRT
60
imply PCI_DEVICES
61
imply TEST_DEVICES
62
select PCI
63
- select HART
64
select SERIAL
65
select GOLDFISH_RTC
66
select VIRTIO_MMIO
67
@@ -XXX,XX +XXX,XX @@ config RISCV_VIRT
68
69
config MICROCHIP_PFSOC
70
bool
71
- select HART
72
select SIFIVE
73
select SIFIVE_CLINT
74
select UNIMP
75
diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build
76
index XXXXXXX..XXXXXXX 100644
35
index XXXXXXX..XXXXXXX 100644
77
--- a/hw/riscv/meson.build
36
--- a/target/riscv/insn32.decode
78
+++ b/hw/riscv/meson.build
37
+++ b/target/riscv/insn32.decode
79
@@ -XXX,XX +XXX,XX @@
38
@@ -XXX,XX +XXX,XX @@ vfwcvt_x_f_v 100010 . ..... 01001 001 ..... 1010111 @r2_vm
80
riscv_ss = ss.source_set()
39
vfwcvt_f_xu_v 100010 . ..... 01010 001 ..... 1010111 @r2_vm
81
riscv_ss.add(files('boot.c'), fdt)
40
vfwcvt_f_x_v 100010 . ..... 01011 001 ..... 1010111 @r2_vm
82
riscv_ss.add(files('numa.c'))
41
vfwcvt_f_f_v 100010 . ..... 01100 001 ..... 1010111 @r2_vm
83
-riscv_ss.add(when: 'CONFIG_HART', if_true: files('riscv_hart.c'))
42
+vfncvt_xu_f_v 100010 . ..... 10000 001 ..... 1010111 @r2_vm
84
+riscv_ss.add(files('riscv_hart.c'))
43
+vfncvt_x_f_v 100010 . ..... 10001 001 ..... 1010111 @r2_vm
85
riscv_ss.add(when: 'CONFIG_OPENTITAN', if_true: files('opentitan.c'))
44
+vfncvt_f_xu_v 100010 . ..... 10010 001 ..... 1010111 @r2_vm
86
riscv_ss.add(when: 'CONFIG_RISCV_VIRT', if_true: files('virt.c'))
45
+vfncvt_f_x_v 100010 . ..... 10011 001 ..... 1010111 @r2_vm
87
riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e.c'))
46
+vfncvt_f_f_v 100010 . ..... 10100 001 ..... 1010111 @r2_vm
47
48
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
49
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
50
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/target/riscv/insn_trans/trans_rvv.inc.c
53
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
54
@@ -XXX,XX +XXX,XX @@ GEN_OPFV_WIDEN_TRANS(vfwcvt_x_f_v)
55
GEN_OPFV_WIDEN_TRANS(vfwcvt_f_xu_v)
56
GEN_OPFV_WIDEN_TRANS(vfwcvt_f_x_v)
57
GEN_OPFV_WIDEN_TRANS(vfwcvt_f_f_v)
58
+
59
+/* Narrowing Floating-Point/Integer Type-Convert Instructions */
60
+
61
+/*
62
+ * If the current SEW does not correspond to a supported IEEE floating-point
63
+ * type, an illegal instruction exception is raised
64
+ */
65
+static bool opfv_narrow_check(DisasContext *s, arg_rmr *a)
66
+{
67
+ return (vext_check_isa_ill(s) &&
68
+ vext_check_overlap_mask(s, a->rd, a->vm, false) &&
69
+ vext_check_reg(s, a->rd, false) &&
70
+ vext_check_reg(s, a->rs2, true) &&
71
+ vext_check_overlap_group(a->rd, 1 << s->lmul, a->rs2,
72
+ 2 << s->lmul) &&
73
+ (s->lmul < 0x3) && (s->sew < 0x3) && (s->sew != 0));
74
+}
75
+
76
+#define GEN_OPFV_NARROW_TRANS(NAME) \
77
+static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
78
+{ \
79
+ if (opfv_narrow_check(s, a)) { \
80
+ uint32_t data = 0; \
81
+ static gen_helper_gvec_3_ptr * const fns[2] = { \
82
+ gen_helper_##NAME##_h, \
83
+ gen_helper_##NAME##_w, \
84
+ }; \
85
+ TCGLabel *over = gen_new_label(); \
86
+ gen_set_rm(s, 7); \
87
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
88
+ \
89
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
90
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
91
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
92
+ tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
93
+ vreg_ofs(s, a->rs2), cpu_env, 0, \
94
+ s->vlen / 8, data, fns[s->sew - 1]); \
95
+ gen_set_label(over); \
96
+ return true; \
97
+ } \
98
+ return false; \
99
+}
100
+
101
+GEN_OPFV_NARROW_TRANS(vfncvt_xu_f_v)
102
+GEN_OPFV_NARROW_TRANS(vfncvt_x_f_v)
103
+GEN_OPFV_NARROW_TRANS(vfncvt_f_xu_v)
104
+GEN_OPFV_NARROW_TRANS(vfncvt_f_x_v)
105
+GEN_OPFV_NARROW_TRANS(vfncvt_f_f_v)
106
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/target/riscv/vector_helper.c
109
+++ b/target/riscv/vector_helper.c
110
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVV1, vfwcvt_f_f_v_h, WOP_UU_H, H4, H2, vfwcvtffv16)
111
RVVCALL(OPFVV1, vfwcvt_f_f_v_w, WOP_UU_W, H8, H4, float32_to_float64)
112
GEN_VEXT_V_ENV(vfwcvt_f_f_v_h, 2, 4, clearl)
113
GEN_VEXT_V_ENV(vfwcvt_f_f_v_w, 4, 8, clearq)
114
+
115
+/* Narrowing Floating-Point/Integer Type-Convert Instructions */
116
+/* (TD, T2, TX2) */
117
+#define NOP_UU_H uint16_t, uint32_t, uint32_t
118
+#define NOP_UU_W uint32_t, uint64_t, uint64_t
119
+/* vfncvt.xu.f.v vd, vs2, vm # Convert float to unsigned integer. */
120
+RVVCALL(OPFVV1, vfncvt_xu_f_v_h, NOP_UU_H, H2, H4, float32_to_uint16)
121
+RVVCALL(OPFVV1, vfncvt_xu_f_v_w, NOP_UU_W, H4, H8, float64_to_uint32)
122
+GEN_VEXT_V_ENV(vfncvt_xu_f_v_h, 2, 2, clearh)
123
+GEN_VEXT_V_ENV(vfncvt_xu_f_v_w, 4, 4, clearl)
124
+
125
+/* vfncvt.x.f.v vd, vs2, vm # Convert double-width float to signed integer. */
126
+RVVCALL(OPFVV1, vfncvt_x_f_v_h, NOP_UU_H, H2, H4, float32_to_int16)
127
+RVVCALL(OPFVV1, vfncvt_x_f_v_w, NOP_UU_W, H4, H8, float64_to_int32)
128
+GEN_VEXT_V_ENV(vfncvt_x_f_v_h, 2, 2, clearh)
129
+GEN_VEXT_V_ENV(vfncvt_x_f_v_w, 4, 4, clearl)
130
+
131
+/* vfncvt.f.xu.v vd, vs2, vm # Convert double-width unsigned integer to float */
132
+RVVCALL(OPFVV1, vfncvt_f_xu_v_h, NOP_UU_H, H2, H4, uint32_to_float16)
133
+RVVCALL(OPFVV1, vfncvt_f_xu_v_w, NOP_UU_W, H4, H8, uint64_to_float32)
134
+GEN_VEXT_V_ENV(vfncvt_f_xu_v_h, 2, 2, clearh)
135
+GEN_VEXT_V_ENV(vfncvt_f_xu_v_w, 4, 4, clearl)
136
+
137
+/* vfncvt.f.x.v vd, vs2, vm # Convert double-width integer to float. */
138
+RVVCALL(OPFVV1, vfncvt_f_x_v_h, NOP_UU_H, H2, H4, int32_to_float16)
139
+RVVCALL(OPFVV1, vfncvt_f_x_v_w, NOP_UU_W, H4, H8, int64_to_float32)
140
+GEN_VEXT_V_ENV(vfncvt_f_x_v_h, 2, 2, clearh)
141
+GEN_VEXT_V_ENV(vfncvt_f_x_v_w, 4, 4, clearl)
142
+
143
+/* vfncvt.f.f.v vd, vs2, vm # Convert double float to single-width float. */
144
+static uint16_t vfncvtffv16(uint32_t a, float_status *s)
145
+{
146
+ return float32_to_float16(a, true, s);
147
+}
148
+
149
+RVVCALL(OPFVV1, vfncvt_f_f_v_h, NOP_UU_H, H2, H4, vfncvtffv16)
150
+RVVCALL(OPFVV1, vfncvt_f_f_v_w, NOP_UU_W, H4, H8, float64_to_float32)
151
+GEN_VEXT_V_ENV(vfncvt_f_f_v_h, 2, 2, clearh)
152
+GEN_VEXT_V_ENV(vfncvt_f_f_v_w, 4, 4, clearl)
88
--
153
--
89
2.28.0
154
2.27.0
90
155
91
156
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
This is an effort to clean up the hw/riscv directory. Ideally it
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
should only contain the RISC-V SoC / machine codes plus generic
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
codes. Let's move sifive_test model to hw/misc directory.
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1599129623-68957-10-git-send-email-bmeng.cn@gmail.com>
6
Message-Id: <20200701152549.1218-46-zhiwei_liu@c-sky.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
8
---
12
include/hw/{riscv => misc}/sifive_test.h | 0
9
target/riscv/helper.h | 33 +++++++++++
13
hw/{riscv => misc}/sifive_test.c | 2 +-
10
target/riscv/insn32.decode | 8 +++
14
hw/riscv/virt.c | 2 +-
11
target/riscv/insn_trans/trans_rvv.inc.c | 18 ++++++
15
hw/misc/Kconfig | 3 +++
12
target/riscv/vector_helper.c | 74 +++++++++++++++++++++++++
16
hw/misc/meson.build | 1 +
13
4 files changed, 133 insertions(+)
17
hw/riscv/Kconfig | 1 +
18
hw/riscv/meson.build | 1 -
19
7 files changed, 7 insertions(+), 3 deletions(-)
20
rename include/hw/{riscv => misc}/sifive_test.h (100%)
21
rename hw/{riscv => misc}/sifive_test.c (98%)
22
14
23
diff --git a/include/hw/riscv/sifive_test.h b/include/hw/misc/sifive_test.h
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
24
similarity index 100%
25
rename from include/hw/riscv/sifive_test.h
26
rename to include/hw/misc/sifive_test.h
27
diff --git a/hw/riscv/sifive_test.c b/hw/misc/sifive_test.c
28
similarity index 98%
29
rename from hw/riscv/sifive_test.c
30
rename to hw/misc/sifive_test.c
31
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
32
--- a/hw/riscv/sifive_test.c
17
--- a/target/riscv/helper.h
33
+++ b/hw/misc/sifive_test.c
18
+++ b/target/riscv/helper.h
34
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_5(vfncvt_f_x_v_h, void, ptr, ptr, ptr, env, i32)
35
#include "qemu/module.h"
20
DEF_HELPER_5(vfncvt_f_x_v_w, void, ptr, ptr, ptr, env, i32)
36
#include "sysemu/runstate.h"
21
DEF_HELPER_5(vfncvt_f_f_v_h, void, ptr, ptr, ptr, env, i32)
37
#include "hw/hw.h"
22
DEF_HELPER_5(vfncvt_f_f_v_w, void, ptr, ptr, ptr, env, i32)
38
-#include "hw/riscv/sifive_test.h"
23
+
39
+#include "hw/misc/sifive_test.h"
24
+DEF_HELPER_6(vredsum_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
40
25
+DEF_HELPER_6(vredsum_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
41
static uint64_t sifive_test_read(void *opaque, hwaddr addr, unsigned int size)
26
+DEF_HELPER_6(vredsum_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
42
{
27
+DEF_HELPER_6(vredsum_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
43
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
28
+DEF_HELPER_6(vredmaxu_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vredmaxu_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vredmaxu_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
31
+DEF_HELPER_6(vredmaxu_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vredmax_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
33
+DEF_HELPER_6(vredmax_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
34
+DEF_HELPER_6(vredmax_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
35
+DEF_HELPER_6(vredmax_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
36
+DEF_HELPER_6(vredminu_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
37
+DEF_HELPER_6(vredminu_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
38
+DEF_HELPER_6(vredminu_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
39
+DEF_HELPER_6(vredminu_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
40
+DEF_HELPER_6(vredmin_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
41
+DEF_HELPER_6(vredmin_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
42
+DEF_HELPER_6(vredmin_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
43
+DEF_HELPER_6(vredmin_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
44
+DEF_HELPER_6(vredand_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
45
+DEF_HELPER_6(vredand_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
46
+DEF_HELPER_6(vredand_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
47
+DEF_HELPER_6(vredand_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
48
+DEF_HELPER_6(vredor_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
49
+DEF_HELPER_6(vredor_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
50
+DEF_HELPER_6(vredor_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
51
+DEF_HELPER_6(vredor_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
52
+DEF_HELPER_6(vredxor_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
53
+DEF_HELPER_6(vredxor_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
54
+DEF_HELPER_6(vredxor_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
55
+DEF_HELPER_6(vredxor_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
56
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
44
index XXXXXXX..XXXXXXX 100644
57
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/riscv/virt.c
58
--- a/target/riscv/insn32.decode
46
+++ b/hw/riscv/virt.c
59
+++ b/target/riscv/insn32.decode
47
@@ -XXX,XX +XXX,XX @@
60
@@ -XXX,XX +XXX,XX @@ vfncvt_x_f_v 100010 . ..... 10001 001 ..... 1010111 @r2_vm
48
#include "hw/char/serial.h"
61
vfncvt_f_xu_v 100010 . ..... 10010 001 ..... 1010111 @r2_vm
49
#include "target/riscv/cpu.h"
62
vfncvt_f_x_v 100010 . ..... 10011 001 ..... 1010111 @r2_vm
50
#include "hw/riscv/riscv_hart.h"
63
vfncvt_f_f_v 100010 . ..... 10100 001 ..... 1010111 @r2_vm
51
-#include "hw/riscv/sifive_test.h"
64
+vredsum_vs 000000 . ..... ..... 010 ..... 1010111 @r_vm
52
#include "hw/riscv/virt.h"
65
+vredand_vs 000001 . ..... ..... 010 ..... 1010111 @r_vm
53
#include "hw/riscv/boot.h"
66
+vredor_vs 000010 . ..... ..... 010 ..... 1010111 @r_vm
54
#include "hw/riscv/numa.h"
67
+vredxor_vs 000011 . ..... ..... 010 ..... 1010111 @r_vm
55
#include "hw/intc/sifive_clint.h"
68
+vredminu_vs 000100 . ..... ..... 010 ..... 1010111 @r_vm
56
#include "hw/intc/sifive_plic.h"
69
+vredmin_vs 000101 . ..... ..... 010 ..... 1010111 @r_vm
57
+#include "hw/misc/sifive_test.h"
70
+vredmaxu_vs 000110 . ..... ..... 010 ..... 1010111 @r_vm
58
#include "chardev/char.h"
71
+vredmax_vs 000111 . ..... ..... 010 ..... 1010111 @r_vm
59
#include "sysemu/arch_init.h"
72
60
#include "sysemu/device_tree.h"
73
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
61
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
74
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
75
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
62
index XXXXXXX..XXXXXXX 100644
76
index XXXXXXX..XXXXXXX 100644
63
--- a/hw/misc/Kconfig
77
--- a/target/riscv/insn_trans/trans_rvv.inc.c
64
+++ b/hw/misc/Kconfig
78
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
65
@@ -XXX,XX +XXX,XX @@ config MAC_VIA
79
@@ -XXX,XX +XXX,XX @@ GEN_OPFV_NARROW_TRANS(vfncvt_x_f_v)
66
config AVR_POWER
80
GEN_OPFV_NARROW_TRANS(vfncvt_f_xu_v)
67
bool
81
GEN_OPFV_NARROW_TRANS(vfncvt_f_x_v)
68
82
GEN_OPFV_NARROW_TRANS(vfncvt_f_f_v)
69
+config SIFIVE_TEST
70
+ bool
71
+
83
+
72
config SIFIVE_E_PRCI
84
+/*
73
bool
85
+ *** Vector Reduction Operations
74
86
+ */
75
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
87
+/* Vector Single-Width Integer Reduction Instructions */
88
+static bool reduction_check(DisasContext *s, arg_rmrr *a)
89
+{
90
+ return vext_check_isa_ill(s) && vext_check_reg(s, a->rs2, false);
91
+}
92
+
93
+GEN_OPIVV_TRANS(vredsum_vs, reduction_check)
94
+GEN_OPIVV_TRANS(vredmaxu_vs, reduction_check)
95
+GEN_OPIVV_TRANS(vredmax_vs, reduction_check)
96
+GEN_OPIVV_TRANS(vredminu_vs, reduction_check)
97
+GEN_OPIVV_TRANS(vredmin_vs, reduction_check)
98
+GEN_OPIVV_TRANS(vredand_vs, reduction_check)
99
+GEN_OPIVV_TRANS(vredor_vs, reduction_check)
100
+GEN_OPIVV_TRANS(vredxor_vs, reduction_check)
101
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
76
index XXXXXXX..XXXXXXX 100644
102
index XXXXXXX..XXXXXXX 100644
77
--- a/hw/misc/meson.build
103
--- a/target/riscv/vector_helper.c
78
+++ b/hw/misc/meson.build
104
+++ b/target/riscv/vector_helper.c
79
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_ARM11SCU', if_true: files('arm11scu.c'))
105
@@ -XXX,XX +XXX,XX @@ RVVCALL(OPFVV1, vfncvt_f_f_v_h, NOP_UU_H, H2, H4, vfncvtffv16)
80
softmmu_ss.add(when: 'CONFIG_MOS6522', if_true: files('mos6522.c'))
106
RVVCALL(OPFVV1, vfncvt_f_f_v_w, NOP_UU_W, H4, H8, float64_to_float32)
81
107
GEN_VEXT_V_ENV(vfncvt_f_f_v_h, 2, 2, clearh)
82
# RISC-V devices
108
GEN_VEXT_V_ENV(vfncvt_f_f_v_w, 4, 4, clearl)
83
+softmmu_ss.add(when: 'CONFIG_SIFIVE_TEST', if_true: files('sifive_test.c'))
109
+
84
softmmu_ss.add(when: 'CONFIG_SIFIVE_E_PRCI', if_true: files('sifive_e_prci.c'))
110
+/*
85
softmmu_ss.add(when: 'CONFIG_SIFIVE_U_OTP', if_true: files('sifive_u_otp.c'))
111
+ *** Vector Reduction Operations
86
softmmu_ss.add(when: 'CONFIG_SIFIVE_U_PRCI', if_true: files('sifive_u_prci.c'))
112
+ */
87
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
113
+/* Vector Single-Width Integer Reduction Instructions */
88
index XXXXXXX..XXXXXXX 100644
114
+#define GEN_VEXT_RED(NAME, TD, TS2, HD, HS2, OP, CLEAR_FN)\
89
--- a/hw/riscv/Kconfig
115
+void HELPER(NAME)(void *vd, void *v0, void *vs1, \
90
+++ b/hw/riscv/Kconfig
116
+ void *vs2, CPURISCVState *env, uint32_t desc) \
91
@@ -XXX,XX +XXX,XX @@ config RISCV_VIRT
117
+{ \
92
select SIFIVE
118
+ uint32_t mlen = vext_mlen(desc); \
93
select SIFIVE_CLINT
119
+ uint32_t vm = vext_vm(desc); \
94
select SIFIVE_PLIC
120
+ uint32_t vl = env->vl; \
95
+ select SIFIVE_TEST
121
+ uint32_t i; \
96
122
+ uint32_t tot = env_archcpu(env)->cfg.vlen / 8; \
97
config MICROCHIP_PFSOC
123
+ TD s1 = *((TD *)vs1 + HD(0)); \
98
bool
124
+ \
99
diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build
125
+ for (i = 0; i < vl; i++) { \
100
index XXXXXXX..XXXXXXX 100644
126
+ TS2 s2 = *((TS2 *)vs2 + HS2(i)); \
101
--- a/hw/riscv/meson.build
127
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
102
+++ b/hw/riscv/meson.build
128
+ continue; \
103
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(files('numa.c'))
129
+ } \
104
riscv_ss.add(when: 'CONFIG_HART', if_true: files('riscv_hart.c'))
130
+ s1 = OP(s1, (TD)s2); \
105
riscv_ss.add(when: 'CONFIG_OPENTITAN', if_true: files('opentitan.c'))
131
+ } \
106
riscv_ss.add(when: 'CONFIG_RISCV_VIRT', if_true: files('virt.c'))
132
+ *((TD *)vd + HD(0)) = s1; \
107
-riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_test.c'))
133
+ CLEAR_FN(vd, 1, sizeof(TD), tot); \
108
riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e.c'))
134
+}
109
riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u.c'))
135
+
110
riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('spike.c'))
136
+/* vd[0] = sum(vs1[0], vs2[*]) */
137
+GEN_VEXT_RED(vredsum_vs_b, int8_t, int8_t, H1, H1, DO_ADD, clearb)
138
+GEN_VEXT_RED(vredsum_vs_h, int16_t, int16_t, H2, H2, DO_ADD, clearh)
139
+GEN_VEXT_RED(vredsum_vs_w, int32_t, int32_t, H4, H4, DO_ADD, clearl)
140
+GEN_VEXT_RED(vredsum_vs_d, int64_t, int64_t, H8, H8, DO_ADD, clearq)
141
+
142
+/* vd[0] = maxu(vs1[0], vs2[*]) */
143
+GEN_VEXT_RED(vredmaxu_vs_b, uint8_t, uint8_t, H1, H1, DO_MAX, clearb)
144
+GEN_VEXT_RED(vredmaxu_vs_h, uint16_t, uint16_t, H2, H2, DO_MAX, clearh)
145
+GEN_VEXT_RED(vredmaxu_vs_w, uint32_t, uint32_t, H4, H4, DO_MAX, clearl)
146
+GEN_VEXT_RED(vredmaxu_vs_d, uint64_t, uint64_t, H8, H8, DO_MAX, clearq)
147
+
148
+/* vd[0] = max(vs1[0], vs2[*]) */
149
+GEN_VEXT_RED(vredmax_vs_b, int8_t, int8_t, H1, H1, DO_MAX, clearb)
150
+GEN_VEXT_RED(vredmax_vs_h, int16_t, int16_t, H2, H2, DO_MAX, clearh)
151
+GEN_VEXT_RED(vredmax_vs_w, int32_t, int32_t, H4, H4, DO_MAX, clearl)
152
+GEN_VEXT_RED(vredmax_vs_d, int64_t, int64_t, H8, H8, DO_MAX, clearq)
153
+
154
+/* vd[0] = minu(vs1[0], vs2[*]) */
155
+GEN_VEXT_RED(vredminu_vs_b, uint8_t, uint8_t, H1, H1, DO_MIN, clearb)
156
+GEN_VEXT_RED(vredminu_vs_h, uint16_t, uint16_t, H2, H2, DO_MIN, clearh)
157
+GEN_VEXT_RED(vredminu_vs_w, uint32_t, uint32_t, H4, H4, DO_MIN, clearl)
158
+GEN_VEXT_RED(vredminu_vs_d, uint64_t, uint64_t, H8, H8, DO_MIN, clearq)
159
+
160
+/* vd[0] = min(vs1[0], vs2[*]) */
161
+GEN_VEXT_RED(vredmin_vs_b, int8_t, int8_t, H1, H1, DO_MIN, clearb)
162
+GEN_VEXT_RED(vredmin_vs_h, int16_t, int16_t, H2, H2, DO_MIN, clearh)
163
+GEN_VEXT_RED(vredmin_vs_w, int32_t, int32_t, H4, H4, DO_MIN, clearl)
164
+GEN_VEXT_RED(vredmin_vs_d, int64_t, int64_t, H8, H8, DO_MIN, clearq)
165
+
166
+/* vd[0] = and(vs1[0], vs2[*]) */
167
+GEN_VEXT_RED(vredand_vs_b, int8_t, int8_t, H1, H1, DO_AND, clearb)
168
+GEN_VEXT_RED(vredand_vs_h, int16_t, int16_t, H2, H2, DO_AND, clearh)
169
+GEN_VEXT_RED(vredand_vs_w, int32_t, int32_t, H4, H4, DO_AND, clearl)
170
+GEN_VEXT_RED(vredand_vs_d, int64_t, int64_t, H8, H8, DO_AND, clearq)
171
+
172
+/* vd[0] = or(vs1[0], vs2[*]) */
173
+GEN_VEXT_RED(vredor_vs_b, int8_t, int8_t, H1, H1, DO_OR, clearb)
174
+GEN_VEXT_RED(vredor_vs_h, int16_t, int16_t, H2, H2, DO_OR, clearh)
175
+GEN_VEXT_RED(vredor_vs_w, int32_t, int32_t, H4, H4, DO_OR, clearl)
176
+GEN_VEXT_RED(vredor_vs_d, int64_t, int64_t, H8, H8, DO_OR, clearq)
177
+
178
+/* vd[0] = xor(vs1[0], vs2[*]) */
179
+GEN_VEXT_RED(vredxor_vs_b, int8_t, int8_t, H1, H1, DO_XOR, clearb)
180
+GEN_VEXT_RED(vredxor_vs_h, int16_t, int16_t, H2, H2, DO_XOR, clearh)
181
+GEN_VEXT_RED(vredxor_vs_w, int32_t, int32_t, H4, H4, DO_XOR, clearl)
182
+GEN_VEXT_RED(vredxor_vs_d, int64_t, int64_t, H8, H8, DO_XOR, clearq)
111
--
183
--
112
2.28.0
184
2.27.0
113
185
114
186
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
This is an effort to clean up the hw/riscv directory. Ideally it
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
should only contain the RISC-V SoC / machine codes plus generic
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
codes. Let's move sifive_uart model to hw/char directory.
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1599129623-68957-9-git-send-email-bmeng.cn@gmail.com>
6
Message-Id: <20200701152549.1218-47-zhiwei_liu@c-sky.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
8
---
12
include/hw/{riscv => char}/sifive_uart.h | 0
9
target/riscv/helper.h | 7 +++++++
13
hw/{riscv => char}/sifive_uart.c | 2 +-
10
target/riscv/insn32.decode | 2 ++
14
hw/riscv/sifive_e.c | 2 +-
11
target/riscv/insn_trans/trans_rvv.inc.c | 4 ++++
15
hw/riscv/sifive_u.c | 2 +-
12
target/riscv/vector_helper.c | 11 +++++++++++
16
hw/char/Kconfig | 3 +++
13
4 files changed, 24 insertions(+)
17
hw/char/meson.build | 1 +
18
hw/riscv/Kconfig | 2 ++
19
hw/riscv/meson.build | 1 -
20
8 files changed, 9 insertions(+), 4 deletions(-)
21
rename include/hw/{riscv => char}/sifive_uart.h (100%)
22
rename hw/{riscv => char}/sifive_uart.c (99%)
23
14
24
diff --git a/include/hw/riscv/sifive_uart.h b/include/hw/char/sifive_uart.h
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
25
similarity index 100%
26
rename from include/hw/riscv/sifive_uart.h
27
rename to include/hw/char/sifive_uart.h
28
diff --git a/hw/riscv/sifive_uart.c b/hw/char/sifive_uart.c
29
similarity index 99%
30
rename from hw/riscv/sifive_uart.c
31
rename to hw/char/sifive_uart.c
32
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/riscv/sifive_uart.c
17
--- a/target/riscv/helper.h
34
+++ b/hw/char/sifive_uart.c
18
+++ b/target/riscv/helper.h
35
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vredxor_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
36
#include "chardev/char-fe.h"
20
DEF_HELPER_6(vredxor_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
37
#include "hw/hw.h"
21
DEF_HELPER_6(vredxor_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
38
#include "hw/irq.h"
22
DEF_HELPER_6(vredxor_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
39
-#include "hw/riscv/sifive_uart.h"
23
+
40
+#include "hw/char/sifive_uart.h"
24
+DEF_HELPER_6(vwredsumu_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
41
25
+DEF_HELPER_6(vwredsumu_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
42
/*
26
+DEF_HELPER_6(vwredsumu_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
43
* Not yet implemented:
27
+DEF_HELPER_6(vwredsum_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
44
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
28
+DEF_HELPER_6(vwredsum_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vwredsum_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
30
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
45
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/riscv/sifive_e.c
32
--- a/target/riscv/insn32.decode
47
+++ b/hw/riscv/sifive_e.c
33
+++ b/target/riscv/insn32.decode
48
@@ -XXX,XX +XXX,XX @@
34
@@ -XXX,XX +XXX,XX @@ vredminu_vs 000100 . ..... ..... 010 ..... 1010111 @r_vm
49
#include "hw/misc/unimp.h"
35
vredmin_vs 000101 . ..... ..... 010 ..... 1010111 @r_vm
50
#include "target/riscv/cpu.h"
36
vredmaxu_vs 000110 . ..... ..... 010 ..... 1010111 @r_vm
51
#include "hw/riscv/riscv_hart.h"
37
vredmax_vs 000111 . ..... ..... 010 ..... 1010111 @r_vm
52
-#include "hw/riscv/sifive_uart.h"
38
+vwredsumu_vs 110000 . ..... ..... 000 ..... 1010111 @r_vm
53
#include "hw/riscv/sifive_e.h"
39
+vwredsum_vs 110001 . ..... ..... 000 ..... 1010111 @r_vm
54
#include "hw/riscv/boot.h"
40
55
+#include "hw/char/sifive_uart.h"
41
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
56
#include "hw/intc/sifive_clint.h"
42
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
57
#include "hw/intc/sifive_plic.h"
43
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
58
#include "hw/misc/sifive_e_prci.h"
59
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
60
index XXXXXXX..XXXXXXX 100644
44
index XXXXXXX..XXXXXXX 100644
61
--- a/hw/riscv/sifive_u.c
45
--- a/target/riscv/insn_trans/trans_rvv.inc.c
62
+++ b/hw/riscv/sifive_u.c
46
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
63
@@ -XXX,XX +XXX,XX @@
47
@@ -XXX,XX +XXX,XX @@ GEN_OPIVV_TRANS(vredmin_vs, reduction_check)
64
#include "hw/misc/unimp.h"
48
GEN_OPIVV_TRANS(vredand_vs, reduction_check)
65
#include "target/riscv/cpu.h"
49
GEN_OPIVV_TRANS(vredor_vs, reduction_check)
66
#include "hw/riscv/riscv_hart.h"
50
GEN_OPIVV_TRANS(vredxor_vs, reduction_check)
67
-#include "hw/riscv/sifive_uart.h"
51
+
68
#include "hw/riscv/sifive_u.h"
52
+/* Vector Widening Integer Reduction Instructions */
69
#include "hw/riscv/boot.h"
53
+GEN_OPIVV_WIDEN_TRANS(vwredsum_vs, reduction_check)
70
+#include "hw/char/sifive_uart.h"
54
+GEN_OPIVV_WIDEN_TRANS(vwredsumu_vs, reduction_check)
71
#include "hw/intc/sifive_clint.h"
55
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
72
#include "hw/intc/sifive_plic.h"
73
#include "chardev/char.h"
74
diff --git a/hw/char/Kconfig b/hw/char/Kconfig
75
index XXXXXXX..XXXXXXX 100644
56
index XXXXXXX..XXXXXXX 100644
76
--- a/hw/char/Kconfig
57
--- a/target/riscv/vector_helper.c
77
+++ b/hw/char/Kconfig
58
+++ b/target/riscv/vector_helper.c
78
@@ -XXX,XX +XXX,XX @@ config AVR_USART
59
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_RED(vredxor_vs_b, int8_t, int8_t, H1, H1, DO_XOR, clearb)
79
60
GEN_VEXT_RED(vredxor_vs_h, int16_t, int16_t, H2, H2, DO_XOR, clearh)
80
config MCHP_PFSOC_MMUART
61
GEN_VEXT_RED(vredxor_vs_w, int32_t, int32_t, H4, H4, DO_XOR, clearl)
81
bool
62
GEN_VEXT_RED(vredxor_vs_d, int64_t, int64_t, H8, H8, DO_XOR, clearq)
82
+
63
+
83
+config SIFIVE_UART
64
+/* Vector Widening Integer Reduction Instructions */
84
+ bool
65
+/* signed sum reduction into double-width accumulator */
85
diff --git a/hw/char/meson.build b/hw/char/meson.build
66
+GEN_VEXT_RED(vwredsum_vs_b, int16_t, int8_t, H2, H1, DO_ADD, clearh)
86
index XXXXXXX..XXXXXXX 100644
67
+GEN_VEXT_RED(vwredsum_vs_h, int32_t, int16_t, H4, H2, DO_ADD, clearl)
87
--- a/hw/char/meson.build
68
+GEN_VEXT_RED(vwredsum_vs_w, int64_t, int32_t, H8, H4, DO_ADD, clearq)
88
+++ b/hw/char/meson.build
69
+
89
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_EXYNOS4', if_true: files('exynos4210_uart.c'))
70
+/* Unsigned sum reduction into double-width accumulator */
90
softmmu_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_uart.c'))
71
+GEN_VEXT_RED(vwredsumu_vs_b, uint16_t, uint8_t, H2, H1, DO_ADD, clearh)
91
softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_aux.c'))
72
+GEN_VEXT_RED(vwredsumu_vs_h, uint32_t, uint16_t, H4, H2, DO_ADD, clearl)
92
softmmu_ss.add(when: 'CONFIG_RENESAS_SCI', if_true: files('renesas_sci.c'))
73
+GEN_VEXT_RED(vwredsumu_vs_w, uint64_t, uint32_t, H8, H4, DO_ADD, clearq)
93
+softmmu_ss.add(when: 'CONFIG_SIFIVE_UART', if_true: files('sifive_uart.c'))
94
softmmu_ss.add(when: 'CONFIG_SH4', if_true: files('sh_serial.c'))
95
softmmu_ss.add(when: 'CONFIG_STM32F2XX_USART', if_true: files('stm32f2xx_usart.c'))
96
softmmu_ss.add(when: 'CONFIG_MCHP_PFSOC_MMUART', if_true: files('mchp_pfsoc_mmuart.c'))
97
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
98
index XXXXXXX..XXXXXXX 100644
99
--- a/hw/riscv/Kconfig
100
+++ b/hw/riscv/Kconfig
101
@@ -XXX,XX +XXX,XX @@ config SIFIVE_E
102
select SIFIVE_CLINT
103
select SIFIVE_GPIO
104
select SIFIVE_PLIC
105
+ select SIFIVE_UART
106
select SIFIVE_E_PRCI
107
select UNIMP
108
109
@@ -XXX,XX +XXX,XX @@ config SIFIVE_U
110
select SIFIVE_GPIO
111
select SIFIVE_PDMA
112
select SIFIVE_PLIC
113
+ select SIFIVE_UART
114
select SIFIVE_U_OTP
115
select SIFIVE_U_PRCI
116
select UNIMP
117
diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build
118
index XXXXXXX..XXXXXXX 100644
119
--- a/hw/riscv/meson.build
120
+++ b/hw/riscv/meson.build
121
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(when: 'CONFIG_HART', if_true: files('riscv_hart.c'))
122
riscv_ss.add(when: 'CONFIG_OPENTITAN', if_true: files('opentitan.c'))
123
riscv_ss.add(when: 'CONFIG_RISCV_VIRT', if_true: files('virt.c'))
124
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_test.c'))
125
-riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_uart.c'))
126
riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e.c'))
127
riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u.c'))
128
riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('spike.c'))
129
--
74
--
130
2.28.0
75
2.27.0
131
76
132
77
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
This is an effort to clean up the hw/riscv directory. Ideally it
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
should only contain the RISC-V SoC / machine codes plus generic
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
codes. Let's move riscv_htif model to hw/char directory.
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1599129623-68957-8-git-send-email-bmeng.cn@gmail.com>
6
Message-Id: <20200701152549.1218-48-zhiwei_liu@c-sky.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
8
---
12
include/hw/{riscv => char}/riscv_htif.h | 0
9
target/riscv/helper.h | 10 +++++++
13
hw/{riscv => char}/riscv_htif.c | 2 +-
10
target/riscv/insn32.decode | 4 +++
14
hw/riscv/spike.c | 2 +-
11
target/riscv/insn_trans/trans_rvv.inc.c | 5 ++++
15
hw/char/Kconfig | 3 +++
12
target/riscv/vector_helper.c | 39 +++++++++++++++++++++++++
16
hw/char/meson.build | 1 +
13
4 files changed, 58 insertions(+)
17
hw/riscv/Kconfig | 3 ---
18
hw/riscv/meson.build | 1 -
19
7 files changed, 6 insertions(+), 6 deletions(-)
20
rename include/hw/{riscv => char}/riscv_htif.h (100%)
21
rename hw/{riscv => char}/riscv_htif.c (99%)
22
14
23
diff --git a/include/hw/riscv/riscv_htif.h b/include/hw/char/riscv_htif.h
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
24
similarity index 100%
25
rename from include/hw/riscv/riscv_htif.h
26
rename to include/hw/char/riscv_htif.h
27
diff --git a/hw/riscv/riscv_htif.c b/hw/char/riscv_htif.c
28
similarity index 99%
29
rename from hw/riscv/riscv_htif.c
30
rename to hw/char/riscv_htif.c
31
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
32
--- a/hw/riscv/riscv_htif.c
17
--- a/target/riscv/helper.h
33
+++ b/hw/char/riscv_htif.c
18
+++ b/target/riscv/helper.h
34
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vwredsumu_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
35
#include "qapi/error.h"
20
DEF_HELPER_6(vwredsum_vs_b, void, ptr, ptr, ptr, ptr, env, i32)
36
#include "qemu/log.h"
21
DEF_HELPER_6(vwredsum_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
37
#include "hw/sysbus.h"
22
DEF_HELPER_6(vwredsum_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
38
+#include "hw/char/riscv_htif.h"
23
+
39
#include "hw/char/serial.h"
24
+DEF_HELPER_6(vfredsum_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
40
#include "chardev/char.h"
25
+DEF_HELPER_6(vfredsum_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
41
#include "chardev/char-fe.h"
26
+DEF_HELPER_6(vfredsum_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
42
-#include "hw/riscv/riscv_htif.h"
27
+DEF_HELPER_6(vfredmax_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
43
#include "qemu/timer.h"
28
+DEF_HELPER_6(vfredmax_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
44
#include "qemu/error-report.h"
29
+DEF_HELPER_6(vfredmax_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
45
30
+DEF_HELPER_6(vfredmin_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
46
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
31
+DEF_HELPER_6(vfredmin_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
32
+DEF_HELPER_6(vfredmin_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
33
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
47
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/riscv/spike.c
35
--- a/target/riscv/insn32.decode
49
+++ b/hw/riscv/spike.c
36
+++ b/target/riscv/insn32.decode
50
@@ -XXX,XX +XXX,XX @@
37
@@ -XXX,XX +XXX,XX @@ vredmaxu_vs 000110 . ..... ..... 010 ..... 1010111 @r_vm
51
#include "hw/loader.h"
38
vredmax_vs 000111 . ..... ..... 010 ..... 1010111 @r_vm
52
#include "hw/sysbus.h"
39
vwredsumu_vs 110000 . ..... ..... 000 ..... 1010111 @r_vm
53
#include "target/riscv/cpu.h"
40
vwredsum_vs 110001 . ..... ..... 000 ..... 1010111 @r_vm
54
-#include "hw/riscv/riscv_htif.h"
41
+# Vector ordered and unordered reduction sum
55
#include "hw/riscv/riscv_hart.h"
42
+vfredsum_vs 0000-1 . ..... ..... 001 ..... 1010111 @r_vm
56
#include "hw/riscv/spike.h"
43
+vfredmin_vs 000101 . ..... ..... 001 ..... 1010111 @r_vm
57
#include "hw/riscv/boot.h"
44
+vfredmax_vs 000111 . ..... ..... 001 ..... 1010111 @r_vm
58
#include "hw/riscv/numa.h"
45
59
+#include "hw/char/riscv_htif.h"
46
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
60
#include "hw/intc/sifive_clint.h"
47
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
61
#include "chardev/char.h"
48
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
62
#include "sysemu/arch_init.h"
63
diff --git a/hw/char/Kconfig b/hw/char/Kconfig
64
index XXXXXXX..XXXXXXX 100644
49
index XXXXXXX..XXXXXXX 100644
65
--- a/hw/char/Kconfig
50
--- a/target/riscv/insn_trans/trans_rvv.inc.c
66
+++ b/hw/char/Kconfig
51
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
67
@@ -XXX,XX +XXX,XX @@
52
@@ -XXX,XX +XXX,XX @@ GEN_OPIVV_TRANS(vredxor_vs, reduction_check)
68
config ESCC
53
/* Vector Widening Integer Reduction Instructions */
69
bool
54
GEN_OPIVV_WIDEN_TRANS(vwredsum_vs, reduction_check)
70
55
GEN_OPIVV_WIDEN_TRANS(vwredsumu_vs, reduction_check)
71
+config HTIF
72
+ bool
73
+
56
+
74
config PARALLEL
57
+/* Vector Single-Width Floating-Point Reduction Instructions */
75
bool
58
+GEN_OPFVV_TRANS(vfredsum_vs, reduction_check)
76
default y
59
+GEN_OPFVV_TRANS(vfredmax_vs, reduction_check)
77
diff --git a/hw/char/meson.build b/hw/char/meson.build
60
+GEN_OPFVV_TRANS(vfredmin_vs, reduction_check)
61
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
78
index XXXXXXX..XXXXXXX 100644
62
index XXXXXXX..XXXXXXX 100644
79
--- a/hw/char/meson.build
63
--- a/target/riscv/vector_helper.c
80
+++ b/hw/char/meson.build
64
+++ b/target/riscv/vector_helper.c
81
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_SH4', if_true: files('sh_serial.c'))
65
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_RED(vwredsum_vs_w, int64_t, int32_t, H8, H4, DO_ADD, clearq)
82
softmmu_ss.add(when: 'CONFIG_STM32F2XX_USART', if_true: files('stm32f2xx_usart.c'))
66
GEN_VEXT_RED(vwredsumu_vs_b, uint16_t, uint8_t, H2, H1, DO_ADD, clearh)
83
softmmu_ss.add(when: 'CONFIG_MCHP_PFSOC_MMUART', if_true: files('mchp_pfsoc_mmuart.c'))
67
GEN_VEXT_RED(vwredsumu_vs_h, uint32_t, uint16_t, H4, H2, DO_ADD, clearl)
84
68
GEN_VEXT_RED(vwredsumu_vs_w, uint64_t, uint32_t, H8, H4, DO_ADD, clearq)
85
+specific_ss.add(when: 'CONFIG_HTIF', if_true: files('riscv_htif.c'))
69
+
86
specific_ss.add(when: 'CONFIG_TERMINAL3270', if_true: files('terminal3270.c'))
70
+/* Vector Single-Width Floating-Point Reduction Instructions */
87
specific_ss.add(when: 'CONFIG_VIRTIO', if_true: files('virtio-serial-bus.c'))
71
+#define GEN_VEXT_FRED(NAME, TD, TS2, HD, HS2, OP, CLEAR_FN)\
88
specific_ss.add(when: 'CONFIG_PSERIES', if_true: files('spapr_vty.c'))
72
+void HELPER(NAME)(void *vd, void *v0, void *vs1, \
89
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
73
+ void *vs2, CPURISCVState *env, \
90
index XXXXXXX..XXXXXXX 100644
74
+ uint32_t desc) \
91
--- a/hw/riscv/Kconfig
75
+{ \
92
+++ b/hw/riscv/Kconfig
76
+ uint32_t mlen = vext_mlen(desc); \
93
@@ -XXX,XX +XXX,XX @@
77
+ uint32_t vm = vext_vm(desc); \
94
-config HTIF
78
+ uint32_t vl = env->vl; \
95
- bool
79
+ uint32_t i; \
96
-
80
+ uint32_t tot = env_archcpu(env)->cfg.vlen / 8; \
97
config HART
81
+ TD s1 = *((TD *)vs1 + HD(0)); \
98
bool
82
+ \
99
83
+ for (i = 0; i < vl; i++) { \
100
diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build
84
+ TS2 s2 = *((TS2 *)vs2 + HS2(i)); \
101
index XXXXXXX..XXXXXXX 100644
85
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
102
--- a/hw/riscv/meson.build
86
+ continue; \
103
+++ b/hw/riscv/meson.build
87
+ } \
104
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_test.c'))
88
+ s1 = OP(s1, (TD)s2, &env->fp_status); \
105
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_uart.c'))
89
+ } \
106
riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e.c'))
90
+ *((TD *)vd + HD(0)) = s1; \
107
riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u.c'))
91
+ CLEAR_FN(vd, 1, sizeof(TD), tot); \
108
-riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('riscv_htif.c'))
92
+}
109
riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('spike.c'))
93
+
110
riscv_ss.add(when: 'CONFIG_MICROCHIP_PFSOC', if_true: files('microchip_pfsoc.c'))
94
+/* Unordered sum */
111
95
+GEN_VEXT_FRED(vfredsum_vs_h, uint16_t, uint16_t, H2, H2, float16_add, clearh)
96
+GEN_VEXT_FRED(vfredsum_vs_w, uint32_t, uint32_t, H4, H4, float32_add, clearl)
97
+GEN_VEXT_FRED(vfredsum_vs_d, uint64_t, uint64_t, H8, H8, float64_add, clearq)
98
+
99
+/* Maximum value */
100
+GEN_VEXT_FRED(vfredmax_vs_h, uint16_t, uint16_t, H2, H2, float16_maxnum, clearh)
101
+GEN_VEXT_FRED(vfredmax_vs_w, uint32_t, uint32_t, H4, H4, float32_maxnum, clearl)
102
+GEN_VEXT_FRED(vfredmax_vs_d, uint64_t, uint64_t, H8, H8, float64_maxnum, clearq)
103
+
104
+/* Minimum value */
105
+GEN_VEXT_FRED(vfredmin_vs_h, uint16_t, uint16_t, H2, H2, float16_minnum, clearh)
106
+GEN_VEXT_FRED(vfredmin_vs_w, uint32_t, uint32_t, H4, H4, float32_minnum, clearl)
107
+GEN_VEXT_FRED(vfredmin_vs_d, uint64_t, uint64_t, H8, H8, float64_minnum, clearq)
112
--
108
--
113
2.28.0
109
2.27.0
114
110
115
111
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
This is an effort to clean up the hw/riscv directory. Ideally it
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
should only contain the RISC-V SoC / machine codes plus generic
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
codes. Let's move sifive_clint model to hw/intc directory.
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1599129623-68957-6-git-send-email-bmeng.cn@gmail.com>
6
Message-Id: <20200701152549.1218-49-zhiwei_liu@c-sky.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
8
---
12
include/hw/{riscv => intc}/sifive_clint.h | 0
9
target/riscv/helper.h | 3 ++
13
hw/{riscv => intc}/sifive_clint.c | 2 +-
10
target/riscv/insn32.decode | 2 ++
14
hw/riscv/microchip_pfsoc.c | 2 +-
11
target/riscv/insn_trans/trans_rvv.inc.c | 3 ++
15
hw/riscv/sifive_e.c | 2 +-
12
target/riscv/vector_helper.c | 46 +++++++++++++++++++++++++
16
hw/riscv/sifive_u.c | 2 +-
13
4 files changed, 54 insertions(+)
17
hw/riscv/spike.c | 2 +-
18
hw/riscv/virt.c | 2 +-
19
hw/intc/Kconfig | 3 +++
20
hw/intc/meson.build | 1 +
21
hw/riscv/Kconfig | 5 +++++
22
hw/riscv/meson.build | 1 -
23
11 files changed, 15 insertions(+), 7 deletions(-)
24
rename include/hw/{riscv => intc}/sifive_clint.h (100%)
25
rename hw/{riscv => intc}/sifive_clint.c (99%)
26
14
27
diff --git a/include/hw/riscv/sifive_clint.h b/include/hw/intc/sifive_clint.h
15
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
28
similarity index 100%
29
rename from include/hw/riscv/sifive_clint.h
30
rename to include/hw/intc/sifive_clint.h
31
diff --git a/hw/riscv/sifive_clint.c b/hw/intc/sifive_clint.c
32
similarity index 99%
33
rename from hw/riscv/sifive_clint.c
34
rename to hw/intc/sifive_clint.c
35
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
36
--- a/hw/riscv/sifive_clint.c
17
--- a/target/riscv/helper.h
37
+++ b/hw/intc/sifive_clint.c
18
+++ b/target/riscv/helper.h
38
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vfredmax_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
39
#include "hw/sysbus.h"
20
DEF_HELPER_6(vfredmin_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
40
#include "target/riscv/cpu.h"
21
DEF_HELPER_6(vfredmin_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
41
#include "hw/qdev-properties.h"
22
DEF_HELPER_6(vfredmin_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
42
-#include "hw/riscv/sifive_clint.h"
23
+
43
+#include "hw/intc/sifive_clint.h"
24
+DEF_HELPER_6(vfwredsum_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
44
#include "qemu/timer.h"
25
+DEF_HELPER_6(vfwredsum_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
45
26
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
46
static uint64_t cpu_riscv_read_rtc(uint32_t timebase_freq)
47
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
48
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
49
--- a/hw/riscv/microchip_pfsoc.c
28
--- a/target/riscv/insn32.decode
50
+++ b/hw/riscv/microchip_pfsoc.c
29
+++ b/target/riscv/insn32.decode
51
@@ -XXX,XX +XXX,XX @@
30
@@ -XXX,XX +XXX,XX @@ vwredsum_vs 110001 . ..... ..... 000 ..... 1010111 @r_vm
52
#include "hw/misc/unimp.h"
31
vfredsum_vs 0000-1 . ..... ..... 001 ..... 1010111 @r_vm
53
#include "hw/riscv/boot.h"
32
vfredmin_vs 000101 . ..... ..... 001 ..... 1010111 @r_vm
54
#include "hw/riscv/riscv_hart.h"
33
vfredmax_vs 000111 . ..... ..... 001 ..... 1010111 @r_vm
55
-#include "hw/riscv/sifive_clint.h"
34
+# Vector widening ordered and unordered float reduction sum
56
#include "hw/riscv/sifive_plic.h"
35
+vfwredsum_vs 1100-1 . ..... ..... 001 ..... 1010111 @r_vm
57
#include "hw/riscv/microchip_pfsoc.h"
36
58
+#include "hw/intc/sifive_clint.h"
37
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
59
#include "sysemu/sysemu.h"
38
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
60
39
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
61
/*
62
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
63
index XXXXXXX..XXXXXXX 100644
40
index XXXXXXX..XXXXXXX 100644
64
--- a/hw/riscv/sifive_e.c
41
--- a/target/riscv/insn_trans/trans_rvv.inc.c
65
+++ b/hw/riscv/sifive_e.c
42
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
66
@@ -XXX,XX +XXX,XX @@
43
@@ -XXX,XX +XXX,XX @@ GEN_OPIVV_WIDEN_TRANS(vwredsumu_vs, reduction_check)
67
#include "target/riscv/cpu.h"
44
GEN_OPFVV_TRANS(vfredsum_vs, reduction_check)
68
#include "hw/riscv/riscv_hart.h"
45
GEN_OPFVV_TRANS(vfredmax_vs, reduction_check)
69
#include "hw/riscv/sifive_plic.h"
46
GEN_OPFVV_TRANS(vfredmin_vs, reduction_check)
70
-#include "hw/riscv/sifive_clint.h"
47
+
71
#include "hw/riscv/sifive_uart.h"
48
+/* Vector Widening Floating-Point Reduction Instructions */
72
#include "hw/riscv/sifive_e.h"
49
+GEN_OPFVV_WIDEN_TRANS(vfwredsum_vs, reduction_check)
73
#include "hw/riscv/boot.h"
50
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
74
+#include "hw/intc/sifive_clint.h"
75
#include "hw/misc/sifive_e_prci.h"
76
#include "chardev/char.h"
77
#include "sysemu/arch_init.h"
78
diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c
79
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
80
--- a/hw/riscv/sifive_u.c
52
--- a/target/riscv/vector_helper.c
81
+++ b/hw/riscv/sifive_u.c
53
+++ b/target/riscv/vector_helper.c
82
@@ -XXX,XX +XXX,XX @@
54
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_FRED(vfredmax_vs_d, uint64_t, uint64_t, H8, H8, float64_maxnum, clearq)
83
#include "target/riscv/cpu.h"
55
GEN_VEXT_FRED(vfredmin_vs_h, uint16_t, uint16_t, H2, H2, float16_minnum, clearh)
84
#include "hw/riscv/riscv_hart.h"
56
GEN_VEXT_FRED(vfredmin_vs_w, uint32_t, uint32_t, H4, H4, float32_minnum, clearl)
85
#include "hw/riscv/sifive_plic.h"
57
GEN_VEXT_FRED(vfredmin_vs_d, uint64_t, uint64_t, H8, H8, float64_minnum, clearq)
86
-#include "hw/riscv/sifive_clint.h"
87
#include "hw/riscv/sifive_uart.h"
88
#include "hw/riscv/sifive_u.h"
89
#include "hw/riscv/boot.h"
90
+#include "hw/intc/sifive_clint.h"
91
#include "chardev/char.h"
92
#include "net/eth.h"
93
#include "sysemu/arch_init.h"
94
diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c
95
index XXXXXXX..XXXXXXX 100644
96
--- a/hw/riscv/spike.c
97
+++ b/hw/riscv/spike.c
98
@@ -XXX,XX +XXX,XX @@
99
#include "target/riscv/cpu.h"
100
#include "hw/riscv/riscv_htif.h"
101
#include "hw/riscv/riscv_hart.h"
102
-#include "hw/riscv/sifive_clint.h"
103
#include "hw/riscv/spike.h"
104
#include "hw/riscv/boot.h"
105
#include "hw/riscv/numa.h"
106
+#include "hw/intc/sifive_clint.h"
107
#include "chardev/char.h"
108
#include "sysemu/arch_init.h"
109
#include "sysemu/device_tree.h"
110
diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c
111
index XXXXXXX..XXXXXXX 100644
112
--- a/hw/riscv/virt.c
113
+++ b/hw/riscv/virt.c
114
@@ -XXX,XX +XXX,XX @@
115
#include "target/riscv/cpu.h"
116
#include "hw/riscv/riscv_hart.h"
117
#include "hw/riscv/sifive_plic.h"
118
-#include "hw/riscv/sifive_clint.h"
119
#include "hw/riscv/sifive_test.h"
120
#include "hw/riscv/virt.h"
121
#include "hw/riscv/boot.h"
122
#include "hw/riscv/numa.h"
123
+#include "hw/intc/sifive_clint.h"
124
#include "chardev/char.h"
125
#include "sysemu/arch_init.h"
126
#include "sysemu/device_tree.h"
127
diff --git a/hw/intc/Kconfig b/hw/intc/Kconfig
128
index XXXXXXX..XXXXXXX 100644
129
--- a/hw/intc/Kconfig
130
+++ b/hw/intc/Kconfig
131
@@ -XXX,XX +XXX,XX @@ config RX_ICU
132
133
config LOONGSON_LIOINTC
134
bool
135
+
58
+
136
+config SIFIVE_CLINT
59
+/* Vector Widening Floating-Point Reduction Instructions */
137
+ bool
60
+/* Unordered reduce 2*SEW = 2*SEW + sum(promote(SEW)) */
138
diff --git a/hw/intc/meson.build b/hw/intc/meson.build
61
+void HELPER(vfwredsum_vs_h)(void *vd, void *v0, void *vs1,
139
index XXXXXXX..XXXXXXX 100644
62
+ void *vs2, CPURISCVState *env, uint32_t desc)
140
--- a/hw/intc/meson.build
63
+{
141
+++ b/hw/intc/meson.build
64
+ uint32_t mlen = vext_mlen(desc);
142
@@ -XXX,XX +XXX,XX @@ specific_ss.add(when: 'CONFIG_RX_ICU', if_true: files('rx_icu.c'))
65
+ uint32_t vm = vext_vm(desc);
143
specific_ss.add(when: 'CONFIG_S390_FLIC', if_true: files('s390_flic.c'))
66
+ uint32_t vl = env->vl;
144
specific_ss.add(when: 'CONFIG_S390_FLIC_KVM', if_true: files('s390_flic_kvm.c'))
67
+ uint32_t i;
145
specific_ss.add(when: 'CONFIG_SH4', if_true: files('sh_intc.c'))
68
+ uint32_t tot = env_archcpu(env)->cfg.vlen / 8;
146
+specific_ss.add(when: 'CONFIG_SIFIVE_CLINT', if_true: files('sifive_clint.c'))
69
+ uint32_t s1 = *((uint32_t *)vs1 + H4(0));
147
specific_ss.add(when: 'CONFIG_XICS', if_true: files('xics.c'))
70
+
148
specific_ss.add(when: 'CONFIG_XICS_KVM', if_true: files('xics_kvm.c'))
71
+ for (i = 0; i < vl; i++) {
149
specific_ss.add(when: 'CONFIG_XICS_SPAPR', if_true: files('xics_spapr.c'))
72
+ uint16_t s2 = *((uint16_t *)vs2 + H2(i));
150
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
73
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
151
index XXXXXXX..XXXXXXX 100644
74
+ continue;
152
--- a/hw/riscv/Kconfig
75
+ }
153
+++ b/hw/riscv/Kconfig
76
+ s1 = float32_add(s1, float16_to_float32(s2, true, &env->fp_status),
154
@@ -XXX,XX +XXX,XX @@ config SIFIVE_E
77
+ &env->fp_status);
155
bool
78
+ }
156
select HART
79
+ *((uint32_t *)vd + H4(0)) = s1;
157
select SIFIVE
80
+ clearl(vd, 1, sizeof(uint32_t), tot);
158
+ select SIFIVE_CLINT
81
+}
159
select SIFIVE_GPIO
82
+
160
select SIFIVE_E_PRCI
83
+void HELPER(vfwredsum_vs_w)(void *vd, void *v0, void *vs1,
161
select UNIMP
84
+ void *vs2, CPURISCVState *env, uint32_t desc)
162
@@ -XXX,XX +XXX,XX @@ config SIFIVE_U
85
+{
163
select CADENCE
86
+ uint32_t mlen = vext_mlen(desc);
164
select HART
87
+ uint32_t vm = vext_vm(desc);
165
select SIFIVE
88
+ uint32_t vl = env->vl;
166
+ select SIFIVE_CLINT
89
+ uint32_t i;
167
select SIFIVE_GPIO
90
+ uint32_t tot = env_archcpu(env)->cfg.vlen / 8;
168
select SIFIVE_PDMA
91
+ uint64_t s1 = *((uint64_t *)vs1);
169
select SIFIVE_U_OTP
92
+
170
@@ -XXX,XX +XXX,XX @@ config SPIKE
93
+ for (i = 0; i < vl; i++) {
171
select HART
94
+ uint32_t s2 = *((uint32_t *)vs2 + H4(i));
172
select HTIF
95
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
173
select SIFIVE
96
+ continue;
174
+ select SIFIVE_CLINT
97
+ }
175
98
+ s1 = float64_add(s1, float32_to_float64(s2, &env->fp_status),
176
config OPENTITAN
99
+ &env->fp_status);
177
bool
100
+ }
178
@@ -XXX,XX +XXX,XX @@ config RISCV_VIRT
101
+ *((uint64_t *)vd) = s1;
179
select PCI_EXPRESS_GENERIC_BRIDGE
102
+ clearq(vd, 1, sizeof(uint64_t), tot);
180
select PFLASH_CFI01
103
+}
181
select SIFIVE
182
+ select SIFIVE_CLINT
183
184
config MICROCHIP_PFSOC
185
bool
186
select HART
187
select SIFIVE
188
+ select SIFIVE_CLINT
189
select UNIMP
190
select MCHP_PFSOC_MMUART
191
select SIFIVE_PDMA
192
diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build
193
index XXXXXXX..XXXXXXX 100644
194
--- a/hw/riscv/meson.build
195
+++ b/hw/riscv/meson.build
196
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(files('numa.c'))
197
riscv_ss.add(when: 'CONFIG_HART', if_true: files('riscv_hart.c'))
198
riscv_ss.add(when: 'CONFIG_OPENTITAN', if_true: files('opentitan.c'))
199
riscv_ss.add(when: 'CONFIG_RISCV_VIRT', if_true: files('virt.c'))
200
-riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_clint.c'))
201
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_plic.c'))
202
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_test.c'))
203
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_uart.c'))
204
--
104
--
205
2.28.0
105
2.27.0
206
106
207
107
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
This is an effort to clean up the hw/riscv directory. Ideally it
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
should only contain the RISC-V SoC / machine codes plus generic
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
codes. Let's move sifive_gpio model to hw/gpio directory.
5
Message-Id: <20200701152549.1218-50-zhiwei_liu@c-sky.com>
6
7
Note this also removes the trace-events in the hw/riscv directory,
8
since gpio is the only supported trace target in that directory.
9
10
Signed-off-by: Bin Meng <bin.meng@windriver.com>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-Id: <1599129623-68957-5-git-send-email-bmeng.cn@gmail.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
7
---
15
hw/riscv/trace.h | 1 -
8
target/riscv/helper.h | 9 ++++++
16
include/hw/{riscv => gpio}/sifive_gpio.h | 0
9
target/riscv/insn32.decode | 8 +++++
17
include/hw/riscv/sifive_e.h | 2 +-
10
target/riscv/insn_trans/trans_rvv.inc.c | 35 ++++++++++++++++++++++
18
include/hw/riscv/sifive_u.h | 2 +-
11
target/riscv/vector_helper.c | 40 +++++++++++++++++++++++++
19
hw/{riscv => gpio}/sifive_gpio.c | 2 +-
12
4 files changed, 92 insertions(+)
20
hw/gpio/Kconfig | 3 +++
21
hw/gpio/meson.build | 1 +
22
hw/gpio/trace-events | 6 ++++++
23
hw/riscv/Kconfig | 2 ++
24
hw/riscv/meson.build | 1 -
25
hw/riscv/trace-events | 7 -------
26
meson.build | 1 -
27
12 files changed, 15 insertions(+), 13 deletions(-)
28
delete mode 100644 hw/riscv/trace.h
29
rename include/hw/{riscv => gpio}/sifive_gpio.h (100%)
30
rename hw/{riscv => gpio}/sifive_gpio.c (99%)
31
delete mode 100644 hw/riscv/trace-events
32
13
33
diff --git a/hw/riscv/trace.h b/hw/riscv/trace.h
14
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
34
deleted file mode 100644
35
index XXXXXXX..XXXXXXX
36
--- a/hw/riscv/trace.h
37
+++ /dev/null
38
@@ -1 +0,0 @@
39
-#include "trace/trace-hw_riscv.h"
40
diff --git a/include/hw/riscv/sifive_gpio.h b/include/hw/gpio/sifive_gpio.h
41
similarity index 100%
42
rename from include/hw/riscv/sifive_gpio.h
43
rename to include/hw/gpio/sifive_gpio.h
44
diff --git a/include/hw/riscv/sifive_e.h b/include/hw/riscv/sifive_e.h
45
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
46
--- a/include/hw/riscv/sifive_e.h
16
--- a/target/riscv/helper.h
47
+++ b/include/hw/riscv/sifive_e.h
17
+++ b/target/riscv/helper.h
48
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vfredmin_vs_d, void, ptr, ptr, ptr, ptr, env, i32)
49
19
50
#include "hw/riscv/riscv_hart.h"
20
DEF_HELPER_6(vfwredsum_vs_h, void, ptr, ptr, ptr, ptr, env, i32)
51
#include "hw/riscv/sifive_cpu.h"
21
DEF_HELPER_6(vfwredsum_vs_w, void, ptr, ptr, ptr, ptr, env, i32)
52
-#include "hw/riscv/sifive_gpio.h"
22
+
53
+#include "hw/gpio/sifive_gpio.h"
23
+DEF_HELPER_6(vmand_mm, void, ptr, ptr, ptr, ptr, env, i32)
54
24
+DEF_HELPER_6(vmnand_mm, void, ptr, ptr, ptr, ptr, env, i32)
55
#define TYPE_RISCV_E_SOC "riscv.sifive.e.soc"
25
+DEF_HELPER_6(vmandnot_mm, void, ptr, ptr, ptr, ptr, env, i32)
56
#define RISCV_E_SOC(obj) \
26
+DEF_HELPER_6(vmxor_mm, void, ptr, ptr, ptr, ptr, env, i32)
57
diff --git a/include/hw/riscv/sifive_u.h b/include/hw/riscv/sifive_u.h
27
+DEF_HELPER_6(vmor_mm, void, ptr, ptr, ptr, ptr, env, i32)
28
+DEF_HELPER_6(vmnor_mm, void, ptr, ptr, ptr, ptr, env, i32)
29
+DEF_HELPER_6(vmornot_mm, void, ptr, ptr, ptr, ptr, env, i32)
30
+DEF_HELPER_6(vmxnor_mm, void, ptr, ptr, ptr, ptr, env, i32)
31
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
58
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
59
--- a/include/hw/riscv/sifive_u.h
33
--- a/target/riscv/insn32.decode
60
+++ b/include/hw/riscv/sifive_u.h
34
+++ b/target/riscv/insn32.decode
61
@@ -XXX,XX +XXX,XX @@
35
@@ -XXX,XX +XXX,XX @@ vfredmin_vs 000101 . ..... ..... 001 ..... 1010111 @r_vm
62
#include "hw/net/cadence_gem.h"
36
vfredmax_vs 000111 . ..... ..... 001 ..... 1010111 @r_vm
63
#include "hw/riscv/riscv_hart.h"
37
# Vector widening ordered and unordered float reduction sum
64
#include "hw/riscv/sifive_cpu.h"
38
vfwredsum_vs 1100-1 . ..... ..... 001 ..... 1010111 @r_vm
65
-#include "hw/riscv/sifive_gpio.h"
39
+vmand_mm 011001 - ..... ..... 010 ..... 1010111 @r
66
+#include "hw/gpio/sifive_gpio.h"
40
+vmnand_mm 011101 - ..... ..... 010 ..... 1010111 @r
67
#include "hw/misc/sifive_u_otp.h"
41
+vmandnot_mm 011000 - ..... ..... 010 ..... 1010111 @r
68
#include "hw/misc/sifive_u_prci.h"
42
+vmxor_mm 011011 - ..... ..... 010 ..... 1010111 @r
69
43
+vmor_mm 011010 - ..... ..... 010 ..... 1010111 @r
70
diff --git a/hw/riscv/sifive_gpio.c b/hw/gpio/sifive_gpio.c
44
+vmnor_mm 011110 - ..... ..... 010 ..... 1010111 @r
71
similarity index 99%
45
+vmornot_mm 011100 - ..... ..... 010 ..... 1010111 @r
72
rename from hw/riscv/sifive_gpio.c
46
+vmxnor_mm 011111 - ..... ..... 010 ..... 1010111 @r
73
rename to hw/gpio/sifive_gpio.c
47
48
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
49
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
50
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
74
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
75
--- a/hw/riscv/sifive_gpio.c
52
--- a/target/riscv/insn_trans/trans_rvv.inc.c
76
+++ b/hw/gpio/sifive_gpio.c
53
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
77
@@ -XXX,XX +XXX,XX @@
54
@@ -XXX,XX +XXX,XX @@ GEN_OPFVV_TRANS(vfredmin_vs, reduction_check)
78
#include "qemu/log.h"
55
79
#include "hw/irq.h"
56
/* Vector Widening Floating-Point Reduction Instructions */
80
#include "hw/qdev-properties.h"
57
GEN_OPFVV_WIDEN_TRANS(vfwredsum_vs, reduction_check)
81
-#include "hw/riscv/sifive_gpio.h"
58
+
82
+#include "hw/gpio/sifive_gpio.h"
59
+/*
83
#include "migration/vmstate.h"
60
+ *** Vector Mask Operations
84
#include "trace.h"
61
+ */
85
62
+
86
diff --git a/hw/gpio/Kconfig b/hw/gpio/Kconfig
63
+/* Vector Mask-Register Logical Instructions */
64
+#define GEN_MM_TRANS(NAME) \
65
+static bool trans_##NAME(DisasContext *s, arg_r *a) \
66
+{ \
67
+ if (vext_check_isa_ill(s)) { \
68
+ uint32_t data = 0; \
69
+ gen_helper_gvec_4_ptr *fn = gen_helper_##NAME; \
70
+ TCGLabel *over = gen_new_label(); \
71
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
72
+ \
73
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
74
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
75
+ tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0), \
76
+ vreg_ofs(s, a->rs1), \
77
+ vreg_ofs(s, a->rs2), cpu_env, 0, \
78
+ s->vlen / 8, data, fn); \
79
+ gen_set_label(over); \
80
+ return true; \
81
+ } \
82
+ return false; \
83
+}
84
+
85
+GEN_MM_TRANS(vmand_mm)
86
+GEN_MM_TRANS(vmnand_mm)
87
+GEN_MM_TRANS(vmandnot_mm)
88
+GEN_MM_TRANS(vmxor_mm)
89
+GEN_MM_TRANS(vmor_mm)
90
+GEN_MM_TRANS(vmnor_mm)
91
+GEN_MM_TRANS(vmornot_mm)
92
+GEN_MM_TRANS(vmxnor_mm)
93
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
87
index XXXXXXX..XXXXXXX 100644
94
index XXXXXXX..XXXXXXX 100644
88
--- a/hw/gpio/Kconfig
95
--- a/target/riscv/vector_helper.c
89
+++ b/hw/gpio/Kconfig
96
+++ b/target/riscv/vector_helper.c
90
@@ -XXX,XX +XXX,XX @@ config PL061
97
@@ -XXX,XX +XXX,XX @@ void HELPER(vfwredsum_vs_w)(void *vd, void *v0, void *vs1,
91
98
*((uint64_t *)vd) = s1;
92
config GPIO_KEY
99
clearq(vd, 1, sizeof(uint64_t), tot);
93
bool
100
}
94
+
101
+
95
+config SIFIVE_GPIO
102
+/*
96
+ bool
103
+ *** Vector Mask Operations
97
diff --git a/hw/gpio/meson.build b/hw/gpio/meson.build
104
+ */
98
index XXXXXXX..XXXXXXX 100644
105
+/* Vector Mask-Register Logical Instructions */
99
--- a/hw/gpio/meson.build
106
+#define GEN_VEXT_MASK_VV(NAME, OP) \
100
+++ b/hw/gpio/meson.build
107
+void HELPER(NAME)(void *vd, void *v0, void *vs1, \
101
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_NRF51_SOC', if_true: files('nrf51_gpio.c'))
108
+ void *vs2, CPURISCVState *env, \
102
softmmu_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_gpio.c'))
109
+ uint32_t desc) \
103
softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_gpio.c'))
110
+{ \
104
softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_gpio.c'))
111
+ uint32_t mlen = vext_mlen(desc); \
105
+softmmu_ss.add(when: 'CONFIG_SIFIVE_GPIO', if_true: files('sifive_gpio.c'))
112
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
106
diff --git a/hw/gpio/trace-events b/hw/gpio/trace-events
113
+ uint32_t vl = env->vl; \
107
index XXXXXXX..XXXXXXX 100644
114
+ uint32_t i; \
108
--- a/hw/gpio/trace-events
115
+ int a, b; \
109
+++ b/hw/gpio/trace-events
116
+ \
110
@@ -XXX,XX +XXX,XX @@ nrf51_gpio_read(uint64_t offset, uint64_t r) "offset 0x%" PRIx64 " value 0x%" PR
117
+ for (i = 0; i < vl; i++) { \
111
nrf51_gpio_write(uint64_t offset, uint64_t value) "offset 0x%" PRIx64 " value 0x%" PRIx64
118
+ a = vext_elem_mask(vs1, mlen, i); \
112
nrf51_gpio_set(int64_t line, int64_t value) "line %" PRIi64 " value %" PRIi64
119
+ b = vext_elem_mask(vs2, mlen, i); \
113
nrf51_gpio_update_output_irq(int64_t line, int64_t value) "line %" PRIi64 " value %" PRIi64
120
+ vext_set_elem_mask(vd, mlen, i, OP(b, a)); \
121
+ } \
122
+ for (; i < vlmax; i++) { \
123
+ vext_set_elem_mask(vd, mlen, i, 0); \
124
+ } \
125
+}
114
+
126
+
115
+# sifive_gpio.c
127
+#define DO_NAND(N, M) (!(N & M))
116
+sifive_gpio_read(uint64_t offset, uint64_t r) "offset 0x%" PRIx64 " value 0x%" PRIx64
128
+#define DO_ANDNOT(N, M) (N & !M)
117
+sifive_gpio_write(uint64_t offset, uint64_t value) "offset 0x%" PRIx64 " value 0x%" PRIx64
129
+#define DO_NOR(N, M) (!(N | M))
118
+sifive_gpio_set(int64_t line, int64_t value) "line %" PRIi64 " value %" PRIi64
130
+#define DO_ORNOT(N, M) (N | !M)
119
+sifive_gpio_update_output_irq(int64_t line, int64_t value) "line %" PRIi64 " value %" PRIi64
131
+#define DO_XNOR(N, M) (!(N ^ M))
120
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
132
+
121
index XXXXXXX..XXXXXXX 100644
133
+GEN_VEXT_MASK_VV(vmand_mm, DO_AND)
122
--- a/hw/riscv/Kconfig
134
+GEN_VEXT_MASK_VV(vmnand_mm, DO_NAND)
123
+++ b/hw/riscv/Kconfig
135
+GEN_VEXT_MASK_VV(vmandnot_mm, DO_ANDNOT)
124
@@ -XXX,XX +XXX,XX @@ config SIFIVE_E
136
+GEN_VEXT_MASK_VV(vmxor_mm, DO_XOR)
125
bool
137
+GEN_VEXT_MASK_VV(vmor_mm, DO_OR)
126
select HART
138
+GEN_VEXT_MASK_VV(vmnor_mm, DO_NOR)
127
select SIFIVE
139
+GEN_VEXT_MASK_VV(vmornot_mm, DO_ORNOT)
128
+ select SIFIVE_GPIO
140
+GEN_VEXT_MASK_VV(vmxnor_mm, DO_XNOR)
129
select SIFIVE_E_PRCI
130
select UNIMP
131
132
@@ -XXX,XX +XXX,XX @@ config SIFIVE_U
133
select CADENCE
134
select HART
135
select SIFIVE
136
+ select SIFIVE_GPIO
137
select SIFIVE_PDMA
138
select SIFIVE_U_OTP
139
select SIFIVE_U_PRCI
140
diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build
141
index XXXXXXX..XXXXXXX 100644
142
--- a/hw/riscv/meson.build
143
+++ b/hw/riscv/meson.build
144
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(when: 'CONFIG_HART', if_true: files('riscv_hart.c'))
145
riscv_ss.add(when: 'CONFIG_OPENTITAN', if_true: files('opentitan.c'))
146
riscv_ss.add(when: 'CONFIG_RISCV_VIRT', if_true: files('virt.c'))
147
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_clint.c'))
148
-riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_gpio.c'))
149
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_plic.c'))
150
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_test.c'))
151
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_uart.c'))
152
diff --git a/hw/riscv/trace-events b/hw/riscv/trace-events
153
deleted file mode 100644
154
index XXXXXXX..XXXXXXX
155
--- a/hw/riscv/trace-events
156
+++ /dev/null
157
@@ -XXX,XX +XXX,XX @@
158
-# See docs/devel/tracing.txt for syntax documentation.
159
-
160
-# hw/gpio/sifive_gpio.c
161
-sifive_gpio_read(uint64_t offset, uint64_t r) "offset 0x%" PRIx64 " value 0x%" PRIx64
162
-sifive_gpio_write(uint64_t offset, uint64_t value) "offset 0x%" PRIx64 " value 0x%" PRIx64
163
-sifive_gpio_set(int64_t line, int64_t value) "line %" PRIi64 " value %" PRIi64
164
-sifive_gpio_update_output_irq(int64_t line, int64_t value) "line %" PRIi64 " value %" PRIi64
165
diff --git a/meson.build b/meson.build
166
index XXXXXXX..XXXXXXX 100644
167
--- a/meson.build
168
+++ b/meson.build
169
@@ -XXX,XX +XXX,XX @@ if have_system
170
'hw/watchdog',
171
'hw/xen',
172
'hw/gpio',
173
- 'hw/riscv',
174
'migration',
175
'net',
176
'ui',
177
--
141
--
178
2.28.0
142
2.27.0
179
143
180
144
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
This is an effort to clean up the hw/riscv directory. Ideally it
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
should only contain the RISC-V SoC / machine codes plus generic
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
codes. Let's move sifive_u_otp model to hw/misc directory.
5
Message-Id: <20200701152549.1218-51-zhiwei_liu@c-sky.com>
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1599129623-68957-4-git-send-email-bmeng.cn@gmail.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
7
---
12
include/hw/{riscv => misc}/sifive_u_otp.h | 0
8
target/riscv/helper.h | 2 ++
13
include/hw/riscv/sifive_u.h | 2 +-
9
target/riscv/insn32.decode | 1 +
14
hw/{riscv => misc}/sifive_u_otp.c | 2 +-
10
target/riscv/insn_trans/trans_rvv.inc.c | 32 +++++++++++++++++++++++++
15
hw/misc/Kconfig | 3 +++
11
target/riscv/vector_helper.c | 20 ++++++++++++++++
16
hw/misc/meson.build | 1 +
12
4 files changed, 55 insertions(+)
17
hw/riscv/Kconfig | 1 +
18
hw/riscv/meson.build | 1 -
19
7 files changed, 7 insertions(+), 3 deletions(-)
20
rename include/hw/{riscv => misc}/sifive_u_otp.h (100%)
21
rename hw/{riscv => misc}/sifive_u_otp.c (99%)
22
13
23
diff --git a/include/hw/riscv/sifive_u_otp.h b/include/hw/misc/sifive_u_otp.h
14
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
24
similarity index 100%
25
rename from include/hw/riscv/sifive_u_otp.h
26
rename to include/hw/misc/sifive_u_otp.h
27
diff --git a/include/hw/riscv/sifive_u.h b/include/hw/riscv/sifive_u.h
28
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
29
--- a/include/hw/riscv/sifive_u.h
16
--- a/target/riscv/helper.h
30
+++ b/include/hw/riscv/sifive_u.h
17
+++ b/target/riscv/helper.h
31
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vmor_mm, void, ptr, ptr, ptr, ptr, env, i32)
32
#include "hw/riscv/riscv_hart.h"
19
DEF_HELPER_6(vmnor_mm, void, ptr, ptr, ptr, ptr, env, i32)
33
#include "hw/riscv/sifive_cpu.h"
20
DEF_HELPER_6(vmornot_mm, void, ptr, ptr, ptr, ptr, env, i32)
34
#include "hw/riscv/sifive_gpio.h"
21
DEF_HELPER_6(vmxnor_mm, void, ptr, ptr, ptr, ptr, env, i32)
35
-#include "hw/riscv/sifive_u_otp.h"
22
+
36
+#include "hw/misc/sifive_u_otp.h"
23
+DEF_HELPER_4(vmpopc_m, tl, ptr, ptr, env, i32)
37
#include "hw/misc/sifive_u_prci.h"
24
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
38
39
#define TYPE_RISCV_U_SOC "riscv.sifive.u.soc"
40
diff --git a/hw/riscv/sifive_u_otp.c b/hw/misc/sifive_u_otp.c
41
similarity index 99%
42
rename from hw/riscv/sifive_u_otp.c
43
rename to hw/misc/sifive_u_otp.c
44
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/riscv/sifive_u_otp.c
26
--- a/target/riscv/insn32.decode
46
+++ b/hw/misc/sifive_u_otp.c
27
+++ b/target/riscv/insn32.decode
47
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@ vmor_mm 011010 - ..... ..... 010 ..... 1010111 @r
48
#include "hw/sysbus.h"
29
vmnor_mm 011110 - ..... ..... 010 ..... 1010111 @r
49
#include "qemu/log.h"
30
vmornot_mm 011100 - ..... ..... 010 ..... 1010111 @r
50
#include "qemu/module.h"
31
vmxnor_mm 011111 - ..... ..... 010 ..... 1010111 @r
51
-#include "hw/riscv/sifive_u_otp.h"
32
+vmpopc_m 010100 . ..... ----- 010 ..... 1010111 @r2_vm
52
+#include "hw/misc/sifive_u_otp.h"
33
53
34
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
54
static uint64_t sifive_u_otp_read(void *opaque, hwaddr addr, unsigned int size)
35
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
55
{
36
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
56
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
57
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
58
--- a/hw/misc/Kconfig
38
--- a/target/riscv/insn_trans/trans_rvv.inc.c
59
+++ b/hw/misc/Kconfig
39
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
60
@@ -XXX,XX +XXX,XX @@ config AVR_POWER
40
@@ -XXX,XX +XXX,XX @@ GEN_MM_TRANS(vmor_mm)
61
config SIFIVE_E_PRCI
41
GEN_MM_TRANS(vmnor_mm)
62
bool
42
GEN_MM_TRANS(vmornot_mm)
63
43
GEN_MM_TRANS(vmxnor_mm)
64
+config SIFIVE_U_OTP
65
+ bool
66
+
44
+
67
config SIFIVE_U_PRCI
45
+/* Vector mask population count vmpopc */
68
bool
46
+static bool trans_vmpopc_m(DisasContext *s, arg_rmr *a)
69
47
+{
70
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
48
+ if (vext_check_isa_ill(s)) {
49
+ TCGv_ptr src2, mask;
50
+ TCGv dst;
51
+ TCGv_i32 desc;
52
+ uint32_t data = 0;
53
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
54
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
55
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
56
+
57
+ mask = tcg_temp_new_ptr();
58
+ src2 = tcg_temp_new_ptr();
59
+ dst = tcg_temp_new();
60
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
61
+
62
+ tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, a->rs2));
63
+ tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
64
+
65
+ gen_helper_vmpopc_m(dst, mask, src2, cpu_env, desc);
66
+ gen_set_gpr(a->rd, dst);
67
+
68
+ tcg_temp_free_ptr(mask);
69
+ tcg_temp_free_ptr(src2);
70
+ tcg_temp_free(dst);
71
+ tcg_temp_free_i32(desc);
72
+ return true;
73
+ }
74
+ return false;
75
+}
76
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
71
index XXXXXXX..XXXXXXX 100644
77
index XXXXXXX..XXXXXXX 100644
72
--- a/hw/misc/meson.build
78
--- a/target/riscv/vector_helper.c
73
+++ b/hw/misc/meson.build
79
+++ b/target/riscv/vector_helper.c
74
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_MOS6522', if_true: files('mos6522.c'))
80
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_MASK_VV(vmor_mm, DO_OR)
75
81
GEN_VEXT_MASK_VV(vmnor_mm, DO_NOR)
76
# RISC-V devices
82
GEN_VEXT_MASK_VV(vmornot_mm, DO_ORNOT)
77
softmmu_ss.add(when: 'CONFIG_SIFIVE_E_PRCI', if_true: files('sifive_e_prci.c'))
83
GEN_VEXT_MASK_VV(vmxnor_mm, DO_XNOR)
78
+softmmu_ss.add(when: 'CONFIG_SIFIVE_U_OTP', if_true: files('sifive_u_otp.c'))
84
+
79
softmmu_ss.add(when: 'CONFIG_SIFIVE_U_PRCI', if_true: files('sifive_u_prci.c'))
85
+/* Vector mask population count vmpopc */
80
86
+target_ulong HELPER(vmpopc_m)(void *v0, void *vs2, CPURISCVState *env,
81
# PKUnity SoC devices
87
+ uint32_t desc)
82
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
88
+{
83
index XXXXXXX..XXXXXXX 100644
89
+ target_ulong cnt = 0;
84
--- a/hw/riscv/Kconfig
90
+ uint32_t mlen = vext_mlen(desc);
85
+++ b/hw/riscv/Kconfig
91
+ uint32_t vm = vext_vm(desc);
86
@@ -XXX,XX +XXX,XX @@ config SIFIVE_U
92
+ uint32_t vl = env->vl;
87
select HART
93
+ int i;
88
select SIFIVE
94
+
89
select SIFIVE_PDMA
95
+ for (i = 0; i < vl; i++) {
90
+ select SIFIVE_U_OTP
96
+ if (vm || vext_elem_mask(v0, mlen, i)) {
91
select SIFIVE_U_PRCI
97
+ if (vext_elem_mask(vs2, mlen, i)) {
92
select UNIMP
98
+ cnt++;
93
99
+ }
94
diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build
100
+ }
95
index XXXXXXX..XXXXXXX 100644
101
+ }
96
--- a/hw/riscv/meson.build
102
+ return cnt;
97
+++ b/hw/riscv/meson.build
103
+}
98
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_test.c'))
99
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_uart.c'))
100
riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e.c'))
101
riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u.c'))
102
-riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u_otp.c'))
103
riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('riscv_htif.c'))
104
riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('spike.c'))
105
riscv_ss.add(when: 'CONFIG_MICROCHIP_PFSOC', if_true: files('microchip_pfsoc.c'))
106
--
104
--
107
2.28.0
105
2.27.0
108
106
109
107
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
This is an effort to clean up the hw/riscv directory. Ideally it
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
should only contain the RISC-V SoC / machine codes plus generic
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
codes. Let's move sifive_u_prci model to hw/misc directory.
5
Message-Id: <20200701152549.1218-52-zhiwei_liu@c-sky.com>
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1599129623-68957-3-git-send-email-bmeng.cn@gmail.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
7
---
12
include/hw/{riscv => misc}/sifive_u_prci.h | 0
8
target/riscv/helper.h | 2 ++
13
include/hw/riscv/sifive_u.h | 2 +-
9
target/riscv/insn32.decode | 1 +
14
hw/{riscv => misc}/sifive_u_prci.c | 2 +-
10
target/riscv/insn_trans/trans_rvv.inc.c | 32 +++++++++++++++++++++++++
15
hw/misc/Kconfig | 3 +++
11
target/riscv/vector_helper.c | 19 +++++++++++++++
16
hw/misc/meson.build | 1 +
12
4 files changed, 54 insertions(+)
17
hw/riscv/Kconfig | 1 +
18
hw/riscv/meson.build | 1 -
19
7 files changed, 7 insertions(+), 3 deletions(-)
20
rename include/hw/{riscv => misc}/sifive_u_prci.h (100%)
21
rename hw/{riscv => misc}/sifive_u_prci.c (99%)
22
13
23
diff --git a/include/hw/riscv/sifive_u_prci.h b/include/hw/misc/sifive_u_prci.h
14
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
24
similarity index 100%
25
rename from include/hw/riscv/sifive_u_prci.h
26
rename to include/hw/misc/sifive_u_prci.h
27
diff --git a/include/hw/riscv/sifive_u.h b/include/hw/riscv/sifive_u.h
28
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
29
--- a/include/hw/riscv/sifive_u.h
16
--- a/target/riscv/helper.h
30
+++ b/include/hw/riscv/sifive_u.h
17
+++ b/target/riscv/helper.h
31
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vmornot_mm, void, ptr, ptr, ptr, ptr, env, i32)
32
#include "hw/riscv/riscv_hart.h"
19
DEF_HELPER_6(vmxnor_mm, void, ptr, ptr, ptr, ptr, env, i32)
33
#include "hw/riscv/sifive_cpu.h"
20
34
#include "hw/riscv/sifive_gpio.h"
21
DEF_HELPER_4(vmpopc_m, tl, ptr, ptr, env, i32)
35
-#include "hw/riscv/sifive_u_prci.h"
22
+
36
#include "hw/riscv/sifive_u_otp.h"
23
+DEF_HELPER_4(vmfirst_m, tl, ptr, ptr, env, i32)
37
+#include "hw/misc/sifive_u_prci.h"
24
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
38
39
#define TYPE_RISCV_U_SOC "riscv.sifive.u.soc"
40
#define RISCV_U_SOC(obj) \
41
diff --git a/hw/riscv/sifive_u_prci.c b/hw/misc/sifive_u_prci.c
42
similarity index 99%
43
rename from hw/riscv/sifive_u_prci.c
44
rename to hw/misc/sifive_u_prci.c
45
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
46
--- a/hw/riscv/sifive_u_prci.c
26
--- a/target/riscv/insn32.decode
47
+++ b/hw/misc/sifive_u_prci.c
27
+++ b/target/riscv/insn32.decode
48
@@ -XXX,XX +XXX,XX @@
28
@@ -XXX,XX +XXX,XX @@ vmnor_mm 011110 - ..... ..... 010 ..... 1010111 @r
49
#include "hw/sysbus.h"
29
vmornot_mm 011100 - ..... ..... 010 ..... 1010111 @r
50
#include "qemu/log.h"
30
vmxnor_mm 011111 - ..... ..... 010 ..... 1010111 @r
51
#include "qemu/module.h"
31
vmpopc_m 010100 . ..... ----- 010 ..... 1010111 @r2_vm
52
-#include "hw/riscv/sifive_u_prci.h"
32
+vmfirst_m 010101 . ..... ----- 010 ..... 1010111 @r2_vm
53
+#include "hw/misc/sifive_u_prci.h"
33
54
34
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
55
static uint64_t sifive_u_prci_read(void *opaque, hwaddr addr, unsigned int size)
35
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
56
{
36
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
57
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
58
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
59
--- a/hw/misc/Kconfig
38
--- a/target/riscv/insn_trans/trans_rvv.inc.c
60
+++ b/hw/misc/Kconfig
39
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
61
@@ -XXX,XX +XXX,XX @@ config AVR_POWER
40
@@ -XXX,XX +XXX,XX @@ static bool trans_vmpopc_m(DisasContext *s, arg_rmr *a)
62
config SIFIVE_E_PRCI
41
}
63
bool
42
return false;
64
43
}
65
+config SIFIVE_U_PRCI
66
+ bool
67
+
44
+
68
source macio/Kconfig
45
+/* vmfirst find-first-set mask bit */
69
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
46
+static bool trans_vmfirst_m(DisasContext *s, arg_rmr *a)
47
+{
48
+ if (vext_check_isa_ill(s)) {
49
+ TCGv_ptr src2, mask;
50
+ TCGv dst;
51
+ TCGv_i32 desc;
52
+ uint32_t data = 0;
53
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
54
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
55
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
56
+
57
+ mask = tcg_temp_new_ptr();
58
+ src2 = tcg_temp_new_ptr();
59
+ dst = tcg_temp_new();
60
+ desc = tcg_const_i32(simd_desc(0, s->vlen / 8, data));
61
+
62
+ tcg_gen_addi_ptr(src2, cpu_env, vreg_ofs(s, a->rs2));
63
+ tcg_gen_addi_ptr(mask, cpu_env, vreg_ofs(s, 0));
64
+
65
+ gen_helper_vmfirst_m(dst, mask, src2, cpu_env, desc);
66
+ gen_set_gpr(a->rd, dst);
67
+
68
+ tcg_temp_free_ptr(mask);
69
+ tcg_temp_free_ptr(src2);
70
+ tcg_temp_free(dst);
71
+ tcg_temp_free_i32(desc);
72
+ return true;
73
+ }
74
+ return false;
75
+}
76
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
70
index XXXXXXX..XXXXXXX 100644
77
index XXXXXXX..XXXXXXX 100644
71
--- a/hw/misc/meson.build
78
--- a/target/riscv/vector_helper.c
72
+++ b/hw/misc/meson.build
79
+++ b/target/riscv/vector_helper.c
73
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_MOS6522', if_true: files('mos6522.c'))
80
@@ -XXX,XX +XXX,XX @@ target_ulong HELPER(vmpopc_m)(void *v0, void *vs2, CPURISCVState *env,
74
81
}
75
# RISC-V devices
82
return cnt;
76
softmmu_ss.add(when: 'CONFIG_SIFIVE_E_PRCI', if_true: files('sifive_e_prci.c'))
83
}
77
+softmmu_ss.add(when: 'CONFIG_SIFIVE_U_PRCI', if_true: files('sifive_u_prci.c'))
84
+
78
85
+/* vmfirst find-first-set mask bit*/
79
# PKUnity SoC devices
86
+target_ulong HELPER(vmfirst_m)(void *v0, void *vs2, CPURISCVState *env,
80
softmmu_ss.add(when: 'CONFIG_PUV3', if_true: files('puv3_pm.c'))
87
+ uint32_t desc)
81
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
88
+{
82
index XXXXXXX..XXXXXXX 100644
89
+ uint32_t mlen = vext_mlen(desc);
83
--- a/hw/riscv/Kconfig
90
+ uint32_t vm = vext_vm(desc);
84
+++ b/hw/riscv/Kconfig
91
+ uint32_t vl = env->vl;
85
@@ -XXX,XX +XXX,XX @@ config SIFIVE_U
92
+ int i;
86
select HART
93
+
87
select SIFIVE
94
+ for (i = 0; i < vl; i++) {
88
select SIFIVE_PDMA
95
+ if (vm || vext_elem_mask(v0, mlen, i)) {
89
+ select SIFIVE_U_PRCI
96
+ if (vext_elem_mask(vs2, mlen, i)) {
90
select UNIMP
97
+ return i;
91
98
+ }
92
config SPIKE
99
+ }
93
diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build
100
+ }
94
index XXXXXXX..XXXXXXX 100644
101
+ return -1LL;
95
--- a/hw/riscv/meson.build
102
+}
96
+++ b/hw/riscv/meson.build
97
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_uart.c'))
98
riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e.c'))
99
riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u.c'))
100
riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u_otp.c'))
101
-riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u_prci.c'))
102
riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('riscv_htif.c'))
103
riscv_ss.add(when: 'CONFIG_SPIKE', if_true: files('spike.c'))
104
riscv_ss.add(when: 'CONFIG_MICROCHIP_PFSOC', if_true: files('microchip_pfsoc.c'))
105
--
103
--
106
2.28.0
104
2.27.0
107
105
108
106
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
Microchip PolarFire SoC has 5 MMUARTs, and the Icicle Kit board
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
wires 4 of them out. Let's connect all 5 MMUARTs.
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
5
Message-Id: <20200701152549.1218-53-zhiwei_liu@c-sky.com>
6
Signed-off-by: Bin Meng <bin.meng@windriver.com>
7
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
8
Message-Id: <1598924352-89526-7-git-send-email-bmeng.cn@gmail.com>
9
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
10
---
7
---
11
include/hw/riscv/microchip_pfsoc.h | 20 ++++++++++++++++++++
8
target/riscv/helper.h | 4 ++
12
hw/riscv/microchip_pfsoc.c | 30 ++++++++++++++++++++++++++++++
9
target/riscv/insn32.decode | 3 ++
13
hw/riscv/Kconfig | 1 +
10
target/riscv/insn_trans/trans_rvv.inc.c | 28 +++++++++++
14
3 files changed, 51 insertions(+)
11
target/riscv/vector_helper.c | 63 +++++++++++++++++++++++++
12
4 files changed, 98 insertions(+)
15
13
16
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
14
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/riscv/microchip_pfsoc.h
16
--- a/target/riscv/helper.h
19
+++ b/include/hw/riscv/microchip_pfsoc.h
17
+++ b/target/riscv/helper.h
20
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vmxnor_mm, void, ptr, ptr, ptr, ptr, env, i32)
21
#ifndef HW_MICROCHIP_PFSOC_H
19
DEF_HELPER_4(vmpopc_m, tl, ptr, ptr, env, i32)
22
#define HW_MICROCHIP_PFSOC_H
20
23
21
DEF_HELPER_4(vmfirst_m, tl, ptr, ptr, env, i32)
24
+#include "hw/char/mchp_pfsoc_mmuart.h"
25
+
22
+
26
typedef struct MicrochipPFSoCState {
23
+DEF_HELPER_5(vmsbf_m, void, ptr, ptr, ptr, env, i32)
27
/*< private >*/
24
+DEF_HELPER_5(vmsif_m, void, ptr, ptr, ptr, env, i32)
28
DeviceState parent_obj;
25
+DEF_HELPER_5(vmsof_m, void, ptr, ptr, ptr, env, i32)
29
@@ -XXX,XX +XXX,XX @@ typedef struct MicrochipPFSoCState {
26
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
30
RISCVHartArrayState e_cpus;
27
index XXXXXXX..XXXXXXX 100644
31
RISCVHartArrayState u_cpus;
28
--- a/target/riscv/insn32.decode
32
DeviceState *plic;
29
+++ b/target/riscv/insn32.decode
33
+ MchpPfSoCMMUartState *serial0;
30
@@ -XXX,XX +XXX,XX @@ vmornot_mm 011100 - ..... ..... 010 ..... 1010111 @r
34
+ MchpPfSoCMMUartState *serial1;
31
vmxnor_mm 011111 - ..... ..... 010 ..... 1010111 @r
35
+ MchpPfSoCMMUartState *serial2;
32
vmpopc_m 010100 . ..... ----- 010 ..... 1010111 @r2_vm
36
+ MchpPfSoCMMUartState *serial3;
33
vmfirst_m 010101 . ..... ----- 010 ..... 1010111 @r2_vm
37
+ MchpPfSoCMMUartState *serial4;
34
+vmsbf_m 010110 . ..... 00001 010 ..... 1010111 @r2_vm
38
} MicrochipPFSoCState;
35
+vmsif_m 010110 . ..... 00011 010 ..... 1010111 @r2_vm
39
36
+vmsof_m 010110 . ..... 00010 010 ..... 1010111 @r2_vm
40
#define TYPE_MICROCHIP_PFSOC "microchip.pfsoc"
37
41
@@ -XXX,XX +XXX,XX @@ enum {
38
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
42
MICROCHIP_PFSOC_L2CC,
39
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
43
MICROCHIP_PFSOC_L2LIM,
40
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
44
MICROCHIP_PFSOC_PLIC,
41
index XXXXXXX..XXXXXXX 100644
45
+ MICROCHIP_PFSOC_MMUART0,
42
--- a/target/riscv/insn_trans/trans_rvv.inc.c
46
MICROCHIP_PFSOC_SYSREG,
43
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
47
MICROCHIP_PFSOC_MPUCFG,
44
@@ -XXX,XX +XXX,XX @@ static bool trans_vmfirst_m(DisasContext *s, arg_rmr *a)
48
+ MICROCHIP_PFSOC_MMUART1,
45
}
49
+ MICROCHIP_PFSOC_MMUART2,
46
return false;
50
+ MICROCHIP_PFSOC_MMUART3,
47
}
51
+ MICROCHIP_PFSOC_MMUART4,
48
+
52
MICROCHIP_PFSOC_ENVM_CFG,
49
+/* vmsbf.m set-before-first mask bit */
53
MICROCHIP_PFSOC_ENVM_DATA,
50
+/* vmsif.m set-includ-first mask bit */
54
MICROCHIP_PFSOC_IOSCB_CFG,
51
+/* vmsof.m set-only-first mask bit */
55
MICROCHIP_PFSOC_DRAM,
52
+#define GEN_M_TRANS(NAME) \
56
};
53
+static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
57
54
+{ \
58
+enum {
55
+ if (vext_check_isa_ill(s)) { \
59
+ MICROCHIP_PFSOC_MMUART0_IRQ = 90,
56
+ uint32_t data = 0; \
60
+ MICROCHIP_PFSOC_MMUART1_IRQ = 91,
57
+ gen_helper_gvec_3_ptr *fn = gen_helper_##NAME; \
61
+ MICROCHIP_PFSOC_MMUART2_IRQ = 92,
58
+ TCGLabel *over = gen_new_label(); \
62
+ MICROCHIP_PFSOC_MMUART3_IRQ = 93,
59
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over); \
63
+ MICROCHIP_PFSOC_MMUART4_IRQ = 94,
60
+ \
61
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen); \
62
+ data = FIELD_DP32(data, VDATA, VM, a->vm); \
63
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul); \
64
+ tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), \
65
+ vreg_ofs(s, 0), vreg_ofs(s, a->rs2), \
66
+ cpu_env, 0, s->vlen / 8, data, fn); \
67
+ gen_set_label(over); \
68
+ return true; \
69
+ } \
70
+ return false; \
71
+}
72
+
73
+GEN_M_TRANS(vmsbf_m)
74
+GEN_M_TRANS(vmsif_m)
75
+GEN_M_TRANS(vmsof_m)
76
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
77
index XXXXXXX..XXXXXXX 100644
78
--- a/target/riscv/vector_helper.c
79
+++ b/target/riscv/vector_helper.c
80
@@ -XXX,XX +XXX,XX @@ target_ulong HELPER(vmfirst_m)(void *v0, void *vs2, CPURISCVState *env,
81
}
82
return -1LL;
83
}
84
+
85
+enum set_mask_type {
86
+ ONLY_FIRST = 1,
87
+ INCLUDE_FIRST,
88
+ BEFORE_FIRST,
64
+};
89
+};
65
+
90
+
66
#define MICROCHIP_PFSOC_MANAGEMENT_CPU_COUNT 1
91
+static void vmsetm(void *vd, void *v0, void *vs2, CPURISCVState *env,
67
#define MICROCHIP_PFSOC_COMPUTE_CPU_COUNT 4
92
+ uint32_t desc, enum set_mask_type type)
68
93
+{
69
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
94
+ uint32_t mlen = vext_mlen(desc);
70
index XXXXXXX..XXXXXXX 100644
95
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen;
71
--- a/hw/riscv/microchip_pfsoc.c
96
+ uint32_t vm = vext_vm(desc);
72
+++ b/hw/riscv/microchip_pfsoc.c
97
+ uint32_t vl = env->vl;
73
@@ -XXX,XX +XXX,XX @@
98
+ int i;
74
* 0) CLINT (Core Level Interruptor)
99
+ bool first_mask_bit = false;
75
* 1) PLIC (Platform Level Interrupt Controller)
76
* 2) eNVM (Embedded Non-Volatile Memory)
77
+ * 3) MMUARTs (Multi-Mode UART)
78
*
79
* This board currently generates devicetree dynamically that indicates at least
80
* two harts and up to five harts.
81
@@ -XXX,XX +XXX,XX @@
82
#include "hw/irq.h"
83
#include "hw/loader.h"
84
#include "hw/sysbus.h"
85
+#include "chardev/char.h"
86
#include "hw/cpu/cluster.h"
87
#include "target/riscv/cpu.h"
88
#include "hw/misc/unimp.h"
89
@@ -XXX,XX +XXX,XX @@
90
#include "hw/riscv/sifive_clint.h"
91
#include "hw/riscv/sifive_plic.h"
92
#include "hw/riscv/microchip_pfsoc.h"
93
+#include "sysemu/sysemu.h"
94
95
/*
96
* The BIOS image used by this machine is called Hart Software Services (HSS).
97
@@ -XXX,XX +XXX,XX @@ static const struct MemmapEntry {
98
[MICROCHIP_PFSOC_L2CC] = { 0x2010000, 0x1000 },
99
[MICROCHIP_PFSOC_L2LIM] = { 0x8000000, 0x2000000 },
100
[MICROCHIP_PFSOC_PLIC] = { 0xc000000, 0x4000000 },
101
+ [MICROCHIP_PFSOC_MMUART0] = { 0x20000000, 0x1000 },
102
[MICROCHIP_PFSOC_SYSREG] = { 0x20002000, 0x2000 },
103
[MICROCHIP_PFSOC_MPUCFG] = { 0x20005000, 0x1000 },
104
+ [MICROCHIP_PFSOC_MMUART1] = { 0x20100000, 0x1000 },
105
+ [MICROCHIP_PFSOC_MMUART2] = { 0x20102000, 0x1000 },
106
+ [MICROCHIP_PFSOC_MMUART3] = { 0x20104000, 0x1000 },
107
+ [MICROCHIP_PFSOC_MMUART4] = { 0x20106000, 0x1000 },
108
[MICROCHIP_PFSOC_ENVM_CFG] = { 0x20200000, 0x1000 },
109
[MICROCHIP_PFSOC_ENVM_DATA] = { 0x20220000, 0x20000 },
110
[MICROCHIP_PFSOC_IOSCB_CFG] = { 0x37080000, 0x1000 },
111
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
112
memmap[MICROCHIP_PFSOC_MPUCFG].base,
113
memmap[MICROCHIP_PFSOC_MPUCFG].size);
114
115
+ /* MMUARTs */
116
+ s->serial0 = mchp_pfsoc_mmuart_create(system_memory,
117
+ memmap[MICROCHIP_PFSOC_MMUART0].base,
118
+ qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART0_IRQ),
119
+ serial_hd(0));
120
+ s->serial1 = mchp_pfsoc_mmuart_create(system_memory,
121
+ memmap[MICROCHIP_PFSOC_MMUART1].base,
122
+ qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART1_IRQ),
123
+ serial_hd(1));
124
+ s->serial2 = mchp_pfsoc_mmuart_create(system_memory,
125
+ memmap[MICROCHIP_PFSOC_MMUART2].base,
126
+ qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART2_IRQ),
127
+ serial_hd(2));
128
+ s->serial3 = mchp_pfsoc_mmuart_create(system_memory,
129
+ memmap[MICROCHIP_PFSOC_MMUART3].base,
130
+ qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART3_IRQ),
131
+ serial_hd(3));
132
+ s->serial4 = mchp_pfsoc_mmuart_create(system_memory,
133
+ memmap[MICROCHIP_PFSOC_MMUART4].base,
134
+ qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_MMUART4_IRQ),
135
+ serial_hd(4));
136
+
100
+
137
/* eNVM */
101
+ for (i = 0; i < vl; i++) {
138
memory_region_init_rom(envm_data, OBJECT(dev), "microchip.pfsoc.envm.data",
102
+ if (!vm && !vext_elem_mask(v0, mlen, i)) {
139
memmap[MICROCHIP_PFSOC_ENVM_DATA].size,
103
+ continue;
140
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
104
+ }
141
index XXXXXXX..XXXXXXX 100644
105
+ /* write a zero to all following active elements */
142
--- a/hw/riscv/Kconfig
106
+ if (first_mask_bit) {
143
+++ b/hw/riscv/Kconfig
107
+ vext_set_elem_mask(vd, mlen, i, 0);
144
@@ -XXX,XX +XXX,XX @@ config MICROCHIP_PFSOC
108
+ continue;
145
select HART
109
+ }
146
select SIFIVE
110
+ if (vext_elem_mask(vs2, mlen, i)) {
147
select UNIMP
111
+ first_mask_bit = true;
148
+ select MCHP_PFSOC_MMUART
112
+ if (type == BEFORE_FIRST) {
113
+ vext_set_elem_mask(vd, mlen, i, 0);
114
+ } else {
115
+ vext_set_elem_mask(vd, mlen, i, 1);
116
+ }
117
+ } else {
118
+ if (type == ONLY_FIRST) {
119
+ vext_set_elem_mask(vd, mlen, i, 0);
120
+ } else {
121
+ vext_set_elem_mask(vd, mlen, i, 1);
122
+ }
123
+ }
124
+ }
125
+ for (; i < vlmax; i++) {
126
+ vext_set_elem_mask(vd, mlen, i, 0);
127
+ }
128
+}
129
+
130
+void HELPER(vmsbf_m)(void *vd, void *v0, void *vs2, CPURISCVState *env,
131
+ uint32_t desc)
132
+{
133
+ vmsetm(vd, v0, vs2, env, desc, BEFORE_FIRST);
134
+}
135
+
136
+void HELPER(vmsif_m)(void *vd, void *v0, void *vs2, CPURISCVState *env,
137
+ uint32_t desc)
138
+{
139
+ vmsetm(vd, v0, vs2, env, desc, INCLUDE_FIRST);
140
+}
141
+
142
+void HELPER(vmsof_m)(void *vd, void *v0, void *vs2, CPURISCVState *env,
143
+ uint32_t desc)
144
+{
145
+ vmsetm(vd, v0, vs2, env, desc, ONLY_FIRST);
146
+}
149
--
147
--
150
2.28.0
148
2.27.0
151
149
152
150
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
This is an effort to clean up the hw/riscv directory. Ideally it
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
should only contain the RISC-V SoC / machine codes plus generic
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
codes. Let's move sifive_e_prci model to hw/misc directory.
5
Message-Id: <20200701152549.1218-54-zhiwei_liu@c-sky.com>
6
7
Signed-off-by: Bin Meng <bin.meng@windriver.com>
8
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
9
Message-Id: <1599129623-68957-2-git-send-email-bmeng.cn@gmail.com>
10
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
11
---
7
---
12
include/hw/{riscv => misc}/sifive_e_prci.h | 0
8
target/riscv/helper.h | 5 +++++
13
hw/{riscv => misc}/sifive_e_prci.c | 2 +-
9
target/riscv/insn32.decode | 1 +
14
hw/riscv/sifive_e.c | 2 +-
10
target/riscv/insn_trans/trans_rvv.inc.c | 27 +++++++++++++++++++++++
15
hw/misc/Kconfig | 3 +++
11
target/riscv/vector_helper.c | 29 +++++++++++++++++++++++++
16
hw/misc/meson.build | 3 +++
12
4 files changed, 62 insertions(+)
17
hw/riscv/Kconfig | 1 +
18
hw/riscv/meson.build | 1 -
19
7 files changed, 9 insertions(+), 3 deletions(-)
20
rename include/hw/{riscv => misc}/sifive_e_prci.h (100%)
21
rename hw/{riscv => misc}/sifive_e_prci.c (99%)
22
13
23
diff --git a/include/hw/riscv/sifive_e_prci.h b/include/hw/misc/sifive_e_prci.h
14
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
24
similarity index 100%
25
rename from include/hw/riscv/sifive_e_prci.h
26
rename to include/hw/misc/sifive_e_prci.h
27
diff --git a/hw/riscv/sifive_e_prci.c b/hw/misc/sifive_e_prci.c
28
similarity index 99%
29
rename from hw/riscv/sifive_e_prci.c
30
rename to hw/misc/sifive_e_prci.c
31
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
32
--- a/hw/riscv/sifive_e_prci.c
16
--- a/target/riscv/helper.h
33
+++ b/hw/misc/sifive_e_prci.c
17
+++ b/target/riscv/helper.h
34
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_4(vmfirst_m, tl, ptr, ptr, env, i32)
35
#include "qemu/log.h"
19
DEF_HELPER_5(vmsbf_m, void, ptr, ptr, ptr, env, i32)
36
#include "qemu/module.h"
20
DEF_HELPER_5(vmsif_m, void, ptr, ptr, ptr, env, i32)
37
#include "hw/hw.h"
21
DEF_HELPER_5(vmsof_m, void, ptr, ptr, ptr, env, i32)
38
-#include "hw/riscv/sifive_e_prci.h"
22
+
39
+#include "hw/misc/sifive_e_prci.h"
23
+DEF_HELPER_5(viota_m_b, void, ptr, ptr, ptr, env, i32)
40
24
+DEF_HELPER_5(viota_m_h, void, ptr, ptr, ptr, env, i32)
41
static uint64_t sifive_e_prci_read(void *opaque, hwaddr addr, unsigned int size)
25
+DEF_HELPER_5(viota_m_w, void, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_5(viota_m_d, void, ptr, ptr, ptr, env, i32)
27
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/riscv/insn32.decode
30
+++ b/target/riscv/insn32.decode
31
@@ -XXX,XX +XXX,XX @@ vmfirst_m 010101 . ..... ----- 010 ..... 1010111 @r2_vm
32
vmsbf_m 010110 . ..... 00001 010 ..... 1010111 @r2_vm
33
vmsif_m 010110 . ..... 00011 010 ..... 1010111 @r2_vm
34
vmsof_m 010110 . ..... 00010 010 ..... 1010111 @r2_vm
35
+viota_m 010110 . ..... 10000 010 ..... 1010111 @r2_vm
36
37
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
38
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
39
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/riscv/insn_trans/trans_rvv.inc.c
42
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
43
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rmr *a) \
44
GEN_M_TRANS(vmsbf_m)
45
GEN_M_TRANS(vmsif_m)
46
GEN_M_TRANS(vmsof_m)
47
+
48
+/* Vector Iota Instruction */
49
+static bool trans_viota_m(DisasContext *s, arg_viota_m *a)
50
+{
51
+ if (vext_check_isa_ill(s) &&
52
+ vext_check_reg(s, a->rd, false) &&
53
+ vext_check_overlap_group(a->rd, 1 << s->lmul, a->rs2, 1) &&
54
+ (a->vm != 0 || a->rd != 0)) {
55
+ uint32_t data = 0;
56
+ TCGLabel *over = gen_new_label();
57
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
58
+
59
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
60
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
61
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
62
+ static gen_helper_gvec_3_ptr * const fns[4] = {
63
+ gen_helper_viota_m_b, gen_helper_viota_m_h,
64
+ gen_helper_viota_m_w, gen_helper_viota_m_d,
65
+ };
66
+ tcg_gen_gvec_3_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
67
+ vreg_ofs(s, a->rs2), cpu_env, 0,
68
+ s->vlen / 8, data, fns[s->sew]);
69
+ gen_set_label(over);
70
+ return true;
71
+ }
72
+ return false;
73
+}
74
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/target/riscv/vector_helper.c
77
+++ b/target/riscv/vector_helper.c
78
@@ -XXX,XX +XXX,XX @@ void HELPER(vmsof_m)(void *vd, void *v0, void *vs2, CPURISCVState *env,
42
{
79
{
43
diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
80
vmsetm(vd, v0, vs2, env, desc, ONLY_FIRST);
44
index XXXXXXX..XXXXXXX 100644
81
}
45
--- a/hw/riscv/sifive_e.c
46
+++ b/hw/riscv/sifive_e.c
47
@@ -XXX,XX +XXX,XX @@
48
#include "hw/riscv/sifive_clint.h"
49
#include "hw/riscv/sifive_uart.h"
50
#include "hw/riscv/sifive_e.h"
51
-#include "hw/riscv/sifive_e_prci.h"
52
#include "hw/riscv/boot.h"
53
+#include "hw/misc/sifive_e_prci.h"
54
#include "chardev/char.h"
55
#include "sysemu/arch_init.h"
56
#include "sysemu/sysemu.h"
57
diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig
58
index XXXXXXX..XXXXXXX 100644
59
--- a/hw/misc/Kconfig
60
+++ b/hw/misc/Kconfig
61
@@ -XXX,XX +XXX,XX @@ config MAC_VIA
62
config AVR_POWER
63
bool
64
65
+config SIFIVE_E_PRCI
66
+ bool
67
+
82
+
68
source macio/Kconfig
83
+/* Vector Iota Instruction */
69
diff --git a/hw/misc/meson.build b/hw/misc/meson.build
84
+#define GEN_VEXT_VIOTA_M(NAME, ETYPE, H, CLEAR_FN) \
70
index XXXXXXX..XXXXXXX 100644
85
+void HELPER(NAME)(void *vd, void *v0, void *vs2, CPURISCVState *env, \
71
--- a/hw/misc/meson.build
86
+ uint32_t desc) \
72
+++ b/hw/misc/meson.build
87
+{ \
73
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_ARM11SCU', if_true: files('arm11scu.c'))
88
+ uint32_t mlen = vext_mlen(desc); \
74
# Mac devices
89
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
75
softmmu_ss.add(when: 'CONFIG_MOS6522', if_true: files('mos6522.c'))
90
+ uint32_t vm = vext_vm(desc); \
76
91
+ uint32_t vl = env->vl; \
77
+# RISC-V devices
92
+ uint32_t sum = 0; \
78
+softmmu_ss.add(when: 'CONFIG_SIFIVE_E_PRCI', if_true: files('sifive_e_prci.c'))
93
+ int i; \
94
+ \
95
+ for (i = 0; i < vl; i++) { \
96
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
97
+ continue; \
98
+ } \
99
+ *((ETYPE *)vd + H(i)) = sum; \
100
+ if (vext_elem_mask(vs2, mlen, i)) { \
101
+ sum++; \
102
+ } \
103
+ } \
104
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
105
+}
79
+
106
+
80
# PKUnity SoC devices
107
+GEN_VEXT_VIOTA_M(viota_m_b, uint8_t, H1, clearb)
81
softmmu_ss.add(when: 'CONFIG_PUV3', if_true: files('puv3_pm.c'))
108
+GEN_VEXT_VIOTA_M(viota_m_h, uint16_t, H2, clearh)
82
109
+GEN_VEXT_VIOTA_M(viota_m_w, uint32_t, H4, clearl)
83
diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig
110
+GEN_VEXT_VIOTA_M(viota_m_d, uint64_t, H8, clearq)
84
index XXXXXXX..XXXXXXX 100644
85
--- a/hw/riscv/Kconfig
86
+++ b/hw/riscv/Kconfig
87
@@ -XXX,XX +XXX,XX @@ config SIFIVE_E
88
bool
89
select HART
90
select SIFIVE
91
+ select SIFIVE_E_PRCI
92
select UNIMP
93
94
config SIFIVE_U
95
diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build
96
index XXXXXXX..XXXXXXX 100644
97
--- a/hw/riscv/meson.build
98
+++ b/hw/riscv/meson.build
99
@@ -XXX,XX +XXX,XX @@ riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_plic.c'))
100
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_test.c'))
101
riscv_ss.add(when: 'CONFIG_SIFIVE', if_true: files('sifive_uart.c'))
102
riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e.c'))
103
-riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e_prci.c'))
104
riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u.c'))
105
riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u_otp.c'))
106
riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u_prci.c'))
107
--
111
--
108
2.28.0
112
2.27.0
109
113
110
114
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
Microchip PolarFire SoC integrates 3 GPIOs controllers. It seems
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
enough to create unimplemented devices to cover their register
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
spaces at this point.
5
Message-Id: <20200701152549.1218-55-zhiwei_liu@c-sky.com>
6
7
With this commit, QEMU can boot to U-Boot (2nd stage bootloader)
8
all the way to the Linux shell login prompt, with a modified HSS
9
(1st stage bootloader).
10
11
For detailed instructions on how to create images for the Icicle
12
Kit board, please check QEMU RISC-V WiKi page at:
13
https://wiki.qemu.org/Documentation/Platforms/RISCV
14
15
Signed-off-by: Bin Meng <bin.meng@windriver.com>
16
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
17
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
18
Message-Id: <1598924352-89526-15-git-send-email-bmeng.cn@gmail.com>
19
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
20
---
7
---
21
include/hw/riscv/microchip_pfsoc.h | 3 +++
8
target/riscv/helper.h | 5 +++++
22
hw/riscv/microchip_pfsoc.c | 14 ++++++++++++++
9
target/riscv/insn32.decode | 2 ++
23
2 files changed, 17 insertions(+)
10
target/riscv/insn_trans/trans_rvv.inc.c | 25 +++++++++++++++++++++++++
11
target/riscv/vector_helper.c | 24 ++++++++++++++++++++++++
12
4 files changed, 56 insertions(+)
24
13
25
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
14
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
26
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
27
--- a/include/hw/riscv/microchip_pfsoc.h
16
--- a/target/riscv/helper.h
28
+++ b/include/hw/riscv/microchip_pfsoc.h
17
+++ b/target/riscv/helper.h
29
@@ -XXX,XX +XXX,XX @@ enum {
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_5(viota_m_b, void, ptr, ptr, ptr, env, i32)
30
MICROCHIP_PFSOC_MMUART4,
19
DEF_HELPER_5(viota_m_h, void, ptr, ptr, ptr, env, i32)
31
MICROCHIP_PFSOC_GEM0,
20
DEF_HELPER_5(viota_m_w, void, ptr, ptr, ptr, env, i32)
32
MICROCHIP_PFSOC_GEM1,
21
DEF_HELPER_5(viota_m_d, void, ptr, ptr, ptr, env, i32)
33
+ MICROCHIP_PFSOC_GPIO0,
22
+
34
+ MICROCHIP_PFSOC_GPIO1,
23
+DEF_HELPER_4(vid_v_b, void, ptr, ptr, env, i32)
35
+ MICROCHIP_PFSOC_GPIO2,
24
+DEF_HELPER_4(vid_v_h, void, ptr, ptr, env, i32)
36
MICROCHIP_PFSOC_ENVM_CFG,
25
+DEF_HELPER_4(vid_v_w, void, ptr, ptr, env, i32)
37
MICROCHIP_PFSOC_ENVM_DATA,
26
+DEF_HELPER_4(vid_v_d, void, ptr, ptr, env, i32)
38
MICROCHIP_PFSOC_IOSCB_CFG,
27
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
39
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
40
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
41
--- a/hw/riscv/microchip_pfsoc.c
29
--- a/target/riscv/insn32.decode
42
+++ b/hw/riscv/microchip_pfsoc.c
30
+++ b/target/riscv/insn32.decode
43
@@ -XXX,XX +XXX,XX @@ static const struct MemmapEntry {
31
@@ -XXX,XX +XXX,XX @@
44
[MICROCHIP_PFSOC_MMUART4] = { 0x20106000, 0x1000 },
32
@r2 ....... ..... ..... ... ..... ....... %rs1 %rd
45
[MICROCHIP_PFSOC_GEM0] = { 0x20110000, 0x2000 },
33
@r2_nfvm ... ... vm:1 ..... ..... ... ..... ....... &r2nfvm %nf %rs1 %rd
46
[MICROCHIP_PFSOC_GEM1] = { 0x20112000, 0x2000 },
34
@r2_vm ...... vm:1 ..... ..... ... ..... ....... &rmr %rs2 %rd
47
+ [MICROCHIP_PFSOC_GPIO0] = { 0x20120000, 0x1000 },
35
+@r1_vm ...... vm:1 ..... ..... ... ..... ....... %rd
48
+ [MICROCHIP_PFSOC_GPIO1] = { 0x20121000, 0x1000 },
36
@r_nfvm ... ... vm:1 ..... ..... ... ..... ....... &rnfvm %nf %rs2 %rs1 %rd
49
+ [MICROCHIP_PFSOC_GPIO2] = { 0x20122000, 0x1000 },
37
@r_vm ...... vm:1 ..... ..... ... ..... ....... &rmrr %rs2 %rs1 %rd
50
[MICROCHIP_PFSOC_ENVM_CFG] = { 0x20200000, 0x1000 },
38
@r_vm_1 ...... . ..... ..... ... ..... ....... &rmrr vm=1 %rs2 %rs1 %rd
51
[MICROCHIP_PFSOC_ENVM_DATA] = { 0x20220000, 0x20000 },
39
@@ -XXX,XX +XXX,XX @@ vmsbf_m 010110 . ..... 00001 010 ..... 1010111 @r2_vm
52
[MICROCHIP_PFSOC_IOSCB_CFG] = { 0x37080000, 0x1000 },
40
vmsif_m 010110 . ..... 00011 010 ..... 1010111 @r2_vm
53
@@ -XXX,XX +XXX,XX @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
41
vmsof_m 010110 . ..... 00010 010 ..... 1010111 @r2_vm
54
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gem1), 0,
42
viota_m 010110 . ..... 10000 010 ..... 1010111 @r2_vm
55
qdev_get_gpio_in(DEVICE(s->plic), MICROCHIP_PFSOC_GEM1_IRQ));
43
+vid_v 010110 . 00000 10001 010 ..... 1010111 @r1_vm
56
44
57
+ /* GPIOs */
45
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
58
+ create_unimplemented_device("microchip.pfsoc.gpio0",
46
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
59
+ memmap[MICROCHIP_PFSOC_GPIO0].base,
47
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
60
+ memmap[MICROCHIP_PFSOC_GPIO0].size);
48
index XXXXXXX..XXXXXXX 100644
61
+ create_unimplemented_device("microchip.pfsoc.gpio1",
49
--- a/target/riscv/insn_trans/trans_rvv.inc.c
62
+ memmap[MICROCHIP_PFSOC_GPIO1].base,
50
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
63
+ memmap[MICROCHIP_PFSOC_GPIO1].size);
51
@@ -XXX,XX +XXX,XX @@ static bool trans_viota_m(DisasContext *s, arg_viota_m *a)
64
+ create_unimplemented_device("microchip.pfsoc.gpio2",
52
}
65
+ memmap[MICROCHIP_PFSOC_GPIO2].base,
53
return false;
66
+ memmap[MICROCHIP_PFSOC_GPIO2].size);
54
}
67
+
55
+
68
/* eNVM */
56
+/* Vector Element Index Instruction */
69
memory_region_init_rom(envm_data, OBJECT(dev), "microchip.pfsoc.envm.data",
57
+static bool trans_vid_v(DisasContext *s, arg_vid_v *a)
70
memmap[MICROCHIP_PFSOC_ENVM_DATA].size,
58
+{
59
+ if (vext_check_isa_ill(s) &&
60
+ vext_check_reg(s, a->rd, false) &&
61
+ vext_check_overlap_mask(s, a->rd, a->vm, false)) {
62
+ uint32_t data = 0;
63
+ TCGLabel *over = gen_new_label();
64
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
65
+
66
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
67
+ data = FIELD_DP32(data, VDATA, VM, a->vm);
68
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
69
+ static gen_helper_gvec_2_ptr * const fns[4] = {
70
+ gen_helper_vid_v_b, gen_helper_vid_v_h,
71
+ gen_helper_vid_v_w, gen_helper_vid_v_d,
72
+ };
73
+ tcg_gen_gvec_2_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
74
+ cpu_env, 0, s->vlen / 8, data, fns[s->sew]);
75
+ gen_set_label(over);
76
+ return true;
77
+ }
78
+ return false;
79
+}
80
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
81
index XXXXXXX..XXXXXXX 100644
82
--- a/target/riscv/vector_helper.c
83
+++ b/target/riscv/vector_helper.c
84
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VIOTA_M(viota_m_b, uint8_t, H1, clearb)
85
GEN_VEXT_VIOTA_M(viota_m_h, uint16_t, H2, clearh)
86
GEN_VEXT_VIOTA_M(viota_m_w, uint32_t, H4, clearl)
87
GEN_VEXT_VIOTA_M(viota_m_d, uint64_t, H8, clearq)
88
+
89
+/* Vector Element Index Instruction */
90
+#define GEN_VEXT_VID_V(NAME, ETYPE, H, CLEAR_FN) \
91
+void HELPER(NAME)(void *vd, void *v0, CPURISCVState *env, uint32_t desc) \
92
+{ \
93
+ uint32_t mlen = vext_mlen(desc); \
94
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
95
+ uint32_t vm = vext_vm(desc); \
96
+ uint32_t vl = env->vl; \
97
+ int i; \
98
+ \
99
+ for (i = 0; i < vl; i++) { \
100
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
101
+ continue; \
102
+ } \
103
+ *((ETYPE *)vd + H(i)) = i; \
104
+ } \
105
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
106
+}
107
+
108
+GEN_VEXT_VID_V(vid_v_b, uint8_t, H1, clearb)
109
+GEN_VEXT_VID_V(vid_v_h, uint16_t, H2, clearh)
110
+GEN_VEXT_VID_V(vid_v_w, uint32_t, H4, clearl)
111
+GEN_VEXT_VID_V(vid_v_d, uint64_t, H8, clearq)
71
--
112
--
72
2.28.0
113
2.27.0
73
114
74
115
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
Cadence SD/SDIO/eMMC Host Controller (SD4HC) is an SDHCI compatible
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
controller. The SDHCI compatible registers start from offset 0x200,
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
which are called Slot Register Set (SRS) in its datasheet.
5
Message-Id: <20200701152549.1218-56-zhiwei_liu@c-sky.com>
6
7
This creates a Cadence SDHCI model built on top of the existing
8
generic SDHCI model. Cadence specific Host Register Set (HRS) is
9
implemented to make guest software happy.
10
11
Signed-off-by: Bin Meng <bin.meng@windriver.com>
12
Acked-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Acked-by: Alistair Francis <alistair.francis@wdc.com>
14
Message-Id: <1598924352-89526-8-git-send-email-bmeng.cn@gmail.com>
15
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
16
---
7
---
17
include/hw/sd/cadence_sdhci.h | 47 +++++++++
8
target/riscv/insn32.decode | 1 +
18
hw/sd/cadence_sdhci.c | 193 ++++++++++++++++++++++++++++++++++
9
target/riscv/insn_trans/trans_rvv.inc.c | 116 ++++++++++++++++++++++++
19
hw/sd/Kconfig | 4 +
10
2 files changed, 117 insertions(+)
20
hw/sd/meson.build | 1 +
21
4 files changed, 245 insertions(+)
22
create mode 100644 include/hw/sd/cadence_sdhci.h
23
create mode 100644 hw/sd/cadence_sdhci.c
24
11
25
diff --git a/include/hw/sd/cadence_sdhci.h b/include/hw/sd/cadence_sdhci.h
12
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
26
new file mode 100644
13
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX
14
--- a/target/riscv/insn32.decode
28
--- /dev/null
15
+++ b/target/riscv/insn32.decode
29
+++ b/include/hw/sd/cadence_sdhci.h
16
@@ -XXX,XX +XXX,XX @@ vmsif_m 010110 . ..... 00011 010 ..... 1010111 @r2_vm
30
@@ -XXX,XX +XXX,XX @@
17
vmsof_m 010110 . ..... 00010 010 ..... 1010111 @r2_vm
18
viota_m 010110 . ..... 10000 010 ..... 1010111 @r2_vm
19
vid_v 010110 . 00000 10001 010 ..... 1010111 @r1_vm
20
+vext_x_v 001100 1 ..... ..... 010 ..... 1010111 @r
21
22
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
23
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
24
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/target/riscv/insn_trans/trans_rvv.inc.c
27
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
28
@@ -XXX,XX +XXX,XX @@ static bool trans_vid_v(DisasContext *s, arg_vid_v *a)
29
}
30
return false;
31
}
32
+
31
+/*
33
+/*
32
+ * Cadence SDHCI emulation
34
+ *** Vector Permutation Instructions
33
+ *
34
+ * Copyright (c) 2020 Wind River Systems, Inc.
35
+ *
36
+ * Author:
37
+ * Bin Meng <bin.meng@windriver.com>
38
+ *
39
+ * This program is free software; you can redistribute it and/or
40
+ * modify it under the terms of the GNU General Public License as
41
+ * published by the Free Software Foundation; either version 2 or
42
+ * (at your option) version 3 of the License.
43
+ *
44
+ * This program is distributed in the hope that it will be useful,
45
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
46
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
47
+ * GNU General Public License for more details.
48
+ *
49
+ * You should have received a copy of the GNU General Public License along
50
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
51
+ */
35
+ */
52
+
36
+
53
+#ifndef CADENCE_SDHCI_H
37
+/* Integer Extract Instruction */
54
+#define CADENCE_SDHCI_H
55
+
38
+
56
+#include "hw/sd/sdhci.h"
39
+static void load_element(TCGv_i64 dest, TCGv_ptr base,
57
+
40
+ int ofs, int sew)
58
+#define CADENCE_SDHCI_REG_SIZE 0x100
59
+#define CADENCE_SDHCI_NUM_REGS (CADENCE_SDHCI_REG_SIZE / sizeof(uint32_t))
60
+
61
+typedef struct CadenceSDHCIState {
62
+ SysBusDevice parent;
63
+
64
+ MemoryRegion container;
65
+ MemoryRegion iomem;
66
+ BusState *bus;
67
+
68
+ uint32_t regs[CADENCE_SDHCI_NUM_REGS];
69
+
70
+ SDHCIState sdhci;
71
+} CadenceSDHCIState;
72
+
73
+#define TYPE_CADENCE_SDHCI "cadence.sdhci"
74
+#define CADENCE_SDHCI(obj) OBJECT_CHECK(CadenceSDHCIState, (obj), \
75
+ TYPE_CADENCE_SDHCI)
76
+
77
+#endif /* CADENCE_SDHCI_H */
78
diff --git a/hw/sd/cadence_sdhci.c b/hw/sd/cadence_sdhci.c
79
new file mode 100644
80
index XXXXXXX..XXXXXXX
81
--- /dev/null
82
+++ b/hw/sd/cadence_sdhci.c
83
@@ -XXX,XX +XXX,XX @@
84
+/*
85
+ * Cadence SDHCI emulation
86
+ *
87
+ * Copyright (c) 2020 Wind River Systems, Inc.
88
+ *
89
+ * Author:
90
+ * Bin Meng <bin.meng@windriver.com>
91
+ *
92
+ * This program is free software; you can redistribute it and/or
93
+ * modify it under the terms of the GNU General Public License as
94
+ * published by the Free Software Foundation; either version 2 or
95
+ * (at your option) version 3 of the License.
96
+ *
97
+ * This program is distributed in the hope that it will be useful,
98
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
99
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
100
+ * GNU General Public License for more details.
101
+ *
102
+ * You should have received a copy of the GNU General Public License along
103
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
104
+ */
105
+
106
+#include "qemu/osdep.h"
107
+#include "qemu/bitops.h"
108
+#include "qemu/error-report.h"
109
+#include "qemu/log.h"
110
+#include "qapi/error.h"
111
+#include "migration/vmstate.h"
112
+#include "hw/irq.h"
113
+#include "hw/sd/cadence_sdhci.h"
114
+#include "sdhci-internal.h"
115
+
116
+/* HRS - Host Register Set (specific to Cadence) */
117
+
118
+#define CADENCE_SDHCI_HRS00 0x00 /* general information */
119
+#define CADENCE_SDHCI_HRS00_SWR BIT(0)
120
+#define CADENCE_SDHCI_HRS00_POR_VAL 0x00010000
121
+
122
+#define CADENCE_SDHCI_HRS04 0x10 /* PHY access port */
123
+#define CADENCE_SDHCI_HRS04_WR BIT(24)
124
+#define CADENCE_SDHCI_HRS04_RD BIT(25)
125
+#define CADENCE_SDHCI_HRS04_ACK BIT(26)
126
+
127
+#define CADENCE_SDHCI_HRS06 0x18 /* eMMC control */
128
+#define CADENCE_SDHCI_HRS06_TUNE_UP BIT(15)
129
+
130
+/* SRS - Slot Register Set (SDHCI-compatible) */
131
+
132
+#define CADENCE_SDHCI_SRS_BASE 0x200
133
+
134
+#define TO_REG(addr) ((addr) / sizeof(uint32_t))
135
+
136
+static void cadence_sdhci_instance_init(Object *obj)
137
+{
41
+{
138
+ CadenceSDHCIState *s = CADENCE_SDHCI(obj);
42
+ switch (sew) {
139
+
43
+ case MO_8:
140
+ object_initialize_child(OBJECT(s), "generic-sdhci",
44
+ tcg_gen_ld8u_i64(dest, base, ofs);
141
+ &s->sdhci, TYPE_SYSBUS_SDHCI);
142
+}
143
+
144
+static void cadence_sdhci_reset(DeviceState *dev)
145
+{
146
+ CadenceSDHCIState *s = CADENCE_SDHCI(dev);
147
+
148
+ memset(s->regs, 0, CADENCE_SDHCI_REG_SIZE);
149
+ s->regs[TO_REG(CADENCE_SDHCI_HRS00)] = CADENCE_SDHCI_HRS00_POR_VAL;
150
+
151
+ device_cold_reset(DEVICE(&s->sdhci));
152
+}
153
+
154
+static uint64_t cadence_sdhci_read(void *opaque, hwaddr addr, unsigned int size)
155
+{
156
+ CadenceSDHCIState *s = opaque;
157
+ uint32_t val;
158
+
159
+ val = s->regs[TO_REG(addr)];
160
+
161
+ return (uint64_t)val;
162
+}
163
+
164
+static void cadence_sdhci_write(void *opaque, hwaddr addr, uint64_t val,
165
+ unsigned int size)
166
+{
167
+ CadenceSDHCIState *s = opaque;
168
+ uint32_t val32 = (uint32_t)val;
169
+
170
+ switch (addr) {
171
+ case CADENCE_SDHCI_HRS00:
172
+ /*
173
+ * The only writable bit is SWR (software reset) and it automatically
174
+ * clears to zero, so essentially this register remains unchanged.
175
+ */
176
+ if (val32 & CADENCE_SDHCI_HRS00_SWR) {
177
+ cadence_sdhci_reset(DEVICE(s));
178
+ }
179
+
180
+ break;
45
+ break;
181
+ case CADENCE_SDHCI_HRS04:
46
+ case MO_16:
182
+ /*
47
+ tcg_gen_ld16u_i64(dest, base, ofs);
183
+ * Only emulate the ACK bit behavior when read or write transaction
184
+ * are requested.
185
+ */
186
+ if (val32 & (CADENCE_SDHCI_HRS04_WR | CADENCE_SDHCI_HRS04_RD)) {
187
+ val32 |= CADENCE_SDHCI_HRS04_ACK;
188
+ } else {
189
+ val32 &= ~CADENCE_SDHCI_HRS04_ACK;
190
+ }
191
+
192
+ s->regs[TO_REG(addr)] = val32;
193
+ break;
48
+ break;
194
+ case CADENCE_SDHCI_HRS06:
49
+ case MO_32:
195
+ if (val32 & CADENCE_SDHCI_HRS06_TUNE_UP) {
50
+ tcg_gen_ld32u_i64(dest, base, ofs);
196
+ val32 &= ~CADENCE_SDHCI_HRS06_TUNE_UP;
51
+ break;
197
+ }
52
+ case MO_64:
198
+
53
+ tcg_gen_ld_i64(dest, base, ofs);
199
+ s->regs[TO_REG(addr)] = val32;
200
+ break;
54
+ break;
201
+ default:
55
+ default:
202
+ s->regs[TO_REG(addr)] = val32;
56
+ g_assert_not_reached();
203
+ break;
57
+ break;
204
+ }
58
+ }
205
+}
59
+}
206
+
60
+
207
+static const MemoryRegionOps cadence_sdhci_ops = {
61
+/* offset of the idx element with base regsiter r */
208
+ .read = cadence_sdhci_read,
62
+static uint32_t endian_ofs(DisasContext *s, int r, int idx)
209
+ .write = cadence_sdhci_write,
210
+ .endianness = DEVICE_NATIVE_ENDIAN,
211
+ .impl = {
212
+ .min_access_size = 4,
213
+ .max_access_size = 4,
214
+ },
215
+ .valid = {
216
+ .min_access_size = 4,
217
+ .max_access_size = 4,
218
+ }
219
+};
220
+
221
+static void cadence_sdhci_realize(DeviceState *dev, Error **errp)
222
+{
63
+{
223
+ CadenceSDHCIState *s = CADENCE_SDHCI(dev);
64
+#ifdef HOST_WORDS_BIGENDIAN
224
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
65
+ return vreg_ofs(s, r) + ((idx ^ (7 >> s->sew)) << s->sew);
225
+ SysBusDevice *sbd_sdhci = SYS_BUS_DEVICE(&s->sdhci);
66
+#else
226
+
67
+ return vreg_ofs(s, r) + (idx << s->sew);
227
+ memory_region_init(&s->container, OBJECT(s),
68
+#endif
228
+ "cadence.sdhci-container", 0x1000);
229
+ sysbus_init_mmio(sbd, &s->container);
230
+
231
+ memory_region_init_io(&s->iomem, OBJECT(s), &cadence_sdhci_ops,
232
+ s, TYPE_CADENCE_SDHCI, CADENCE_SDHCI_REG_SIZE);
233
+ memory_region_add_subregion(&s->container, 0, &s->iomem);
234
+
235
+ sysbus_realize(sbd_sdhci, errp);
236
+ memory_region_add_subregion(&s->container, CADENCE_SDHCI_SRS_BASE,
237
+ sysbus_mmio_get_region(sbd_sdhci, 0));
238
+
239
+ /* propagate irq and "sd-bus" from generic-sdhci */
240
+ sysbus_pass_irq(sbd, sbd_sdhci);
241
+ s->bus = qdev_get_child_bus(DEVICE(sbd_sdhci), "sd-bus");
242
+}
69
+}
243
+
70
+
244
+static const VMStateDescription vmstate_cadence_sdhci = {
71
+/* adjust the index according to the endian */
245
+ .name = TYPE_CADENCE_SDHCI,
72
+static void endian_adjust(TCGv_i32 ofs, int sew)
246
+ .version_id = 1,
247
+ .fields = (VMStateField[]) {
248
+ VMSTATE_UINT32_ARRAY(regs, CadenceSDHCIState, CADENCE_SDHCI_NUM_REGS),
249
+ VMSTATE_END_OF_LIST(),
250
+ },
251
+};
252
+
253
+static void cadence_sdhci_class_init(ObjectClass *classp, void *data)
254
+{
73
+{
255
+ DeviceClass *dc = DEVICE_CLASS(classp);
74
+#ifdef HOST_WORDS_BIGENDIAN
256
+
75
+ tcg_gen_xori_i32(ofs, ofs, 7 >> sew);
257
+ dc->desc = "Cadence SD/SDIO/eMMC Host Controller (SD4HC)";
76
+#endif
258
+ dc->realize = cadence_sdhci_realize;
259
+ dc->reset = cadence_sdhci_reset;
260
+ dc->vmsd = &vmstate_cadence_sdhci;
261
+}
77
+}
262
+
78
+
263
+static TypeInfo cadence_sdhci_info = {
79
+/* Load idx >= VLMAX ? 0 : vreg[idx] */
264
+ .name = TYPE_CADENCE_SDHCI,
80
+static void vec_element_loadx(DisasContext *s, TCGv_i64 dest,
265
+ .parent = TYPE_SYS_BUS_DEVICE,
81
+ int vreg, TCGv idx, int vlmax)
266
+ .instance_size = sizeof(CadenceSDHCIState),
82
+{
267
+ .instance_init = cadence_sdhci_instance_init,
83
+ TCGv_i32 ofs = tcg_temp_new_i32();
268
+ .class_init = cadence_sdhci_class_init,
84
+ TCGv_ptr base = tcg_temp_new_ptr();
269
+};
85
+ TCGv_i64 t_idx = tcg_temp_new_i64();
86
+ TCGv_i64 t_vlmax, t_zero;
270
+
87
+
271
+static void cadence_sdhci_register_types(void)
88
+ /*
272
+{
89
+ * Mask the index to the length so that we do
273
+ type_register_static(&cadence_sdhci_info);
90
+ * not produce an out-of-range load.
91
+ */
92
+ tcg_gen_trunc_tl_i32(ofs, idx);
93
+ tcg_gen_andi_i32(ofs, ofs, vlmax - 1);
94
+
95
+ /* Convert the index to an offset. */
96
+ endian_adjust(ofs, s->sew);
97
+ tcg_gen_shli_i32(ofs, ofs, s->sew);
98
+
99
+ /* Convert the index to a pointer. */
100
+ tcg_gen_ext_i32_ptr(base, ofs);
101
+ tcg_gen_add_ptr(base, base, cpu_env);
102
+
103
+ /* Perform the load. */
104
+ load_element(dest, base,
105
+ vreg_ofs(s, vreg), s->sew);
106
+ tcg_temp_free_ptr(base);
107
+ tcg_temp_free_i32(ofs);
108
+
109
+ /* Flush out-of-range indexing to zero. */
110
+ t_vlmax = tcg_const_i64(vlmax);
111
+ t_zero = tcg_const_i64(0);
112
+ tcg_gen_extu_tl_i64(t_idx, idx);
113
+
114
+ tcg_gen_movcond_i64(TCG_COND_LTU, dest, t_idx,
115
+ t_vlmax, dest, t_zero);
116
+
117
+ tcg_temp_free_i64(t_vlmax);
118
+ tcg_temp_free_i64(t_zero);
119
+ tcg_temp_free_i64(t_idx);
274
+}
120
+}
275
+
121
+
276
+type_init(cadence_sdhci_register_types)
122
+static void vec_element_loadi(DisasContext *s, TCGv_i64 dest,
277
diff --git a/hw/sd/Kconfig b/hw/sd/Kconfig
123
+ int vreg, int idx)
278
index XXXXXXX..XXXXXXX 100644
124
+{
279
--- a/hw/sd/Kconfig
125
+ load_element(dest, cpu_env, endian_ofs(s, vreg, idx), s->sew);
280
+++ b/hw/sd/Kconfig
126
+}
281
@@ -XXX,XX +XXX,XX @@ config SDHCI_PCI
282
default y if PCI_DEVICES
283
depends on PCI
284
select SDHCI
285
+
127
+
286
+config CADENCE_SDHCI
128
+static bool trans_vext_x_v(DisasContext *s, arg_r *a)
287
+ bool
129
+{
288
+ select SDHCI
130
+ TCGv_i64 tmp = tcg_temp_new_i64();
289
diff --git a/hw/sd/meson.build b/hw/sd/meson.build
131
+ TCGv dest = tcg_temp_new();
290
index XXXXXXX..XXXXXXX 100644
132
+
291
--- a/hw/sd/meson.build
133
+ if (a->rs1 == 0) {
292
+++ b/hw/sd/meson.build
134
+ /* Special case vmv.x.s rd, vs2. */
293
@@ -XXX,XX +XXX,XX @@ softmmu_ss.add(when: 'CONFIG_PXA2XX', if_true: files('pxa2xx_mmci.c'))
135
+ vec_element_loadi(s, tmp, a->rs2, 0);
294
softmmu_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_sdhost.c'))
136
+ } else {
295
softmmu_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_sdhci.c'))
137
+ /* This instruction ignores LMUL and vector register groups */
296
softmmu_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-sdhost.c'))
138
+ int vlmax = s->vlen >> (3 + s->sew);
297
+softmmu_ss.add(when: 'CONFIG_CADENCE_SDHCI', if_true: files('cadence_sdhci.c'))
139
+ vec_element_loadx(s, tmp, a->rs2, cpu_gpr[a->rs1], vlmax);
140
+ }
141
+ tcg_gen_trunc_i64_tl(dest, tmp);
142
+ gen_set_gpr(a->rd, dest);
143
+
144
+ tcg_temp_free(dest);
145
+ tcg_temp_free_i64(tmp);
146
+ return true;
147
+}
298
--
148
--
299
2.28.0
149
2.27.0
300
150
301
151
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
When cadence_gem model was created for Xilinx boards, the PHY address
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
was hard-coded to 23 in the GEM model. Now that we have introduced a
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
property we can use that to tell GEM model what our PHY address is.
5
Message-Id: <20200701152549.1218-57-zhiwei_liu@c-sky.com>
6
Change all boards' GEM 'phy-addr' property value to 23, and set the
7
PHY address default value to 0 in the GEM model.
8
9
Signed-off-by: Bin Meng <bin.meng@windriver.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-Id: <1598924352-89526-13-git-send-email-bmeng.cn@gmail.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
7
---
15
hw/arm/xilinx_zynq.c | 1 +
8
target/riscv/internals.h | 6 +++
16
hw/arm/xlnx-versal.c | 1 +
9
target/riscv/insn32.decode | 1 +
17
hw/arm/xlnx-zynqmp.c | 2 ++
10
target/riscv/insn_trans/trans_rvv.inc.c | 60 +++++++++++++++++++++++++
18
hw/net/cadence_gem.c | 6 +++---
11
3 files changed, 67 insertions(+)
19
4 files changed, 7 insertions(+), 3 deletions(-)
20
12
21
diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c
13
diff --git a/target/riscv/internals.h b/target/riscv/internals.h
22
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/arm/xilinx_zynq.c
15
--- a/target/riscv/internals.h
24
+++ b/hw/arm/xilinx_zynq.c
16
+++ b/target/riscv/internals.h
25
@@ -XXX,XX +XXX,XX @@ static void gem_init(NICInfo *nd, uint32_t base, qemu_irq irq)
17
@@ -XXX,XX +XXX,XX @@ FIELD(VDATA, WD, 11, 1)
26
qemu_check_nic_model(nd, TYPE_CADENCE_GEM);
18
target_ulong fclass_h(uint64_t frs1);
27
qdev_set_nic_properties(dev, nd);
19
target_ulong fclass_s(uint64_t frs1);
28
}
20
target_ulong fclass_d(uint64_t frs1);
29
+ object_property_set_int(OBJECT(dev), "phy-addr", 23, &error_abort);
21
+
30
s = SYS_BUS_DEVICE(dev);
22
+#define SEW8 0
31
sysbus_realize_and_unref(s, &error_fatal);
23
+#define SEW16 1
32
sysbus_mmio_map(s, 0, base);
24
+#define SEW32 2
33
diff --git a/hw/arm/xlnx-versal.c b/hw/arm/xlnx-versal.c
25
+#define SEW64 3
26
+
27
#endif
28
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
34
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/xlnx-versal.c
30
--- a/target/riscv/insn32.decode
36
+++ b/hw/arm/xlnx-versal.c
31
+++ b/target/riscv/insn32.decode
37
@@ -XXX,XX +XXX,XX @@ static void versal_create_gems(Versal *s, qemu_irq *pic)
32
@@ -XXX,XX +XXX,XX @@ vmsof_m 010110 . ..... 00010 010 ..... 1010111 @r2_vm
38
qemu_check_nic_model(nd, "cadence_gem");
33
viota_m 010110 . ..... 10000 010 ..... 1010111 @r2_vm
39
qdev_set_nic_properties(dev, nd);
34
vid_v 010110 . 00000 10001 010 ..... 1010111 @r1_vm
40
}
35
vext_x_v 001100 1 ..... ..... 010 ..... 1010111 @r
41
+ object_property_set_int(OBJECT(dev), "phy-addr", 23, &error_abort);
36
+vmv_s_x 001101 1 00000 ..... 110 ..... 1010111 @r2
42
object_property_set_int(OBJECT(dev), "num-priority-queues", 2,
37
43
&error_abort);
38
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
44
object_property_set_link(OBJECT(dev), "dma", OBJECT(&s->mr_ps),
39
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
45
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c
40
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
46
index XXXXXXX..XXXXXXX 100644
41
index XXXXXXX..XXXXXXX 100644
47
--- a/hw/arm/xlnx-zynqmp.c
42
--- a/target/riscv/insn_trans/trans_rvv.inc.c
48
+++ b/hw/arm/xlnx-zynqmp.c
43
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
49
@@ -XXX,XX +XXX,XX @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
44
@@ -XXX,XX +XXX,XX @@ static bool trans_vext_x_v(DisasContext *s, arg_r *a)
50
}
45
tcg_temp_free_i64(tmp);
51
object_property_set_int(OBJECT(&s->gem[i]), "revision", GEM_REVISION,
46
return true;
52
&error_abort);
47
}
53
+ object_property_set_int(OBJECT(&s->gem[i]), "phy-addr", 23,
48
+
54
+ &error_abort);
49
+/* Integer Scalar Move Instruction */
55
object_property_set_int(OBJECT(&s->gem[i]), "num-priority-queues", 2,
50
+
56
&error_abort);
51
+static void store_element(TCGv_i64 val, TCGv_ptr base,
57
if (!sysbus_realize(SYS_BUS_DEVICE(&s->gem[i]), errp)) {
52
+ int ofs, int sew)
58
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
53
+{
59
index XXXXXXX..XXXXXXX 100644
54
+ switch (sew) {
60
--- a/hw/net/cadence_gem.c
55
+ case MO_8:
61
+++ b/hw/net/cadence_gem.c
56
+ tcg_gen_st8_i64(val, base, ofs);
62
@@ -XXX,XX +XXX,XX @@
57
+ break;
63
#define GEM_PHYMNTNC_REG_SHIFT 18
58
+ case MO_16:
64
59
+ tcg_gen_st16_i64(val, base, ofs);
65
/* Marvell PHY definitions */
60
+ break;
66
-#define BOARD_PHY_ADDRESS 23 /* PHY address we will emulate a device at */
61
+ case MO_32:
67
+#define BOARD_PHY_ADDRESS 0 /* PHY address we will emulate a device at */
62
+ tcg_gen_st32_i64(val, base, ofs);
68
63
+ break;
69
#define PHY_REG_CONTROL 0
64
+ case MO_64:
70
#define PHY_REG_STATUS 1
65
+ tcg_gen_st_i64(val, base, ofs);
71
@@ -XXX,XX +XXX,XX @@ static uint64_t gem_read(void *opaque, hwaddr offset, unsigned size)
66
+ break;
72
uint32_t phy_addr, reg_num;
67
+ default:
73
68
+ g_assert_not_reached();
74
phy_addr = (retval & GEM_PHYMNTNC_ADDR) >> GEM_PHYMNTNC_ADDR_SHFT;
69
+ break;
75
- if (phy_addr == s->phy_addr || phy_addr == 0) {
70
+ }
76
+ if (phy_addr == s->phy_addr) {
71
+}
77
reg_num = (retval & GEM_PHYMNTNC_REG) >> GEM_PHYMNTNC_REG_SHIFT;
72
+
78
retval &= 0xFFFF0000;
73
+/*
79
retval |= gem_phy_read(s, reg_num);
74
+ * Store vreg[idx] = val.
80
@@ -XXX,XX +XXX,XX @@ static void gem_write(void *opaque, hwaddr offset, uint64_t val,
75
+ * The index must be in range of VLMAX.
81
uint32_t phy_addr, reg_num;
76
+ */
82
77
+static void vec_element_storei(DisasContext *s, int vreg,
83
phy_addr = (val & GEM_PHYMNTNC_ADDR) >> GEM_PHYMNTNC_ADDR_SHFT;
78
+ int idx, TCGv_i64 val)
84
- if (phy_addr == s->phy_addr || phy_addr == 0) {
79
+{
85
+ if (phy_addr == s->phy_addr) {
80
+ store_element(val, cpu_env, endian_ofs(s, vreg, idx), s->sew);
86
reg_num = (val & GEM_PHYMNTNC_REG) >> GEM_PHYMNTNC_REG_SHIFT;
81
+}
87
gem_phy_write(s, reg_num, val);
82
+
88
}
83
+/* vmv.s.x vd, rs1 # vd[0] = rs1 */
84
+static bool trans_vmv_s_x(DisasContext *s, arg_vmv_s_x *a)
85
+{
86
+ if (vext_check_isa_ill(s)) {
87
+ /* This instruction ignores LMUL and vector register groups */
88
+ int maxsz = s->vlen >> 3;
89
+ TCGv_i64 t1;
90
+ TCGLabel *over = gen_new_label();
91
+
92
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
93
+ tcg_gen_gvec_dup_imm(SEW64, vreg_ofs(s, a->rd), maxsz, maxsz, 0);
94
+ if (a->rs1 == 0) {
95
+ goto done;
96
+ }
97
+
98
+ t1 = tcg_temp_new_i64();
99
+ tcg_gen_extu_tl_i64(t1, cpu_gpr[a->rs1]);
100
+ vec_element_storei(s, a->rd, 0, t1);
101
+ tcg_temp_free_i64(t1);
102
+ done:
103
+ gen_set_label(over);
104
+ return true;
105
+ }
106
+ return false;
107
+}
89
--
108
--
90
2.28.0
109
2.27.0
91
110
92
111
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
At present the PHY address of the PHY connected to GEM is hard-coded
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
to either 23 (BOARD_PHY_ADDRESS) or 0. This might not be the case for
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
all boards. Add a new 'phy-addr' property so that board can specify
5
Message-Id: <20200701152549.1218-58-zhiwei_liu@c-sky.com>
6
the PHY address for each GEM instance.
7
8
Signed-off-by: Bin Meng <bin.meng@windriver.com>
9
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
10
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>
11
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
12
Message-Id: <1598924352-89526-12-git-send-email-bmeng.cn@gmail.com>
13
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
14
---
7
---
15
include/hw/net/cadence_gem.h | 2 ++
8
target/riscv/insn32.decode | 3 ++
16
hw/net/cadence_gem.c | 5 +++--
9
target/riscv/insn_trans/trans_rvv.inc.c | 49 +++++++++++++++++++++++++
17
2 files changed, 5 insertions(+), 2 deletions(-)
10
2 files changed, 52 insertions(+)
18
11
19
diff --git a/include/hw/net/cadence_gem.h b/include/hw/net/cadence_gem.h
12
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
20
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/net/cadence_gem.h
14
--- a/target/riscv/insn32.decode
22
+++ b/include/hw/net/cadence_gem.h
15
+++ b/target/riscv/insn32.decode
23
@@ -XXX,XX +XXX,XX @@ typedef struct CadenceGEMState {
16
@@ -XXX,XX +XXX,XX @@
24
/* Mask of register bits which are write 1 to clear */
17
@r2_vm ...... vm:1 ..... ..... ... ..... ....... &rmr %rs2 %rd
25
uint32_t regs_w1c[CADENCE_GEM_MAXREG];
18
@r1_vm ...... vm:1 ..... ..... ... ..... ....... %rd
26
19
@r_nfvm ... ... vm:1 ..... ..... ... ..... ....... &rnfvm %nf %rs2 %rs1 %rd
27
+ /* PHY address */
20
+@r2rd ....... ..... ..... ... ..... ....... %rs2 %rd
28
+ uint8_t phy_addr;
21
@r_vm ...... vm:1 ..... ..... ... ..... ....... &rmrr %rs2 %rs1 %rd
29
/* PHY registers backing store */
22
@r_vm_1 ...... . ..... ..... ... ..... ....... &rmrr vm=1 %rs2 %rs1 %rd
30
uint16_t phy_regs[32];
23
@r_vm_0 ...... . ..... ..... ... ..... ....... &rmrr vm=0 %rs2 %rs1 %rd
31
24
@@ -XXX,XX +XXX,XX @@ viota_m 010110 . ..... 10000 010 ..... 1010111 @r2_vm
32
diff --git a/hw/net/cadence_gem.c b/hw/net/cadence_gem.c
25
vid_v 010110 . 00000 10001 010 ..... 1010111 @r1_vm
26
vext_x_v 001100 1 ..... ..... 010 ..... 1010111 @r
27
vmv_s_x 001101 1 00000 ..... 110 ..... 1010111 @r2
28
+vfmv_f_s 001100 1 ..... 00000 001 ..... 1010111 @r2rd
29
+vfmv_s_f 001101 1 00000 ..... 101 ..... 1010111 @r2
30
31
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
32
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
33
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
33
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/net/cadence_gem.c
35
--- a/target/riscv/insn_trans/trans_rvv.inc.c
35
+++ b/hw/net/cadence_gem.c
36
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
36
@@ -XXX,XX +XXX,XX @@ static uint64_t gem_read(void *opaque, hwaddr offset, unsigned size)
37
@@ -XXX,XX +XXX,XX @@ static bool trans_vmv_s_x(DisasContext *s, arg_vmv_s_x *a)
37
uint32_t phy_addr, reg_num;
38
}
38
39
return false;
39
phy_addr = (retval & GEM_PHYMNTNC_ADDR) >> GEM_PHYMNTNC_ADDR_SHFT;
40
}
40
- if (phy_addr == BOARD_PHY_ADDRESS || phy_addr == 0) {
41
+
41
+ if (phy_addr == s->phy_addr || phy_addr == 0) {
42
+/* Floating-Point Scalar Move Instructions */
42
reg_num = (retval & GEM_PHYMNTNC_REG) >> GEM_PHYMNTNC_REG_SHIFT;
43
+static bool trans_vfmv_f_s(DisasContext *s, arg_vfmv_f_s *a)
43
retval &= 0xFFFF0000;
44
+{
44
retval |= gem_phy_read(s, reg_num);
45
+ if (!s->vill && has_ext(s, RVF) &&
45
@@ -XXX,XX +XXX,XX @@ static void gem_write(void *opaque, hwaddr offset, uint64_t val,
46
+ (s->mstatus_fs != 0) && (s->sew != 0)) {
46
uint32_t phy_addr, reg_num;
47
+ unsigned int len = 8 << s->sew;
47
48
+
48
phy_addr = (val & GEM_PHYMNTNC_ADDR) >> GEM_PHYMNTNC_ADDR_SHFT;
49
+ vec_element_loadi(s, cpu_fpr[a->rd], a->rs2, 0);
49
- if (phy_addr == BOARD_PHY_ADDRESS || phy_addr == 0) {
50
+ if (len < 64) {
50
+ if (phy_addr == s->phy_addr || phy_addr == 0) {
51
+ tcg_gen_ori_i64(cpu_fpr[a->rd], cpu_fpr[a->rd],
51
reg_num = (val & GEM_PHYMNTNC_REG) >> GEM_PHYMNTNC_REG_SHIFT;
52
+ MAKE_64BIT_MASK(len, 64 - len));
52
gem_phy_write(s, reg_num, val);
53
+ }
53
}
54
+
54
@@ -XXX,XX +XXX,XX @@ static Property gem_properties[] = {
55
+ mark_fs_dirty(s);
55
DEFINE_NIC_PROPERTIES(CadenceGEMState, conf),
56
+ return true;
56
DEFINE_PROP_UINT32("revision", CadenceGEMState, revision,
57
+ }
57
GEM_MODID_VALUE),
58
+ return false;
58
+ DEFINE_PROP_UINT8("phy-addr", CadenceGEMState, phy_addr, BOARD_PHY_ADDRESS),
59
+}
59
DEFINE_PROP_UINT8("num-priority-queues", CadenceGEMState,
60
+
60
num_priority_queues, 1),
61
+/* vfmv.s.f vd, rs1 # vd[0] = rs1 (vs2=0) */
61
DEFINE_PROP_UINT8("num-type1-screeners", CadenceGEMState,
62
+static bool trans_vfmv_s_f(DisasContext *s, arg_vfmv_s_f *a)
63
+{
64
+ if (!s->vill && has_ext(s, RVF) && (s->sew != 0)) {
65
+ TCGv_i64 t1;
66
+ /* The instructions ignore LMUL and vector register group. */
67
+ uint32_t vlmax = s->vlen >> 3;
68
+
69
+ /* if vl == 0, skip vector register write back */
70
+ TCGLabel *over = gen_new_label();
71
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
72
+
73
+ /* zeroed all elements */
74
+ tcg_gen_gvec_dup_imm(SEW64, vreg_ofs(s, a->rd), vlmax, vlmax, 0);
75
+
76
+ /* NaN-box f[rs1] as necessary for SEW */
77
+ t1 = tcg_temp_new_i64();
78
+ if (s->sew == MO_64 && !has_ext(s, RVD)) {
79
+ tcg_gen_ori_i64(t1, cpu_fpr[a->rs1], MAKE_64BIT_MASK(32, 32));
80
+ } else {
81
+ tcg_gen_mov_i64(t1, cpu_fpr[a->rs1]);
82
+ }
83
+ vec_element_storei(s, a->rd, 0, t1);
84
+ tcg_temp_free_i64(t1);
85
+ gen_set_label(over);
86
+ return true;
87
+ }
88
+ return false;
89
+}
62
--
90
--
63
2.28.0
91
2.27.0
64
92
65
93
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-Id: <20200701152549.1218-59-zhiwei_liu@c-sky.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
---
8
target/riscv/helper.h | 17 ++++
9
target/riscv/insn32.decode | 6 ++
10
target/riscv/insn_trans/trans_rvv.inc.c | 18 ++++
11
target/riscv/vector_helper.c | 114 ++++++++++++++++++++++++
12
4 files changed, 155 insertions(+)
13
14
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/helper.h
17
+++ b/target/riscv/helper.h
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_4(vid_v_b, void, ptr, ptr, env, i32)
19
DEF_HELPER_4(vid_v_h, void, ptr, ptr, env, i32)
20
DEF_HELPER_4(vid_v_w, void, ptr, ptr, env, i32)
21
DEF_HELPER_4(vid_v_d, void, ptr, ptr, env, i32)
22
+
23
+DEF_HELPER_6(vslideup_vx_b, void, ptr, ptr, tl, ptr, env, i32)
24
+DEF_HELPER_6(vslideup_vx_h, void, ptr, ptr, tl, ptr, env, i32)
25
+DEF_HELPER_6(vslideup_vx_w, void, ptr, ptr, tl, ptr, env, i32)
26
+DEF_HELPER_6(vslideup_vx_d, void, ptr, ptr, tl, ptr, env, i32)
27
+DEF_HELPER_6(vslidedown_vx_b, void, ptr, ptr, tl, ptr, env, i32)
28
+DEF_HELPER_6(vslidedown_vx_h, void, ptr, ptr, tl, ptr, env, i32)
29
+DEF_HELPER_6(vslidedown_vx_w, void, ptr, ptr, tl, ptr, env, i32)
30
+DEF_HELPER_6(vslidedown_vx_d, void, ptr, ptr, tl, ptr, env, i32)
31
+DEF_HELPER_6(vslide1up_vx_b, void, ptr, ptr, tl, ptr, env, i32)
32
+DEF_HELPER_6(vslide1up_vx_h, void, ptr, ptr, tl, ptr, env, i32)
33
+DEF_HELPER_6(vslide1up_vx_w, void, ptr, ptr, tl, ptr, env, i32)
34
+DEF_HELPER_6(vslide1up_vx_d, void, ptr, ptr, tl, ptr, env, i32)
35
+DEF_HELPER_6(vslide1down_vx_b, void, ptr, ptr, tl, ptr, env, i32)
36
+DEF_HELPER_6(vslide1down_vx_h, void, ptr, ptr, tl, ptr, env, i32)
37
+DEF_HELPER_6(vslide1down_vx_w, void, ptr, ptr, tl, ptr, env, i32)
38
+DEF_HELPER_6(vslide1down_vx_d, void, ptr, ptr, tl, ptr, env, i32)
39
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/riscv/insn32.decode
42
+++ b/target/riscv/insn32.decode
43
@@ -XXX,XX +XXX,XX @@ vext_x_v 001100 1 ..... ..... 010 ..... 1010111 @r
44
vmv_s_x 001101 1 00000 ..... 110 ..... 1010111 @r2
45
vfmv_f_s 001100 1 ..... 00000 001 ..... 1010111 @r2rd
46
vfmv_s_f 001101 1 00000 ..... 101 ..... 1010111 @r2
47
+vslideup_vx 001110 . ..... ..... 100 ..... 1010111 @r_vm
48
+vslideup_vi 001110 . ..... ..... 011 ..... 1010111 @r_vm
49
+vslide1up_vx 001110 . ..... ..... 110 ..... 1010111 @r_vm
50
+vslidedown_vx 001111 . ..... ..... 100 ..... 1010111 @r_vm
51
+vslidedown_vi 001111 . ..... ..... 011 ..... 1010111 @r_vm
52
+vslide1down_vx 001111 . ..... ..... 110 ..... 1010111 @r_vm
53
54
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
55
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
56
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/riscv/insn_trans/trans_rvv.inc.c
59
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
60
@@ -XXX,XX +XXX,XX @@ static bool trans_vfmv_s_f(DisasContext *s, arg_vfmv_s_f *a)
61
}
62
return false;
63
}
64
+
65
+/* Vector Slide Instructions */
66
+static bool slideup_check(DisasContext *s, arg_rmrr *a)
67
+{
68
+ return (vext_check_isa_ill(s) &&
69
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
70
+ vext_check_reg(s, a->rd, false) &&
71
+ vext_check_reg(s, a->rs2, false) &&
72
+ (a->rd != a->rs2));
73
+}
74
+
75
+GEN_OPIVX_TRANS(vslideup_vx, slideup_check)
76
+GEN_OPIVX_TRANS(vslide1up_vx, slideup_check)
77
+GEN_OPIVI_TRANS(vslideup_vi, 1, vslideup_vx, slideup_check)
78
+
79
+GEN_OPIVX_TRANS(vslidedown_vx, opivx_check)
80
+GEN_OPIVX_TRANS(vslide1down_vx, opivx_check)
81
+GEN_OPIVI_TRANS(vslidedown_vi, 1, vslidedown_vx, opivx_check)
82
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
83
index XXXXXXX..XXXXXXX 100644
84
--- a/target/riscv/vector_helper.c
85
+++ b/target/riscv/vector_helper.c
86
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VID_V(vid_v_b, uint8_t, H1, clearb)
87
GEN_VEXT_VID_V(vid_v_h, uint16_t, H2, clearh)
88
GEN_VEXT_VID_V(vid_v_w, uint32_t, H4, clearl)
89
GEN_VEXT_VID_V(vid_v_d, uint64_t, H8, clearq)
90
+
91
+/*
92
+ *** Vector Permutation Instructions
93
+ */
94
+
95
+/* Vector Slide Instructions */
96
+#define GEN_VEXT_VSLIDEUP_VX(NAME, ETYPE, H, CLEAR_FN) \
97
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, void *vs2, \
98
+ CPURISCVState *env, uint32_t desc) \
99
+{ \
100
+ uint32_t mlen = vext_mlen(desc); \
101
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
102
+ uint32_t vm = vext_vm(desc); \
103
+ uint32_t vl = env->vl; \
104
+ target_ulong offset = s1, i; \
105
+ \
106
+ for (i = offset; i < vl; i++) { \
107
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
108
+ continue; \
109
+ } \
110
+ *((ETYPE *)vd + H(i)) = *((ETYPE *)vs2 + H(i - offset)); \
111
+ } \
112
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
113
+}
114
+
115
+/* vslideup.vx vd, vs2, rs1, vm # vd[i+rs1] = vs2[i] */
116
+GEN_VEXT_VSLIDEUP_VX(vslideup_vx_b, uint8_t, H1, clearb)
117
+GEN_VEXT_VSLIDEUP_VX(vslideup_vx_h, uint16_t, H2, clearh)
118
+GEN_VEXT_VSLIDEUP_VX(vslideup_vx_w, uint32_t, H4, clearl)
119
+GEN_VEXT_VSLIDEUP_VX(vslideup_vx_d, uint64_t, H8, clearq)
120
+
121
+#define GEN_VEXT_VSLIDEDOWN_VX(NAME, ETYPE, H, CLEAR_FN) \
122
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, void *vs2, \
123
+ CPURISCVState *env, uint32_t desc) \
124
+{ \
125
+ uint32_t mlen = vext_mlen(desc); \
126
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
127
+ uint32_t vm = vext_vm(desc); \
128
+ uint32_t vl = env->vl; \
129
+ target_ulong offset = s1, i; \
130
+ \
131
+ for (i = 0; i < vl; ++i) { \
132
+ target_ulong j = i + offset; \
133
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
134
+ continue; \
135
+ } \
136
+ *((ETYPE *)vd + H(i)) = j >= vlmax ? 0 : *((ETYPE *)vs2 + H(j)); \
137
+ } \
138
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
139
+}
140
+
141
+/* vslidedown.vx vd, vs2, rs1, vm # vd[i] = vs2[i+rs1] */
142
+GEN_VEXT_VSLIDEDOWN_VX(vslidedown_vx_b, uint8_t, H1, clearb)
143
+GEN_VEXT_VSLIDEDOWN_VX(vslidedown_vx_h, uint16_t, H2, clearh)
144
+GEN_VEXT_VSLIDEDOWN_VX(vslidedown_vx_w, uint32_t, H4, clearl)
145
+GEN_VEXT_VSLIDEDOWN_VX(vslidedown_vx_d, uint64_t, H8, clearq)
146
+
147
+#define GEN_VEXT_VSLIDE1UP_VX(NAME, ETYPE, H, CLEAR_FN) \
148
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, void *vs2, \
149
+ CPURISCVState *env, uint32_t desc) \
150
+{ \
151
+ uint32_t mlen = vext_mlen(desc); \
152
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
153
+ uint32_t vm = vext_vm(desc); \
154
+ uint32_t vl = env->vl; \
155
+ uint32_t i; \
156
+ \
157
+ for (i = 0; i < vl; i++) { \
158
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
159
+ continue; \
160
+ } \
161
+ if (i == 0) { \
162
+ *((ETYPE *)vd + H(i)) = s1; \
163
+ } else { \
164
+ *((ETYPE *)vd + H(i)) = *((ETYPE *)vs2 + H(i - 1)); \
165
+ } \
166
+ } \
167
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
168
+}
169
+
170
+/* vslide1up.vx vd, vs2, rs1, vm # vd[0]=x[rs1], vd[i+1] = vs2[i] */
171
+GEN_VEXT_VSLIDE1UP_VX(vslide1up_vx_b, uint8_t, H1, clearb)
172
+GEN_VEXT_VSLIDE1UP_VX(vslide1up_vx_h, uint16_t, H2, clearh)
173
+GEN_VEXT_VSLIDE1UP_VX(vslide1up_vx_w, uint32_t, H4, clearl)
174
+GEN_VEXT_VSLIDE1UP_VX(vslide1up_vx_d, uint64_t, H8, clearq)
175
+
176
+#define GEN_VEXT_VSLIDE1DOWN_VX(NAME, ETYPE, H, CLEAR_FN) \
177
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, void *vs2, \
178
+ CPURISCVState *env, uint32_t desc) \
179
+{ \
180
+ uint32_t mlen = vext_mlen(desc); \
181
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
182
+ uint32_t vm = vext_vm(desc); \
183
+ uint32_t vl = env->vl; \
184
+ uint32_t i; \
185
+ \
186
+ for (i = 0; i < vl; i++) { \
187
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
188
+ continue; \
189
+ } \
190
+ if (i == vl - 1) { \
191
+ *((ETYPE *)vd + H(i)) = s1; \
192
+ } else { \
193
+ *((ETYPE *)vd + H(i)) = *((ETYPE *)vs2 + H(i + 1)); \
194
+ } \
195
+ } \
196
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
197
+}
198
+
199
+/* vslide1down.vx vd, vs2, rs1, vm # vd[i] = vs2[i+1], vd[vl-1]=x[rs1] */
200
+GEN_VEXT_VSLIDE1DOWN_VX(vslide1down_vx_b, uint8_t, H1, clearb)
201
+GEN_VEXT_VSLIDE1DOWN_VX(vslide1down_vx_h, uint16_t, H2, clearh)
202
+GEN_VEXT_VSLIDE1DOWN_VX(vslide1down_vx_w, uint32_t, H4, clearl)
203
+GEN_VEXT_VSLIDE1DOWN_VX(vslide1down_vx_d, uint64_t, H8, clearq)
204
--
205
2.27.0
206
207
diff view generated by jsdifflib
New patch
1
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-Id: <20200701152549.1218-60-zhiwei_liu@c-sky.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
7
---
8
target/riscv/helper.h | 9 +++
9
target/riscv/insn32.decode | 3 +
10
target/riscv/insn_trans/trans_rvv.inc.c | 78 +++++++++++++++++++++++++
11
target/riscv/vector_helper.c | 60 +++++++++++++++++++
12
4 files changed, 150 insertions(+)
13
14
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/riscv/helper.h
17
+++ b/target/riscv/helper.h
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vslide1down_vx_b, void, ptr, ptr, tl, ptr, env, i32)
19
DEF_HELPER_6(vslide1down_vx_h, void, ptr, ptr, tl, ptr, env, i32)
20
DEF_HELPER_6(vslide1down_vx_w, void, ptr, ptr, tl, ptr, env, i32)
21
DEF_HELPER_6(vslide1down_vx_d, void, ptr, ptr, tl, ptr, env, i32)
22
+
23
+DEF_HELPER_6(vrgather_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
24
+DEF_HELPER_6(vrgather_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
25
+DEF_HELPER_6(vrgather_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
26
+DEF_HELPER_6(vrgather_vv_d, void, ptr, ptr, ptr, ptr, env, i32)
27
+DEF_HELPER_6(vrgather_vx_b, void, ptr, ptr, tl, ptr, env, i32)
28
+DEF_HELPER_6(vrgather_vx_h, void, ptr, ptr, tl, ptr, env, i32)
29
+DEF_HELPER_6(vrgather_vx_w, void, ptr, ptr, tl, ptr, env, i32)
30
+DEF_HELPER_6(vrgather_vx_d, void, ptr, ptr, tl, ptr, env, i32)
31
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/riscv/insn32.decode
34
+++ b/target/riscv/insn32.decode
35
@@ -XXX,XX +XXX,XX @@ vslide1up_vx 001110 . ..... ..... 110 ..... 1010111 @r_vm
36
vslidedown_vx 001111 . ..... ..... 100 ..... 1010111 @r_vm
37
vslidedown_vi 001111 . ..... ..... 011 ..... 1010111 @r_vm
38
vslide1down_vx 001111 . ..... ..... 110 ..... 1010111 @r_vm
39
+vrgather_vv 001100 . ..... ..... 000 ..... 1010111 @r_vm
40
+vrgather_vx 001100 . ..... ..... 100 ..... 1010111 @r_vm
41
+vrgather_vi 001100 . ..... ..... 011 ..... 1010111 @r_vm
42
43
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
44
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
45
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/riscv/insn_trans/trans_rvv.inc.c
48
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
49
@@ -XXX,XX +XXX,XX @@ GEN_OPIVI_TRANS(vslideup_vi, 1, vslideup_vx, slideup_check)
50
GEN_OPIVX_TRANS(vslidedown_vx, opivx_check)
51
GEN_OPIVX_TRANS(vslide1down_vx, opivx_check)
52
GEN_OPIVI_TRANS(vslidedown_vi, 1, vslidedown_vx, opivx_check)
53
+
54
+/* Vector Register Gather Instruction */
55
+static bool vrgather_vv_check(DisasContext *s, arg_rmrr *a)
56
+{
57
+ return (vext_check_isa_ill(s) &&
58
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
59
+ vext_check_reg(s, a->rd, false) &&
60
+ vext_check_reg(s, a->rs1, false) &&
61
+ vext_check_reg(s, a->rs2, false) &&
62
+ (a->rd != a->rs2) && (a->rd != a->rs1));
63
+}
64
+
65
+GEN_OPIVV_TRANS(vrgather_vv, vrgather_vv_check)
66
+
67
+static bool vrgather_vx_check(DisasContext *s, arg_rmrr *a)
68
+{
69
+ return (vext_check_isa_ill(s) &&
70
+ vext_check_overlap_mask(s, a->rd, a->vm, true) &&
71
+ vext_check_reg(s, a->rd, false) &&
72
+ vext_check_reg(s, a->rs2, false) &&
73
+ (a->rd != a->rs2));
74
+}
75
+
76
+/* vrgather.vx vd, vs2, rs1, vm # vd[i] = (x[rs1] >= VLMAX) ? 0 : vs2[rs1] */
77
+static bool trans_vrgather_vx(DisasContext *s, arg_rmrr *a)
78
+{
79
+ if (!vrgather_vx_check(s, a)) {
80
+ return false;
81
+ }
82
+
83
+ if (a->vm && s->vl_eq_vlmax) {
84
+ int vlmax = s->vlen / s->mlen;
85
+ TCGv_i64 dest = tcg_temp_new_i64();
86
+
87
+ if (a->rs1 == 0) {
88
+ vec_element_loadi(s, dest, a->rs2, 0);
89
+ } else {
90
+ vec_element_loadx(s, dest, a->rs2, cpu_gpr[a->rs1], vlmax);
91
+ }
92
+
93
+ tcg_gen_gvec_dup_i64(s->sew, vreg_ofs(s, a->rd),
94
+ MAXSZ(s), MAXSZ(s), dest);
95
+ tcg_temp_free_i64(dest);
96
+ } else {
97
+ static gen_helper_opivx * const fns[4] = {
98
+ gen_helper_vrgather_vx_b, gen_helper_vrgather_vx_h,
99
+ gen_helper_vrgather_vx_w, gen_helper_vrgather_vx_d
100
+ };
101
+ return opivx_trans(a->rd, a->rs1, a->rs2, a->vm, fns[s->sew], s);
102
+ }
103
+ return true;
104
+}
105
+
106
+/* vrgather.vi vd, vs2, imm, vm # vd[i] = (imm >= VLMAX) ? 0 : vs2[imm] */
107
+static bool trans_vrgather_vi(DisasContext *s, arg_rmrr *a)
108
+{
109
+ if (!vrgather_vx_check(s, a)) {
110
+ return false;
111
+ }
112
+
113
+ if (a->vm && s->vl_eq_vlmax) {
114
+ if (a->rs1 >= s->vlen / s->mlen) {
115
+ tcg_gen_gvec_dup_imm(SEW64, vreg_ofs(s, a->rd),
116
+ MAXSZ(s), MAXSZ(s), 0);
117
+ } else {
118
+ tcg_gen_gvec_dup_mem(s->sew, vreg_ofs(s, a->rd),
119
+ endian_ofs(s, a->rs2, a->rs1),
120
+ MAXSZ(s), MAXSZ(s));
121
+ }
122
+ } else {
123
+ static gen_helper_opivx * const fns[4] = {
124
+ gen_helper_vrgather_vx_b, gen_helper_vrgather_vx_h,
125
+ gen_helper_vrgather_vx_w, gen_helper_vrgather_vx_d
126
+ };
127
+ return opivi_trans(a->rd, a->rs1, a->rs2, a->vm, fns[s->sew], s, 1);
128
+ }
129
+ return true;
130
+}
131
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
132
index XXXXXXX..XXXXXXX 100644
133
--- a/target/riscv/vector_helper.c
134
+++ b/target/riscv/vector_helper.c
135
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VSLIDE1DOWN_VX(vslide1down_vx_b, uint8_t, H1, clearb)
136
GEN_VEXT_VSLIDE1DOWN_VX(vslide1down_vx_h, uint16_t, H2, clearh)
137
GEN_VEXT_VSLIDE1DOWN_VX(vslide1down_vx_w, uint32_t, H4, clearl)
138
GEN_VEXT_VSLIDE1DOWN_VX(vslide1down_vx_d, uint64_t, H8, clearq)
139
+
140
+/* Vector Register Gather Instruction */
141
+#define GEN_VEXT_VRGATHER_VV(NAME, ETYPE, H, CLEAR_FN) \
142
+void HELPER(NAME)(void *vd, void *v0, void *vs1, void *vs2, \
143
+ CPURISCVState *env, uint32_t desc) \
144
+{ \
145
+ uint32_t mlen = vext_mlen(desc); \
146
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
147
+ uint32_t vm = vext_vm(desc); \
148
+ uint32_t vl = env->vl; \
149
+ uint32_t index, i; \
150
+ \
151
+ for (i = 0; i < vl; i++) { \
152
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
153
+ continue; \
154
+ } \
155
+ index = *((ETYPE *)vs1 + H(i)); \
156
+ if (index >= vlmax) { \
157
+ *((ETYPE *)vd + H(i)) = 0; \
158
+ } else { \
159
+ *((ETYPE *)vd + H(i)) = *((ETYPE *)vs2 + H(index)); \
160
+ } \
161
+ } \
162
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
163
+}
164
+
165
+/* vd[i] = (vs1[i] >= VLMAX) ? 0 : vs2[vs1[i]]; */
166
+GEN_VEXT_VRGATHER_VV(vrgather_vv_b, uint8_t, H1, clearb)
167
+GEN_VEXT_VRGATHER_VV(vrgather_vv_h, uint16_t, H2, clearh)
168
+GEN_VEXT_VRGATHER_VV(vrgather_vv_w, uint32_t, H4, clearl)
169
+GEN_VEXT_VRGATHER_VV(vrgather_vv_d, uint64_t, H8, clearq)
170
+
171
+#define GEN_VEXT_VRGATHER_VX(NAME, ETYPE, H, CLEAR_FN) \
172
+void HELPER(NAME)(void *vd, void *v0, target_ulong s1, void *vs2, \
173
+ CPURISCVState *env, uint32_t desc) \
174
+{ \
175
+ uint32_t mlen = vext_mlen(desc); \
176
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
177
+ uint32_t vm = vext_vm(desc); \
178
+ uint32_t vl = env->vl; \
179
+ uint32_t index = s1, i; \
180
+ \
181
+ for (i = 0; i < vl; i++) { \
182
+ if (!vm && !vext_elem_mask(v0, mlen, i)) { \
183
+ continue; \
184
+ } \
185
+ if (index >= vlmax) { \
186
+ *((ETYPE *)vd + H(i)) = 0; \
187
+ } else { \
188
+ *((ETYPE *)vd + H(i)) = *((ETYPE *)vs2 + H(index)); \
189
+ } \
190
+ } \
191
+ CLEAR_FN(vd, vl, vl * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
192
+}
193
+
194
+/* vd[i] = (x[rs1] >= VLMAX) ? 0 : vs2[rs1] */
195
+GEN_VEXT_VRGATHER_VX(vrgather_vx_b, uint8_t, H1, clearb)
196
+GEN_VEXT_VRGATHER_VX(vrgather_vx_h, uint16_t, H2, clearh)
197
+GEN_VEXT_VRGATHER_VX(vrgather_vx_w, uint32_t, H4, clearl)
198
+GEN_VEXT_VRGATHER_VX(vrgather_vx_d, uint64_t, H8, clearq)
199
--
200
2.27.0
201
202
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
RISC-V machines do not instantiate RISC-V CPUs directly, instead
3
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
4
they do that via the hart array. Add a new property for the reset
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
vector address to allow the value to be passed to the CPU, before
5
Message-Id: <20200701152549.1218-61-zhiwei_liu@c-sky.com>
6
CPU is realized.
7
8
Signed-off-by: Bin Meng <bin.meng@windriver.com>
9
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
10
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
11
Message-Id: <1598924352-89526-3-git-send-email-bmeng.cn@gmail.com>
12
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
6
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
13
---
7
---
14
include/hw/riscv/riscv_hart.h | 1 +
8
target/riscv/helper.h | 5 ++++
15
hw/riscv/riscv_hart.c | 3 +++
9
target/riscv/insn32.decode | 1 +
16
2 files changed, 4 insertions(+)
10
target/riscv/insn_trans/trans_rvv.inc.c | 32 +++++++++++++++++++++++++
11
target/riscv/vector_helper.c | 26 ++++++++++++++++++++
12
4 files changed, 64 insertions(+)
17
13
18
diff --git a/include/hw/riscv/riscv_hart.h b/include/hw/riscv/riscv_hart.h
14
diff --git a/target/riscv/helper.h b/target/riscv/helper.h
19
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/riscv/riscv_hart.h
16
--- a/target/riscv/helper.h
21
+++ b/include/hw/riscv/riscv_hart.h
17
+++ b/target/riscv/helper.h
22
@@ -XXX,XX +XXX,XX @@ typedef struct RISCVHartArrayState {
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_6(vrgather_vx_b, void, ptr, ptr, tl, ptr, env, i32)
23
uint32_t num_harts;
19
DEF_HELPER_6(vrgather_vx_h, void, ptr, ptr, tl, ptr, env, i32)
24
uint32_t hartid_base;
20
DEF_HELPER_6(vrgather_vx_w, void, ptr, ptr, tl, ptr, env, i32)
25
char *cpu_type;
21
DEF_HELPER_6(vrgather_vx_d, void, ptr, ptr, tl, ptr, env, i32)
26
+ uint64_t resetvec;
22
+
27
RISCVCPU *harts;
23
+DEF_HELPER_6(vcompress_vm_b, void, ptr, ptr, ptr, ptr, env, i32)
28
} RISCVHartArrayState;
24
+DEF_HELPER_6(vcompress_vm_h, void, ptr, ptr, ptr, ptr, env, i32)
29
25
+DEF_HELPER_6(vcompress_vm_w, void, ptr, ptr, ptr, ptr, env, i32)
30
diff --git a/hw/riscv/riscv_hart.c b/hw/riscv/riscv_hart.c
26
+DEF_HELPER_6(vcompress_vm_d, void, ptr, ptr, ptr, ptr, env, i32)
27
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
31
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
32
--- a/hw/riscv/riscv_hart.c
29
--- a/target/riscv/insn32.decode
33
+++ b/hw/riscv/riscv_hart.c
30
+++ b/target/riscv/insn32.decode
34
@@ -XXX,XX +XXX,XX @@ static Property riscv_harts_props[] = {
31
@@ -XXX,XX +XXX,XX @@ vslide1down_vx 001111 . ..... ..... 110 ..... 1010111 @r_vm
35
DEFINE_PROP_UINT32("num-harts", RISCVHartArrayState, num_harts, 1),
32
vrgather_vv 001100 . ..... ..... 000 ..... 1010111 @r_vm
36
DEFINE_PROP_UINT32("hartid-base", RISCVHartArrayState, hartid_base, 0),
33
vrgather_vx 001100 . ..... ..... 100 ..... 1010111 @r_vm
37
DEFINE_PROP_STRING("cpu-type", RISCVHartArrayState, cpu_type),
34
vrgather_vi 001100 . ..... ..... 011 ..... 1010111 @r_vm
38
+ DEFINE_PROP_UINT64("resetvec", RISCVHartArrayState, resetvec,
35
+vcompress_vm 010111 - ..... ..... 010 ..... 1010111 @r
39
+ DEFAULT_RSTVEC),
36
40
DEFINE_PROP_END_OF_LIST(),
37
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
41
};
38
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
42
39
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c b/target/riscv/insn_trans/trans_rvv.inc.c
43
@@ -XXX,XX +XXX,XX @@ static bool riscv_hart_realize(RISCVHartArrayState *s, int idx,
40
index XXXXXXX..XXXXXXX 100644
44
char *cpu_type, Error **errp)
41
--- a/target/riscv/insn_trans/trans_rvv.inc.c
45
{
42
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
46
object_initialize_child(OBJECT(s), "harts[*]", &s->harts[idx], cpu_type);
43
@@ -XXX,XX +XXX,XX @@ static bool trans_vrgather_vi(DisasContext *s, arg_rmrr *a)
47
+ qdev_prop_set_uint64(DEVICE(&s->harts[idx]), "resetvec", s->resetvec);
44
}
48
s->harts[idx].env.mhartid = s->hartid_base + idx;
45
return true;
49
qemu_register_reset(riscv_harts_cpu_reset, &s->harts[idx]);
46
}
50
return qdev_realize(DEVICE(&s->harts[idx]), NULL, errp);
47
+
48
+/* Vector Compress Instruction */
49
+static bool vcompress_vm_check(DisasContext *s, arg_r *a)
50
+{
51
+ return (vext_check_isa_ill(s) &&
52
+ vext_check_reg(s, a->rd, false) &&
53
+ vext_check_reg(s, a->rs2, false) &&
54
+ vext_check_overlap_group(a->rd, 1 << s->lmul, a->rs1, 1) &&
55
+ (a->rd != a->rs2));
56
+}
57
+
58
+static bool trans_vcompress_vm(DisasContext *s, arg_r *a)
59
+{
60
+ if (vcompress_vm_check(s, a)) {
61
+ uint32_t data = 0;
62
+ static gen_helper_gvec_4_ptr * const fns[4] = {
63
+ gen_helper_vcompress_vm_b, gen_helper_vcompress_vm_h,
64
+ gen_helper_vcompress_vm_w, gen_helper_vcompress_vm_d,
65
+ };
66
+ TCGLabel *over = gen_new_label();
67
+ tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
68
+
69
+ data = FIELD_DP32(data, VDATA, MLEN, s->mlen);
70
+ data = FIELD_DP32(data, VDATA, LMUL, s->lmul);
71
+ tcg_gen_gvec_4_ptr(vreg_ofs(s, a->rd), vreg_ofs(s, 0),
72
+ vreg_ofs(s, a->rs1), vreg_ofs(s, a->rs2),
73
+ cpu_env, 0, s->vlen / 8, data, fns[s->sew]);
74
+ gen_set_label(over);
75
+ return true;
76
+ }
77
+ return false;
78
+}
79
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
80
index XXXXXXX..XXXXXXX 100644
81
--- a/target/riscv/vector_helper.c
82
+++ b/target/riscv/vector_helper.c
83
@@ -XXX,XX +XXX,XX @@ GEN_VEXT_VRGATHER_VX(vrgather_vx_b, uint8_t, H1, clearb)
84
GEN_VEXT_VRGATHER_VX(vrgather_vx_h, uint16_t, H2, clearh)
85
GEN_VEXT_VRGATHER_VX(vrgather_vx_w, uint32_t, H4, clearl)
86
GEN_VEXT_VRGATHER_VX(vrgather_vx_d, uint64_t, H8, clearq)
87
+
88
+/* Vector Compress Instruction */
89
+#define GEN_VEXT_VCOMPRESS_VM(NAME, ETYPE, H, CLEAR_FN) \
90
+void HELPER(NAME)(void *vd, void *v0, void *vs1, void *vs2, \
91
+ CPURISCVState *env, uint32_t desc) \
92
+{ \
93
+ uint32_t mlen = vext_mlen(desc); \
94
+ uint32_t vlmax = env_archcpu(env)->cfg.vlen / mlen; \
95
+ uint32_t vl = env->vl; \
96
+ uint32_t num = 0, i; \
97
+ \
98
+ for (i = 0; i < vl; i++) { \
99
+ if (!vext_elem_mask(vs1, mlen, i)) { \
100
+ continue; \
101
+ } \
102
+ *((ETYPE *)vd + H(num)) = *((ETYPE *)vs2 + H(i)); \
103
+ num++; \
104
+ } \
105
+ CLEAR_FN(vd, num, num * sizeof(ETYPE), vlmax * sizeof(ETYPE)); \
106
+}
107
+
108
+/* Compress into vd elements of vs2 where vs1 is enabled */
109
+GEN_VEXT_VCOMPRESS_VM(vcompress_vm_b, uint8_t, H1, clearb)
110
+GEN_VEXT_VCOMPRESS_VM(vcompress_vm_h, uint16_t, H2, clearh)
111
+GEN_VEXT_VCOMPRESS_VM(vcompress_vm_w, uint32_t, H4, clearl)
112
+GEN_VEXT_VCOMPRESS_VM(vcompress_vm_d, uint64_t, H8, clearq)
51
--
113
--
52
2.28.0
114
2.27.0
53
115
54
116
diff view generated by jsdifflib
1
From: Bin Meng <bin.meng@windriver.com>
1
From: LIU Zhiwei <zhiwei_liu@c-sky.com>
2
2
3
Currently the reset vector address is hard-coded in a RISC-V CPU's
3
Vector extension is default off. The only way to use vector extension is
4
instance_init() routine. In a real world we can have 2 exact same
4
1. use cpu rv32 or rv64
5
CPUs except for the reset vector address, which is pretty common in
5
2. turn on it by command line
6
the RISC-V core IP licensing business.
6
"-cpu rv64,x-v=true,vlen=128,elen=64,vext_spec=v0.7.1".
7
7
8
Normally reset vector address is a configurable parameter. Let's
8
vlen is the vector register length, default value is 128 bit.
9
create a 64-bit property to store the reset vector address which
9
elen is the max operator size in bits, default value is 64 bit.
10
covers both 32-bit and 64-bit CPUs.
10
vext_spec is the vector specification version, default value is v0.7.1.
11
These properties can be specified with other values.
11
12
12
Signed-off-by: Bin Meng <bin.meng@windriver.com>
13
Signed-off-by: LIU Zhiwei <zhiwei_liu@c-sky.com>
13
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
14
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
15
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
15
Message-Id: <1598924352-89526-2-git-send-email-bmeng.cn@gmail.com>
16
Message-Id: <20200701152549.1218-62-zhiwei_liu@c-sky.com>
16
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
17
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
17
---
18
---
18
target/riscv/cpu.h | 1 +
19
target/riscv/cpu.h | 4 +++-
19
target/riscv/cpu.c | 1 +
20
target/riscv/cpu.c | 43 +++++++++++++++++++++++++++++++++++++++++++
20
2 files changed, 2 insertions(+)
21
2 files changed, 46 insertions(+), 1 deletion(-)
21
22
22
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
23
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
23
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
24
--- a/target/riscv/cpu.h
25
--- a/target/riscv/cpu.h
25
+++ b/target/riscv/cpu.h
26
+++ b/target/riscv/cpu.h
27
@@ -XXX,XX +XXX,XX @@ typedef struct CPURISCVState CPURISCVState;
28
29
#include "pmp.h"
30
31
-#define RV_VLEN_MAX 512
32
+#define RV_VLEN_MAX 256
33
34
FIELD(VTYPE, VLMUL, 0, 2)
35
FIELD(VTYPE, VSEW, 2, 3)
26
@@ -XXX,XX +XXX,XX @@ typedef struct RISCVCPU {
36
@@ -XXX,XX +XXX,XX @@ typedef struct RISCVCPU {
37
bool ext_s;
38
bool ext_u;
39
bool ext_h;
40
+ bool ext_v;
41
bool ext_counters;
42
bool ext_ifencei;
43
bool ext_icsr;
44
45
char *priv_spec;
46
char *user_spec;
47
+ char *vext_spec;
48
uint16_t vlen;
27
uint16_t elen;
49
uint16_t elen;
28
bool mmu;
50
bool mmu;
29
bool pmp;
30
+ uint64_t resetvec;
31
} cfg;
32
} RISCVCPU;
33
34
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
51
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
35
index XXXXXXX..XXXXXXX 100644
52
index XXXXXXX..XXXXXXX 100644
36
--- a/target/riscv/cpu.c
53
--- a/target/riscv/cpu.c
37
+++ b/target/riscv/cpu.c
54
+++ b/target/riscv/cpu.c
55
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
56
if (cpu->cfg.ext_h) {
57
target_misa |= RVH;
58
}
59
+ if (cpu->cfg.ext_v) {
60
+ target_misa |= RVV;
61
+ if (!is_power_of_2(cpu->cfg.vlen)) {
62
+ error_setg(errp,
63
+ "Vector extension VLEN must be power of 2");
64
+ return;
65
+ }
66
+ if (cpu->cfg.vlen > RV_VLEN_MAX || cpu->cfg.vlen < 128) {
67
+ error_setg(errp,
68
+ "Vector extension implementation only supports VLEN "
69
+ "in the range [128, %d]", RV_VLEN_MAX);
70
+ return;
71
+ }
72
+ if (!is_power_of_2(cpu->cfg.elen)) {
73
+ error_setg(errp,
74
+ "Vector extension ELEN must be power of 2");
75
+ return;
76
+ }
77
+ if (cpu->cfg.elen > 64 || cpu->cfg.vlen < 8) {
78
+ error_setg(errp,
79
+ "Vector extension implementation only supports ELEN "
80
+ "in the range [8, 64]");
81
+ return;
82
+ }
83
+ if (cpu->cfg.vext_spec) {
84
+ if (!g_strcmp0(cpu->cfg.vext_spec, "v0.7.1")) {
85
+ vext_version = VEXT_VERSION_0_07_1;
86
+ } else {
87
+ error_setg(errp,
88
+ "Unsupported vector spec version '%s'",
89
+ cpu->cfg.vext_spec);
90
+ return;
91
+ }
92
+ } else {
93
+ qemu_log("vector verison is not specified, "
94
+ "use the default value v0.7.1\n");
95
+ }
96
+ set_vext_version(env, vext_version);
97
+ }
98
99
set_misa(env, RVXLEN | target_misa);
100
}
38
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_properties[] = {
101
@@ -XXX,XX +XXX,XX @@ static Property riscv_cpu_properties[] = {
39
DEFINE_PROP_UINT16("elen", RISCVCPU, cfg.elen, 64),
102
DEFINE_PROP_BOOL("u", RISCVCPU, cfg.ext_u, true),
103
/* This is experimental so mark with 'x-' */
104
DEFINE_PROP_BOOL("x-h", RISCVCPU, cfg.ext_h, false),
105
+ DEFINE_PROP_BOOL("x-v", RISCVCPU, cfg.ext_v, false),
106
DEFINE_PROP_BOOL("Counters", RISCVCPU, cfg.ext_counters, true),
107
DEFINE_PROP_BOOL("Zifencei", RISCVCPU, cfg.ext_ifencei, true),
108
DEFINE_PROP_BOOL("Zicsr", RISCVCPU, cfg.ext_icsr, true),
109
DEFINE_PROP_STRING("priv_spec", RISCVCPU, cfg.priv_spec),
110
+ DEFINE_PROP_STRING("vext_spec", RISCVCPU, cfg.vext_spec),
111
+ DEFINE_PROP_UINT16("vlen", RISCVCPU, cfg.vlen, 128),
112
+ DEFINE_PROP_UINT16("elen", RISCVCPU, cfg.elen, 64),
40
DEFINE_PROP_BOOL("mmu", RISCVCPU, cfg.mmu, true),
113
DEFINE_PROP_BOOL("mmu", RISCVCPU, cfg.mmu, true),
41
DEFINE_PROP_BOOL("pmp", RISCVCPU, cfg.pmp, true),
114
DEFINE_PROP_BOOL("pmp", RISCVCPU, cfg.pmp, true),
42
+ DEFINE_PROP_UINT64("resetvec", RISCVCPU, cfg.resetvec, DEFAULT_RSTVEC),
43
DEFINE_PROP_END_OF_LIST(),
115
DEFINE_PROP_END_OF_LIST(),
44
};
45
46
--
116
--
47
2.28.0
117
2.27.0
48
118
49
119
diff view generated by jsdifflib