1
Massive pullreq but almost all of that is RTH's SVE
1
I don't have anything else queued up at the moment, so this is just
2
refactoring patchset. The other interesting thing here is
2
Richard's SME patches.
3
the fix for compiling on aarch64 macos.
4
3
5
thanks
6
-- PMM
4
-- PMM
7
5
8
The following changes since commit f7a1ea403e0282a7f57edd4298c4f65f24165da5:
6
The following changes since commit 63b38f6c85acd312c2cab68554abf33adf4ee2b3:
9
7
10
Merge tag 'misc-pull-request' of gitlab.com:marcandre.lureau/qemu into staging (2022-05-29 16:34:56 -0700)
8
Merge tag 'pull-target-arm-20220707' of https://git.linaro.org/people/pmaydell/qemu-arm into staging (2022-07-08 06:17:11 +0530)
11
9
12
are available in the Git repository at:
10
are available in the Git repository at:
13
11
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220530
12
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220711
15
13
16
for you to fetch changes up to b1071174d2a2ab371082b7d4b5f19e98edc61ac6:
14
for you to fetch changes up to f9982ceaf26df27d15547a3a7990a95019e9e3a8:
17
15
18
target/arm: Remove aa64_sve check from before disas_sve (2022-05-30 17:05:12 +0100)
16
linux-user/aarch64: Add SME related hwcap entries (2022-07-11 13:43:52 +0100)
19
17
20
----------------------------------------------------------------
18
----------------------------------------------------------------
21
target-arm queue:
19
target-arm:
22
* docs/system/arm: Add FEAT_HCX to list of emulated features
20
* Implement SME emulation, for both system and linux-user
23
* target/arm/hvf: Include missing "cpregs.h"
24
* hw/sd/allwinner-sdhost: report FIFO water level as 1 when data ready
25
* SVE: refactor to use TRANS/TRANS_FEAT macros and push
26
SVE feature check down to individual insn level
27
21
28
----------------------------------------------------------------
22
----------------------------------------------------------------
29
Icenowy Zheng (1):
23
Richard Henderson (45):
30
hw/sd/allwinner-sdhost: report FIFO water level as 1 when data ready
24
target/arm: Handle SME in aarch64_cpu_dump_state
25
target/arm: Add infrastructure for disas_sme
26
target/arm: Trap non-streaming usage when Streaming SVE is active
27
target/arm: Mark ADR as non-streaming
28
target/arm: Mark RDFFR, WRFFR, SETFFR as non-streaming
29
target/arm: Mark BDEP, BEXT, BGRP, COMPACT, FEXPA, FTSSEL as non-streaming
30
target/arm: Mark PMULL, FMMLA as non-streaming
31
target/arm: Mark FTSMUL, FTMAD, FADDA as non-streaming
32
target/arm: Mark SMMLA, UMMLA, USMMLA as non-streaming
33
target/arm: Mark string/histo/crypto as non-streaming
34
target/arm: Mark gather/scatter load/store as non-streaming
35
target/arm: Mark gather prefetch as non-streaming
36
target/arm: Mark LDFF1 and LDNF1 as non-streaming
37
target/arm: Mark LD1RO as non-streaming
38
target/arm: Add SME enablement checks
39
target/arm: Handle SME in sve_access_check
40
target/arm: Implement SME RDSVL, ADDSVL, ADDSPL
41
target/arm: Implement SME ZERO
42
target/arm: Implement SME MOVA
43
target/arm: Implement SME LD1, ST1
44
target/arm: Export unpredicated ld/st from translate-sve.c
45
target/arm: Implement SME LDR, STR
46
target/arm: Implement SME ADDHA, ADDVA
47
target/arm: Implement FMOPA, FMOPS (non-widening)
48
target/arm: Implement BFMOPA, BFMOPS
49
target/arm: Implement FMOPA, FMOPS (widening)
50
target/arm: Implement SME integer outer product
51
target/arm: Implement PSEL
52
target/arm: Implement REVD
53
target/arm: Implement SCLAMP, UCLAMP
54
target/arm: Reset streaming sve state on exception boundaries
55
target/arm: Enable SME for -cpu max
56
linux-user/aarch64: Clear tpidr2_el0 if CLONE_SETTLS
57
linux-user/aarch64: Reset PSTATE.SM on syscalls
58
linux-user/aarch64: Add SM bit to SVE signal context
59
linux-user/aarch64: Tidy target_restore_sigframe error return
60
linux-user/aarch64: Do not allow duplicate or short sve records
61
linux-user/aarch64: Verify extra record lock succeeded
62
linux-user/aarch64: Move sve record checks into restore
63
linux-user/aarch64: Implement SME signal handling
64
linux-user: Rename sve prctls
65
linux-user/aarch64: Implement PR_SME_GET_VL, PR_SME_SET_VL
66
target/arm: Only set ZEN in reset if SVE present
67
target/arm: Enable SME for user-only
68
linux-user/aarch64: Add SME related hwcap entries
31
69
32
Peter Maydell (1):
70
docs/system/arm/emulation.rst | 4 +
33
docs/system/arm: Add FEAT_HCX to list of emulated features
71
linux-user/aarch64/target_cpu.h | 5 +-
34
72
linux-user/aarch64/target_prctl.h | 62 +-
35
Philippe Mathieu-Daudé (1):
73
target/arm/cpu.h | 7 +
36
target/arm/hvf: Include missing "cpregs.h"
74
target/arm/helper-sme.h | 126 ++++
37
75
target/arm/helper-sve.h | 4 +
38
Richard Henderson (114):
76
target/arm/helper.h | 18 +
39
target/arm: Introduce TRANS, TRANS_FEAT
77
target/arm/translate-a64.h | 45 ++
40
target/arm: Move null function and sve check into gen_gvec_ool_zz
78
target/arm/translate.h | 16 +
41
target/arm: Use TRANS_FEAT for gen_gvec_ool_zz
79
target/arm/sme-fa64.decode | 60 ++
42
target/arm: Move null function and sve check into gen_gvec_ool_zzz
80
target/arm/sme.decode | 88 +++
43
target/arm: Introduce gen_gvec_ool_arg_zzz
81
target/arm/sve.decode | 41 +-
44
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zzz
82
linux-user/aarch64/cpu_loop.c | 9 +
45
target/arm: Use TRANS_FEAT for do_sve2_zzz_ool
83
linux-user/aarch64/signal.c | 243 ++++++--
46
target/arm: Move null function and sve check into gen_gvec_ool_zzzz
84
linux-user/elfload.c | 20 +
47
target/arm: Use TRANS_FEAT for gen_gvec_ool_zzzz
85
linux-user/syscall.c | 28 +-
48
target/arm: Introduce gen_gvec_ool_arg_zzzz
86
target/arm/cpu.c | 35 +-
49
target/arm: Use TRANS_FEAT for do_sve2_zzzz_ool
87
target/arm/cpu64.c | 11 +
50
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zzzz
88
target/arm/helper.c | 56 +-
51
target/arm: Rename do_zzxz_ool to gen_gvec_ool_arg_zzxz
89
target/arm/sme_helper.c | 1140 +++++++++++++++++++++++++++++++++++++
52
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zzxz
90
target/arm/sve_helper.c | 28 +
53
target/arm: Use TRANS_FEAT for do_sve2_zzz_data
91
target/arm/translate-a64.c | 103 +++-
54
target/arm: Use TRANS_FEAT for do_sve2_zzzz_data
92
target/arm/translate-sme.c | 373 ++++++++++++
55
target/arm: Use TRANS_FEAT for do_sve2_zzw_data
93
target/arm/translate-sve.c | 393 ++++++++++---
56
target/arm: Use TRANS_FEAT for USDOT_zzzz
94
target/arm/translate-vfp.c | 12 +
57
target/arm: Move null function and sve check into gen_gvec_ool_zzp
95
target/arm/translate.c | 2 +
58
target/arm: Introduce gen_gvec_ool_arg_zpz
96
target/arm/vec_helper.c | 24 +
59
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zpz
97
target/arm/meson.build | 3 +
60
target/arm: Use TRANS_FEAT for do_sve2_zpz_data
98
28 files changed, 2821 insertions(+), 135 deletions(-)
61
target/arm: Rename do_zpzi_ool to gen_gvec_ool_arg_zpzi
99
create mode 100644 target/arm/sme-fa64.decode
62
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zpzi
100
create mode 100644 target/arm/sme.decode
63
target/arm: Move null function and sve check into gen_gvec_ool_zzzp
101
create mode 100644 target/arm/translate-sme.c
64
target/arm: Introduce gen_gvec_ool_arg_zpzz
65
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zpzz
66
target/arm: Use TRANS_FEAT for do_sve2_zpzz_ool
67
target/arm: Merge gen_gvec_fn_zz into do_mov_z
68
target/arm: Move null function and sve check into gen_gvec_fn_zzz
69
target/arm: Rename do_zzz_fn to gen_gvec_fn_arg_zzz
70
target/arm: More use of gen_gvec_fn_arg_zzz
71
target/arm: Use TRANS_FEAT for gen_gvec_fn_arg_zzz
72
target/arm: Use TRANS_FEAT for do_sve2_fn_zzz
73
target/arm: Use TRANS_FEAT for RAX1
74
target/arm: Introduce gen_gvec_fn_arg_zzzz
75
target/arm: Use TRANS_FEAT for do_sve2_zzzz_fn
76
target/arm: Introduce gen_gvec_fn_zzi
77
target/arm: Use TRANS_FEAT for do_zz_dbm
78
target/arm: Hoist sve access check through do_sel_z
79
target/arm: Introduce gen_gvec_fn_arg_zzi
80
target/arm: Use TRANS_FEAT for do_sve2_fn2i
81
target/arm: Use TRANS_FEAT for do_vpz_ool
82
target/arm: Use TRANS_FEAT for do_shift_imm
83
target/arm: Introduce do_shift_zpzi
84
target/arm: Use TRANS_FEAT for do_shift_zpzi
85
target/arm: Use TRANS_FEAT for do_zpzzz_ool
86
target/arm: Move sve check into do_index
87
target/arm: Use TRANS_FEAT for do_index
88
target/arm: Use TRANS_FEAT for do_adr
89
target/arm: Use TRANS_FEAT for do_predset
90
target/arm: Use TRANS_FEAT for RDFFR, WRFFR
91
target/arm: Use TRANS_FEAT for do_pfirst_pnext
92
target/arm: Use TRANS_FEAT for do_EXT
93
target/arm: Use TRANS_FEAT for do_perm_pred3
94
target/arm: Use TRANS_FEAT for do_perm_pred2
95
target/arm: Move sve zip high_ofs into simd_data
96
target/arm: Use gen_gvec_ool_arg_zzz for do_zip, do_zip_q
97
target/arm: Use TRANS_FEAT for do_zip, do_zip_q
98
target/arm: Use TRANS_FEAT for do_clast_vector
99
target/arm: Use TRANS_FEAT for do_clast_fp
100
target/arm: Use TRANS_FEAT for do_clast_general
101
target/arm: Use TRANS_FEAT for do_last_fp
102
target/arm: Use TRANS_FEAT for do_last_general
103
target/arm: Use TRANS_FEAT for SPLICE
104
target/arm: Use TRANS_FEAT for do_ppzz_flags
105
target/arm: Use TRANS_FEAT for do_sve2_ppzz_flags
106
target/arm: Use TRANS_FEAT for do_ppzi_flags
107
target/arm: Use TRANS_FEAT for do_brk2, do_brk3
108
target/arm: Use TRANS_FEAT for MUL_zzi
109
target/arm: Reject dup_i w/ shifted byte early
110
target/arm: Reject add/sub w/ shifted byte early
111
target/arm: Reject copy w/ shifted byte early
112
target/arm: Use TRANS_FEAT for ADD_zzi
113
target/arm: Use TRANS_FEAT for do_zzi_sat
114
target/arm: Use TRANS_FEAT for do_zzi_ool
115
target/arm: Introduce gen_gvec_{ptr,fpst}_zzzz
116
target/arm: Use TRANS_FEAT for FMMLA
117
target/arm: Move sve check into gen_gvec_fn_ppp
118
target/arm: Implement NOT (prediates) alias
119
target/arm: Use TRANS_FEAT for SEL_zpzz
120
target/arm: Use TRANS_FEAT for MOVPRFX
121
target/arm: Use TRANS_FEAT for FMLA
122
target/arm: Use TRANS_FEAT for BFMLA
123
target/arm: Rename do_zzz_fp to gen_gvec_ool_fpst_arg_zzz
124
target/arm: Use TRANS_FEAT for DO_FP3
125
target/arm: Use TRANS_FEAT for FMUL_zzx
126
target/arm: Use TRANS_FEAT for FTMAD
127
target/arm: Move null function and sve check into do_reduce
128
target/arm: Use TRANS_FEAT for do_reduce
129
target/arm: Use TRANS_FEAT for FRECPE, FRSQRTE
130
target/arm: Expand frint_fns for MO_8
131
target/arm: Rename do_zpz_ptr to gen_gvec_ool_fpst_arg_zpz
132
target/arm: Move null function and sve check into do_frint_mode
133
target/arm: Use TRANS_FEAT for do_frint_mode
134
target/arm: Use TRANS_FEAT for FLOGB
135
target/arm: Use TRANS_FEAT for do_ppz_fp
136
target/arm: Rename do_zpzz_ptr to gen_gvec_fpst_arg_zpzz
137
target/arm: Use TRANS_FEAT for gen_gvec_fpst_arg_zpzz
138
target/arm: Use TRANS_FEAT for FCADD
139
target/arm: Introduce gen_gvec_fpst_zzzzp
140
target/arm: Use TRANS_FEAT for gen_gvec_fpst_zzzzp
141
target/arm: Move null function and sve check into do_fp_imm
142
target/arm: Use TRANS_FEAT for DO_FP_IMM
143
target/arm: Use TRANS_FEAT for DO_FPCMP
144
target/arm: Remove assert in trans_FCMLA_zzxz
145
target/arm: Use TRANS_FEAT for FCMLA_zzxz
146
target/arm: Use TRANS_FEAT for do_narrow_extract
147
target/arm: Use TRANS_FEAT for do_shll_tb
148
target/arm: Use TRANS_FEAT for do_shr_narrow
149
target/arm: Use TRANS_FEAT for do_FMLAL_zzzw
150
target/arm: Use TRANS_FEAT for do_FMLAL_zzxw
151
target/arm: Add sve feature check for remaining trans_* functions
152
target/arm: Remove aa64_sve check from before disas_sve
153
154
docs/system/arm/emulation.rst | 1 +
155
target/arm/translate.h | 11 +
156
target/arm/sve.decode | 57 +-
157
hw/sd/allwinner-sdhost.c | 7 +
158
target/arm/hvf/hvf.c | 1 +
159
target/arm/sve_helper.c | 6 +-
160
target/arm/translate-a64.c | 2 +-
161
target/arm/translate-sve.c | 5367 +++++++++++++++--------------------------
162
8 files changed, 2067 insertions(+), 3385 deletions(-)
163
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Dump SVCR, plus use the correct access check for Streaming Mode.
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-97-richard.henderson@linaro.org
7
Message-id: 20220708151540.18136-2-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
9
---
8
target/arm/translate-sve.c | 29 ++++++-----------------------
10
target/arm/cpu.c | 17 ++++++++++++++++-
9
1 file changed, 6 insertions(+), 23 deletions(-)
11
1 file changed, 16 insertions(+), 1 deletion(-)
10
12
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
15
--- a/target/arm/cpu.c
14
+++ b/target/arm/translate-sve.c
16
+++ b/target/arm/cpu.c
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FCVTX_ds, aa64_sve2, do_frint_mode, a,
17
@@ -XXX,XX +XXX,XX @@ static void aarch64_cpu_dump_state(CPUState *cs, FILE *f, int flags)
16
TRANS_FEAT(FCVTXNT_ds, aa64_sve2, do_frint_mode, a,
18
int i;
17
float_round_to_odd, gen_helper_sve2_fcvtnt_ds)
19
int el = arm_current_el(env);
18
20
const char *ns_status;
19
-static bool trans_FLOGB(DisasContext *s, arg_rpr_esz *a)
21
+ bool sve;
20
-{
22
21
- static gen_helper_gvec_3_ptr * const fns[] = {
23
qemu_fprintf(f, " PC=%016" PRIx64 " ", env->pc);
22
- NULL, gen_helper_flogb_h,
24
for (i = 0; i < 32; i++) {
23
- gen_helper_flogb_s, gen_helper_flogb_d
25
@@ -XXX,XX +XXX,XX @@ static void aarch64_cpu_dump_state(CPUState *cs, FILE *f, int flags)
24
- };
26
el,
25
-
27
psr & PSTATE_SP ? 'h' : 't');
26
- if (!dc_isar_feature(aa64_sve2, s) || fns[a->esz] == NULL) {
28
27
- return false;
29
+ if (cpu_isar_feature(aa64_sme, cpu)) {
28
- }
30
+ qemu_fprintf(f, " SVCR=%08" PRIx64 " %c%c",
29
- if (sve_access_check(s)) {
31
+ env->svcr,
30
- TCGv_ptr status =
32
+ (FIELD_EX64(env->svcr, SVCR, ZA) ? 'Z' : '-'),
31
- fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
33
+ (FIELD_EX64(env->svcr, SVCR, SM) ? 'S' : '-'));
32
- unsigned vsz = vec_full_reg_size(s);
34
+ }
33
-
35
if (cpu_isar_feature(aa64_bti, cpu)) {
34
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
36
qemu_fprintf(f, " BTYPE=%d", (psr & PSTATE_BTYPE) >> 10);
35
- vec_full_reg_offset(s, a->rn),
37
}
36
- pred_full_reg_offset(s, a->pg),
38
@@ -XXX,XX +XXX,XX @@ static void aarch64_cpu_dump_state(CPUState *cs, FILE *f, int flags)
37
- status, vsz, vsz, 0, fns[a->esz]);
39
qemu_fprintf(f, " FPCR=%08x FPSR=%08x\n",
38
- tcg_temp_free_ptr(status);
40
vfp_get_fpcr(env), vfp_get_fpsr(env));
39
- }
41
40
- return true;
42
- if (cpu_isar_feature(aa64_sve, cpu) && sve_exception_el(env, el) == 0) {
41
-}
43
+ if (cpu_isar_feature(aa64_sme, cpu) && FIELD_EX64(env->svcr, SVCR, SM)) {
42
+static gen_helper_gvec_3_ptr * const flogb_fns[] = {
44
+ sve = sme_exception_el(env, el) == 0;
43
+ NULL, gen_helper_flogb_h,
45
+ } else if (cpu_isar_feature(aa64_sve, cpu)) {
44
+ gen_helper_flogb_s, gen_helper_flogb_d
46
+ sve = sve_exception_el(env, el) == 0;
45
+};
47
+ } else {
46
+TRANS_FEAT(FLOGB, aa64_sve2, gen_gvec_fpst_arg_zpz, flogb_fns[a->esz],
48
+ sve = false;
47
+ a, 0, a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
49
+ }
48
50
+
49
static bool do_FMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sub, bool sel)
51
+ if (sve) {
50
{
52
int j, zcr_len = sve_vqm1_for_el(env, el);
53
54
for (i = 0; i <= FFR_PRED_NUM; i++) {
51
--
55
--
52
2.25.1
56
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Use gen_gvec_ool_arg_zpz instead of gen_gvec_ool_zzp
3
This includes the build rules for the decoder, and the
4
when the arguments come from arg_rpr_esz.
4
new file for translation, but excludes any instructions.
5
Replaces do_zpz_ool.
6
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-21-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-3-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
target/arm/translate-sve.c | 45 +++++++++++++++++++++-----------------
11
target/arm/translate-a64.h | 1 +
13
1 file changed, 25 insertions(+), 20 deletions(-)
12
target/arm/sme.decode | 20 ++++++++++++++++++++
13
target/arm/translate-a64.c | 7 ++++++-
14
target/arm/translate-sme.c | 35 +++++++++++++++++++++++++++++++++++
15
target/arm/meson.build | 2 ++
16
5 files changed, 64 insertions(+), 1 deletion(-)
17
create mode 100644 target/arm/sme.decode
18
create mode 100644 target/arm/translate-sme.c
14
19
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
20
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
16
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
22
--- a/target/arm/translate-a64.h
18
+++ b/target/arm/translate-sve.c
23
+++ b/target/arm/translate-a64.h
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
24
@@ -XXX,XX +XXX,XX @@ static inline int pred_gvec_reg_size(DisasContext *s)
20
return true;
21
}
25
}
22
26
23
+static bool gen_gvec_ool_arg_zpz(DisasContext *s, gen_helper_gvec_3 *fn,
27
bool disas_sve(DisasContext *, uint32_t);
24
+ arg_rpr_esz *a, int data)
28
+bool disas_sme(DisasContext *, uint32_t);
25
+{
29
26
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, data);
30
void gen_gvec_rax1(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
27
+}
31
uint32_t rm_ofs, uint32_t opr_sz, uint32_t max_sz);
32
diff --git a/target/arm/sme.decode b/target/arm/sme.decode
33
new file mode 100644
34
index XXXXXXX..XXXXXXX
35
--- /dev/null
36
+++ b/target/arm/sme.decode
37
@@ -XXX,XX +XXX,XX @@
38
+# AArch64 SME instruction descriptions
39
+#
40
+# Copyright (c) 2022 Linaro, Ltd
41
+#
42
+# This library is free software; you can redistribute it and/or
43
+# modify it under the terms of the GNU Lesser General Public
44
+# License as published by the Free Software Foundation; either
45
+# version 2.1 of the License, or (at your option) any later version.
46
+#
47
+# This library is distributed in the hope that it will be useful,
48
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
49
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
50
+# Lesser General Public License for more details.
51
+#
52
+# You should have received a copy of the GNU Lesser General Public
53
+# License along with this library; if not, see <http://www.gnu.org/licenses/>.
54
+
55
+#
56
+# This file is processed by scripts/decodetree.py
57
+#
58
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
59
index XXXXXXX..XXXXXXX 100644
60
--- a/target/arm/translate-a64.c
61
+++ b/target/arm/translate-a64.c
62
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
63
}
64
65
switch (extract32(insn, 25, 4)) {
66
- case 0x0: case 0x1: case 0x3: /* UNALLOCATED */
67
+ case 0x0:
68
+ if (!extract32(insn, 31, 1) || !disas_sme(s, insn)) {
69
+ unallocated_encoding(s);
70
+ }
71
+ break;
72
+ case 0x1: case 0x3: /* UNALLOCATED */
73
unallocated_encoding(s);
74
break;
75
case 0x2:
76
diff --git a/target/arm/translate-sme.c b/target/arm/translate-sme.c
77
new file mode 100644
78
index XXXXXXX..XXXXXXX
79
--- /dev/null
80
+++ b/target/arm/translate-sme.c
81
@@ -XXX,XX +XXX,XX @@
82
+/*
83
+ * AArch64 SME translation
84
+ *
85
+ * Copyright (c) 2022 Linaro, Ltd
86
+ *
87
+ * This library is free software; you can redistribute it and/or
88
+ * modify it under the terms of the GNU Lesser General Public
89
+ * License as published by the Free Software Foundation; either
90
+ * version 2.1 of the License, or (at your option) any later version.
91
+ *
92
+ * This library is distributed in the hope that it will be useful,
93
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
94
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
95
+ * Lesser General Public License for more details.
96
+ *
97
+ * You should have received a copy of the GNU Lesser General Public
98
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
99
+ */
100
+
101
+#include "qemu/osdep.h"
102
+#include "cpu.h"
103
+#include "tcg/tcg-op.h"
104
+#include "tcg/tcg-op-gvec.h"
105
+#include "tcg/tcg-gvec-desc.h"
106
+#include "translate.h"
107
+#include "exec/helper-gen.h"
108
+#include "translate-a64.h"
109
+#include "fpu/softfloat.h"
28
+
110
+
29
+
111
+
30
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
112
+/*
31
static void gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
113
+ * Include the generated decoder.
32
int rd, int rn, int rm, int pg, int data)
114
+ */
33
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
115
+
34
*** SVE Integer Arithmetic - Unary Predicated Group
116
+#include "decode-sme.c.inc"
35
*/
117
diff --git a/target/arm/meson.build b/target/arm/meson.build
36
118
index XXXXXXX..XXXXXXX 100644
37
-static bool do_zpz_ool(DisasContext *s, arg_rpr_esz *a, gen_helper_gvec_3 *fn)
119
--- a/target/arm/meson.build
38
-{
120
+++ b/target/arm/meson.build
39
- return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, 0);
121
@@ -XXX,XX +XXX,XX @@
40
-}
122
gen = [
41
-
123
decodetree.process('sve.decode', extra_args: '--decode=disas_sve'),
42
#define DO_ZPZ(NAME, name) \
124
+ decodetree.process('sme.decode', extra_args: '--decode=disas_sme'),
43
static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
125
decodetree.process('neon-shared.decode', extra_args: '--decode=disas_neon_shared'),
44
{ \
126
decodetree.process('neon-dp.decode', extra_args: '--decode=disas_neon_dp'),
45
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
127
decodetree.process('neon-ls.decode', extra_args: '--decode=disas_neon_ls'),
46
gen_helper_sve_##name##_b, gen_helper_sve_##name##_h, \
128
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'TARGET_AARCH64', if_true: files(
47
gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
129
'sme_helper.c',
48
}; \
130
'translate-a64.c',
49
- return do_zpz_ool(s, a, fns[a->esz]); \
131
'translate-sve.c',
50
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0); \
132
+ 'translate-sme.c',
51
}
133
))
52
134
53
DO_ZPZ(CLS, cls)
135
arm_softmmu_ss = ss.source_set()
54
@@ -XXX,XX +XXX,XX @@ static bool trans_FABS(DisasContext *s, arg_rpr_esz *a)
55
gen_helper_sve_fabs_s,
56
gen_helper_sve_fabs_d
57
};
58
- return do_zpz_ool(s, a, fns[a->esz]);
59
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
60
}
61
62
static bool trans_FNEG(DisasContext *s, arg_rpr_esz *a)
63
@@ -XXX,XX +XXX,XX @@ static bool trans_FNEG(DisasContext *s, arg_rpr_esz *a)
64
gen_helper_sve_fneg_s,
65
gen_helper_sve_fneg_d
66
};
67
- return do_zpz_ool(s, a, fns[a->esz]);
68
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
69
}
70
71
static bool trans_SXTB(DisasContext *s, arg_rpr_esz *a)
72
@@ -XXX,XX +XXX,XX @@ static bool trans_SXTB(DisasContext *s, arg_rpr_esz *a)
73
gen_helper_sve_sxtb_s,
74
gen_helper_sve_sxtb_d
75
};
76
- return do_zpz_ool(s, a, fns[a->esz]);
77
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
78
}
79
80
static bool trans_UXTB(DisasContext *s, arg_rpr_esz *a)
81
@@ -XXX,XX +XXX,XX @@ static bool trans_UXTB(DisasContext *s, arg_rpr_esz *a)
82
gen_helper_sve_uxtb_s,
83
gen_helper_sve_uxtb_d
84
};
85
- return do_zpz_ool(s, a, fns[a->esz]);
86
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
87
}
88
89
static bool trans_SXTH(DisasContext *s, arg_rpr_esz *a)
90
@@ -XXX,XX +XXX,XX @@ static bool trans_SXTH(DisasContext *s, arg_rpr_esz *a)
91
gen_helper_sve_sxth_s,
92
gen_helper_sve_sxth_d
93
};
94
- return do_zpz_ool(s, a, fns[a->esz]);
95
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
96
}
97
98
static bool trans_UXTH(DisasContext *s, arg_rpr_esz *a)
99
@@ -XXX,XX +XXX,XX @@ static bool trans_UXTH(DisasContext *s, arg_rpr_esz *a)
100
gen_helper_sve_uxth_s,
101
gen_helper_sve_uxth_d
102
};
103
- return do_zpz_ool(s, a, fns[a->esz]);
104
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
105
}
106
107
static bool trans_SXTW(DisasContext *s, arg_rpr_esz *a)
108
{
109
- return do_zpz_ool(s, a, a->esz == 3 ? gen_helper_sve_sxtw_d : NULL);
110
+ return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_sxtw_d
111
+ : NULL, a, 0);
112
}
113
114
static bool trans_UXTW(DisasContext *s, arg_rpr_esz *a)
115
{
116
- return do_zpz_ool(s, a, a->esz == 3 ? gen_helper_sve_uxtw_d : NULL);
117
+ return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_uxtw_d
118
+ : NULL, a, 0);
119
}
120
121
#undef DO_ZPZ
122
@@ -XXX,XX +XXX,XX @@ static bool trans_COMPACT(DisasContext *s, arg_rpr_esz *a)
123
static gen_helper_gvec_3 * const fns[4] = {
124
NULL, NULL, gen_helper_sve_compact_s, gen_helper_sve_compact_d
125
};
126
- return do_zpz_ool(s, a, fns[a->esz]);
127
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
128
}
129
130
/* Call the helper that computes the ARM LastActiveElement pseudocode
131
@@ -XXX,XX +XXX,XX @@ static bool trans_REVB(DisasContext *s, arg_rpr_esz *a)
132
gen_helper_sve_revb_s,
133
gen_helper_sve_revb_d,
134
};
135
- return do_zpz_ool(s, a, fns[a->esz]);
136
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
137
}
138
139
static bool trans_REVH(DisasContext *s, arg_rpr_esz *a)
140
@@ -XXX,XX +XXX,XX @@ static bool trans_REVH(DisasContext *s, arg_rpr_esz *a)
141
gen_helper_sve_revh_s,
142
gen_helper_sve_revh_d,
143
};
144
- return do_zpz_ool(s, a, fns[a->esz]);
145
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
146
}
147
148
static bool trans_REVW(DisasContext *s, arg_rpr_esz *a)
149
{
150
- return do_zpz_ool(s, a, a->esz == 3 ? gen_helper_sve_revw_d : NULL);
151
+ return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_revw_d
152
+ : NULL, a, 0);
153
}
154
155
static bool trans_RBIT(DisasContext *s, arg_rpr_esz *a)
156
@@ -XXX,XX +XXX,XX @@ static bool trans_RBIT(DisasContext *s, arg_rpr_esz *a)
157
gen_helper_sve_rbit_s,
158
gen_helper_sve_rbit_d,
159
};
160
- return do_zpz_ool(s, a, fns[a->esz]);
161
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
162
}
163
164
static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
165
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zpz_ool(DisasContext *s, arg_rpr_esz *a,
166
if (!dc_isar_feature(aa64_sve2, s)) {
167
return false;
168
}
169
- return do_zpz_ool(s, a, fn);
170
+ return gen_gvec_ool_arg_zpz(s, fn, a, 0);
171
}
172
173
static bool trans_URECPE(DisasContext *s, arg_rpr_esz *a)
174
--
136
--
175
2.25.1
137
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Use these for the several varieties of floating-point
3
This new behaviour is in the ARM pseudocode function
4
multiply-add instructions.
4
AArch64.CheckFPAdvSIMDEnabled, which applies to AArch32
5
5
via AArch32.CheckAdvSIMDOrFPEnabled when the EL to which
6
the trap would be delivered is in AArch64 mode.
7
8
Given that ARMv9 drops support for AArch32 outside EL0, the trap EL
9
detection ought to be trivially true, but the pseudocode still contains
10
a number of conditions, and QEMU has not yet committed to dropping A32
11
support for EL[12] when v9 features are present.
12
13
Since the computation of SME_TRAP_NONSTREAMING is necessarily different
14
for the two modes, we might as well preserve bits within TBFLAG_ANY and
15
allocate separate bits within TBFLAG_A32 and TBFLAG_A64 instead.
16
17
Note that DDI0616A.a has typos for bits [22:21] of LD1RO in the table
18
of instructions illegal in streaming mode.
19
20
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
21
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-78-richard.henderson@linaro.org
22
Message-id: 20220708151540.18136-4-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
24
---
11
target/arm/translate-sve.c | 140 ++++++++++++++-----------------------
25
target/arm/cpu.h | 7 +++
12
1 file changed, 53 insertions(+), 87 deletions(-)
26
target/arm/translate.h | 4 ++
13
27
target/arm/sme-fa64.decode | 90 ++++++++++++++++++++++++++++++++++++++
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
28
target/arm/helper.c | 41 +++++++++++++++++
15
index XXXXXXX..XXXXXXX 100644
29
target/arm/translate-a64.c | 40 ++++++++++++++++-
16
--- a/target/arm/translate-sve.c
30
target/arm/translate-vfp.c | 12 +++++
17
+++ b/target/arm/translate-sve.c
31
target/arm/translate.c | 2 +
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzxz(DisasContext *s, gen_helper_gvec_4 *fn,
32
target/arm/meson.build | 1 +
19
return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
33
8 files changed, 195 insertions(+), 2 deletions(-)
34
create mode 100644 target/arm/sme-fa64.decode
35
36
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/cpu.h
39
+++ b/target/arm/cpu.h
40
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAG_A32, HSTR_ACTIVE, 9, 1)
41
* the same thing as the current security state of the processor!
42
*/
43
FIELD(TBFLAG_A32, NS, 10, 1)
44
+/*
45
+ * Indicates that SME Streaming mode is active, and SMCR_ELx.FA64 is not.
46
+ * This requires an SME trap from AArch32 mode when using NEON.
47
+ */
48
+FIELD(TBFLAG_A32, SME_TRAP_NONSTREAMING, 11, 1)
49
50
/*
51
* Bit usage when in AArch32 state, for M-profile only.
52
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAG_A64, SMEEXC_EL, 20, 2)
53
FIELD(TBFLAG_A64, PSTATE_SM, 22, 1)
54
FIELD(TBFLAG_A64, PSTATE_ZA, 23, 1)
55
FIELD(TBFLAG_A64, SVL, 24, 4)
56
+/* Indicates that SME Streaming mode is active, and SMCR_ELx.FA64 is not. */
57
+FIELD(TBFLAG_A64, SME_TRAP_NONSTREAMING, 28, 1)
58
59
/*
60
* Helpers for using the above.
61
diff --git a/target/arm/translate.h b/target/arm/translate.h
62
index XXXXXXX..XXXXXXX 100644
63
--- a/target/arm/translate.h
64
+++ b/target/arm/translate.h
65
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
66
bool pstate_sm;
67
/* True if PSTATE.ZA is set. */
68
bool pstate_za;
69
+ /* True if non-streaming insns should raise an SME Streaming exception. */
70
+ bool sme_trap_nonstreaming;
71
+ /* True if the current instruction is non-streaming. */
72
+ bool is_nonstreaming;
73
/* True if MVE insns are definitely not predicated by VPR or LTPSIZE */
74
bool mve_no_pred;
75
/*
76
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
77
new file mode 100644
78
index XXXXXXX..XXXXXXX
79
--- /dev/null
80
+++ b/target/arm/sme-fa64.decode
81
@@ -XXX,XX +XXX,XX @@
82
+# AArch64 SME allowed instruction decoding
83
+#
84
+# Copyright (c) 2022 Linaro, Ltd
85
+#
86
+# This library is free software; you can redistribute it and/or
87
+# modify it under the terms of the GNU Lesser General Public
88
+# License as published by the Free Software Foundation; either
89
+# version 2.1 of the License, or (at your option) any later version.
90
+#
91
+# This library is distributed in the hope that it will be useful,
92
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
93
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
94
+# Lesser General Public License for more details.
95
+#
96
+# You should have received a copy of the GNU Lesser General Public
97
+# License along with this library; if not, see <http://www.gnu.org/licenses/>.
98
+
99
+#
100
+# This file is processed by scripts/decodetree.py
101
+#
102
+
103
+# These patterns are taken from Appendix E1.1 of DDI0616 A.a,
104
+# Arm Architecture Reference Manual Supplement,
105
+# The Scalable Matrix Extension (SME), for Armv9-A
106
+
107
+{
108
+ [
109
+ OK 0-00 1110 0000 0001 0010 11-- ---- ---- # SMOV W|Xd,Vn.B[0]
110
+ OK 0-00 1110 0000 0010 0010 11-- ---- ---- # SMOV W|Xd,Vn.H[0]
111
+ OK 0100 1110 0000 0100 0010 11-- ---- ---- # SMOV Xd,Vn.S[0]
112
+ OK 0000 1110 0000 0001 0011 11-- ---- ---- # UMOV Wd,Vn.B[0]
113
+ OK 0000 1110 0000 0010 0011 11-- ---- ---- # UMOV Wd,Vn.H[0]
114
+ OK 0000 1110 0000 0100 0011 11-- ---- ---- # UMOV Wd,Vn.S[0]
115
+ OK 0100 1110 0000 1000 0011 11-- ---- ---- # UMOV Xd,Vn.D[0]
116
+ ]
117
+ FAIL 0--0 111- ---- ---- ---- ---- ---- ---- # Advanced SIMD vector operations
118
+}
119
+
120
+{
121
+ [
122
+ OK 0101 1110 --1- ---- 11-1 11-- ---- ---- # FMULX/FRECPS/FRSQRTS (scalar)
123
+ OK 0101 1110 -10- ---- 00-1 11-- ---- ---- # FMULX/FRECPS/FRSQRTS (scalar, FP16)
124
+ OK 01-1 1110 1-10 0001 11-1 10-- ---- ---- # FRECPE/FRSQRTE/FRECPX (scalar)
125
+ OK 01-1 1110 1111 1001 11-1 10-- ---- ---- # FRECPE/FRSQRTE/FRECPX (scalar, FP16)
126
+ ]
127
+ FAIL 01-1 111- ---- ---- ---- ---- ---- ---- # Advanced SIMD single-element operations
128
+}
129
+
130
+FAIL 0-00 110- ---- ---- ---- ---- ---- ---- # Advanced SIMD structure load/store
131
+FAIL 1100 1110 ---- ---- ---- ---- ---- ---- # Advanced SIMD cryptography extensions
132
+FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
133
+
134
+# These are the "avoidance of doubt" final table of Illegal Advanced SIMD instructions
135
+# We don't actually need to include these, as the default is OK.
136
+# -001 111- ---- ---- ---- ---- ---- ---- # Scalar floating-point operations
137
+# --10 110- ---- ---- ---- ---- ---- ---- # Load/store pair of FP registers
138
+# --01 1100 ---- ---- ---- ---- ---- ---- # Load FP register (PC-relative literal)
139
+# --11 1100 --0- ---- ---- ---- ---- ---- # Load/store FP register (unscaled imm)
140
+# --11 1100 --1- ---- ---- ---- ---- --10 # Load/store FP register (register offset)
141
+# --11 1101 ---- ---- ---- ---- ---- ---- # Load/store FP register (scaled imm)
142
+
143
+FAIL 0000 0100 --1- ---- 1010 ---- ---- ---- # ADR
144
+FAIL 0000 0100 --1- ---- 1011 -0-- ---- ---- # FTSSEL, FEXPA
145
+FAIL 0000 0101 --10 0001 100- ---- ---- ---- # COMPACT
146
+FAIL 0010 0101 --01 100- 1111 000- ---0 ---- # RDFFR, RDFFRS
147
+FAIL 0010 0101 --10 1--- 1001 ---- ---- ---- # WRFFR, SETFFR
148
+FAIL 0100 0101 --0- ---- 1011 ---- ---- ---- # BDEP, BEXT, BGRP
149
+FAIL 0100 0101 000- ---- 0110 1--- ---- ---- # PMULLB, PMULLT (128b result)
150
+FAIL 0110 0100 --1- ---- 1110 01-- ---- ---- # FMMLA, BFMMLA
151
+FAIL 0110 0101 --0- ---- 0000 11-- ---- ---- # FTSMUL
152
+FAIL 0110 0101 --01 0--- 100- ---- ---- ---- # FTMAD
153
+FAIL 0110 0101 --01 1--- 001- ---- ---- ---- # FADDA
154
+FAIL 0100 0101 --0- ---- 1001 10-- ---- ---- # SMMLA, UMMLA, USMMLA
155
+FAIL 0100 0101 --1- ---- 1--- ---- ---- ---- # SVE2 string/histo/crypto instructions
156
+FAIL 1000 010- -00- ---- 10-- ---- ---- ---- # SVE2 32-bit gather NT load (vector+scalar)
157
+FAIL 1000 010- -00- ---- 111- ---- ---- ---- # SVE 32-bit gather prefetch (vector+imm)
158
+FAIL 1000 0100 0-1- ---- 0--- ---- ---- ---- # SVE 32-bit gather prefetch (scalar+vector)
159
+FAIL 1000 010- -01- ---- 1--- ---- ---- ---- # SVE 32-bit gather load (vector+imm)
160
+FAIL 1000 0100 0-0- ---- 0--- ---- ---- ---- # SVE 32-bit gather load byte (scalar+vector)
161
+FAIL 1000 0100 1--- ---- 0--- ---- ---- ---- # SVE 32-bit gather load half (scalar+vector)
162
+FAIL 1000 0101 0--- ---- 0--- ---- ---- ---- # SVE 32-bit gather load word (scalar+vector)
163
+FAIL 1010 010- ---- ---- 011- ---- ---- ---- # SVE contiguous FF load (scalar+scalar)
164
+FAIL 1010 010- ---1 ---- 101- ---- ---- ---- # SVE contiguous NF load (scalar+imm)
165
+FAIL 1010 010- -01- ---- 000- ---- ---- ---- # SVE load & replicate 32 bytes (scalar+scalar)
166
+FAIL 1010 010- -010 ---- 001- ---- ---- ---- # SVE load & replicate 32 bytes (scalar+imm)
167
+FAIL 1100 010- ---- ---- ---- ---- ---- ---- # SVE 64-bit gather load/prefetch
168
+FAIL 1110 010- -00- ---- 001- ---- ---- ---- # SVE2 64-bit scatter NT store (vector+scalar)
169
+FAIL 1110 010- -10- ---- 001- ---- ---- ---- # SVE2 32-bit scatter NT store (vector+scalar)
170
+FAIL 1110 010- ---- ---- 1-0- ---- ---- ---- # SVE scatter store (scalar+32-bit vector)
171
+FAIL 1110 010- ---- ---- 101- ---- ---- ---- # SVE scatter store (misc)
172
diff --git a/target/arm/helper.c b/target/arm/helper.c
173
index XXXXXXX..XXXXXXX 100644
174
--- a/target/arm/helper.c
175
+++ b/target/arm/helper.c
176
@@ -XXX,XX +XXX,XX @@ int sme_exception_el(CPUARMState *env, int el)
177
return 0;
20
}
178
}
21
179
22
+/* Invoke an out-of-line helper on 4 Zregs, plus a pointer. */
180
+/* This corresponds to the ARM pseudocode function IsFullA64Enabled(). */
23
+static bool gen_gvec_ptr_zzzz(DisasContext *s, gen_helper_gvec_4_ptr *fn,
181
+static bool sme_fa64(CPUARMState *env, int el)
24
+ int rd, int rn, int rm, int ra,
182
+{
25
+ int data, TCGv_ptr ptr)
183
+ if (!cpu_isar_feature(aa64_sme_fa64, env_archcpu(env))) {
26
+{
27
+ if (fn == NULL) {
28
+ return false;
184
+ return false;
29
+ }
185
+ }
30
+ if (sve_access_check(s)) {
186
+
31
+ unsigned vsz = vec_full_reg_size(s);
187
+ if (el <= 1 && !el_is_in_host(env, el)) {
32
+ tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, rd),
188
+ if (!FIELD_EX64(env->vfp.smcr_el[1], SMCR, FA64)) {
33
+ vec_full_reg_offset(s, rn),
189
+ return false;
34
+ vec_full_reg_offset(s, rm),
190
+ }
35
+ vec_full_reg_offset(s, ra),
191
+ }
36
+ ptr, vsz, vsz, data, fn);
192
+ if (el <= 2 && arm_is_el2_enabled(env)) {
37
+ }
193
+ if (!FIELD_EX64(env->vfp.smcr_el[2], SMCR, FA64)) {
194
+ return false;
195
+ }
196
+ }
197
+ if (arm_feature(env, ARM_FEATURE_EL3)) {
198
+ if (!FIELD_EX64(env->vfp.smcr_el[3], SMCR, FA64)) {
199
+ return false;
200
+ }
201
+ }
202
+
38
+ return true;
203
+ return true;
39
+}
204
+}
40
+
205
+
41
+static bool gen_gvec_fpst_zzzz(DisasContext *s, gen_helper_gvec_4_ptr *fn,
206
/*
42
+ int rd, int rn, int rm, int ra,
207
* Given that SVE is enabled, return the vector length for EL.
43
+ int data, ARMFPStatusFlavour flavour)
208
*/
44
+{
209
@@ -XXX,XX +XXX,XX @@ static CPUARMTBFlags rebuild_hflags_a32(CPUARMState *env, int fp_el,
45
+ TCGv_ptr status = fpstatus_ptr(flavour);
210
DP_TBFLAG_ANY(flags, PSTATE__IL, 1);
46
+ bool ret = gen_gvec_ptr_zzzz(s, fn, rd, rn, rm, ra, data, status);
211
}
47
+ tcg_temp_free_ptr(status);
212
48
+ return ret;
213
+ /*
49
+}
214
+ * The SME exception we are testing for is raised via
50
+
215
+ * AArch64.CheckFPAdvSIMDEnabled(), as called from
51
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
216
+ * AArch32.CheckAdvSIMDOrFPEnabled().
52
static bool gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
217
+ */
53
int rd, int rn, int pg, int data)
218
+ if (el == 0
54
@@ -XXX,XX +XXX,XX @@ DO_SVE2_RRXR_ROT(CDOT_zzxw_d, gen_helper_sve2_cdot_idx_d)
219
+ && FIELD_EX64(env->svcr, SVCR, SM)
55
220
+ && (!arm_is_el2_enabled(env)
56
static bool do_FMLA_zzxz(DisasContext *s, arg_rrxr_esz *a, bool sub)
221
+ || (arm_el_is_aa64(env, 2) && !(env->cp15.hcr_el2 & HCR_TGE)))
222
+ && arm_el_is_aa64(env, 1)
223
+ && !sme_fa64(env, el)) {
224
+ DP_TBFLAG_A32(flags, SME_TRAP_NONSTREAMING, 1);
225
+ }
226
+
227
return rebuild_hflags_common_32(env, fp_el, mmu_idx, flags);
228
}
229
230
@@ -XXX,XX +XXX,XX @@ static CPUARMTBFlags rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
231
}
232
if (FIELD_EX64(env->svcr, SVCR, SM)) {
233
DP_TBFLAG_A64(flags, PSTATE_SM, 1);
234
+ DP_TBFLAG_A64(flags, SME_TRAP_NONSTREAMING, !sme_fa64(env, el));
235
}
236
DP_TBFLAG_A64(flags, PSTATE_ZA, FIELD_EX64(env->svcr, SVCR, ZA));
237
}
238
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
239
index XXXXXXX..XXXXXXX 100644
240
--- a/target/arm/translate-a64.c
241
+++ b/target/arm/translate-a64.c
242
@@ -XXX,XX +XXX,XX @@ static void do_vec_ld(DisasContext *s, int destidx, int element,
243
* unallocated-encoding checks (otherwise the syndrome information
244
* for the resulting exception will be incorrect).
245
*/
246
-static bool fp_access_check(DisasContext *s)
247
+static bool fp_access_check_only(DisasContext *s)
57
{
248
{
58
- static gen_helper_gvec_4_ptr * const fns[3] = {
249
if (s->fp_excp_el) {
59
+ static gen_helper_gvec_4_ptr * const fns[4] = {
250
assert(!s->fp_access_checked);
60
+ NULL,
251
@@ -XXX,XX +XXX,XX @@ static bool fp_access_check(DisasContext *s)
61
gen_helper_gvec_fmla_idx_h,
252
return true;
62
gen_helper_gvec_fmla_idx_s,
63
gen_helper_gvec_fmla_idx_d,
64
};
65
-
66
- if (sve_access_check(s)) {
67
- unsigned vsz = vec_full_reg_size(s);
68
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
69
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
70
- vec_full_reg_offset(s, a->rn),
71
- vec_full_reg_offset(s, a->rm),
72
- vec_full_reg_offset(s, a->ra),
73
- status, vsz, vsz, (a->index << 1) | sub,
74
- fns[a->esz - 1]);
75
- tcg_temp_free_ptr(status);
76
- }
77
- return true;
78
+ return gen_gvec_fpst_zzzz(s, fns[a->esz], a->rd, a->rn, a->rm, a->ra,
79
+ (a->index << 1) | sub,
80
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
81
}
253
}
82
254
83
static bool trans_FMLA_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
255
+static bool fp_access_check(DisasContext *s)
84
@@ -XXX,XX +XXX,XX @@ static bool trans_FCMLA_zpzzz(DisasContext *s, arg_FCMLA_zpzzz *a)
256
+{
85
257
+ if (!fp_access_check_only(s)) {
86
static bool trans_FCMLA_zzxz(DisasContext *s, arg_FCMLA_zzxz *a)
258
+ return false;
87
{
259
+ }
88
- static gen_helper_gvec_4_ptr * const fns[2] = {
260
+ if (s->sme_trap_nonstreaming && s->is_nonstreaming) {
89
+ static gen_helper_gvec_4_ptr * const fns[4] = {
261
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
90
+ NULL,
262
+ syn_smetrap(SME_ET_Streaming, false));
91
gen_helper_gvec_fcmlah_idx,
263
+ return false;
92
gen_helper_gvec_fcmlas_idx,
264
+ }
93
+ NULL,
265
+ return true;
94
};
266
+}
95
267
+
96
- tcg_debug_assert(a->esz == 1 || a->esz == 2);
268
/* Check that SVE access is enabled. If it is, return true.
97
tcg_debug_assert(a->rd == a->ra);
269
* If not, emit code to generate an appropriate exception and return false.
98
- if (sve_access_check(s)) {
270
*/
99
- unsigned vsz = vec_full_reg_size(s);
271
@@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread,
100
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
272
default:
101
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
273
g_assert_not_reached();
102
- vec_full_reg_offset(s, a->rn),
274
}
103
- vec_full_reg_offset(s, a->rm),
275
- if ((ri->type & ARM_CP_FPU) && !fp_access_check(s)) {
104
- vec_full_reg_offset(s, a->ra),
276
+ if ((ri->type & ARM_CP_FPU) && !fp_access_check_only(s)) {
105
- status, vsz, vsz,
277
return;
106
- a->index * 4 + a->rot,
278
} else if ((ri->type & ARM_CP_SVE) && !sve_access_check(s)) {
107
- fns[a->esz - 1]);
279
return;
108
- tcg_temp_free_ptr(status);
280
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_simd_fp(DisasContext *s, uint32_t insn)
109
- }
281
}
110
- return true;
111
+
112
+ return gen_gvec_fpst_zzzz(s, fns[a->esz], a->rd, a->rn, a->rm, a->ra,
113
+ a->index * 4 + a->rot,
114
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
115
}
282
}
116
283
117
/*
284
+/*
118
@@ -XXX,XX +XXX,XX @@ static bool trans_FMMLA(DisasContext *s, arg_rrrr_esz *a)
285
+ * Include the generated SME FA64 decoder.
286
+ */
287
+
288
+#include "decode-sme-fa64.c.inc"
289
+
290
+static bool trans_OK(DisasContext *s, arg_OK *a)
291
+{
292
+ return true;
293
+}
294
+
295
+static bool trans_FAIL(DisasContext *s, arg_OK *a)
296
+{
297
+ s->is_nonstreaming = true;
298
+ return true;
299
+}
300
+
301
/**
302
* is_guarded_page:
303
* @env: The cpu environment
304
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_init_disas_context(DisasContextBase *dcbase,
305
dc->mte_active[1] = EX_TBFLAG_A64(tb_flags, MTE0_ACTIVE);
306
dc->pstate_sm = EX_TBFLAG_A64(tb_flags, PSTATE_SM);
307
dc->pstate_za = EX_TBFLAG_A64(tb_flags, PSTATE_ZA);
308
+ dc->sme_trap_nonstreaming = EX_TBFLAG_A64(tb_flags, SME_TRAP_NONSTREAMING);
309
dc->vec_len = 0;
310
dc->vec_stride = 0;
311
dc->cp_regs = arm_cpu->cp_regs;
312
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
313
}
314
}
315
316
+ s->is_nonstreaming = false;
317
+ if (s->sme_trap_nonstreaming) {
318
+ disas_sme_fa64(s, insn);
319
+ }
320
+
321
switch (extract32(insn, 25, 4)) {
322
case 0x0:
323
if (!extract32(insn, 31, 1) || !disas_sme(s, insn)) {
324
diff --git a/target/arm/translate-vfp.c b/target/arm/translate-vfp.c
325
index XXXXXXX..XXXXXXX 100644
326
--- a/target/arm/translate-vfp.c
327
+++ b/target/arm/translate-vfp.c
328
@@ -XXX,XX +XXX,XX @@ static bool vfp_access_check_a(DisasContext *s, bool ignore_vfp_enabled)
119
return false;
329
return false;
120
}
330
}
121
331
122
- if (sve_access_check(s)) {
332
+ /*
123
- unsigned vsz = vec_full_reg_size(s);
333
+ * Note that rebuild_hflags_a32 has already accounted for being in EL0
124
- TCGv_ptr status = fpstatus_ptr(FPST_FPCR);
334
+ * and the higher EL in A64 mode, etc. Unlike A64 mode, there do not
125
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
335
+ * appear to be any insns which touch VFP which are allowed.
126
- vec_full_reg_offset(s, a->rn),
336
+ */
127
- vec_full_reg_offset(s, a->rm),
337
+ if (s->sme_trap_nonstreaming) {
128
- vec_full_reg_offset(s, a->ra),
338
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
129
- status, vsz, vsz, 0, fn);
339
+ syn_smetrap(SME_ET_Streaming,
130
- tcg_temp_free_ptr(status);
340
+ s->base.pc_next - s->pc_curr == 2));
131
- }
341
+ return false;
132
- return true;
342
+ }
133
+ return gen_gvec_fpst_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR);
343
+
134
}
344
if (!s->vfp_enabled && !ignore_vfp_enabled) {
135
345
assert(!arm_dc_feature(s, ARM_FEATURE_M));
136
static gen_helper_gvec_4 * const sqdmlal_zzzw_fns[] = {
346
unallocated_encoding(s);
137
@@ -XXX,XX +XXX,XX @@ static bool do_FMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sub, bool sel)
347
diff --git a/target/arm/translate.c b/target/arm/translate.c
138
if (!dc_isar_feature(aa64_sve2, s)) {
348
index XXXXXXX..XXXXXXX 100644
139
return false;
349
--- a/target/arm/translate.c
140
}
350
+++ b/target/arm/translate.c
141
- if (sve_access_check(s)) {
351
@@ -XXX,XX +XXX,XX @@ static void arm_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
142
- unsigned vsz = vec_full_reg_size(s);
352
dc->vec_len = EX_TBFLAG_A32(tb_flags, VECLEN);
143
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
353
dc->vec_stride = EX_TBFLAG_A32(tb_flags, VECSTRIDE);
144
- vec_full_reg_offset(s, a->rn),
354
}
145
- vec_full_reg_offset(s, a->rm),
355
+ dc->sme_trap_nonstreaming =
146
- vec_full_reg_offset(s, a->ra),
356
+ EX_TBFLAG_A32(tb_flags, SME_TRAP_NONSTREAMING);
147
- cpu_env, vsz, vsz, (sel << 1) | sub,
357
}
148
- gen_helper_sve2_fmlal_zzzw_s);
358
dc->cp_regs = cpu->cp_regs;
149
- }
359
dc->features = env->features;
150
- return true;
360
diff --git a/target/arm/meson.build b/target/arm/meson.build
151
+ return gen_gvec_ptr_zzzz(s, gen_helper_sve2_fmlal_zzzw_s,
361
index XXXXXXX..XXXXXXX 100644
152
+ a->rd, a->rn, a->rm, a->ra,
362
--- a/target/arm/meson.build
153
+ (sel << 1) | sub, cpu_env);
363
+++ b/target/arm/meson.build
154
}
364
@@ -XXX,XX +XXX,XX @@
155
365
gen = [
156
static bool trans_FMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
366
decodetree.process('sve.decode', extra_args: '--decode=disas_sve'),
157
@@ -XXX,XX +XXX,XX @@ static bool do_FMLAL_zzxw(DisasContext *s, arg_rrxr_esz *a, bool sub, bool sel)
367
decodetree.process('sme.decode', extra_args: '--decode=disas_sme'),
158
if (!dc_isar_feature(aa64_sve2, s)) {
368
+ decodetree.process('sme-fa64.decode', extra_args: '--static-decode=disas_sme_fa64'),
159
return false;
369
decodetree.process('neon-shared.decode', extra_args: '--decode=disas_neon_shared'),
160
}
370
decodetree.process('neon-dp.decode', extra_args: '--decode=disas_neon_dp'),
161
- if (sve_access_check(s)) {
371
decodetree.process('neon-ls.decode', extra_args: '--decode=disas_neon_ls'),
162
- unsigned vsz = vec_full_reg_size(s);
163
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
164
- vec_full_reg_offset(s, a->rn),
165
- vec_full_reg_offset(s, a->rm),
166
- vec_full_reg_offset(s, a->ra),
167
- cpu_env, vsz, vsz,
168
- (a->index << 2) | (sel << 1) | sub,
169
- gen_helper_sve2_fmlal_zzxw_s);
170
- }
171
- return true;
172
+ return gen_gvec_ptr_zzzz(s, gen_helper_sve2_fmlal_zzxw_s,
173
+ a->rd, a->rn, a->rm, a->ra,
174
+ (a->index << 2) | (sel << 1) | sub, cpu_env);
175
}
176
177
static bool trans_FMLALB_zzxw(DisasContext *s, arg_rrxr_esz *a)
178
@@ -XXX,XX +XXX,XX @@ static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
179
if (!dc_isar_feature(aa64_sve_bf16, s)) {
180
return false;
181
}
182
- if (sve_access_check(s)) {
183
- TCGv_ptr status = fpstatus_ptr(FPST_FPCR);
184
- unsigned vsz = vec_full_reg_size(s);
185
-
186
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
187
- vec_full_reg_offset(s, a->rn),
188
- vec_full_reg_offset(s, a->rm),
189
- vec_full_reg_offset(s, a->ra),
190
- status, vsz, vsz, sel,
191
- gen_helper_gvec_bfmlal);
192
- tcg_temp_free_ptr(status);
193
- }
194
- return true;
195
+ return gen_gvec_fpst_zzzz(s, gen_helper_gvec_bfmlal,
196
+ a->rd, a->rn, a->rm, a->ra, sel, FPST_FPCR);
197
}
198
199
static bool trans_BFMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
200
@@ -XXX,XX +XXX,XX @@ static bool do_BFMLAL_zzxw(DisasContext *s, arg_rrxr_esz *a, bool sel)
201
if (!dc_isar_feature(aa64_sve_bf16, s)) {
202
return false;
203
}
204
- if (sve_access_check(s)) {
205
- TCGv_ptr status = fpstatus_ptr(FPST_FPCR);
206
- unsigned vsz = vec_full_reg_size(s);
207
-
208
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
209
- vec_full_reg_offset(s, a->rn),
210
- vec_full_reg_offset(s, a->rm),
211
- vec_full_reg_offset(s, a->ra),
212
- status, vsz, vsz, (a->index << 1) | sel,
213
- gen_helper_gvec_bfmlal_idx);
214
- tcg_temp_free_ptr(status);
215
- }
216
- return true;
217
+ return gen_gvec_fpst_zzzz(s, gen_helper_gvec_bfmlal_idx,
218
+ a->rd, a->rn, a->rm, a->ra,
219
+ (a->index << 1) | sel, FPST_FPCR);
220
}
221
222
static bool trans_BFMLALB_zzxw(DisasContext *s, arg_rrxr_esz *a)
223
--
372
--
224
2.25.1
373
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Mark ADR as a non-streaming instruction, which should trap
4
if full a64 support is not enabled in streaming mode.
5
6
Removing entries from sme-fa64.decode is an easy way to see
7
what remains to be done.
8
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-51-richard.henderson@linaro.org
11
Message-id: 20220708151540.18136-5-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
13
---
8
target/arm/translate-sve.c | 23 ++++-------------------
14
target/arm/translate.h | 7 +++++++
9
1 file changed, 4 insertions(+), 19 deletions(-)
15
target/arm/sme-fa64.decode | 1 -
16
target/arm/translate-sve.c | 8 ++++----
17
3 files changed, 11 insertions(+), 5 deletions(-)
10
18
19
diff --git a/target/arm/translate.h b/target/arm/translate.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/target/arm/translate.h
22
+++ b/target/arm/translate.h
23
@@ -XXX,XX +XXX,XX @@ uint64_t asimd_imm_const(uint32_t imm, int cmode, int op);
24
static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
25
{ return dc_isar_feature(FEAT, s) && FUNC(s, __VA_ARGS__); }
26
27
+#define TRANS_FEAT_NONSTREAMING(NAME, FEAT, FUNC, ...) \
28
+ static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
29
+ { \
30
+ s->is_nonstreaming = true; \
31
+ return dc_isar_feature(FEAT, s) && FUNC(s, __VA_ARGS__); \
32
+ }
33
+
34
#endif /* TARGET_ARM_TRANSLATE_H */
35
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/arm/sme-fa64.decode
38
+++ b/target/arm/sme-fa64.decode
39
@@ -XXX,XX +XXX,XX @@ FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
40
# --11 1100 --1- ---- ---- ---- ---- --10 # Load/store FP register (register offset)
41
# --11 1101 ---- ---- ---- ---- ---- ---- # Load/store FP register (scaled imm)
42
43
-FAIL 0000 0100 --1- ---- 1010 ---- ---- ---- # ADR
44
FAIL 0000 0100 --1- ---- 1011 -0-- ---- ---- # FTSSEL, FEXPA
45
FAIL 0000 0101 --10 0001 100- ---- ---- ---- # COMPACT
46
FAIL 0010 0101 --01 100- 1111 000- ---0 ---- # RDFFR, RDFFRS
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
47
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
48
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
49
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
50
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_adr(DisasContext *s, arg_rrri *a, gen_helper_gvec_3 *fn)
51
@@ -XXX,XX +XXX,XX @@ static bool do_adr(DisasContext *s, arg_rrri *a, gen_helper_gvec_3 *fn)
16
return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, a->imm);
52
return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, a->imm);
17
}
53
}
18
54
19
-static bool trans_ADR_p32(DisasContext *s, arg_rrri *a)
55
-TRANS_FEAT(ADR_p32, aa64_sve, do_adr, a, gen_helper_sve_adr_p32)
20
-{
56
-TRANS_FEAT(ADR_p64, aa64_sve, do_adr, a, gen_helper_sve_adr_p64)
21
- return do_adr(s, a, gen_helper_sve_adr_p32);
57
-TRANS_FEAT(ADR_s32, aa64_sve, do_adr, a, gen_helper_sve_adr_s32)
22
-}
58
-TRANS_FEAT(ADR_u32, aa64_sve, do_adr, a, gen_helper_sve_adr_u32)
23
-
59
+TRANS_FEAT_NONSTREAMING(ADR_p32, aa64_sve, do_adr, a, gen_helper_sve_adr_p32)
24
-static bool trans_ADR_p64(DisasContext *s, arg_rrri *a)
60
+TRANS_FEAT_NONSTREAMING(ADR_p64, aa64_sve, do_adr, a, gen_helper_sve_adr_p64)
25
-{
61
+TRANS_FEAT_NONSTREAMING(ADR_s32, aa64_sve, do_adr, a, gen_helper_sve_adr_s32)
26
- return do_adr(s, a, gen_helper_sve_adr_p64);
62
+TRANS_FEAT_NONSTREAMING(ADR_u32, aa64_sve, do_adr, a, gen_helper_sve_adr_u32)
27
-}
28
-
29
-static bool trans_ADR_s32(DisasContext *s, arg_rrri *a)
30
-{
31
- return do_adr(s, a, gen_helper_sve_adr_s32);
32
-}
33
-
34
-static bool trans_ADR_u32(DisasContext *s, arg_rrri *a)
35
-{
36
- return do_adr(s, a, gen_helper_sve_adr_u32);
37
-}
38
+TRANS_FEAT(ADR_p32, aa64_sve, do_adr, a, gen_helper_sve_adr_p32)
39
+TRANS_FEAT(ADR_p64, aa64_sve, do_adr, a, gen_helper_sve_adr_p64)
40
+TRANS_FEAT(ADR_s32, aa64_sve, do_adr, a, gen_helper_sve_adr_s32)
41
+TRANS_FEAT(ADR_u32, aa64_sve, do_adr, a, gen_helper_sve_adr_u32)
42
63
43
/*
64
/*
44
*** SVE Integer Misc - Unpredicated Group
65
*** SVE Integer Misc - Unpredicated Group
45
--
66
--
46
2.25.1
67
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Mark these as a non-streaming instructions, which should trap
4
if full a64 support is not enabled in streaming mode.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-53-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-6-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/translate-sve.c | 11 ++---------
11
target/arm/sme-fa64.decode | 2 --
9
1 file changed, 2 insertions(+), 9 deletions(-)
12
target/arm/translate-sve.c | 9 ++++++---
13
2 files changed, 6 insertions(+), 5 deletions(-)
10
14
15
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sme-fa64.decode
18
+++ b/target/arm/sme-fa64.decode
19
@@ -XXX,XX +XXX,XX @@ FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
20
21
FAIL 0000 0100 --1- ---- 1011 -0-- ---- ---- # FTSSEL, FEXPA
22
FAIL 0000 0101 --10 0001 100- ---- ---- ---- # COMPACT
23
-FAIL 0010 0101 --01 100- 1111 000- ---0 ---- # RDFFR, RDFFRS
24
-FAIL 0010 0101 --10 1--- 1001 ---- ---- ---- # WRFFR, SETFFR
25
FAIL 0100 0101 --0- ---- 1011 ---- ---- ---- # BDEP, BEXT, BGRP
26
FAIL 0100 0101 000- ---- 0110 1--- ---- ---- # PMULLB, PMULLT (128b result)
27
FAIL 0110 0100 --1- ---- 1110 01-- ---- ---- # FMMLA, BFMMLA
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
28
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
30
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
31
+++ b/target/arm/translate-sve.c
32
@@ -XXX,XX +XXX,XX @@ static bool do_predset(DisasContext *s, int esz, int rd, int pat, bool setflag)
33
TRANS_FEAT(PTRUE, aa64_sve, do_predset, a->esz, a->rd, a->pat, a->s)
34
35
/* Note pat == 31 is #all, to set all elements. */
36
-TRANS_FEAT(SETFFR, aa64_sve, do_predset, 0, FFR_PRED_NUM, 31, false)
37
+TRANS_FEAT_NONSTREAMING(SETFFR, aa64_sve,
38
+ do_predset, 0, FFR_PRED_NUM, 31, false)
39
40
/* Note pat == 32 is #unimp, to set no elements. */
41
TRANS_FEAT(PFALSE, aa64_sve, do_predset, 0, a->rd, 32, false)
15
@@ -XXX,XX +XXX,XX @@ static bool trans_RDFFR_p(DisasContext *s, arg_RDFFR_p *a)
42
@@ -XXX,XX +XXX,XX @@ static bool trans_RDFFR_p(DisasContext *s, arg_RDFFR_p *a)
43
.rd = a->rd, .pg = a->pg, .s = a->s,
44
.rn = FFR_PRED_NUM, .rm = FFR_PRED_NUM,
45
};
46
+
47
+ s->is_nonstreaming = true;
16
return trans_AND_pppp(s, &alt_a);
48
return trans_AND_pppp(s, &alt_a);
17
}
49
}
18
50
19
-static bool trans_RDFFR(DisasContext *s, arg_RDFFR *a)
51
-TRANS_FEAT(RDFFR, aa64_sve, do_mov_p, a->rd, FFR_PRED_NUM)
20
-{
52
-TRANS_FEAT(WRFFR, aa64_sve, do_mov_p, FFR_PRED_NUM, a->rn)
21
- return do_mov_p(s, a->rd, FFR_PRED_NUM);
53
+TRANS_FEAT_NONSTREAMING(RDFFR, aa64_sve, do_mov_p, a->rd, FFR_PRED_NUM)
22
-}
54
+TRANS_FEAT_NONSTREAMING(WRFFR, aa64_sve, do_mov_p, FFR_PRED_NUM, a->rn)
23
-
24
-static bool trans_WRFFR(DisasContext *s, arg_WRFFR *a)
25
-{
26
- return do_mov_p(s, FFR_PRED_NUM, a->rn);
27
-}
28
+TRANS_FEAT(RDFFR, aa64_sve, do_mov_p, a->rd, FFR_PRED_NUM)
29
+TRANS_FEAT(WRFFR, aa64_sve, do_mov_p, FFR_PRED_NUM, a->rn)
30
55
31
static bool do_pfirst_pnext(DisasContext *s, arg_rr_esz *a,
56
static bool do_pfirst_pnext(DisasContext *s, arg_rr_esz *a,
32
void (*gen_fn)(TCGv_i32, TCGv_ptr,
57
void (*gen_fn)(TCGv_i32, TCGv_ptr,
33
--
58
--
34
2.25.1
59
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Convert SVE translation functions directly using
3
Mark these as a non-streaming instructions, which should trap
4
gen_gvec_ool_arg_zpz to TRANS_FEAT.
4
if full a64 support is not enabled in streaming mode.
5
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-22-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-7-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/translate-sve.c | 189 ++++++++++++-------------------------
11
target/arm/sme-fa64.decode | 3 ---
12
1 file changed, 60 insertions(+), 129 deletions(-)
12
target/arm/translate-sve.c | 22 ++++++++++++----------
13
2 files changed, 12 insertions(+), 13 deletions(-)
13
14
15
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sme-fa64.decode
18
+++ b/target/arm/sme-fa64.decode
19
@@ -XXX,XX +XXX,XX @@ FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
20
# --11 1100 --1- ---- ---- ---- ---- --10 # Load/store FP register (register offset)
21
# --11 1101 ---- ---- ---- ---- ---- ---- # Load/store FP register (scaled imm)
22
23
-FAIL 0000 0100 --1- ---- 1011 -0-- ---- ---- # FTSSEL, FEXPA
24
-FAIL 0000 0101 --10 0001 100- ---- ---- ---- # COMPACT
25
-FAIL 0100 0101 --0- ---- 1011 ---- ---- ---- # BDEP, BEXT, BGRP
26
FAIL 0100 0101 000- ---- 0110 1--- ---- ---- # PMULLB, PMULLT (128b result)
27
FAIL 0110 0100 --1- ---- 1110 01-- ---- ---- # FMMLA, BFMMLA
28
FAIL 0110 0101 --0- ---- 0000 11-- ---- ---- # FTSMUL
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
29
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
31
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
32
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
33
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2 * const fexpa_fns[4] = {
19
*** SVE Integer Arithmetic - Unary Predicated Group
34
NULL, gen_helper_sve_fexpa_h,
20
*/
35
gen_helper_sve_fexpa_s, gen_helper_sve_fexpa_d,
21
36
};
22
-#define DO_ZPZ(NAME, name) \
37
-TRANS_FEAT(FEXPA, aa64_sve, gen_gvec_ool_zz,
23
-static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
38
- fexpa_fns[a->esz], a->rd, a->rn, 0)
24
-{ \
39
+TRANS_FEAT_NONSTREAMING(FEXPA, aa64_sve, gen_gvec_ool_zz,
25
- static gen_helper_gvec_3 * const fns[4] = { \
40
+ fexpa_fns[a->esz], a->rd, a->rn, 0)
26
- gen_helper_sve_##name##_b, gen_helper_sve_##name##_h, \
41
27
- gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
42
static gen_helper_gvec_3 * const ftssel_fns[4] = {
28
+#define DO_ZPZ(NAME, FEAT, name) \
43
NULL, gen_helper_sve_ftssel_h,
29
+ static gen_helper_gvec_3 * const name##_fns[4] = { \
44
gen_helper_sve_ftssel_s, gen_helper_sve_ftssel_d,
30
+ gen_helper_##name##_b, gen_helper_##name##_h, \
45
};
31
+ gen_helper_##name##_s, gen_helper_##name##_d, \
46
-TRANS_FEAT(FTSSEL, aa64_sve, gen_gvec_ool_arg_zzz, ftssel_fns[a->esz], a, 0)
32
}; \
47
+TRANS_FEAT_NONSTREAMING(FTSSEL, aa64_sve, gen_gvec_ool_arg_zzz,
33
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0); \
48
+ ftssel_fns[a->esz], a, 0)
34
-}
35
+ TRANS_FEAT(NAME, FEAT, gen_gvec_ool_arg_zpz, name##_fns[a->esz], a, 0)
36
37
-DO_ZPZ(CLS, cls)
38
-DO_ZPZ(CLZ, clz)
39
-DO_ZPZ(CNT_zpz, cnt_zpz)
40
-DO_ZPZ(CNOT, cnot)
41
-DO_ZPZ(NOT_zpz, not_zpz)
42
-DO_ZPZ(ABS, abs)
43
-DO_ZPZ(NEG, neg)
44
+DO_ZPZ(CLS, aa64_sve, sve_cls)
45
+DO_ZPZ(CLZ, aa64_sve, sve_clz)
46
+DO_ZPZ(CNT_zpz, aa64_sve, sve_cnt_zpz)
47
+DO_ZPZ(CNOT, aa64_sve, sve_cnot)
48
+DO_ZPZ(NOT_zpz, aa64_sve, sve_not_zpz)
49
+DO_ZPZ(ABS, aa64_sve, sve_abs)
50
+DO_ZPZ(NEG, aa64_sve, sve_neg)
51
+DO_ZPZ(RBIT, aa64_sve, sve_rbit)
52
53
-static bool trans_FABS(DisasContext *s, arg_rpr_esz *a)
54
-{
55
- static gen_helper_gvec_3 * const fns[4] = {
56
- NULL,
57
- gen_helper_sve_fabs_h,
58
- gen_helper_sve_fabs_s,
59
- gen_helper_sve_fabs_d
60
- };
61
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
62
-}
63
+static gen_helper_gvec_3 * const fabs_fns[4] = {
64
+ NULL, gen_helper_sve_fabs_h,
65
+ gen_helper_sve_fabs_s, gen_helper_sve_fabs_d,
66
+};
67
+TRANS_FEAT(FABS, aa64_sve, gen_gvec_ool_arg_zpz, fabs_fns[a->esz], a, 0)
68
69
-static bool trans_FNEG(DisasContext *s, arg_rpr_esz *a)
70
-{
71
- static gen_helper_gvec_3 * const fns[4] = {
72
- NULL,
73
- gen_helper_sve_fneg_h,
74
- gen_helper_sve_fneg_s,
75
- gen_helper_sve_fneg_d
76
- };
77
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
78
-}
79
+static gen_helper_gvec_3 * const fneg_fns[4] = {
80
+ NULL, gen_helper_sve_fneg_h,
81
+ gen_helper_sve_fneg_s, gen_helper_sve_fneg_d,
82
+};
83
+TRANS_FEAT(FNEG, aa64_sve, gen_gvec_ool_arg_zpz, fneg_fns[a->esz], a, 0)
84
85
-static bool trans_SXTB(DisasContext *s, arg_rpr_esz *a)
86
-{
87
- static gen_helper_gvec_3 * const fns[4] = {
88
- NULL,
89
- gen_helper_sve_sxtb_h,
90
- gen_helper_sve_sxtb_s,
91
- gen_helper_sve_sxtb_d
92
- };
93
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
94
-}
95
+static gen_helper_gvec_3 * const sxtb_fns[4] = {
96
+ NULL, gen_helper_sve_sxtb_h,
97
+ gen_helper_sve_sxtb_s, gen_helper_sve_sxtb_d,
98
+};
99
+TRANS_FEAT(SXTB, aa64_sve, gen_gvec_ool_arg_zpz, sxtb_fns[a->esz], a, 0)
100
101
-static bool trans_UXTB(DisasContext *s, arg_rpr_esz *a)
102
-{
103
- static gen_helper_gvec_3 * const fns[4] = {
104
- NULL,
105
- gen_helper_sve_uxtb_h,
106
- gen_helper_sve_uxtb_s,
107
- gen_helper_sve_uxtb_d
108
- };
109
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
110
-}
111
+static gen_helper_gvec_3 * const uxtb_fns[4] = {
112
+ NULL, gen_helper_sve_uxtb_h,
113
+ gen_helper_sve_uxtb_s, gen_helper_sve_uxtb_d,
114
+};
115
+TRANS_FEAT(UXTB, aa64_sve, gen_gvec_ool_arg_zpz, uxtb_fns[a->esz], a, 0)
116
117
-static bool trans_SXTH(DisasContext *s, arg_rpr_esz *a)
118
-{
119
- static gen_helper_gvec_3 * const fns[4] = {
120
- NULL, NULL,
121
- gen_helper_sve_sxth_s,
122
- gen_helper_sve_sxth_d
123
- };
124
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
125
-}
126
+static gen_helper_gvec_3 * const sxth_fns[4] = {
127
+ NULL, NULL, gen_helper_sve_sxth_s, gen_helper_sve_sxth_d
128
+};
129
+TRANS_FEAT(SXTH, aa64_sve, gen_gvec_ool_arg_zpz, sxth_fns[a->esz], a, 0)
130
131
-static bool trans_UXTH(DisasContext *s, arg_rpr_esz *a)
132
-{
133
- static gen_helper_gvec_3 * const fns[4] = {
134
- NULL, NULL,
135
- gen_helper_sve_uxth_s,
136
- gen_helper_sve_uxth_d
137
- };
138
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
139
-}
140
+static gen_helper_gvec_3 * const uxth_fns[4] = {
141
+ NULL, NULL, gen_helper_sve_uxth_s, gen_helper_sve_uxth_d
142
+};
143
+TRANS_FEAT(UXTH, aa64_sve, gen_gvec_ool_arg_zpz, uxth_fns[a->esz], a, 0)
144
145
-static bool trans_SXTW(DisasContext *s, arg_rpr_esz *a)
146
-{
147
- return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_sxtw_d
148
- : NULL, a, 0);
149
-}
150
-
151
-static bool trans_UXTW(DisasContext *s, arg_rpr_esz *a)
152
-{
153
- return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_uxtw_d
154
- : NULL, a, 0);
155
-}
156
-
157
-#undef DO_ZPZ
158
+TRANS_FEAT(SXTW, aa64_sve, gen_gvec_ool_arg_zpz,
159
+ a->esz == 3 ? gen_helper_sve_sxtw_d : NULL, a, 0)
160
+TRANS_FEAT(UXTW, aa64_sve, gen_gvec_ool_arg_zpz,
161
+ a->esz == 3 ? gen_helper_sve_uxtw_d : NULL, a, 0)
162
49
163
/*
50
/*
164
*** SVE Integer Reduction Group
51
*** SVE Predicate Logical Operations Group
165
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(TRN2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
52
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(TRN2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
166
*** SVE Permute Vector - Predicated Group
53
static gen_helper_gvec_3 * const compact_fns[4] = {
167
*/
54
NULL, NULL, gen_helper_sve_compact_s, gen_helper_sve_compact_d
168
55
};
169
-static bool trans_COMPACT(DisasContext *s, arg_rpr_esz *a)
56
-TRANS_FEAT(COMPACT, aa64_sve, gen_gvec_ool_arg_zpz, compact_fns[a->esz], a, 0)
170
-{
57
+TRANS_FEAT_NONSTREAMING(COMPACT, aa64_sve, gen_gvec_ool_arg_zpz,
171
- static gen_helper_gvec_3 * const fns[4] = {
58
+ compact_fns[a->esz], a, 0)
172
- NULL, NULL, gen_helper_sve_compact_s, gen_helper_sve_compact_d
173
- };
174
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
175
-}
176
+static gen_helper_gvec_3 * const compact_fns[4] = {
177
+ NULL, NULL, gen_helper_sve_compact_s, gen_helper_sve_compact_d
178
+};
179
+TRANS_FEAT(COMPACT, aa64_sve, gen_gvec_ool_arg_zpz, compact_fns[a->esz], a, 0)
180
59
181
/* Call the helper that computes the ARM LastActiveElement pseudocode
60
/* Call the helper that computes the ARM LastActiveElement pseudocode
182
* function, scaled by the element size. This includes the not found
61
* function, scaled by the element size. This includes the not found
183
@@ -XXX,XX +XXX,XX @@ static bool trans_CPY_m_v(DisasContext *s, arg_rpr_esz *a)
62
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const bext_fns[4] = {
184
return true;
63
gen_helper_sve2_bext_b, gen_helper_sve2_bext_h,
185
}
64
gen_helper_sve2_bext_s, gen_helper_sve2_bext_d,
186
65
};
187
-static bool trans_REVB(DisasContext *s, arg_rpr_esz *a)
66
-TRANS_FEAT(BEXT, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
188
-{
67
- bext_fns[a->esz], a, 0)
189
- static gen_helper_gvec_3 * const fns[4] = {
68
+TRANS_FEAT_NONSTREAMING(BEXT, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
190
- NULL,
69
+ bext_fns[a->esz], a, 0)
191
- gen_helper_sve_revb_h,
70
192
- gen_helper_sve_revb_s,
71
static gen_helper_gvec_3 * const bdep_fns[4] = {
193
- gen_helper_sve_revb_d,
72
gen_helper_sve2_bdep_b, gen_helper_sve2_bdep_h,
194
- };
73
gen_helper_sve2_bdep_s, gen_helper_sve2_bdep_d,
195
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
74
};
196
-}
75
-TRANS_FEAT(BDEP, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
197
+static gen_helper_gvec_3 * const revb_fns[4] = {
76
- bdep_fns[a->esz], a, 0)
198
+ NULL, gen_helper_sve_revb_h,
77
+TRANS_FEAT_NONSTREAMING(BDEP, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
199
+ gen_helper_sve_revb_s, gen_helper_sve_revb_d,
78
+ bdep_fns[a->esz], a, 0)
200
+};
79
201
+TRANS_FEAT(REVB, aa64_sve, gen_gvec_ool_arg_zpz, revb_fns[a->esz], a, 0)
80
static gen_helper_gvec_3 * const bgrp_fns[4] = {
202
81
gen_helper_sve2_bgrp_b, gen_helper_sve2_bgrp_h,
203
-static bool trans_REVH(DisasContext *s, arg_rpr_esz *a)
82
gen_helper_sve2_bgrp_s, gen_helper_sve2_bgrp_d,
204
-{
83
};
205
- static gen_helper_gvec_3 * const fns[4] = {
84
-TRANS_FEAT(BGRP, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
206
- NULL,
85
- bgrp_fns[a->esz], a, 0)
207
- NULL,
86
+TRANS_FEAT_NONSTREAMING(BGRP, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
208
- gen_helper_sve_revh_s,
87
+ bgrp_fns[a->esz], a, 0)
209
- gen_helper_sve_revh_d,
88
210
- };
89
static gen_helper_gvec_3 * const cadd_fns[4] = {
211
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
90
gen_helper_sve2_cadd_b, gen_helper_sve2_cadd_h,
212
-}
213
+static gen_helper_gvec_3 * const revh_fns[4] = {
214
+ NULL, NULL, gen_helper_sve_revh_s, gen_helper_sve_revh_d,
215
+};
216
+TRANS_FEAT(REVH, aa64_sve, gen_gvec_ool_arg_zpz, revh_fns[a->esz], a, 0)
217
218
-static bool trans_REVW(DisasContext *s, arg_rpr_esz *a)
219
-{
220
- return gen_gvec_ool_arg_zpz(s, a->esz == 3 ? gen_helper_sve_revw_d
221
- : NULL, a, 0);
222
-}
223
-
224
-static bool trans_RBIT(DisasContext *s, arg_rpr_esz *a)
225
-{
226
- static gen_helper_gvec_3 * const fns[4] = {
227
- gen_helper_sve_rbit_b,
228
- gen_helper_sve_rbit_h,
229
- gen_helper_sve_rbit_s,
230
- gen_helper_sve_rbit_d,
231
- };
232
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
233
-}
234
+TRANS_FEAT(REVW, aa64_sve, gen_gvec_ool_arg_zpz,
235
+ a->esz == 3 ? gen_helper_sve_revw_d : NULL, a, 0)
236
237
static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
238
{
239
--
91
--
240
2.25.1
92
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Being able to specify the feature predicate in TRANS_FEAT
3
Mark these as a non-streaming instructions, which should trap
4
makes it easier to split trans_FMMLA by element size,
4
if full a64 support is not enabled in streaming mode.
5
which also happens to simplify the decode.
6
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-79-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-8-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
target/arm/sve.decode | 7 +++----
11
target/arm/sme-fa64.decode | 2 --
13
target/arm/translate-sve.c | 27 ++++-----------------------
12
target/arm/translate-sve.c | 24 +++++++++++++++---------
14
2 files changed, 7 insertions(+), 27 deletions(-)
13
2 files changed, 15 insertions(+), 11 deletions(-)
15
14
16
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
15
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/sve.decode
17
--- a/target/arm/sme-fa64.decode
19
+++ b/target/arm/sve.decode
18
+++ b/target/arm/sme-fa64.decode
20
@@ -XXX,XX +XXX,XX @@ SQRDCMLAH_zzzz 01000100 esz:2 0 rm:5 0011 rot:2 rn:5 rd:5 ra=%reg_movprfx
19
@@ -XXX,XX +XXX,XX @@ FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
21
USDOT_zzzz 01000100 .. 0 ..... 011 110 ..... ..... @rda_rn_rm
20
# --11 1100 --1- ---- ---- ---- ---- --10 # Load/store FP register (register offset)
22
21
# --11 1101 ---- ---- ---- ---- ---- ---- # Load/store FP register (scaled imm)
23
### SVE2 floating point matrix multiply accumulate
22
24
-{
23
-FAIL 0100 0101 000- ---- 0110 1--- ---- ---- # PMULLB, PMULLT (128b result)
25
- BFMMLA 01100100 01 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
24
-FAIL 0110 0100 --1- ---- 1110 01-- ---- ---- # FMMLA, BFMMLA
26
- FMMLA 01100100 .. 1 ..... 111 001 ..... ..... @rda_rn_rm
25
FAIL 0110 0101 --0- ---- 0000 11-- ---- ---- # FTSMUL
27
-}
26
FAIL 0110 0101 --01 0--- 100- ---- ---- ---- # FTMAD
28
+BFMMLA 01100100 01 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
27
FAIL 0110 0101 --01 1--- 001- ---- ---- ---- # FADDA
29
+FMMLA_s 01100100 10 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
30
+FMMLA_d 01100100 11 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
31
32
### SVE2 Memory Gather Load Group
33
34
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
28
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
35
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/translate-sve.c
30
--- a/target/arm/translate-sve.c
37
+++ b/target/arm/translate-sve.c
31
+++ b/target/arm/translate-sve.c
38
@@ -XXX,XX +XXX,XX @@ DO_SVE2_ZPZZ_FP(FMINP, fminp)
32
@@ -XXX,XX +XXX,XX @@ static bool do_trans_pmull(DisasContext *s, arg_rrr_esz *a, bool sel)
33
gen_helper_gvec_pmull_q, gen_helper_sve2_pmull_h,
34
NULL, gen_helper_sve2_pmull_d,
35
};
36
- if (a->esz == 0
37
- ? !dc_isar_feature(aa64_sve2_pmull128, s)
38
- : !dc_isar_feature(aa64_sve, s)) {
39
+
40
+ if (a->esz == 0) {
41
+ if (!dc_isar_feature(aa64_sve2_pmull128, s)) {
42
+ return false;
43
+ }
44
+ s->is_nonstreaming = true;
45
+ } else if (!dc_isar_feature(aa64_sve, s)) {
46
return false;
47
}
48
return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, sel);
49
@@ -XXX,XX +XXX,XX @@ DO_ZPZZ_FP(FMINP, aa64_sve2, sve2_fminp_zpzz)
39
* SVE Integer Multiply-Add (unpredicated)
50
* SVE Integer Multiply-Add (unpredicated)
40
*/
51
*/
41
52
42
-static bool trans_FMMLA(DisasContext *s, arg_rrrr_esz *a)
53
-TRANS_FEAT(FMMLA_s, aa64_sve_f32mm, gen_gvec_fpst_zzzz, gen_helper_fmmla_s,
43
-{
54
- a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR)
44
- gen_helper_gvec_4_ptr *fn;
55
-TRANS_FEAT(FMMLA_d, aa64_sve_f64mm, gen_gvec_fpst_zzzz, gen_helper_fmmla_d,
45
-
56
- a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR)
46
- switch (a->esz) {
57
+TRANS_FEAT_NONSTREAMING(FMMLA_s, aa64_sve_f32mm, gen_gvec_fpst_zzzz,
47
- case MO_32:
58
+ gen_helper_fmmla_s, a->rd, a->rn, a->rm, a->ra,
48
- if (!dc_isar_feature(aa64_sve_f32mm, s)) {
59
+ 0, FPST_FPCR)
49
- return false;
60
+TRANS_FEAT_NONSTREAMING(FMMLA_d, aa64_sve_f64mm, gen_gvec_fpst_zzzz,
50
- }
61
+ gen_helper_fmmla_d, a->rd, a->rn, a->rm, a->ra,
51
- fn = gen_helper_fmmla_s;
62
+ 0, FPST_FPCR)
52
- break;
53
- case MO_64:
54
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
55
- return false;
56
- }
57
- fn = gen_helper_fmmla_d;
58
- break;
59
- default:
60
- return false;
61
- }
62
-
63
- return gen_gvec_fpst_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR);
64
-}
65
+TRANS_FEAT(FMMLA_s, aa64_sve_f32mm, gen_gvec_fpst_zzzz, gen_helper_fmmla_s,
66
+ a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR)
67
+TRANS_FEAT(FMMLA_d, aa64_sve_f64mm, gen_gvec_fpst_zzzz, gen_helper_fmmla_d,
68
+ a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR)
69
63
70
static gen_helper_gvec_4 * const sqdmlal_zzzw_fns[] = {
64
static gen_helper_gvec_4 * const sqdmlal_zzzw_fns[] = {
71
NULL, gen_helper_sve2_sqdmlal_zzzw_h,
65
NULL, gen_helper_sve2_sqdmlal_zzzw_h,
66
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(BFDOT_zzzz, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
67
TRANS_FEAT(BFDOT_zzxz, aa64_sve_bf16, gen_gvec_ool_arg_zzxz,
68
gen_helper_gvec_bfdot_idx, a)
69
70
-TRANS_FEAT(BFMMLA, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
71
- gen_helper_gvec_bfmmla, a, 0)
72
+TRANS_FEAT_NONSTREAMING(BFMMLA, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
73
+ gen_helper_gvec_bfmmla, a, 0)
74
75
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
76
{
72
--
77
--
73
2.25.1
78
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Mark these as a non-streaming instructions, which should trap
4
if full a64 support is not enabled in streaming mode.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-91-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-9-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/translate-sve.c | 14 ++++++--------
11
target/arm/sme-fa64.decode | 3 ---
9
1 file changed, 6 insertions(+), 8 deletions(-)
12
target/arm/translate-sve.c | 15 +++++++++++----
13
2 files changed, 11 insertions(+), 7 deletions(-)
10
14
15
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sme-fa64.decode
18
+++ b/target/arm/sme-fa64.decode
19
@@ -XXX,XX +XXX,XX @@ FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
20
# --11 1100 --1- ---- ---- ---- ---- --10 # Load/store FP register (register offset)
21
# --11 1101 ---- ---- ---- ---- ---- ---- # Load/store FP register (scaled imm)
22
23
-FAIL 0110 0101 --0- ---- 0000 11-- ---- ---- # FTSMUL
24
-FAIL 0110 0101 --01 0--- 100- ---- ---- ---- # FTMAD
25
-FAIL 0110 0101 --01 1--- 001- ---- ---- ---- # FADDA
26
FAIL 0100 0101 --0- ---- 1001 10-- ---- ---- # SMMLA, UMMLA, USMMLA
27
FAIL 0100 0101 --1- ---- 1--- ---- ---- ---- # SVE2 string/histo/crypto instructions
28
FAIL 1000 010- -00- ---- 10-- ---- ---- ---- # SVE2 32-bit gather NT load (vector+scalar)
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
29
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
31
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
32
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_reduce(DisasContext *s, arg_rpr_esz *a,
33
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3_ptr * const ftmad_fns[4] = {
16
}
34
NULL, gen_helper_sve_ftmad_h,
17
35
gen_helper_sve_ftmad_s, gen_helper_sve_ftmad_d,
18
#define DO_VPZ(NAME, name) \
36
};
19
-static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
37
-TRANS_FEAT(FTMAD, aa64_sve, gen_gvec_fpst_zzz,
20
-{ \
38
- ftmad_fns[a->esz], a->rd, a->rn, a->rm, a->imm,
21
- static gen_helper_fp_reduce * const fns[4] = { \
39
- a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
22
- NULL, gen_helper_sve_##name##_h, \
40
+TRANS_FEAT_NONSTREAMING(FTMAD, aa64_sve, gen_gvec_fpst_zzz,
23
- gen_helper_sve_##name##_s, \
41
+ ftmad_fns[a->esz], a->rd, a->rn, a->rm, a->imm,
24
- gen_helper_sve_##name##_d, \
42
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
25
+ static gen_helper_fp_reduce * const name##_fns[4] = { \
43
26
+ NULL, gen_helper_sve_##name##_h, \
44
/*
27
+ gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
45
*** SVE Floating Point Accumulating Reduction Group
28
}; \
46
@@ -XXX,XX +XXX,XX @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
29
- return do_reduce(s, a, fns[a->esz]); \
47
if (a->esz == 0 || !dc_isar_feature(aa64_sve, s)) {
30
-}
48
return false;
31
+ TRANS_FEAT(NAME, aa64_sve, do_reduce, a, name##_fns[a->esz])
49
}
32
50
+ s->is_nonstreaming = true;
33
DO_VPZ(FADDV, faddv)
51
if (!sve_access_check(s)) {
34
DO_VPZ(FMINNMV, fminnmv)
52
return true;
35
@@ -XXX,XX +XXX,XX @@ DO_VPZ(FMAXNMV, fmaxnmv)
53
}
36
DO_VPZ(FMINV, fminv)
54
@@ -XXX,XX +XXX,XX @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
37
DO_VPZ(FMAXV, fmaxv)
55
DO_FP3(FADD_zzz, fadd)
38
56
DO_FP3(FSUB_zzz, fsub)
39
+#undef DO_VPZ
57
DO_FP3(FMUL_zzz, fmul)
58
-DO_FP3(FTSMUL, ftsmul)
59
DO_FP3(FRECPS, recps)
60
DO_FP3(FRSQRTS, rsqrts)
61
62
#undef DO_FP3
63
64
+static gen_helper_gvec_3_ptr * const ftsmul_fns[4] = {
65
+ NULL, gen_helper_gvec_ftsmul_h,
66
+ gen_helper_gvec_ftsmul_s, gen_helper_gvec_ftsmul_d
67
+};
68
+TRANS_FEAT_NONSTREAMING(FTSMUL, aa64_sve, gen_gvec_fpst_arg_zzz,
69
+ ftsmul_fns[a->esz], a, 0)
40
+
70
+
41
/*
71
/*
42
*** SVE Floating Point Unary Operations - Unpredicated Group
72
*** SVE Floating Point Arithmetic - Predicated Group
43
*/
73
*/
44
--
74
--
45
2.25.1
75
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Convert SVE translation functions directly using
3
Mark these as a non-streaming instructions, which should trap
4
gen_gvec_ool_arg_zzxz to TRANS_FEAT. Also include
4
if full a64 support is not enabled in streaming mode.
5
BFDOT_zzxz, which was using gen_gvec_ool_zzzz.
6
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-15-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-10-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
target/arm/translate-sve.c | 48 +++++++++++---------------------------
11
target/arm/sme-fa64.decode | 1 -
13
1 file changed, 14 insertions(+), 34 deletions(-)
12
target/arm/translate-sve.c | 12 ++++++------
13
2 files changed, 6 insertions(+), 7 deletions(-)
14
14
15
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sme-fa64.decode
18
+++ b/target/arm/sme-fa64.decode
19
@@ -XXX,XX +XXX,XX @@ FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
20
# --11 1100 --1- ---- ---- ---- ---- --10 # Load/store FP register (register offset)
21
# --11 1101 ---- ---- ---- ---- ---- ---- # Load/store FP register (scaled imm)
22
23
-FAIL 0100 0101 --0- ---- 1001 10-- ---- ---- # SMMLA, UMMLA, USMMLA
24
FAIL 0100 0101 --1- ---- 1--- ---- ---- ---- # SVE2 string/histo/crypto instructions
25
FAIL 1000 010- -00- ---- 10-- ---- ---- ---- # SVE2 32-bit gather NT load (vector+scalar)
26
FAIL 1000 010- -00- ---- 111- ---- ---- ---- # SVE 32-bit gather prefetch (vector+imm)
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
27
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
29
--- a/target/arm/translate-sve.c
18
+++ b/target/arm/translate-sve.c
30
+++ b/target/arm/translate-sve.c
19
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(DOT_zzzz, aa64_sve, gen_gvec_ool_zzzz,
31
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FMLALT_zzxw, aa64_sve2, do_FMLAL_zzxw, a, false, true)
20
* SVE Multiply - Indexed
32
TRANS_FEAT(FMLSLB_zzxw, aa64_sve2, do_FMLAL_zzxw, a, true, false)
21
*/
33
TRANS_FEAT(FMLSLT_zzxw, aa64_sve2, do_FMLAL_zzxw, a, true, true)
22
34
23
-#define DO_RRXR(NAME, FUNC) \
35
-TRANS_FEAT(SMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
24
- static bool NAME(DisasContext *s, arg_rrxr_esz *a) \
36
- gen_helper_gvec_smmla_b, a, 0)
25
- { return gen_gvec_ool_arg_zzxz(s, FUNC, a); }
37
-TRANS_FEAT(USMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
26
+TRANS_FEAT(SDOT_zzxw_s, aa64_sve, gen_gvec_ool_arg_zzxz,
38
- gen_helper_gvec_usmmla_b, a, 0)
27
+ gen_helper_gvec_sdot_idx_b, a)
39
-TRANS_FEAT(UMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
28
+TRANS_FEAT(SDOT_zzxw_d, aa64_sve, gen_gvec_ool_arg_zzxz,
40
- gen_helper_gvec_ummla_b, a, 0)
29
+ gen_helper_gvec_sdot_idx_h, a)
41
+TRANS_FEAT_NONSTREAMING(SMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
30
+TRANS_FEAT(UDOT_zzxw_s, aa64_sve, gen_gvec_ool_arg_zzxz,
42
+ gen_helper_gvec_smmla_b, a, 0)
31
+ gen_helper_gvec_udot_idx_b, a)
43
+TRANS_FEAT_NONSTREAMING(USMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
32
+TRANS_FEAT(UDOT_zzxw_d, aa64_sve, gen_gvec_ool_arg_zzxz,
44
+ gen_helper_gvec_usmmla_b, a, 0)
33
+ gen_helper_gvec_udot_idx_h, a)
45
+TRANS_FEAT_NONSTREAMING(UMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
34
46
+ gen_helper_gvec_ummla_b, a, 0)
35
-DO_RRXR(trans_SDOT_zzxw_s, gen_helper_gvec_sdot_idx_b)
36
-DO_RRXR(trans_SDOT_zzxw_d, gen_helper_gvec_sdot_idx_h)
37
-DO_RRXR(trans_UDOT_zzxw_s, gen_helper_gvec_udot_idx_b)
38
-DO_RRXR(trans_UDOT_zzxw_d, gen_helper_gvec_udot_idx_h)
39
-
40
-static bool trans_SUDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
41
-{
42
- if (!dc_isar_feature(aa64_sve_i8mm, s)) {
43
- return false;
44
- }
45
- return gen_gvec_ool_arg_zzxz(s, gen_helper_gvec_sudot_idx_b, a);
46
-}
47
-
48
-static bool trans_USDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
49
-{
50
- if (!dc_isar_feature(aa64_sve_i8mm, s)) {
51
- return false;
52
- }
53
- return gen_gvec_ool_arg_zzxz(s, gen_helper_gvec_usdot_idx_b, a);
54
-}
55
-
56
-#undef DO_RRXR
57
+TRANS_FEAT(SUDOT_zzxw_s, aa64_sve_i8mm, gen_gvec_ool_arg_zzxz,
58
+ gen_helper_gvec_sudot_idx_b, a)
59
+TRANS_FEAT(USDOT_zzxw_s, aa64_sve_i8mm, gen_gvec_ool_arg_zzxz,
60
+ gen_helper_gvec_usdot_idx_b, a)
61
62
static bool do_sve2_zzz_data(DisasContext *s, int rd, int rn, int rm, int data,
63
gen_helper_gvec_3 *fn)
64
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(UMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
65
47
66
TRANS_FEAT(BFDOT_zzzz, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
48
TRANS_FEAT(BFDOT_zzzz, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
67
gen_helper_gvec_bfdot, a, 0)
49
gen_helper_gvec_bfdot, a, 0)
68
-
69
-static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
70
-{
71
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
72
- return false;
73
- }
74
- return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot_idx,
75
- a->rd, a->rn, a->rm, a->ra, a->index);
76
-}
77
+TRANS_FEAT(BFDOT_zzxz, aa64_sve_bf16, gen_gvec_ool_arg_zzxz,
78
+ gen_helper_gvec_bfdot_idx, a)
79
80
TRANS_FEAT(BFMMLA, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
81
gen_helper_gvec_bfmmla, a, 0)
82
--
50
--
83
2.25.1
51
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Mark these as non-streaming instructions, which should trap
4
if full a64 support is not enabled in streaming mode.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-68-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-11-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/translate-sve.c | 28 ++++++++--------------------
11
target/arm/sme-fa64.decode | 1 -
9
1 file changed, 8 insertions(+), 20 deletions(-)
12
target/arm/translate-sve.c | 35 ++++++++++++++++++-----------------
13
2 files changed, 18 insertions(+), 18 deletions(-)
10
14
15
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sme-fa64.decode
18
+++ b/target/arm/sme-fa64.decode
19
@@ -XXX,XX +XXX,XX @@ FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
20
# --11 1100 --1- ---- ---- ---- ---- --10 # Load/store FP register (register offset)
21
# --11 1101 ---- ---- ---- ---- ---- ---- # Load/store FP register (scaled imm)
22
23
-FAIL 0100 0101 --1- ---- 1--- ---- ---- ---- # SVE2 string/histo/crypto instructions
24
FAIL 1000 010- -00- ---- 10-- ---- ---- ---- # SVE2 32-bit gather NT load (vector+scalar)
25
FAIL 1000 010- -00- ---- 111- ---- ---- ---- # SVE 32-bit gather prefetch (vector+imm)
26
FAIL 1000 0100 0-1- ---- 0--- ---- ---- ---- # SVE 32-bit gather prefetch (scalar+vector)
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
27
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
29
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
30
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ DO_SVE2_ZZZ_NARROW(SUBHNT, subhnt)
31
@@ -XXX,XX +XXX,XX @@ DO_SVE2_ZZZ_NARROW(RSUBHNT, rsubhnt)
16
DO_SVE2_ZZZ_NARROW(RSUBHNB, rsubhnb)
32
static gen_helper_gvec_flags_4 * const match_fns[4] = {
17
DO_SVE2_ZZZ_NARROW(RSUBHNT, rsubhnt)
33
gen_helper_sve2_match_ppzz_b, gen_helper_sve2_match_ppzz_h, NULL, NULL
18
34
};
19
-static bool do_sve2_ppzz_flags(DisasContext *s, arg_rprr_esz *a,
35
-TRANS_FEAT(MATCH, aa64_sve2, do_ppzz_flags, a, match_fns[a->esz])
20
- gen_helper_gvec_flags_4 *fn)
36
+TRANS_FEAT_NONSTREAMING(MATCH, aa64_sve2, do_ppzz_flags, a, match_fns[a->esz])
21
-{
37
22
- if (!dc_isar_feature(aa64_sve2, s)) {
38
static gen_helper_gvec_flags_4 * const nmatch_fns[4] = {
23
- return false;
39
gen_helper_sve2_nmatch_ppzz_b, gen_helper_sve2_nmatch_ppzz_h, NULL, NULL
24
- }
40
};
25
- return do_ppzz_flags(s, a, fn);
41
-TRANS_FEAT(NMATCH, aa64_sve2, do_ppzz_flags, a, nmatch_fns[a->esz])
26
-}
42
+TRANS_FEAT_NONSTREAMING(NMATCH, aa64_sve2, do_ppzz_flags, a, nmatch_fns[a->esz])
27
+static gen_helper_gvec_flags_4 * const match_fns[4] = {
28
+ gen_helper_sve2_match_ppzz_b, gen_helper_sve2_match_ppzz_h, NULL, NULL
29
+};
30
+TRANS_FEAT(MATCH, aa64_sve2, do_ppzz_flags, a, match_fns[a->esz])
31
32
-#define DO_SVE2_PPZZ_MATCH(NAME, name) \
33
-static bool trans_##NAME(DisasContext *s, arg_rprr_esz *a) \
34
-{ \
35
- static gen_helper_gvec_flags_4 * const fns[4] = { \
36
- gen_helper_sve2_##name##_ppzz_b, gen_helper_sve2_##name##_ppzz_h, \
37
- NULL, NULL \
38
- }; \
39
- return do_sve2_ppzz_flags(s, a, fns[a->esz]); \
40
-}
41
-
42
-DO_SVE2_PPZZ_MATCH(MATCH, match)
43
-DO_SVE2_PPZZ_MATCH(NMATCH, nmatch)
44
+static gen_helper_gvec_flags_4 * const nmatch_fns[4] = {
45
+ gen_helper_sve2_nmatch_ppzz_b, gen_helper_sve2_nmatch_ppzz_h, NULL, NULL
46
+};
47
+TRANS_FEAT(NMATCH, aa64_sve2, do_ppzz_flags, a, nmatch_fns[a->esz])
48
43
49
static gen_helper_gvec_4 * const histcnt_fns[4] = {
44
static gen_helper_gvec_4 * const histcnt_fns[4] = {
50
NULL, NULL, gen_helper_sve2_histcnt_s, gen_helper_sve2_histcnt_d
45
NULL, NULL, gen_helper_sve2_histcnt_s, gen_helper_sve2_histcnt_d
46
};
47
-TRANS_FEAT(HISTCNT, aa64_sve2, gen_gvec_ool_arg_zpzz,
48
- histcnt_fns[a->esz], a, 0)
49
+TRANS_FEAT_NONSTREAMING(HISTCNT, aa64_sve2, gen_gvec_ool_arg_zpzz,
50
+ histcnt_fns[a->esz], a, 0)
51
52
-TRANS_FEAT(HISTSEG, aa64_sve2, gen_gvec_ool_arg_zzz,
53
- a->esz == 0 ? gen_helper_sve2_histseg : NULL, a, 0)
54
+TRANS_FEAT_NONSTREAMING(HISTSEG, aa64_sve2, gen_gvec_ool_arg_zzz,
55
+ a->esz == 0 ? gen_helper_sve2_histseg : NULL, a, 0)
56
57
DO_ZPZZ_FP(FADDP, aa64_sve2, sve2_faddp_zpzz)
58
DO_ZPZZ_FP(FMAXNMP, aa64_sve2, sve2_fmaxnmp_zpzz)
59
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SQRDCMLAH_zzzz, aa64_sve2, gen_gvec_ool_zzzz,
60
TRANS_FEAT(USDOT_zzzz, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
61
a->esz == 2 ? gen_helper_gvec_usdot_b : NULL, a, 0)
62
63
-TRANS_FEAT(AESMC, aa64_sve2_aes, gen_gvec_ool_zz,
64
- gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt)
65
+TRANS_FEAT_NONSTREAMING(AESMC, aa64_sve2_aes, gen_gvec_ool_zz,
66
+ gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt)
67
68
-TRANS_FEAT(AESE, aa64_sve2_aes, gen_gvec_ool_arg_zzz,
69
- gen_helper_crypto_aese, a, false)
70
-TRANS_FEAT(AESD, aa64_sve2_aes, gen_gvec_ool_arg_zzz,
71
- gen_helper_crypto_aese, a, true)
72
+TRANS_FEAT_NONSTREAMING(AESE, aa64_sve2_aes, gen_gvec_ool_arg_zzz,
73
+ gen_helper_crypto_aese, a, false)
74
+TRANS_FEAT_NONSTREAMING(AESD, aa64_sve2_aes, gen_gvec_ool_arg_zzz,
75
+ gen_helper_crypto_aese, a, true)
76
77
-TRANS_FEAT(SM4E, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
78
- gen_helper_crypto_sm4e, a, 0)
79
-TRANS_FEAT(SM4EKEY, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
80
- gen_helper_crypto_sm4ekey, a, 0)
81
+TRANS_FEAT_NONSTREAMING(SM4E, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
82
+ gen_helper_crypto_sm4e, a, 0)
83
+TRANS_FEAT_NONSTREAMING(SM4EKEY, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
84
+ gen_helper_crypto_sm4ekey, a, 0)
85
86
-TRANS_FEAT(RAX1, aa64_sve2_sha3, gen_gvec_fn_arg_zzz, gen_gvec_rax1, a)
87
+TRANS_FEAT_NONSTREAMING(RAX1, aa64_sve2_sha3, gen_gvec_fn_arg_zzz,
88
+ gen_gvec_rax1, a)
89
90
TRANS_FEAT(FCVTNT_sh, aa64_sve2, gen_gvec_fpst_arg_zpz,
91
gen_helper_sve2_fcvtnt_sh, a, 0, FPST_FPCR)
51
--
92
--
52
2.25.1
93
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Simplify indexing of this array. This will allow folding
3
Mark these as a non-streaming instructions, which should trap
4
of the illegal esz == 0 into the normal fn == NULL check.
4
if full a64 support is not enabled in streaming mode.
5
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-93-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-12-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/translate-sve.c | 15 ++++++++-------
11
target/arm/sme-fa64.decode | 9 ---------
12
1 file changed, 8 insertions(+), 7 deletions(-)
12
target/arm/translate-sve.c | 6 ++++++
13
2 files changed, 6 insertions(+), 9 deletions(-)
13
14
15
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sme-fa64.decode
18
+++ b/target/arm/sme-fa64.decode
19
@@ -XXX,XX +XXX,XX @@ FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
20
# --11 1100 --1- ---- ---- ---- ---- --10 # Load/store FP register (register offset)
21
# --11 1101 ---- ---- ---- ---- ---- ---- # Load/store FP register (scaled imm)
22
23
-FAIL 1000 010- -00- ---- 10-- ---- ---- ---- # SVE2 32-bit gather NT load (vector+scalar)
24
FAIL 1000 010- -00- ---- 111- ---- ---- ---- # SVE 32-bit gather prefetch (vector+imm)
25
FAIL 1000 0100 0-1- ---- 0--- ---- ---- ---- # SVE 32-bit gather prefetch (scalar+vector)
26
-FAIL 1000 010- -01- ---- 1--- ---- ---- ---- # SVE 32-bit gather load (vector+imm)
27
-FAIL 1000 0100 0-0- ---- 0--- ---- ---- ---- # SVE 32-bit gather load byte (scalar+vector)
28
-FAIL 1000 0100 1--- ---- 0--- ---- ---- ---- # SVE 32-bit gather load half (scalar+vector)
29
-FAIL 1000 0101 0--- ---- 0--- ---- ---- ---- # SVE 32-bit gather load word (scalar+vector)
30
FAIL 1010 010- ---- ---- 011- ---- ---- ---- # SVE contiguous FF load (scalar+scalar)
31
FAIL 1010 010- ---1 ---- 101- ---- ---- ---- # SVE contiguous NF load (scalar+imm)
32
FAIL 1010 010- -01- ---- 000- ---- ---- ---- # SVE load & replicate 32 bytes (scalar+scalar)
33
FAIL 1010 010- -010 ---- 001- ---- ---- ---- # SVE load & replicate 32 bytes (scalar+imm)
34
FAIL 1100 010- ---- ---- ---- ---- ---- ---- # SVE 64-bit gather load/prefetch
35
-FAIL 1110 010- -00- ---- 001- ---- ---- ---- # SVE2 64-bit scatter NT store (vector+scalar)
36
-FAIL 1110 010- -10- ---- 001- ---- ---- ---- # SVE2 32-bit scatter NT store (vector+scalar)
37
-FAIL 1110 010- ---- ---- 1-0- ---- ---- ---- # SVE scatter store (scalar+32-bit vector)
38
-FAIL 1110 010- ---- ---- 101- ---- ---- ---- # SVE scatter store (misc)
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
39
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
40
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
41
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
42
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_FCVTZU_dd(DisasContext *s, arg_rpr_esz *a)
43
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1_zprz(DisasContext *s, arg_LD1_zprz *a)
19
return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzu_dd);
44
if (!dc_isar_feature(aa64_sve, s)) {
20
}
21
22
-static gen_helper_gvec_3_ptr * const frint_fns[3] = {
23
+static gen_helper_gvec_3_ptr * const frint_fns[] = {
24
+ NULL,
25
gen_helper_sve_frint_h,
26
gen_helper_sve_frint_s,
27
gen_helper_sve_frint_d
28
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTI(DisasContext *s, arg_rpr_esz *a)
29
return false;
45
return false;
30
}
46
}
31
return do_zpz_ptr(s, a->rd, a->rn, a->pg, a->esz == MO_16,
47
+ s->is_nonstreaming = true;
32
- frint_fns[a->esz - 1]);
48
if (!sve_access_check(s)) {
33
+ frint_fns[a->esz]);
49
return true;
34
}
50
}
35
51
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1_zpiz(DisasContext *s, arg_LD1_zpiz *a)
36
static bool trans_FRINTX(DisasContext *s, arg_rpr_esz *a)
52
if (!dc_isar_feature(aa64_sve, s)) {
37
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTN(DisasContext *s, arg_rpr_esz *a)
38
if (a->esz == 0) {
39
return false;
53
return false;
40
}
54
}
41
- return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz - 1]);
55
+ s->is_nonstreaming = true;
42
+ return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz]);
56
if (!sve_access_check(s)) {
43
}
57
return true;
44
58
}
45
static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
59
@@ -XXX,XX +XXX,XX @@ static bool trans_LDNT1_zprz(DisasContext *s, arg_LD1_zprz *a)
46
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
60
if (!dc_isar_feature(aa64_sve2, s)) {
47
if (a->esz == 0) {
48
return false;
61
return false;
49
}
62
}
50
- return do_frint_mode(s, a, float_round_up, frint_fns[a->esz - 1]);
63
+ s->is_nonstreaming = true;
51
+ return do_frint_mode(s, a, float_round_up, frint_fns[a->esz]);
64
if (!sve_access_check(s)) {
52
}
65
return true;
53
66
}
54
static bool trans_FRINTM(DisasContext *s, arg_rpr_esz *a)
67
@@ -XXX,XX +XXX,XX @@ static bool trans_ST1_zprz(DisasContext *s, arg_ST1_zprz *a)
55
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTM(DisasContext *s, arg_rpr_esz *a)
68
if (!dc_isar_feature(aa64_sve, s)) {
56
if (a->esz == 0) {
57
return false;
69
return false;
58
}
70
}
59
- return do_frint_mode(s, a, float_round_down, frint_fns[a->esz - 1]);
71
+ s->is_nonstreaming = true;
60
+ return do_frint_mode(s, a, float_round_down, frint_fns[a->esz]);
72
if (!sve_access_check(s)) {
61
}
73
return true;
62
74
}
63
static bool trans_FRINTZ(DisasContext *s, arg_rpr_esz *a)
75
@@ -XXX,XX +XXX,XX @@ static bool trans_ST1_zpiz(DisasContext *s, arg_ST1_zpiz *a)
64
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTZ(DisasContext *s, arg_rpr_esz *a)
76
if (!dc_isar_feature(aa64_sve, s)) {
65
if (a->esz == 0) {
66
return false;
77
return false;
67
}
78
}
68
- return do_frint_mode(s, a, float_round_to_zero, frint_fns[a->esz - 1]);
79
+ s->is_nonstreaming = true;
69
+ return do_frint_mode(s, a, float_round_to_zero, frint_fns[a->esz]);
80
if (!sve_access_check(s)) {
70
}
81
return true;
71
82
}
72
static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
83
@@ -XXX,XX +XXX,XX @@ static bool trans_STNT1_zprz(DisasContext *s, arg_ST1_zprz *a)
73
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
84
if (!dc_isar_feature(aa64_sve2, s)) {
74
if (a->esz == 0) {
75
return false;
85
return false;
76
}
86
}
77
- return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz - 1]);
87
+ s->is_nonstreaming = true;
78
+ return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz]);
88
if (!sve_access_check(s)) {
79
}
89
return true;
80
90
}
81
static bool trans_FRECPX(DisasContext *s, arg_rpr_esz *a)
82
--
91
--
83
2.25.1
92
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Remove the unparsed extraction in trans_DUP_i,
3
Mark these as a non-streaming instructions, which should trap if full
4
which is intended to reject an 8-bit shift of
4
a64 support is not enabled in streaming mode. In this case, introduce
5
an 8-bit constant for 8-bit element.
5
PRF_ns (prefetch non-streaming) to handle the checks.
6
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-72-richard.henderson@linaro.org
9
Message-id: 20220708151540.18136-13-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
11
---
12
target/arm/sve.decode | 5 ++++-
12
target/arm/sme-fa64.decode | 3 ---
13
target/arm/translate-sve.c | 10 ++++++----
13
target/arm/sve.decode | 10 +++++-----
14
2 files changed, 10 insertions(+), 5 deletions(-)
14
target/arm/translate-sve.c | 11 +++++++++++
15
3 files changed, 16 insertions(+), 8 deletions(-)
15
16
17
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/sme-fa64.decode
20
+++ b/target/arm/sme-fa64.decode
21
@@ -XXX,XX +XXX,XX @@ FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
22
# --11 1100 --1- ---- ---- ---- ---- --10 # Load/store FP register (register offset)
23
# --11 1101 ---- ---- ---- ---- ---- ---- # Load/store FP register (scaled imm)
24
25
-FAIL 1000 010- -00- ---- 111- ---- ---- ---- # SVE 32-bit gather prefetch (vector+imm)
26
-FAIL 1000 0100 0-1- ---- 0--- ---- ---- ---- # SVE 32-bit gather prefetch (scalar+vector)
27
FAIL 1010 010- ---- ---- 011- ---- ---- ---- # SVE contiguous FF load (scalar+scalar)
28
FAIL 1010 010- ---1 ---- 101- ---- ---- ---- # SVE contiguous NF load (scalar+imm)
29
FAIL 1010 010- -01- ---- 000- ---- ---- ---- # SVE load & replicate 32 bytes (scalar+scalar)
30
FAIL 1010 010- -010 ---- 001- ---- ---- ---- # SVE load & replicate 32 bytes (scalar+imm)
31
-FAIL 1100 010- ---- ---- ---- ---- ---- ---- # SVE 64-bit gather load/prefetch
16
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
32
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
17
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/sve.decode
34
--- a/target/arm/sve.decode
19
+++ b/target/arm/sve.decode
35
+++ b/target/arm/sve.decode
20
@@ -XXX,XX +XXX,XX @@ WHILE_ptr 00100101 esz:2 1 rm:5 001 100 rn:5 rw:1 rd:4
36
@@ -XXX,XX +XXX,XX @@ LD1RO_zpri 1010010 .. 01 0.... 001 ... ..... ..... \
21
FDUP 00100101 esz:2 111 00 1110 imm:8 rd:5
37
@rpri_load_msz nreg=0
22
38
23
# SVE broadcast integer immediate (unpredicated)
39
# SVE 32-bit gather prefetch (scalar plus 32-bit scaled offsets)
24
-DUP_i 00100101 esz:2 111 00 011 . ........ rd:5 imm=%sh8_i8s
40
-PRF 1000010 00 -1 ----- 0-- --- ----- 0 ----
25
+{
41
+PRF_ns 1000010 00 -1 ----- 0-- --- ----- 0 ----
26
+ INVALID 00100101 00 111 00 011 1 -------- -----
42
27
+ DUP_i 00100101 esz:2 111 00 011 . ........ rd:5 imm=%sh8_i8s
43
# SVE 32-bit gather prefetch (vector plus immediate)
28
+}
44
-PRF 1000010 -- 00 ----- 111 --- ----- 0 ----
29
45
+PRF_ns 1000010 -- 00 ----- 111 --- ----- 0 ----
30
# SVE integer add/subtract immediate (unpredicated)
46
31
ADD_zzi 00100101 .. 100 000 11 . ........ ..... @rdn_sh_i8u
47
# SVE contiguous prefetch (scalar plus immediate)
48
PRF 1000010 11 1- ----- 0-- --- ----- 0 ----
49
@@ -XXX,XX +XXX,XX @@ LD1_zpiz 1100010 .. 01 ..... 1.. ... ..... ..... \
50
@rpri_g_load esz=3
51
52
# SVE 64-bit gather prefetch (scalar plus 64-bit scaled offsets)
53
-PRF 1100010 00 11 ----- 1-- --- ----- 0 ----
54
+PRF_ns 1100010 00 11 ----- 1-- --- ----- 0 ----
55
56
# SVE 64-bit gather prefetch (scalar plus unpacked 32-bit scaled offsets)
57
-PRF 1100010 00 -1 ----- 0-- --- ----- 0 ----
58
+PRF_ns 1100010 00 -1 ----- 0-- --- ----- 0 ----
59
60
# SVE 64-bit gather prefetch (vector plus immediate)
61
-PRF 1100010 -- 00 ----- 111 --- ----- 0 ----
62
+PRF_ns 1100010 -- 00 ----- 111 --- ----- 0 ----
63
64
### SVE Memory Store Group
65
32
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
66
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
33
index XXXXXXX..XXXXXXX 100644
67
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/translate-sve.c
68
--- a/target/arm/translate-sve.c
35
+++ b/target/arm/translate-sve.c
69
+++ b/target/arm/translate-sve.c
36
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
70
@@ -XXX,XX +XXX,XX @@ static bool trans_PRF_rr(DisasContext *s, arg_PRF_rr *a)
37
0x1111111111111111ull, 0x0101010101010101ull
71
return true;
38
};
72
}
39
73
40
+static bool trans_INVALID(DisasContext *s, arg_INVALID *a)
74
+static bool trans_PRF_ns(DisasContext *s, arg_PRF_ns *a)
41
+{
75
+{
42
+ unallocated_encoding(s);
76
+ if (!dc_isar_feature(aa64_sve, s)) {
77
+ return false;
78
+ }
79
+ /* Prefetch is a nop within QEMU. */
80
+ s->is_nonstreaming = true;
81
+ (void)sve_access_check(s);
43
+ return true;
82
+ return true;
44
+}
83
+}
45
+
84
+
46
/*
85
/*
47
*** SVE Logical - Unpredicated Group
86
* Move Prefix
48
*/
87
*
49
@@ -XXX,XX +XXX,XX @@ static bool trans_FDUP(DisasContext *s, arg_FDUP *a)
50
51
static bool trans_DUP_i(DisasContext *s, arg_DUP_i *a)
52
{
53
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
54
- return false;
55
- }
56
if (sve_access_check(s)) {
57
unsigned vsz = vec_full_reg_size(s);
58
int dofs = vec_full_reg_offset(s, a->rd);
59
-
60
tcg_gen_gvec_dup_imm(a->esz, dofs, vsz, vsz, a->imm);
61
}
62
return true;
63
--
88
--
64
2.25.1
89
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Mark these as a non-streaming instructions, which should trap
4
if full a64 support is not enabled in streaming mode.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-9-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-14-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/translate-sve.c | 102 ++++++++++++++-----------------------
11
target/arm/sme-fa64.decode | 2 --
9
1 file changed, 38 insertions(+), 64 deletions(-)
12
target/arm/translate-sve.c | 2 ++
13
2 files changed, 2 insertions(+), 2 deletions(-)
10
14
15
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sme-fa64.decode
18
+++ b/target/arm/sme-fa64.decode
19
@@ -XXX,XX +XXX,XX @@ FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
20
# --11 1100 --1- ---- ---- ---- ---- --10 # Load/store FP register (register offset)
21
# --11 1101 ---- ---- ---- ---- ---- ---- # Load/store FP register (scaled imm)
22
23
-FAIL 1010 010- ---- ---- 011- ---- ---- ---- # SVE contiguous FF load (scalar+scalar)
24
-FAIL 1010 010- ---1 ---- 101- ---- ---- ---- # SVE contiguous NF load (scalar+imm)
25
FAIL 1010 010- -01- ---- 000- ---- ---- ---- # SVE load & replicate 32 bytes (scalar+scalar)
26
FAIL 1010 010- -010 ---- 001- ---- ---- ---- # SVE load & replicate 32 bytes (scalar+imm)
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
27
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
29
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
30
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
31
@@ -XXX,XX +XXX,XX @@ static bool trans_LDFF1_zprr(DisasContext *s, arg_rprr_load *a)
16
}
32
if (!dc_isar_feature(aa64_sve, s)) {
17
18
/* Invoke an out-of-line helper on 4 Zregs. */
19
-static void gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
20
+static bool gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
21
int rd, int rn, int rm, int ra, int data)
22
{
23
- unsigned vsz = vec_full_reg_size(s);
24
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
25
- vec_full_reg_offset(s, rn),
26
- vec_full_reg_offset(s, rm),
27
- vec_full_reg_offset(s, ra),
28
- vsz, vsz, data, fn);
29
+ if (fn == NULL) {
30
+ return false;
31
+ }
32
+ if (sve_access_check(s)) {
33
+ unsigned vsz = vec_full_reg_size(s);
34
+ tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
35
+ vec_full_reg_offset(s, rn),
36
+ vec_full_reg_offset(s, rm),
37
+ vec_full_reg_offset(s, ra),
38
+ vsz, vsz, data, fn);
39
+ }
40
+ return true;
41
}
42
43
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
44
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
45
if (!dc_isar_feature(aa64_sve2, s)) {
46
return false;
33
return false;
47
}
34
}
48
- if (sve_access_check(s)) {
35
+ s->is_nonstreaming = true;
49
- gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
36
if (sve_access_check(s)) {
50
- (a->rn + 1) % 32, a->rm, 0);
37
TCGv_i64 addr = new_tmp_a64(s);
51
- }
38
tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), dtype_msz(a->dtype));
52
- return true;
39
@@ -XXX,XX +XXX,XX @@ static bool trans_LDNF1_zpri(DisasContext *s, arg_rpri_load *a)
53
+ return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
40
if (!dc_isar_feature(aa64_sve, s)) {
54
+ (a->rn + 1) % 32, a->rm, 0);
55
}
56
57
static gen_helper_gvec_3 * const tbx_fns[4] = {
58
@@ -XXX,XX +XXX,XX @@ static bool trans_DOT_zzzz(DisasContext *s, arg_DOT_zzzz *a)
59
{ gen_helper_gvec_sdot_b, gen_helper_gvec_sdot_h },
60
{ gen_helper_gvec_udot_b, gen_helper_gvec_udot_h }
61
};
62
-
63
- if (sve_access_check(s)) {
64
- gen_gvec_ool_zzzz(s, fns[a->u][a->sz], a->rd, a->rn, a->rm, a->ra, 0);
65
- }
66
- return true;
67
+ return gen_gvec_ool_zzzz(s, fns[a->u][a->sz],
68
+ a->rd, a->rn, a->rm, a->ra, 0);
69
}
70
71
/*
72
@@ -XXX,XX +XXX,XX @@ static bool trans_DOT_zzzz(DisasContext *s, arg_DOT_zzzz *a)
73
static bool do_zzxz_ool(DisasContext *s, arg_rrxr_esz *a,
74
gen_helper_gvec_4 *fn)
75
{
76
- if (fn == NULL) {
77
- return false;
78
- }
79
- if (sve_access_check(s)) {
80
- gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
81
- }
82
- return true;
83
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
84
}
85
86
#define DO_RRXR(NAME, FUNC) \
87
@@ -XXX,XX +XXX,XX @@ static bool trans_SQCADD_rot270(DisasContext *s, arg_rrr_esz *a)
88
static bool do_sve2_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
89
gen_helper_gvec_4 *fn, int data)
90
{
91
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
92
+ if (!dc_isar_feature(aa64_sve2, s)) {
93
return false;
41
return false;
94
}
42
}
95
- if (sve_access_check(s)) {
43
+ s->is_nonstreaming = true;
96
- gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
44
if (sve_access_check(s)) {
97
- }
45
int vsz = vec_full_reg_size(s);
98
- return true;
46
int elements = vsz >> dtype_esz[a->dtype];
99
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
100
}
101
102
static bool do_abal(DisasContext *s, arg_rrrr_esz *a, bool uns, bool sel)
103
@@ -XXX,XX +XXX,XX @@ static bool trans_CMLA_zzzz(DisasContext *s, arg_CMLA_zzzz *a)
104
if (!dc_isar_feature(aa64_sve2, s)) {
105
return false;
106
}
107
- if (sve_access_check(s)) {
108
- gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot);
109
- }
110
- return true;
111
+ return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
112
+ a->rm, a->ra, a->rot);
113
}
114
115
static bool trans_CDOT_zzzz(DisasContext *s, arg_CMLA_zzzz *a)
116
{
117
- if (!dc_isar_feature(aa64_sve2, s) || a->esz < MO_32) {
118
+ static gen_helper_gvec_4 * const fns[] = {
119
+ NULL, NULL, gen_helper_sve2_cdot_zzzz_s, gen_helper_sve2_cdot_zzzz_d
120
+ };
121
+
122
+ if (!dc_isar_feature(aa64_sve2, s)) {
123
return false;
124
}
125
- if (sve_access_check(s)) {
126
- gen_helper_gvec_4 *fn = (a->esz == MO_32
127
- ? gen_helper_sve2_cdot_zzzz_s
128
- : gen_helper_sve2_cdot_zzzz_d);
129
- gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->rot);
130
- }
131
- return true;
132
+ return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
133
+ a->rm, a->ra, a->rot);
134
}
135
136
static bool trans_SQRDCMLAH_zzzz(DisasContext *s, arg_SQRDCMLAH_zzzz *a)
137
@@ -XXX,XX +XXX,XX @@ static bool trans_SQRDCMLAH_zzzz(DisasContext *s, arg_SQRDCMLAH_zzzz *a)
138
if (!dc_isar_feature(aa64_sve2, s)) {
139
return false;
140
}
141
- if (sve_access_check(s)) {
142
- gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot);
143
- }
144
- return true;
145
+ return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
146
+ a->rm, a->ra, a->rot);
147
}
148
149
static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
150
@@ -XXX,XX +XXX,XX @@ static bool do_i8mm_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
151
if (!dc_isar_feature(aa64_sve_i8mm, s)) {
152
return false;
153
}
154
- if (sve_access_check(s)) {
155
- gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
156
- }
157
- return true;
158
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
159
}
160
161
static bool trans_SMMLA(DisasContext *s, arg_rrrr_esz *a)
162
@@ -XXX,XX +XXX,XX @@ static bool trans_BFDOT_zzzz(DisasContext *s, arg_rrrr_esz *a)
163
if (!dc_isar_feature(aa64_sve_bf16, s)) {
164
return false;
165
}
166
- if (sve_access_check(s)) {
167
- gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot,
168
- a->rd, a->rn, a->rm, a->ra, 0);
169
- }
170
- return true;
171
+ return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot,
172
+ a->rd, a->rn, a->rm, a->ra, 0);
173
}
174
175
static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
176
@@ -XXX,XX +XXX,XX @@ static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
177
if (!dc_isar_feature(aa64_sve_bf16, s)) {
178
return false;
179
}
180
- if (sve_access_check(s)) {
181
- gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot_idx,
182
- a->rd, a->rn, a->rm, a->ra, a->index);
183
- }
184
- return true;
185
+ return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot_idx,
186
+ a->rd, a->rn, a->rm, a->ra, a->index);
187
}
188
189
static bool trans_BFMMLA(DisasContext *s, arg_rrrr_esz *a)
190
@@ -XXX,XX +XXX,XX @@ static bool trans_BFMMLA(DisasContext *s, arg_rrrr_esz *a)
191
if (!dc_isar_feature(aa64_sve_bf16, s)) {
192
return false;
193
}
194
- if (sve_access_check(s)) {
195
- gen_gvec_ool_zzzz(s, gen_helper_gvec_bfmmla,
196
- a->rd, a->rn, a->rm, a->ra, 0);
197
- }
198
- return true;
199
+ return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfmmla,
200
+ a->rd, a->rn, a->rm, a->ra, 0);
201
}
202
203
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
204
--
47
--
205
2.25.1
48
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Use gen_gvec_ool_arg_zzz instead of gen_gvec_ool_zzz
3
Mark these as a non-streaming instructions, which should trap
4
when the arguments come from arg_rrr_esz.
4
if full a64 support is not enabled in streaming mode.
5
Replaces do_zzw_ool and do_zzz_data_ool.
6
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-6-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-15-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
target/arm/translate-sve.c | 48 +++++++++++++++++---------------------
11
target/arm/sme-fa64.decode | 3 ---
13
1 file changed, 21 insertions(+), 27 deletions(-)
12
target/arm/translate-sve.c | 2 ++
13
2 files changed, 2 insertions(+), 3 deletions(-)
14
14
15
diff --git a/target/arm/sme-fa64.decode b/target/arm/sme-fa64.decode
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sme-fa64.decode
18
+++ b/target/arm/sme-fa64.decode
19
@@ -XXX,XX +XXX,XX @@ FAIL 0001 1110 0111 1110 0000 00-- ---- ---- # FJCVTZS
20
# --11 1100 --0- ---- ---- ---- ---- ---- # Load/store FP register (unscaled imm)
21
# --11 1100 --1- ---- ---- ---- ---- --10 # Load/store FP register (register offset)
22
# --11 1101 ---- ---- ---- ---- ---- ---- # Load/store FP register (scaled imm)
23
-
24
-FAIL 1010 010- -01- ---- 000- ---- ---- ---- # SVE load & replicate 32 bytes (scalar+scalar)
25
-FAIL 1010 010- -010 ---- 001- ---- ---- ---- # SVE load & replicate 32 bytes (scalar+imm)
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
26
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
28
--- a/target/arm/translate-sve.c
18
+++ b/target/arm/translate-sve.c
29
+++ b/target/arm/translate-sve.c
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
30
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1RO_zprr(DisasContext *s, arg_rprr_load *a)
20
return true;
31
if (a->rm == 31) {
21
}
22
23
+static bool gen_gvec_ool_arg_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
24
+ arg_rrr_esz *a, int data)
25
+{
26
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
27
+}
28
+
29
/* Invoke an out-of-line helper on 4 Zregs. */
30
static void gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
31
int rd, int rn, int rm, int ra, int data)
32
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zzi(DisasContext *s, arg_rri_esz *a)
33
return do_shift_imm(s, a, false, tcg_gen_gvec_shli);
34
}
35
36
-static bool do_zzw_ool(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
37
-{
38
- return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
39
-}
40
-
41
#define DO_ZZW(NAME, name) \
42
static bool trans_##NAME##_zzw(DisasContext *s, arg_rrr_esz *a) \
43
{ \
44
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME##_zzw(DisasContext *s, arg_rrr_esz *a) \
45
gen_helper_sve_##name##_zzw_b, gen_helper_sve_##name##_zzw_h, \
46
gen_helper_sve_##name##_zzw_s, NULL \
47
}; \
48
- return do_zzw_ool(s, a, fns[a->esz]); \
49
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0); \
50
}
51
52
DO_ZZW(ASR, asr)
53
@@ -XXX,XX +XXX,XX @@ static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
54
gen_helper_sve_ftssel_s,
55
gen_helper_sve_ftssel_d,
56
};
57
- return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
58
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
59
}
60
61
/*
62
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
63
gen_helper_sve_tbl_b, gen_helper_sve_tbl_h,
64
gen_helper_sve_tbl_s, gen_helper_sve_tbl_d
65
};
66
- return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
67
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
68
}
69
70
static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
71
@@ -XXX,XX +XXX,XX @@ static bool trans_TBX(DisasContext *s, arg_rrr_esz *a)
72
if (!dc_isar_feature(aa64_sve2, s)) {
73
return false;
32
return false;
74
}
33
}
75
- return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
34
+ s->is_nonstreaming = true;
76
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
35
if (sve_access_check(s)) {
77
}
36
TCGv_i64 addr = new_tmp_a64(s);
78
37
tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), dtype_msz(a->dtype));
79
static bool trans_UNPK(DisasContext *s, arg_UNPK *a)
38
@@ -XXX,XX +XXX,XX @@ static bool trans_LD1RO_zpri(DisasContext *s, arg_rpri_load *a)
80
@@ -XXX,XX +XXX,XX @@ static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
81
return true;
82
}
83
84
-static bool do_zzz_data_ool(DisasContext *s, arg_rrr_esz *a, int data,
85
- gen_helper_gvec_3 *fn)
86
-{
87
- return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
88
-}
89
-
90
static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
91
{
92
return do_zip(s, a, false);
93
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const uzp_fns[4] = {
94
95
static bool trans_UZP1_z(DisasContext *s, arg_rrr_esz *a)
96
{
97
- return do_zzz_data_ool(s, a, 0, uzp_fns[a->esz]);
98
+ return gen_gvec_ool_arg_zzz(s, uzp_fns[a->esz], a, 0);
99
}
100
101
static bool trans_UZP2_z(DisasContext *s, arg_rrr_esz *a)
102
{
103
- return do_zzz_data_ool(s, a, 1 << a->esz, uzp_fns[a->esz]);
104
+ return gen_gvec_ool_arg_zzz(s, uzp_fns[a->esz], a, 1 << a->esz);
105
}
106
107
static bool trans_UZP1_q(DisasContext *s, arg_rrr_esz *a)
108
@@ -XXX,XX +XXX,XX @@ static bool trans_UZP1_q(DisasContext *s, arg_rrr_esz *a)
109
if (!dc_isar_feature(aa64_sve_f64mm, s)) {
39
if (!dc_isar_feature(aa64_sve_f64mm, s)) {
110
return false;
40
return false;
111
}
41
}
112
- return do_zzz_data_ool(s, a, 0, gen_helper_sve2_uzp_q);
42
+ s->is_nonstreaming = true;
113
+ return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_uzp_q, a, 0);
43
if (sve_access_check(s)) {
114
}
44
TCGv_i64 addr = new_tmp_a64(s);
115
45
tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn), a->imm * 32);
116
static bool trans_UZP2_q(DisasContext *s, arg_rrr_esz *a)
117
@@ -XXX,XX +XXX,XX @@ static bool trans_UZP2_q(DisasContext *s, arg_rrr_esz *a)
118
if (!dc_isar_feature(aa64_sve_f64mm, s)) {
119
return false;
120
}
121
- return do_zzz_data_ool(s, a, 16, gen_helper_sve2_uzp_q);
122
+ return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_uzp_q, a, 16);
123
}
124
125
static gen_helper_gvec_3 * const trn_fns[4] = {
126
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const trn_fns[4] = {
127
128
static bool trans_TRN1_z(DisasContext *s, arg_rrr_esz *a)
129
{
130
- return do_zzz_data_ool(s, a, 0, trn_fns[a->esz]);
131
+ return gen_gvec_ool_arg_zzz(s, trn_fns[a->esz], a, 0);
132
}
133
134
static bool trans_TRN2_z(DisasContext *s, arg_rrr_esz *a)
135
{
136
- return do_zzz_data_ool(s, a, 1 << a->esz, trn_fns[a->esz]);
137
+ return gen_gvec_ool_arg_zzz(s, trn_fns[a->esz], a, 1 << a->esz);
138
}
139
140
static bool trans_TRN1_q(DisasContext *s, arg_rrr_esz *a)
141
@@ -XXX,XX +XXX,XX @@ static bool trans_TRN1_q(DisasContext *s, arg_rrr_esz *a)
142
if (!dc_isar_feature(aa64_sve_f64mm, s)) {
143
return false;
144
}
145
- return do_zzz_data_ool(s, a, 0, gen_helper_sve2_trn_q);
146
+ return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_trn_q, a, 0);
147
}
148
149
static bool trans_TRN2_q(DisasContext *s, arg_rrr_esz *a)
150
@@ -XXX,XX +XXX,XX @@ static bool trans_TRN2_q(DisasContext *s, arg_rrr_esz *a)
151
if (!dc_isar_feature(aa64_sve_f64mm, s)) {
152
return false;
153
}
154
- return do_zzz_data_ool(s, a, 16, gen_helper_sve2_trn_q);
155
+ return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_trn_q, a, 16);
156
}
157
158
/*
159
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zzz_ool(DisasContext *s, arg_rrr_esz *a,
160
if (!dc_isar_feature(aa64_sve2, s)) {
161
return false;
162
}
163
- return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
164
+ return gen_gvec_ool_arg_zzz(s, fn, a, 0);
165
}
166
167
static bool trans_SMULH_zzz(DisasContext *s, arg_rrr_esz *a)
168
@@ -XXX,XX +XXX,XX @@ static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
169
if (!dc_isar_feature(aa64_sve2_aes, s)) {
170
return false;
171
}
172
- return gen_gvec_ool_zzz(s, gen_helper_crypto_aese,
173
- a->rd, a->rn, a->rm, decrypt);
174
+ return gen_gvec_ool_arg_zzz(s, gen_helper_crypto_aese, a, decrypt);
175
}
176
177
static bool trans_AESE(DisasContext *s, arg_rrr_esz *a)
178
@@ -XXX,XX +XXX,XX @@ static bool do_sm4(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
179
if (!dc_isar_feature(aa64_sve2_sm4, s)) {
180
return false;
181
}
182
- return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
183
+ return gen_gvec_ool_arg_zzz(s, fn, a, 0);
184
}
185
186
static bool trans_SM4E(DisasContext *s, arg_rrr_esz *a)
187
--
46
--
188
2.25.1
47
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Rename do_zz_fp to gen_gvec_fpst_arg_zz, and move up.
3
These functions will be used to verify that the cpu
4
Split out gen_gvec_fpst_zz as a helper while we're at it.
4
is in the correct state for a given instruction.
5
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-92-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-16-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/translate-sve.c | 77 ++++++++++++++++++--------------------
11
target/arm/translate-a64.h | 21 +++++++++++++++++++++
12
1 file changed, 36 insertions(+), 41 deletions(-)
12
target/arm/translate-a64.c | 34 ++++++++++++++++++++++++++++++++++
13
2 files changed, 55 insertions(+)
13
14
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
--- a/target/arm/translate-a64.h
17
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/translate-a64.h
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
19
@@ -XXX,XX +XXX,XX @@ void write_fp_dreg(DisasContext *s, int reg, TCGv_i64 v);
20
bool logic_imm_decode_wmask(uint64_t *result, unsigned int immn,
21
unsigned int imms, unsigned int immr);
22
bool sve_access_check(DisasContext *s);
23
+bool sme_enabled_check(DisasContext *s);
24
+bool sme_enabled_check_with_svcr(DisasContext *s, unsigned);
25
+
26
+/* This function corresponds to CheckStreamingSVEEnabled. */
27
+static inline bool sme_sm_enabled_check(DisasContext *s)
28
+{
29
+ return sme_enabled_check_with_svcr(s, R_SVCR_SM_MASK);
30
+}
31
+
32
+/* This function corresponds to CheckSMEAndZAEnabled. */
33
+static inline bool sme_za_enabled_check(DisasContext *s)
34
+{
35
+ return sme_enabled_check_with_svcr(s, R_SVCR_ZA_MASK);
36
+}
37
+
38
+/* Note that this function corresponds to CheckStreamingSVEAndZAEnabled. */
39
+static inline bool sme_smza_enabled_check(DisasContext *s)
40
+{
41
+ return sme_enabled_check_with_svcr(s, R_SVCR_SM_MASK | R_SVCR_ZA_MASK);
42
+}
43
+
44
TCGv_i64 clean_data_tbi(DisasContext *s, TCGv_i64 addr);
45
TCGv_i64 gen_mte_check1(DisasContext *s, TCGv_i64 addr, bool is_write,
46
bool tag_checked, int log2_size);
47
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/target/arm/translate-a64.c
50
+++ b/target/arm/translate-a64.c
51
@@ -XXX,XX +XXX,XX @@ static bool sme_access_check(DisasContext *s)
19
return true;
52
return true;
20
}
53
}
21
54
22
+static bool gen_gvec_fpst_zz(DisasContext *s, gen_helper_gvec_2_ptr *fn,
55
+/* This function corresponds to CheckSMEEnabled. */
23
+ int rd, int rn, int data,
56
+bool sme_enabled_check(DisasContext *s)
24
+ ARMFPStatusFlavour flavour)
25
+{
57
+{
26
+ if (fn == NULL) {
58
+ /*
59
+ * Note that unlike sve_excp_el, we have not constrained sme_excp_el
60
+ * to be zero when fp_excp_el has priority. This is because we need
61
+ * sme_excp_el by itself for cpregs access checks.
62
+ */
63
+ if (!s->fp_excp_el || s->sme_excp_el < s->fp_excp_el) {
64
+ s->fp_access_checked = true;
65
+ return sme_access_check(s);
66
+ }
67
+ return fp_access_check_only(s);
68
+}
69
+
70
+/* Common subroutine for CheckSMEAnd*Enabled. */
71
+bool sme_enabled_check_with_svcr(DisasContext *s, unsigned req)
72
+{
73
+ if (!sme_enabled_check(s)) {
27
+ return false;
74
+ return false;
28
+ }
75
+ }
29
+ if (sve_access_check(s)) {
76
+ if (FIELD_EX64(req, SVCR, SM) && !s->pstate_sm) {
30
+ unsigned vsz = vec_full_reg_size(s);
77
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
31
+ TCGv_ptr status = fpstatus_ptr(flavour);
78
+ syn_smetrap(SME_ET_NotStreaming, false));
32
+
79
+ return false;
33
+ tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, rd),
80
+ }
34
+ vec_full_reg_offset(s, rn),
81
+ if (FIELD_EX64(req, SVCR, ZA) && !s->pstate_za) {
35
+ status, vsz, vsz, data, fn);
82
+ gen_exception_insn(s, s->pc_curr, EXCP_UDEF,
36
+ tcg_temp_free_ptr(status);
83
+ syn_smetrap(SME_ET_InactiveZA, false));
84
+ return false;
37
+ }
85
+ }
38
+ return true;
86
+ return true;
39
+}
87
+}
40
+
88
+
41
+static bool gen_gvec_fpst_arg_zz(DisasContext *s, gen_helper_gvec_2_ptr *fn,
42
+ arg_rr_esz *a, int data)
43
+{
44
+ return gen_gvec_fpst_zz(s, fn, a->rd, a->rn, data,
45
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
46
+}
47
+
48
/* Invoke an out-of-line helper on 3 Zregs. */
49
static bool gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
50
int rd, int rn, int rm, int data)
51
@@ -XXX,XX +XXX,XX @@ DO_VPZ(FMAXV, fmaxv)
52
*** SVE Floating Point Unary Operations - Unpredicated Group
53
*/
54
55
-static void do_zz_fp(DisasContext *s, arg_rr_esz *a, gen_helper_gvec_2_ptr *fn)
56
-{
57
- unsigned vsz = vec_full_reg_size(s);
58
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
59
+static gen_helper_gvec_2_ptr * const frecpe_fns[] = {
60
+ NULL, gen_helper_gvec_frecpe_h,
61
+ gen_helper_gvec_frecpe_s, gen_helper_gvec_frecpe_d,
62
+};
63
+TRANS_FEAT(FRECPE, aa64_sve, gen_gvec_fpst_arg_zz, frecpe_fns[a->esz], a, 0)
64
65
- tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, a->rd),
66
- vec_full_reg_offset(s, a->rn),
67
- status, vsz, vsz, 0, fn);
68
- tcg_temp_free_ptr(status);
69
-}
70
-
71
-static bool trans_FRECPE(DisasContext *s, arg_rr_esz *a)
72
-{
73
- static gen_helper_gvec_2_ptr * const fns[3] = {
74
- gen_helper_gvec_frecpe_h,
75
- gen_helper_gvec_frecpe_s,
76
- gen_helper_gvec_frecpe_d,
77
- };
78
- if (a->esz == 0) {
79
- return false;
80
- }
81
- if (sve_access_check(s)) {
82
- do_zz_fp(s, a, fns[a->esz - 1]);
83
- }
84
- return true;
85
-}
86
-
87
-static bool trans_FRSQRTE(DisasContext *s, arg_rr_esz *a)
88
-{
89
- static gen_helper_gvec_2_ptr * const fns[3] = {
90
- gen_helper_gvec_frsqrte_h,
91
- gen_helper_gvec_frsqrte_s,
92
- gen_helper_gvec_frsqrte_d,
93
- };
94
- if (a->esz == 0) {
95
- return false;
96
- }
97
- if (sve_access_check(s)) {
98
- do_zz_fp(s, a, fns[a->esz - 1]);
99
- }
100
- return true;
101
-}
102
+static gen_helper_gvec_2_ptr * const frsqrte_fns[] = {
103
+ NULL, gen_helper_gvec_frsqrte_h,
104
+ gen_helper_gvec_frsqrte_s, gen_helper_gvec_frsqrte_d,
105
+};
106
+TRANS_FEAT(FRSQRTE, aa64_sve, gen_gvec_fpst_arg_zz, frsqrte_fns[a->esz], a, 0)
107
108
/*
89
/*
109
*** SVE Floating Point Compare with Zero Group
90
* This utility function is for doing register extension with an
91
* optional shift. You will likely want to pass a temporary for the
110
--
92
--
111
2.25.1
93
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Rename the function to match gen_gvec_fn_zzz,
3
The pseudocode for CheckSVEEnabled gains a check for Streaming
4
and move to be adjacent.
4
SVE mode, and for SME present but SVE absent.
5
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-32-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-17-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/translate-sve.c | 31 ++++++++++++++++---------------
11
target/arm/translate-a64.c | 22 ++++++++++++++++------
12
1 file changed, 16 insertions(+), 15 deletions(-)
12
1 file changed, 16 insertions(+), 6 deletions(-)
13
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
16
--- a/target/arm/translate-a64.c
17
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/translate-a64.c
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
18
@@ -XXX,XX +XXX,XX @@ static bool fp_access_check(DisasContext *s)
19
return true;
19
return true;
20
}
20
}
21
21
22
+static bool gen_gvec_fn_arg_zzz(DisasContext *s, GVecGen3Fn *fn,
22
-/* Check that SVE access is enabled. If it is, return true.
23
+ arg_rrr_esz *a)
23
+/*
24
+{
24
+ * Check that SVE access is enabled. If it is, return true.
25
+ return gen_gvec_fn_zzz(s, fn, a->esz, a->rd, a->rn, a->rm);
25
* If not, emit code to generate an appropriate exception and return false.
26
+}
26
+ * This function corresponds to CheckSVEEnabled().
27
*/
28
bool sve_access_check(DisasContext *s)
29
{
30
- if (s->sve_excp_el) {
31
- assert(!s->sve_access_checked);
32
- s->sve_access_checked = true;
33
-
34
+ if (s->pstate_sm || !dc_isar_feature(aa64_sve, s)) {
35
+ assert(dc_isar_feature(aa64_sme, s));
36
+ if (!sme_sm_enabled_check(s)) {
37
+ goto fail_exit;
38
+ }
39
+ } else if (s->sve_excp_el) {
40
gen_exception_insn_el(s, s->pc_curr, EXCP_UDEF,
41
syn_sve_access_trap(), s->sve_excp_el);
42
- return false;
43
+ goto fail_exit;
44
}
45
s->sve_access_checked = true;
46
return fp_access_check(s);
27
+
47
+
28
/* Invoke a vector expander on four Zregs. */
48
+ fail_exit:
29
static void gen_gvec_fn_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
49
+ /* Assert that we only raise one exception per instruction. */
30
int esz, int rd, int rn, int rm, int ra)
50
+ assert(!s->sve_access_checked);
31
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
51
+ s->sve_access_checked = true;
32
*** SVE Logical - Unpredicated Group
52
+ return false;
33
*/
34
35
-static bool do_zzz_fn(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *gvec_fn)
36
-{
37
- return gen_gvec_fn_zzz(s, gvec_fn, a->esz, a->rd, a->rn, a->rm);
38
-}
39
-
40
static bool trans_AND_zzz(DisasContext *s, arg_rrr_esz *a)
41
{
42
- return do_zzz_fn(s, a, tcg_gen_gvec_and);
43
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_and, a);
44
}
53
}
45
46
static bool trans_ORR_zzz(DisasContext *s, arg_rrr_esz *a)
47
{
48
- return do_zzz_fn(s, a, tcg_gen_gvec_or);
49
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_or, a);
50
}
51
52
static bool trans_EOR_zzz(DisasContext *s, arg_rrr_esz *a)
53
{
54
- return do_zzz_fn(s, a, tcg_gen_gvec_xor);
55
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_xor, a);
56
}
57
58
static bool trans_BIC_zzz(DisasContext *s, arg_rrr_esz *a)
59
{
60
- return do_zzz_fn(s, a, tcg_gen_gvec_andc);
61
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_andc, a);
62
}
63
64
static void gen_xar8_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, int64_t sh)
65
@@ -XXX,XX +XXX,XX @@ static bool trans_NBSL(DisasContext *s, arg_rrrr_esz *a)
66
67
static bool trans_ADD_zzz(DisasContext *s, arg_rrr_esz *a)
68
{
69
- return do_zzz_fn(s, a, tcg_gen_gvec_add);
70
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_add, a);
71
}
72
73
static bool trans_SUB_zzz(DisasContext *s, arg_rrr_esz *a)
74
{
75
- return do_zzz_fn(s, a, tcg_gen_gvec_sub);
76
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_sub, a);
77
}
78
79
static bool trans_SQADD_zzz(DisasContext *s, arg_rrr_esz *a)
80
{
81
- return do_zzz_fn(s, a, tcg_gen_gvec_ssadd);
82
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_ssadd, a);
83
}
84
85
static bool trans_SQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
86
{
87
- return do_zzz_fn(s, a, tcg_gen_gvec_sssub);
88
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_sssub, a);
89
}
90
91
static bool trans_UQADD_zzz(DisasContext *s, arg_rrr_esz *a)
92
{
93
- return do_zzz_fn(s, a, tcg_gen_gvec_usadd);
94
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_usadd, a);
95
}
96
97
static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
98
{
99
- return do_zzz_fn(s, a, tcg_gen_gvec_ussub);
100
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_ussub, a);
101
}
102
54
103
/*
55
/*
104
--
56
--
105
2.25.1
57
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
We have two places that perform this particular operation.
3
These SME instructions are nominally within the SVE decode space,
4
so we add them to sve.decode and translate-sve.c.
4
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-39-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-18-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
---
10
target/arm/translate-sve.c | 30 +++++++++++++++++-------------
11
target/arm/translate-a64.h | 12 ++++++++++++
11
1 file changed, 17 insertions(+), 13 deletions(-)
12
target/arm/sve.decode | 5 ++++-
13
target/arm/translate-sve.c | 38 ++++++++++++++++++++++++++++++++++++++
14
3 files changed, 54 insertions(+), 1 deletion(-)
12
15
16
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate-a64.h
19
+++ b/target/arm/translate-a64.h
20
@@ -XXX,XX +XXX,XX @@ static inline int vec_full_reg_size(DisasContext *s)
21
return s->vl;
22
}
23
24
+/* Return the byte size of the vector register, SVL / 8. */
25
+static inline int streaming_vec_reg_size(DisasContext *s)
26
+{
27
+ return s->svl;
28
+}
29
+
30
/*
31
* Return the offset info CPUARMState of the predicate vector register Pn.
32
* Note for this purpose, FFR is P16.
33
@@ -XXX,XX +XXX,XX @@ static inline int pred_full_reg_size(DisasContext *s)
34
return s->vl >> 3;
35
}
36
37
+/* Return the byte size of the predicate register, SVL / 64. */
38
+static inline int streaming_pred_reg_size(DisasContext *s)
39
+{
40
+ return s->svl >> 3;
41
+}
42
+
43
/*
44
* Round up the size of a register to a size allowed by
45
* the tcg vector infrastructure. Any operation which uses this
46
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/sve.decode
49
+++ b/target/arm/sve.decode
50
@@ -XXX,XX +XXX,XX @@ INDEX_ri 00000100 esz:2 1 imm:s5 010001 rn:5 rd:5
51
# SVE index generation (register start, register increment)
52
INDEX_rr 00000100 .. 1 ..... 010011 ..... ..... @rd_rn_rm
53
54
-### SVE Stack Allocation Group
55
+### SVE / Streaming SVE Stack Allocation Group
56
57
# SVE stack frame adjustment
58
ADDVL 00000100 001 ..... 01010 ...... ..... @rd_rn_i6
59
+ADDSVL 00000100 001 ..... 01011 ...... ..... @rd_rn_i6
60
ADDPL 00000100 011 ..... 01010 ...... ..... @rd_rn_i6
61
+ADDSPL 00000100 011 ..... 01011 ...... ..... @rd_rn_i6
62
63
# SVE stack frame size
64
RDVL 00000100 101 11111 01010 imm:s6 rd:5
65
+RDSVL 00000100 101 11111 01011 imm:s6 rd:5
66
67
### SVE Bitwise Shift - Unpredicated Group
68
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
69
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
70
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
71
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-sve.c
72
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzz(DisasContext *s, gen_helper_gvec_4 *fn,
73
@@ -XXX,XX +XXX,XX @@ static bool trans_ADDVL(DisasContext *s, arg_ADDVL *a)
18
return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, data);
74
return true;
19
}
75
}
20
76
21
+/* Invoke a vector expander on two Zregs and an immediate. */
77
+static bool trans_ADDSVL(DisasContext *s, arg_ADDSVL *a)
22
+static bool gen_gvec_fn_zzi(DisasContext *s, GVecGen2iFn *gvec_fn,
23
+ int esz, int rd, int rn, uint64_t imm)
24
+{
78
+{
25
+ if (gvec_fn == NULL) {
79
+ if (!dc_isar_feature(aa64_sme, s)) {
26
+ return false;
80
+ return false;
27
+ }
81
+ }
28
+ if (sve_access_check(s)) {
82
+ if (sme_enabled_check(s)) {
29
+ unsigned vsz = vec_full_reg_size(s);
83
+ TCGv_i64 rd = cpu_reg_sp(s, a->rd);
30
+ gvec_fn(esz, vec_full_reg_offset(s, rd),
84
+ TCGv_i64 rn = cpu_reg_sp(s, a->rn);
31
+ vec_full_reg_offset(s, rn), imm, vsz, vsz);
85
+ tcg_gen_addi_i64(rd, rn, a->imm * streaming_vec_reg_size(s));
32
+ }
86
+ }
33
+ return true;
87
+ return true;
34
+}
88
+}
35
+
89
+
36
/* Invoke a vector expander on three Zregs. */
90
static bool trans_ADDPL(DisasContext *s, arg_ADDPL *a)
37
static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
91
{
38
int esz, int rd, int rn, int rm)
92
if (!dc_isar_feature(aa64_sve, s)) {
39
@@ -XXX,XX +XXX,XX @@ static bool do_zz_dbm(DisasContext *s, arg_rr_dbm *a, GVecGen2iFn *gvec_fn)
93
@@ -XXX,XX +XXX,XX @@ static bool trans_ADDPL(DisasContext *s, arg_ADDPL *a)
40
extract32(a->dbm, 6, 6))) {
94
return true;
41
return false;
42
}
43
- if (sve_access_check(s)) {
44
- unsigned vsz = vec_full_reg_size(s);
45
- gvec_fn(MO_64, vec_full_reg_offset(s, a->rd),
46
- vec_full_reg_offset(s, a->rn), imm, vsz, vsz);
47
- }
48
- return true;
49
+ return gen_gvec_fn_zzi(s, gvec_fn, MO_64, a->rd, a->rn, imm);
50
}
95
}
51
96
52
static bool trans_AND_zzi(DisasContext *s, arg_rr_dbm *a)
97
+static bool trans_ADDSPL(DisasContext *s, arg_ADDSPL *a)
53
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
98
+{
54
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
99
+ if (!dc_isar_feature(aa64_sme, s)) {
55
return false;
100
+ return false;
56
}
101
+ }
57
- if (sve_access_check(s)) {
102
+ if (sme_enabled_check(s)) {
58
- unsigned vsz = vec_full_reg_size(s);
103
+ TCGv_i64 rd = cpu_reg_sp(s, a->rd);
59
- unsigned rd_ofs = vec_full_reg_offset(s, a->rd);
104
+ TCGv_i64 rn = cpu_reg_sp(s, a->rn);
60
- unsigned rn_ofs = vec_full_reg_offset(s, a->rn);
105
+ tcg_gen_addi_i64(rd, rn, a->imm * streaming_pred_reg_size(s));
61
- fn(a->esz, rd_ofs, rn_ofs, a->imm, vsz, vsz);
106
+ }
62
- }
107
+ return true;
63
- return true;
108
+}
64
+ return gen_gvec_fn_zzi(s, fn, a->esz, a->rd, a->rn, a->imm);
109
+
110
static bool trans_RDVL(DisasContext *s, arg_RDVL *a)
111
{
112
if (!dc_isar_feature(aa64_sve, s)) {
113
@@ -XXX,XX +XXX,XX @@ static bool trans_RDVL(DisasContext *s, arg_RDVL *a)
114
return true;
65
}
115
}
66
116
67
static bool trans_SSRA(DisasContext *s, arg_rri_esz *a)
117
+static bool trans_RDSVL(DisasContext *s, arg_RDSVL *a)
118
+{
119
+ if (!dc_isar_feature(aa64_sme, s)) {
120
+ return false;
121
+ }
122
+ if (sme_enabled_check(s)) {
123
+ TCGv_i64 reg = cpu_reg(s, a->rd);
124
+ tcg_gen_movi_i64(reg, a->imm * streaming_vec_reg_size(s));
125
+ }
126
+ return true;
127
+}
128
+
129
/*
130
*** SVE Compute Vector Address Group
131
*/
68
--
132
--
69
2.25.1
133
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Rename the function to match other expansion function and
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
move to be adjacent. Split out gen_gvec_fpst_zzp as a
5
helper while we're at it.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-94-richard.henderson@linaro.org
5
Message-id: 20220708151540.18136-19-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
7
---
12
target/arm/translate-sve.c | 392 ++++++++++++-------------------------
8
target/arm/helper-sme.h | 2 ++
13
1 file changed, 129 insertions(+), 263 deletions(-)
9
target/arm/sme.decode | 4 ++++
10
target/arm/sme_helper.c | 25 +++++++++++++++++++++++++
11
target/arm/translate-sme.c | 13 +++++++++++++
12
4 files changed, 44 insertions(+)
14
13
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/helper-sme.h b/target/arm/helper-sme.h
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
16
--- a/target/arm/helper-sme.h
18
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/helper-sme.h
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzi(DisasContext *s, gen_helper_gvec_3 *fn,
18
@@ -XXX,XX +XXX,XX @@
20
return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
19
20
DEF_HELPER_FLAGS_2(set_pstate_sm, TCG_CALL_NO_RWG, void, env, i32)
21
DEF_HELPER_FLAGS_2(set_pstate_za, TCG_CALL_NO_RWG, void, env, i32)
22
+
23
+DEF_HELPER_FLAGS_3(sme_zero, TCG_CALL_NO_RWG, void, env, i32, i32)
24
diff --git a/target/arm/sme.decode b/target/arm/sme.decode
25
index XXXXXXX..XXXXXXX 100644
26
--- a/target/arm/sme.decode
27
+++ b/target/arm/sme.decode
28
@@ -XXX,XX +XXX,XX @@
29
#
30
# This file is processed by scripts/decodetree.py
31
#
32
+
33
+### SME Misc
34
+
35
+ZERO 11000000 00 001 00000000000 imm:8
36
diff --git a/target/arm/sme_helper.c b/target/arm/sme_helper.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/sme_helper.c
39
+++ b/target/arm/sme_helper.c
40
@@ -XXX,XX +XXX,XX @@ void helper_set_pstate_za(CPUARMState *env, uint32_t i)
41
memset(env->zarray, 0, sizeof(env->zarray));
42
}
21
}
43
}
22
44
+
23
+static bool gen_gvec_fpst_zzp(DisasContext *s, gen_helper_gvec_3_ptr *fn,
45
+void helper_sme_zero(CPUARMState *env, uint32_t imm, uint32_t svl)
24
+ int rd, int rn, int pg, int data,
25
+ ARMFPStatusFlavour flavour)
26
+{
46
+{
27
+ if (fn == NULL) {
47
+ uint32_t i;
48
+
49
+ /*
50
+ * Special case clearing the entire ZA space.
51
+ * This falls into the CONSTRAINED UNPREDICTABLE zeroing of any
52
+ * parts of the ZA storage outside of SVL.
53
+ */
54
+ if (imm == 0xff) {
55
+ memset(env->zarray, 0, sizeof(env->zarray));
56
+ return;
57
+ }
58
+
59
+ /*
60
+ * Recall that ZAnH.D[m] is spread across ZA[n+8*m],
61
+ * so each row is discontiguous within ZA[].
62
+ */
63
+ for (i = 0; i < svl; i++) {
64
+ if (imm & (1 << (i % 8))) {
65
+ memset(&env->zarray[i], 0, svl);
66
+ }
67
+ }
68
+}
69
diff --git a/target/arm/translate-sme.c b/target/arm/translate-sme.c
70
index XXXXXXX..XXXXXXX 100644
71
--- a/target/arm/translate-sme.c
72
+++ b/target/arm/translate-sme.c
73
@@ -XXX,XX +XXX,XX @@
74
*/
75
76
#include "decode-sme.c.inc"
77
+
78
+
79
+static bool trans_ZERO(DisasContext *s, arg_ZERO *a)
80
+{
81
+ if (!dc_isar_feature(aa64_sme, s)) {
28
+ return false;
82
+ return false;
29
+ }
83
+ }
30
+ if (sve_access_check(s)) {
84
+ if (sme_za_enabled_check(s)) {
31
+ unsigned vsz = vec_full_reg_size(s);
85
+ gen_helper_sme_zero(cpu_env, tcg_constant_i32(a->imm),
32
+ TCGv_ptr status = fpstatus_ptr(flavour);
86
+ tcg_constant_i32(streaming_vec_reg_size(s)));
33
+
34
+ tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
35
+ vec_full_reg_offset(s, rn),
36
+ pred_full_reg_offset(s, pg),
37
+ status, vsz, vsz, data, fn);
38
+ tcg_temp_free_ptr(status);
39
+ }
87
+ }
40
+ return true;
88
+ return true;
41
+}
89
+}
42
+
43
+static bool gen_gvec_fpst_arg_zpz(DisasContext *s, gen_helper_gvec_3_ptr *fn,
44
+ arg_rpr_esz *a, int data,
45
+ ARMFPStatusFlavour flavour)
46
+{
47
+ return gen_gvec_fpst_zzp(s, fn, a->rd, a->rn, a->pg, data, flavour);
48
+}
49
+
50
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
51
static bool gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
52
int rd, int rn, int rm, int pg, int data)
53
@@ -XXX,XX +XXX,XX @@ static bool trans_FCMLA_zzxz(DisasContext *s, arg_FCMLA_zzxz *a)
54
*** SVE Floating Point Unary Operations Predicated Group
55
*/
56
57
-static bool do_zpz_ptr(DisasContext *s, int rd, int rn, int pg,
58
- bool is_fp16, gen_helper_gvec_3_ptr *fn)
59
-{
60
- if (sve_access_check(s)) {
61
- unsigned vsz = vec_full_reg_size(s);
62
- TCGv_ptr status = fpstatus_ptr(is_fp16 ? FPST_FPCR_F16 : FPST_FPCR);
63
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
64
- vec_full_reg_offset(s, rn),
65
- pred_full_reg_offset(s, pg),
66
- status, vsz, vsz, 0, fn);
67
- tcg_temp_free_ptr(status);
68
- }
69
- return true;
70
-}
71
+TRANS_FEAT(FCVT_sh, aa64_sve, gen_gvec_fpst_arg_zpz,
72
+ gen_helper_sve_fcvt_sh, a, 0, FPST_FPCR)
73
+TRANS_FEAT(FCVT_hs, aa64_sve, gen_gvec_fpst_arg_zpz,
74
+ gen_helper_sve_fcvt_hs, a, 0, FPST_FPCR)
75
76
-static bool trans_FCVT_sh(DisasContext *s, arg_rpr_esz *a)
77
-{
78
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_sh);
79
-}
80
+TRANS_FEAT(BFCVT, aa64_sve_bf16, gen_gvec_fpst_arg_zpz,
81
+ gen_helper_sve_bfcvt, a, 0, FPST_FPCR)
82
83
-static bool trans_FCVT_hs(DisasContext *s, arg_rpr_esz *a)
84
-{
85
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_hs);
86
-}
87
+TRANS_FEAT(FCVT_dh, aa64_sve, gen_gvec_fpst_arg_zpz,
88
+ gen_helper_sve_fcvt_dh, a, 0, FPST_FPCR)
89
+TRANS_FEAT(FCVT_hd, aa64_sve, gen_gvec_fpst_arg_zpz,
90
+ gen_helper_sve_fcvt_hd, a, 0, FPST_FPCR)
91
+TRANS_FEAT(FCVT_ds, aa64_sve, gen_gvec_fpst_arg_zpz,
92
+ gen_helper_sve_fcvt_ds, a, 0, FPST_FPCR)
93
+TRANS_FEAT(FCVT_sd, aa64_sve, gen_gvec_fpst_arg_zpz,
94
+ gen_helper_sve_fcvt_sd, a, 0, FPST_FPCR)
95
96
-static bool trans_BFCVT(DisasContext *s, arg_rpr_esz *a)
97
-{
98
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
99
- return false;
100
- }
101
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_bfcvt);
102
-}
103
+TRANS_FEAT(FCVTZS_hh, aa64_sve, gen_gvec_fpst_arg_zpz,
104
+ gen_helper_sve_fcvtzs_hh, a, 0, FPST_FPCR_F16)
105
+TRANS_FEAT(FCVTZU_hh, aa64_sve, gen_gvec_fpst_arg_zpz,
106
+ gen_helper_sve_fcvtzu_hh, a, 0, FPST_FPCR_F16)
107
+TRANS_FEAT(FCVTZS_hs, aa64_sve, gen_gvec_fpst_arg_zpz,
108
+ gen_helper_sve_fcvtzs_hs, a, 0, FPST_FPCR_F16)
109
+TRANS_FEAT(FCVTZU_hs, aa64_sve, gen_gvec_fpst_arg_zpz,
110
+ gen_helper_sve_fcvtzu_hs, a, 0, FPST_FPCR_F16)
111
+TRANS_FEAT(FCVTZS_hd, aa64_sve, gen_gvec_fpst_arg_zpz,
112
+ gen_helper_sve_fcvtzs_hd, a, 0, FPST_FPCR_F16)
113
+TRANS_FEAT(FCVTZU_hd, aa64_sve, gen_gvec_fpst_arg_zpz,
114
+ gen_helper_sve_fcvtzu_hd, a, 0, FPST_FPCR_F16)
115
116
-static bool trans_FCVT_dh(DisasContext *s, arg_rpr_esz *a)
117
-{
118
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_dh);
119
-}
120
+TRANS_FEAT(FCVTZS_ss, aa64_sve, gen_gvec_fpst_arg_zpz,
121
+ gen_helper_sve_fcvtzs_ss, a, 0, FPST_FPCR)
122
+TRANS_FEAT(FCVTZU_ss, aa64_sve, gen_gvec_fpst_arg_zpz,
123
+ gen_helper_sve_fcvtzu_ss, a, 0, FPST_FPCR)
124
+TRANS_FEAT(FCVTZS_sd, aa64_sve, gen_gvec_fpst_arg_zpz,
125
+ gen_helper_sve_fcvtzs_sd, a, 0, FPST_FPCR)
126
+TRANS_FEAT(FCVTZU_sd, aa64_sve, gen_gvec_fpst_arg_zpz,
127
+ gen_helper_sve_fcvtzu_sd, a, 0, FPST_FPCR)
128
+TRANS_FEAT(FCVTZS_ds, aa64_sve, gen_gvec_fpst_arg_zpz,
129
+ gen_helper_sve_fcvtzs_ds, a, 0, FPST_FPCR)
130
+TRANS_FEAT(FCVTZU_ds, aa64_sve, gen_gvec_fpst_arg_zpz,
131
+ gen_helper_sve_fcvtzu_ds, a, 0, FPST_FPCR)
132
133
-static bool trans_FCVT_hd(DisasContext *s, arg_rpr_esz *a)
134
-{
135
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_hd);
136
-}
137
-
138
-static bool trans_FCVT_ds(DisasContext *s, arg_rpr_esz *a)
139
-{
140
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_ds);
141
-}
142
-
143
-static bool trans_FCVT_sd(DisasContext *s, arg_rpr_esz *a)
144
-{
145
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_sd);
146
-}
147
-
148
-static bool trans_FCVTZS_hh(DisasContext *s, arg_rpr_esz *a)
149
-{
150
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzs_hh);
151
-}
152
-
153
-static bool trans_FCVTZU_hh(DisasContext *s, arg_rpr_esz *a)
154
-{
155
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzu_hh);
156
-}
157
-
158
-static bool trans_FCVTZS_hs(DisasContext *s, arg_rpr_esz *a)
159
-{
160
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzs_hs);
161
-}
162
-
163
-static bool trans_FCVTZU_hs(DisasContext *s, arg_rpr_esz *a)
164
-{
165
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzu_hs);
166
-}
167
-
168
-static bool trans_FCVTZS_hd(DisasContext *s, arg_rpr_esz *a)
169
-{
170
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzs_hd);
171
-}
172
-
173
-static bool trans_FCVTZU_hd(DisasContext *s, arg_rpr_esz *a)
174
-{
175
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzu_hd);
176
-}
177
-
178
-static bool trans_FCVTZS_ss(DisasContext *s, arg_rpr_esz *a)
179
-{
180
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzs_ss);
181
-}
182
-
183
-static bool trans_FCVTZU_ss(DisasContext *s, arg_rpr_esz *a)
184
-{
185
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzu_ss);
186
-}
187
-
188
-static bool trans_FCVTZS_sd(DisasContext *s, arg_rpr_esz *a)
189
-{
190
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzs_sd);
191
-}
192
-
193
-static bool trans_FCVTZU_sd(DisasContext *s, arg_rpr_esz *a)
194
-{
195
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzu_sd);
196
-}
197
-
198
-static bool trans_FCVTZS_ds(DisasContext *s, arg_rpr_esz *a)
199
-{
200
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzs_ds);
201
-}
202
-
203
-static bool trans_FCVTZU_ds(DisasContext *s, arg_rpr_esz *a)
204
-{
205
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzu_ds);
206
-}
207
-
208
-static bool trans_FCVTZS_dd(DisasContext *s, arg_rpr_esz *a)
209
-{
210
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzs_dd);
211
-}
212
-
213
-static bool trans_FCVTZU_dd(DisasContext *s, arg_rpr_esz *a)
214
-{
215
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzu_dd);
216
-}
217
+TRANS_FEAT(FCVTZS_dd, aa64_sve, gen_gvec_fpst_arg_zpz,
218
+ gen_helper_sve_fcvtzs_dd, a, 0, FPST_FPCR)
219
+TRANS_FEAT(FCVTZU_dd, aa64_sve, gen_gvec_fpst_arg_zpz,
220
+ gen_helper_sve_fcvtzu_dd, a, 0, FPST_FPCR)
221
222
static gen_helper_gvec_3_ptr * const frint_fns[] = {
223
NULL,
224
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3_ptr * const frint_fns[] = {
225
gen_helper_sve_frint_s,
226
gen_helper_sve_frint_d
227
};
228
+TRANS_FEAT(FRINTI, aa64_sve, gen_gvec_fpst_arg_zpz, frint_fns[a->esz],
229
+ a, 0, a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
230
231
-static bool trans_FRINTI(DisasContext *s, arg_rpr_esz *a)
232
-{
233
- if (a->esz == 0) {
234
- return false;
235
- }
236
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, a->esz == MO_16,
237
- frint_fns[a->esz]);
238
-}
239
-
240
-static bool trans_FRINTX(DisasContext *s, arg_rpr_esz *a)
241
-{
242
- static gen_helper_gvec_3_ptr * const fns[3] = {
243
- gen_helper_sve_frintx_h,
244
- gen_helper_sve_frintx_s,
245
- gen_helper_sve_frintx_d
246
- };
247
- if (a->esz == 0) {
248
- return false;
249
- }
250
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, a->esz == MO_16, fns[a->esz - 1]);
251
-}
252
+static gen_helper_gvec_3_ptr * const frintx_fns[] = {
253
+ NULL,
254
+ gen_helper_sve_frintx_h,
255
+ gen_helper_sve_frintx_s,
256
+ gen_helper_sve_frintx_d
257
+};
258
+TRANS_FEAT(FRINTX, aa64_sve, gen_gvec_fpst_arg_zpz, frintx_fns[a->esz],
259
+ a, 0, a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
260
261
static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a,
262
int mode, gen_helper_gvec_3_ptr *fn)
263
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
264
return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz]);
265
}
266
267
-static bool trans_FRECPX(DisasContext *s, arg_rpr_esz *a)
268
-{
269
- static gen_helper_gvec_3_ptr * const fns[3] = {
270
- gen_helper_sve_frecpx_h,
271
- gen_helper_sve_frecpx_s,
272
- gen_helper_sve_frecpx_d
273
- };
274
- if (a->esz == 0) {
275
- return false;
276
- }
277
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, a->esz == MO_16, fns[a->esz - 1]);
278
-}
279
+static gen_helper_gvec_3_ptr * const frecpx_fns[] = {
280
+ NULL, gen_helper_sve_frecpx_h,
281
+ gen_helper_sve_frecpx_s, gen_helper_sve_frecpx_d,
282
+};
283
+TRANS_FEAT(FRECPX, aa64_sve, gen_gvec_fpst_arg_zpz, frecpx_fns[a->esz],
284
+ a, 0, a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
285
286
-static bool trans_FSQRT(DisasContext *s, arg_rpr_esz *a)
287
-{
288
- static gen_helper_gvec_3_ptr * const fns[3] = {
289
- gen_helper_sve_fsqrt_h,
290
- gen_helper_sve_fsqrt_s,
291
- gen_helper_sve_fsqrt_d
292
- };
293
- if (a->esz == 0) {
294
- return false;
295
- }
296
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, a->esz == MO_16, fns[a->esz - 1]);
297
-}
298
+static gen_helper_gvec_3_ptr * const fsqrt_fns[] = {
299
+ NULL, gen_helper_sve_fsqrt_h,
300
+ gen_helper_sve_fsqrt_s, gen_helper_sve_fsqrt_d,
301
+};
302
+TRANS_FEAT(FSQRT, aa64_sve, gen_gvec_fpst_arg_zpz, fsqrt_fns[a->esz],
303
+ a, 0, a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
304
305
-static bool trans_SCVTF_hh(DisasContext *s, arg_rpr_esz *a)
306
-{
307
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_scvt_hh);
308
-}
309
+TRANS_FEAT(SCVTF_hh, aa64_sve, gen_gvec_fpst_arg_zpz,
310
+ gen_helper_sve_scvt_hh, a, 0, FPST_FPCR_F16)
311
+TRANS_FEAT(SCVTF_sh, aa64_sve, gen_gvec_fpst_arg_zpz,
312
+ gen_helper_sve_scvt_sh, a, 0, FPST_FPCR_F16)
313
+TRANS_FEAT(SCVTF_dh, aa64_sve, gen_gvec_fpst_arg_zpz,
314
+ gen_helper_sve_scvt_dh, a, 0, FPST_FPCR_F16)
315
316
-static bool trans_SCVTF_sh(DisasContext *s, arg_rpr_esz *a)
317
-{
318
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_scvt_sh);
319
-}
320
+TRANS_FEAT(SCVTF_ss, aa64_sve, gen_gvec_fpst_arg_zpz,
321
+ gen_helper_sve_scvt_ss, a, 0, FPST_FPCR)
322
+TRANS_FEAT(SCVTF_ds, aa64_sve, gen_gvec_fpst_arg_zpz,
323
+ gen_helper_sve_scvt_ds, a, 0, FPST_FPCR)
324
325
-static bool trans_SCVTF_dh(DisasContext *s, arg_rpr_esz *a)
326
-{
327
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_scvt_dh);
328
-}
329
+TRANS_FEAT(SCVTF_sd, aa64_sve, gen_gvec_fpst_arg_zpz,
330
+ gen_helper_sve_scvt_sd, a, 0, FPST_FPCR)
331
+TRANS_FEAT(SCVTF_dd, aa64_sve, gen_gvec_fpst_arg_zpz,
332
+ gen_helper_sve_scvt_dd, a, 0, FPST_FPCR)
333
334
-static bool trans_SCVTF_ss(DisasContext *s, arg_rpr_esz *a)
335
-{
336
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_scvt_ss);
337
-}
338
+TRANS_FEAT(UCVTF_hh, aa64_sve, gen_gvec_fpst_arg_zpz,
339
+ gen_helper_sve_ucvt_hh, a, 0, FPST_FPCR_F16)
340
+TRANS_FEAT(UCVTF_sh, aa64_sve, gen_gvec_fpst_arg_zpz,
341
+ gen_helper_sve_ucvt_sh, a, 0, FPST_FPCR_F16)
342
+TRANS_FEAT(UCVTF_dh, aa64_sve, gen_gvec_fpst_arg_zpz,
343
+ gen_helper_sve_ucvt_dh, a, 0, FPST_FPCR_F16)
344
345
-static bool trans_SCVTF_ds(DisasContext *s, arg_rpr_esz *a)
346
-{
347
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_scvt_ds);
348
-}
349
+TRANS_FEAT(UCVTF_ss, aa64_sve, gen_gvec_fpst_arg_zpz,
350
+ gen_helper_sve_ucvt_ss, a, 0, FPST_FPCR)
351
+TRANS_FEAT(UCVTF_ds, aa64_sve, gen_gvec_fpst_arg_zpz,
352
+ gen_helper_sve_ucvt_ds, a, 0, FPST_FPCR)
353
+TRANS_FEAT(UCVTF_sd, aa64_sve, gen_gvec_fpst_arg_zpz,
354
+ gen_helper_sve_ucvt_sd, a, 0, FPST_FPCR)
355
356
-static bool trans_SCVTF_sd(DisasContext *s, arg_rpr_esz *a)
357
-{
358
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_scvt_sd);
359
-}
360
-
361
-static bool trans_SCVTF_dd(DisasContext *s, arg_rpr_esz *a)
362
-{
363
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_scvt_dd);
364
-}
365
-
366
-static bool trans_UCVTF_hh(DisasContext *s, arg_rpr_esz *a)
367
-{
368
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_ucvt_hh);
369
-}
370
-
371
-static bool trans_UCVTF_sh(DisasContext *s, arg_rpr_esz *a)
372
-{
373
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_ucvt_sh);
374
-}
375
-
376
-static bool trans_UCVTF_dh(DisasContext *s, arg_rpr_esz *a)
377
-{
378
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_ucvt_dh);
379
-}
380
-
381
-static bool trans_UCVTF_ss(DisasContext *s, arg_rpr_esz *a)
382
-{
383
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_ucvt_ss);
384
-}
385
-
386
-static bool trans_UCVTF_ds(DisasContext *s, arg_rpr_esz *a)
387
-{
388
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_ucvt_ds);
389
-}
390
-
391
-static bool trans_UCVTF_sd(DisasContext *s, arg_rpr_esz *a)
392
-{
393
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_ucvt_sd);
394
-}
395
-
396
-static bool trans_UCVTF_dd(DisasContext *s, arg_rpr_esz *a)
397
-{
398
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_ucvt_dd);
399
-}
400
+TRANS_FEAT(UCVTF_dd, aa64_sve, gen_gvec_fpst_arg_zpz,
401
+ gen_helper_sve_ucvt_dd, a, 0, FPST_FPCR)
402
403
/*
404
*** SVE Memory - 32-bit Gather and Unsized Contiguous Group
405
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SM4EKEY, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
406
407
TRANS_FEAT(RAX1, aa64_sve2_sha3, gen_gvec_fn_arg_zzz, gen_gvec_rax1, a)
408
409
-static bool trans_FCVTNT_sh(DisasContext *s, arg_rpr_esz *a)
410
-{
411
- if (!dc_isar_feature(aa64_sve2, s)) {
412
- return false;
413
- }
414
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve2_fcvtnt_sh);
415
-}
416
+TRANS_FEAT(FCVTNT_sh, aa64_sve2, gen_gvec_fpst_arg_zpz,
417
+ gen_helper_sve2_fcvtnt_sh, a, 0, FPST_FPCR)
418
+TRANS_FEAT(FCVTNT_ds, aa64_sve2, gen_gvec_fpst_arg_zpz,
419
+ gen_helper_sve2_fcvtnt_ds, a, 0, FPST_FPCR)
420
421
-static bool trans_BFCVTNT(DisasContext *s, arg_rpr_esz *a)
422
-{
423
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
424
- return false;
425
- }
426
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_bfcvtnt);
427
-}
428
+TRANS_FEAT(BFCVTNT, aa64_sve_bf16, gen_gvec_fpst_arg_zpz,
429
+ gen_helper_sve_bfcvtnt, a, 0, FPST_FPCR)
430
431
-static bool trans_FCVTNT_ds(DisasContext *s, arg_rpr_esz *a)
432
-{
433
- if (!dc_isar_feature(aa64_sve2, s)) {
434
- return false;
435
- }
436
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve2_fcvtnt_ds);
437
-}
438
-
439
-static bool trans_FCVTLT_hs(DisasContext *s, arg_rpr_esz *a)
440
-{
441
- if (!dc_isar_feature(aa64_sve2, s)) {
442
- return false;
443
- }
444
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve2_fcvtlt_hs);
445
-}
446
-
447
-static bool trans_FCVTLT_sd(DisasContext *s, arg_rpr_esz *a)
448
-{
449
- if (!dc_isar_feature(aa64_sve2, s)) {
450
- return false;
451
- }
452
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve2_fcvtlt_sd);
453
-}
454
+TRANS_FEAT(FCVTLT_hs, aa64_sve2, gen_gvec_fpst_arg_zpz,
455
+ gen_helper_sve2_fcvtlt_hs, a, 0, FPST_FPCR)
456
+TRANS_FEAT(FCVTLT_sd, aa64_sve2, gen_gvec_fpst_arg_zpz,
457
+ gen_helper_sve2_fcvtlt_sd, a, 0, FPST_FPCR)
458
459
static bool trans_FCVTX_ds(DisasContext *s, arg_rpr_esz *a)
460
{
461
--
90
--
462
2.25.1
91
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Rename the function to match gen_gvec_ool_arg_zpz,
3
We can reuse the SVE functions for implementing moves to/from
4
and move to be adjacent.
4
horizontal tile slices, but we need new ones for moves to/from
5
vertical tile slices.
5
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-24-richard.henderson@linaro.org
9
Message-id: 20220708151540.18136-20-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
---
11
target/arm/translate-sve.c | 29 ++++++++++++++---------------
12
target/arm/helper-sme.h | 12 +++
12
1 file changed, 14 insertions(+), 15 deletions(-)
13
target/arm/helper-sve.h | 2 +
14
target/arm/translate-a64.h | 8 ++
15
target/arm/translate.h | 5 ++
16
target/arm/sme.decode | 15 ++++
17
target/arm/sme_helper.c | 151 ++++++++++++++++++++++++++++++++++++-
18
target/arm/sve_helper.c | 12 +++
19
target/arm/translate-sme.c | 127 +++++++++++++++++++++++++++++++
20
8 files changed, 331 insertions(+), 1 deletion(-)
13
21
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
22
diff --git a/target/arm/helper-sme.h b/target/arm/helper-sme.h
15
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
24
--- a/target/arm/helper-sme.h
17
+++ b/target/arm/translate-sve.c
25
+++ b/target/arm/helper-sme.h
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpz(DisasContext *s, gen_helper_gvec_3 *fn,
26
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(set_pstate_sm, TCG_CALL_NO_RWG, void, env, i32)
19
return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, data);
27
DEF_HELPER_FLAGS_2(set_pstate_za, TCG_CALL_NO_RWG, void, env, i32)
28
29
DEF_HELPER_FLAGS_3(sme_zero, TCG_CALL_NO_RWG, void, env, i32, i32)
30
+
31
+/* Move to/from vertical array slices, i.e. columns, so 'c'. */
32
+DEF_HELPER_FLAGS_4(sme_mova_cz_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
33
+DEF_HELPER_FLAGS_4(sme_mova_zc_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
34
+DEF_HELPER_FLAGS_4(sme_mova_cz_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
35
+DEF_HELPER_FLAGS_4(sme_mova_zc_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
36
+DEF_HELPER_FLAGS_4(sme_mova_cz_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
37
+DEF_HELPER_FLAGS_4(sme_mova_zc_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
38
+DEF_HELPER_FLAGS_4(sme_mova_cz_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
39
+DEF_HELPER_FLAGS_4(sme_mova_zc_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
40
+DEF_HELPER_FLAGS_4(sme_mova_cz_q, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
41
+DEF_HELPER_FLAGS_4(sme_mova_zc_q, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
42
diff --git a/target/arm/helper-sve.h b/target/arm/helper-sve.h
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/arm/helper-sve.h
45
+++ b/target/arm/helper-sve.h
46
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(sve_sel_zpzz_s, TCG_CALL_NO_RWG,
47
void, ptr, ptr, ptr, ptr, i32)
48
DEF_HELPER_FLAGS_5(sve_sel_zpzz_d, TCG_CALL_NO_RWG,
49
void, ptr, ptr, ptr, ptr, i32)
50
+DEF_HELPER_FLAGS_5(sve_sel_zpzz_q, TCG_CALL_NO_RWG,
51
+ void, ptr, ptr, ptr, ptr, i32)
52
53
DEF_HELPER_FLAGS_5(sve2_addp_zpzz_b, TCG_CALL_NO_RWG,
54
void, ptr, ptr, ptr, ptr, i32)
55
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
56
index XXXXXXX..XXXXXXX 100644
57
--- a/target/arm/translate-a64.h
58
+++ b/target/arm/translate-a64.h
59
@@ -XXX,XX +XXX,XX @@ static inline int pred_gvec_reg_size(DisasContext *s)
60
return size_for_gvec(pred_full_reg_size(s));
20
}
61
}
21
62
22
+static bool gen_gvec_ool_arg_zpzi(DisasContext *s, gen_helper_gvec_3 *fn,
63
+/* Return a newly allocated pointer to the predicate register. */
23
+ arg_rpri_esz *a)
64
+static inline TCGv_ptr pred_full_reg_ptr(DisasContext *s, int regno)
24
+{
65
+{
25
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
66
+ TCGv_ptr ret = tcg_temp_new_ptr();
26
+}
67
+ tcg_gen_addi_ptr(ret, cpu_env, pred_full_reg_offset(s, regno));
27
68
+ return ret;
28
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
69
+}
29
static void gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
70
+
30
@@ -XXX,XX +XXX,XX @@ static bool do_movz_zpz(DisasContext *s, int rd, int rn, int pg,
71
bool disas_sve(DisasContext *, uint32_t);
31
return gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
72
bool disas_sme(DisasContext *, uint32_t);
73
74
diff --git a/target/arm/translate.h b/target/arm/translate.h
75
index XXXXXXX..XXXXXXX 100644
76
--- a/target/arm/translate.h
77
+++ b/target/arm/translate.h
78
@@ -XXX,XX +XXX,XX @@ static inline int plus_2(DisasContext *s, int x)
79
return x + 2;
32
}
80
}
33
81
34
-static bool do_zpzi_ool(DisasContext *s, arg_rpri_esz *a,
82
+static inline int plus_12(DisasContext *s, int x)
35
- gen_helper_gvec_3 *fn)
83
+{
36
-{
84
+ return x + 12;
37
- return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
85
+}
38
-}
86
+
39
-
87
static inline int times_2(DisasContext *s, int x)
40
static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
41
{
88
{
42
static gen_helper_gvec_3 * const fns[4] = {
89
return x * 2;
43
@@ -XXX,XX +XXX,XX @@ static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
90
diff --git a/target/arm/sme.decode b/target/arm/sme.decode
44
/* Shift by element size is architecturally valid. For
91
index XXXXXXX..XXXXXXX 100644
45
arithmetic right-shift, it's the same as by one less. */
92
--- a/target/arm/sme.decode
46
a->imm = MIN(a->imm, (8 << a->esz) - 1);
93
+++ b/target/arm/sme.decode
47
- return do_zpzi_ool(s, a, fns[a->esz]);
94
@@ -XXX,XX +XXX,XX @@
48
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
95
### SME Misc
49
}
96
50
97
ZERO 11000000 00 001 00000000000 imm:8
51
static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
98
+
52
@@ -XXX,XX +XXX,XX @@ static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
99
+### SME Move into/from Array
53
if (a->imm >= (8 << a->esz)) {
100
+
54
return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
101
+%mova_rs 13:2 !function=plus_12
55
} else {
102
+&mova esz rs pg zr za_imm v:bool to_vec:bool
56
- return do_zpzi_ool(s, a, fns[a->esz]);
103
+
57
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
104
+MOVA 11000000 esz:2 00000 0 v:1 .. pg:3 zr:5 0 za_imm:4 \
105
+ &mova to_vec=0 rs=%mova_rs
106
+MOVA 11000000 11 00000 1 v:1 .. pg:3 zr:5 0 za_imm:4 \
107
+ &mova to_vec=0 rs=%mova_rs esz=4
108
+
109
+MOVA 11000000 esz:2 00001 0 v:1 .. pg:3 0 za_imm:4 zr:5 \
110
+ &mova to_vec=1 rs=%mova_rs
111
+MOVA 11000000 11 00001 1 v:1 .. pg:3 0 za_imm:4 zr:5 \
112
+ &mova to_vec=1 rs=%mova_rs esz=4
113
diff --git a/target/arm/sme_helper.c b/target/arm/sme_helper.c
114
index XXXXXXX..XXXXXXX 100644
115
--- a/target/arm/sme_helper.c
116
+++ b/target/arm/sme_helper.c
117
@@ -XXX,XX +XXX,XX @@
118
119
#include "qemu/osdep.h"
120
#include "cpu.h"
121
-#include "internals.h"
122
+#include "tcg/tcg-gvec-desc.h"
123
#include "exec/helper-proto.h"
124
+#include "qemu/int128.h"
125
+#include "vec_internal.h"
126
127
/* ResetSVEState */
128
void arm_reset_sve_state(CPUARMState *env)
129
@@ -XXX,XX +XXX,XX @@ void helper_sme_zero(CPUARMState *env, uint32_t imm, uint32_t svl)
130
}
58
}
131
}
59
}
132
}
60
133
+
61
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
134
+
62
if (a->imm >= (8 << a->esz)) {
135
+/*
63
return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
136
+ * When considering the ZA storage as an array of elements of
64
} else {
137
+ * type T, the index within that array of the Nth element of
65
- return do_zpzi_ool(s, a, fns[a->esz]);
138
+ * a vertical slice of a tile can be calculated like this,
66
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
139
+ * regardless of the size of type T. This is because the tiles
140
+ * are interleaved, so if type T is size N bytes then row 1 of
141
+ * the tile is N rows away from row 0. The division by N to
142
+ * convert a byte offset into an array index and the multiplication
143
+ * by N to convert from vslice-index-within-the-tile to
144
+ * the index within the ZA storage cancel out.
145
+ */
146
+#define tile_vslice_index(i) ((i) * sizeof(ARMVectorReg))
147
+
148
+/*
149
+ * When doing byte arithmetic on the ZA storage, the element
150
+ * byteoff bytes away in a tile vertical slice is always this
151
+ * many bytes away in the ZA storage, regardless of the
152
+ * size of the tile element, assuming that byteoff is a multiple
153
+ * of the element size. Again this is because of the interleaving
154
+ * of the tiles. For instance if we have 1 byte per element then
155
+ * each row of the ZA storage has one byte of the vslice data,
156
+ * and (counting from 0) byte 8 goes in row 8 of the storage
157
+ * at offset (8 * row-size-in-bytes).
158
+ * If we have 8 bytes per element then each row of the ZA storage
159
+ * has 8 bytes of the data, but there are 8 interleaved tiles and
160
+ * so byte 8 of the data goes into row 1 of the tile,
161
+ * which is again row 8 of the storage, so the offset is still
162
+ * (8 * row-size-in-bytes). Similarly for other element sizes.
163
+ */
164
+#define tile_vslice_offset(byteoff) ((byteoff) * sizeof(ARMVectorReg))
165
+
166
+
167
+/*
168
+ * Move Zreg vector to ZArray column.
169
+ */
170
+#define DO_MOVA_C(NAME, TYPE, H) \
171
+void HELPER(NAME)(void *za, void *vn, void *vg, uint32_t desc) \
172
+{ \
173
+ int i, oprsz = simd_oprsz(desc); \
174
+ for (i = 0; i < oprsz; ) { \
175
+ uint16_t pg = *(uint16_t *)(vg + H1_2(i >> 3)); \
176
+ do { \
177
+ if (pg & 1) { \
178
+ *(TYPE *)(za + tile_vslice_offset(i)) = *(TYPE *)(vn + H(i)); \
179
+ } \
180
+ i += sizeof(TYPE); \
181
+ pg >>= sizeof(TYPE); \
182
+ } while (i & 15); \
183
+ } \
184
+}
185
+
186
+DO_MOVA_C(sme_mova_cz_b, uint8_t, H1)
187
+DO_MOVA_C(sme_mova_cz_h, uint16_t, H1_2)
188
+DO_MOVA_C(sme_mova_cz_s, uint32_t, H1_4)
189
+
190
+void HELPER(sme_mova_cz_d)(void *za, void *vn, void *vg, uint32_t desc)
191
+{
192
+ int i, oprsz = simd_oprsz(desc) / 8;
193
+ uint8_t *pg = vg;
194
+ uint64_t *n = vn;
195
+ uint64_t *a = za;
196
+
197
+ for (i = 0; i < oprsz; i++) {
198
+ if (pg[H1(i)] & 1) {
199
+ a[tile_vslice_index(i)] = n[i];
200
+ }
201
+ }
202
+}
203
+
204
+void HELPER(sme_mova_cz_q)(void *za, void *vn, void *vg, uint32_t desc)
205
+{
206
+ int i, oprsz = simd_oprsz(desc) / 16;
207
+ uint16_t *pg = vg;
208
+ Int128 *n = vn;
209
+ Int128 *a = za;
210
+
211
+ /*
212
+ * Int128 is used here simply to copy 16 bytes, and to simplify
213
+ * the address arithmetic.
214
+ */
215
+ for (i = 0; i < oprsz; i++) {
216
+ if (pg[H2(i)] & 1) {
217
+ a[tile_vslice_index(i)] = n[i];
218
+ }
219
+ }
220
+}
221
+
222
+#undef DO_MOVA_C
223
+
224
+/*
225
+ * Move ZArray column to Zreg vector.
226
+ */
227
+#define DO_MOVA_Z(NAME, TYPE, H) \
228
+void HELPER(NAME)(void *vd, void *za, void *vg, uint32_t desc) \
229
+{ \
230
+ int i, oprsz = simd_oprsz(desc); \
231
+ for (i = 0; i < oprsz; ) { \
232
+ uint16_t pg = *(uint16_t *)(vg + H1_2(i >> 3)); \
233
+ do { \
234
+ if (pg & 1) { \
235
+ *(TYPE *)(vd + H(i)) = *(TYPE *)(za + tile_vslice_offset(i)); \
236
+ } \
237
+ i += sizeof(TYPE); \
238
+ pg >>= sizeof(TYPE); \
239
+ } while (i & 15); \
240
+ } \
241
+}
242
+
243
+DO_MOVA_Z(sme_mova_zc_b, uint8_t, H1)
244
+DO_MOVA_Z(sme_mova_zc_h, uint16_t, H1_2)
245
+DO_MOVA_Z(sme_mova_zc_s, uint32_t, H1_4)
246
+
247
+void HELPER(sme_mova_zc_d)(void *vd, void *za, void *vg, uint32_t desc)
248
+{
249
+ int i, oprsz = simd_oprsz(desc) / 8;
250
+ uint8_t *pg = vg;
251
+ uint64_t *d = vd;
252
+ uint64_t *a = za;
253
+
254
+ for (i = 0; i < oprsz; i++) {
255
+ if (pg[H1(i)] & 1) {
256
+ d[i] = a[tile_vslice_index(i)];
257
+ }
258
+ }
259
+}
260
+
261
+void HELPER(sme_mova_zc_q)(void *vd, void *za, void *vg, uint32_t desc)
262
+{
263
+ int i, oprsz = simd_oprsz(desc) / 16;
264
+ uint16_t *pg = vg;
265
+ Int128 *d = vd;
266
+ Int128 *a = za;
267
+
268
+ /*
269
+ * Int128 is used here simply to copy 16 bytes, and to simplify
270
+ * the address arithmetic.
271
+ */
272
+ for (i = 0; i < oprsz; i++, za += sizeof(ARMVectorReg)) {
273
+ if (pg[H2(i)] & 1) {
274
+ d[i] = a[tile_vslice_index(i)];
275
+ }
276
+ }
277
+}
278
+
279
+#undef DO_MOVA_Z
280
diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
281
index XXXXXXX..XXXXXXX 100644
282
--- a/target/arm/sve_helper.c
283
+++ b/target/arm/sve_helper.c
284
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_sel_zpzz_d)(void *vd, void *vn, void *vm,
67
}
285
}
68
}
286
}
69
287
70
@@ -XXX,XX +XXX,XX @@ static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
288
+void HELPER(sve_sel_zpzz_q)(void *vd, void *vn, void *vm,
71
if (a->imm >= (8 << a->esz)) {
289
+ void *vg, uint32_t desc)
72
return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
290
+{
73
} else {
291
+ intptr_t i, opr_sz = simd_oprsz(desc) / 16;
74
- return do_zpzi_ool(s, a, fns[a->esz]);
292
+ Int128 *d = vd, *n = vn, *m = vm;
75
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
293
+ uint16_t *pg = vg;
294
+
295
+ for (i = 0; i < opr_sz; i += 1) {
296
+ d[i] = (pg[H2(i)] & 1 ? n : m)[i];
297
+ }
298
+}
299
+
300
/* Two operand comparison controlled by a predicate.
301
* ??? It is very tempting to want to be able to expand this inline
302
* with x86 instructions, e.g.
303
diff --git a/target/arm/translate-sme.c b/target/arm/translate-sme.c
304
index XXXXXXX..XXXXXXX 100644
305
--- a/target/arm/translate-sme.c
306
+++ b/target/arm/translate-sme.c
307
@@ -XXX,XX +XXX,XX @@
308
#include "decode-sme.c.inc"
309
310
311
+/*
312
+ * Resolve tile.size[index] to a host pointer, where tile and index
313
+ * are always decoded together, dependent on the element size.
314
+ */
315
+static TCGv_ptr get_tile_rowcol(DisasContext *s, int esz, int rs,
316
+ int tile_index, bool vertical)
317
+{
318
+ int tile = tile_index >> (4 - esz);
319
+ int index = esz == MO_128 ? 0 : extract32(tile_index, 0, 4 - esz);
320
+ int pos, len, offset;
321
+ TCGv_i32 tmp;
322
+ TCGv_ptr addr;
323
+
324
+ /* Compute the final index, which is Rs+imm. */
325
+ tmp = tcg_temp_new_i32();
326
+ tcg_gen_trunc_tl_i32(tmp, cpu_reg(s, rs));
327
+ tcg_gen_addi_i32(tmp, tmp, index);
328
+
329
+ /* Prepare a power-of-two modulo via extraction of @len bits. */
330
+ len = ctz32(streaming_vec_reg_size(s)) - esz;
331
+
332
+ if (vertical) {
333
+ /*
334
+ * Compute the byte offset of the index within the tile:
335
+ * (index % (svl / size)) * size
336
+ * = (index % (svl >> esz)) << esz
337
+ * Perform the power-of-two modulo via extraction of the low @len bits.
338
+ * Perform the multiply by shifting left by @pos bits.
339
+ * Perform these operations simultaneously via deposit into zero.
340
+ */
341
+ pos = esz;
342
+ tcg_gen_deposit_z_i32(tmp, tmp, pos, len);
343
+
344
+ /*
345
+ * For big-endian, adjust the indexed column byte offset within
346
+ * the uint64_t host words that make up env->zarray[].
347
+ */
348
+ if (HOST_BIG_ENDIAN && esz < MO_64) {
349
+ tcg_gen_xori_i32(tmp, tmp, 8 - (1 << esz));
350
+ }
351
+ } else {
352
+ /*
353
+ * Compute the byte offset of the index within the tile:
354
+ * (index % (svl / size)) * (size * sizeof(row))
355
+ * = (index % (svl >> esz)) << (esz + log2(sizeof(row)))
356
+ */
357
+ pos = esz + ctz32(sizeof(ARMVectorReg));
358
+ tcg_gen_deposit_z_i32(tmp, tmp, pos, len);
359
+
360
+ /* Row slices are always aligned and need no endian adjustment. */
361
+ }
362
+
363
+ /* The tile byte offset within env->zarray is the row. */
364
+ offset = tile * sizeof(ARMVectorReg);
365
+
366
+ /* Include the byte offset of zarray to make this relative to env. */
367
+ offset += offsetof(CPUARMState, zarray);
368
+ tcg_gen_addi_i32(tmp, tmp, offset);
369
+
370
+ /* Add the byte offset to env to produce the final pointer. */
371
+ addr = tcg_temp_new_ptr();
372
+ tcg_gen_ext_i32_ptr(addr, tmp);
373
+ tcg_temp_free_i32(tmp);
374
+ tcg_gen_add_ptr(addr, addr, cpu_env);
375
+
376
+ return addr;
377
+}
378
+
379
static bool trans_ZERO(DisasContext *s, arg_ZERO *a)
380
{
381
if (!dc_isar_feature(aa64_sme, s)) {
382
@@ -XXX,XX +XXX,XX @@ static bool trans_ZERO(DisasContext *s, arg_ZERO *a)
76
}
383
}
384
return true;
77
}
385
}
78
386
+
79
@@ -XXX,XX +XXX,XX @@ static bool trans_SQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
387
+static bool trans_MOVA(DisasContext *s, arg_MOVA *a)
80
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
388
+{
81
return false;
389
+ static gen_helper_gvec_4 * const h_fns[5] = {
82
}
390
+ gen_helper_sve_sel_zpzz_b, gen_helper_sve_sel_zpzz_h,
83
- return do_zpzi_ool(s, a, fns[a->esz]);
391
+ gen_helper_sve_sel_zpzz_s, gen_helper_sve_sel_zpzz_d,
84
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
392
+ gen_helper_sve_sel_zpzz_q
85
}
393
+ };
86
394
+ static gen_helper_gvec_3 * const cz_fns[5] = {
87
static bool trans_UQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
395
+ gen_helper_sme_mova_cz_b, gen_helper_sme_mova_cz_h,
88
@@ -XXX,XX +XXX,XX @@ static bool trans_UQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
396
+ gen_helper_sme_mova_cz_s, gen_helper_sme_mova_cz_d,
89
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
397
+ gen_helper_sme_mova_cz_q,
90
return false;
398
+ };
91
}
399
+ static gen_helper_gvec_3 * const zc_fns[5] = {
92
- return do_zpzi_ool(s, a, fns[a->esz]);
400
+ gen_helper_sme_mova_zc_b, gen_helper_sme_mova_zc_h,
93
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
401
+ gen_helper_sme_mova_zc_s, gen_helper_sme_mova_zc_d,
94
}
402
+ gen_helper_sme_mova_zc_q,
95
403
+ };
96
static bool trans_SRSHR(DisasContext *s, arg_rpri_esz *a)
404
+
97
@@ -XXX,XX +XXX,XX @@ static bool trans_SRSHR(DisasContext *s, arg_rpri_esz *a)
405
+ TCGv_ptr t_za, t_zr, t_pg;
98
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
406
+ TCGv_i32 t_desc;
99
return false;
407
+ int svl;
100
}
408
+
101
- return do_zpzi_ool(s, a, fns[a->esz]);
409
+ if (!dc_isar_feature(aa64_sme, s)) {
102
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
410
+ return false;
103
}
411
+ }
104
412
+ if (!sme_smza_enabled_check(s)) {
105
static bool trans_URSHR(DisasContext *s, arg_rpri_esz *a)
413
+ return true;
106
@@ -XXX,XX +XXX,XX @@ static bool trans_URSHR(DisasContext *s, arg_rpri_esz *a)
414
+ }
107
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
415
+
108
return false;
416
+ t_za = get_tile_rowcol(s, a->esz, a->rs, a->za_imm, a->v);
109
}
417
+ t_zr = vec_full_reg_ptr(s, a->zr);
110
- return do_zpzi_ool(s, a, fns[a->esz]);
418
+ t_pg = pred_full_reg_ptr(s, a->pg);
111
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
419
+
112
}
420
+ svl = streaming_vec_reg_size(s);
113
421
+ t_desc = tcg_constant_i32(simd_desc(svl, svl, 0));
114
static bool trans_SQSHLU(DisasContext *s, arg_rpri_esz *a)
422
+
115
@@ -XXX,XX +XXX,XX @@ static bool trans_SQSHLU(DisasContext *s, arg_rpri_esz *a)
423
+ if (a->v) {
116
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
424
+ /* Vertical slice -- use sme mova helpers. */
117
return false;
425
+ if (a->to_vec) {
118
}
426
+ zc_fns[a->esz](t_zr, t_za, t_pg, t_desc);
119
- return do_zpzi_ool(s, a, fns[a->esz]);
427
+ } else {
120
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
428
+ cz_fns[a->esz](t_za, t_zr, t_pg, t_desc);
121
}
429
+ }
122
430
+ } else {
123
/*
431
+ /* Horizontal slice -- reuse sve sel helpers. */
432
+ if (a->to_vec) {
433
+ h_fns[a->esz](t_zr, t_za, t_zr, t_pg, t_desc);
434
+ } else {
435
+ h_fns[a->esz](t_za, t_zr, t_za, t_pg, t_desc);
436
+ }
437
+ }
438
+
439
+ tcg_temp_free_ptr(t_za);
440
+ tcg_temp_free_ptr(t_zr);
441
+ tcg_temp_free_ptr(t_pg);
442
+
443
+ return true;
444
+}
124
--
445
--
125
2.25.1
446
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
We cannot reuse the SVE functions for LD[1-4] and ST[1-4],
4
because those functions accept only a Zreg register number.
5
For SME, we want to pass a pointer into ZA storage.
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-5-richard.henderson@linaro.org
9
Message-id: 20220708151540.18136-21-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
target/arm/translate-sve.c | 74 ++++++++++++--------------------------
12
target/arm/helper-sme.h | 82 +++++
9
1 file changed, 23 insertions(+), 51 deletions(-)
13
target/arm/sme.decode | 9 +
14
target/arm/sme_helper.c | 595 +++++++++++++++++++++++++++++++++++++
15
target/arm/translate-sme.c | 70 +++++
16
4 files changed, 756 insertions(+)
10
17
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
18
diff --git a/target/arm/helper-sme.h b/target/arm/helper-sme.h
12
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
20
--- a/target/arm/helper-sme.h
14
+++ b/target/arm/translate-sve.c
21
+++ b/target/arm/helper-sme.h
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
22
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(sme_mova_cz_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
23
DEF_HELPER_FLAGS_4(sme_mova_zc_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
24
DEF_HELPER_FLAGS_4(sme_mova_cz_q, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
25
DEF_HELPER_FLAGS_4(sme_mova_zc_q, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
26
+
27
+DEF_HELPER_FLAGS_5(sme_ld1b_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
28
+DEF_HELPER_FLAGS_5(sme_ld1b_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
29
+DEF_HELPER_FLAGS_5(sme_ld1b_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
30
+DEF_HELPER_FLAGS_5(sme_ld1b_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
31
+
32
+DEF_HELPER_FLAGS_5(sme_ld1h_be_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
33
+DEF_HELPER_FLAGS_5(sme_ld1h_le_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
34
+DEF_HELPER_FLAGS_5(sme_ld1h_be_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
35
+DEF_HELPER_FLAGS_5(sme_ld1h_le_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
36
+DEF_HELPER_FLAGS_5(sme_ld1h_be_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
37
+DEF_HELPER_FLAGS_5(sme_ld1h_le_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
38
+DEF_HELPER_FLAGS_5(sme_ld1h_be_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
39
+DEF_HELPER_FLAGS_5(sme_ld1h_le_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
40
+
41
+DEF_HELPER_FLAGS_5(sme_ld1s_be_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
42
+DEF_HELPER_FLAGS_5(sme_ld1s_le_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
43
+DEF_HELPER_FLAGS_5(sme_ld1s_be_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
44
+DEF_HELPER_FLAGS_5(sme_ld1s_le_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
45
+DEF_HELPER_FLAGS_5(sme_ld1s_be_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
46
+DEF_HELPER_FLAGS_5(sme_ld1s_le_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
47
+DEF_HELPER_FLAGS_5(sme_ld1s_be_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
48
+DEF_HELPER_FLAGS_5(sme_ld1s_le_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
49
+
50
+DEF_HELPER_FLAGS_5(sme_ld1d_be_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
51
+DEF_HELPER_FLAGS_5(sme_ld1d_le_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
52
+DEF_HELPER_FLAGS_5(sme_ld1d_be_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
53
+DEF_HELPER_FLAGS_5(sme_ld1d_le_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
54
+DEF_HELPER_FLAGS_5(sme_ld1d_be_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
55
+DEF_HELPER_FLAGS_5(sme_ld1d_le_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
56
+DEF_HELPER_FLAGS_5(sme_ld1d_be_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
57
+DEF_HELPER_FLAGS_5(sme_ld1d_le_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
58
+
59
+DEF_HELPER_FLAGS_5(sme_ld1q_be_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
60
+DEF_HELPER_FLAGS_5(sme_ld1q_le_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
61
+DEF_HELPER_FLAGS_5(sme_ld1q_be_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
62
+DEF_HELPER_FLAGS_5(sme_ld1q_le_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
63
+DEF_HELPER_FLAGS_5(sme_ld1q_be_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
64
+DEF_HELPER_FLAGS_5(sme_ld1q_le_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
65
+DEF_HELPER_FLAGS_5(sme_ld1q_be_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
66
+DEF_HELPER_FLAGS_5(sme_ld1q_le_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
67
+
68
+DEF_HELPER_FLAGS_5(sme_st1b_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
69
+DEF_HELPER_FLAGS_5(sme_st1b_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
70
+DEF_HELPER_FLAGS_5(sme_st1b_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
71
+DEF_HELPER_FLAGS_5(sme_st1b_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
72
+
73
+DEF_HELPER_FLAGS_5(sme_st1h_be_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
74
+DEF_HELPER_FLAGS_5(sme_st1h_le_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
75
+DEF_HELPER_FLAGS_5(sme_st1h_be_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
76
+DEF_HELPER_FLAGS_5(sme_st1h_le_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
77
+DEF_HELPER_FLAGS_5(sme_st1h_be_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
78
+DEF_HELPER_FLAGS_5(sme_st1h_le_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
79
+DEF_HELPER_FLAGS_5(sme_st1h_be_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
80
+DEF_HELPER_FLAGS_5(sme_st1h_le_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
81
+
82
+DEF_HELPER_FLAGS_5(sme_st1s_be_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
83
+DEF_HELPER_FLAGS_5(sme_st1s_le_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
84
+DEF_HELPER_FLAGS_5(sme_st1s_be_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
85
+DEF_HELPER_FLAGS_5(sme_st1s_le_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
86
+DEF_HELPER_FLAGS_5(sme_st1s_be_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
87
+DEF_HELPER_FLAGS_5(sme_st1s_le_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
88
+DEF_HELPER_FLAGS_5(sme_st1s_be_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
89
+DEF_HELPER_FLAGS_5(sme_st1s_le_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
90
+
91
+DEF_HELPER_FLAGS_5(sme_st1d_be_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
92
+DEF_HELPER_FLAGS_5(sme_st1d_le_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
93
+DEF_HELPER_FLAGS_5(sme_st1d_be_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
94
+DEF_HELPER_FLAGS_5(sme_st1d_le_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
95
+DEF_HELPER_FLAGS_5(sme_st1d_be_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
96
+DEF_HELPER_FLAGS_5(sme_st1d_le_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
97
+DEF_HELPER_FLAGS_5(sme_st1d_be_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
98
+DEF_HELPER_FLAGS_5(sme_st1d_le_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
99
+
100
+DEF_HELPER_FLAGS_5(sme_st1q_be_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
101
+DEF_HELPER_FLAGS_5(sme_st1q_le_h, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
102
+DEF_HELPER_FLAGS_5(sme_st1q_be_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
103
+DEF_HELPER_FLAGS_5(sme_st1q_le_v, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
104
+DEF_HELPER_FLAGS_5(sme_st1q_be_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
105
+DEF_HELPER_FLAGS_5(sme_st1q_le_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
106
+DEF_HELPER_FLAGS_5(sme_st1q_be_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
107
+DEF_HELPER_FLAGS_5(sme_st1q_le_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
108
diff --git a/target/arm/sme.decode b/target/arm/sme.decode
109
index XXXXXXX..XXXXXXX 100644
110
--- a/target/arm/sme.decode
111
+++ b/target/arm/sme.decode
112
@@ -XXX,XX +XXX,XX @@ MOVA 11000000 esz:2 00001 0 v:1 .. pg:3 0 za_imm:4 zr:5 \
113
&mova to_vec=1 rs=%mova_rs
114
MOVA 11000000 11 00001 1 v:1 .. pg:3 0 za_imm:4 zr:5 \
115
&mova to_vec=1 rs=%mova_rs esz=4
116
+
117
+### SME Memory
118
+
119
+&ldst esz rs pg rn rm za_imm v:bool st:bool
120
+
121
+LDST1 1110000 0 esz:2 st:1 rm:5 v:1 .. pg:3 rn:5 0 za_imm:4 \
122
+ &ldst rs=%mova_rs
123
+LDST1 1110000 111 st:1 rm:5 v:1 .. pg:3 rn:5 0 za_imm:4 \
124
+ &ldst esz=4 rs=%mova_rs
125
diff --git a/target/arm/sme_helper.c b/target/arm/sme_helper.c
126
index XXXXXXX..XXXXXXX 100644
127
--- a/target/arm/sme_helper.c
128
+++ b/target/arm/sme_helper.c
129
@@ -XXX,XX +XXX,XX @@
130
131
#include "qemu/osdep.h"
132
#include "cpu.h"
133
+#include "internals.h"
134
#include "tcg/tcg-gvec-desc.h"
135
#include "exec/helper-proto.h"
136
+#include "exec/cpu_ldst.h"
137
+#include "exec/exec-all.h"
138
#include "qemu/int128.h"
139
#include "vec_internal.h"
140
+#include "sve_ldst_internal.h"
141
142
/* ResetSVEState */
143
void arm_reset_sve_state(CPUARMState *env)
144
@@ -XXX,XX +XXX,XX @@ void HELPER(sme_mova_zc_q)(void *vd, void *za, void *vg, uint32_t desc)
16
}
145
}
17
146
18
/* Invoke an out-of-line helper on 3 Zregs. */
147
#undef DO_MOVA_Z
19
-static void gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
148
+
20
+static bool gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
149
+/*
21
int rd, int rn, int rm, int data)
150
+ * Clear elements in a tile slice comprising len bytes.
22
{
151
+ */
23
- unsigned vsz = vec_full_reg_size(s);
152
+
24
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
153
+typedef void ClearFn(void *ptr, size_t off, size_t len);
25
- vec_full_reg_offset(s, rn),
154
+
26
- vec_full_reg_offset(s, rm),
155
+static void clear_horizontal(void *ptr, size_t off, size_t len)
27
- vsz, vsz, data, fn);
156
+{
28
+ if (fn == NULL) {
157
+ memset(ptr + off, 0, len);
158
+}
159
+
160
+static void clear_vertical_b(void *vptr, size_t off, size_t len)
161
+{
162
+ for (size_t i = 0; i < len; ++i) {
163
+ *(uint8_t *)(vptr + tile_vslice_offset(i + off)) = 0;
164
+ }
165
+}
166
+
167
+static void clear_vertical_h(void *vptr, size_t off, size_t len)
168
+{
169
+ for (size_t i = 0; i < len; i += 2) {
170
+ *(uint16_t *)(vptr + tile_vslice_offset(i + off)) = 0;
171
+ }
172
+}
173
+
174
+static void clear_vertical_s(void *vptr, size_t off, size_t len)
175
+{
176
+ for (size_t i = 0; i < len; i += 4) {
177
+ *(uint32_t *)(vptr + tile_vslice_offset(i + off)) = 0;
178
+ }
179
+}
180
+
181
+static void clear_vertical_d(void *vptr, size_t off, size_t len)
182
+{
183
+ for (size_t i = 0; i < len; i += 8) {
184
+ *(uint64_t *)(vptr + tile_vslice_offset(i + off)) = 0;
185
+ }
186
+}
187
+
188
+static void clear_vertical_q(void *vptr, size_t off, size_t len)
189
+{
190
+ for (size_t i = 0; i < len; i += 16) {
191
+ memset(vptr + tile_vslice_offset(i + off), 0, 16);
192
+ }
193
+}
194
+
195
+/*
196
+ * Copy elements from an array into a tile slice comprising len bytes.
197
+ */
198
+
199
+typedef void CopyFn(void *dst, const void *src, size_t len);
200
+
201
+static void copy_horizontal(void *dst, const void *src, size_t len)
202
+{
203
+ memcpy(dst, src, len);
204
+}
205
+
206
+static void copy_vertical_b(void *vdst, const void *vsrc, size_t len)
207
+{
208
+ const uint8_t *src = vsrc;
209
+ uint8_t *dst = vdst;
210
+ size_t i;
211
+
212
+ for (i = 0; i < len; ++i) {
213
+ dst[tile_vslice_index(i)] = src[i];
214
+ }
215
+}
216
+
217
+static void copy_vertical_h(void *vdst, const void *vsrc, size_t len)
218
+{
219
+ const uint16_t *src = vsrc;
220
+ uint16_t *dst = vdst;
221
+ size_t i;
222
+
223
+ for (i = 0; i < len / 2; ++i) {
224
+ dst[tile_vslice_index(i)] = src[i];
225
+ }
226
+}
227
+
228
+static void copy_vertical_s(void *vdst, const void *vsrc, size_t len)
229
+{
230
+ const uint32_t *src = vsrc;
231
+ uint32_t *dst = vdst;
232
+ size_t i;
233
+
234
+ for (i = 0; i < len / 4; ++i) {
235
+ dst[tile_vslice_index(i)] = src[i];
236
+ }
237
+}
238
+
239
+static void copy_vertical_d(void *vdst, const void *vsrc, size_t len)
240
+{
241
+ const uint64_t *src = vsrc;
242
+ uint64_t *dst = vdst;
243
+ size_t i;
244
+
245
+ for (i = 0; i < len / 8; ++i) {
246
+ dst[tile_vslice_index(i)] = src[i];
247
+ }
248
+}
249
+
250
+static void copy_vertical_q(void *vdst, const void *vsrc, size_t len)
251
+{
252
+ for (size_t i = 0; i < len; i += 16) {
253
+ memcpy(vdst + tile_vslice_offset(i), vsrc + i, 16);
254
+ }
255
+}
256
+
257
+/*
258
+ * Host and TLB primitives for vertical tile slice addressing.
259
+ */
260
+
261
+#define DO_LD(NAME, TYPE, HOST, TLB) \
262
+static inline void sme_##NAME##_v_host(void *za, intptr_t off, void *host) \
263
+{ \
264
+ TYPE val = HOST(host); \
265
+ *(TYPE *)(za + tile_vslice_offset(off)) = val; \
266
+} \
267
+static inline void sme_##NAME##_v_tlb(CPUARMState *env, void *za, \
268
+ intptr_t off, target_ulong addr, uintptr_t ra) \
269
+{ \
270
+ TYPE val = TLB(env, useronly_clean_ptr(addr), ra); \
271
+ *(TYPE *)(za + tile_vslice_offset(off)) = val; \
272
+}
273
+
274
+#define DO_ST(NAME, TYPE, HOST, TLB) \
275
+static inline void sme_##NAME##_v_host(void *za, intptr_t off, void *host) \
276
+{ \
277
+ TYPE val = *(TYPE *)(za + tile_vslice_offset(off)); \
278
+ HOST(host, val); \
279
+} \
280
+static inline void sme_##NAME##_v_tlb(CPUARMState *env, void *za, \
281
+ intptr_t off, target_ulong addr, uintptr_t ra) \
282
+{ \
283
+ TYPE val = *(TYPE *)(za + tile_vslice_offset(off)); \
284
+ TLB(env, useronly_clean_ptr(addr), val, ra); \
285
+}
286
+
287
+/*
288
+ * The ARMVectorReg elements are stored in host-endian 64-bit units.
289
+ * For 128-bit quantities, the sequence defined by the Elem[] pseudocode
290
+ * corresponds to storing the two 64-bit pieces in little-endian order.
291
+ */
292
+#define DO_LDQ(HNAME, VNAME, BE, HOST, TLB) \
293
+static inline void HNAME##_host(void *za, intptr_t off, void *host) \
294
+{ \
295
+ uint64_t val0 = HOST(host), val1 = HOST(host + 8); \
296
+ uint64_t *ptr = za + off; \
297
+ ptr[0] = BE ? val1 : val0, ptr[1] = BE ? val0 : val1; \
298
+} \
299
+static inline void VNAME##_v_host(void *za, intptr_t off, void *host) \
300
+{ \
301
+ HNAME##_host(za, tile_vslice_offset(off), host); \
302
+} \
303
+static inline void HNAME##_tlb(CPUARMState *env, void *za, intptr_t off, \
304
+ target_ulong addr, uintptr_t ra) \
305
+{ \
306
+ uint64_t val0 = TLB(env, useronly_clean_ptr(addr), ra); \
307
+ uint64_t val1 = TLB(env, useronly_clean_ptr(addr + 8), ra); \
308
+ uint64_t *ptr = za + off; \
309
+ ptr[0] = BE ? val1 : val0, ptr[1] = BE ? val0 : val1; \
310
+} \
311
+static inline void VNAME##_v_tlb(CPUARMState *env, void *za, intptr_t off, \
312
+ target_ulong addr, uintptr_t ra) \
313
+{ \
314
+ HNAME##_tlb(env, za, tile_vslice_offset(off), addr, ra); \
315
+}
316
+
317
+#define DO_STQ(HNAME, VNAME, BE, HOST, TLB) \
318
+static inline void HNAME##_host(void *za, intptr_t off, void *host) \
319
+{ \
320
+ uint64_t *ptr = za + off; \
321
+ HOST(host, ptr[BE]); \
322
+ HOST(host + 1, ptr[!BE]); \
323
+} \
324
+static inline void VNAME##_v_host(void *za, intptr_t off, void *host) \
325
+{ \
326
+ HNAME##_host(za, tile_vslice_offset(off), host); \
327
+} \
328
+static inline void HNAME##_tlb(CPUARMState *env, void *za, intptr_t off, \
329
+ target_ulong addr, uintptr_t ra) \
330
+{ \
331
+ uint64_t *ptr = za + off; \
332
+ TLB(env, useronly_clean_ptr(addr), ptr[BE], ra); \
333
+ TLB(env, useronly_clean_ptr(addr + 8), ptr[!BE], ra); \
334
+} \
335
+static inline void VNAME##_v_tlb(CPUARMState *env, void *za, intptr_t off, \
336
+ target_ulong addr, uintptr_t ra) \
337
+{ \
338
+ HNAME##_tlb(env, za, tile_vslice_offset(off), addr, ra); \
339
+}
340
+
341
+DO_LD(ld1b, uint8_t, ldub_p, cpu_ldub_data_ra)
342
+DO_LD(ld1h_be, uint16_t, lduw_be_p, cpu_lduw_be_data_ra)
343
+DO_LD(ld1h_le, uint16_t, lduw_le_p, cpu_lduw_le_data_ra)
344
+DO_LD(ld1s_be, uint32_t, ldl_be_p, cpu_ldl_be_data_ra)
345
+DO_LD(ld1s_le, uint32_t, ldl_le_p, cpu_ldl_le_data_ra)
346
+DO_LD(ld1d_be, uint64_t, ldq_be_p, cpu_ldq_be_data_ra)
347
+DO_LD(ld1d_le, uint64_t, ldq_le_p, cpu_ldq_le_data_ra)
348
+
349
+DO_LDQ(sve_ld1qq_be, sme_ld1q_be, 1, ldq_be_p, cpu_ldq_be_data_ra)
350
+DO_LDQ(sve_ld1qq_le, sme_ld1q_le, 0, ldq_le_p, cpu_ldq_le_data_ra)
351
+
352
+DO_ST(st1b, uint8_t, stb_p, cpu_stb_data_ra)
353
+DO_ST(st1h_be, uint16_t, stw_be_p, cpu_stw_be_data_ra)
354
+DO_ST(st1h_le, uint16_t, stw_le_p, cpu_stw_le_data_ra)
355
+DO_ST(st1s_be, uint32_t, stl_be_p, cpu_stl_be_data_ra)
356
+DO_ST(st1s_le, uint32_t, stl_le_p, cpu_stl_le_data_ra)
357
+DO_ST(st1d_be, uint64_t, stq_be_p, cpu_stq_be_data_ra)
358
+DO_ST(st1d_le, uint64_t, stq_le_p, cpu_stq_le_data_ra)
359
+
360
+DO_STQ(sve_st1qq_be, sme_st1q_be, 1, stq_be_p, cpu_stq_be_data_ra)
361
+DO_STQ(sve_st1qq_le, sme_st1q_le, 0, stq_le_p, cpu_stq_le_data_ra)
362
+
363
+#undef DO_LD
364
+#undef DO_ST
365
+#undef DO_LDQ
366
+#undef DO_STQ
367
+
368
+/*
369
+ * Common helper for all contiguous predicated loads.
370
+ */
371
+
372
+static inline QEMU_ALWAYS_INLINE
373
+void sme_ld1(CPUARMState *env, void *za, uint64_t *vg,
374
+ const target_ulong addr, uint32_t desc, const uintptr_t ra,
375
+ const int esz, uint32_t mtedesc, bool vertical,
376
+ sve_ldst1_host_fn *host_fn,
377
+ sve_ldst1_tlb_fn *tlb_fn,
378
+ ClearFn *clr_fn,
379
+ CopyFn *cpy_fn)
380
+{
381
+ const intptr_t reg_max = simd_oprsz(desc);
382
+ const intptr_t esize = 1 << esz;
383
+ intptr_t reg_off, reg_last;
384
+ SVEContLdSt info;
385
+ void *host;
386
+ int flags;
387
+
388
+ /* Find the active elements. */
389
+ if (!sve_cont_ldst_elements(&info, addr, vg, reg_max, esz, esize)) {
390
+ /* The entire predicate was false; no load occurs. */
391
+ clr_fn(za, 0, reg_max);
392
+ return;
393
+ }
394
+
395
+ /* Probe the page(s). Exit with exception for any invalid page. */
396
+ sve_cont_ldst_pages(&info, FAULT_ALL, env, addr, MMU_DATA_LOAD, ra);
397
+
398
+ /* Handle watchpoints for all active elements. */
399
+ sve_cont_ldst_watchpoints(&info, env, vg, addr, esize, esize,
400
+ BP_MEM_READ, ra);
401
+
402
+ /*
403
+ * Handle mte checks for all active elements.
404
+ * Since TBI must be set for MTE, !mtedesc => !mte_active.
405
+ */
406
+ if (mtedesc) {
407
+ sve_cont_ldst_mte_check(&info, env, vg, addr, esize, esize,
408
+ mtedesc, ra);
409
+ }
410
+
411
+ flags = info.page[0].flags | info.page[1].flags;
412
+ if (unlikely(flags != 0)) {
413
+#ifdef CONFIG_USER_ONLY
414
+ g_assert_not_reached();
415
+#else
416
+ /*
417
+ * At least one page includes MMIO.
418
+ * Any bus operation can fail with cpu_transaction_failed,
419
+ * which for ARM will raise SyncExternal. Perform the load
420
+ * into scratch memory to preserve register state until the end.
421
+ */
422
+ ARMVectorReg scratch = { };
423
+
424
+ reg_off = info.reg_off_first[0];
425
+ reg_last = info.reg_off_last[1];
426
+ if (reg_last < 0) {
427
+ reg_last = info.reg_off_split;
428
+ if (reg_last < 0) {
429
+ reg_last = info.reg_off_last[0];
430
+ }
431
+ }
432
+
433
+ do {
434
+ uint64_t pg = vg[reg_off >> 6];
435
+ do {
436
+ if ((pg >> (reg_off & 63)) & 1) {
437
+ tlb_fn(env, &scratch, reg_off, addr + reg_off, ra);
438
+ }
439
+ reg_off += esize;
440
+ } while (reg_off & 63);
441
+ } while (reg_off <= reg_last);
442
+
443
+ cpy_fn(za, &scratch, reg_max);
444
+ return;
445
+#endif
446
+ }
447
+
448
+ /* The entire operation is in RAM, on valid pages. */
449
+
450
+ reg_off = info.reg_off_first[0];
451
+ reg_last = info.reg_off_last[0];
452
+ host = info.page[0].host;
453
+
454
+ if (!vertical) {
455
+ memset(za, 0, reg_max);
456
+ } else if (reg_off) {
457
+ clr_fn(za, 0, reg_off);
458
+ }
459
+
460
+ while (reg_off <= reg_last) {
461
+ uint64_t pg = vg[reg_off >> 6];
462
+ do {
463
+ if ((pg >> (reg_off & 63)) & 1) {
464
+ host_fn(za, reg_off, host + reg_off);
465
+ } else if (vertical) {
466
+ clr_fn(za, reg_off, esize);
467
+ }
468
+ reg_off += esize;
469
+ } while (reg_off <= reg_last && (reg_off & 63));
470
+ }
471
+
472
+ /*
473
+ * Use the slow path to manage the cross-page misalignment.
474
+ * But we know this is RAM and cannot trap.
475
+ */
476
+ reg_off = info.reg_off_split;
477
+ if (unlikely(reg_off >= 0)) {
478
+ tlb_fn(env, za, reg_off, addr + reg_off, ra);
479
+ }
480
+
481
+ reg_off = info.reg_off_first[1];
482
+ if (unlikely(reg_off >= 0)) {
483
+ reg_last = info.reg_off_last[1];
484
+ host = info.page[1].host;
485
+
486
+ do {
487
+ uint64_t pg = vg[reg_off >> 6];
488
+ do {
489
+ if ((pg >> (reg_off & 63)) & 1) {
490
+ host_fn(za, reg_off, host + reg_off);
491
+ } else if (vertical) {
492
+ clr_fn(za, reg_off, esize);
493
+ }
494
+ reg_off += esize;
495
+ } while (reg_off & 63);
496
+ } while (reg_off <= reg_last);
497
+ }
498
+}
499
+
500
+static inline QEMU_ALWAYS_INLINE
501
+void sme_ld1_mte(CPUARMState *env, void *za, uint64_t *vg,
502
+ target_ulong addr, uint32_t desc, uintptr_t ra,
503
+ const int esz, bool vertical,
504
+ sve_ldst1_host_fn *host_fn,
505
+ sve_ldst1_tlb_fn *tlb_fn,
506
+ ClearFn *clr_fn,
507
+ CopyFn *cpy_fn)
508
+{
509
+ uint32_t mtedesc = desc >> (SIMD_DATA_SHIFT + SVE_MTEDESC_SHIFT);
510
+ int bit55 = extract64(addr, 55, 1);
511
+
512
+ /* Remove mtedesc from the normal sve descriptor. */
513
+ desc = extract32(desc, 0, SIMD_DATA_SHIFT + SVE_MTEDESC_SHIFT);
514
+
515
+ /* Perform gross MTE suppression early. */
516
+ if (!tbi_check(desc, bit55) ||
517
+ tcma_check(desc, bit55, allocation_tag_from_addr(addr))) {
518
+ mtedesc = 0;
519
+ }
520
+
521
+ sme_ld1(env, za, vg, addr, desc, ra, esz, mtedesc, vertical,
522
+ host_fn, tlb_fn, clr_fn, cpy_fn);
523
+}
524
+
525
+#define DO_LD(L, END, ESZ) \
526
+void HELPER(sme_ld1##L##END##_h)(CPUARMState *env, void *za, void *vg, \
527
+ target_ulong addr, uint32_t desc) \
528
+{ \
529
+ sme_ld1(env, za, vg, addr, desc, GETPC(), ESZ, 0, false, \
530
+ sve_ld1##L##L##END##_host, sve_ld1##L##L##END##_tlb, \
531
+ clear_horizontal, copy_horizontal); \
532
+} \
533
+void HELPER(sme_ld1##L##END##_v)(CPUARMState *env, void *za, void *vg, \
534
+ target_ulong addr, uint32_t desc) \
535
+{ \
536
+ sme_ld1(env, za, vg, addr, desc, GETPC(), ESZ, 0, true, \
537
+ sme_ld1##L##END##_v_host, sme_ld1##L##END##_v_tlb, \
538
+ clear_vertical_##L, copy_vertical_##L); \
539
+} \
540
+void HELPER(sme_ld1##L##END##_h_mte)(CPUARMState *env, void *za, void *vg, \
541
+ target_ulong addr, uint32_t desc) \
542
+{ \
543
+ sme_ld1_mte(env, za, vg, addr, desc, GETPC(), ESZ, false, \
544
+ sve_ld1##L##L##END##_host, sve_ld1##L##L##END##_tlb, \
545
+ clear_horizontal, copy_horizontal); \
546
+} \
547
+void HELPER(sme_ld1##L##END##_v_mte)(CPUARMState *env, void *za, void *vg, \
548
+ target_ulong addr, uint32_t desc) \
549
+{ \
550
+ sme_ld1_mte(env, za, vg, addr, desc, GETPC(), ESZ, true, \
551
+ sme_ld1##L##END##_v_host, sme_ld1##L##END##_v_tlb, \
552
+ clear_vertical_##L, copy_vertical_##L); \
553
+}
554
+
555
+DO_LD(b, , MO_8)
556
+DO_LD(h, _be, MO_16)
557
+DO_LD(h, _le, MO_16)
558
+DO_LD(s, _be, MO_32)
559
+DO_LD(s, _le, MO_32)
560
+DO_LD(d, _be, MO_64)
561
+DO_LD(d, _le, MO_64)
562
+DO_LD(q, _be, MO_128)
563
+DO_LD(q, _le, MO_128)
564
+
565
+#undef DO_LD
566
+
567
+/*
568
+ * Common helper for all contiguous predicated stores.
569
+ */
570
+
571
+static inline QEMU_ALWAYS_INLINE
572
+void sme_st1(CPUARMState *env, void *za, uint64_t *vg,
573
+ const target_ulong addr, uint32_t desc, const uintptr_t ra,
574
+ const int esz, uint32_t mtedesc, bool vertical,
575
+ sve_ldst1_host_fn *host_fn,
576
+ sve_ldst1_tlb_fn *tlb_fn)
577
+{
578
+ const intptr_t reg_max = simd_oprsz(desc);
579
+ const intptr_t esize = 1 << esz;
580
+ intptr_t reg_off, reg_last;
581
+ SVEContLdSt info;
582
+ void *host;
583
+ int flags;
584
+
585
+ /* Find the active elements. */
586
+ if (!sve_cont_ldst_elements(&info, addr, vg, reg_max, esz, esize)) {
587
+ /* The entire predicate was false; no store occurs. */
588
+ return;
589
+ }
590
+
591
+ /* Probe the page(s). Exit with exception for any invalid page. */
592
+ sve_cont_ldst_pages(&info, FAULT_ALL, env, addr, MMU_DATA_STORE, ra);
593
+
594
+ /* Handle watchpoints for all active elements. */
595
+ sve_cont_ldst_watchpoints(&info, env, vg, addr, esize, esize,
596
+ BP_MEM_WRITE, ra);
597
+
598
+ /*
599
+ * Handle mte checks for all active elements.
600
+ * Since TBI must be set for MTE, !mtedesc => !mte_active.
601
+ */
602
+ if (mtedesc) {
603
+ sve_cont_ldst_mte_check(&info, env, vg, addr, esize, esize,
604
+ mtedesc, ra);
605
+ }
606
+
607
+ flags = info.page[0].flags | info.page[1].flags;
608
+ if (unlikely(flags != 0)) {
609
+#ifdef CONFIG_USER_ONLY
610
+ g_assert_not_reached();
611
+#else
612
+ /*
613
+ * At least one page includes MMIO.
614
+ * Any bus operation can fail with cpu_transaction_failed,
615
+ * which for ARM will raise SyncExternal. We cannot avoid
616
+ * this fault and will leave with the store incomplete.
617
+ */
618
+ reg_off = info.reg_off_first[0];
619
+ reg_last = info.reg_off_last[1];
620
+ if (reg_last < 0) {
621
+ reg_last = info.reg_off_split;
622
+ if (reg_last < 0) {
623
+ reg_last = info.reg_off_last[0];
624
+ }
625
+ }
626
+
627
+ do {
628
+ uint64_t pg = vg[reg_off >> 6];
629
+ do {
630
+ if ((pg >> (reg_off & 63)) & 1) {
631
+ tlb_fn(env, za, reg_off, addr + reg_off, ra);
632
+ }
633
+ reg_off += esize;
634
+ } while (reg_off & 63);
635
+ } while (reg_off <= reg_last);
636
+ return;
637
+#endif
638
+ }
639
+
640
+ reg_off = info.reg_off_first[0];
641
+ reg_last = info.reg_off_last[0];
642
+ host = info.page[0].host;
643
+
644
+ while (reg_off <= reg_last) {
645
+ uint64_t pg = vg[reg_off >> 6];
646
+ do {
647
+ if ((pg >> (reg_off & 63)) & 1) {
648
+ host_fn(za, reg_off, host + reg_off);
649
+ }
650
+ reg_off += 1 << esz;
651
+ } while (reg_off <= reg_last && (reg_off & 63));
652
+ }
653
+
654
+ /*
655
+ * Use the slow path to manage the cross-page misalignment.
656
+ * But we know this is RAM and cannot trap.
657
+ */
658
+ reg_off = info.reg_off_split;
659
+ if (unlikely(reg_off >= 0)) {
660
+ tlb_fn(env, za, reg_off, addr + reg_off, ra);
661
+ }
662
+
663
+ reg_off = info.reg_off_first[1];
664
+ if (unlikely(reg_off >= 0)) {
665
+ reg_last = info.reg_off_last[1];
666
+ host = info.page[1].host;
667
+
668
+ do {
669
+ uint64_t pg = vg[reg_off >> 6];
670
+ do {
671
+ if ((pg >> (reg_off & 63)) & 1) {
672
+ host_fn(za, reg_off, host + reg_off);
673
+ }
674
+ reg_off += 1 << esz;
675
+ } while (reg_off & 63);
676
+ } while (reg_off <= reg_last);
677
+ }
678
+}
679
+
680
+static inline QEMU_ALWAYS_INLINE
681
+void sme_st1_mte(CPUARMState *env, void *za, uint64_t *vg, target_ulong addr,
682
+ uint32_t desc, uintptr_t ra, int esz, bool vertical,
683
+ sve_ldst1_host_fn *host_fn,
684
+ sve_ldst1_tlb_fn *tlb_fn)
685
+{
686
+ uint32_t mtedesc = desc >> (SIMD_DATA_SHIFT + SVE_MTEDESC_SHIFT);
687
+ int bit55 = extract64(addr, 55, 1);
688
+
689
+ /* Remove mtedesc from the normal sve descriptor. */
690
+ desc = extract32(desc, 0, SIMD_DATA_SHIFT + SVE_MTEDESC_SHIFT);
691
+
692
+ /* Perform gross MTE suppression early. */
693
+ if (!tbi_check(desc, bit55) ||
694
+ tcma_check(desc, bit55, allocation_tag_from_addr(addr))) {
695
+ mtedesc = 0;
696
+ }
697
+
698
+ sme_st1(env, za, vg, addr, desc, ra, esz, mtedesc,
699
+ vertical, host_fn, tlb_fn);
700
+}
701
+
702
+#define DO_ST(L, END, ESZ) \
703
+void HELPER(sme_st1##L##END##_h)(CPUARMState *env, void *za, void *vg, \
704
+ target_ulong addr, uint32_t desc) \
705
+{ \
706
+ sme_st1(env, za, vg, addr, desc, GETPC(), ESZ, 0, false, \
707
+ sve_st1##L##L##END##_host, sve_st1##L##L##END##_tlb); \
708
+} \
709
+void HELPER(sme_st1##L##END##_v)(CPUARMState *env, void *za, void *vg, \
710
+ target_ulong addr, uint32_t desc) \
711
+{ \
712
+ sme_st1(env, za, vg, addr, desc, GETPC(), ESZ, 0, true, \
713
+ sme_st1##L##END##_v_host, sme_st1##L##END##_v_tlb); \
714
+} \
715
+void HELPER(sme_st1##L##END##_h_mte)(CPUARMState *env, void *za, void *vg, \
716
+ target_ulong addr, uint32_t desc) \
717
+{ \
718
+ sme_st1_mte(env, za, vg, addr, desc, GETPC(), ESZ, false, \
719
+ sve_st1##L##L##END##_host, sve_st1##L##L##END##_tlb); \
720
+} \
721
+void HELPER(sme_st1##L##END##_v_mte)(CPUARMState *env, void *za, void *vg, \
722
+ target_ulong addr, uint32_t desc) \
723
+{ \
724
+ sme_st1_mte(env, za, vg, addr, desc, GETPC(), ESZ, true, \
725
+ sme_st1##L##END##_v_host, sme_st1##L##END##_v_tlb); \
726
+}
727
+
728
+DO_ST(b, , MO_8)
729
+DO_ST(h, _be, MO_16)
730
+DO_ST(h, _le, MO_16)
731
+DO_ST(s, _be, MO_32)
732
+DO_ST(s, _le, MO_32)
733
+DO_ST(d, _be, MO_64)
734
+DO_ST(d, _le, MO_64)
735
+DO_ST(q, _be, MO_128)
736
+DO_ST(q, _le, MO_128)
737
+
738
+#undef DO_ST
739
diff --git a/target/arm/translate-sme.c b/target/arm/translate-sme.c
740
index XXXXXXX..XXXXXXX 100644
741
--- a/target/arm/translate-sme.c
742
+++ b/target/arm/translate-sme.c
743
@@ -XXX,XX +XXX,XX @@ static bool trans_MOVA(DisasContext *s, arg_MOVA *a)
744
745
return true;
746
}
747
+
748
+static bool trans_LDST1(DisasContext *s, arg_LDST1 *a)
749
+{
750
+ typedef void GenLdSt1(TCGv_env, TCGv_ptr, TCGv_ptr, TCGv, TCGv_i32);
751
+
752
+ /*
753
+ * Indexed by [esz][be][v][mte][st], which is (except for load/store)
754
+ * also the order in which the elements appear in the function names,
755
+ * and so how we must concatenate the pieces.
756
+ */
757
+
758
+#define FN_LS(F) { gen_helper_sme_ld1##F, gen_helper_sme_st1##F }
759
+#define FN_MTE(F) { FN_LS(F), FN_LS(F##_mte) }
760
+#define FN_HV(F) { FN_MTE(F##_h), FN_MTE(F##_v) }
761
+#define FN_END(L, B) { FN_HV(L), FN_HV(B) }
762
+
763
+ static GenLdSt1 * const fns[5][2][2][2][2] = {
764
+ FN_END(b, b),
765
+ FN_END(h_le, h_be),
766
+ FN_END(s_le, s_be),
767
+ FN_END(d_le, d_be),
768
+ FN_END(q_le, q_be),
769
+ };
770
+
771
+#undef FN_LS
772
+#undef FN_MTE
773
+#undef FN_HV
774
+#undef FN_END
775
+
776
+ TCGv_ptr t_za, t_pg;
777
+ TCGv_i64 addr;
778
+ int svl, desc = 0;
779
+ bool be = s->be_data == MO_BE;
780
+ bool mte = s->mte_active[0];
781
+
782
+ if (!dc_isar_feature(aa64_sme, s)) {
29
+ return false;
783
+ return false;
30
+ }
784
+ }
31
+ if (sve_access_check(s)) {
785
+ if (!sme_smza_enabled_check(s)) {
32
+ unsigned vsz = vec_full_reg_size(s);
786
+ return true;
33
+ tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
787
+ }
34
+ vec_full_reg_offset(s, rn),
788
+
35
+ vec_full_reg_offset(s, rm),
789
+ t_za = get_tile_rowcol(s, a->esz, a->rs, a->za_imm, a->v);
36
+ vsz, vsz, data, fn);
790
+ t_pg = pred_full_reg_ptr(s, a->pg);
37
+ }
791
+ addr = tcg_temp_new_i64();
792
+
793
+ tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), a->esz);
794
+ tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn));
795
+
796
+ if (mte) {
797
+ desc = FIELD_DP32(desc, MTEDESC, MIDX, get_mem_index(s));
798
+ desc = FIELD_DP32(desc, MTEDESC, TBI, s->tbid);
799
+ desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma);
800
+ desc = FIELD_DP32(desc, MTEDESC, WRITE, a->st);
801
+ desc = FIELD_DP32(desc, MTEDESC, SIZEM1, (1 << a->esz) - 1);
802
+ desc <<= SVE_MTEDESC_SHIFT;
803
+ } else {
804
+ addr = clean_data_tbi(s, addr);
805
+ }
806
+ svl = streaming_vec_reg_size(s);
807
+ desc = simd_desc(svl, svl, desc);
808
+
809
+ fns[a->esz][be][a->v][mte][a->st](cpu_env, t_za, t_pg, addr,
810
+ tcg_constant_i32(desc));
811
+
812
+ tcg_temp_free_ptr(t_za);
813
+ tcg_temp_free_ptr(t_pg);
814
+ tcg_temp_free_i64(addr);
38
+ return true;
815
+ return true;
39
}
816
+}
40
41
/* Invoke an out-of-line helper on 4 Zregs. */
42
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zzi(DisasContext *s, arg_rri_esz *a)
43
44
static bool do_zzw_ool(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
45
{
46
- if (fn == NULL) {
47
- return false;
48
- }
49
- if (sve_access_check(s)) {
50
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
51
- }
52
- return true;
53
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
54
}
55
56
#define DO_ZZW(NAME, name) \
57
@@ -XXX,XX +XXX,XX @@ static bool trans_RDVL(DisasContext *s, arg_RDVL *a)
58
59
static bool do_adr(DisasContext *s, arg_rrri *a, gen_helper_gvec_3 *fn)
60
{
61
- if (sve_access_check(s)) {
62
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, a->imm);
63
- }
64
- return true;
65
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, a->imm);
66
}
67
68
static bool trans_ADR_p32(DisasContext *s, arg_rrri *a)
69
@@ -XXX,XX +XXX,XX @@ static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
70
gen_helper_sve_ftssel_s,
71
gen_helper_sve_ftssel_d,
72
};
73
- if (a->esz == 0) {
74
- return false;
75
- }
76
- if (sve_access_check(s)) {
77
- gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
78
- }
79
- return true;
80
+ return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
81
}
82
83
/*
84
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
85
gen_helper_sve_tbl_b, gen_helper_sve_tbl_h,
86
gen_helper_sve_tbl_s, gen_helper_sve_tbl_d
87
};
88
-
89
- if (sve_access_check(s)) {
90
- gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
91
- }
92
- return true;
93
+ return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
94
}
95
96
static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
97
@@ -XXX,XX +XXX,XX @@ static bool trans_TBX(DisasContext *s, arg_rrr_esz *a)
98
if (!dc_isar_feature(aa64_sve2, s)) {
99
return false;
100
}
101
- if (sve_access_check(s)) {
102
- gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
103
- }
104
- return true;
105
+ return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
106
}
107
108
static bool trans_UNPK(DisasContext *s, arg_UNPK *a)
109
@@ -XXX,XX +XXX,XX @@ static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
110
static bool do_zzz_data_ool(DisasContext *s, arg_rrr_esz *a, int data,
111
gen_helper_gvec_3 *fn)
112
{
113
- if (sve_access_check(s)) {
114
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
115
- }
116
- return true;
117
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
118
}
119
120
static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
121
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
122
static bool do_sve2_zzz_ool(DisasContext *s, arg_rrr_esz *a,
123
gen_helper_gvec_3 *fn)
124
{
125
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
126
+ if (!dc_isar_feature(aa64_sve2, s)) {
127
return false;
128
}
129
- if (sve_access_check(s)) {
130
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
131
- }
132
- return true;
133
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
134
}
135
136
static bool trans_SMULH_zzz(DisasContext *s, arg_rrr_esz *a)
137
@@ -XXX,XX +XXX,XX @@ static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
138
if (!dc_isar_feature(aa64_sve2_aes, s)) {
139
return false;
140
}
141
- if (sve_access_check(s)) {
142
- gen_gvec_ool_zzz(s, gen_helper_crypto_aese,
143
- a->rd, a->rn, a->rm, decrypt);
144
- }
145
- return true;
146
+ return gen_gvec_ool_zzz(s, gen_helper_crypto_aese,
147
+ a->rd, a->rn, a->rm, decrypt);
148
}
149
150
static bool trans_AESE(DisasContext *s, arg_rrr_esz *a)
151
@@ -XXX,XX +XXX,XX @@ static bool do_sm4(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
152
if (!dc_isar_feature(aa64_sve2_sm4, s)) {
153
return false;
154
}
155
- if (sve_access_check(s)) {
156
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
157
- }
158
- return true;
159
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
160
}
161
162
static bool trans_SM4E(DisasContext *s, arg_rrr_esz *a)
163
--
817
--
164
2.25.1
818
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This is in line with how we treat uzp, and will
3
Add a TCGv_ptr base argument, which will be cpu_env for SVE.
4
eliminate the special case code during translation.
4
We will reuse this for SME save and restore array insns.
5
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-58-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-22-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/sve_helper.c | 6 ++++--
11
target/arm/translate-a64.h | 3 +++
12
target/arm/translate-sve.c | 12 ++++++------
12
target/arm/translate-sve.c | 48 ++++++++++++++++++++++++++++----------
13
2 files changed, 10 insertions(+), 8 deletions(-)
13
2 files changed, 39 insertions(+), 12 deletions(-)
14
14
15
diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
15
diff --git a/target/arm/translate-a64.h b/target/arm/translate-a64.h
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sve_helper.c
17
--- a/target/arm/translate-a64.h
18
+++ b/target/arm/sve_helper.c
18
+++ b/target/arm/translate-a64.h
19
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_punpk_p)(void *vd, void *vn, uint32_t pred_desc)
19
@@ -XXX,XX +XXX,XX @@ void gen_gvec_xar(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
20
void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc) \
20
uint32_t rm_ofs, int64_t shift,
21
{ \
21
uint32_t opr_sz, uint32_t max_sz);
22
intptr_t oprsz = simd_oprsz(desc); \
22
23
+ intptr_t odd_ofs = simd_data(desc); \
23
+void gen_sve_ldr(DisasContext *s, TCGv_ptr, int vofs, int len, int rn, int imm);
24
intptr_t i, oprsz_2 = oprsz / 2; \
24
+void gen_sve_str(DisasContext *s, TCGv_ptr, int vofs, int len, int rn, int imm);
25
ARMVectorReg tmp_n, tmp_m; \
25
+
26
/* We produce output faster than we consume input. \
26
#endif /* TARGET_ARM_TRANSLATE_A64_H */
27
@@ -XXX,XX +XXX,XX @@ void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc) \
28
vm = memcpy(&tmp_m, vm, oprsz_2); \
29
} \
30
for (i = 0; i < oprsz_2; i += sizeof(TYPE)) { \
31
- *(TYPE *)(vd + H(2 * i + 0)) = *(TYPE *)(vn + H(i)); \
32
- *(TYPE *)(vd + H(2 * i + sizeof(TYPE))) = *(TYPE *)(vm + H(i)); \
33
+ *(TYPE *)(vd + H(2 * i + 0)) = *(TYPE *)(vn + odd_ofs + H(i)); \
34
+ *(TYPE *)(vd + H(2 * i + sizeof(TYPE))) = \
35
+ *(TYPE *)(vm + odd_ofs + H(i)); \
36
} \
37
if (sizeof(TYPE) == 16 && unlikely(oprsz & 16)) { \
38
memset(vd + oprsz - 16, 0, 16); \
39
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
27
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
40
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/translate-sve.c
29
--- a/target/arm/translate-sve.c
42
+++ b/target/arm/translate-sve.c
30
+++ b/target/arm/translate-sve.c
43
@@ -XXX,XX +XXX,XX @@ static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
31
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(UCVTF_dd, aa64_sve, gen_gvec_fpst_arg_zpz,
44
unsigned vsz = vec_full_reg_size(s);
32
* The load should begin at the address Rn + IMM.
45
unsigned high_ofs = high ? vsz / 2 : 0;
33
*/
46
tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
34
47
- vec_full_reg_offset(s, a->rn) + high_ofs,
35
-static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
48
- vec_full_reg_offset(s, a->rm) + high_ofs,
36
+void gen_sve_ldr(DisasContext *s, TCGv_ptr base, int vofs,
49
- vsz, vsz, 0, fns[a->esz]);
37
+ int len, int rn, int imm)
50
+ vec_full_reg_offset(s, a->rn),
38
{
51
+ vec_full_reg_offset(s, a->rm),
39
int len_align = QEMU_ALIGN_DOWN(len, 8);
52
+ vsz, vsz, high_ofs, fns[a->esz]);
40
int len_remain = len % 8;
41
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
42
t0 = tcg_temp_new_i64();
43
for (i = 0; i < len_align; i += 8) {
44
tcg_gen_qemu_ld_i64(t0, clean_addr, midx, MO_LEUQ);
45
- tcg_gen_st_i64(t0, cpu_env, vofs + i);
46
+ tcg_gen_st_i64(t0, base, vofs + i);
47
tcg_gen_addi_i64(clean_addr, clean_addr, 8);
48
}
49
tcg_temp_free_i64(t0);
50
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
51
clean_addr = new_tmp_a64_local(s);
52
tcg_gen_mov_i64(clean_addr, t0);
53
54
+ if (base != cpu_env) {
55
+ TCGv_ptr b = tcg_temp_local_new_ptr();
56
+ tcg_gen_mov_ptr(b, base);
57
+ base = b;
58
+ }
59
+
60
gen_set_label(loop);
61
62
t0 = tcg_temp_new_i64();
63
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
64
tcg_gen_addi_i64(clean_addr, clean_addr, 8);
65
66
tp = tcg_temp_new_ptr();
67
- tcg_gen_add_ptr(tp, cpu_env, i);
68
+ tcg_gen_add_ptr(tp, base, i);
69
tcg_gen_addi_ptr(i, i, 8);
70
tcg_gen_st_i64(t0, tp, vofs);
71
tcg_temp_free_ptr(tp);
72
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
73
74
tcg_gen_brcondi_ptr(TCG_COND_LTU, i, len_align, loop);
75
tcg_temp_free_ptr(i);
76
+
77
+ if (base != cpu_env) {
78
+ tcg_temp_free_ptr(base);
79
+ assert(len_remain == 0);
80
+ }
81
}
82
83
/*
84
@@ -XXX,XX +XXX,XX @@ static void do_ldr(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
85
default:
86
g_assert_not_reached();
87
}
88
- tcg_gen_st_i64(t0, cpu_env, vofs + len_align);
89
+ tcg_gen_st_i64(t0, base, vofs + len_align);
90
tcg_temp_free_i64(t0);
91
}
92
}
93
94
/* Similarly for stores. */
95
-static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
96
+void gen_sve_str(DisasContext *s, TCGv_ptr base, int vofs,
97
+ int len, int rn, int imm)
98
{
99
int len_align = QEMU_ALIGN_DOWN(len, 8);
100
int len_remain = len % 8;
101
@@ -XXX,XX +XXX,XX @@ static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
102
103
t0 = tcg_temp_new_i64();
104
for (i = 0; i < len_align; i += 8) {
105
- tcg_gen_ld_i64(t0, cpu_env, vofs + i);
106
+ tcg_gen_ld_i64(t0, base, vofs + i);
107
tcg_gen_qemu_st_i64(t0, clean_addr, midx, MO_LEUQ);
108
tcg_gen_addi_i64(clean_addr, clean_addr, 8);
109
}
110
@@ -XXX,XX +XXX,XX @@ static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
111
clean_addr = new_tmp_a64_local(s);
112
tcg_gen_mov_i64(clean_addr, t0);
113
114
+ if (base != cpu_env) {
115
+ TCGv_ptr b = tcg_temp_local_new_ptr();
116
+ tcg_gen_mov_ptr(b, base);
117
+ base = b;
118
+ }
119
+
120
gen_set_label(loop);
121
122
t0 = tcg_temp_new_i64();
123
tp = tcg_temp_new_ptr();
124
- tcg_gen_add_ptr(tp, cpu_env, i);
125
+ tcg_gen_add_ptr(tp, base, i);
126
tcg_gen_ld_i64(t0, tp, vofs);
127
tcg_gen_addi_ptr(i, i, 8);
128
tcg_temp_free_ptr(tp);
129
@@ -XXX,XX +XXX,XX @@ static void do_str(DisasContext *s, uint32_t vofs, int len, int rn, int imm)
130
131
tcg_gen_brcondi_ptr(TCG_COND_LTU, i, len_align, loop);
132
tcg_temp_free_ptr(i);
133
+
134
+ if (base != cpu_env) {
135
+ tcg_temp_free_ptr(base);
136
+ assert(len_remain == 0);
137
+ }
138
}
139
140
/* Predicate register stores can be any multiple of 2. */
141
if (len_remain) {
142
t0 = tcg_temp_new_i64();
143
- tcg_gen_ld_i64(t0, cpu_env, vofs + len_align);
144
+ tcg_gen_ld_i64(t0, base, vofs + len_align);
145
146
switch (len_remain) {
147
case 2:
148
@@ -XXX,XX +XXX,XX @@ static bool trans_LDR_zri(DisasContext *s, arg_rri *a)
149
if (sve_access_check(s)) {
150
int size = vec_full_reg_size(s);
151
int off = vec_full_reg_offset(s, a->rd);
152
- do_ldr(s, off, size, a->rn, a->imm * size);
153
+ gen_sve_ldr(s, cpu_env, off, size, a->rn, a->imm * size);
53
}
154
}
54
return true;
155
return true;
55
}
156
}
56
@@ -XXX,XX +XXX,XX @@ static bool do_zip_q(DisasContext *s, arg_rrr_esz *a, bool high)
157
@@ -XXX,XX +XXX,XX @@ static bool trans_LDR_pri(DisasContext *s, arg_rri *a)
57
unsigned vsz = vec_full_reg_size(s);
158
if (sve_access_check(s)) {
58
unsigned high_ofs = high ? QEMU_ALIGN_DOWN(vsz, 32) / 2 : 0;
159
int size = pred_full_reg_size(s);
59
tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
160
int off = pred_full_reg_offset(s, a->rd);
60
- vec_full_reg_offset(s, a->rn) + high_ofs,
161
- do_ldr(s, off, size, a->rn, a->imm * size);
61
- vec_full_reg_offset(s, a->rm) + high_ofs,
162
+ gen_sve_ldr(s, cpu_env, off, size, a->rn, a->imm * size);
62
- vsz, vsz, 0, gen_helper_sve2_zip_q);
163
}
63
+ vec_full_reg_offset(s, a->rn),
164
return true;
64
+ vec_full_reg_offset(s, a->rm),
165
}
65
+ vsz, vsz, high_ofs, gen_helper_sve2_zip_q);
166
@@ -XXX,XX +XXX,XX @@ static bool trans_STR_zri(DisasContext *s, arg_rri *a)
167
if (sve_access_check(s)) {
168
int size = vec_full_reg_size(s);
169
int off = vec_full_reg_offset(s, a->rd);
170
- do_str(s, off, size, a->rn, a->imm * size);
171
+ gen_sve_str(s, cpu_env, off, size, a->rn, a->imm * size);
172
}
173
return true;
174
}
175
@@ -XXX,XX +XXX,XX @@ static bool trans_STR_pri(DisasContext *s, arg_rri *a)
176
if (sve_access_check(s)) {
177
int size = pred_full_reg_size(s);
178
int off = pred_full_reg_offset(s, a->rd);
179
- do_str(s, off, size, a->rn, a->imm * size);
180
+ gen_sve_str(s, cpu_env, off, size, a->rn, a->imm * size);
66
}
181
}
67
return true;
182
return true;
68
}
183
}
69
--
184
--
70
2.25.1
185
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Use gen_gvec_ool_arg_zzzz instead of gen_gvec_ool_zzzz
3
We can reuse the SVE functions for LDR and STR, passing in the
4
when the arguments come from arg_rrrr_esz.
4
base of the ZA vector and a zero offset.
5
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-11-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-23-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/translate-sve.c | 16 ++++++++++------
11
target/arm/sme.decode | 7 +++++++
12
1 file changed, 10 insertions(+), 6 deletions(-)
12
target/arm/translate-sme.c | 24 ++++++++++++++++++++++++
13
2 files changed, 31 insertions(+)
13
14
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/sme.decode b/target/arm/sme.decode
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
--- a/target/arm/sme.decode
17
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/sme.decode
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
19
@@ -XXX,XX +XXX,XX @@ LDST1 1110000 0 esz:2 st:1 rm:5 v:1 .. pg:3 rn:5 0 za_imm:4 \
20
&ldst rs=%mova_rs
21
LDST1 1110000 111 st:1 rm:5 v:1 .. pg:3 rn:5 0 za_imm:4 \
22
&ldst esz=4 rs=%mova_rs
23
+
24
+&ldstr rv rn imm
25
+@ldstr ....... ... . ...... .. ... rn:5 . imm:4 \
26
+ &ldstr rv=%mova_rs
27
+
28
+LDR 1110000 100 0 000000 .. 000 ..... 0 .... @ldstr
29
+STR 1110000 100 1 000000 .. 000 ..... 0 .... @ldstr
30
diff --git a/target/arm/translate-sme.c b/target/arm/translate-sme.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/translate-sme.c
33
+++ b/target/arm/translate-sme.c
34
@@ -XXX,XX +XXX,XX @@ static bool trans_LDST1(DisasContext *s, arg_LDST1 *a)
35
tcg_temp_free_i64(addr);
19
return true;
36
return true;
20
}
37
}
21
38
+
22
+static bool gen_gvec_ool_arg_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
39
+typedef void GenLdStR(DisasContext *, TCGv_ptr, int, int, int, int);
23
+ arg_rrrr_esz *a, int data)
40
+
41
+static bool do_ldst_r(DisasContext *s, arg_ldstr *a, GenLdStR *fn)
24
+{
42
+{
25
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
43
+ int svl = streaming_vec_reg_size(s);
44
+ int imm = a->imm;
45
+ TCGv_ptr base;
46
+
47
+ if (!sme_za_enabled_check(s)) {
48
+ return true;
49
+ }
50
+
51
+ /* ZA[n] equates to ZA0H.B[n]. */
52
+ base = get_tile_rowcol(s, MO_8, a->rv, imm, false);
53
+
54
+ fn(s, base, 0, svl, a->rn, imm * svl);
55
+
56
+ tcg_temp_free_ptr(base);
57
+ return true;
26
+}
58
+}
27
+
59
+
28
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
60
+TRANS_FEAT(LDR, aa64_sme, do_ldst_r, a, gen_sve_ldr)
29
static void gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
61
+TRANS_FEAT(STR, aa64_sme, do_ldst_r, a, gen_sve_str)
30
int rd, int rn, int pg, int data)
31
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
32
if (!dc_isar_feature(aa64_sve2, s)) {
33
return false;
34
}
35
- return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
36
+ return gen_gvec_ool_arg_zzzz(s, fn, a, data);
37
}
38
39
static bool do_abal(DisasContext *s, arg_rrrr_esz *a, bool uns, bool sel)
40
@@ -XXX,XX +XXX,XX @@ static bool do_i8mm_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
41
if (!dc_isar_feature(aa64_sve_i8mm, s)) {
42
return false;
43
}
44
- return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
45
+ return gen_gvec_ool_arg_zzzz(s, fn, a, data);
46
}
47
48
static bool trans_SMMLA(DisasContext *s, arg_rrrr_esz *a)
49
@@ -XXX,XX +XXX,XX @@ static bool trans_BFDOT_zzzz(DisasContext *s, arg_rrrr_esz *a)
50
if (!dc_isar_feature(aa64_sve_bf16, s)) {
51
return false;
52
}
53
- return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot,
54
- a->rd, a->rn, a->rm, a->ra, 0);
55
+ return gen_gvec_ool_arg_zzzz(s, gen_helper_gvec_bfdot, a, 0);
56
}
57
58
static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
59
@@ -XXX,XX +XXX,XX @@ static bool trans_BFMMLA(DisasContext *s, arg_rrrr_esz *a)
60
if (!dc_isar_feature(aa64_sve_bf16, s)) {
61
return false;
62
}
63
- return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfmmla,
64
- a->rd, a->rn, a->rm, a->ra, 0);
65
+ return gen_gvec_ool_arg_zzzz(s, gen_helper_gvec_bfmmla, a, 0);
66
}
67
68
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
69
--
62
--
70
2.25.1
63
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Rename the function to match gen_gvec_ool_arg_zzz,
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
and move to be adjacent. Split out gen_gvec_fpst_zzz
5
as a helper while we're at it.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-86-richard.henderson@linaro.org
5
Message-id: 20220708151540.18136-24-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
7
---
12
target/arm/translate-sve.c | 50 +++++++++++++++++++++++---------------
8
target/arm/helper-sme.h | 5 +++
13
1 file changed, 30 insertions(+), 20 deletions(-)
9
target/arm/sme.decode | 11 +++++
10
target/arm/sme_helper.c | 90 ++++++++++++++++++++++++++++++++++++++
11
target/arm/translate-sme.c | 31 +++++++++++++
12
4 files changed, 137 insertions(+)
14
13
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/helper-sme.h b/target/arm/helper-sme.h
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
16
--- a/target/arm/helper-sme.h
18
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/helper-sme.h
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(sme_st1q_be_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i
20
return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
19
DEF_HELPER_FLAGS_5(sme_st1q_le_h_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
21
}
20
DEF_HELPER_FLAGS_5(sme_st1q_be_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
22
21
DEF_HELPER_FLAGS_5(sme_st1q_le_v_mte, TCG_CALL_NO_WG, void, env, ptr, ptr, tl, i32)
23
+/* Invoke an out-of-line helper on 3 Zregs, plus float_status. */
22
+
24
+static bool gen_gvec_fpst_zzz(DisasContext *s, gen_helper_gvec_3_ptr *fn,
23
+DEF_HELPER_FLAGS_5(sme_addha_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
25
+ int rd, int rn, int rm,
24
+DEF_HELPER_FLAGS_5(sme_addva_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
26
+ int data, ARMFPStatusFlavour flavour)
25
+DEF_HELPER_FLAGS_5(sme_addha_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
26
+DEF_HELPER_FLAGS_5(sme_addva_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
27
diff --git a/target/arm/sme.decode b/target/arm/sme.decode
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/sme.decode
30
+++ b/target/arm/sme.decode
31
@@ -XXX,XX +XXX,XX @@ LDST1 1110000 111 st:1 rm:5 v:1 .. pg:3 rn:5 0 za_imm:4 \
32
33
LDR 1110000 100 0 000000 .. 000 ..... 0 .... @ldstr
34
STR 1110000 100 1 000000 .. 000 ..... 0 .... @ldstr
35
+
36
+### SME Add Vector to Array
37
+
38
+&adda zad zn pm pn
39
+@adda_32 ........ .. ..... . pm:3 pn:3 zn:5 ... zad:2 &adda
40
+@adda_64 ........ .. ..... . pm:3 pn:3 zn:5 .. zad:3 &adda
41
+
42
+ADDHA_s 11000000 10 01000 0 ... ... ..... 000 .. @adda_32
43
+ADDVA_s 11000000 10 01000 1 ... ... ..... 000 .. @adda_32
44
+ADDHA_d 11000000 11 01000 0 ... ... ..... 00 ... @adda_64
45
+ADDVA_d 11000000 11 01000 1 ... ... ..... 00 ... @adda_64
46
diff --git a/target/arm/sme_helper.c b/target/arm/sme_helper.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/sme_helper.c
49
+++ b/target/arm/sme_helper.c
50
@@ -XXX,XX +XXX,XX @@ DO_ST(q, _be, MO_128)
51
DO_ST(q, _le, MO_128)
52
53
#undef DO_ST
54
+
55
+void HELPER(sme_addha_s)(void *vzda, void *vzn, void *vpn,
56
+ void *vpm, uint32_t desc)
27
+{
57
+{
28
+ if (fn == NULL) {
58
+ intptr_t row, col, oprsz = simd_oprsz(desc) / 4;
29
+ return false;
59
+ uint64_t *pn = vpn, *pm = vpm;
60
+ uint32_t *zda = vzda, *zn = vzn;
61
+
62
+ for (row = 0; row < oprsz; ) {
63
+ uint64_t pa = pn[row >> 4];
64
+ do {
65
+ if (pa & 1) {
66
+ for (col = 0; col < oprsz; ) {
67
+ uint64_t pb = pm[col >> 4];
68
+ do {
69
+ if (pb & 1) {
70
+ zda[tile_vslice_index(row) + H4(col)] += zn[H4(col)];
71
+ }
72
+ pb >>= 4;
73
+ } while (++col & 15);
74
+ }
75
+ }
76
+ pa >>= 4;
77
+ } while (++row & 15);
30
+ }
78
+ }
31
+ if (sve_access_check(s)) {
79
+}
32
+ unsigned vsz = vec_full_reg_size(s);
33
+ TCGv_ptr status = fpstatus_ptr(flavour);
34
+
80
+
35
+ tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
81
+void HELPER(sme_addha_d)(void *vzda, void *vzn, void *vpn,
36
+ vec_full_reg_offset(s, rn),
82
+ void *vpm, uint32_t desc)
37
+ vec_full_reg_offset(s, rm),
83
+{
38
+ status, vsz, vsz, data, fn);
84
+ intptr_t row, col, oprsz = simd_oprsz(desc) / 8;
85
+ uint8_t *pn = vpn, *pm = vpm;
86
+ uint64_t *zda = vzda, *zn = vzn;
39
+
87
+
40
+ tcg_temp_free_ptr(status);
88
+ for (row = 0; row < oprsz; ++row) {
89
+ if (pn[H1(row)] & 1) {
90
+ for (col = 0; col < oprsz; ++col) {
91
+ if (pm[H1(col)] & 1) {
92
+ zda[tile_vslice_index(row) + col] += zn[col];
93
+ }
94
+ }
95
+ }
41
+ }
96
+ }
97
+}
98
+
99
+void HELPER(sme_addva_s)(void *vzda, void *vzn, void *vpn,
100
+ void *vpm, uint32_t desc)
101
+{
102
+ intptr_t row, col, oprsz = simd_oprsz(desc) / 4;
103
+ uint64_t *pn = vpn, *pm = vpm;
104
+ uint32_t *zda = vzda, *zn = vzn;
105
+
106
+ for (row = 0; row < oprsz; ) {
107
+ uint64_t pa = pn[row >> 4];
108
+ do {
109
+ if (pa & 1) {
110
+ uint32_t zn_row = zn[H4(row)];
111
+ for (col = 0; col < oprsz; ) {
112
+ uint64_t pb = pm[col >> 4];
113
+ do {
114
+ if (pb & 1) {
115
+ zda[tile_vslice_index(row) + H4(col)] += zn_row;
116
+ }
117
+ pb >>= 4;
118
+ } while (++col & 15);
119
+ }
120
+ }
121
+ pa >>= 4;
122
+ } while (++row & 15);
123
+ }
124
+}
125
+
126
+void HELPER(sme_addva_d)(void *vzda, void *vzn, void *vpn,
127
+ void *vpm, uint32_t desc)
128
+{
129
+ intptr_t row, col, oprsz = simd_oprsz(desc) / 8;
130
+ uint8_t *pn = vpn, *pm = vpm;
131
+ uint64_t *zda = vzda, *zn = vzn;
132
+
133
+ for (row = 0; row < oprsz; ++row) {
134
+ if (pn[H1(row)] & 1) {
135
+ uint64_t zn_row = zn[row];
136
+ for (col = 0; col < oprsz; ++col) {
137
+ if (pm[H1(col)] & 1) {
138
+ zda[tile_vslice_index(row) + col] += zn_row;
139
+ }
140
+ }
141
+ }
142
+ }
143
+}
144
diff --git a/target/arm/translate-sme.c b/target/arm/translate-sme.c
145
index XXXXXXX..XXXXXXX 100644
146
--- a/target/arm/translate-sme.c
147
+++ b/target/arm/translate-sme.c
148
@@ -XXX,XX +XXX,XX @@ static bool do_ldst_r(DisasContext *s, arg_ldstr *a, GenLdStR *fn)
149
150
TRANS_FEAT(LDR, aa64_sme, do_ldst_r, a, gen_sve_ldr)
151
TRANS_FEAT(STR, aa64_sme, do_ldst_r, a, gen_sve_str)
152
+
153
+static bool do_adda(DisasContext *s, arg_adda *a, MemOp esz,
154
+ gen_helper_gvec_4 *fn)
155
+{
156
+ int svl = streaming_vec_reg_size(s);
157
+ uint32_t desc = simd_desc(svl, svl, 0);
158
+ TCGv_ptr za, zn, pn, pm;
159
+
160
+ if (!sme_smza_enabled_check(s)) {
161
+ return true;
162
+ }
163
+
164
+ /* Sum XZR+zad to find ZAd. */
165
+ za = get_tile_rowcol(s, esz, 31, a->zad, false);
166
+ zn = vec_full_reg_ptr(s, a->zn);
167
+ pn = pred_full_reg_ptr(s, a->pn);
168
+ pm = pred_full_reg_ptr(s, a->pm);
169
+
170
+ fn(za, zn, pn, pm, tcg_constant_i32(desc));
171
+
172
+ tcg_temp_free_ptr(za);
173
+ tcg_temp_free_ptr(zn);
174
+ tcg_temp_free_ptr(pn);
175
+ tcg_temp_free_ptr(pm);
42
+ return true;
176
+ return true;
43
+}
177
+}
44
+
178
+
45
+static bool gen_gvec_fpst_arg_zzz(DisasContext *s, gen_helper_gvec_3_ptr *fn,
179
+TRANS_FEAT(ADDHA_s, aa64_sme, do_adda, a, MO_32, gen_helper_sme_addha_s)
46
+ arg_rrr_esz *a, int data)
180
+TRANS_FEAT(ADDVA_s, aa64_sme, do_adda, a, MO_32, gen_helper_sme_addva_s)
47
+{
181
+TRANS_FEAT(ADDHA_d, aa64_sme_i16i64, do_adda, a, MO_64, gen_helper_sme_addha_d)
48
+ return gen_gvec_fpst_zzz(s, fn, a->rd, a->rn, a->rm, data,
182
+TRANS_FEAT(ADDVA_d, aa64_sme_i16i64, do_adda, a, MO_64, gen_helper_sme_addva_d)
49
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
50
+}
51
+
52
/* Invoke an out-of-line helper on 4 Zregs. */
53
static bool gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
54
int rd, int rn, int rm, int ra, int data)
55
@@ -XXX,XX +XXX,XX @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
56
*** SVE Floating Point Arithmetic - Unpredicated Group
57
*/
58
59
-static bool do_zzz_fp(DisasContext *s, arg_rrr_esz *a,
60
- gen_helper_gvec_3_ptr *fn)
61
-{
62
- if (fn == NULL) {
63
- return false;
64
- }
65
- if (sve_access_check(s)) {
66
- unsigned vsz = vec_full_reg_size(s);
67
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
68
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
69
- vec_full_reg_offset(s, a->rn),
70
- vec_full_reg_offset(s, a->rm),
71
- status, vsz, vsz, 0, fn);
72
- tcg_temp_free_ptr(status);
73
- }
74
- return true;
75
-}
76
-
77
-
78
#define DO_FP3(NAME, name) \
79
static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
80
{ \
81
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
82
NULL, gen_helper_gvec_##name##_h, \
83
gen_helper_gvec_##name##_s, gen_helper_gvec_##name##_d \
84
}; \
85
- return do_zzz_fp(s, a, fns[a->esz]); \
86
+ return gen_gvec_fpst_arg_zzz(s, fns[a->esz], a, 0); \
87
}
88
89
DO_FP3(FADD_zzz, fadd)
90
--
183
--
91
2.25.1
184
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-90-richard.henderson@linaro.org
4
Message-id: 20220708151540.18136-25-richard.henderson@linaro.org
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
target/arm/translate-sve.c | 30 +++++++++++++++++-------------
8
target/arm/helper-sme.h | 5 +++
9
1 file changed, 17 insertions(+), 13 deletions(-)
9
target/arm/sme.decode | 9 +++++
10
target/arm/sme_helper.c | 69 ++++++++++++++++++++++++++++++++++++++
11
target/arm/translate-sme.c | 32 ++++++++++++++++++
12
4 files changed, 115 insertions(+)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/helper-sme.h b/target/arm/helper-sme.h
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/target/arm/helper-sme.h
14
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/helper-sme.h
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FMUL_zzx, aa64_sve, gen_gvec_fpst_zzz,
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(sme_addha_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
16
typedef void gen_helper_fp_reduce(TCGv_i64, TCGv_ptr, TCGv_ptr,
19
DEF_HELPER_FLAGS_5(sme_addva_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
17
TCGv_ptr, TCGv_i32);
20
DEF_HELPER_FLAGS_5(sme_addha_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
18
21
DEF_HELPER_FLAGS_5(sme_addva_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
19
-static void do_reduce(DisasContext *s, arg_rpr_esz *a,
22
+
20
+static bool do_reduce(DisasContext *s, arg_rpr_esz *a,
23
+DEF_HELPER_FLAGS_7(sme_fmopa_s, TCG_CALL_NO_RWG,
21
gen_helper_fp_reduce *fn)
24
+ void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
22
{
25
+DEF_HELPER_FLAGS_7(sme_fmopa_d, TCG_CALL_NO_RWG,
23
- unsigned vsz = vec_full_reg_size(s);
26
+ void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
24
- unsigned p2vsz = pow2ceil(vsz);
27
diff --git a/target/arm/sme.decode b/target/arm/sme.decode
25
- TCGv_i32 t_desc = tcg_constant_i32(simd_desc(vsz, vsz, p2vsz));
28
index XXXXXXX..XXXXXXX 100644
26
+ unsigned vsz, p2vsz;
29
--- a/target/arm/sme.decode
27
+ TCGv_i32 t_desc;
30
+++ b/target/arm/sme.decode
28
TCGv_ptr t_zn, t_pg, status;
31
@@ -XXX,XX +XXX,XX @@ ADDHA_s 11000000 10 01000 0 ... ... ..... 000 .. @adda_32
29
TCGv_i64 temp;
32
ADDVA_s 11000000 10 01000 1 ... ... ..... 000 .. @adda_32
30
33
ADDHA_d 11000000 11 01000 0 ... ... ..... 00 ... @adda_64
31
+ if (fn == NULL) {
34
ADDVA_d 11000000 11 01000 1 ... ... ..... 00 ... @adda_64
32
+ return false;
35
+
36
+### SME Outer Product
37
+
38
+&op zad zn zm pm pn sub:bool
39
+@op_32 ........ ... zm:5 pm:3 pn:3 zn:5 sub:1 .. zad:2 &op
40
+@op_64 ........ ... zm:5 pm:3 pn:3 zn:5 sub:1 . zad:3 &op
41
+
42
+FMOPA_s 10000000 100 ..... ... ... ..... . 00 .. @op_32
43
+FMOPA_d 10000000 110 ..... ... ... ..... . 0 ... @op_64
44
diff --git a/target/arm/sme_helper.c b/target/arm/sme_helper.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/sme_helper.c
47
+++ b/target/arm/sme_helper.c
48
@@ -XXX,XX +XXX,XX @@
49
#include "exec/cpu_ldst.h"
50
#include "exec/exec-all.h"
51
#include "qemu/int128.h"
52
+#include "fpu/softfloat.h"
53
#include "vec_internal.h"
54
#include "sve_ldst_internal.h"
55
56
@@ -XXX,XX +XXX,XX @@ void HELPER(sme_addva_d)(void *vzda, void *vzn, void *vpn,
57
}
58
}
59
}
60
+
61
+void HELPER(sme_fmopa_s)(void *vza, void *vzn, void *vzm, void *vpn,
62
+ void *vpm, void *vst, uint32_t desc)
63
+{
64
+ intptr_t row, col, oprsz = simd_maxsz(desc);
65
+ uint32_t neg = simd_data(desc) << 31;
66
+ uint16_t *pn = vpn, *pm = vpm;
67
+ float_status fpst;
68
+
69
+ /*
70
+ * Make a copy of float_status because this operation does not
71
+ * update the cumulative fp exception status. It also produces
72
+ * default nans.
73
+ */
74
+ fpst = *(float_status *)vst;
75
+ set_default_nan_mode(true, &fpst);
76
+
77
+ for (row = 0; row < oprsz; ) {
78
+ uint16_t pa = pn[H2(row >> 4)];
79
+ do {
80
+ if (pa & 1) {
81
+ void *vza_row = vza + tile_vslice_offset(row);
82
+ uint32_t n = *(uint32_t *)(vzn + H1_4(row)) ^ neg;
83
+
84
+ for (col = 0; col < oprsz; ) {
85
+ uint16_t pb = pm[H2(col >> 4)];
86
+ do {
87
+ if (pb & 1) {
88
+ uint32_t *a = vza_row + H1_4(col);
89
+ uint32_t *m = vzm + H1_4(col);
90
+ *a = float32_muladd(n, *m, *a, 0, vst);
91
+ }
92
+ col += 4;
93
+ pb >>= 4;
94
+ } while (col & 15);
95
+ }
96
+ }
97
+ row += 4;
98
+ pa >>= 4;
99
+ } while (row & 15);
33
+ }
100
+ }
34
+ if (!sve_access_check(s)) {
101
+}
102
+
103
+void HELPER(sme_fmopa_d)(void *vza, void *vzn, void *vzm, void *vpn,
104
+ void *vpm, void *vst, uint32_t desc)
105
+{
106
+ intptr_t row, col, oprsz = simd_oprsz(desc) / 8;
107
+ uint64_t neg = (uint64_t)simd_data(desc) << 63;
108
+ uint64_t *za = vza, *zn = vzn, *zm = vzm;
109
+ uint8_t *pn = vpn, *pm = vpm;
110
+ float_status fpst = *(float_status *)vst;
111
+
112
+ set_default_nan_mode(true, &fpst);
113
+
114
+ for (row = 0; row < oprsz; ++row) {
115
+ if (pn[H1(row)] & 1) {
116
+ uint64_t *za_row = &za[tile_vslice_index(row)];
117
+ uint64_t n = zn[row] ^ neg;
118
+
119
+ for (col = 0; col < oprsz; ++col) {
120
+ if (pm[H1(col)] & 1) {
121
+ uint64_t *a = &za_row[col];
122
+ *a = float64_muladd(n, zm[col], *a, 0, &fpst);
123
+ }
124
+ }
125
+ }
126
+ }
127
+}
128
diff --git a/target/arm/translate-sme.c b/target/arm/translate-sme.c
129
index XXXXXXX..XXXXXXX 100644
130
--- a/target/arm/translate-sme.c
131
+++ b/target/arm/translate-sme.c
132
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(ADDHA_s, aa64_sme, do_adda, a, MO_32, gen_helper_sme_addha_s)
133
TRANS_FEAT(ADDVA_s, aa64_sme, do_adda, a, MO_32, gen_helper_sme_addva_s)
134
TRANS_FEAT(ADDHA_d, aa64_sme_i16i64, do_adda, a, MO_64, gen_helper_sme_addha_d)
135
TRANS_FEAT(ADDVA_d, aa64_sme_i16i64, do_adda, a, MO_64, gen_helper_sme_addva_d)
136
+
137
+static bool do_outprod_fpst(DisasContext *s, arg_op *a, MemOp esz,
138
+ gen_helper_gvec_5_ptr *fn)
139
+{
140
+ int svl = streaming_vec_reg_size(s);
141
+ uint32_t desc = simd_desc(svl, svl, a->sub);
142
+ TCGv_ptr za, zn, zm, pn, pm, fpst;
143
+
144
+ if (!sme_smza_enabled_check(s)) {
35
+ return true;
145
+ return true;
36
+ }
146
+ }
37
+
147
+
38
+ vsz = vec_full_reg_size(s);
148
+ /* Sum XZR+zad to find ZAd. */
39
+ p2vsz = pow2ceil(vsz);
149
+ za = get_tile_rowcol(s, esz, 31, a->zad, false);
40
+ t_desc = tcg_constant_i32(simd_desc(vsz, vsz, p2vsz));
150
+ zn = vec_full_reg_ptr(s, a->zn);
41
temp = tcg_temp_new_i64();
151
+ zm = vec_full_reg_ptr(s, a->zm);
42
t_zn = tcg_temp_new_ptr();
152
+ pn = pred_full_reg_ptr(s, a->pn);
43
t_pg = tcg_temp_new_ptr();
153
+ pm = pred_full_reg_ptr(s, a->pm);
44
@@ -XXX,XX +XXX,XX @@ static void do_reduce(DisasContext *s, arg_rpr_esz *a,
154
+ fpst = fpstatus_ptr(FPST_FPCR);
45
155
+
46
write_fp_dreg(s, a->rd, temp);
156
+ fn(za, zn, zm, pn, pm, fpst, tcg_constant_i32(desc));
47
tcg_temp_free_i64(temp);
157
+
158
+ tcg_temp_free_ptr(za);
159
+ tcg_temp_free_ptr(zn);
160
+ tcg_temp_free_ptr(pn);
161
+ tcg_temp_free_ptr(pm);
162
+ tcg_temp_free_ptr(fpst);
48
+ return true;
163
+ return true;
49
}
164
+}
50
165
+
51
#define DO_VPZ(NAME, name) \
166
+TRANS_FEAT(FMOPA_s, aa64_sme, do_outprod_fpst, a, MO_32, gen_helper_sme_fmopa_s)
52
static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
167
+TRANS_FEAT(FMOPA_d, aa64_sme_f64f64, do_outprod_fpst, a, MO_64, gen_helper_sme_fmopa_d)
53
{ \
54
- static gen_helper_fp_reduce * const fns[3] = { \
55
- gen_helper_sve_##name##_h, \
56
+ static gen_helper_fp_reduce * const fns[4] = { \
57
+ NULL, gen_helper_sve_##name##_h, \
58
gen_helper_sve_##name##_s, \
59
gen_helper_sve_##name##_d, \
60
}; \
61
- if (a->esz == 0) { \
62
- return false; \
63
- } \
64
- if (sve_access_check(s)) { \
65
- do_reduce(s, a, fns[a->esz - 1]); \
66
- } \
67
- return true; \
68
+ return do_reduce(s, a, fns[a->esz]); \
69
}
70
71
DO_VPZ(FADDV, faddv)
72
--
168
--
73
2.25.1
169
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-49-richard.henderson@linaro.org
4
Message-id: 20220708151540.18136-26-richard.henderson@linaro.org
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
target/arm/translate-sve.c | 53 ++++++++++++++++++--------------------
8
target/arm/helper-sme.h | 2 ++
9
1 file changed, 25 insertions(+), 28 deletions(-)
9
target/arm/sme.decode | 2 ++
10
target/arm/sme_helper.c | 56 ++++++++++++++++++++++++++++++++++++++
11
target/arm/translate-sme.c | 30 ++++++++++++++++++++
12
4 files changed, 90 insertions(+)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/helper-sme.h b/target/arm/helper-sme.h
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/target/arm/helper-sme.h
14
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/helper-sme.h
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(MLS, aa64_sve, do_zpzzz_ool, a, mls_fns[a->esz])
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_7(sme_fmopa_s, TCG_CALL_NO_RWG,
16
*** SVE Index Generation Group
19
void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
17
*/
20
DEF_HELPER_FLAGS_7(sme_fmopa_d, TCG_CALL_NO_RWG,
18
21
void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
19
-static void do_index(DisasContext *s, int esz, int rd,
22
+DEF_HELPER_FLAGS_6(sme_bfmopa, TCG_CALL_NO_RWG,
20
+static bool do_index(DisasContext *s, int esz, int rd,
23
+ void, ptr, ptr, ptr, ptr, ptr, i32)
21
TCGv_i64 start, TCGv_i64 incr)
24
diff --git a/target/arm/sme.decode b/target/arm/sme.decode
22
{
25
index XXXXXXX..XXXXXXX 100644
23
- unsigned vsz = vec_full_reg_size(s);
26
--- a/target/arm/sme.decode
24
- TCGv_i32 desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
27
+++ b/target/arm/sme.decode
25
- TCGv_ptr t_zd = tcg_temp_new_ptr();
28
@@ -XXX,XX +XXX,XX @@ ADDVA_d 11000000 11 01000 1 ... ... ..... 00 ... @adda_64
26
+ unsigned vsz;
29
27
+ TCGv_i32 desc;
30
FMOPA_s 10000000 100 ..... ... ... ..... . 00 .. @op_32
28
+ TCGv_ptr t_zd;
31
FMOPA_d 10000000 110 ..... ... ... ..... . 0 ... @op_64
29
+
32
+
30
+ if (!sve_access_check(s)) {
33
+BFMOPA 10000001 100 ..... ... ... ..... . 00 .. @op_32
34
diff --git a/target/arm/sme_helper.c b/target/arm/sme_helper.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/sme_helper.c
37
+++ b/target/arm/sme_helper.c
38
@@ -XXX,XX +XXX,XX @@ void HELPER(sme_fmopa_d)(void *vza, void *vzn, void *vzm, void *vpn,
39
}
40
}
41
}
42
+
43
+/*
44
+ * Alter PAIR as needed for controlling predicates being false,
45
+ * and for NEG on an enabled row element.
46
+ */
47
+static inline uint32_t f16mop_adj_pair(uint32_t pair, uint32_t pg, uint32_t neg)
48
+{
49
+ /*
50
+ * The pseudocode uses a conditional negate after the conditional zero.
51
+ * It is simpler here to unconditionally negate before conditional zero.
52
+ */
53
+ pair ^= neg;
54
+ if (!(pg & 1)) {
55
+ pair &= 0xffff0000u;
56
+ }
57
+ if (!(pg & 4)) {
58
+ pair &= 0x0000ffffu;
59
+ }
60
+ return pair;
61
+}
62
+
63
+void HELPER(sme_bfmopa)(void *vza, void *vzn, void *vzm, void *vpn,
64
+ void *vpm, uint32_t desc)
65
+{
66
+ intptr_t row, col, oprsz = simd_maxsz(desc);
67
+ uint32_t neg = simd_data(desc) * 0x80008000u;
68
+ uint16_t *pn = vpn, *pm = vpm;
69
+
70
+ for (row = 0; row < oprsz; ) {
71
+ uint16_t prow = pn[H2(row >> 4)];
72
+ do {
73
+ void *vza_row = vza + tile_vslice_offset(row);
74
+ uint32_t n = *(uint32_t *)(vzn + H1_4(row));
75
+
76
+ n = f16mop_adj_pair(n, prow, neg);
77
+
78
+ for (col = 0; col < oprsz; ) {
79
+ uint16_t pcol = pm[H2(col >> 4)];
80
+ do {
81
+ if (prow & pcol & 0b0101) {
82
+ uint32_t *a = vza_row + H1_4(col);
83
+ uint32_t m = *(uint32_t *)(vzm + H1_4(col));
84
+
85
+ m = f16mop_adj_pair(m, pcol, 0);
86
+ *a = bfdotadd(*a, n, m);
87
+
88
+ col += 4;
89
+ pcol >>= 4;
90
+ }
91
+ } while (col & 15);
92
+ }
93
+ row += 4;
94
+ prow >>= 4;
95
+ } while (row & 15);
96
+ }
97
+}
98
diff --git a/target/arm/translate-sme.c b/target/arm/translate-sme.c
99
index XXXXXXX..XXXXXXX 100644
100
--- a/target/arm/translate-sme.c
101
+++ b/target/arm/translate-sme.c
102
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(ADDVA_s, aa64_sme, do_adda, a, MO_32, gen_helper_sme_addva_s)
103
TRANS_FEAT(ADDHA_d, aa64_sme_i16i64, do_adda, a, MO_64, gen_helper_sme_addha_d)
104
TRANS_FEAT(ADDVA_d, aa64_sme_i16i64, do_adda, a, MO_64, gen_helper_sme_addva_d)
105
106
+static bool do_outprod(DisasContext *s, arg_op *a, MemOp esz,
107
+ gen_helper_gvec_5 *fn)
108
+{
109
+ int svl = streaming_vec_reg_size(s);
110
+ uint32_t desc = simd_desc(svl, svl, a->sub);
111
+ TCGv_ptr za, zn, zm, pn, pm;
112
+
113
+ if (!sme_smza_enabled_check(s)) {
31
+ return true;
114
+ return true;
32
+ }
115
+ }
33
+
116
+
34
+ vsz = vec_full_reg_size(s);
117
+ /* Sum XZR+zad to find ZAd. */
35
+ desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
118
+ za = get_tile_rowcol(s, esz, 31, a->zad, false);
36
+ t_zd = tcg_temp_new_ptr();
119
+ zn = vec_full_reg_ptr(s, a->zn);
37
120
+ zm = vec_full_reg_ptr(s, a->zm);
38
tcg_gen_addi_ptr(t_zd, cpu_env, vec_full_reg_offset(s, rd));
121
+ pn = pred_full_reg_ptr(s, a->pn);
39
if (esz == 3) {
122
+ pm = pred_full_reg_ptr(s, a->pm);
40
@@ -XXX,XX +XXX,XX @@ static void do_index(DisasContext *s, int esz, int rd,
123
+
41
tcg_temp_free_i32(i32);
124
+ fn(za, zn, zm, pn, pm, tcg_constant_i32(desc));
42
}
125
+
43
tcg_temp_free_ptr(t_zd);
126
+ tcg_temp_free_ptr(za);
127
+ tcg_temp_free_ptr(zn);
128
+ tcg_temp_free_ptr(pn);
129
+ tcg_temp_free_ptr(pm);
44
+ return true;
130
+ return true;
45
}
131
+}
46
132
+
47
static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
133
static bool do_outprod_fpst(DisasContext *s, arg_op *a, MemOp esz,
134
gen_helper_gvec_5_ptr *fn)
48
{
135
{
49
- if (sve_access_check(s)) {
136
@@ -XXX,XX +XXX,XX @@ static bool do_outprod_fpst(DisasContext *s, arg_op *a, MemOp esz,
50
- TCGv_i64 start = tcg_constant_i64(a->imm1);
137
51
- TCGv_i64 incr = tcg_constant_i64(a->imm2);
138
TRANS_FEAT(FMOPA_s, aa64_sme, do_outprod_fpst, a, MO_32, gen_helper_sme_fmopa_s)
52
- do_index(s, a->esz, a->rd, start, incr);
139
TRANS_FEAT(FMOPA_d, aa64_sme_f64f64, do_outprod_fpst, a, MO_64, gen_helper_sme_fmopa_d)
53
- }
140
+
54
- return true;
141
+/* TODO: FEAT_EBF16 */
55
+ TCGv_i64 start = tcg_constant_i64(a->imm1);
142
+TRANS_FEAT(BFMOPA, aa64_sme, do_outprod, a, MO_32, gen_helper_sme_bfmopa)
56
+ TCGv_i64 incr = tcg_constant_i64(a->imm2);
57
+ return do_index(s, a->esz, a->rd, start, incr);
58
}
59
60
static bool trans_INDEX_ir(DisasContext *s, arg_INDEX_ir *a)
61
{
62
- if (sve_access_check(s)) {
63
- TCGv_i64 start = tcg_constant_i64(a->imm);
64
- TCGv_i64 incr = cpu_reg(s, a->rm);
65
- do_index(s, a->esz, a->rd, start, incr);
66
- }
67
- return true;
68
+ TCGv_i64 start = tcg_constant_i64(a->imm);
69
+ TCGv_i64 incr = cpu_reg(s, a->rm);
70
+ return do_index(s, a->esz, a->rd, start, incr);
71
}
72
73
static bool trans_INDEX_ri(DisasContext *s, arg_INDEX_ri *a)
74
{
75
- if (sve_access_check(s)) {
76
- TCGv_i64 start = cpu_reg(s, a->rn);
77
- TCGv_i64 incr = tcg_constant_i64(a->imm);
78
- do_index(s, a->esz, a->rd, start, incr);
79
- }
80
- return true;
81
+ TCGv_i64 start = cpu_reg(s, a->rn);
82
+ TCGv_i64 incr = tcg_constant_i64(a->imm);
83
+ return do_index(s, a->esz, a->rd, start, incr);
84
}
85
86
static bool trans_INDEX_rr(DisasContext *s, arg_INDEX_rr *a)
87
{
88
- if (sve_access_check(s)) {
89
- TCGv_i64 start = cpu_reg(s, a->rn);
90
- TCGv_i64 incr = cpu_reg(s, a->rm);
91
- do_index(s, a->esz, a->rd, start, incr);
92
- }
93
- return true;
94
+ TCGv_i64 start = cpu_reg(s, a->rn);
95
+ TCGv_i64 incr = cpu_reg(s, a->rm);
96
+ return do_index(s, a->esz, a->rd, start, incr);
97
}
98
99
/*
100
--
143
--
101
2.25.1
144
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-96-richard.henderson@linaro.org
4
Message-id: 20220708151540.18136-27-richard.henderson@linaro.org
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
target/arm/translate-sve.c | 53 ++++++++++----------------------------
8
target/arm/helper-sme.h | 2 ++
9
1 file changed, 14 insertions(+), 39 deletions(-)
9
target/arm/sme.decode | 1 +
10
target/arm/sme_helper.c | 74 ++++++++++++++++++++++++++++++++++++++
11
target/arm/translate-sme.c | 1 +
12
4 files changed, 78 insertions(+)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/helper-sme.h b/target/arm/helper-sme.h
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/target/arm/helper-sme.h
14
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/helper-sme.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a,
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(sme_addva_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
19
DEF_HELPER_FLAGS_5(sme_addha_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
20
DEF_HELPER_FLAGS_5(sme_addva_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
21
22
+DEF_HELPER_FLAGS_7(sme_fmopa_h, TCG_CALL_NO_RWG,
23
+ void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
24
DEF_HELPER_FLAGS_7(sme_fmopa_s, TCG_CALL_NO_RWG,
25
void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
26
DEF_HELPER_FLAGS_7(sme_fmopa_d, TCG_CALL_NO_RWG,
27
diff --git a/target/arm/sme.decode b/target/arm/sme.decode
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/sme.decode
30
+++ b/target/arm/sme.decode
31
@@ -XXX,XX +XXX,XX @@ FMOPA_s 10000000 100 ..... ... ... ..... . 00 .. @op_32
32
FMOPA_d 10000000 110 ..... ... ... ..... . 0 ... @op_64
33
34
BFMOPA 10000001 100 ..... ... ... ..... . 00 .. @op_32
35
+FMOPA_h 10000001 101 ..... ... ... ..... . 00 .. @op_32
36
diff --git a/target/arm/sme_helper.c b/target/arm/sme_helper.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/sme_helper.c
39
+++ b/target/arm/sme_helper.c
40
@@ -XXX,XX +XXX,XX @@ static inline uint32_t f16mop_adj_pair(uint32_t pair, uint32_t pg, uint32_t neg)
41
return pair;
42
}
43
44
+static float32 f16_dotadd(float32 sum, uint32_t e1, uint32_t e2,
45
+ float_status *s_std, float_status *s_odd)
46
+{
47
+ float64 e1r = float16_to_float64(e1 & 0xffff, true, s_std);
48
+ float64 e1c = float16_to_float64(e1 >> 16, true, s_std);
49
+ float64 e2r = float16_to_float64(e2 & 0xffff, true, s_std);
50
+ float64 e2c = float16_to_float64(e2 >> 16, true, s_std);
51
+ float64 t64;
52
+ float32 t32;
53
+
54
+ /*
55
+ * The ARM pseudocode function FPDot performs both multiplies
56
+ * and the add with a single rounding operation. Emulate this
57
+ * by performing the first multiply in round-to-odd, then doing
58
+ * the second multiply as fused multiply-add, and rounding to
59
+ * float32 all in one step.
60
+ */
61
+ t64 = float64_mul(e1r, e2r, s_odd);
62
+ t64 = float64r32_muladd(e1c, e2c, t64, 0, s_std);
63
+
64
+ /* This conversion is exact, because we've already rounded. */
65
+ t32 = float64_to_float32(t64, s_std);
66
+
67
+ /* The final accumulation step is not fused. */
68
+ return float32_add(sum, t32, s_std);
69
+}
70
+
71
+void HELPER(sme_fmopa_h)(void *vza, void *vzn, void *vzm, void *vpn,
72
+ void *vpm, void *vst, uint32_t desc)
73
+{
74
+ intptr_t row, col, oprsz = simd_maxsz(desc);
75
+ uint32_t neg = simd_data(desc) * 0x80008000u;
76
+ uint16_t *pn = vpn, *pm = vpm;
77
+ float_status fpst_odd, fpst_std;
78
+
79
+ /*
80
+ * Make a copy of float_status because this operation does not
81
+ * update the cumulative fp exception status. It also produces
82
+ * default nans. Make a second copy with round-to-odd -- see above.
83
+ */
84
+ fpst_std = *(float_status *)vst;
85
+ set_default_nan_mode(true, &fpst_std);
86
+ fpst_odd = fpst_std;
87
+ set_float_rounding_mode(float_round_to_odd, &fpst_odd);
88
+
89
+ for (row = 0; row < oprsz; ) {
90
+ uint16_t prow = pn[H2(row >> 4)];
91
+ do {
92
+ void *vza_row = vza + tile_vslice_offset(row);
93
+ uint32_t n = *(uint32_t *)(vzn + H1_4(row));
94
+
95
+ n = f16mop_adj_pair(n, prow, neg);
96
+
97
+ for (col = 0; col < oprsz; ) {
98
+ uint16_t pcol = pm[H2(col >> 4)];
99
+ do {
100
+ if (prow & pcol & 0b0101) {
101
+ uint32_t *a = vza_row + H1_4(col);
102
+ uint32_t m = *(uint32_t *)(vzm + H1_4(col));
103
+
104
+ m = f16mop_adj_pair(m, pcol, 0);
105
+ *a = f16_dotadd(*a, n, m, &fpst_std, &fpst_odd);
106
+
107
+ col += 4;
108
+ pcol >>= 4;
109
+ }
110
+ } while (col & 15);
111
+ }
112
+ row += 4;
113
+ prow >>= 4;
114
+ } while (row & 15);
115
+ }
116
+}
117
+
118
void HELPER(sme_bfmopa)(void *vza, void *vzn, void *vzm, void *vpn,
119
void *vpm, uint32_t desc)
120
{
121
diff --git a/target/arm/translate-sme.c b/target/arm/translate-sme.c
122
index XXXXXXX..XXXXXXX 100644
123
--- a/target/arm/translate-sme.c
124
+++ b/target/arm/translate-sme.c
125
@@ -XXX,XX +XXX,XX @@ static bool do_outprod_fpst(DisasContext *s, arg_op *a, MemOp esz,
16
return true;
126
return true;
17
}
127
}
18
128
19
-static bool trans_FRINTN(DisasContext *s, arg_rpr_esz *a)
129
+TRANS_FEAT(FMOPA_h, aa64_sme, do_outprod_fpst, a, MO_32, gen_helper_sme_fmopa_h)
20
-{
130
TRANS_FEAT(FMOPA_s, aa64_sme, do_outprod_fpst, a, MO_32, gen_helper_sme_fmopa_s)
21
- return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz]);
131
TRANS_FEAT(FMOPA_d, aa64_sme_f64f64, do_outprod_fpst, a, MO_64, gen_helper_sme_fmopa_d)
22
-}
132
23
-
24
-static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
25
-{
26
- return do_frint_mode(s, a, float_round_up, frint_fns[a->esz]);
27
-}
28
-
29
-static bool trans_FRINTM(DisasContext *s, arg_rpr_esz *a)
30
-{
31
- return do_frint_mode(s, a, float_round_down, frint_fns[a->esz]);
32
-}
33
-
34
-static bool trans_FRINTZ(DisasContext *s, arg_rpr_esz *a)
35
-{
36
- return do_frint_mode(s, a, float_round_to_zero, frint_fns[a->esz]);
37
-}
38
-
39
-static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
40
-{
41
- return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz]);
42
-}
43
+TRANS_FEAT(FRINTN, aa64_sve, do_frint_mode, a,
44
+ float_round_nearest_even, frint_fns[a->esz])
45
+TRANS_FEAT(FRINTP, aa64_sve, do_frint_mode, a,
46
+ float_round_up, frint_fns[a->esz])
47
+TRANS_FEAT(FRINTM, aa64_sve, do_frint_mode, a,
48
+ float_round_down, frint_fns[a->esz])
49
+TRANS_FEAT(FRINTZ, aa64_sve, do_frint_mode, a,
50
+ float_round_to_zero, frint_fns[a->esz])
51
+TRANS_FEAT(FRINTA, aa64_sve, do_frint_mode, a,
52
+ float_round_ties_away, frint_fns[a->esz])
53
54
static gen_helper_gvec_3_ptr * const frecpx_fns[] = {
55
NULL, gen_helper_sve_frecpx_h,
56
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FCVTLT_hs, aa64_sve2, gen_gvec_fpst_arg_zpz,
57
TRANS_FEAT(FCVTLT_sd, aa64_sve2, gen_gvec_fpst_arg_zpz,
58
gen_helper_sve2_fcvtlt_sd, a, 0, FPST_FPCR)
59
60
-static bool trans_FCVTX_ds(DisasContext *s, arg_rpr_esz *a)
61
-{
62
- if (!dc_isar_feature(aa64_sve2, s)) {
63
- return false;
64
- }
65
- return do_frint_mode(s, a, float_round_to_odd, gen_helper_sve_fcvt_ds);
66
-}
67
-
68
-static bool trans_FCVTXNT_ds(DisasContext *s, arg_rpr_esz *a)
69
-{
70
- if (!dc_isar_feature(aa64_sve2, s)) {
71
- return false;
72
- }
73
- return do_frint_mode(s, a, float_round_to_odd, gen_helper_sve2_fcvtnt_ds);
74
-}
75
+TRANS_FEAT(FCVTX_ds, aa64_sve2, do_frint_mode, a,
76
+ float_round_to_odd, gen_helper_sve_fcvt_ds)
77
+TRANS_FEAT(FCVTXNT_ds, aa64_sve2, do_frint_mode, a,
78
+ float_round_to_odd, gen_helper_sve2_fcvtnt_ds)
79
80
static bool trans_FLOGB(DisasContext *s, arg_rpr_esz *a)
81
{
82
--
133
--
83
2.25.1
134
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Rename the function to match gen_gvec_ool_arg_zzzz,
3
This is SMOPA, SUMOPA, USMOPA_s, UMOPA, for both Int8 and Int16.
4
and move to be adjacent.
5
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-14-richard.henderson@linaro.org
7
Message-id: 20220708151540.18136-28-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
9
---
11
target/arm/translate-sve.c | 18 +++++++++---------
10
target/arm/helper-sme.h | 16 ++++++++
12
1 file changed, 9 insertions(+), 9 deletions(-)
11
target/arm/sme.decode | 10 +++++
12
target/arm/sme_helper.c | 82 ++++++++++++++++++++++++++++++++++++++
13
target/arm/translate-sme.c | 10 +++++
14
4 files changed, 118 insertions(+)
13
15
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/helper-sme.h b/target/arm/helper-sme.h
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
18
--- a/target/arm/helper-sme.h
17
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/helper-sme.h
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
20
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_7(sme_fmopa_d, TCG_CALL_NO_RWG,
19
return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
21
void, ptr, ptr, ptr, ptr, ptr, ptr, i32)
22
DEF_HELPER_FLAGS_6(sme_bfmopa, TCG_CALL_NO_RWG,
23
void, ptr, ptr, ptr, ptr, ptr, i32)
24
+DEF_HELPER_FLAGS_6(sme_smopa_s, TCG_CALL_NO_RWG,
25
+ void, ptr, ptr, ptr, ptr, ptr, i32)
26
+DEF_HELPER_FLAGS_6(sme_umopa_s, TCG_CALL_NO_RWG,
27
+ void, ptr, ptr, ptr, ptr, ptr, i32)
28
+DEF_HELPER_FLAGS_6(sme_sumopa_s, TCG_CALL_NO_RWG,
29
+ void, ptr, ptr, ptr, ptr, ptr, i32)
30
+DEF_HELPER_FLAGS_6(sme_usmopa_s, TCG_CALL_NO_RWG,
31
+ void, ptr, ptr, ptr, ptr, ptr, i32)
32
+DEF_HELPER_FLAGS_6(sme_smopa_d, TCG_CALL_NO_RWG,
33
+ void, ptr, ptr, ptr, ptr, ptr, i32)
34
+DEF_HELPER_FLAGS_6(sme_umopa_d, TCG_CALL_NO_RWG,
35
+ void, ptr, ptr, ptr, ptr, ptr, i32)
36
+DEF_HELPER_FLAGS_6(sme_sumopa_d, TCG_CALL_NO_RWG,
37
+ void, ptr, ptr, ptr, ptr, ptr, i32)
38
+DEF_HELPER_FLAGS_6(sme_usmopa_d, TCG_CALL_NO_RWG,
39
+ void, ptr, ptr, ptr, ptr, ptr, i32)
40
diff --git a/target/arm/sme.decode b/target/arm/sme.decode
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/sme.decode
43
+++ b/target/arm/sme.decode
44
@@ -XXX,XX +XXX,XX @@ FMOPA_d 10000000 110 ..... ... ... ..... . 0 ... @op_64
45
46
BFMOPA 10000001 100 ..... ... ... ..... . 00 .. @op_32
47
FMOPA_h 10000001 101 ..... ... ... ..... . 00 .. @op_32
48
+
49
+SMOPA_s 1010000 0 10 0 ..... ... ... ..... . 00 .. @op_32
50
+SUMOPA_s 1010000 0 10 1 ..... ... ... ..... . 00 .. @op_32
51
+USMOPA_s 1010000 1 10 0 ..... ... ... ..... . 00 .. @op_32
52
+UMOPA_s 1010000 1 10 1 ..... ... ... ..... . 00 .. @op_32
53
+
54
+SMOPA_d 1010000 0 11 0 ..... ... ... ..... . 0 ... @op_64
55
+SUMOPA_d 1010000 0 11 1 ..... ... ... ..... . 0 ... @op_64
56
+USMOPA_d 1010000 1 11 0 ..... ... ... ..... . 0 ... @op_64
57
+UMOPA_d 1010000 1 11 1 ..... ... ... ..... . 0 ... @op_64
58
diff --git a/target/arm/sme_helper.c b/target/arm/sme_helper.c
59
index XXXXXXX..XXXXXXX 100644
60
--- a/target/arm/sme_helper.c
61
+++ b/target/arm/sme_helper.c
62
@@ -XXX,XX +XXX,XX @@ void HELPER(sme_bfmopa)(void *vza, void *vzn, void *vzm, void *vpn,
63
} while (row & 15);
64
}
20
}
65
}
21
66
+
22
+static bool gen_gvec_ool_arg_zzxz(DisasContext *s, gen_helper_gvec_4 *fn,
67
+typedef uint64_t IMOPFn(uint64_t, uint64_t, uint64_t, uint8_t, bool);
23
+ arg_rrxr_esz *a)
68
+
69
+static inline void do_imopa(uint64_t *za, uint64_t *zn, uint64_t *zm,
70
+ uint8_t *pn, uint8_t *pm,
71
+ uint32_t desc, IMOPFn *fn)
24
+{
72
+{
25
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
73
+ intptr_t row, col, oprsz = simd_oprsz(desc) / 8;
74
+ bool neg = simd_data(desc);
75
+
76
+ for (row = 0; row < oprsz; ++row) {
77
+ uint8_t pa = pn[H1(row)];
78
+ uint64_t *za_row = &za[tile_vslice_index(row)];
79
+ uint64_t n = zn[row];
80
+
81
+ for (col = 0; col < oprsz; ++col) {
82
+ uint8_t pb = pm[H1(col)];
83
+ uint64_t *a = &za_row[col];
84
+
85
+ *a = fn(n, zm[col], *a, pa & pb, neg);
86
+ }
87
+ }
26
+}
88
+}
27
+
89
+
28
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
90
+#define DEF_IMOP_32(NAME, NTYPE, MTYPE) \
29
static void gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
91
+static uint64_t NAME(uint64_t n, uint64_t m, uint64_t a, uint8_t p, bool neg) \
30
int rd, int rn, int pg, int data)
92
+{ \
31
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(DOT_zzzz, aa64_sve, gen_gvec_ool_zzzz,
93
+ uint32_t sum0 = 0, sum1 = 0; \
32
* SVE Multiply - Indexed
94
+ /* Apply P to N as a mask, making the inactive elements 0. */ \
33
*/
95
+ n &= expand_pred_b(p); \
34
96
+ sum0 += (NTYPE)(n >> 0) * (MTYPE)(m >> 0); \
35
-static bool do_zzxz_ool(DisasContext *s, arg_rrxr_esz *a,
97
+ sum0 += (NTYPE)(n >> 8) * (MTYPE)(m >> 8); \
36
- gen_helper_gvec_4 *fn)
98
+ sum0 += (NTYPE)(n >> 16) * (MTYPE)(m >> 16); \
37
-{
99
+ sum0 += (NTYPE)(n >> 24) * (MTYPE)(m >> 24); \
38
- return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
100
+ sum1 += (NTYPE)(n >> 32) * (MTYPE)(m >> 32); \
39
-}
101
+ sum1 += (NTYPE)(n >> 40) * (MTYPE)(m >> 40); \
40
-
102
+ sum1 += (NTYPE)(n >> 48) * (MTYPE)(m >> 48); \
41
#define DO_RRXR(NAME, FUNC) \
103
+ sum1 += (NTYPE)(n >> 56) * (MTYPE)(m >> 56); \
42
static bool NAME(DisasContext *s, arg_rrxr_esz *a) \
104
+ if (neg) { \
43
- { return do_zzxz_ool(s, a, FUNC); }
105
+ sum0 = (uint32_t)a - sum0, sum1 = (uint32_t)(a >> 32) - sum1; \
44
+ { return gen_gvec_ool_arg_zzxz(s, FUNC, a); }
106
+ } else { \
45
107
+ sum0 = (uint32_t)a + sum0, sum1 = (uint32_t)(a >> 32) + sum1; \
46
DO_RRXR(trans_SDOT_zzxw_s, gen_helper_gvec_sdot_idx_b)
108
+ } \
47
DO_RRXR(trans_SDOT_zzxw_d, gen_helper_gvec_sdot_idx_h)
109
+ return ((uint64_t)sum1 << 32) | sum0; \
48
@@ -XXX,XX +XXX,XX @@ static bool trans_SUDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
110
+}
49
if (!dc_isar_feature(aa64_sve_i8mm, s)) {
111
+
50
return false;
112
+#define DEF_IMOP_64(NAME, NTYPE, MTYPE) \
51
}
113
+static uint64_t NAME(uint64_t n, uint64_t m, uint64_t a, uint8_t p, bool neg) \
52
- return do_zzxz_ool(s, a, gen_helper_gvec_sudot_idx_b);
114
+{ \
53
+ return gen_gvec_ool_arg_zzxz(s, gen_helper_gvec_sudot_idx_b, a);
115
+ uint64_t sum = 0; \
54
}
116
+ /* Apply P to N as a mask, making the inactive elements 0. */ \
55
117
+ n &= expand_pred_h(p); \
56
static bool trans_USDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
118
+ sum += (NTYPE)(n >> 0) * (MTYPE)(m >> 0); \
57
@@ -XXX,XX +XXX,XX @@ static bool trans_USDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
119
+ sum += (NTYPE)(n >> 16) * (MTYPE)(m >> 16); \
58
if (!dc_isar_feature(aa64_sve_i8mm, s)) {
120
+ sum += (NTYPE)(n >> 32) * (MTYPE)(m >> 32); \
59
return false;
121
+ sum += (NTYPE)(n >> 48) * (MTYPE)(m >> 48); \
60
}
122
+ return neg ? a - sum : a + sum; \
61
- return do_zzxz_ool(s, a, gen_helper_gvec_usdot_idx_b);
123
+}
62
+ return gen_gvec_ool_arg_zzxz(s, gen_helper_gvec_usdot_idx_b, a);
124
+
63
}
125
+DEF_IMOP_32(smopa_s, int8_t, int8_t)
64
126
+DEF_IMOP_32(umopa_s, uint8_t, uint8_t)
65
#undef DO_RRXR
127
+DEF_IMOP_32(sumopa_s, int8_t, uint8_t)
128
+DEF_IMOP_32(usmopa_s, uint8_t, int8_t)
129
+
130
+DEF_IMOP_64(smopa_d, int16_t, int16_t)
131
+DEF_IMOP_64(umopa_d, uint16_t, uint16_t)
132
+DEF_IMOP_64(sumopa_d, int16_t, uint16_t)
133
+DEF_IMOP_64(usmopa_d, uint16_t, int16_t)
134
+
135
+#define DEF_IMOPH(NAME) \
136
+ void HELPER(sme_##NAME)(void *vza, void *vzn, void *vzm, void *vpn, \
137
+ void *vpm, uint32_t desc) \
138
+ { do_imopa(vza, vzn, vzm, vpn, vpm, desc, NAME); }
139
+
140
+DEF_IMOPH(smopa_s)
141
+DEF_IMOPH(umopa_s)
142
+DEF_IMOPH(sumopa_s)
143
+DEF_IMOPH(usmopa_s)
144
+DEF_IMOPH(smopa_d)
145
+DEF_IMOPH(umopa_d)
146
+DEF_IMOPH(sumopa_d)
147
+DEF_IMOPH(usmopa_d)
148
diff --git a/target/arm/translate-sme.c b/target/arm/translate-sme.c
149
index XXXXXXX..XXXXXXX 100644
150
--- a/target/arm/translate-sme.c
151
+++ b/target/arm/translate-sme.c
152
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FMOPA_d, aa64_sme_f64f64, do_outprod_fpst, a, MO_64, gen_helper_sme_f
153
154
/* TODO: FEAT_EBF16 */
155
TRANS_FEAT(BFMOPA, aa64_sme, do_outprod, a, MO_32, gen_helper_sme_bfmopa)
156
+
157
+TRANS_FEAT(SMOPA_s, aa64_sme, do_outprod, a, MO_32, gen_helper_sme_smopa_s)
158
+TRANS_FEAT(UMOPA_s, aa64_sme, do_outprod, a, MO_32, gen_helper_sme_umopa_s)
159
+TRANS_FEAT(SUMOPA_s, aa64_sme, do_outprod, a, MO_32, gen_helper_sme_sumopa_s)
160
+TRANS_FEAT(USMOPA_s, aa64_sme, do_outprod, a, MO_32, gen_helper_sme_usmopa_s)
161
+
162
+TRANS_FEAT(SMOPA_d, aa64_sme_i16i64, do_outprod, a, MO_64, gen_helper_sme_smopa_d)
163
+TRANS_FEAT(UMOPA_d, aa64_sme_i16i64, do_outprod, a, MO_64, gen_helper_sme_umopa_d)
164
+TRANS_FEAT(SUMOPA_d, aa64_sme_i16i64, do_outprod, a, MO_64, gen_helper_sme_sumopa_d)
165
+TRANS_FEAT(USMOPA_d, aa64_sme_i16i64, do_outprod, a, MO_64, gen_helper_sme_usmopa_d)
66
--
166
--
67
2.25.1
167
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Remove the unparsed extractions in trans_CPY_{m,z}_i which are intended
3
This is an SVE instruction that operates using the SVE vector
4
to reject an 8-bit shift of an 8-bit constant for 8-bit element.
4
length but that it is present only if SME is implemented.
5
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-74-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-29-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/sve.decode | 10 ++++++++--
11
target/arm/sve.decode | 20 +++++++++++++
12
target/arm/translate-sve.c | 6 ------
12
target/arm/translate-sve.c | 57 ++++++++++++++++++++++++++++++++++++++
13
2 files changed, 8 insertions(+), 8 deletions(-)
13
2 files changed, 77 insertions(+)
14
14
15
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
15
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sve.decode
17
--- a/target/arm/sve.decode
18
+++ b/target/arm/sve.decode
18
+++ b/target/arm/sve.decode
19
@@ -XXX,XX +XXX,XX @@ DUPM 00000101 11 0000 dbm:13 rd:5
19
@@ -XXX,XX +XXX,XX @@ BFMLALT_zzxw 01100100 11 1 ..... 0100.1 ..... ..... @rrxr_3a esz=2
20
FCPY 00000101 .. 01 .... 110 imm:8 ..... @rdn_pg4
20
21
21
### SVE2 floating-point bfloat16 dot-product (indexed)
22
# SVE copy integer immediate (predicated)
22
BFDOT_zzxz 01100100 01 1 ..... 010000 ..... ..... @rrxr_2 esz=2
23
-CPY_m_i 00000101 .. 01 .... 01 . ........ ..... @rdn_pg4 imm=%sh8_i8s
23
+
24
-CPY_z_i 00000101 .. 01 .... 00 . ........ ..... @rdn_pg4 imm=%sh8_i8s
24
+### SVE broadcast predicate element
25
+{
25
+
26
+ INVALID 00000101 00 01 ---- 01 1 -------- -----
26
+&psel esz pd pn pm rv imm
27
+ CPY_m_i 00000101 .. 01 .... 01 . ........ ..... @rdn_pg4 imm=%sh8_i8s
27
+%psel_rv 16:2 !function=plus_12
28
+}
28
+%psel_imm_b 22:2 19:2
29
+{
29
+%psel_imm_h 22:2 20:1
30
+ INVALID 00000101 00 01 ---- 00 1 -------- -----
30
+%psel_imm_s 22:2
31
+ CPY_z_i 00000101 .. 01 .... 00 . ........ ..... @rdn_pg4 imm=%sh8_i8s
31
+%psel_imm_d 23:1
32
+}
32
+@psel ........ .. . ... .. .. pn:4 . pm:4 . pd:4 \
33
33
+ &psel rv=%psel_rv
34
### SVE Permute - Extract Group
34
+
35
35
+PSEL 00100101 .. 1 ..1 .. 01 .... 0 .... 0 .... \
36
+ @psel esz=0 imm=%psel_imm_b
37
+PSEL 00100101 .. 1 .10 .. 01 .... 0 .... 0 .... \
38
+ @psel esz=1 imm=%psel_imm_h
39
+PSEL 00100101 .. 1 100 .. 01 .... 0 .... 0 .... \
40
+ @psel esz=2 imm=%psel_imm_s
41
+PSEL 00100101 .1 1 000 .. 01 .... 0 .... 0 .... \
42
+ @psel esz=3 imm=%psel_imm_d
36
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
43
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
37
index XXXXXXX..XXXXXXX 100644
44
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/translate-sve.c
45
--- a/target/arm/translate-sve.c
39
+++ b/target/arm/translate-sve.c
46
+++ b/target/arm/translate-sve.c
40
@@ -XXX,XX +XXX,XX @@ static bool trans_FCPY(DisasContext *s, arg_FCPY *a)
47
@@ -XXX,XX +XXX,XX @@ static bool do_BFMLAL_zzxw(DisasContext *s, arg_rrxr_esz *a, bool sel)
41
48
42
static bool trans_CPY_m_i(DisasContext *s, arg_rpri_esz *a)
49
TRANS_FEAT(BFMLALB_zzxw, aa64_sve_bf16, do_BFMLAL_zzxw, a, false)
43
{
50
TRANS_FEAT(BFMLALT_zzxw, aa64_sve_bf16, do_BFMLAL_zzxw, a, true)
44
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
51
+
45
- return false;
52
+static bool trans_PSEL(DisasContext *s, arg_psel *a)
46
- }
53
+{
47
if (sve_access_check(s)) {
54
+ int vl = vec_full_reg_size(s);
48
do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, tcg_constant_i64(a->imm));
55
+ int pl = pred_gvec_reg_size(s);
49
}
56
+ int elements = vl >> a->esz;
50
@@ -XXX,XX +XXX,XX @@ static bool trans_CPY_z_i(DisasContext *s, arg_CPY_z_i *a)
57
+ TCGv_i64 tmp, didx, dbit;
51
gen_helper_sve_cpy_z_s, gen_helper_sve_cpy_z_d,
58
+ TCGv_ptr ptr;
52
};
59
+
53
60
+ if (!dc_isar_feature(aa64_sme, s)) {
54
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
61
+ return false;
55
- return false;
62
+ }
56
- }
63
+ if (!sve_access_check(s)) {
57
if (sve_access_check(s)) {
64
+ return true;
58
unsigned vsz = vec_full_reg_size(s);
65
+ }
59
tcg_gen_gvec_2i_ool(vec_full_reg_offset(s, a->rd),
66
+
67
+ tmp = tcg_temp_new_i64();
68
+ dbit = tcg_temp_new_i64();
69
+ didx = tcg_temp_new_i64();
70
+ ptr = tcg_temp_new_ptr();
71
+
72
+ /* Compute the predicate element. */
73
+ tcg_gen_addi_i64(tmp, cpu_reg(s, a->rv), a->imm);
74
+ if (is_power_of_2(elements)) {
75
+ tcg_gen_andi_i64(tmp, tmp, elements - 1);
76
+ } else {
77
+ tcg_gen_remu_i64(tmp, tmp, tcg_constant_i64(elements));
78
+ }
79
+
80
+ /* Extract the predicate byte and bit indices. */
81
+ tcg_gen_shli_i64(tmp, tmp, a->esz);
82
+ tcg_gen_andi_i64(dbit, tmp, 7);
83
+ tcg_gen_shri_i64(didx, tmp, 3);
84
+ if (HOST_BIG_ENDIAN) {
85
+ tcg_gen_xori_i64(didx, didx, 7);
86
+ }
87
+
88
+ /* Load the predicate word. */
89
+ tcg_gen_trunc_i64_ptr(ptr, didx);
90
+ tcg_gen_add_ptr(ptr, ptr, cpu_env);
91
+ tcg_gen_ld8u_i64(tmp, ptr, pred_full_reg_offset(s, a->pm));
92
+
93
+ /* Extract the predicate bit and replicate to MO_64. */
94
+ tcg_gen_shr_i64(tmp, tmp, dbit);
95
+ tcg_gen_andi_i64(tmp, tmp, 1);
96
+ tcg_gen_neg_i64(tmp, tmp);
97
+
98
+ /* Apply to either copy the source, or write zeros. */
99
+ tcg_gen_gvec_ands(MO_64, pred_full_reg_offset(s, a->pd),
100
+ pred_full_reg_offset(s, a->pn), tmp, pl, pl);
101
+
102
+ tcg_temp_free_i64(tmp);
103
+ tcg_temp_free_i64(dbit);
104
+ tcg_temp_free_i64(didx);
105
+ tcg_temp_free_ptr(ptr);
106
+ return true;
107
+}
60
--
108
--
61
2.25.1
109
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This is an SVE instruction that operates using the SVE vector
4
length but that it is present only if SME is implemented.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-66-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-30-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/translate-sve.c | 17 ++++-------------
11
target/arm/helper-sve.h | 2 ++
9
1 file changed, 4 insertions(+), 13 deletions(-)
12
target/arm/sve.decode | 1 +
13
target/arm/sve_helper.c | 16 ++++++++++++++++
14
target/arm/translate-sve.c | 2 ++
15
4 files changed, 21 insertions(+)
10
16
17
diff --git a/target/arm/helper-sve.h b/target/arm/helper-sve.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/helper-sve.h
20
+++ b/target/arm/helper-sve.h
21
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(sve_revh_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
22
23
DEF_HELPER_FLAGS_4(sve_revw_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
24
25
+DEF_HELPER_FLAGS_4(sme_revd_q, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
26
+
27
DEF_HELPER_FLAGS_4(sve_rbit_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
28
DEF_HELPER_FLAGS_4(sve_rbit_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
29
DEF_HELPER_FLAGS_4(sve_rbit_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
30
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/sve.decode
33
+++ b/target/arm/sve.decode
34
@@ -XXX,XX +XXX,XX @@ REVB 00000101 .. 1001 00 100 ... ..... ..... @rd_pg_rn
35
REVH 00000101 .. 1001 01 100 ... ..... ..... @rd_pg_rn
36
REVW 00000101 .. 1001 10 100 ... ..... ..... @rd_pg_rn
37
RBIT 00000101 .. 1001 11 100 ... ..... ..... @rd_pg_rn
38
+REVD 00000101 00 1011 10 100 ... ..... ..... @rd_pg_rn_e0
39
40
# SVE vector splice (predicated, destructive)
41
SPLICE 00000101 .. 101 100 100 ... ..... ..... @rdn_pg_rm
42
diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/arm/sve_helper.c
45
+++ b/target/arm/sve_helper.c
46
@@ -XXX,XX +XXX,XX @@ DO_ZPZ_D(sve_revh_d, uint64_t, hswap64)
47
48
DO_ZPZ_D(sve_revw_d, uint64_t, wswap64)
49
50
+void HELPER(sme_revd_q)(void *vd, void *vn, void *vg, uint32_t desc)
51
+{
52
+ intptr_t i, opr_sz = simd_oprsz(desc) / 8;
53
+ uint64_t *d = vd, *n = vn;
54
+ uint8_t *pg = vg;
55
+
56
+ for (i = 0; i < opr_sz; i += 2) {
57
+ if (pg[H1(i)] & 1) {
58
+ uint64_t n0 = n[i + 0];
59
+ uint64_t n1 = n[i + 1];
60
+ d[i + 0] = n1;
61
+ d[i + 1] = n0;
62
+ }
63
+ }
64
+}
65
+
66
DO_ZPZ(sve_rbit_b, uint8_t, H1, revbit8)
67
DO_ZPZ(sve_rbit_h, uint16_t, H1_2, revbit16)
68
DO_ZPZ(sve_rbit_s, uint32_t, H1_4, revbit32)
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
69
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
70
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
71
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
72
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(REVH, aa64_sve, gen_gvec_ool_arg_zpz, revh_fns[a->esz], a, 0)
73
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(REVH, aa64_sve, gen_gvec_ool_arg_zpz, revh_fns[a->esz], a, 0)
16
TRANS_FEAT(REVW, aa64_sve, gen_gvec_ool_arg_zpz,
74
TRANS_FEAT(REVW, aa64_sve, gen_gvec_ool_arg_zpz,
17
a->esz == 3 ? gen_helper_sve_revw_d : NULL, a, 0)
75
a->esz == 3 ? gen_helper_sve_revw_d : NULL, a, 0)
18
76
19
-static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
77
+TRANS_FEAT(REVD, aa64_sme, gen_gvec_ool_arg_zpz, gen_helper_sme_revd_q, a, 0)
20
-{
78
+
21
- return gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
79
TRANS_FEAT(SPLICE, aa64_sve, gen_gvec_ool_arg_zpzz,
22
- a->rd, a->rn, a->rm, a->pg, a->esz);
80
gen_helper_sve_splice, a, a->esz)
23
-}
81
24
+TRANS_FEAT(SPLICE, aa64_sve, gen_gvec_ool_arg_zpzz,
25
+ gen_helper_sve_splice, a, a->esz)
26
27
-static bool trans_SPLICE_sve2(DisasContext *s, arg_rpr_esz *a)
28
-{
29
- if (!dc_isar_feature(aa64_sve2, s)) {
30
- return false;
31
- }
32
- return gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
33
- a->rd, a->rn, (a->rn + 1) % 32, a->pg, a->esz);
34
-}
35
+TRANS_FEAT(SPLICE_sve2, aa64_sve2, gen_gvec_ool_zzzp, gen_helper_sve_splice,
36
+ a->rd, a->rn, (a->rn + 1) % 32, a->pg, a->esz)
37
38
/*
39
*** SVE Integer Compare - Vectors Group
40
--
82
--
41
2.25.1
83
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Remove the unparsed extractions in trans_ADD_zzi, trans_SUBR_zzi,
3
This is an SVE instruction that operates using the SVE vector
4
and do_zzi_sat which are intended to reject an 8-bit shift of an
4
length but that it is present only if SME is implemented.
5
8-bit constant for 8-bit element.
6
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-73-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-31-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
target/arm/sve.decode | 35 ++++++++++++++++++++++++++++-------
11
target/arm/helper.h | 18 +++++++
13
target/arm/translate-sve.c | 9 ---------
12
target/arm/sve.decode | 5 ++
14
2 files changed, 28 insertions(+), 16 deletions(-)
13
target/arm/translate-sve.c | 102 +++++++++++++++++++++++++++++++++++++
14
target/arm/vec_helper.c | 24 +++++++++
15
4 files changed, 149 insertions(+)
15
16
17
diff --git a/target/arm/helper.h b/target/arm/helper.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/target/arm/helper.h
20
+++ b/target/arm/helper.h
21
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_6(gvec_bfmlal, TCG_CALL_NO_RWG,
22
DEF_HELPER_FLAGS_6(gvec_bfmlal_idx, TCG_CALL_NO_RWG,
23
void, ptr, ptr, ptr, ptr, ptr, i32)
24
25
+DEF_HELPER_FLAGS_5(gvec_sclamp_b, TCG_CALL_NO_RWG,
26
+ void, ptr, ptr, ptr, ptr, i32)
27
+DEF_HELPER_FLAGS_5(gvec_sclamp_h, TCG_CALL_NO_RWG,
28
+ void, ptr, ptr, ptr, ptr, i32)
29
+DEF_HELPER_FLAGS_5(gvec_sclamp_s, TCG_CALL_NO_RWG,
30
+ void, ptr, ptr, ptr, ptr, i32)
31
+DEF_HELPER_FLAGS_5(gvec_sclamp_d, TCG_CALL_NO_RWG,
32
+ void, ptr, ptr, ptr, ptr, i32)
33
+
34
+DEF_HELPER_FLAGS_5(gvec_uclamp_b, TCG_CALL_NO_RWG,
35
+ void, ptr, ptr, ptr, ptr, i32)
36
+DEF_HELPER_FLAGS_5(gvec_uclamp_h, TCG_CALL_NO_RWG,
37
+ void, ptr, ptr, ptr, ptr, i32)
38
+DEF_HELPER_FLAGS_5(gvec_uclamp_s, TCG_CALL_NO_RWG,
39
+ void, ptr, ptr, ptr, ptr, i32)
40
+DEF_HELPER_FLAGS_5(gvec_uclamp_d, TCG_CALL_NO_RWG,
41
+ void, ptr, ptr, ptr, ptr, i32)
42
+
43
#ifdef TARGET_AARCH64
44
#include "helper-a64.h"
45
#include "helper-sve.h"
16
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
46
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
17
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/sve.decode
48
--- a/target/arm/sve.decode
19
+++ b/target/arm/sve.decode
49
+++ b/target/arm/sve.decode
20
@@ -XXX,XX +XXX,XX @@ FDUP 00100101 esz:2 111 00 1110 imm:8 rd:5
50
@@ -XXX,XX +XXX,XX @@ PSEL 00100101 .. 1 100 .. 01 .... 0 .... 0 .... \
21
}
51
@psel esz=2 imm=%psel_imm_s
22
52
PSEL 00100101 .1 1 000 .. 01 .... 0 .... 0 .... \
23
# SVE integer add/subtract immediate (unpredicated)
53
@psel esz=3 imm=%psel_imm_d
24
-ADD_zzi 00100101 .. 100 000 11 . ........ ..... @rdn_sh_i8u
54
+
25
-SUB_zzi 00100101 .. 100 001 11 . ........ ..... @rdn_sh_i8u
55
+### SVE clamp
26
-SUBR_zzi 00100101 .. 100 011 11 . ........ ..... @rdn_sh_i8u
56
+
27
-SQADD_zzi 00100101 .. 100 100 11 . ........ ..... @rdn_sh_i8u
57
+SCLAMP 01000100 .. 0 ..... 110000 ..... ..... @rda_rn_rm
28
-UQADD_zzi 00100101 .. 100 101 11 . ........ ..... @rdn_sh_i8u
58
+UCLAMP 01000100 .. 0 ..... 110001 ..... ..... @rda_rn_rm
29
-SQSUB_zzi 00100101 .. 100 110 11 . ........ ..... @rdn_sh_i8u
30
-UQSUB_zzi 00100101 .. 100 111 11 . ........ ..... @rdn_sh_i8u
31
+{
32
+ INVALID 00100101 00 100 000 11 1 -------- -----
33
+ ADD_zzi 00100101 .. 100 000 11 . ........ ..... @rdn_sh_i8u
34
+}
35
+{
36
+ INVALID 00100101 00 100 001 11 1 -------- -----
37
+ SUB_zzi 00100101 .. 100 001 11 . ........ ..... @rdn_sh_i8u
38
+}
39
+{
40
+ INVALID 00100101 00 100 011 11 1 -------- -----
41
+ SUBR_zzi 00100101 .. 100 011 11 . ........ ..... @rdn_sh_i8u
42
+}
43
+{
44
+ INVALID 00100101 00 100 100 11 1 -------- -----
45
+ SQADD_zzi 00100101 .. 100 100 11 . ........ ..... @rdn_sh_i8u
46
+}
47
+{
48
+ INVALID 00100101 00 100 101 11 1 -------- -----
49
+ UQADD_zzi 00100101 .. 100 101 11 . ........ ..... @rdn_sh_i8u
50
+}
51
+{
52
+ INVALID 00100101 00 100 110 11 1 -------- -----
53
+ SQSUB_zzi 00100101 .. 100 110 11 . ........ ..... @rdn_sh_i8u
54
+}
55
+{
56
+ INVALID 00100101 00 100 111 11 1 -------- -----
57
+ UQSUB_zzi 00100101 .. 100 111 11 . ........ ..... @rdn_sh_i8u
58
+}
59
60
# SVE integer min/max immediate (unpredicated)
61
SMAX_zzi 00100101 .. 101 000 110 ........ ..... @rdn_i8s
62
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
59
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
63
index XXXXXXX..XXXXXXX 100644
60
index XXXXXXX..XXXXXXX 100644
64
--- a/target/arm/translate-sve.c
61
--- a/target/arm/translate-sve.c
65
+++ b/target/arm/translate-sve.c
62
+++ b/target/arm/translate-sve.c
66
@@ -XXX,XX +XXX,XX @@ static bool trans_DUP_i(DisasContext *s, arg_DUP_i *a)
63
@@ -XXX,XX +XXX,XX @@ static bool trans_PSEL(DisasContext *s, arg_psel *a)
67
64
tcg_temp_free_ptr(ptr);
68
static bool trans_ADD_zzi(DisasContext *s, arg_rri_esz *a)
65
return true;
69
{
70
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
71
- return false;
72
- }
73
return gen_gvec_fn_arg_zzi(s, tcg_gen_gvec_addi, a);
74
}
66
}
75
67
+
76
@@ -XXX,XX +XXX,XX @@ static bool trans_SUBR_zzi(DisasContext *s, arg_rri_esz *a)
68
+static void gen_sclamp_i32(TCGv_i32 d, TCGv_i32 n, TCGv_i32 m, TCGv_i32 a)
77
.scalar_first = true }
69
+{
78
};
70
+ tcg_gen_smax_i32(d, a, n);
79
71
+ tcg_gen_smin_i32(d, d, m);
80
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
72
+}
81
- return false;
73
+
82
- }
74
+static void gen_sclamp_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 a)
83
if (sve_access_check(s)) {
75
+{
84
unsigned vsz = vec_full_reg_size(s);
76
+ tcg_gen_smax_i64(d, a, n);
85
tcg_gen_gvec_2s(vec_full_reg_offset(s, a->rd),
77
+ tcg_gen_smin_i64(d, d, m);
86
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(MUL_zzi, aa64_sve, gen_gvec_fn_arg_zzi, tcg_gen_gvec_muli, a)
78
+}
87
79
+
88
static bool do_zzi_sat(DisasContext *s, arg_rri_esz *a, bool u, bool d)
80
+static void gen_sclamp_vec(unsigned vece, TCGv_vec d, TCGv_vec n,
89
{
81
+ TCGv_vec m, TCGv_vec a)
90
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
82
+{
91
- return false;
83
+ tcg_gen_smax_vec(vece, d, a, n);
92
- }
84
+ tcg_gen_smin_vec(vece, d, d, m);
93
if (sve_access_check(s)) {
85
+}
94
do_sat_addsub_vec(s, a->esz, a->rd, a->rn,
86
+
95
tcg_constant_i64(a->imm), u, d);
87
+static void gen_sclamp(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
88
+ uint32_t a, uint32_t oprsz, uint32_t maxsz)
89
+{
90
+ static const TCGOpcode vecop[] = {
91
+ INDEX_op_smin_vec, INDEX_op_smax_vec, 0
92
+ };
93
+ static const GVecGen4 ops[4] = {
94
+ { .fniv = gen_sclamp_vec,
95
+ .fno = gen_helper_gvec_sclamp_b,
96
+ .opt_opc = vecop,
97
+ .vece = MO_8 },
98
+ { .fniv = gen_sclamp_vec,
99
+ .fno = gen_helper_gvec_sclamp_h,
100
+ .opt_opc = vecop,
101
+ .vece = MO_16 },
102
+ { .fni4 = gen_sclamp_i32,
103
+ .fniv = gen_sclamp_vec,
104
+ .fno = gen_helper_gvec_sclamp_s,
105
+ .opt_opc = vecop,
106
+ .vece = MO_32 },
107
+ { .fni8 = gen_sclamp_i64,
108
+ .fniv = gen_sclamp_vec,
109
+ .fno = gen_helper_gvec_sclamp_d,
110
+ .opt_opc = vecop,
111
+ .vece = MO_64,
112
+ .prefer_i64 = TCG_TARGET_REG_BITS == 64 }
113
+ };
114
+ tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &ops[vece]);
115
+}
116
+
117
+TRANS_FEAT(SCLAMP, aa64_sme, gen_gvec_fn_arg_zzzz, gen_sclamp, a)
118
+
119
+static void gen_uclamp_i32(TCGv_i32 d, TCGv_i32 n, TCGv_i32 m, TCGv_i32 a)
120
+{
121
+ tcg_gen_umax_i32(d, a, n);
122
+ tcg_gen_umin_i32(d, d, m);
123
+}
124
+
125
+static void gen_uclamp_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 a)
126
+{
127
+ tcg_gen_umax_i64(d, a, n);
128
+ tcg_gen_umin_i64(d, d, m);
129
+}
130
+
131
+static void gen_uclamp_vec(unsigned vece, TCGv_vec d, TCGv_vec n,
132
+ TCGv_vec m, TCGv_vec a)
133
+{
134
+ tcg_gen_umax_vec(vece, d, a, n);
135
+ tcg_gen_umin_vec(vece, d, d, m);
136
+}
137
+
138
+static void gen_uclamp(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
139
+ uint32_t a, uint32_t oprsz, uint32_t maxsz)
140
+{
141
+ static const TCGOpcode vecop[] = {
142
+ INDEX_op_umin_vec, INDEX_op_umax_vec, 0
143
+ };
144
+ static const GVecGen4 ops[4] = {
145
+ { .fniv = gen_uclamp_vec,
146
+ .fno = gen_helper_gvec_uclamp_b,
147
+ .opt_opc = vecop,
148
+ .vece = MO_8 },
149
+ { .fniv = gen_uclamp_vec,
150
+ .fno = gen_helper_gvec_uclamp_h,
151
+ .opt_opc = vecop,
152
+ .vece = MO_16 },
153
+ { .fni4 = gen_uclamp_i32,
154
+ .fniv = gen_uclamp_vec,
155
+ .fno = gen_helper_gvec_uclamp_s,
156
+ .opt_opc = vecop,
157
+ .vece = MO_32 },
158
+ { .fni8 = gen_uclamp_i64,
159
+ .fniv = gen_uclamp_vec,
160
+ .fno = gen_helper_gvec_uclamp_d,
161
+ .opt_opc = vecop,
162
+ .vece = MO_64,
163
+ .prefer_i64 = TCG_TARGET_REG_BITS == 64 }
164
+ };
165
+ tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &ops[vece]);
166
+}
167
+
168
+TRANS_FEAT(UCLAMP, aa64_sme, gen_gvec_fn_arg_zzzz, gen_uclamp, a)
169
diff --git a/target/arm/vec_helper.c b/target/arm/vec_helper.c
170
index XXXXXXX..XXXXXXX 100644
171
--- a/target/arm/vec_helper.c
172
+++ b/target/arm/vec_helper.c
173
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_bfmlal_idx)(void *vd, void *vn, void *vm,
174
}
175
clear_tail(d, opr_sz, simd_maxsz(desc));
176
}
177
+
178
+#define DO_CLAMP(NAME, TYPE) \
179
+void HELPER(NAME)(void *d, void *n, void *m, void *a, uint32_t desc) \
180
+{ \
181
+ intptr_t i, opr_sz = simd_oprsz(desc); \
182
+ for (i = 0; i < opr_sz; i += sizeof(TYPE)) { \
183
+ TYPE aa = *(TYPE *)(a + i); \
184
+ TYPE nn = *(TYPE *)(n + i); \
185
+ TYPE mm = *(TYPE *)(m + i); \
186
+ TYPE dd = MIN(MAX(aa, nn), mm); \
187
+ *(TYPE *)(d + i) = dd; \
188
+ } \
189
+ clear_tail(d, opr_sz, simd_maxsz(desc)); \
190
+}
191
+
192
+DO_CLAMP(gvec_sclamp_b, int8_t)
193
+DO_CLAMP(gvec_sclamp_h, int16_t)
194
+DO_CLAMP(gvec_sclamp_s, int32_t)
195
+DO_CLAMP(gvec_sclamp_d, int64_t)
196
+
197
+DO_CLAMP(gvec_uclamp_b, uint8_t)
198
+DO_CLAMP(gvec_uclamp_h, uint16_t)
199
+DO_CLAMP(gvec_uclamp_s, uint32_t)
200
+DO_CLAMP(gvec_uclamp_d, uint64_t)
96
--
201
--
97
2.25.1
202
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
We can handle both exception entry and exception return by
4
hooking into aarch64_sve_change_el.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-95-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-32-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/translate-sve.c | 52 +++++++++++++++++---------------------
11
target/arm/helper.c | 15 +++++++++++++--
9
1 file changed, 23 insertions(+), 29 deletions(-)
12
1 file changed, 13 insertions(+), 2 deletions(-)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/helper.c b/target/arm/helper.c
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/target/arm/helper.c
14
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/helper.c
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FRINTX, aa64_sve, gen_gvec_fpst_arg_zpz, frintx_fns[a->esz],
18
@@ -XXX,XX +XXX,XX @@ void aarch64_sve_change_el(CPUARMState *env, int old_el,
16
static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a,
19
return;
17
int mode, gen_helper_gvec_3_ptr *fn)
18
{
19
- if (sve_access_check(s)) {
20
- unsigned vsz = vec_full_reg_size(s);
21
- TCGv_i32 tmode = tcg_const_i32(mode);
22
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
23
+ unsigned vsz;
24
+ TCGv_i32 tmode;
25
+ TCGv_ptr status;
26
27
- gen_helper_set_rmode(tmode, tmode, status);
28
-
29
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
30
- vec_full_reg_offset(s, a->rn),
31
- pred_full_reg_offset(s, a->pg),
32
- status, vsz, vsz, 0, fn);
33
-
34
- gen_helper_set_rmode(tmode, tmode, status);
35
- tcg_temp_free_i32(tmode);
36
- tcg_temp_free_ptr(status);
37
+ if (fn == NULL) {
38
+ return false;
39
}
20
}
40
+ if (!sve_access_check(s)) {
21
41
+ return true;
22
+ old_a64 = old_el ? arm_el_is_aa64(env, old_el) : el0_a64;
23
+ new_a64 = new_el ? arm_el_is_aa64(env, new_el) : el0_a64;
24
+
25
+ /*
26
+ * Both AArch64.TakeException and AArch64.ExceptionReturn
27
+ * invoke ResetSVEState when taking an exception from, or
28
+ * returning to, AArch32 state when PSTATE.SM is enabled.
29
+ */
30
+ if (old_a64 != new_a64 && FIELD_EX64(env->svcr, SVCR, SM)) {
31
+ arm_reset_sve_state(env);
32
+ return;
42
+ }
33
+ }
43
+
34
+
44
+ vsz = vec_full_reg_size(s);
35
/*
45
+ tmode = tcg_const_i32(mode);
36
* DDI0584A.d sec 3.2: "If SVE instructions are disabled or trapped
46
+ status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
37
* at ELx, or not available because the EL is in AArch32 state, then
47
+
38
@@ -XXX,XX +XXX,XX @@ void aarch64_sve_change_el(CPUARMState *env, int old_el,
48
+ gen_helper_set_rmode(tmode, tmode, status);
39
* we already have the correct register contents when encountering the
49
+
40
* vq0->vq0 transition between EL0->EL1.
50
+ tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
41
*/
51
+ vec_full_reg_offset(s, a->rn),
42
- old_a64 = old_el ? arm_el_is_aa64(env, old_el) : el0_a64;
52
+ pred_full_reg_offset(s, a->pg),
43
old_len = (old_a64 && !sve_exception_el(env, old_el)
53
+ status, vsz, vsz, 0, fn);
44
? sve_vqm1_for_el(env, old_el) : 0);
54
+
45
- new_a64 = new_el ? arm_el_is_aa64(env, new_el) : el0_a64;
55
+ gen_helper_set_rmode(tmode, tmode, status);
46
new_len = (new_a64 && !sve_exception_el(env, new_el)
56
+ tcg_temp_free_i32(tmode);
47
? sve_vqm1_for_el(env, new_el) : 0);
57
+ tcg_temp_free_ptr(status);
58
return true;
59
}
60
61
static bool trans_FRINTN(DisasContext *s, arg_rpr_esz *a)
62
{
63
- if (a->esz == 0) {
64
- return false;
65
- }
66
return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz]);
67
}
68
69
static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
70
{
71
- if (a->esz == 0) {
72
- return false;
73
- }
74
return do_frint_mode(s, a, float_round_up, frint_fns[a->esz]);
75
}
76
77
static bool trans_FRINTM(DisasContext *s, arg_rpr_esz *a)
78
{
79
- if (a->esz == 0) {
80
- return false;
81
- }
82
return do_frint_mode(s, a, float_round_down, frint_fns[a->esz]);
83
}
84
85
static bool trans_FRINTZ(DisasContext *s, arg_rpr_esz *a)
86
{
87
- if (a->esz == 0) {
88
- return false;
89
- }
90
return do_frint_mode(s, a, float_round_to_zero, frint_fns[a->esz]);
91
}
92
93
static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
94
{
95
- if (a->esz == 0) {
96
- return false;
97
- }
98
return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz]);
99
}
100
48
101
--
49
--
102
2.25.1
50
2.25.1
diff view generated by jsdifflib
1
In commit 5814d587fe861fe9 we added support for emulating
1
From: Richard Henderson <richard.henderson@linaro.org>
2
FEAT_HCX (Support for the HCRX_EL2 register). However we
3
forgot to add it to the list in emulated.rst. Correct the
4
omission.
5
2
6
Fixes: 5814d587fe861fe9 ("target/arm: Enable FEAT_HCX for -cpu max")
3
Note that SME remains effectively disabled for user-only,
4
because we do not yet set CPACR_EL1.SMEN. This needs to
5
wait until the kernel ABI is implemented.
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20220708151540.18136-33-richard.henderson@linaro.org
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20220520084320.424166-1-peter.maydell@linaro.org
10
---
11
---
11
docs/system/arm/emulation.rst | 1 +
12
docs/system/arm/emulation.rst | 4 ++++
12
1 file changed, 1 insertion(+)
13
target/arm/cpu64.c | 11 +++++++++++
14
2 files changed, 15 insertions(+)
13
15
14
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
16
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/system/arm/emulation.rst
18
--- a/docs/system/arm/emulation.rst
17
+++ b/docs/system/arm/emulation.rst
19
+++ b/docs/system/arm/emulation.rst
18
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
20
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
19
- FEAT_FRINTTS (Floating-point to integer instructions)
21
- FEAT_SHA512 (Advanced SIMD SHA512 instructions)
20
- FEAT_FlagM (Flag manipulation instructions v2)
22
- FEAT_SM3 (Advanced SIMD SM3 instructions)
21
- FEAT_FlagM2 (Enhancements to flag manipulation instructions)
23
- FEAT_SM4 (Advanced SIMD SM4 instructions)
22
+- FEAT_HCX (Support for the HCRX_EL2 register)
24
+- FEAT_SME (Scalable Matrix Extension)
23
- FEAT_HPDS (Hierarchical permission disables)
25
+- FEAT_SME_FA64 (Full A64 instruction set in Streaming SVE mode)
24
- FEAT_I8MM (AArch64 Int8 matrix multiplication instructions)
26
+- FEAT_SME_F64F64 (Double-precision floating-point outer product instructions)
25
- FEAT_IDST (ID space trap handling)
27
+- FEAT_SME_I16I64 (16-bit to 64-bit integer widening outer product instructions)
28
- FEAT_SPECRES (Speculation restriction instructions)
29
- FEAT_SSBS (Speculative Store Bypass Safe)
30
- FEAT_TLBIOS (TLB invalidate instructions in Outer Shareable domain)
31
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/cpu64.c
34
+++ b/target/arm/cpu64.c
35
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
36
*/
37
t = FIELD_DP64(t, ID_AA64PFR1, MTE, 3); /* FEAT_MTE3 */
38
t = FIELD_DP64(t, ID_AA64PFR1, RAS_FRAC, 0); /* FEAT_RASv1p1 + FEAT_DoubleFault */
39
+ t = FIELD_DP64(t, ID_AA64PFR1, SME, 1); /* FEAT_SME */
40
t = FIELD_DP64(t, ID_AA64PFR1, CSV2_FRAC, 0); /* FEAT_CSV2_2 */
41
cpu->isar.id_aa64pfr1 = t;
42
43
@@ -XXX,XX +XXX,XX @@ static void aarch64_max_initfn(Object *obj)
44
t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 5); /* FEAT_PMUv3p4 */
45
cpu->isar.id_aa64dfr0 = t;
46
47
+ t = cpu->isar.id_aa64smfr0;
48
+ t = FIELD_DP64(t, ID_AA64SMFR0, F32F32, 1); /* FEAT_SME */
49
+ t = FIELD_DP64(t, ID_AA64SMFR0, B16F32, 1); /* FEAT_SME */
50
+ t = FIELD_DP64(t, ID_AA64SMFR0, F16F32, 1); /* FEAT_SME */
51
+ t = FIELD_DP64(t, ID_AA64SMFR0, I8I32, 0xf); /* FEAT_SME */
52
+ t = FIELD_DP64(t, ID_AA64SMFR0, F64F64, 1); /* FEAT_SME_F64F64 */
53
+ t = FIELD_DP64(t, ID_AA64SMFR0, I16I64, 0xf); /* FEAT_SME_I16I64 */
54
+ t = FIELD_DP64(t, ID_AA64SMFR0, FA64, 1); /* FEAT_SME_FA64 */
55
+ cpu->isar.id_aa64smfr0 = t;
56
+
57
/* Replicate the same data to the 32-bit id registers. */
58
aa32_max_features(cpu);
59
26
--
60
--
27
2.25.1
61
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
2
1
3
Fix when building HVF on macOS Aarch64:
4
5
target/arm/hvf/hvf.c:586:15: error: unknown type name 'ARMCPRegInfo'; did you mean 'ARMCPUInfo'?
6
const ARMCPRegInfo *ri;
7
^~~~~~~~~~~~
8
ARMCPUInfo
9
target/arm/cpu-qom.h:38:3: note: 'ARMCPUInfo' declared here
10
} ARMCPUInfo;
11
^
12
target/arm/hvf/hvf.c:589:14: error: implicit declaration of function 'get_arm_cp_reginfo' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
13
ri = get_arm_cp_reginfo(arm_cpu->cp_regs, key);
14
^
15
target/arm/hvf/hvf.c:589:12: warning: incompatible integer to pointer conversion assigning to 'const ARMCPUInfo *' (aka 'const struct ARMCPUInfo *') from 'int' [-Wint-conversion]
16
ri = get_arm_cp_reginfo(arm_cpu->cp_regs, key);
17
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
18
target/arm/hvf/hvf.c:591:26: error: no member named 'type' in 'struct ARMCPUInfo'
19
assert(!(ri->type & ARM_CP_NO_RAW));
20
~~ ^
21
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/assert.h:99:25: note: expanded from macro 'assert'
22
(__builtin_expect(!(e), 0) ? __assert_rtn(__func__, __ASSERT_FILE_NAME, __LINE__, #e) : (void)0)
23
^
24
target/arm/hvf/hvf.c:591:33: error: use of undeclared identifier 'ARM_CP_NO_RAW'
25
assert(!(ri->type & ARM_CP_NO_RAW));
26
^
27
1 warning and 4 errors generated.
28
29
Fixes: cf7c6d1004 ("target/arm: Split out cpregs.h")
30
Reported-by: Duncan Bayne <duncan@bayne.id.au>
31
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
32
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
33
Message-id: 20220525161926.34233-1-philmd@fungible.com
34
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1029
35
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
36
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
37
---
38
target/arm/hvf/hvf.c | 1 +
39
1 file changed, 1 insertion(+)
40
41
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
42
index XXXXXXX..XXXXXXX 100644
43
--- a/target/arm/hvf/hvf.c
44
+++ b/target/arm/hvf/hvf.c
45
@@ -XXX,XX +XXX,XX @@
46
#include "sysemu/hvf_int.h"
47
#include "sysemu/hw_accel.h"
48
#include "hvf_arm.h"
49
+#include "cpregs.h"
50
51
#include <mach/mach_time.h>
52
53
--
54
2.25.1
55
56
diff view generated by jsdifflib
Deleted patch
1
From: Icenowy Zheng <uwu@icenowy.me>
2
1
3
U-Boot queries the FIFO water level to reduce checking status register
4
when doing PIO SD card operation.
5
6
Report a FIFO water level of 1 when data is ready, to prevent the code
7
from trying to read 0 words from the FIFO each time.
8
9
Signed-off-by: Icenowy Zheng <uwu@icenowy.me>
10
Message-id: 20220520124200.2112699-1-uwu@icenowy.me
11
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
12
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
---
14
hw/sd/allwinner-sdhost.c | 7 +++++++
15
1 file changed, 7 insertions(+)
16
17
diff --git a/hw/sd/allwinner-sdhost.c b/hw/sd/allwinner-sdhost.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/sd/allwinner-sdhost.c
20
+++ b/hw/sd/allwinner-sdhost.c
21
@@ -XXX,XX +XXX,XX @@ enum {
22
};
23
24
enum {
25
+ SD_STAR_FIFO_EMPTY = (1 << 2),
26
SD_STAR_CARD_PRESENT = (1 << 8),
27
+ SD_STAR_FIFO_LEVEL_1 = (1 << 17),
28
};
29
30
enum {
31
@@ -XXX,XX +XXX,XX @@ static uint64_t allwinner_sdhost_read(void *opaque, hwaddr offset,
32
break;
33
case REG_SD_STAR: /* Status */
34
res = s->status;
35
+ if (sdbus_data_ready(&s->sdbus)) {
36
+ res |= SD_STAR_FIFO_LEVEL_1;
37
+ } else {
38
+ res |= SD_STAR_FIFO_EMPTY;
39
+ }
40
break;
41
case REG_SD_FWLR: /* FIFO Water Level */
42
res = s->fifo_wlevel;
43
--
44
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-85-richard.henderson@linaro.org
5
Message-id: 20220708151540.18136-34-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
target/arm/translate-sve.c | 28 ++++------------------------
8
linux-user/aarch64/target_cpu.h | 5 ++++-
9
1 file changed, 4 insertions(+), 24 deletions(-)
9
1 file changed, 4 insertions(+), 1 deletion(-)
10
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
11
diff --git a/linux-user/aarch64/target_cpu.h b/linux-user/aarch64/target_cpu.h
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
13
--- a/linux-user/aarch64/target_cpu.h
14
+++ b/target/arm/translate-sve.c
14
+++ b/linux-user/aarch64/target_cpu.h
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(BFMMLA, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
15
@@ -XXX,XX +XXX,XX @@ static inline void cpu_clone_regs_parent(CPUARMState *env, unsigned flags)
16
16
17
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
17
static inline void cpu_set_tls(CPUARMState *env, target_ulong newtls)
18
{
18
{
19
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
19
- /* Note that AArch64 Linux keeps the TLS pointer in TPIDR; this is
20
- return false;
20
+ /*
21
- }
21
+ * Note that AArch64 Linux keeps the TLS pointer in TPIDR; this is
22
return gen_gvec_fpst_zzzz(s, gen_helper_gvec_bfmlal,
22
* different from AArch32 Linux, which uses TPIDRRO.
23
a->rd, a->rn, a->rm, a->ra, sel, FPST_FPCR);
23
*/
24
env->cp15.tpidr_el[0] = newtls;
25
+ /* TPIDR2_EL0 is cleared with CLONE_SETTLS. */
26
+ env->cp15.tpidr2_el0 = 0;
24
}
27
}
25
28
26
-static bool trans_BFMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
29
static inline abi_ulong get_sp_from_cpustate(CPUARMState *state)
27
-{
28
- return do_BFMLAL_zzzw(s, a, false);
29
-}
30
-
31
-static bool trans_BFMLALT_zzzw(DisasContext *s, arg_rrrr_esz *a)
32
-{
33
- return do_BFMLAL_zzzw(s, a, true);
34
-}
35
+TRANS_FEAT(BFMLALB_zzzw, aa64_sve_bf16, do_BFMLAL_zzzw, a, false)
36
+TRANS_FEAT(BFMLALT_zzzw, aa64_sve_bf16, do_BFMLAL_zzzw, a, true)
37
38
static bool do_BFMLAL_zzxw(DisasContext *s, arg_rrxr_esz *a, bool sel)
39
{
40
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
41
- return false;
42
- }
43
return gen_gvec_fpst_zzzz(s, gen_helper_gvec_bfmlal_idx,
44
a->rd, a->rn, a->rm, a->ra,
45
(a->index << 1) | sel, FPST_FPCR);
46
}
47
48
-static bool trans_BFMLALB_zzxw(DisasContext *s, arg_rrxr_esz *a)
49
-{
50
- return do_BFMLAL_zzxw(s, a, false);
51
-}
52
-
53
-static bool trans_BFMLALT_zzxw(DisasContext *s, arg_rrxr_esz *a)
54
-{
55
- return do_BFMLAL_zzxw(s, a, true);
56
-}
57
+TRANS_FEAT(BFMLALB_zzxw, aa64_sve_bf16, do_BFMLAL_zzxw, a, false)
58
+TRANS_FEAT(BFMLALT_zzxw, aa64_sve_bf16, do_BFMLAL_zzxw, a, true)
59
--
30
--
60
2.25.1
31
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-89-richard.henderson@linaro.org
5
Message-id: 20220708151540.18136-35-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
target/arm/translate-sve.c | 29 +++++++----------------------
8
linux-user/aarch64/cpu_loop.c | 9 +++++++++
9
1 file changed, 7 insertions(+), 22 deletions(-)
9
1 file changed, 9 insertions(+)
10
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
11
diff --git a/linux-user/aarch64/cpu_loop.c b/linux-user/aarch64/cpu_loop.c
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
13
--- a/linux-user/aarch64/cpu_loop.c
14
+++ b/target/arm/translate-sve.c
14
+++ b/linux-user/aarch64/cpu_loop.c
15
@@ -XXX,XX +XXX,XX @@ DO_PPZ(FCMNE_ppz0, fcmne0)
15
@@ -XXX,XX +XXX,XX @@ void cpu_loop(CPUARMState *env)
16
*** SVE floating-point trig multiply-add coefficient
16
17
*/
17
switch (trapnr) {
18
18
case EXCP_SWI:
19
-static bool trans_FTMAD(DisasContext *s, arg_FTMAD *a)
19
+ /*
20
-{
20
+ * On syscall, PSTATE.ZA is preserved, along with the ZA matrix.
21
- static gen_helper_gvec_3_ptr * const fns[3] = {
21
+ * PSTATE.SM is cleared, per SMSTOP, which does ResetSVEState.
22
- gen_helper_sve_ftmad_h,
22
+ */
23
- gen_helper_sve_ftmad_s,
23
+ if (FIELD_EX64(env->svcr, SVCR, SM)) {
24
- gen_helper_sve_ftmad_d,
24
+ env->svcr = FIELD_DP64(env->svcr, SVCR, SM, 0);
25
- };
25
+ arm_rebuild_hflags(env);
26
-
26
+ arm_reset_sve_state(env);
27
- if (a->esz == 0) {
27
+ }
28
- return false;
28
ret = do_syscall(env,
29
- }
29
env->xregs[8],
30
- if (sve_access_check(s)) {
30
env->xregs[0],
31
- unsigned vsz = vec_full_reg_size(s);
32
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
33
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
34
- vec_full_reg_offset(s, a->rn),
35
- vec_full_reg_offset(s, a->rm),
36
- status, vsz, vsz, a->imm, fns[a->esz - 1]);
37
- tcg_temp_free_ptr(status);
38
- }
39
- return true;
40
-}
41
+static gen_helper_gvec_3_ptr * const ftmad_fns[4] = {
42
+ NULL, gen_helper_sve_ftmad_h,
43
+ gen_helper_sve_ftmad_s, gen_helper_sve_ftmad_d,
44
+};
45
+TRANS_FEAT(FTMAD, aa64_sve, gen_gvec_fpst_zzz,
46
+ ftmad_fns[a->esz], a->rd, a->rn, a->rm, a->imm,
47
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
48
49
/*
50
*** SVE Floating Point Accumulating Reduction Group
51
--
31
--
52
2.25.1
32
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Make sure to zero the currently reserved fields.
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-88-richard.henderson@linaro.org
7
Message-id: 20220708151540.18136-36-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
9
---
8
target/arm/translate-sve.c | 26 +++++++-------------------
10
linux-user/aarch64/signal.c | 9 ++++++++-
9
1 file changed, 7 insertions(+), 19 deletions(-)
11
1 file changed, 8 insertions(+), 1 deletion(-)
10
12
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
diff --git a/linux-user/aarch64/signal.c b/linux-user/aarch64/signal.c
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
15
--- a/linux-user/aarch64/signal.c
14
+++ b/target/arm/translate-sve.c
16
+++ b/linux-user/aarch64/signal.c
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FMLS_zzxz, aa64_sve, do_FMLA_zzxz, a, true)
17
@@ -XXX,XX +XXX,XX @@ struct target_extra_context {
16
*** SVE Floating Point Multiply Indexed Group
18
struct target_sve_context {
17
*/
19
struct target_aarch64_ctx head;
18
20
uint16_t vl;
19
-static bool trans_FMUL_zzx(DisasContext *s, arg_FMUL_zzx *a)
21
- uint16_t reserved[3];
20
-{
22
+ uint16_t flags;
21
- static gen_helper_gvec_3_ptr * const fns[3] = {
23
+ uint16_t reserved[2];
22
- gen_helper_gvec_fmul_idx_h,
24
/* The actual SVE data immediately follows. It is laid out
23
- gen_helper_gvec_fmul_idx_s,
25
* according to TARGET_SVE_SIG_{Z,P}REG_OFFSET, based off of
24
- gen_helper_gvec_fmul_idx_d,
26
* the original struct pointer.
25
- };
27
@@ -XXX,XX +XXX,XX @@ struct target_sve_context {
26
-
28
#define TARGET_SVE_SIG_CONTEXT_SIZE(VQ) \
27
- if (sve_access_check(s)) {
29
(TARGET_SVE_SIG_PREG_OFFSET(VQ, 17))
28
- unsigned vsz = vec_full_reg_size(s);
30
29
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
31
+#define TARGET_SVE_SIG_FLAG_SM 1
30
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
32
+
31
- vec_full_reg_offset(s, a->rn),
33
struct target_rt_sigframe {
32
- vec_full_reg_offset(s, a->rm),
34
struct target_siginfo info;
33
- status, vsz, vsz, a->index, fns[a->esz - 1]);
35
struct target_ucontext uc;
34
- tcg_temp_free_ptr(status);
36
@@ -XXX,XX +XXX,XX @@ static void target_setup_sve_record(struct target_sve_context *sve,
35
- }
37
{
36
- return true;
38
int i, j;
37
-}
39
38
+static gen_helper_gvec_3_ptr * const fmul_idx_fns[4] = {
40
+ memset(sve, 0, sizeof(*sve));
39
+ NULL, gen_helper_gvec_fmul_idx_h,
41
__put_user(TARGET_SVE_MAGIC, &sve->head.magic);
40
+ gen_helper_gvec_fmul_idx_s, gen_helper_gvec_fmul_idx_d,
42
__put_user(size, &sve->head.size);
41
+};
43
__put_user(vq * TARGET_SVE_VQ_BYTES, &sve->vl);
42
+TRANS_FEAT(FMUL_zzx, aa64_sve, gen_gvec_fpst_zzz,
44
+ if (FIELD_EX64(env->svcr, SVCR, SM)) {
43
+ fmul_idx_fns[a->esz], a->rd, a->rn, a->rm, a->index,
45
+ __put_user(TARGET_SVE_SIG_FLAG_SM, &sve->flags);
44
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
46
+ }
45
47
46
/*
48
/* Note that SVE regs are stored as a byte stream, with each byte element
47
*** SVE Floating Point Fast Reduction Group
49
* at a subsequent address. This corresponds to a little-endian store
48
--
50
--
49
2.25.1
51
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Fold the return value setting into the goto, so each
4
point of failure need not do both.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-84-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-37-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/translate-sve.c | 11 ++---------
11
linux-user/aarch64/signal.c | 26 +++++++++++---------------
9
1 file changed, 2 insertions(+), 9 deletions(-)
12
1 file changed, 11 insertions(+), 15 deletions(-)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/linux-user/aarch64/signal.c b/linux-user/aarch64/signal.c
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/linux-user/aarch64/signal.c
14
+++ b/target/arm/translate-sve.c
17
+++ b/linux-user/aarch64/signal.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_FMLA_zzxz(DisasContext *s, arg_rrxr_esz *a, bool sub)
18
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
16
a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
19
struct target_sve_context *sve = NULL;
20
uint64_t extra_datap = 0;
21
bool used_extra = false;
22
- bool err = false;
23
int vq = 0, sve_size = 0;
24
25
target_restore_general_frame(env, sf);
26
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
27
switch (magic) {
28
case 0:
29
if (size != 0) {
30
- err = true;
31
- goto exit;
32
+ goto err;
33
}
34
if (used_extra) {
35
ctx = NULL;
36
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
37
38
case TARGET_FPSIMD_MAGIC:
39
if (fpsimd || size != sizeof(struct target_fpsimd_context)) {
40
- err = true;
41
- goto exit;
42
+ goto err;
43
}
44
fpsimd = (struct target_fpsimd_context *)ctx;
45
break;
46
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
47
break;
48
}
49
}
50
- err = true;
51
- goto exit;
52
+ goto err;
53
54
case TARGET_EXTRA_MAGIC:
55
if (extra || size != sizeof(struct target_extra_context)) {
56
- err = true;
57
- goto exit;
58
+ goto err;
59
}
60
__get_user(extra_datap,
61
&((struct target_extra_context *)ctx)->datap);
62
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
63
/* Unknown record -- we certainly didn't generate it.
64
* Did we in fact get out of sync?
65
*/
66
- err = true;
67
- goto exit;
68
+ goto err;
69
}
70
ctx = (void *)ctx + size;
71
}
72
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
73
if (fpsimd) {
74
target_restore_fpsimd_record(env, fpsimd);
75
} else {
76
- err = true;
77
+ goto err;
78
}
79
80
/* SVE data, if present, overwrites FPSIMD data. */
81
if (sve) {
82
target_restore_sve_record(env, sve, vq);
83
}
84
-
85
- exit:
86
unlock_user(extra, extra_datap, 0);
87
- return err;
88
+ return 0;
89
+
90
+ err:
91
+ unlock_user(extra, extra_datap, 0);
92
+ return 1;
17
}
93
}
18
94
19
-static bool trans_FMLA_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
95
static abi_ulong get_sigframe(struct target_sigaction *ka,
20
-{
21
- return do_FMLA_zzxz(s, a, false);
22
-}
23
-
24
-static bool trans_FMLS_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
25
-{
26
- return do_FMLA_zzxz(s, a, true);
27
-}
28
+TRANS_FEAT(FMLA_zzxz, aa64_sve, do_FMLA_zzxz, a, false)
29
+TRANS_FEAT(FMLS_zzxz, aa64_sve, do_FMLA_zzxz, a, true)
30
31
/*
32
*** SVE Floating Point Multiply Indexed Group
33
--
96
--
34
2.25.1
97
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
In parse_user_sigframe, the kernel rejects duplicate sve records,
4
or records that are smaller than the header. We were silently
5
allowing these cases to pass, dropping the record.
6
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-87-richard.henderson@linaro.org
9
Message-id: 20220708151540.18136-38-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
11
---
8
target/arm/translate-sve.c | 7 ++-----
12
linux-user/aarch64/signal.c | 5 ++++-
9
1 file changed, 2 insertions(+), 5 deletions(-)
13
1 file changed, 4 insertions(+), 1 deletion(-)
10
14
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/linux-user/aarch64/signal.c b/linux-user/aarch64/signal.c
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
17
--- a/linux-user/aarch64/signal.c
14
+++ b/target/arm/translate-sve.c
18
+++ b/linux-user/aarch64/signal.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
19
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
16
*/
20
break;
17
21
18
#define DO_FP3(NAME, name) \
22
case TARGET_SVE_MAGIC:
19
-static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
23
+ if (sve || size < sizeof(struct target_sve_context)) {
20
-{ \
24
+ goto err;
21
- static gen_helper_gvec_3_ptr * const fns[4] = { \
25
+ }
22
+ static gen_helper_gvec_3_ptr * const name##_fns[4] = { \
26
if (cpu_isar_feature(aa64_sve, env_archcpu(env))) {
23
NULL, gen_helper_gvec_##name##_h, \
27
vq = sve_vq(env);
24
gen_helper_gvec_##name##_s, gen_helper_gvec_##name##_d \
28
sve_size = QEMU_ALIGN_UP(TARGET_SVE_SIG_CONTEXT_SIZE(vq), 16);
25
}; \
29
- if (!sve && size == sve_size) {
26
- return gen_gvec_fpst_arg_zzz(s, fns[a->esz], a, 0); \
30
+ if (size == sve_size) {
27
-}
31
sve = (struct target_sve_context *)ctx;
28
+ TRANS_FEAT(NAME, aa64_sve, gen_gvec_fpst_arg_zzz, name##_fns[a->esz], a, 0)
32
break;
29
33
}
30
DO_FP3(FADD_zzz, fadd)
31
DO_FP3(FSUB_zzz, fsub)
32
--
34
--
33
2.25.1
35
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-83-richard.henderson@linaro.org
5
Message-id: 20220708151540.18136-39-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
7
---
8
target/arm/translate-sve.c | 17 +++--------------
8
linux-user/aarch64/signal.c | 3 +++
9
1 file changed, 3 insertions(+), 14 deletions(-)
9
1 file changed, 3 insertions(+)
10
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
11
diff --git a/linux-user/aarch64/signal.c b/linux-user/aarch64/signal.c
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
13
--- a/linux-user/aarch64/signal.c
14
+++ b/target/arm/translate-sve.c
14
+++ b/linux-user/aarch64/signal.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_PRF_rr(DisasContext *s, arg_PRF_rr *a)
15
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
16
* In the meantime, just emit the moves.
16
__get_user(extra_size,
17
*/
17
&((struct target_extra_context *)ctx)->size);
18
18
extra = lock_user(VERIFY_READ, extra_datap, extra_size, 0);
19
-static bool trans_MOVPRFX(DisasContext *s, arg_MOVPRFX *a)
19
+ if (!extra) {
20
-{
20
+ return 1;
21
- return do_mov_z(s, a->rd, a->rn);
21
+ }
22
-}
22
break;
23
-
23
24
-static bool trans_MOVPRFX_m(DisasContext *s, arg_rpr_esz *a)
24
default:
25
-{
26
- return do_sel_z(s, a->rd, a->rn, a->rd, a->pg, a->esz);
27
-}
28
-
29
-static bool trans_MOVPRFX_z(DisasContext *s, arg_rpr_esz *a)
30
-{
31
- return do_movz_zpz(s, a->rd, a->rn, a->pg, a->esz, false);
32
-}
33
+TRANS_FEAT(MOVPRFX, aa64_sve, do_mov_z, a->rd, a->rn)
34
+TRANS_FEAT(MOVPRFX_m, aa64_sve, do_sel_z, a->rd, a->rn, a->rd, a->pg, a->esz)
35
+TRANS_FEAT(MOVPRFX_z, aa64_sve, do_movz_zpz, a->rd, a->rn, a->pg, a->esz, false)
36
37
/*
38
* SVE2 Integer Multiply - Unpredicated
39
--
25
--
40
2.25.1
26
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Share code between the various shifts using arg_rpri_esz.
3
Move the checks out of the parsing loop and into the
4
restore function. This more closely mirrors the code
5
structure in the kernel, and is slightly clearer.
4
6
7
Reject rather than silently skip incorrect VL and SVE record sizes,
8
bringing our checks in to line with those the kernel does.
9
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-46-richard.henderson@linaro.org
12
Message-id: 20220708151540.18136-40-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
13
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
14
---
10
target/arm/translate-sve.c | 68 +++++++++++++++++---------------------
15
linux-user/aarch64/signal.c | 51 +++++++++++++++++++++++++------------
11
1 file changed, 30 insertions(+), 38 deletions(-)
16
1 file changed, 35 insertions(+), 16 deletions(-)
12
17
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
18
diff --git a/linux-user/aarch64/signal.c b/linux-user/aarch64/signal.c
14
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
20
--- a/linux-user/aarch64/signal.c
16
+++ b/target/arm/translate-sve.c
21
+++ b/linux-user/aarch64/signal.c
17
@@ -XXX,XX +XXX,XX @@ static bool do_movz_zpz(DisasContext *s, int rd, int rn, int pg,
22
@@ -XXX,XX +XXX,XX @@ static void target_restore_fpsimd_record(CPUARMState *env,
18
return gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
23
}
19
}
24
}
20
25
21
+static bool do_shift_zpzi(DisasContext *s, arg_rpri_esz *a, bool asr,
26
-static void target_restore_sve_record(CPUARMState *env,
22
+ gen_helper_gvec_3 * const fns[4])
27
- struct target_sve_context *sve, int vq)
23
+{
28
+static bool target_restore_sve_record(CPUARMState *env,
24
+ int max;
29
+ struct target_sve_context *sve,
30
+ int size)
31
{
32
- int i, j;
33
+ int i, j, vl, vq;
34
35
- /* Note that SVE regs are stored as a byte stream, with each byte element
36
+ if (!cpu_isar_feature(aa64_sve, env_archcpu(env))) {
37
+ return false;
38
+ }
25
+
39
+
26
+ if (a->esz < 0) {
40
+ __get_user(vl, &sve->vl);
27
+ /* Invalid tsz encoding -- see tszimm_esz. */
41
+ vq = sve_vq(env);
42
+
43
+ /* Reject mismatched VL. */
44
+ if (vl != vq * TARGET_SVE_VQ_BYTES) {
45
+ return false;
46
+ }
47
+
48
+ /* Accept empty record -- used to clear PSTATE.SM. */
49
+ if (size <= sizeof(*sve)) {
50
+ return true;
51
+ }
52
+
53
+ /* Reject non-empty but incomplete record. */
54
+ if (size < TARGET_SVE_SIG_CONTEXT_SIZE(vq)) {
28
+ return false;
55
+ return false;
29
+ }
56
+ }
30
+
57
+
31
+ /*
58
+ /*
32
+ * Shift by element size is architecturally valid.
59
+ * Note that SVE regs are stored as a byte stream, with each byte element
33
+ * For arithmetic right-shift, it's the same as by one less.
60
* at a subsequent address. This corresponds to a little-endian load
34
+ * For logical shifts and ASRD, it is a zeroing operation.
61
* of our 64-bit hunks.
35
+ */
62
*/
36
+ max = 8 << a->esz;
63
@@ -XXX,XX +XXX,XX @@ static void target_restore_sve_record(CPUARMState *env,
37
+ if (a->imm >= max) {
64
}
38
+ if (asr) {
65
}
39
+ a->imm = max - 1;
66
}
40
+ } else {
67
+ return true;
41
+ return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
42
+ }
43
+ }
44
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
45
+}
46
+
47
static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
48
{
49
static gen_helper_gvec_3 * const fns[4] = {
50
gen_helper_sve_asr_zpzi_b, gen_helper_sve_asr_zpzi_h,
51
gen_helper_sve_asr_zpzi_s, gen_helper_sve_asr_zpzi_d,
52
};
53
- if (a->esz < 0) {
54
- /* Invalid tsz encoding -- see tszimm_esz. */
55
- return false;
56
- }
57
- /* Shift by element size is architecturally valid. For
58
- arithmetic right-shift, it's the same as by one less. */
59
- a->imm = MIN(a->imm, (8 << a->esz) - 1);
60
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
61
+ return do_shift_zpzi(s, a, true, fns);
62
}
68
}
63
69
64
static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
70
static int target_restore_sigframe(CPUARMState *env,
65
@@ -XXX,XX +XXX,XX @@ static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
71
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
66
gen_helper_sve_lsr_zpzi_b, gen_helper_sve_lsr_zpzi_h,
72
struct target_sve_context *sve = NULL;
67
gen_helper_sve_lsr_zpzi_s, gen_helper_sve_lsr_zpzi_d,
73
uint64_t extra_datap = 0;
68
};
74
bool used_extra = false;
69
- if (a->esz < 0) {
75
- int vq = 0, sve_size = 0;
70
- return false;
76
+ int sve_size = 0;
71
- }
77
72
- /* Shift by element size is architecturally valid.
78
target_restore_general_frame(env, sf);
73
- For logical shifts, it is a zeroing operation. */
79
74
- if (a->imm >= (8 << a->esz)) {
80
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
75
- return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
81
if (sve || size < sizeof(struct target_sve_context)) {
76
- } else {
82
goto err;
77
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
83
}
78
- }
84
- if (cpu_isar_feature(aa64_sve, env_archcpu(env))) {
79
+ return do_shift_zpzi(s, a, false, fns);
85
- vq = sve_vq(env);
80
}
86
- sve_size = QEMU_ALIGN_UP(TARGET_SVE_SIG_CONTEXT_SIZE(vq), 16);
81
87
- if (size == sve_size) {
82
static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
88
- sve = (struct target_sve_context *)ctx;
83
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
89
- break;
84
gen_helper_sve_lsl_zpzi_b, gen_helper_sve_lsl_zpzi_h,
90
- }
85
gen_helper_sve_lsl_zpzi_s, gen_helper_sve_lsl_zpzi_d,
91
- }
86
};
92
- goto err;
87
- if (a->esz < 0) {
93
+ sve = (struct target_sve_context *)ctx;
88
- return false;
94
+ sve_size = size;
89
- }
95
+ break;
90
- /* Shift by element size is architecturally valid.
96
91
- For logical shifts, it is a zeroing operation. */
97
case TARGET_EXTRA_MAGIC:
92
- if (a->imm >= (8 << a->esz)) {
98
if (extra || size != sizeof(struct target_extra_context)) {
93
- return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
99
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
94
- } else {
100
}
95
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
101
96
- }
102
/* SVE data, if present, overwrites FPSIMD data. */
97
+ return do_shift_zpzi(s, a, false, fns);
103
- if (sve) {
98
}
104
- target_restore_sve_record(env, sve, vq);
99
105
+ if (sve && !target_restore_sve_record(env, sve, sve_size)) {
100
static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
106
+ goto err;
101
@@ -XXX,XX +XXX,XX @@ static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
107
}
102
gen_helper_sve_asrd_b, gen_helper_sve_asrd_h,
108
unlock_user(extra, extra_datap, 0);
103
gen_helper_sve_asrd_s, gen_helper_sve_asrd_d,
109
return 0;
104
};
105
- if (a->esz < 0) {
106
- return false;
107
- }
108
- /* Shift by element size is architecturally valid. For arithmetic
109
- right shift for division, it is a zeroing operation. */
110
- if (a->imm >= (8 << a->esz)) {
111
- return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
112
- } else {
113
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
114
- }
115
+ return do_shift_zpzi(s, a, false, fns);
116
}
117
118
static gen_helper_gvec_3 * const sqshl_zpzi_fns[4] = {
119
--
110
--
120
2.25.1
111
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Convert SVE translation functions using do_sve2_zzzz_ool
3
Set the SM bit in the SVE record on signal delivery, create the ZA record.
4
to use TRANS_FEAT and gen_gvec_ool_arg_zzzz.
4
Restore SM and ZA state according to the records present on return.
5
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-12-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-41-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
10
---
11
target/arm/translate-sve.c | 263 +++++++++++--------------------------
11
linux-user/aarch64/signal.c | 167 +++++++++++++++++++++++++++++++++---
12
1 file changed, 79 insertions(+), 184 deletions(-)
12
1 file changed, 154 insertions(+), 13 deletions(-)
13
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/linux-user/aarch64/signal.c b/linux-user/aarch64/signal.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
16
--- a/linux-user/aarch64/signal.c
17
+++ b/target/arm/translate-sve.c
17
+++ b/linux-user/aarch64/signal.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_SQCADD_rot270(DisasContext *s, arg_rrr_esz *a)
18
@@ -XXX,XX +XXX,XX @@ struct target_sve_context {
19
return do_cadd(s, a, true, true);
19
20
#define TARGET_SVE_SIG_FLAG_SM 1
21
22
+#define TARGET_ZA_MAGIC 0x54366345
23
+
24
+struct target_za_context {
25
+ struct target_aarch64_ctx head;
26
+ uint16_t vl;
27
+ uint16_t reserved[3];
28
+ /* The actual ZA data immediately follows. */
29
+};
30
+
31
+#define TARGET_ZA_SIG_REGS_OFFSET \
32
+ QEMU_ALIGN_UP(sizeof(struct target_za_context), TARGET_SVE_VQ_BYTES)
33
+#define TARGET_ZA_SIG_ZAV_OFFSET(VQ, N) \
34
+ (TARGET_ZA_SIG_REGS_OFFSET + (VQ) * TARGET_SVE_VQ_BYTES * (N))
35
+#define TARGET_ZA_SIG_CONTEXT_SIZE(VQ) \
36
+ TARGET_ZA_SIG_ZAV_OFFSET(VQ, VQ * TARGET_SVE_VQ_BYTES)
37
+
38
struct target_rt_sigframe {
39
struct target_siginfo info;
40
struct target_ucontext uc;
41
@@ -XXX,XX +XXX,XX @@ static void target_setup_end_record(struct target_aarch64_ctx *end)
20
}
42
}
21
43
22
-static bool do_sve2_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
44
static void target_setup_sve_record(struct target_sve_context *sve,
23
- gen_helper_gvec_4 *fn, int data)
45
- CPUARMState *env, int vq, int size)
24
-{
46
+ CPUARMState *env, int size)
25
- if (!dc_isar_feature(aa64_sve2, s)) {
47
{
26
- return false;
48
- int i, j;
27
- }
49
+ int i, j, vq = sve_vq(env);
28
- return gen_gvec_ool_arg_zzzz(s, fn, a, data);
50
29
-}
51
memset(sve, 0, sizeof(*sve));
30
+static gen_helper_gvec_4 * const sabal_fns[4] = {
52
__put_user(TARGET_SVE_MAGIC, &sve->head.magic);
31
+ NULL, gen_helper_sve2_sabal_h,
53
@@ -XXX,XX +XXX,XX @@ static void target_setup_sve_record(struct target_sve_context *sve,
32
+ gen_helper_sve2_sabal_s, gen_helper_sve2_sabal_d,
54
}
33
+};
34
+TRANS_FEAT(SABALB, aa64_sve2, gen_gvec_ool_arg_zzzz, sabal_fns[a->esz], a, 0)
35
+TRANS_FEAT(SABALT, aa64_sve2, gen_gvec_ool_arg_zzzz, sabal_fns[a->esz], a, 1)
36
37
-static bool do_abal(DisasContext *s, arg_rrrr_esz *a, bool uns, bool sel)
38
-{
39
- static gen_helper_gvec_4 * const fns[2][4] = {
40
- { NULL, gen_helper_sve2_sabal_h,
41
- gen_helper_sve2_sabal_s, gen_helper_sve2_sabal_d },
42
- { NULL, gen_helper_sve2_uabal_h,
43
- gen_helper_sve2_uabal_s, gen_helper_sve2_uabal_d },
44
- };
45
- return do_sve2_zzzz_ool(s, a, fns[uns][a->esz], sel);
46
-}
47
-
48
-static bool trans_SABALB(DisasContext *s, arg_rrrr_esz *a)
49
-{
50
- return do_abal(s, a, false, false);
51
-}
52
-
53
-static bool trans_SABALT(DisasContext *s, arg_rrrr_esz *a)
54
-{
55
- return do_abal(s, a, false, true);
56
-}
57
-
58
-static bool trans_UABALB(DisasContext *s, arg_rrrr_esz *a)
59
-{
60
- return do_abal(s, a, true, false);
61
-}
62
-
63
-static bool trans_UABALT(DisasContext *s, arg_rrrr_esz *a)
64
-{
65
- return do_abal(s, a, true, true);
66
-}
67
+static gen_helper_gvec_4 * const uabal_fns[4] = {
68
+ NULL, gen_helper_sve2_uabal_h,
69
+ gen_helper_sve2_uabal_s, gen_helper_sve2_uabal_d,
70
+};
71
+TRANS_FEAT(UABALB, aa64_sve2, gen_gvec_ool_arg_zzzz, uabal_fns[a->esz], a, 0)
72
+TRANS_FEAT(UABALT, aa64_sve2, gen_gvec_ool_arg_zzzz, uabal_fns[a->esz], a, 1)
73
74
static bool do_adcl(DisasContext *s, arg_rrrr_esz *a, bool sel)
75
{
76
@@ -XXX,XX +XXX,XX @@ static bool do_adcl(DisasContext *s, arg_rrrr_esz *a, bool sel)
77
* Note that in this case the ESZ field encodes both size and sign.
78
* Split out 'subtract' into bit 1 of the data field for the helper.
79
*/
80
- return do_sve2_zzzz_ool(s, a, fns[a->esz & 1], (a->esz & 2) | sel);
81
+ return gen_gvec_ool_arg_zzzz(s, fns[a->esz & 1], a, (a->esz & 2) | sel);
82
}
55
}
83
56
84
-static bool trans_ADCLB(DisasContext *s, arg_rrrr_esz *a)
57
+static void target_setup_za_record(struct target_za_context *za,
85
-{
58
+ CPUARMState *env, int size)
86
- return do_adcl(s, a, false);
59
+{
87
-}
60
+ int vq = sme_vq(env);
88
-
61
+ int vl = vq * TARGET_SVE_VQ_BYTES;
89
-static bool trans_ADCLT(DisasContext *s, arg_rrrr_esz *a)
62
+ int i, j;
90
-{
63
+
91
- return do_adcl(s, a, true);
64
+ memset(za, 0, sizeof(*za));
92
-}
65
+ __put_user(TARGET_ZA_MAGIC, &za->head.magic);
93
+TRANS_FEAT(ADCLB, aa64_sve2, do_adcl, a, false)
66
+ __put_user(size, &za->head.size);
94
+TRANS_FEAT(ADCLT, aa64_sve2, do_adcl, a, true)
67
+ __put_user(vl, &za->vl);
95
68
+
96
static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
69
+ if (size == TARGET_ZA_SIG_CONTEXT_SIZE(0)) {
97
{
70
+ return;
98
@@ -XXX,XX +XXX,XX @@ static bool trans_FMMLA(DisasContext *s, arg_rrrr_esz *a)
71
+ }
72
+ assert(size == TARGET_ZA_SIG_CONTEXT_SIZE(vq));
73
+
74
+ /*
75
+ * Note that ZA vectors are stored as a byte stream,
76
+ * with each byte element at a subsequent address.
77
+ */
78
+ for (i = 0; i < vl; ++i) {
79
+ uint64_t *z = (void *)za + TARGET_ZA_SIG_ZAV_OFFSET(vq, i);
80
+ for (j = 0; j < vq * 2; ++j) {
81
+ __put_user_e(env->zarray[i].d[j], z + j, le);
82
+ }
83
+ }
84
+}
85
+
86
static void target_restore_general_frame(CPUARMState *env,
87
struct target_rt_sigframe *sf)
88
{
89
@@ -XXX,XX +XXX,XX @@ static void target_restore_fpsimd_record(CPUARMState *env,
90
91
static bool target_restore_sve_record(CPUARMState *env,
92
struct target_sve_context *sve,
93
- int size)
94
+ int size, int *svcr)
95
{
96
- int i, j, vl, vq;
97
+ int i, j, vl, vq, flags;
98
+ bool sm;
99
100
- if (!cpu_isar_feature(aa64_sve, env_archcpu(env))) {
101
+ __get_user(vl, &sve->vl);
102
+ __get_user(flags, &sve->flags);
103
+
104
+ sm = flags & TARGET_SVE_SIG_FLAG_SM;
105
+
106
+ /* The cpu must support Streaming or Non-streaming SVE. */
107
+ if (sm
108
+ ? !cpu_isar_feature(aa64_sme, env_archcpu(env))
109
+ : !cpu_isar_feature(aa64_sve, env_archcpu(env))) {
110
return false;
111
}
112
113
- __get_user(vl, &sve->vl);
114
- vq = sve_vq(env);
115
+ /*
116
+ * Note that we cannot use sve_vq() because that depends on the
117
+ * current setting of PSTATE.SM, not the state to be restored.
118
+ */
119
+ vq = sve_vqm1_for_el_sm(env, 0, sm) + 1;
120
121
/* Reject mismatched VL. */
122
if (vl != vq * TARGET_SVE_VQ_BYTES) {
123
@@ -XXX,XX +XXX,XX @@ static bool target_restore_sve_record(CPUARMState *env,
124
return false;
125
}
126
127
+ *svcr = FIELD_DP64(*svcr, SVCR, SM, sm);
128
+
129
/*
130
* Note that SVE regs are stored as a byte stream, with each byte element
131
* at a subsequent address. This corresponds to a little-endian load
132
@@ -XXX,XX +XXX,XX @@ static bool target_restore_sve_record(CPUARMState *env,
99
return true;
133
return true;
100
}
134
}
101
135
102
-static bool do_sqdmlal_zzzw(DisasContext *s, arg_rrrr_esz *a,
136
+static bool target_restore_za_record(CPUARMState *env,
103
- bool sel1, bool sel2)
137
+ struct target_za_context *za,
104
-{
138
+ int size, int *svcr)
105
- static gen_helper_gvec_4 * const fns[] = {
139
+{
106
- NULL, gen_helper_sve2_sqdmlal_zzzw_h,
140
+ int i, j, vl, vq;
107
- gen_helper_sve2_sqdmlal_zzzw_s, gen_helper_sve2_sqdmlal_zzzw_d,
141
+
108
- };
142
+ if (!cpu_isar_feature(aa64_sme, env_archcpu(env))) {
109
- return do_sve2_zzzz_ool(s, a, fns[a->esz], (sel2 << 1) | sel1);
143
+ return false;
110
-}
144
+ }
111
+static gen_helper_gvec_4 * const sqdmlal_zzzw_fns[] = {
145
+
112
+ NULL, gen_helper_sve2_sqdmlal_zzzw_h,
146
+ __get_user(vl, &za->vl);
113
+ gen_helper_sve2_sqdmlal_zzzw_s, gen_helper_sve2_sqdmlal_zzzw_d,
147
+ vq = sme_vq(env);
114
+};
148
+
115
+TRANS_FEAT(SQDMLALB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
149
+ /* Reject mismatched VL. */
116
+ sqdmlal_zzzw_fns[a->esz], a, 0)
150
+ if (vl != vq * TARGET_SVE_VQ_BYTES) {
117
+TRANS_FEAT(SQDMLALT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
151
+ return false;
118
+ sqdmlal_zzzw_fns[a->esz], a, 3)
152
+ }
119
+TRANS_FEAT(SQDMLALBT, aa64_sve2, gen_gvec_ool_arg_zzzz,
153
+
120
+ sqdmlal_zzzw_fns[a->esz], a, 2)
154
+ /* Accept empty record -- used to clear PSTATE.ZA. */
121
155
+ if (size <= TARGET_ZA_SIG_CONTEXT_SIZE(0)) {
122
-static bool do_sqdmlsl_zzzw(DisasContext *s, arg_rrrr_esz *a,
156
+ return true;
123
- bool sel1, bool sel2)
157
+ }
124
-{
158
+
125
- static gen_helper_gvec_4 * const fns[] = {
159
+ /* Reject non-empty but incomplete record. */
126
- NULL, gen_helper_sve2_sqdmlsl_zzzw_h,
160
+ if (size < TARGET_ZA_SIG_CONTEXT_SIZE(vq)) {
127
- gen_helper_sve2_sqdmlsl_zzzw_s, gen_helper_sve2_sqdmlsl_zzzw_d,
161
+ return false;
128
- };
162
+ }
129
- return do_sve2_zzzz_ool(s, a, fns[a->esz], (sel2 << 1) | sel1);
163
+
130
-}
164
+ *svcr = FIELD_DP64(*svcr, SVCR, ZA, 1);
131
+static gen_helper_gvec_4 * const sqdmlsl_zzzw_fns[] = {
165
+
132
+ NULL, gen_helper_sve2_sqdmlsl_zzzw_h,
166
+ for (i = 0; i < vl; ++i) {
133
+ gen_helper_sve2_sqdmlsl_zzzw_s, gen_helper_sve2_sqdmlsl_zzzw_d,
167
+ uint64_t *z = (void *)za + TARGET_ZA_SIG_ZAV_OFFSET(vq, i);
134
+};
168
+ for (j = 0; j < vq * 2; ++j) {
135
+TRANS_FEAT(SQDMLSLB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
169
+ __get_user_e(env->zarray[i].d[j], z + j, le);
136
+ sqdmlsl_zzzw_fns[a->esz], a, 0)
170
+ }
137
+TRANS_FEAT(SQDMLSLT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
171
+ }
138
+ sqdmlsl_zzzw_fns[a->esz], a, 3)
172
+ return true;
139
+TRANS_FEAT(SQDMLSLBT, aa64_sve2, gen_gvec_ool_arg_zzzz,
173
+}
140
+ sqdmlsl_zzzw_fns[a->esz], a, 2)
174
+
141
175
static int target_restore_sigframe(CPUARMState *env,
142
-static bool trans_SQDMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
176
struct target_rt_sigframe *sf)
143
-{
177
{
144
- return do_sqdmlal_zzzw(s, a, false, false);
178
struct target_aarch64_ctx *ctx, *extra = NULL;
145
-}
179
struct target_fpsimd_context *fpsimd = NULL;
146
+static gen_helper_gvec_4 * const sqrdmlah_fns[] = {
180
struct target_sve_context *sve = NULL;
147
+ gen_helper_sve2_sqrdmlah_b, gen_helper_sve2_sqrdmlah_h,
181
+ struct target_za_context *za = NULL;
148
+ gen_helper_sve2_sqrdmlah_s, gen_helper_sve2_sqrdmlah_d,
182
uint64_t extra_datap = 0;
149
+};
183
bool used_extra = false;
150
+TRANS_FEAT(SQRDMLAH_zzzz, aa64_sve2, gen_gvec_ool_arg_zzzz,
184
int sve_size = 0;
151
+ sqrdmlah_fns[a->esz], a, 0)
185
+ int za_size = 0;
152
186
+ int svcr = 0;
153
-static bool trans_SQDMLALT_zzzw(DisasContext *s, arg_rrrr_esz *a)
187
154
-{
188
target_restore_general_frame(env, sf);
155
- return do_sqdmlal_zzzw(s, a, true, true);
189
156
-}
190
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
157
+static gen_helper_gvec_4 * const sqrdmlsh_fns[] = {
191
sve_size = size;
158
+ gen_helper_sve2_sqrdmlsh_b, gen_helper_sve2_sqrdmlsh_h,
192
break;
159
+ gen_helper_sve2_sqrdmlsh_s, gen_helper_sve2_sqrdmlsh_d,
193
160
+};
194
+ case TARGET_ZA_MAGIC:
161
+TRANS_FEAT(SQRDMLSH_zzzz, aa64_sve2, gen_gvec_ool_arg_zzzz,
195
+ if (za || size < sizeof(struct target_za_context)) {
162
+ sqrdmlsh_fns[a->esz], a, 0)
196
+ goto err;
163
197
+ }
164
-static bool trans_SQDMLALBT(DisasContext *s, arg_rrrr_esz *a)
198
+ za = (struct target_za_context *)ctx;
165
-{
199
+ za_size = size;
166
- return do_sqdmlal_zzzw(s, a, false, true);
200
+ break;
167
-}
201
+
168
+static gen_helper_gvec_4 * const smlal_zzzw_fns[] = {
202
case TARGET_EXTRA_MAGIC:
169
+ NULL, gen_helper_sve2_smlal_zzzw_h,
203
if (extra || size != sizeof(struct target_extra_context)) {
170
+ gen_helper_sve2_smlal_zzzw_s, gen_helper_sve2_smlal_zzzw_d,
204
goto err;
171
+};
205
@@ -XXX,XX +XXX,XX @@ static int target_restore_sigframe(CPUARMState *env,
172
+TRANS_FEAT(SMLALB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
206
}
173
+ smlal_zzzw_fns[a->esz], a, 0)
207
174
+TRANS_FEAT(SMLALT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
208
/* SVE data, if present, overwrites FPSIMD data. */
175
+ smlal_zzzw_fns[a->esz], a, 1)
209
- if (sve && !target_restore_sve_record(env, sve, sve_size)) {
176
210
+ if (sve && !target_restore_sve_record(env, sve, sve_size, &svcr)) {
177
-static bool trans_SQDMLSLB_zzzw(DisasContext *s, arg_rrrr_esz *a)
211
goto err;
178
-{
212
}
179
- return do_sqdmlsl_zzzw(s, a, false, false);
213
+ if (za && !target_restore_za_record(env, za, za_size, &svcr)) {
180
-}
214
+ goto err;
181
+static gen_helper_gvec_4 * const umlal_zzzw_fns[] = {
215
+ }
182
+ NULL, gen_helper_sve2_umlal_zzzw_h,
216
+ if (env->svcr != svcr) {
183
+ gen_helper_sve2_umlal_zzzw_s, gen_helper_sve2_umlal_zzzw_d,
217
+ env->svcr = svcr;
184
+};
218
+ arm_rebuild_hflags(env);
185
+TRANS_FEAT(UMLALB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
219
+ }
186
+ umlal_zzzw_fns[a->esz], a, 0)
220
unlock_user(extra, extra_datap, 0);
187
+TRANS_FEAT(UMLALT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
221
return 0;
188
+ umlal_zzzw_fns[a->esz], a, 1)
222
189
223
@@ -XXX,XX +XXX,XX @@ static void target_setup_frame(int usig, struct target_sigaction *ka,
190
-static bool trans_SQDMLSLT_zzzw(DisasContext *s, arg_rrrr_esz *a)
224
.total_size = offsetof(struct target_rt_sigframe,
191
-{
225
uc.tuc_mcontext.__reserved),
192
- return do_sqdmlsl_zzzw(s, a, true, true);
226
};
193
-}
227
- int fpsimd_ofs, fr_ofs, sve_ofs = 0, vq = 0, sve_size = 0;
194
+static gen_helper_gvec_4 * const smlsl_zzzw_fns[] = {
228
+ int fpsimd_ofs, fr_ofs, sve_ofs = 0, za_ofs = 0;
195
+ NULL, gen_helper_sve2_smlsl_zzzw_h,
229
+ int sve_size = 0, za_size = 0;
196
+ gen_helper_sve2_smlsl_zzzw_s, gen_helper_sve2_smlsl_zzzw_d,
230
struct target_rt_sigframe *frame;
197
+};
231
struct target_rt_frame_record *fr;
198
+TRANS_FEAT(SMLSLB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
232
abi_ulong frame_addr, return_addr;
199
+ smlsl_zzzw_fns[a->esz], a, 0)
233
@@ -XXX,XX +XXX,XX @@ static void target_setup_frame(int usig, struct target_sigaction *ka,
200
+TRANS_FEAT(SMLSLT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
234
&layout);
201
+ smlsl_zzzw_fns[a->esz], a, 1)
235
202
236
/* SVE state needs saving only if it exists. */
203
-static bool trans_SQDMLSLBT(DisasContext *s, arg_rrrr_esz *a)
237
- if (cpu_isar_feature(aa64_sve, env_archcpu(env))) {
204
-{
238
- vq = sve_vq(env);
205
- return do_sqdmlsl_zzzw(s, a, false, true);
239
- sve_size = QEMU_ALIGN_UP(TARGET_SVE_SIG_CONTEXT_SIZE(vq), 16);
206
-}
240
+ if (cpu_isar_feature(aa64_sve, env_archcpu(env)) ||
207
-
241
+ cpu_isar_feature(aa64_sme, env_archcpu(env))) {
208
-static bool trans_SQRDMLAH_zzzz(DisasContext *s, arg_rrrr_esz *a)
242
+ sve_size = QEMU_ALIGN_UP(TARGET_SVE_SIG_CONTEXT_SIZE(sve_vq(env)), 16);
209
-{
243
sve_ofs = alloc_sigframe_space(sve_size, &layout);
210
- static gen_helper_gvec_4 * const fns[] = {
244
}
211
- gen_helper_sve2_sqrdmlah_b, gen_helper_sve2_sqrdmlah_h,
245
+ if (cpu_isar_feature(aa64_sme, env_archcpu(env))) {
212
- gen_helper_sve2_sqrdmlah_s, gen_helper_sve2_sqrdmlah_d,
246
+ /* ZA state needs saving only if it is enabled. */
213
- };
247
+ if (FIELD_EX64(env->svcr, SVCR, ZA)) {
214
- return do_sve2_zzzz_ool(s, a, fns[a->esz], 0);
248
+ za_size = TARGET_ZA_SIG_CONTEXT_SIZE(sme_vq(env));
215
-}
249
+ } else {
216
-
250
+ za_size = TARGET_ZA_SIG_CONTEXT_SIZE(0);
217
-static bool trans_SQRDMLSH_zzzz(DisasContext *s, arg_rrrr_esz *a)
251
+ }
218
-{
252
+ za_ofs = alloc_sigframe_space(za_size, &layout);
219
- static gen_helper_gvec_4 * const fns[] = {
253
+ }
220
- gen_helper_sve2_sqrdmlsh_b, gen_helper_sve2_sqrdmlsh_h,
254
221
- gen_helper_sve2_sqrdmlsh_s, gen_helper_sve2_sqrdmlsh_d,
255
if (layout.extra_ofs) {
222
- };
256
/* Reserve space for the extra end marker. The standard end marker
223
- return do_sve2_zzzz_ool(s, a, fns[a->esz], 0);
257
@@ -XXX,XX +XXX,XX @@ static void target_setup_frame(int usig, struct target_sigaction *ka,
224
-}
258
target_setup_end_record((void *)frame + layout.extra_end_ofs);
225
-
259
}
226
-static bool do_smlal_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
260
if (sve_ofs) {
227
-{
261
- target_setup_sve_record((void *)frame + sve_ofs, env, vq, sve_size);
228
- static gen_helper_gvec_4 * const fns[] = {
262
+ target_setup_sve_record((void *)frame + sve_ofs, env, sve_size);
229
- NULL, gen_helper_sve2_smlal_zzzw_h,
263
+ }
230
- gen_helper_sve2_smlal_zzzw_s, gen_helper_sve2_smlal_zzzw_d,
264
+ if (za_ofs) {
231
- };
265
+ target_setup_za_record((void *)frame + za_ofs, env, za_size);
232
- return do_sve2_zzzz_ool(s, a, fns[a->esz], sel);
266
}
233
-}
267
234
-
268
/* Set up the stack frame for unwinding. */
235
-static bool trans_SMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
269
@@ -XXX,XX +XXX,XX @@ static void target_setup_frame(int usig, struct target_sigaction *ka,
236
-{
270
env->btype = 2;
237
- return do_smlal_zzzw(s, a, false);
271
}
238
-}
272
239
-
273
+ /*
240
-static bool trans_SMLALT_zzzw(DisasContext *s, arg_rrrr_esz *a)
274
+ * Invoke the signal handler with both SM and ZA disabled.
241
-{
275
+ * When clearing SM, ResetSVEState, per SMSTOP.
242
- return do_smlal_zzzw(s, a, true);
276
+ */
243
-}
277
+ if (FIELD_EX64(env->svcr, SVCR, SM)) {
244
-
278
+ arm_reset_sve_state(env);
245
-static bool do_umlal_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
279
+ }
246
-{
280
+ if (env->svcr) {
247
- static gen_helper_gvec_4 * const fns[] = {
281
+ env->svcr = 0;
248
- NULL, gen_helper_sve2_umlal_zzzw_h,
282
+ arm_rebuild_hflags(env);
249
- gen_helper_sve2_umlal_zzzw_s, gen_helper_sve2_umlal_zzzw_d,
283
+ }
250
- };
284
+
251
- return do_sve2_zzzz_ool(s, a, fns[a->esz], sel);
285
if (info) {
252
-}
286
tswap_siginfo(&frame->info, info);
253
-
287
env->xregs[1] = frame_addr + offsetof(struct target_rt_sigframe, info);
254
-static bool trans_UMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
255
-{
256
- return do_umlal_zzzw(s, a, false);
257
-}
258
-
259
-static bool trans_UMLALT_zzzw(DisasContext *s, arg_rrrr_esz *a)
260
-{
261
- return do_umlal_zzzw(s, a, true);
262
-}
263
-
264
-static bool do_smlsl_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
265
-{
266
- static gen_helper_gvec_4 * const fns[] = {
267
- NULL, gen_helper_sve2_smlsl_zzzw_h,
268
- gen_helper_sve2_smlsl_zzzw_s, gen_helper_sve2_smlsl_zzzw_d,
269
- };
270
- return do_sve2_zzzz_ool(s, a, fns[a->esz], sel);
271
-}
272
-
273
-static bool trans_SMLSLB_zzzw(DisasContext *s, arg_rrrr_esz *a)
274
-{
275
- return do_smlsl_zzzw(s, a, false);
276
-}
277
-
278
-static bool trans_SMLSLT_zzzw(DisasContext *s, arg_rrrr_esz *a)
279
-{
280
- return do_smlsl_zzzw(s, a, true);
281
-}
282
-
283
-static bool do_umlsl_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
284
-{
285
- static gen_helper_gvec_4 * const fns[] = {
286
- NULL, gen_helper_sve2_umlsl_zzzw_h,
287
- gen_helper_sve2_umlsl_zzzw_s, gen_helper_sve2_umlsl_zzzw_d,
288
- };
289
- return do_sve2_zzzz_ool(s, a, fns[a->esz], sel);
290
-}
291
-
292
-static bool trans_UMLSLB_zzzw(DisasContext *s, arg_rrrr_esz *a)
293
-{
294
- return do_umlsl_zzzw(s, a, false);
295
-}
296
-
297
-static bool trans_UMLSLT_zzzw(DisasContext *s, arg_rrrr_esz *a)
298
-{
299
- return do_umlsl_zzzw(s, a, true);
300
-}
301
+static gen_helper_gvec_4 * const umlsl_zzzw_fns[] = {
302
+ NULL, gen_helper_sve2_umlsl_zzzw_h,
303
+ gen_helper_sve2_umlsl_zzzw_s, gen_helper_sve2_umlsl_zzzw_d,
304
+};
305
+TRANS_FEAT(UMLSLB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
306
+ umlsl_zzzw_fns[a->esz], a, 0)
307
+TRANS_FEAT(UMLSLT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
308
+ umlsl_zzzw_fns[a->esz], a, 1)
309
310
static gen_helper_gvec_4 * const cmla_fns[] = {
311
gen_helper_sve2_cmla_zzzz_b, gen_helper_sve2_cmla_zzzz_h,
312
--
288
--
313
2.25.1
289
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Add "sve" to the sve prctl functions, to distinguish
4
them from the coming "sme" prctls with similar names.
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-82-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-42-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
10
---
8
target/arm/translate-sve.c | 5 +----
11
linux-user/aarch64/target_prctl.h | 8 ++++----
9
1 file changed, 1 insertion(+), 4 deletions(-)
12
linux-user/syscall.c | 12 ++++++------
13
2 files changed, 10 insertions(+), 10 deletions(-)
10
14
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/linux-user/aarch64/target_prctl.h b/linux-user/aarch64/target_prctl.h
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
17
--- a/linux-user/aarch64/target_prctl.h
14
+++ b/target/arm/translate-sve.c
18
+++ b/linux-user/aarch64/target_prctl.h
15
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_4 * const udiv_fns[4] = {
19
@@ -XXX,XX +XXX,XX @@
16
};
20
#ifndef AARCH64_TARGET_PRCTL_H
17
TRANS_FEAT(UDIV_zpzz, aa64_sve, gen_gvec_ool_arg_zpzz, udiv_fns[a->esz], a, 0)
21
#define AARCH64_TARGET_PRCTL_H
18
22
19
-static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
23
-static abi_long do_prctl_get_vl(CPUArchState *env)
20
-{
24
+static abi_long do_prctl_sve_get_vl(CPUArchState *env)
21
- return do_sel_z(s, a->rd, a->rn, a->rm, a->pg, a->esz);
25
{
22
-}
26
ARMCPU *cpu = env_archcpu(env);
23
+TRANS_FEAT(SEL_zpzz, aa64_sve, do_sel_z, a->rd, a->rn, a->rm, a->pg, a->esz)
27
if (cpu_isar_feature(aa64_sve, cpu)) {
24
28
@@ -XXX,XX +XXX,XX @@ static abi_long do_prctl_get_vl(CPUArchState *env)
25
/*
29
}
26
*** SVE Integer Arithmetic - Unary Predicated Group
30
return -TARGET_EINVAL;
31
}
32
-#define do_prctl_get_vl do_prctl_get_vl
33
+#define do_prctl_sve_get_vl do_prctl_sve_get_vl
34
35
-static abi_long do_prctl_set_vl(CPUArchState *env, abi_long arg2)
36
+static abi_long do_prctl_sve_set_vl(CPUArchState *env, abi_long arg2)
37
{
38
/*
39
* We cannot support either PR_SVE_SET_VL_ONEXEC or PR_SVE_VL_INHERIT.
40
@@ -XXX,XX +XXX,XX @@ static abi_long do_prctl_set_vl(CPUArchState *env, abi_long arg2)
41
}
42
return -TARGET_EINVAL;
43
}
44
-#define do_prctl_set_vl do_prctl_set_vl
45
+#define do_prctl_sve_set_vl do_prctl_sve_set_vl
46
47
static abi_long do_prctl_reset_keys(CPUArchState *env, abi_long arg2)
48
{
49
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
50
index XXXXXXX..XXXXXXX 100644
51
--- a/linux-user/syscall.c
52
+++ b/linux-user/syscall.c
53
@@ -XXX,XX +XXX,XX @@ static abi_long do_prctl_inval1(CPUArchState *env, abi_long arg2)
54
#ifndef do_prctl_set_fp_mode
55
#define do_prctl_set_fp_mode do_prctl_inval1
56
#endif
57
-#ifndef do_prctl_get_vl
58
-#define do_prctl_get_vl do_prctl_inval0
59
+#ifndef do_prctl_sve_get_vl
60
+#define do_prctl_sve_get_vl do_prctl_inval0
61
#endif
62
-#ifndef do_prctl_set_vl
63
-#define do_prctl_set_vl do_prctl_inval1
64
+#ifndef do_prctl_sve_set_vl
65
+#define do_prctl_sve_set_vl do_prctl_inval1
66
#endif
67
#ifndef do_prctl_reset_keys
68
#define do_prctl_reset_keys do_prctl_inval1
69
@@ -XXX,XX +XXX,XX @@ static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2,
70
case PR_SET_FP_MODE:
71
return do_prctl_set_fp_mode(env, arg2);
72
case PR_SVE_GET_VL:
73
- return do_prctl_get_vl(env);
74
+ return do_prctl_sve_get_vl(env);
75
case PR_SVE_SET_VL:
76
- return do_prctl_set_vl(env, arg2);
77
+ return do_prctl_sve_set_vl(env, arg2);
78
case PR_PAC_RESET_KEYS:
79
if (arg3 || arg4 || arg5) {
80
return -TARGET_EINVAL;
27
--
81
--
28
2.25.1
82
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
This alias is defined on EOR (prediates). While the
3
These prctl set the Streaming SVE vector length, which may
4
same operation could be performed with NAND or NOR,
4
be completely different from the Normal SVE vector length.
5
only bother with the official alias.
6
5
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-81-richard.henderson@linaro.org
8
Message-id: 20220708151540.18136-43-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
10
---
12
target/arm/translate-sve.c | 5 +++++
11
linux-user/aarch64/target_prctl.h | 54 +++++++++++++++++++++++++++++++
13
1 file changed, 5 insertions(+)
12
linux-user/syscall.c | 16 +++++++++
13
2 files changed, 70 insertions(+)
14
14
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/linux-user/aarch64/target_prctl.h b/linux-user/aarch64/target_prctl.h
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
17
--- a/linux-user/aarch64/target_prctl.h
18
+++ b/target/arm/translate-sve.c
18
+++ b/linux-user/aarch64/target_prctl.h
19
@@ -XXX,XX +XXX,XX @@ static bool trans_EOR_pppp(DisasContext *s, arg_rprr_s *a)
19
@@ -XXX,XX +XXX,XX @@ static abi_long do_prctl_sve_get_vl(CPUArchState *env)
20
.fno = gen_helper_sve_eor_pppp,
20
{
21
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
21
ARMCPU *cpu = env_archcpu(env);
22
};
22
if (cpu_isar_feature(aa64_sve, cpu)) {
23
+ /* PSTATE.SM is always unset on syscall entry. */
24
return sve_vq(env) * 16;
25
}
26
return -TARGET_EINVAL;
27
@@ -XXX,XX +XXX,XX @@ static abi_long do_prctl_sve_set_vl(CPUArchState *env, abi_long arg2)
28
&& arg2 >= 0 && arg2 <= 512 * 16 && !(arg2 & 15)) {
29
uint32_t vq, old_vq;
30
31
+ /* PSTATE.SM is always unset on syscall entry. */
32
old_vq = sve_vq(env);
33
34
/*
35
@@ -XXX,XX +XXX,XX @@ static abi_long do_prctl_sve_set_vl(CPUArchState *env, abi_long arg2)
36
}
37
#define do_prctl_sve_set_vl do_prctl_sve_set_vl
38
39
+static abi_long do_prctl_sme_get_vl(CPUArchState *env)
40
+{
41
+ ARMCPU *cpu = env_archcpu(env);
42
+ if (cpu_isar_feature(aa64_sme, cpu)) {
43
+ return sme_vq(env) * 16;
44
+ }
45
+ return -TARGET_EINVAL;
46
+}
47
+#define do_prctl_sme_get_vl do_prctl_sme_get_vl
23
+
48
+
24
+ /* Alias NOT (predicate) is EOR Pd.B, Pg/Z, Pn.B, Pg.B */
49
+static abi_long do_prctl_sme_set_vl(CPUArchState *env, abi_long arg2)
25
+ if (!a->s && a->pg == a->rm) {
50
+{
26
+ return gen_gvec_fn_ppp(s, tcg_gen_gvec_andc, a->rd, a->pg, a->rn);
51
+ /*
52
+ * We cannot support either PR_SME_SET_VL_ONEXEC or PR_SME_VL_INHERIT.
53
+ * Note the kernel definition of sve_vl_valid allows for VQ=512,
54
+ * i.e. VL=8192, even though the architectural maximum is VQ=16.
55
+ */
56
+ if (cpu_isar_feature(aa64_sme, env_archcpu(env))
57
+ && arg2 >= 0 && arg2 <= 512 * 16 && !(arg2 & 15)) {
58
+ int vq, old_vq;
59
+
60
+ old_vq = sme_vq(env);
61
+
62
+ /*
63
+ * Bound the value of vq, so that we know that it fits into
64
+ * the 4-bit field in SMCR_EL1. Because PSTATE.SM is cleared
65
+ * on syscall entry, we are not modifying the current SVE
66
+ * vector length.
67
+ */
68
+ vq = MAX(arg2 / 16, 1);
69
+ vq = MIN(vq, 16);
70
+ env->vfp.smcr_el[1] =
71
+ FIELD_DP64(env->vfp.smcr_el[1], SMCR, LEN, vq - 1);
72
+
73
+ /* Delay rebuilding hflags until we know if ZA must change. */
74
+ vq = sve_vqm1_for_el_sm(env, 0, true) + 1;
75
+
76
+ if (vq != old_vq) {
77
+ /*
78
+ * PSTATE.ZA state is cleared on any change to SVL.
79
+ * We need not call arm_rebuild_hflags because PSTATE.SM was
80
+ * cleared on syscall entry, so this hasn't changed VL.
81
+ */
82
+ env->svcr = FIELD_DP64(env->svcr, SVCR, ZA, 0);
83
+ arm_rebuild_hflags(env);
84
+ }
85
+ return vq * 16;
27
+ }
86
+ }
28
return do_pppp_flags(s, a, &op);
87
+ return -TARGET_EINVAL;
29
}
88
+}
30
89
+#define do_prctl_sme_set_vl do_prctl_sme_set_vl
90
+
91
static abi_long do_prctl_reset_keys(CPUArchState *env, abi_long arg2)
92
{
93
ARMCPU *cpu = env_archcpu(env);
94
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
95
index XXXXXXX..XXXXXXX 100644
96
--- a/linux-user/syscall.c
97
+++ b/linux-user/syscall.c
98
@@ -XXX,XX +XXX,XX @@ abi_long do_arch_prctl(CPUX86State *env, int code, abi_ulong addr)
99
#ifndef PR_SET_SYSCALL_USER_DISPATCH
100
# define PR_SET_SYSCALL_USER_DISPATCH 59
101
#endif
102
+#ifndef PR_SME_SET_VL
103
+# define PR_SME_SET_VL 63
104
+# define PR_SME_GET_VL 64
105
+# define PR_SME_VL_LEN_MASK 0xffff
106
+# define PR_SME_VL_INHERIT (1 << 17)
107
+#endif
108
109
#include "target_prctl.h"
110
111
@@ -XXX,XX +XXX,XX @@ static abi_long do_prctl_inval1(CPUArchState *env, abi_long arg2)
112
#ifndef do_prctl_set_unalign
113
#define do_prctl_set_unalign do_prctl_inval1
114
#endif
115
+#ifndef do_prctl_sme_get_vl
116
+#define do_prctl_sme_get_vl do_prctl_inval0
117
+#endif
118
+#ifndef do_prctl_sme_set_vl
119
+#define do_prctl_sme_set_vl do_prctl_inval1
120
+#endif
121
122
static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2,
123
abi_long arg3, abi_long arg4, abi_long arg5)
124
@@ -XXX,XX +XXX,XX @@ static abi_long do_prctl(CPUArchState *env, abi_long option, abi_long arg2,
125
return do_prctl_sve_get_vl(env);
126
case PR_SVE_SET_VL:
127
return do_prctl_sve_set_vl(env, arg2);
128
+ case PR_SME_GET_VL:
129
+ return do_prctl_sme_get_vl(env);
130
+ case PR_SME_SET_VL:
131
+ return do_prctl_sme_set_vl(env, arg2);
132
case PR_PAC_RESET_KEYS:
133
if (arg3 || arg4 || arg5) {
134
return -TARGET_EINVAL;
31
--
135
--
32
2.25.1
136
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Combined with the check already present in gen_mov_p,
3
There's no reason to set CPACR_EL1.ZEN if SVE disabled.
4
we can simplify some special cases in trans_AND_pppp
5
and trans_BIC_pppp.
6
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-80-richard.henderson@linaro.org
7
Message-id: 20220708151540.18136-44-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
9
---
12
target/arm/translate-sve.c | 30 ++++++++++++------------------
10
target/arm/cpu.c | 7 +++----
13
1 file changed, 12 insertions(+), 18 deletions(-)
11
1 file changed, 3 insertions(+), 4 deletions(-)
14
12
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
15
--- a/target/arm/cpu.c
18
+++ b/target/arm/translate-sve.c
16
+++ b/target/arm/cpu.c
19
@@ -XXX,XX +XXX,XX @@ static void do_dupi_z(DisasContext *s, int rd, uint64_t word)
17
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(DeviceState *dev)
20
}
18
/* and to the FP/Neon instructions */
21
19
env->cp15.cpacr_el1 = FIELD_DP64(env->cp15.cpacr_el1,
22
/* Invoke a vector expander on three Pregs. */
20
CPACR_EL1, FPEN, 3);
23
-static void gen_gvec_fn_ppp(DisasContext *s, GVecGen3Fn *gvec_fn,
21
- /* and to the SVE instructions */
24
+static bool gen_gvec_fn_ppp(DisasContext *s, GVecGen3Fn *gvec_fn,
22
- env->cp15.cpacr_el1 = FIELD_DP64(env->cp15.cpacr_el1,
25
int rd, int rn, int rm)
23
- CPACR_EL1, ZEN, 3);
26
{
24
- /* with reasonable vector length */
27
- unsigned psz = pred_gvec_reg_size(s);
25
+ /* and to the SVE instructions, with default vector length */
28
- gvec_fn(MO_64, pred_full_reg_offset(s, rd),
26
if (cpu_isar_feature(aa64_sve, cpu)) {
29
- pred_full_reg_offset(s, rn),
27
+ env->cp15.cpacr_el1 = FIELD_DP64(env->cp15.cpacr_el1,
30
- pred_full_reg_offset(s, rm), psz, psz);
28
+ CPACR_EL1, ZEN, 3);
31
+ if (sve_access_check(s)) {
29
env->vfp.zcr_el[1] = cpu->sve_default_vq - 1;
32
+ unsigned psz = pred_gvec_reg_size(s);
33
+ gvec_fn(MO_64, pred_full_reg_offset(s, rd),
34
+ pred_full_reg_offset(s, rn),
35
+ pred_full_reg_offset(s, rm), psz, psz);
36
+ }
37
+ return true;
38
}
39
40
/* Invoke a vector move on two Pregs. */
41
@@ -XXX,XX +XXX,XX @@ static bool trans_AND_pppp(DisasContext *s, arg_rprr_s *a)
42
};
43
44
if (!a->s) {
45
- if (!sve_access_check(s)) {
46
- return true;
47
- }
48
if (a->rn == a->rm) {
49
if (a->pg == a->rn) {
50
- do_mov_p(s, a->rd, a->rn);
51
- } else {
52
- gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->pg);
53
+ return do_mov_p(s, a->rd, a->rn);
54
}
55
- return true;
56
+ return gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->pg);
57
} else if (a->pg == a->rn || a->pg == a->rm) {
58
- gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->rm);
59
- return true;
60
+ return gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->rm);
61
}
30
}
62
}
31
/*
63
return do_pppp_flags(s, a, &op);
64
@@ -XXX,XX +XXX,XX @@ static bool trans_BIC_pppp(DisasContext *s, arg_rprr_s *a)
65
};
66
67
if (!a->s && a->pg == a->rn) {
68
- if (sve_access_check(s)) {
69
- gen_gvec_fn_ppp(s, tcg_gen_gvec_andc, a->rd, a->rn, a->rm);
70
- }
71
- return true;
72
+ return gen_gvec_fn_ppp(s, tcg_gen_gvec_andc, a->rd, a->rn, a->rm);
73
}
74
return do_pppp_flags(s, a, &op);
75
}
76
--
32
--
77
2.25.1
33
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
Steal the idea for these leaf function expanders from PowerPC.
3
Enable SME, TPIDR2_EL0, and FA64 if supported by the cpu.
4
4
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-2-richard.henderson@linaro.org
7
Message-id: 20220708151540.18136-45-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
9
---
10
target/arm/translate.h | 11 +++++++++++
10
target/arm/cpu.c | 11 +++++++++++
11
1 file changed, 11 insertions(+)
11
1 file changed, 11 insertions(+)
12
12
13
diff --git a/target/arm/translate.h b/target/arm/translate.h
13
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate.h
15
--- a/target/arm/cpu.c
16
+++ b/target/arm/translate.h
16
+++ b/target/arm/cpu.c
17
@@ -XXX,XX +XXX,XX @@ static inline MemOp finalize_memop(DisasContext *s, MemOp opc)
17
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_reset(DeviceState *dev)
18
*/
18
CPACR_EL1, ZEN, 3);
19
uint64_t asimd_imm_const(uint32_t imm, int cmode, int op);
19
env->vfp.zcr_el[1] = cpu->sve_default_vq - 1;
20
20
}
21
+/*
21
+ /* and for SME instructions, with default vector length, and TPIDR2 */
22
+ * Helpers for implementing sets of trans_* functions.
22
+ if (cpu_isar_feature(aa64_sme, cpu)) {
23
+ * Defer the implementation of NAME to FUNC, with optional extra arguments.
23
+ env->cp15.sctlr_el[1] |= SCTLR_EnTP2;
24
+ */
24
+ env->cp15.cpacr_el1 = FIELD_DP64(env->cp15.cpacr_el1,
25
+#define TRANS(NAME, FUNC, ...) \
25
+ CPACR_EL1, SMEN, 3);
26
+ static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
26
+ env->vfp.smcr_el[1] = cpu->sme_default_vq - 1;
27
+ { return FUNC(s, __VA_ARGS__); }
27
+ if (cpu_isar_feature(aa64_sme_fa64, cpu)) {
28
+#define TRANS_FEAT(NAME, FEAT, FUNC, ...) \
28
+ env->vfp.smcr_el[1] = FIELD_DP64(env->vfp.smcr_el[1],
29
+ static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
29
+ SMCR, FA64, 1);
30
+ { return dc_isar_feature(FEAT, s) && FUNC(s, __VA_ARGS__); }
30
+ }
31
+
31
+ }
32
#endif /* TARGET_ARM_TRANSLATE_H */
32
/*
33
* Enable 48-bit address space (TODO: take reserved_va into account).
34
* Enable TBI0 but not TBI1.
33
--
35
--
34
2.25.1
36
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-3-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 36 +++++++++++++++---------------------
9
1 file changed, 15 insertions(+), 21 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static int pred_gvec_reg_size(DisasContext *s)
16
}
17
18
/* Invoke an out-of-line helper on 2 Zregs. */
19
-static void gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
20
+static bool gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
21
int rd, int rn, int data)
22
{
23
- unsigned vsz = vec_full_reg_size(s);
24
- tcg_gen_gvec_2_ool(vec_full_reg_offset(s, rd),
25
- vec_full_reg_offset(s, rn),
26
- vsz, vsz, data, fn);
27
+ if (fn == NULL) {
28
+ return false;
29
+ }
30
+ if (sve_access_check(s)) {
31
+ unsigned vsz = vec_full_reg_size(s);
32
+ tcg_gen_gvec_2_ool(vec_full_reg_offset(s, rd),
33
+ vec_full_reg_offset(s, rn),
34
+ vsz, vsz, data, fn);
35
+ }
36
+ return true;
37
}
38
39
/* Invoke an out-of-line helper on 3 Zregs. */
40
@@ -XXX,XX +XXX,XX @@ static bool trans_FEXPA(DisasContext *s, arg_rr_esz *a)
41
gen_helper_sve_fexpa_s,
42
gen_helper_sve_fexpa_d,
43
};
44
- if (a->esz == 0) {
45
- return false;
46
- }
47
- if (sve_access_check(s)) {
48
- gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
49
- }
50
- return true;
51
+ return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
52
}
53
54
static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
55
@@ -XXX,XX +XXX,XX @@ static bool trans_REV_v(DisasContext *s, arg_rr_esz *a)
56
gen_helper_sve_rev_b, gen_helper_sve_rev_h,
57
gen_helper_sve_rev_s, gen_helper_sve_rev_d
58
};
59
-
60
- if (sve_access_check(s)) {
61
- gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
62
- }
63
- return true;
64
+ return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
65
}
66
67
static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
68
@@ -XXX,XX +XXX,XX @@ static bool trans_AESMC(DisasContext *s, arg_AESMC *a)
69
if (!dc_isar_feature(aa64_sve2_aes, s)) {
70
return false;
71
}
72
- if (sve_access_check(s)) {
73
- gen_gvec_ool_zz(s, gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt);
74
- }
75
- return true;
76
+ return gen_gvec_ool_zz(s, gen_helper_crypto_aesmc,
77
+ a->rd, a->rd, a->decrypt);
78
}
79
80
static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
81
--
82
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using gen_gvec_ool_zz to TRANS_FEAT.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-4-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate-sve.c | 39 +++++++++++++-------------------------
11
1 file changed, 13 insertions(+), 26 deletions(-)
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static bool trans_ADR_u32(DisasContext *s, arg_rrri *a)
18
*** SVE Integer Misc - Unpredicated Group
19
*/
20
21
-static bool trans_FEXPA(DisasContext *s, arg_rr_esz *a)
22
-{
23
- static gen_helper_gvec_2 * const fns[4] = {
24
- NULL,
25
- gen_helper_sve_fexpa_h,
26
- gen_helper_sve_fexpa_s,
27
- gen_helper_sve_fexpa_d,
28
- };
29
- return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
30
-}
31
+static gen_helper_gvec_2 * const fexpa_fns[4] = {
32
+ NULL, gen_helper_sve_fexpa_h,
33
+ gen_helper_sve_fexpa_s, gen_helper_sve_fexpa_d,
34
+};
35
+TRANS_FEAT(FEXPA, aa64_sve, gen_gvec_ool_zz,
36
+ fexpa_fns[a->esz], a->rd, a->rn, 0)
37
38
static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
39
{
40
@@ -XXX,XX +XXX,XX @@ static bool trans_INSR_r(DisasContext *s, arg_rrr_esz *a)
41
return true;
42
}
43
44
-static bool trans_REV_v(DisasContext *s, arg_rr_esz *a)
45
-{
46
- static gen_helper_gvec_2 * const fns[4] = {
47
- gen_helper_sve_rev_b, gen_helper_sve_rev_h,
48
- gen_helper_sve_rev_s, gen_helper_sve_rev_d
49
- };
50
- return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
51
-}
52
+static gen_helper_gvec_2 * const rev_fns[4] = {
53
+ gen_helper_sve_rev_b, gen_helper_sve_rev_h,
54
+ gen_helper_sve_rev_s, gen_helper_sve_rev_d
55
+};
56
+TRANS_FEAT(REV_v, aa64_sve, gen_gvec_ool_zz, rev_fns[a->esz], a->rd, a->rn, 0)
57
58
static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
59
{
60
@@ -XXX,XX +XXX,XX @@ static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
61
return true;
62
}
63
64
-static bool trans_AESMC(DisasContext *s, arg_AESMC *a)
65
-{
66
- if (!dc_isar_feature(aa64_sve2_aes, s)) {
67
- return false;
68
- }
69
- return gen_gvec_ool_zz(s, gen_helper_crypto_aesmc,
70
- a->rd, a->rd, a->decrypt);
71
-}
72
+TRANS_FEAT(AESMC, aa64_sve2_aes, gen_gvec_ool_zz,
73
+ gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt)
74
75
static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
76
{
77
--
78
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using
4
gen_gvec_ool_arg_zzz to TRANS_FEAT.
5
6
Remove trivial wrappers do_aese, do_sm4.
7
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20220527181907.189259-7-richard.henderson@linaro.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
13
target/arm/translate-sve.c | 165 ++++++++++---------------------------
14
1 file changed, 45 insertions(+), 120 deletions(-)
15
16
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate-sve.c
19
+++ b/target/arm/translate-sve.c
20
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zzi(DisasContext *s, arg_rri_esz *a)
21
}
22
23
#define DO_ZZW(NAME, name) \
24
-static bool trans_##NAME##_zzw(DisasContext *s, arg_rrr_esz *a) \
25
-{ \
26
- static gen_helper_gvec_3 * const fns[4] = { \
27
+ static gen_helper_gvec_3 * const name##_zzw_fns[4] = { \
28
gen_helper_sve_##name##_zzw_b, gen_helper_sve_##name##_zzw_h, \
29
gen_helper_sve_##name##_zzw_s, NULL \
30
}; \
31
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0); \
32
-}
33
+ TRANS_FEAT(NAME, aa64_sve, gen_gvec_ool_arg_zzz, \
34
+ name##_zzw_fns[a->esz], a, 0)
35
36
-DO_ZZW(ASR, asr)
37
-DO_ZZW(LSR, lsr)
38
-DO_ZZW(LSL, lsl)
39
+DO_ZZW(ASR_zzw, asr)
40
+DO_ZZW(LSR_zzw, lsr)
41
+DO_ZZW(LSL_zzw, lsl)
42
43
#undef DO_ZZW
44
45
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2 * const fexpa_fns[4] = {
46
TRANS_FEAT(FEXPA, aa64_sve, gen_gvec_ool_zz,
47
fexpa_fns[a->esz], a->rd, a->rn, 0)
48
49
-static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
50
-{
51
- static gen_helper_gvec_3 * const fns[4] = {
52
- NULL,
53
- gen_helper_sve_ftssel_h,
54
- gen_helper_sve_ftssel_s,
55
- gen_helper_sve_ftssel_d,
56
- };
57
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
58
-}
59
+static gen_helper_gvec_3 * const ftssel_fns[4] = {
60
+ NULL, gen_helper_sve_ftssel_h,
61
+ gen_helper_sve_ftssel_s, gen_helper_sve_ftssel_d,
62
+};
63
+TRANS_FEAT(FTSSEL, aa64_sve, gen_gvec_ool_arg_zzz, ftssel_fns[a->esz], a, 0)
64
65
/*
66
*** SVE Predicate Logical Operations Group
67
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2 * const rev_fns[4] = {
68
};
69
TRANS_FEAT(REV_v, aa64_sve, gen_gvec_ool_zz, rev_fns[a->esz], a->rd, a->rn, 0)
70
71
-static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
72
-{
73
- static gen_helper_gvec_3 * const fns[4] = {
74
- gen_helper_sve_tbl_b, gen_helper_sve_tbl_h,
75
- gen_helper_sve_tbl_s, gen_helper_sve_tbl_d
76
- };
77
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
78
-}
79
+static gen_helper_gvec_3 * const sve_tbl_fns[4] = {
80
+ gen_helper_sve_tbl_b, gen_helper_sve_tbl_h,
81
+ gen_helper_sve_tbl_s, gen_helper_sve_tbl_d
82
+};
83
+TRANS_FEAT(TBL, aa64_sve, gen_gvec_ool_arg_zzz, sve_tbl_fns[a->esz], a, 0)
84
85
static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
86
{
87
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
88
return true;
89
}
90
91
-static bool trans_TBX(DisasContext *s, arg_rrr_esz *a)
92
-{
93
- static gen_helper_gvec_3 * const fns[4] = {
94
- gen_helper_sve2_tbx_b, gen_helper_sve2_tbx_h,
95
- gen_helper_sve2_tbx_s, gen_helper_sve2_tbx_d
96
- };
97
-
98
- if (!dc_isar_feature(aa64_sve2, s)) {
99
- return false;
100
- }
101
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
102
-}
103
+static gen_helper_gvec_3 * const tbx_fns[4] = {
104
+ gen_helper_sve2_tbx_b, gen_helper_sve2_tbx_h,
105
+ gen_helper_sve2_tbx_s, gen_helper_sve2_tbx_d
106
+};
107
+TRANS_FEAT(TBX, aa64_sve2, gen_gvec_ool_arg_zzz, tbx_fns[a->esz], a, 0)
108
109
static bool trans_UNPK(DisasContext *s, arg_UNPK *a)
110
{
111
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const uzp_fns[4] = {
112
gen_helper_sve_uzp_s, gen_helper_sve_uzp_d,
113
};
114
115
-static bool trans_UZP1_z(DisasContext *s, arg_rrr_esz *a)
116
-{
117
- return gen_gvec_ool_arg_zzz(s, uzp_fns[a->esz], a, 0);
118
-}
119
+TRANS_FEAT(UZP1_z, aa64_sve, gen_gvec_ool_arg_zzz,
120
+ uzp_fns[a->esz], a, 0)
121
+TRANS_FEAT(UZP2_z, aa64_sve, gen_gvec_ool_arg_zzz,
122
+ uzp_fns[a->esz], a, 1 << a->esz)
123
124
-static bool trans_UZP2_z(DisasContext *s, arg_rrr_esz *a)
125
-{
126
- return gen_gvec_ool_arg_zzz(s, uzp_fns[a->esz], a, 1 << a->esz);
127
-}
128
-
129
-static bool trans_UZP1_q(DisasContext *s, arg_rrr_esz *a)
130
-{
131
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
132
- return false;
133
- }
134
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_uzp_q, a, 0);
135
-}
136
-
137
-static bool trans_UZP2_q(DisasContext *s, arg_rrr_esz *a)
138
-{
139
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
140
- return false;
141
- }
142
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_uzp_q, a, 16);
143
-}
144
+TRANS_FEAT(UZP1_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
145
+ gen_helper_sve2_uzp_q, a, 0)
146
+TRANS_FEAT(UZP2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
147
+ gen_helper_sve2_uzp_q, a, 16)
148
149
static gen_helper_gvec_3 * const trn_fns[4] = {
150
gen_helper_sve_trn_b, gen_helper_sve_trn_h,
151
gen_helper_sve_trn_s, gen_helper_sve_trn_d,
152
};
153
154
-static bool trans_TRN1_z(DisasContext *s, arg_rrr_esz *a)
155
-{
156
- return gen_gvec_ool_arg_zzz(s, trn_fns[a->esz], a, 0);
157
-}
158
+TRANS_FEAT(TRN1_z, aa64_sve, gen_gvec_ool_arg_zzz,
159
+ trn_fns[a->esz], a, 0)
160
+TRANS_FEAT(TRN2_z, aa64_sve, gen_gvec_ool_arg_zzz,
161
+ trn_fns[a->esz], a, 1 << a->esz)
162
163
-static bool trans_TRN2_z(DisasContext *s, arg_rrr_esz *a)
164
-{
165
- return gen_gvec_ool_arg_zzz(s, trn_fns[a->esz], a, 1 << a->esz);
166
-}
167
-
168
-static bool trans_TRN1_q(DisasContext *s, arg_rrr_esz *a)
169
-{
170
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
171
- return false;
172
- }
173
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_trn_q, a, 0);
174
-}
175
-
176
-static bool trans_TRN2_q(DisasContext *s, arg_rrr_esz *a)
177
-{
178
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
179
- return false;
180
- }
181
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_trn_q, a, 16);
182
-}
183
+TRANS_FEAT(TRN1_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
184
+ gen_helper_sve2_trn_q, a, 0)
185
+TRANS_FEAT(TRN2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
186
+ gen_helper_sve2_trn_q, a, 16)
187
188
/*
189
*** SVE Permute Vector - Predicated Group
190
@@ -XXX,XX +XXX,XX @@ static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
191
TRANS_FEAT(AESMC, aa64_sve2_aes, gen_gvec_ool_zz,
192
gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt)
193
194
-static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
195
-{
196
- if (!dc_isar_feature(aa64_sve2_aes, s)) {
197
- return false;
198
- }
199
- return gen_gvec_ool_arg_zzz(s, gen_helper_crypto_aese, a, decrypt);
200
-}
201
+TRANS_FEAT(AESE, aa64_sve2_aes, gen_gvec_ool_arg_zzz,
202
+ gen_helper_crypto_aese, a, false)
203
+TRANS_FEAT(AESD, aa64_sve2_aes, gen_gvec_ool_arg_zzz,
204
+ gen_helper_crypto_aese, a, true)
205
206
-static bool trans_AESE(DisasContext *s, arg_rrr_esz *a)
207
-{
208
- return do_aese(s, a, false);
209
-}
210
-
211
-static bool trans_AESD(DisasContext *s, arg_rrr_esz *a)
212
-{
213
- return do_aese(s, a, true);
214
-}
215
-
216
-static bool do_sm4(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
217
-{
218
- if (!dc_isar_feature(aa64_sve2_sm4, s)) {
219
- return false;
220
- }
221
- return gen_gvec_ool_arg_zzz(s, fn, a, 0);
222
-}
223
-
224
-static bool trans_SM4E(DisasContext *s, arg_rrr_esz *a)
225
-{
226
- return do_sm4(s, a, gen_helper_crypto_sm4e);
227
-}
228
-
229
-static bool trans_SM4EKEY(DisasContext *s, arg_rrr_esz *a)
230
-{
231
- return do_sm4(s, a, gen_helper_crypto_sm4ekey);
232
-}
233
+TRANS_FEAT(SM4E, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
234
+ gen_helper_crypto_sm4e, a, 0)
235
+TRANS_FEAT(SM4EKEY, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
236
+ gen_helper_crypto_sm4ekey, a, 0)
237
238
static bool trans_RAX1(DisasContext *s, arg_rrr_esz *a)
239
{
240
--
241
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using do_sve2_zzz_ool
4
to use TRANS_FEAT and gen_gvec_ool_arg_zzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-8-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 88 ++++++++++++++------------------------
12
1 file changed, 31 insertions(+), 57 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
19
return true;
20
}
21
22
-static bool do_sve2_zzz_ool(DisasContext *s, arg_rrr_esz *a,
23
- gen_helper_gvec_3 *fn)
24
-{
25
- if (!dc_isar_feature(aa64_sve2, s)) {
26
- return false;
27
- }
28
- return gen_gvec_ool_arg_zzz(s, fn, a, 0);
29
-}
30
+static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
31
+ gen_helper_gvec_smulh_b, gen_helper_gvec_smulh_h,
32
+ gen_helper_gvec_smulh_s, gen_helper_gvec_smulh_d,
33
+};
34
+TRANS_FEAT(SMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
35
+ smulh_zzz_fns[a->esz], a, 0)
36
37
-static bool trans_SMULH_zzz(DisasContext *s, arg_rrr_esz *a)
38
-{
39
- static gen_helper_gvec_3 * const fns[4] = {
40
- gen_helper_gvec_smulh_b, gen_helper_gvec_smulh_h,
41
- gen_helper_gvec_smulh_s, gen_helper_gvec_smulh_d,
42
- };
43
- return do_sve2_zzz_ool(s, a, fns[a->esz]);
44
-}
45
+static gen_helper_gvec_3 * const umulh_zzz_fns[4] = {
46
+ gen_helper_gvec_umulh_b, gen_helper_gvec_umulh_h,
47
+ gen_helper_gvec_umulh_s, gen_helper_gvec_umulh_d,
48
+};
49
+TRANS_FEAT(UMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
50
+ umulh_zzz_fns[a->esz], a, 0)
51
52
-static bool trans_UMULH_zzz(DisasContext *s, arg_rrr_esz *a)
53
-{
54
- static gen_helper_gvec_3 * const fns[4] = {
55
- gen_helper_gvec_umulh_b, gen_helper_gvec_umulh_h,
56
- gen_helper_gvec_umulh_s, gen_helper_gvec_umulh_d,
57
- };
58
- return do_sve2_zzz_ool(s, a, fns[a->esz]);
59
-}
60
+TRANS_FEAT(PMUL_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
61
+ gen_helper_gvec_pmul_b, a, 0)
62
63
-static bool trans_PMUL_zzz(DisasContext *s, arg_rrr_esz *a)
64
-{
65
- return do_sve2_zzz_ool(s, a, gen_helper_gvec_pmul_b);
66
-}
67
+static gen_helper_gvec_3 * const sqdmulh_zzz_fns[4] = {
68
+ gen_helper_sve2_sqdmulh_b, gen_helper_sve2_sqdmulh_h,
69
+ gen_helper_sve2_sqdmulh_s, gen_helper_sve2_sqdmulh_d,
70
+};
71
+TRANS_FEAT(SQDMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
72
+ sqdmulh_zzz_fns[a->esz], a, 0)
73
74
-static bool trans_SQDMULH_zzz(DisasContext *s, arg_rrr_esz *a)
75
-{
76
- static gen_helper_gvec_3 * const fns[4] = {
77
- gen_helper_sve2_sqdmulh_b, gen_helper_sve2_sqdmulh_h,
78
- gen_helper_sve2_sqdmulh_s, gen_helper_sve2_sqdmulh_d,
79
- };
80
- return do_sve2_zzz_ool(s, a, fns[a->esz]);
81
-}
82
-
83
-static bool trans_SQRDMULH_zzz(DisasContext *s, arg_rrr_esz *a)
84
-{
85
- static gen_helper_gvec_3 * const fns[4] = {
86
- gen_helper_sve2_sqrdmulh_b, gen_helper_sve2_sqrdmulh_h,
87
- gen_helper_sve2_sqrdmulh_s, gen_helper_sve2_sqrdmulh_d,
88
- };
89
- return do_sve2_zzz_ool(s, a, fns[a->esz]);
90
-}
91
+static gen_helper_gvec_3 * const sqrdmulh_zzz_fns[4] = {
92
+ gen_helper_sve2_sqrdmulh_b, gen_helper_sve2_sqrdmulh_h,
93
+ gen_helper_sve2_sqrdmulh_s, gen_helper_sve2_sqrdmulh_d,
94
+};
95
+TRANS_FEAT(SQRDMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
96
+ sqrdmulh_zzz_fns[a->esz], a, 0)
97
98
/*
99
* SVE2 Integer - Predicated
100
@@ -XXX,XX +XXX,XX @@ static bool trans_UQRSHRNT(DisasContext *s, arg_rri_esz *a)
101
}
102
103
#define DO_SVE2_ZZZ_NARROW(NAME, name) \
104
-static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
105
-{ \
106
- static gen_helper_gvec_3 * const fns[4] = { \
107
+ static gen_helper_gvec_3 * const name##_fns[4] = { \
108
NULL, gen_helper_sve2_##name##_h, \
109
gen_helper_sve2_##name##_s, gen_helper_sve2_##name##_d, \
110
}; \
111
- return do_sve2_zzz_ool(s, a, fns[a->esz]); \
112
-}
113
+ TRANS_FEAT(NAME, aa64_sve2, gen_gvec_ool_arg_zzz, \
114
+ name##_fns[a->esz], a, 0)
115
116
DO_SVE2_ZZZ_NARROW(ADDHNB, addhnb)
117
DO_SVE2_ZZZ_NARROW(ADDHNT, addhnt)
118
@@ -XXX,XX +XXX,XX @@ static bool trans_HISTCNT(DisasContext *s, arg_rprr_esz *a)
119
return do_sve2_zpzz_ool(s, a, fns[a->esz - 2]);
120
}
121
122
-static bool trans_HISTSEG(DisasContext *s, arg_rrr_esz *a)
123
-{
124
- if (a->esz != 0) {
125
- return false;
126
- }
127
- return do_sve2_zzz_ool(s, a, gen_helper_sve2_histseg);
128
-}
129
+TRANS_FEAT(HISTSEG, aa64_sve2, gen_gvec_ool_arg_zzz,
130
+ a->esz == 0 ? gen_helper_sve2_histseg : NULL, a, 0)
131
132
static bool do_sve2_zpzz_fp(DisasContext *s, arg_rprr_esz *a,
133
gen_helper_gvec_4_ptr *fn)
134
--
135
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions directly using
4
gen_gvec_ool_zzzz to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-10-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 89 +++++++++++++-------------------------
12
1 file changed, 29 insertions(+), 60 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const sve_tbl_fns[4] = {
19
};
20
TRANS_FEAT(TBL, aa64_sve, gen_gvec_ool_arg_zzz, sve_tbl_fns[a->esz], a, 0)
21
22
-static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
23
-{
24
- static gen_helper_gvec_4 * const fns[4] = {
25
- gen_helper_sve2_tbl_b, gen_helper_sve2_tbl_h,
26
- gen_helper_sve2_tbl_s, gen_helper_sve2_tbl_d
27
- };
28
-
29
- if (!dc_isar_feature(aa64_sve2, s)) {
30
- return false;
31
- }
32
- return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
33
- (a->rn + 1) % 32, a->rm, 0);
34
-}
35
+static gen_helper_gvec_4 * const sve2_tbl_fns[4] = {
36
+ gen_helper_sve2_tbl_b, gen_helper_sve2_tbl_h,
37
+ gen_helper_sve2_tbl_s, gen_helper_sve2_tbl_d
38
+};
39
+TRANS_FEAT(TBL_sve2, aa64_sve2, gen_gvec_ool_zzzz, sve2_tbl_fns[a->esz],
40
+ a->rd, a->rn, (a->rn + 1) % 32, a->rm, 0)
41
42
static gen_helper_gvec_3 * const tbx_fns[4] = {
43
gen_helper_sve2_tbx_b, gen_helper_sve2_tbx_h,
44
@@ -XXX,XX +XXX,XX @@ DO_ZZI(UMIN, umin)
45
46
#undef DO_ZZI
47
48
-static bool trans_DOT_zzzz(DisasContext *s, arg_DOT_zzzz *a)
49
-{
50
- static gen_helper_gvec_4 * const fns[2][2] = {
51
- { gen_helper_gvec_sdot_b, gen_helper_gvec_sdot_h },
52
- { gen_helper_gvec_udot_b, gen_helper_gvec_udot_h }
53
- };
54
- return gen_gvec_ool_zzzz(s, fns[a->u][a->sz],
55
- a->rd, a->rn, a->rm, a->ra, 0);
56
-}
57
+static gen_helper_gvec_4 * const dot_fns[2][2] = {
58
+ { gen_helper_gvec_sdot_b, gen_helper_gvec_sdot_h },
59
+ { gen_helper_gvec_udot_b, gen_helper_gvec_udot_h }
60
+};
61
+TRANS_FEAT(DOT_zzzz, aa64_sve, gen_gvec_ool_zzzz,
62
+ dot_fns[a->u][a->sz], a->rd, a->rn, a->rm, a->ra, 0)
63
64
/*
65
* SVE Multiply - Indexed
66
@@ -XXX,XX +XXX,XX @@ static bool trans_UMLSLT_zzzw(DisasContext *s, arg_rrrr_esz *a)
67
return do_umlsl_zzzw(s, a, true);
68
}
69
70
-static bool trans_CMLA_zzzz(DisasContext *s, arg_CMLA_zzzz *a)
71
-{
72
- static gen_helper_gvec_4 * const fns[] = {
73
- gen_helper_sve2_cmla_zzzz_b, gen_helper_sve2_cmla_zzzz_h,
74
- gen_helper_sve2_cmla_zzzz_s, gen_helper_sve2_cmla_zzzz_d,
75
- };
76
+static gen_helper_gvec_4 * const cmla_fns[] = {
77
+ gen_helper_sve2_cmla_zzzz_b, gen_helper_sve2_cmla_zzzz_h,
78
+ gen_helper_sve2_cmla_zzzz_s, gen_helper_sve2_cmla_zzzz_d,
79
+};
80
+TRANS_FEAT(CMLA_zzzz, aa64_sve2, gen_gvec_ool_zzzz,
81
+ cmla_fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot)
82
83
- if (!dc_isar_feature(aa64_sve2, s)) {
84
- return false;
85
- }
86
- return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
87
- a->rm, a->ra, a->rot);
88
-}
89
+static gen_helper_gvec_4 * const cdot_fns[] = {
90
+ NULL, NULL, gen_helper_sve2_cdot_zzzz_s, gen_helper_sve2_cdot_zzzz_d
91
+};
92
+TRANS_FEAT(CDOT_zzzz, aa64_sve2, gen_gvec_ool_zzzz,
93
+ cdot_fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot)
94
95
-static bool trans_CDOT_zzzz(DisasContext *s, arg_CMLA_zzzz *a)
96
-{
97
- static gen_helper_gvec_4 * const fns[] = {
98
- NULL, NULL, gen_helper_sve2_cdot_zzzz_s, gen_helper_sve2_cdot_zzzz_d
99
- };
100
-
101
- if (!dc_isar_feature(aa64_sve2, s)) {
102
- return false;
103
- }
104
- return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
105
- a->rm, a->ra, a->rot);
106
-}
107
-
108
-static bool trans_SQRDCMLAH_zzzz(DisasContext *s, arg_SQRDCMLAH_zzzz *a)
109
-{
110
- static gen_helper_gvec_4 * const fns[] = {
111
- gen_helper_sve2_sqrdcmlah_zzzz_b, gen_helper_sve2_sqrdcmlah_zzzz_h,
112
- gen_helper_sve2_sqrdcmlah_zzzz_s, gen_helper_sve2_sqrdcmlah_zzzz_d,
113
- };
114
-
115
- if (!dc_isar_feature(aa64_sve2, s)) {
116
- return false;
117
- }
118
- return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
119
- a->rm, a->ra, a->rot);
120
-}
121
+static gen_helper_gvec_4 * const sqrdcmlah_fns[] = {
122
+ gen_helper_sve2_sqrdcmlah_zzzz_b, gen_helper_sve2_sqrdcmlah_zzzz_h,
123
+ gen_helper_sve2_sqrdcmlah_zzzz_s, gen_helper_sve2_sqrdcmlah_zzzz_d,
124
+};
125
+TRANS_FEAT(SQRDCMLAH_zzzz, aa64_sve2, gen_gvec_ool_zzzz,
126
+ sqrdcmlah_fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot)
127
128
static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
129
{
130
--
131
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions directly using
4
gen_gvec_ool_arg_zzzz to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-13-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 47 ++++++++------------------------------
12
1 file changed, 10 insertions(+), 37 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_FMLSLT_zzxw(DisasContext *s, arg_rrxr_esz *a)
19
return do_FMLAL_zzxw(s, a, true, true);
20
}
21
22
-static bool do_i8mm_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
23
- gen_helper_gvec_4 *fn, int data)
24
-{
25
- if (!dc_isar_feature(aa64_sve_i8mm, s)) {
26
- return false;
27
- }
28
- return gen_gvec_ool_arg_zzzz(s, fn, a, data);
29
-}
30
+TRANS_FEAT(SMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
31
+ gen_helper_gvec_smmla_b, a, 0)
32
+TRANS_FEAT(USMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
33
+ gen_helper_gvec_usmmla_b, a, 0)
34
+TRANS_FEAT(UMMLA, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
35
+ gen_helper_gvec_ummla_b, a, 0)
36
37
-static bool trans_SMMLA(DisasContext *s, arg_rrrr_esz *a)
38
-{
39
- return do_i8mm_zzzz_ool(s, a, gen_helper_gvec_smmla_b, 0);
40
-}
41
-
42
-static bool trans_USMMLA(DisasContext *s, arg_rrrr_esz *a)
43
-{
44
- return do_i8mm_zzzz_ool(s, a, gen_helper_gvec_usmmla_b, 0);
45
-}
46
-
47
-static bool trans_UMMLA(DisasContext *s, arg_rrrr_esz *a)
48
-{
49
- return do_i8mm_zzzz_ool(s, a, gen_helper_gvec_ummla_b, 0);
50
-}
51
-
52
-static bool trans_BFDOT_zzzz(DisasContext *s, arg_rrrr_esz *a)
53
-{
54
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
55
- return false;
56
- }
57
- return gen_gvec_ool_arg_zzzz(s, gen_helper_gvec_bfdot, a, 0);
58
-}
59
+TRANS_FEAT(BFDOT_zzzz, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
60
+ gen_helper_gvec_bfdot, a, 0)
61
62
static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
63
{
64
@@ -XXX,XX +XXX,XX @@ static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
65
a->rd, a->rn, a->rm, a->ra, a->index);
66
}
67
68
-static bool trans_BFMMLA(DisasContext *s, arg_rrrr_esz *a)
69
-{
70
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
71
- return false;
72
- }
73
- return gen_gvec_ool_arg_zzzz(s, gen_helper_gvec_bfmmla, a, 0);
74
-}
75
+TRANS_FEAT(BFMMLA, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
76
+ gen_helper_gvec_bfmmla, a, 0)
77
78
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
79
{
80
--
81
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using do_sve2_zzz_data
4
to use TRANS_FEAT and gen_gvec_ool_zzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-16-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 69 ++++++++++++++------------------------
12
1 file changed, 25 insertions(+), 44 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SUDOT_zzxw_s, aa64_sve_i8mm, gen_gvec_ool_arg_zzxz,
19
TRANS_FEAT(USDOT_zzxw_s, aa64_sve_i8mm, gen_gvec_ool_arg_zzxz,
20
gen_helper_gvec_usdot_idx_b, a)
21
22
-static bool do_sve2_zzz_data(DisasContext *s, int rd, int rn, int rm, int data,
23
- gen_helper_gvec_3 *fn)
24
-{
25
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
26
- return false;
27
- }
28
- if (sve_access_check(s)) {
29
- unsigned vsz = vec_full_reg_size(s);
30
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
31
- vec_full_reg_offset(s, rn),
32
- vec_full_reg_offset(s, rm),
33
- vsz, vsz, data, fn);
34
- }
35
- return true;
36
-}
37
-
38
#define DO_SVE2_RRX(NAME, FUNC) \
39
- static bool NAME(DisasContext *s, arg_rrx_esz *a) \
40
- { return do_sve2_zzz_data(s, a->rd, a->rn, a->rm, a->index, FUNC); }
41
+ TRANS_FEAT(NAME, aa64_sve, gen_gvec_ool_zzz, FUNC, \
42
+ a->rd, a->rn, a->rm, a->index)
43
44
-DO_SVE2_RRX(trans_MUL_zzx_h, gen_helper_gvec_mul_idx_h)
45
-DO_SVE2_RRX(trans_MUL_zzx_s, gen_helper_gvec_mul_idx_s)
46
-DO_SVE2_RRX(trans_MUL_zzx_d, gen_helper_gvec_mul_idx_d)
47
+DO_SVE2_RRX(MUL_zzx_h, gen_helper_gvec_mul_idx_h)
48
+DO_SVE2_RRX(MUL_zzx_s, gen_helper_gvec_mul_idx_s)
49
+DO_SVE2_RRX(MUL_zzx_d, gen_helper_gvec_mul_idx_d)
50
51
-DO_SVE2_RRX(trans_SQDMULH_zzx_h, gen_helper_sve2_sqdmulh_idx_h)
52
-DO_SVE2_RRX(trans_SQDMULH_zzx_s, gen_helper_sve2_sqdmulh_idx_s)
53
-DO_SVE2_RRX(trans_SQDMULH_zzx_d, gen_helper_sve2_sqdmulh_idx_d)
54
+DO_SVE2_RRX(SQDMULH_zzx_h, gen_helper_sve2_sqdmulh_idx_h)
55
+DO_SVE2_RRX(SQDMULH_zzx_s, gen_helper_sve2_sqdmulh_idx_s)
56
+DO_SVE2_RRX(SQDMULH_zzx_d, gen_helper_sve2_sqdmulh_idx_d)
57
58
-DO_SVE2_RRX(trans_SQRDMULH_zzx_h, gen_helper_sve2_sqrdmulh_idx_h)
59
-DO_SVE2_RRX(trans_SQRDMULH_zzx_s, gen_helper_sve2_sqrdmulh_idx_s)
60
-DO_SVE2_RRX(trans_SQRDMULH_zzx_d, gen_helper_sve2_sqrdmulh_idx_d)
61
+DO_SVE2_RRX(SQRDMULH_zzx_h, gen_helper_sve2_sqrdmulh_idx_h)
62
+DO_SVE2_RRX(SQRDMULH_zzx_s, gen_helper_sve2_sqrdmulh_idx_s)
63
+DO_SVE2_RRX(SQRDMULH_zzx_d, gen_helper_sve2_sqrdmulh_idx_d)
64
65
#undef DO_SVE2_RRX
66
67
#define DO_SVE2_RRX_TB(NAME, FUNC, TOP) \
68
- static bool NAME(DisasContext *s, arg_rrx_esz *a) \
69
- { \
70
- return do_sve2_zzz_data(s, a->rd, a->rn, a->rm, \
71
- (a->index << 1) | TOP, FUNC); \
72
- }
73
+ TRANS_FEAT(NAME, aa64_sve, gen_gvec_ool_zzz, FUNC, \
74
+ a->rd, a->rn, a->rm, (a->index << 1) | TOP)
75
76
-DO_SVE2_RRX_TB(trans_SQDMULLB_zzx_s, gen_helper_sve2_sqdmull_idx_s, false)
77
-DO_SVE2_RRX_TB(trans_SQDMULLB_zzx_d, gen_helper_sve2_sqdmull_idx_d, false)
78
-DO_SVE2_RRX_TB(trans_SQDMULLT_zzx_s, gen_helper_sve2_sqdmull_idx_s, true)
79
-DO_SVE2_RRX_TB(trans_SQDMULLT_zzx_d, gen_helper_sve2_sqdmull_idx_d, true)
80
+DO_SVE2_RRX_TB(SQDMULLB_zzx_s, gen_helper_sve2_sqdmull_idx_s, false)
81
+DO_SVE2_RRX_TB(SQDMULLB_zzx_d, gen_helper_sve2_sqdmull_idx_d, false)
82
+DO_SVE2_RRX_TB(SQDMULLT_zzx_s, gen_helper_sve2_sqdmull_idx_s, true)
83
+DO_SVE2_RRX_TB(SQDMULLT_zzx_d, gen_helper_sve2_sqdmull_idx_d, true)
84
85
-DO_SVE2_RRX_TB(trans_SMULLB_zzx_s, gen_helper_sve2_smull_idx_s, false)
86
-DO_SVE2_RRX_TB(trans_SMULLB_zzx_d, gen_helper_sve2_smull_idx_d, false)
87
-DO_SVE2_RRX_TB(trans_SMULLT_zzx_s, gen_helper_sve2_smull_idx_s, true)
88
-DO_SVE2_RRX_TB(trans_SMULLT_zzx_d, gen_helper_sve2_smull_idx_d, true)
89
+DO_SVE2_RRX_TB(SMULLB_zzx_s, gen_helper_sve2_smull_idx_s, false)
90
+DO_SVE2_RRX_TB(SMULLB_zzx_d, gen_helper_sve2_smull_idx_d, false)
91
+DO_SVE2_RRX_TB(SMULLT_zzx_s, gen_helper_sve2_smull_idx_s, true)
92
+DO_SVE2_RRX_TB(SMULLT_zzx_d, gen_helper_sve2_smull_idx_d, true)
93
94
-DO_SVE2_RRX_TB(trans_UMULLB_zzx_s, gen_helper_sve2_umull_idx_s, false)
95
-DO_SVE2_RRX_TB(trans_UMULLB_zzx_d, gen_helper_sve2_umull_idx_d, false)
96
-DO_SVE2_RRX_TB(trans_UMULLT_zzx_s, gen_helper_sve2_umull_idx_s, true)
97
-DO_SVE2_RRX_TB(trans_UMULLT_zzx_d, gen_helper_sve2_umull_idx_d, true)
98
+DO_SVE2_RRX_TB(UMULLB_zzx_s, gen_helper_sve2_umull_idx_s, false)
99
+DO_SVE2_RRX_TB(UMULLB_zzx_d, gen_helper_sve2_umull_idx_d, false)
100
+DO_SVE2_RRX_TB(UMULLT_zzx_s, gen_helper_sve2_umull_idx_s, true)
101
+DO_SVE2_RRX_TB(UMULLT_zzx_d, gen_helper_sve2_umull_idx_d, true)
102
103
#undef DO_SVE2_RRX_TB
104
105
--
106
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using do_sve2_zzzz_data
4
to use TRANS_FEAT and gen_gvec_ool_{zzzz,zzxz}.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-17-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 106 ++++++++++++++-----------------------
12
1 file changed, 41 insertions(+), 65 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ DO_SVE2_RRX_TB(UMULLT_zzx_d, gen_helper_sve2_umull_idx_d, true)
19
20
#undef DO_SVE2_RRX_TB
21
22
-static bool do_sve2_zzzz_data(DisasContext *s, int rd, int rn, int rm, int ra,
23
- int data, gen_helper_gvec_4 *fn)
24
-{
25
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
26
- return false;
27
- }
28
- if (sve_access_check(s)) {
29
- unsigned vsz = vec_full_reg_size(s);
30
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
31
- vec_full_reg_offset(s, rn),
32
- vec_full_reg_offset(s, rm),
33
- vec_full_reg_offset(s, ra),
34
- vsz, vsz, data, fn);
35
- }
36
- return true;
37
-}
38
-
39
#define DO_SVE2_RRXR(NAME, FUNC) \
40
- static bool NAME(DisasContext *s, arg_rrxr_esz *a) \
41
- { return do_sve2_zzzz_data(s, a->rd, a->rn, a->rm, a->ra, a->index, FUNC); }
42
+ TRANS_FEAT(NAME, aa64_sve2, gen_gvec_ool_arg_zzxz, FUNC, a)
43
44
-DO_SVE2_RRXR(trans_MLA_zzxz_h, gen_helper_gvec_mla_idx_h)
45
-DO_SVE2_RRXR(trans_MLA_zzxz_s, gen_helper_gvec_mla_idx_s)
46
-DO_SVE2_RRXR(trans_MLA_zzxz_d, gen_helper_gvec_mla_idx_d)
47
+DO_SVE2_RRXR(MLA_zzxz_h, gen_helper_gvec_mla_idx_h)
48
+DO_SVE2_RRXR(MLA_zzxz_s, gen_helper_gvec_mla_idx_s)
49
+DO_SVE2_RRXR(MLA_zzxz_d, gen_helper_gvec_mla_idx_d)
50
51
-DO_SVE2_RRXR(trans_MLS_zzxz_h, gen_helper_gvec_mls_idx_h)
52
-DO_SVE2_RRXR(trans_MLS_zzxz_s, gen_helper_gvec_mls_idx_s)
53
-DO_SVE2_RRXR(trans_MLS_zzxz_d, gen_helper_gvec_mls_idx_d)
54
+DO_SVE2_RRXR(MLS_zzxz_h, gen_helper_gvec_mls_idx_h)
55
+DO_SVE2_RRXR(MLS_zzxz_s, gen_helper_gvec_mls_idx_s)
56
+DO_SVE2_RRXR(MLS_zzxz_d, gen_helper_gvec_mls_idx_d)
57
58
-DO_SVE2_RRXR(trans_SQRDMLAH_zzxz_h, gen_helper_sve2_sqrdmlah_idx_h)
59
-DO_SVE2_RRXR(trans_SQRDMLAH_zzxz_s, gen_helper_sve2_sqrdmlah_idx_s)
60
-DO_SVE2_RRXR(trans_SQRDMLAH_zzxz_d, gen_helper_sve2_sqrdmlah_idx_d)
61
+DO_SVE2_RRXR(SQRDMLAH_zzxz_h, gen_helper_sve2_sqrdmlah_idx_h)
62
+DO_SVE2_RRXR(SQRDMLAH_zzxz_s, gen_helper_sve2_sqrdmlah_idx_s)
63
+DO_SVE2_RRXR(SQRDMLAH_zzxz_d, gen_helper_sve2_sqrdmlah_idx_d)
64
65
-DO_SVE2_RRXR(trans_SQRDMLSH_zzxz_h, gen_helper_sve2_sqrdmlsh_idx_h)
66
-DO_SVE2_RRXR(trans_SQRDMLSH_zzxz_s, gen_helper_sve2_sqrdmlsh_idx_s)
67
-DO_SVE2_RRXR(trans_SQRDMLSH_zzxz_d, gen_helper_sve2_sqrdmlsh_idx_d)
68
+DO_SVE2_RRXR(SQRDMLSH_zzxz_h, gen_helper_sve2_sqrdmlsh_idx_h)
69
+DO_SVE2_RRXR(SQRDMLSH_zzxz_s, gen_helper_sve2_sqrdmlsh_idx_s)
70
+DO_SVE2_RRXR(SQRDMLSH_zzxz_d, gen_helper_sve2_sqrdmlsh_idx_d)
71
72
#undef DO_SVE2_RRXR
73
74
#define DO_SVE2_RRXR_TB(NAME, FUNC, TOP) \
75
- static bool NAME(DisasContext *s, arg_rrxr_esz *a) \
76
- { \
77
- return do_sve2_zzzz_data(s, a->rd, a->rn, a->rm, a->rd, \
78
- (a->index << 1) | TOP, FUNC); \
79
- }
80
+ TRANS_FEAT(NAME, aa64_sve2, gen_gvec_ool_zzzz, FUNC, \
81
+ a->rd, a->rn, a->rm, a->ra, (a->index << 1) | TOP)
82
83
-DO_SVE2_RRXR_TB(trans_SQDMLALB_zzxw_s, gen_helper_sve2_sqdmlal_idx_s, false)
84
-DO_SVE2_RRXR_TB(trans_SQDMLALB_zzxw_d, gen_helper_sve2_sqdmlal_idx_d, false)
85
-DO_SVE2_RRXR_TB(trans_SQDMLALT_zzxw_s, gen_helper_sve2_sqdmlal_idx_s, true)
86
-DO_SVE2_RRXR_TB(trans_SQDMLALT_zzxw_d, gen_helper_sve2_sqdmlal_idx_d, true)
87
+DO_SVE2_RRXR_TB(SQDMLALB_zzxw_s, gen_helper_sve2_sqdmlal_idx_s, false)
88
+DO_SVE2_RRXR_TB(SQDMLALB_zzxw_d, gen_helper_sve2_sqdmlal_idx_d, false)
89
+DO_SVE2_RRXR_TB(SQDMLALT_zzxw_s, gen_helper_sve2_sqdmlal_idx_s, true)
90
+DO_SVE2_RRXR_TB(SQDMLALT_zzxw_d, gen_helper_sve2_sqdmlal_idx_d, true)
91
92
-DO_SVE2_RRXR_TB(trans_SQDMLSLB_zzxw_s, gen_helper_sve2_sqdmlsl_idx_s, false)
93
-DO_SVE2_RRXR_TB(trans_SQDMLSLB_zzxw_d, gen_helper_sve2_sqdmlsl_idx_d, false)
94
-DO_SVE2_RRXR_TB(trans_SQDMLSLT_zzxw_s, gen_helper_sve2_sqdmlsl_idx_s, true)
95
-DO_SVE2_RRXR_TB(trans_SQDMLSLT_zzxw_d, gen_helper_sve2_sqdmlsl_idx_d, true)
96
+DO_SVE2_RRXR_TB(SQDMLSLB_zzxw_s, gen_helper_sve2_sqdmlsl_idx_s, false)
97
+DO_SVE2_RRXR_TB(SQDMLSLB_zzxw_d, gen_helper_sve2_sqdmlsl_idx_d, false)
98
+DO_SVE2_RRXR_TB(SQDMLSLT_zzxw_s, gen_helper_sve2_sqdmlsl_idx_s, true)
99
+DO_SVE2_RRXR_TB(SQDMLSLT_zzxw_d, gen_helper_sve2_sqdmlsl_idx_d, true)
100
101
-DO_SVE2_RRXR_TB(trans_SMLALB_zzxw_s, gen_helper_sve2_smlal_idx_s, false)
102
-DO_SVE2_RRXR_TB(trans_SMLALB_zzxw_d, gen_helper_sve2_smlal_idx_d, false)
103
-DO_SVE2_RRXR_TB(trans_SMLALT_zzxw_s, gen_helper_sve2_smlal_idx_s, true)
104
-DO_SVE2_RRXR_TB(trans_SMLALT_zzxw_d, gen_helper_sve2_smlal_idx_d, true)
105
+DO_SVE2_RRXR_TB(SMLALB_zzxw_s, gen_helper_sve2_smlal_idx_s, false)
106
+DO_SVE2_RRXR_TB(SMLALB_zzxw_d, gen_helper_sve2_smlal_idx_d, false)
107
+DO_SVE2_RRXR_TB(SMLALT_zzxw_s, gen_helper_sve2_smlal_idx_s, true)
108
+DO_SVE2_RRXR_TB(SMLALT_zzxw_d, gen_helper_sve2_smlal_idx_d, true)
109
110
-DO_SVE2_RRXR_TB(trans_UMLALB_zzxw_s, gen_helper_sve2_umlal_idx_s, false)
111
-DO_SVE2_RRXR_TB(trans_UMLALB_zzxw_d, gen_helper_sve2_umlal_idx_d, false)
112
-DO_SVE2_RRXR_TB(trans_UMLALT_zzxw_s, gen_helper_sve2_umlal_idx_s, true)
113
-DO_SVE2_RRXR_TB(trans_UMLALT_zzxw_d, gen_helper_sve2_umlal_idx_d, true)
114
+DO_SVE2_RRXR_TB(UMLALB_zzxw_s, gen_helper_sve2_umlal_idx_s, false)
115
+DO_SVE2_RRXR_TB(UMLALB_zzxw_d, gen_helper_sve2_umlal_idx_d, false)
116
+DO_SVE2_RRXR_TB(UMLALT_zzxw_s, gen_helper_sve2_umlal_idx_s, true)
117
+DO_SVE2_RRXR_TB(UMLALT_zzxw_d, gen_helper_sve2_umlal_idx_d, true)
118
119
-DO_SVE2_RRXR_TB(trans_SMLSLB_zzxw_s, gen_helper_sve2_smlsl_idx_s, false)
120
-DO_SVE2_RRXR_TB(trans_SMLSLB_zzxw_d, gen_helper_sve2_smlsl_idx_d, false)
121
-DO_SVE2_RRXR_TB(trans_SMLSLT_zzxw_s, gen_helper_sve2_smlsl_idx_s, true)
122
-DO_SVE2_RRXR_TB(trans_SMLSLT_zzxw_d, gen_helper_sve2_smlsl_idx_d, true)
123
+DO_SVE2_RRXR_TB(SMLSLB_zzxw_s, gen_helper_sve2_smlsl_idx_s, false)
124
+DO_SVE2_RRXR_TB(SMLSLB_zzxw_d, gen_helper_sve2_smlsl_idx_d, false)
125
+DO_SVE2_RRXR_TB(SMLSLT_zzxw_s, gen_helper_sve2_smlsl_idx_s, true)
126
+DO_SVE2_RRXR_TB(SMLSLT_zzxw_d, gen_helper_sve2_smlsl_idx_d, true)
127
128
-DO_SVE2_RRXR_TB(trans_UMLSLB_zzxw_s, gen_helper_sve2_umlsl_idx_s, false)
129
-DO_SVE2_RRXR_TB(trans_UMLSLB_zzxw_d, gen_helper_sve2_umlsl_idx_d, false)
130
-DO_SVE2_RRXR_TB(trans_UMLSLT_zzxw_s, gen_helper_sve2_umlsl_idx_s, true)
131
-DO_SVE2_RRXR_TB(trans_UMLSLT_zzxw_d, gen_helper_sve2_umlsl_idx_d, true)
132
+DO_SVE2_RRXR_TB(UMLSLB_zzxw_s, gen_helper_sve2_umlsl_idx_s, false)
133
+DO_SVE2_RRXR_TB(UMLSLB_zzxw_d, gen_helper_sve2_umlsl_idx_d, false)
134
+DO_SVE2_RRXR_TB(UMLSLT_zzxw_s, gen_helper_sve2_umlsl_idx_s, true)
135
+DO_SVE2_RRXR_TB(UMLSLT_zzxw_d, gen_helper_sve2_umlsl_idx_d, true)
136
137
#undef DO_SVE2_RRXR_TB
138
139
#define DO_SVE2_RRXR_ROT(NAME, FUNC) \
140
- static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
141
- { \
142
- return do_sve2_zzzz_data(s, a->rd, a->rn, a->rm, a->ra, \
143
- (a->index << 2) | a->rot, FUNC); \
144
- }
145
+ TRANS_FEAT(NAME, aa64_sve2, gen_gvec_ool_zzzz, FUNC, \
146
+ a->rd, a->rn, a->rm, a->ra, (a->index << 2) | a->rot)
147
148
DO_SVE2_RRXR_ROT(CMLA_zzxz_h, gen_helper_sve2_cmla_idx_h)
149
DO_SVE2_RRXR_ROT(CMLA_zzxz_s, gen_helper_sve2_cmla_idx_s)
150
--
151
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using do_sve2_zzw_data
4
to use TRANS_FEAT and gen_gvec_ool_arg_zzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-18-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 297 ++++++++++++++++++-------------------
12
1 file changed, 145 insertions(+), 152 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ DO_SVE2_ZPZZ(USQADD, usqadd)
19
* SVE2 Widening Integer Arithmetic
20
*/
21
22
-static bool do_sve2_zzw_ool(DisasContext *s, arg_rrr_esz *a,
23
- gen_helper_gvec_3 *fn, int data)
24
-{
25
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
26
- return false;
27
- }
28
- if (sve_access_check(s)) {
29
- unsigned vsz = vec_full_reg_size(s);
30
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
31
- vec_full_reg_offset(s, a->rn),
32
- vec_full_reg_offset(s, a->rm),
33
- vsz, vsz, data, fn);
34
- }
35
- return true;
36
-}
37
+static gen_helper_gvec_3 * const saddl_fns[4] = {
38
+ NULL, gen_helper_sve2_saddl_h,
39
+ gen_helper_sve2_saddl_s, gen_helper_sve2_saddl_d,
40
+};
41
+TRANS_FEAT(SADDLB, aa64_sve2, gen_gvec_ool_arg_zzz,
42
+ saddl_fns[a->esz], a, 0)
43
+TRANS_FEAT(SADDLT, aa64_sve2, gen_gvec_ool_arg_zzz,
44
+ saddl_fns[a->esz], a, 3)
45
+TRANS_FEAT(SADDLBT, aa64_sve2, gen_gvec_ool_arg_zzz,
46
+ saddl_fns[a->esz], a, 2)
47
48
-#define DO_SVE2_ZZZ_TB(NAME, name, SEL1, SEL2) \
49
-static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
50
-{ \
51
- static gen_helper_gvec_3 * const fns[4] = { \
52
- NULL, gen_helper_sve2_##name##_h, \
53
- gen_helper_sve2_##name##_s, gen_helper_sve2_##name##_d, \
54
- }; \
55
- return do_sve2_zzw_ool(s, a, fns[a->esz], (SEL2 << 1) | SEL1); \
56
-}
57
+static gen_helper_gvec_3 * const ssubl_fns[4] = {
58
+ NULL, gen_helper_sve2_ssubl_h,
59
+ gen_helper_sve2_ssubl_s, gen_helper_sve2_ssubl_d,
60
+};
61
+TRANS_FEAT(SSUBLB, aa64_sve2, gen_gvec_ool_arg_zzz,
62
+ ssubl_fns[a->esz], a, 0)
63
+TRANS_FEAT(SSUBLT, aa64_sve2, gen_gvec_ool_arg_zzz,
64
+ ssubl_fns[a->esz], a, 3)
65
+TRANS_FEAT(SSUBLBT, aa64_sve2, gen_gvec_ool_arg_zzz,
66
+ ssubl_fns[a->esz], a, 2)
67
+TRANS_FEAT(SSUBLTB, aa64_sve2, gen_gvec_ool_arg_zzz,
68
+ ssubl_fns[a->esz], a, 1)
69
70
-DO_SVE2_ZZZ_TB(SADDLB, saddl, false, false)
71
-DO_SVE2_ZZZ_TB(SSUBLB, ssubl, false, false)
72
-DO_SVE2_ZZZ_TB(SABDLB, sabdl, false, false)
73
+static gen_helper_gvec_3 * const sabdl_fns[4] = {
74
+ NULL, gen_helper_sve2_sabdl_h,
75
+ gen_helper_sve2_sabdl_s, gen_helper_sve2_sabdl_d,
76
+};
77
+TRANS_FEAT(SABDLB, aa64_sve2, gen_gvec_ool_arg_zzz,
78
+ sabdl_fns[a->esz], a, 0)
79
+TRANS_FEAT(SABDLT, aa64_sve2, gen_gvec_ool_arg_zzz,
80
+ sabdl_fns[a->esz], a, 3)
81
82
-DO_SVE2_ZZZ_TB(UADDLB, uaddl, false, false)
83
-DO_SVE2_ZZZ_TB(USUBLB, usubl, false, false)
84
-DO_SVE2_ZZZ_TB(UABDLB, uabdl, false, false)
85
+static gen_helper_gvec_3 * const uaddl_fns[4] = {
86
+ NULL, gen_helper_sve2_uaddl_h,
87
+ gen_helper_sve2_uaddl_s, gen_helper_sve2_uaddl_d,
88
+};
89
+TRANS_FEAT(UADDLB, aa64_sve2, gen_gvec_ool_arg_zzz,
90
+ uaddl_fns[a->esz], a, 0)
91
+TRANS_FEAT(UADDLT, aa64_sve2, gen_gvec_ool_arg_zzz,
92
+ uaddl_fns[a->esz], a, 3)
93
94
-DO_SVE2_ZZZ_TB(SADDLT, saddl, true, true)
95
-DO_SVE2_ZZZ_TB(SSUBLT, ssubl, true, true)
96
-DO_SVE2_ZZZ_TB(SABDLT, sabdl, true, true)
97
+static gen_helper_gvec_3 * const usubl_fns[4] = {
98
+ NULL, gen_helper_sve2_usubl_h,
99
+ gen_helper_sve2_usubl_s, gen_helper_sve2_usubl_d,
100
+};
101
+TRANS_FEAT(USUBLB, aa64_sve2, gen_gvec_ool_arg_zzz,
102
+ usubl_fns[a->esz], a, 0)
103
+TRANS_FEAT(USUBLT, aa64_sve2, gen_gvec_ool_arg_zzz,
104
+ usubl_fns[a->esz], a, 3)
105
106
-DO_SVE2_ZZZ_TB(UADDLT, uaddl, true, true)
107
-DO_SVE2_ZZZ_TB(USUBLT, usubl, true, true)
108
-DO_SVE2_ZZZ_TB(UABDLT, uabdl, true, true)
109
+static gen_helper_gvec_3 * const uabdl_fns[4] = {
110
+ NULL, gen_helper_sve2_uabdl_h,
111
+ gen_helper_sve2_uabdl_s, gen_helper_sve2_uabdl_d,
112
+};
113
+TRANS_FEAT(UABDLB, aa64_sve2, gen_gvec_ool_arg_zzz,
114
+ uabdl_fns[a->esz], a, 0)
115
+TRANS_FEAT(UABDLT, aa64_sve2, gen_gvec_ool_arg_zzz,
116
+ uabdl_fns[a->esz], a, 3)
117
118
-DO_SVE2_ZZZ_TB(SADDLBT, saddl, false, true)
119
-DO_SVE2_ZZZ_TB(SSUBLBT, ssubl, false, true)
120
-DO_SVE2_ZZZ_TB(SSUBLTB, ssubl, true, false)
121
+static gen_helper_gvec_3 * const sqdmull_fns[4] = {
122
+ NULL, gen_helper_sve2_sqdmull_zzz_h,
123
+ gen_helper_sve2_sqdmull_zzz_s, gen_helper_sve2_sqdmull_zzz_d,
124
+};
125
+TRANS_FEAT(SQDMULLB_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
126
+ sqdmull_fns[a->esz], a, 0)
127
+TRANS_FEAT(SQDMULLT_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
128
+ sqdmull_fns[a->esz], a, 3)
129
130
-DO_SVE2_ZZZ_TB(SQDMULLB_zzz, sqdmull_zzz, false, false)
131
-DO_SVE2_ZZZ_TB(SQDMULLT_zzz, sqdmull_zzz, true, true)
132
+static gen_helper_gvec_3 * const smull_fns[4] = {
133
+ NULL, gen_helper_sve2_smull_zzz_h,
134
+ gen_helper_sve2_smull_zzz_s, gen_helper_sve2_smull_zzz_d,
135
+};
136
+TRANS_FEAT(SMULLB_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
137
+ smull_fns[a->esz], a, 0)
138
+TRANS_FEAT(SMULLT_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
139
+ smull_fns[a->esz], a, 3)
140
141
-DO_SVE2_ZZZ_TB(SMULLB_zzz, smull_zzz, false, false)
142
-DO_SVE2_ZZZ_TB(SMULLT_zzz, smull_zzz, true, true)
143
+static gen_helper_gvec_3 * const umull_fns[4] = {
144
+ NULL, gen_helper_sve2_umull_zzz_h,
145
+ gen_helper_sve2_umull_zzz_s, gen_helper_sve2_umull_zzz_d,
146
+};
147
+TRANS_FEAT(UMULLB_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
148
+ umull_fns[a->esz], a, 0)
149
+TRANS_FEAT(UMULLT_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
150
+ umull_fns[a->esz], a, 3)
151
152
-DO_SVE2_ZZZ_TB(UMULLB_zzz, umull_zzz, false, false)
153
-DO_SVE2_ZZZ_TB(UMULLT_zzz, umull_zzz, true, true)
154
-
155
-static bool do_eor_tb(DisasContext *s, arg_rrr_esz *a, bool sel1)
156
-{
157
- static gen_helper_gvec_3 * const fns[4] = {
158
- gen_helper_sve2_eoril_b, gen_helper_sve2_eoril_h,
159
- gen_helper_sve2_eoril_s, gen_helper_sve2_eoril_d,
160
- };
161
- return do_sve2_zzw_ool(s, a, fns[a->esz], (!sel1 << 1) | sel1);
162
-}
163
-
164
-static bool trans_EORBT(DisasContext *s, arg_rrr_esz *a)
165
-{
166
- return do_eor_tb(s, a, false);
167
-}
168
-
169
-static bool trans_EORTB(DisasContext *s, arg_rrr_esz *a)
170
-{
171
- return do_eor_tb(s, a, true);
172
-}
173
+static gen_helper_gvec_3 * const eoril_fns[4] = {
174
+ gen_helper_sve2_eoril_b, gen_helper_sve2_eoril_h,
175
+ gen_helper_sve2_eoril_s, gen_helper_sve2_eoril_d,
176
+};
177
+TRANS_FEAT(EORBT, aa64_sve2, gen_gvec_ool_arg_zzz, eoril_fns[a->esz], a, 2)
178
+TRANS_FEAT(EORTB, aa64_sve2, gen_gvec_ool_arg_zzz, eoril_fns[a->esz], a, 1)
179
180
static bool do_trans_pmull(DisasContext *s, arg_rrr_esz *a, bool sel)
181
{
182
@@ -XXX,XX +XXX,XX @@ static bool do_trans_pmull(DisasContext *s, arg_rrr_esz *a, bool sel)
183
if (a->esz == 0 && !dc_isar_feature(aa64_sve2_pmull128, s)) {
184
return false;
185
}
186
- return do_sve2_zzw_ool(s, a, fns[a->esz], sel);
187
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, sel);
188
}
189
190
-static bool trans_PMULLB(DisasContext *s, arg_rrr_esz *a)
191
-{
192
- return do_trans_pmull(s, a, false);
193
-}
194
+TRANS_FEAT(PMULLB, aa64_sve2, do_trans_pmull, a, false)
195
+TRANS_FEAT(PMULLT, aa64_sve2, do_trans_pmull, a, true)
196
197
-static bool trans_PMULLT(DisasContext *s, arg_rrr_esz *a)
198
-{
199
- return do_trans_pmull(s, a, true);
200
-}
201
+static gen_helper_gvec_3 * const saddw_fns[4] = {
202
+ NULL, gen_helper_sve2_saddw_h,
203
+ gen_helper_sve2_saddw_s, gen_helper_sve2_saddw_d,
204
+};
205
+TRANS_FEAT(SADDWB, aa64_sve2, gen_gvec_ool_arg_zzz, saddw_fns[a->esz], a, 0)
206
+TRANS_FEAT(SADDWT, aa64_sve2, gen_gvec_ool_arg_zzz, saddw_fns[a->esz], a, 1)
207
208
-#define DO_SVE2_ZZZ_WTB(NAME, name, SEL2) \
209
-static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
210
-{ \
211
- static gen_helper_gvec_3 * const fns[4] = { \
212
- NULL, gen_helper_sve2_##name##_h, \
213
- gen_helper_sve2_##name##_s, gen_helper_sve2_##name##_d, \
214
- }; \
215
- return do_sve2_zzw_ool(s, a, fns[a->esz], SEL2); \
216
-}
217
+static gen_helper_gvec_3 * const ssubw_fns[4] = {
218
+ NULL, gen_helper_sve2_ssubw_h,
219
+ gen_helper_sve2_ssubw_s, gen_helper_sve2_ssubw_d,
220
+};
221
+TRANS_FEAT(SSUBWB, aa64_sve2, gen_gvec_ool_arg_zzz, ssubw_fns[a->esz], a, 0)
222
+TRANS_FEAT(SSUBWT, aa64_sve2, gen_gvec_ool_arg_zzz, ssubw_fns[a->esz], a, 1)
223
224
-DO_SVE2_ZZZ_WTB(SADDWB, saddw, false)
225
-DO_SVE2_ZZZ_WTB(SADDWT, saddw, true)
226
-DO_SVE2_ZZZ_WTB(SSUBWB, ssubw, false)
227
-DO_SVE2_ZZZ_WTB(SSUBWT, ssubw, true)
228
+static gen_helper_gvec_3 * const uaddw_fns[4] = {
229
+ NULL, gen_helper_sve2_uaddw_h,
230
+ gen_helper_sve2_uaddw_s, gen_helper_sve2_uaddw_d,
231
+};
232
+TRANS_FEAT(UADDWB, aa64_sve2, gen_gvec_ool_arg_zzz, uaddw_fns[a->esz], a, 0)
233
+TRANS_FEAT(UADDWT, aa64_sve2, gen_gvec_ool_arg_zzz, uaddw_fns[a->esz], a, 1)
234
235
-DO_SVE2_ZZZ_WTB(UADDWB, uaddw, false)
236
-DO_SVE2_ZZZ_WTB(UADDWT, uaddw, true)
237
-DO_SVE2_ZZZ_WTB(USUBWB, usubw, false)
238
-DO_SVE2_ZZZ_WTB(USUBWT, usubw, true)
239
+static gen_helper_gvec_3 * const usubw_fns[4] = {
240
+ NULL, gen_helper_sve2_usubw_h,
241
+ gen_helper_sve2_usubw_s, gen_helper_sve2_usubw_d,
242
+};
243
+TRANS_FEAT(USUBWB, aa64_sve2, gen_gvec_ool_arg_zzz, usubw_fns[a->esz], a, 0)
244
+TRANS_FEAT(USUBWT, aa64_sve2, gen_gvec_ool_arg_zzz, usubw_fns[a->esz], a, 1)
245
246
static void gen_sshll_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t imm)
247
{
248
@@ -XXX,XX +XXX,XX @@ static bool trans_USHLLT(DisasContext *s, arg_rri_esz *a)
249
return do_sve2_shll_tb(s, a, true, true);
250
}
251
252
-static bool trans_BEXT(DisasContext *s, arg_rrr_esz *a)
253
-{
254
- static gen_helper_gvec_3 * const fns[4] = {
255
- gen_helper_sve2_bext_b, gen_helper_sve2_bext_h,
256
- gen_helper_sve2_bext_s, gen_helper_sve2_bext_d,
257
- };
258
- if (!dc_isar_feature(aa64_sve2_bitperm, s)) {
259
- return false;
260
- }
261
- return do_sve2_zzw_ool(s, a, fns[a->esz], 0);
262
-}
263
+static gen_helper_gvec_3 * const bext_fns[4] = {
264
+ gen_helper_sve2_bext_b, gen_helper_sve2_bext_h,
265
+ gen_helper_sve2_bext_s, gen_helper_sve2_bext_d,
266
+};
267
+TRANS_FEAT(BEXT, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
268
+ bext_fns[a->esz], a, 0)
269
270
-static bool trans_BDEP(DisasContext *s, arg_rrr_esz *a)
271
-{
272
- static gen_helper_gvec_3 * const fns[4] = {
273
- gen_helper_sve2_bdep_b, gen_helper_sve2_bdep_h,
274
- gen_helper_sve2_bdep_s, gen_helper_sve2_bdep_d,
275
- };
276
- if (!dc_isar_feature(aa64_sve2_bitperm, s)) {
277
- return false;
278
- }
279
- return do_sve2_zzw_ool(s, a, fns[a->esz], 0);
280
-}
281
+static gen_helper_gvec_3 * const bdep_fns[4] = {
282
+ gen_helper_sve2_bdep_b, gen_helper_sve2_bdep_h,
283
+ gen_helper_sve2_bdep_s, gen_helper_sve2_bdep_d,
284
+};
285
+TRANS_FEAT(BDEP, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
286
+ bdep_fns[a->esz], a, 0)
287
288
-static bool trans_BGRP(DisasContext *s, arg_rrr_esz *a)
289
-{
290
- static gen_helper_gvec_3 * const fns[4] = {
291
- gen_helper_sve2_bgrp_b, gen_helper_sve2_bgrp_h,
292
- gen_helper_sve2_bgrp_s, gen_helper_sve2_bgrp_d,
293
- };
294
- if (!dc_isar_feature(aa64_sve2_bitperm, s)) {
295
- return false;
296
- }
297
- return do_sve2_zzw_ool(s, a, fns[a->esz], 0);
298
-}
299
+static gen_helper_gvec_3 * const bgrp_fns[4] = {
300
+ gen_helper_sve2_bgrp_b, gen_helper_sve2_bgrp_h,
301
+ gen_helper_sve2_bgrp_s, gen_helper_sve2_bgrp_d,
302
+};
303
+TRANS_FEAT(BGRP, aa64_sve2_bitperm, gen_gvec_ool_arg_zzz,
304
+ bgrp_fns[a->esz], a, 0)
305
306
-static bool do_cadd(DisasContext *s, arg_rrr_esz *a, bool sq, bool rot)
307
-{
308
- static gen_helper_gvec_3 * const fns[2][4] = {
309
- { gen_helper_sve2_cadd_b, gen_helper_sve2_cadd_h,
310
- gen_helper_sve2_cadd_s, gen_helper_sve2_cadd_d },
311
- { gen_helper_sve2_sqcadd_b, gen_helper_sve2_sqcadd_h,
312
- gen_helper_sve2_sqcadd_s, gen_helper_sve2_sqcadd_d },
313
- };
314
- return do_sve2_zzw_ool(s, a, fns[sq][a->esz], rot);
315
-}
316
+static gen_helper_gvec_3 * const cadd_fns[4] = {
317
+ gen_helper_sve2_cadd_b, gen_helper_sve2_cadd_h,
318
+ gen_helper_sve2_cadd_s, gen_helper_sve2_cadd_d,
319
+};
320
+TRANS_FEAT(CADD_rot90, aa64_sve2, gen_gvec_ool_arg_zzz,
321
+ cadd_fns[a->esz], a, 0)
322
+TRANS_FEAT(CADD_rot270, aa64_sve2, gen_gvec_ool_arg_zzz,
323
+ cadd_fns[a->esz], a, 1)
324
325
-static bool trans_CADD_rot90(DisasContext *s, arg_rrr_esz *a)
326
-{
327
- return do_cadd(s, a, false, false);
328
-}
329
-
330
-static bool trans_CADD_rot270(DisasContext *s, arg_rrr_esz *a)
331
-{
332
- return do_cadd(s, a, false, true);
333
-}
334
-
335
-static bool trans_SQCADD_rot90(DisasContext *s, arg_rrr_esz *a)
336
-{
337
- return do_cadd(s, a, true, false);
338
-}
339
-
340
-static bool trans_SQCADD_rot270(DisasContext *s, arg_rrr_esz *a)
341
-{
342
- return do_cadd(s, a, true, true);
343
-}
344
+static gen_helper_gvec_3 * const sqcadd_fns[4] = {
345
+ gen_helper_sve2_sqcadd_b, gen_helper_sve2_sqcadd_h,
346
+ gen_helper_sve2_sqcadd_s, gen_helper_sve2_sqcadd_d,
347
+};
348
+TRANS_FEAT(SQCADD_rot90, aa64_sve2, gen_gvec_ool_arg_zzz,
349
+ sqcadd_fns[a->esz], a, 0)
350
+TRANS_FEAT(SQCADD_rot270, aa64_sve2, gen_gvec_ool_arg_zzz,
351
+ sqcadd_fns[a->esz], a, 1)
352
353
static gen_helper_gvec_4 * const sabal_fns[4] = {
354
NULL, gen_helper_sve2_sabal_h,
355
--
356
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
This is the last direct user of tcg_gen_gvec_4_ool.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-19-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate-sve.c | 17 ++---------------
11
1 file changed, 2 insertions(+), 15 deletions(-)
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_4 * const sqrdcmlah_fns[] = {
18
TRANS_FEAT(SQRDCMLAH_zzzz, aa64_sve2, gen_gvec_ool_zzzz,
19
sqrdcmlah_fns[a->esz], a->rd, a->rn, a->rm, a->ra, a->rot)
20
21
-static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
22
-{
23
- if (a->esz != 2 || !dc_isar_feature(aa64_sve_i8mm, s)) {
24
- return false;
25
- }
26
- if (sve_access_check(s)) {
27
- unsigned vsz = vec_full_reg_size(s);
28
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, a->rd),
29
- vec_full_reg_offset(s, a->rn),
30
- vec_full_reg_offset(s, a->rm),
31
- vec_full_reg_offset(s, a->ra),
32
- vsz, vsz, 0, gen_helper_gvec_usdot_b);
33
- }
34
- return true;
35
-}
36
+TRANS_FEAT(USDOT_zzzz, aa64_sve_i8mm, gen_gvec_ool_arg_zzzz,
37
+ a->esz == 2 ? gen_helper_gvec_usdot_b : NULL, a, 0)
38
39
TRANS_FEAT(AESMC, aa64_sve2_aes, gen_gvec_ool_zz,
40
gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt)
41
--
42
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-20-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 37 +++++++++++++++----------------------
9
1 file changed, 15 insertions(+), 22 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzxz(DisasContext *s, gen_helper_gvec_4 *fn,
16
}
17
18
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
19
-static void gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
20
+static bool gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
21
int rd, int rn, int pg, int data)
22
{
23
- unsigned vsz = vec_full_reg_size(s);
24
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
25
- vec_full_reg_offset(s, rn),
26
- pred_full_reg_offset(s, pg),
27
- vsz, vsz, data, fn);
28
+ if (fn == NULL) {
29
+ return false;
30
+ }
31
+ if (sve_access_check(s)) {
32
+ unsigned vsz = vec_full_reg_size(s);
33
+ tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
34
+ vec_full_reg_offset(s, rn),
35
+ pred_full_reg_offset(s, pg),
36
+ vsz, vsz, data, fn);
37
+ }
38
+ return true;
39
}
40
41
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
42
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
43
44
static bool do_zpz_ool(DisasContext *s, arg_rpr_esz *a, gen_helper_gvec_3 *fn)
45
{
46
- if (fn == NULL) {
47
- return false;
48
- }
49
- if (sve_access_check(s)) {
50
- gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, 0);
51
- }
52
- return true;
53
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, 0);
54
}
55
56
#define DO_ZPZ(NAME, name) \
57
@@ -XXX,XX +XXX,XX @@ static bool do_movz_zpz(DisasContext *s, int rd, int rn, int pg,
58
gen_helper_sve_movz_b, gen_helper_sve_movz_h,
59
gen_helper_sve_movz_s, gen_helper_sve_movz_d,
60
};
61
-
62
- if (sve_access_check(s)) {
63
- gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
64
- }
65
- return true;
66
+ return gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
67
}
68
69
static bool do_zpzi_ool(DisasContext *s, arg_rpri_esz *a,
70
gen_helper_gvec_3 *fn)
71
{
72
- if (sve_access_check(s)) {
73
- gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
74
- }
75
- return true;
76
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
77
}
78
79
static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
80
--
81
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using do_sve2_zpz_data
4
to use TRANS_FEAT and gen_gvec_ool_arg_zpz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-23-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 53 ++++++++++----------------------------
12
1 file changed, 14 insertions(+), 39 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_UADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
19
* SVE2 integer unary operations (predicated)
20
*/
21
22
-static bool do_sve2_zpz_ool(DisasContext *s, arg_rpr_esz *a,
23
- gen_helper_gvec_3 *fn)
24
-{
25
- if (!dc_isar_feature(aa64_sve2, s)) {
26
- return false;
27
- }
28
- return gen_gvec_ool_arg_zpz(s, fn, a, 0);
29
-}
30
+TRANS_FEAT(URECPE, aa64_sve2, gen_gvec_ool_arg_zpz,
31
+ a->esz == 2 ? gen_helper_sve2_urecpe_s : NULL, a, 0)
32
33
-static bool trans_URECPE(DisasContext *s, arg_rpr_esz *a)
34
-{
35
- if (a->esz != 2) {
36
- return false;
37
- }
38
- return do_sve2_zpz_ool(s, a, gen_helper_sve2_urecpe_s);
39
-}
40
+TRANS_FEAT(URSQRTE, aa64_sve2, gen_gvec_ool_arg_zpz,
41
+ a->esz == 2 ? gen_helper_sve2_ursqrte_s : NULL, a, 0)
42
43
-static bool trans_URSQRTE(DisasContext *s, arg_rpr_esz *a)
44
-{
45
- if (a->esz != 2) {
46
- return false;
47
- }
48
- return do_sve2_zpz_ool(s, a, gen_helper_sve2_ursqrte_s);
49
-}
50
+static gen_helper_gvec_3 * const sqabs_fns[4] = {
51
+ gen_helper_sve2_sqabs_b, gen_helper_sve2_sqabs_h,
52
+ gen_helper_sve2_sqabs_s, gen_helper_sve2_sqabs_d,
53
+};
54
+TRANS_FEAT(SQABS, aa64_sve2, gen_gvec_ool_arg_zpz, sqabs_fns[a->esz], a, 0)
55
56
-static bool trans_SQABS(DisasContext *s, arg_rpr_esz *a)
57
-{
58
- static gen_helper_gvec_3 * const fns[4] = {
59
- gen_helper_sve2_sqabs_b, gen_helper_sve2_sqabs_h,
60
- gen_helper_sve2_sqabs_s, gen_helper_sve2_sqabs_d,
61
- };
62
- return do_sve2_zpz_ool(s, a, fns[a->esz]);
63
-}
64
-
65
-static bool trans_SQNEG(DisasContext *s, arg_rpr_esz *a)
66
-{
67
- static gen_helper_gvec_3 * const fns[4] = {
68
- gen_helper_sve2_sqneg_b, gen_helper_sve2_sqneg_h,
69
- gen_helper_sve2_sqneg_s, gen_helper_sve2_sqneg_d,
70
- };
71
- return do_sve2_zpz_ool(s, a, fns[a->esz]);
72
-}
73
+static gen_helper_gvec_3 * const sqneg_fns[4] = {
74
+ gen_helper_sve2_sqneg_b, gen_helper_sve2_sqneg_h,
75
+ gen_helper_sve2_sqneg_s, gen_helper_sve2_sqneg_d,
76
+};
77
+TRANS_FEAT(SQNEG, aa64_sve2, gen_gvec_ool_arg_zpz, sqneg_fns[a->esz], a, 0)
78
79
#define DO_SVE2_ZPZZ(NAME, name) \
80
static bool trans_##NAME(DisasContext *s, arg_rprr_esz *a) \
81
--
82
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert some SVE translation functions using
4
gen_gvec_ool_arg_zpzi to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-25-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 85 ++++++++++++++------------------------
12
1 file changed, 30 insertions(+), 55 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
19
}
20
}
21
22
-static bool trans_SQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
23
-{
24
- static gen_helper_gvec_3 * const fns[4] = {
25
- gen_helper_sve2_sqshl_zpzi_b, gen_helper_sve2_sqshl_zpzi_h,
26
- gen_helper_sve2_sqshl_zpzi_s, gen_helper_sve2_sqshl_zpzi_d,
27
- };
28
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
29
- return false;
30
- }
31
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
32
-}
33
+static gen_helper_gvec_3 * const sqshl_zpzi_fns[4] = {
34
+ gen_helper_sve2_sqshl_zpzi_b, gen_helper_sve2_sqshl_zpzi_h,
35
+ gen_helper_sve2_sqshl_zpzi_s, gen_helper_sve2_sqshl_zpzi_d,
36
+};
37
+TRANS_FEAT(SQSHL_zpzi, aa64_sve2, gen_gvec_ool_arg_zpzi,
38
+ a->esz < 0 ? NULL : sqshl_zpzi_fns[a->esz], a)
39
40
-static bool trans_UQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
41
-{
42
- static gen_helper_gvec_3 * const fns[4] = {
43
- gen_helper_sve2_uqshl_zpzi_b, gen_helper_sve2_uqshl_zpzi_h,
44
- gen_helper_sve2_uqshl_zpzi_s, gen_helper_sve2_uqshl_zpzi_d,
45
- };
46
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
47
- return false;
48
- }
49
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
50
-}
51
+static gen_helper_gvec_3 * const uqshl_zpzi_fns[4] = {
52
+ gen_helper_sve2_uqshl_zpzi_b, gen_helper_sve2_uqshl_zpzi_h,
53
+ gen_helper_sve2_uqshl_zpzi_s, gen_helper_sve2_uqshl_zpzi_d,
54
+};
55
+TRANS_FEAT(UQSHL_zpzi, aa64_sve2, gen_gvec_ool_arg_zpzi,
56
+ a->esz < 0 ? NULL : uqshl_zpzi_fns[a->esz], a)
57
58
-static bool trans_SRSHR(DisasContext *s, arg_rpri_esz *a)
59
-{
60
- static gen_helper_gvec_3 * const fns[4] = {
61
- gen_helper_sve2_srshr_b, gen_helper_sve2_srshr_h,
62
- gen_helper_sve2_srshr_s, gen_helper_sve2_srshr_d,
63
- };
64
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
65
- return false;
66
- }
67
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
68
-}
69
+static gen_helper_gvec_3 * const srshr_fns[4] = {
70
+ gen_helper_sve2_srshr_b, gen_helper_sve2_srshr_h,
71
+ gen_helper_sve2_srshr_s, gen_helper_sve2_srshr_d,
72
+};
73
+TRANS_FEAT(SRSHR, aa64_sve2, gen_gvec_ool_arg_zpzi,
74
+ a->esz < 0 ? NULL : srshr_fns[a->esz], a)
75
76
-static bool trans_URSHR(DisasContext *s, arg_rpri_esz *a)
77
-{
78
- static gen_helper_gvec_3 * const fns[4] = {
79
- gen_helper_sve2_urshr_b, gen_helper_sve2_urshr_h,
80
- gen_helper_sve2_urshr_s, gen_helper_sve2_urshr_d,
81
- };
82
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
83
- return false;
84
- }
85
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
86
-}
87
+static gen_helper_gvec_3 * const urshr_fns[4] = {
88
+ gen_helper_sve2_urshr_b, gen_helper_sve2_urshr_h,
89
+ gen_helper_sve2_urshr_s, gen_helper_sve2_urshr_d,
90
+};
91
+TRANS_FEAT(URSHR, aa64_sve2, gen_gvec_ool_arg_zpzi,
92
+ a->esz < 0 ? NULL : urshr_fns[a->esz], a)
93
94
-static bool trans_SQSHLU(DisasContext *s, arg_rpri_esz *a)
95
-{
96
- static gen_helper_gvec_3 * const fns[4] = {
97
- gen_helper_sve2_sqshlu_b, gen_helper_sve2_sqshlu_h,
98
- gen_helper_sve2_sqshlu_s, gen_helper_sve2_sqshlu_d,
99
- };
100
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
101
- return false;
102
- }
103
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
104
-}
105
+static gen_helper_gvec_3 * const sqshlu_fns[4] = {
106
+ gen_helper_sve2_sqshlu_b, gen_helper_sve2_sqshlu_h,
107
+ gen_helper_sve2_sqshlu_s, gen_helper_sve2_sqshlu_d,
108
+};
109
+TRANS_FEAT(SQSHLU, aa64_sve2, gen_gvec_ool_arg_zpzi,
110
+ a->esz < 0 ? NULL : sqshlu_fns[a->esz], a)
111
112
/*
113
*** SVE Bitwise Shift - Predicated Group
114
--
115
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-26-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 42 ++++++++++++++++----------------------
9
1 file changed, 18 insertions(+), 24 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzi(DisasContext *s, gen_helper_gvec_3 *fn,
16
}
17
18
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
19
-static void gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
20
+static bool gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
21
int rd, int rn, int rm, int pg, int data)
22
{
23
- unsigned vsz = vec_full_reg_size(s);
24
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
25
- vec_full_reg_offset(s, rn),
26
- vec_full_reg_offset(s, rm),
27
- pred_full_reg_offset(s, pg),
28
- vsz, vsz, data, fn);
29
+ if (fn == NULL) {
30
+ return false;
31
+ }
32
+ if (sve_access_check(s)) {
33
+ unsigned vsz = vec_full_reg_size(s);
34
+ tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
35
+ vec_full_reg_offset(s, rn),
36
+ vec_full_reg_offset(s, rm),
37
+ pred_full_reg_offset(s, pg),
38
+ vsz, vsz, data, fn);
39
+ }
40
+ return true;
41
}
42
43
/* Invoke a vector expander on two Zregs. */
44
@@ -XXX,XX +XXX,XX @@ static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
45
46
static bool do_zpzz_ool(DisasContext *s, arg_rprr_esz *a, gen_helper_gvec_4 *fn)
47
{
48
- if (fn == NULL) {
49
- return false;
50
- }
51
- if (sve_access_check(s)) {
52
- gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, 0);
53
- }
54
- return true;
55
+ return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, 0);
56
}
57
58
/* Select active elememnts from Zn and inactive elements from Zm,
59
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(REVW, aa64_sve, gen_gvec_ool_arg_zpz,
60
61
static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
62
{
63
- if (sve_access_check(s)) {
64
- gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
65
- a->rd, a->rn, a->rm, a->pg, a->esz);
66
- }
67
- return true;
68
+ return gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
69
+ a->rd, a->rn, a->rm, a->pg, a->esz);
70
}
71
72
static bool trans_SPLICE_sve2(DisasContext *s, arg_rpr_esz *a)
73
@@ -XXX,XX +XXX,XX @@ static bool trans_SPLICE_sve2(DisasContext *s, arg_rpr_esz *a)
74
if (!dc_isar_feature(aa64_sve2, s)) {
75
return false;
76
}
77
- if (sve_access_check(s)) {
78
- gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
79
- a->rd, a->rn, (a->rn + 1) % 32, a->pg, a->esz);
80
- }
81
- return true;
82
+ return gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
83
+ a->rd, a->rn, (a->rn + 1) % 32, a->pg, a->esz);
84
}
85
86
/*
87
--
88
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Use gen_gvec_ool_arg_zpzz instead of gen_gvec_ool_zzzp
4
when the arguments come from arg_rprr_esz.
5
Replaces do_zpzz_ool.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-27-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
---
12
target/arm/translate-sve.c | 21 +++++++++++----------
13
1 file changed, 11 insertions(+), 10 deletions(-)
14
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
18
+++ b/target/arm/translate-sve.c
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
20
return true;
21
}
22
23
+static bool gen_gvec_ool_arg_zpzz(DisasContext *s, gen_helper_gvec_4 *fn,
24
+ arg_rprr_esz *a, int data)
25
+{
26
+ return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, data);
27
+}
28
+
29
/* Invoke a vector expander on two Zregs. */
30
static void gen_gvec_fn_zz(DisasContext *s, GVecGen2Fn *gvec_fn,
31
int esz, int rd, int rn)
32
@@ -XXX,XX +XXX,XX @@ static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
33
*** SVE Integer Arithmetic - Binary Predicated Group
34
*/
35
36
-static bool do_zpzz_ool(DisasContext *s, arg_rprr_esz *a, gen_helper_gvec_4 *fn)
37
-{
38
- return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, 0);
39
-}
40
-
41
/* Select active elememnts from Zn and inactive elements from Zm,
42
* storing the result in Zd.
43
*/
44
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME##_zpzz(DisasContext *s, arg_rprr_esz *a) \
45
gen_helper_sve_##name##_zpzz_b, gen_helper_sve_##name##_zpzz_h, \
46
gen_helper_sve_##name##_zpzz_s, gen_helper_sve_##name##_zpzz_d, \
47
}; \
48
- return do_zpzz_ool(s, a, fns[a->esz]); \
49
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0); \
50
}
51
52
DO_ZPZZ(AND, and)
53
@@ -XXX,XX +XXX,XX @@ static bool trans_SDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
54
static gen_helper_gvec_4 * const fns[4] = {
55
NULL, NULL, gen_helper_sve_sdiv_zpzz_s, gen_helper_sve_sdiv_zpzz_d
56
};
57
- return do_zpzz_ool(s, a, fns[a->esz]);
58
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0);
59
}
60
61
static bool trans_UDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
62
@@ -XXX,XX +XXX,XX @@ static bool trans_UDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
63
static gen_helper_gvec_4 * const fns[4] = {
64
NULL, NULL, gen_helper_sve_udiv_zpzz_s, gen_helper_sve_udiv_zpzz_d
65
};
66
- return do_zpzz_ool(s, a, fns[a->esz]);
67
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0);
68
}
69
70
static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
71
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME##_zpzw(DisasContext *s, arg_rprr_esz *a) \
72
if (a->esz < 0 || a->esz >= 3) { \
73
return false; \
74
} \
75
- return do_zpzz_ool(s, a, fns[a->esz]); \
76
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0); \
77
}
78
79
DO_ZPZW(ASR, asr)
80
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zpzz_ool(DisasContext *s, arg_rprr_esz *a,
81
if (!dc_isar_feature(aa64_sve2, s)) {
82
return false;
83
}
84
- return do_zpzz_ool(s, a, fn);
85
+ return gen_gvec_ool_arg_zpzz(s, fn, a, 0);
86
}
87
88
static bool trans_SADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
89
--
90
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions directly using
4
gen_gvec_ool_arg_zpzz to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-28-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 85 ++++++++++++++++----------------------
12
1 file changed, 36 insertions(+), 49 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static void do_sel_z(DisasContext *s, int rd, int rn, int rm, int pg, int esz)
19
gen_gvec_ool_zzzp(s, fns[esz], rd, rn, rm, pg, 0);
20
}
21
22
-#define DO_ZPZZ(NAME, name) \
23
-static bool trans_##NAME##_zpzz(DisasContext *s, arg_rprr_esz *a) \
24
-{ \
25
- static gen_helper_gvec_4 * const fns[4] = { \
26
- gen_helper_sve_##name##_zpzz_b, gen_helper_sve_##name##_zpzz_h, \
27
- gen_helper_sve_##name##_zpzz_s, gen_helper_sve_##name##_zpzz_d, \
28
+#define DO_ZPZZ(NAME, FEAT, name) \
29
+ static gen_helper_gvec_4 * const name##_zpzz_fns[4] = { \
30
+ gen_helper_##name##_zpzz_b, gen_helper_##name##_zpzz_h, \
31
+ gen_helper_##name##_zpzz_s, gen_helper_##name##_zpzz_d, \
32
}; \
33
- return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0); \
34
-}
35
+ TRANS_FEAT(NAME, FEAT, gen_gvec_ool_arg_zpzz, \
36
+ name##_zpzz_fns[a->esz], a, 0)
37
38
-DO_ZPZZ(AND, and)
39
-DO_ZPZZ(EOR, eor)
40
-DO_ZPZZ(ORR, orr)
41
-DO_ZPZZ(BIC, bic)
42
+DO_ZPZZ(AND_zpzz, aa64_sve, sve_and)
43
+DO_ZPZZ(EOR_zpzz, aa64_sve, sve_eor)
44
+DO_ZPZZ(ORR_zpzz, aa64_sve, sve_orr)
45
+DO_ZPZZ(BIC_zpzz, aa64_sve, sve_bic)
46
47
-DO_ZPZZ(ADD, add)
48
-DO_ZPZZ(SUB, sub)
49
+DO_ZPZZ(ADD_zpzz, aa64_sve, sve_add)
50
+DO_ZPZZ(SUB_zpzz, aa64_sve, sve_sub)
51
52
-DO_ZPZZ(SMAX, smax)
53
-DO_ZPZZ(UMAX, umax)
54
-DO_ZPZZ(SMIN, smin)
55
-DO_ZPZZ(UMIN, umin)
56
-DO_ZPZZ(SABD, sabd)
57
-DO_ZPZZ(UABD, uabd)
58
+DO_ZPZZ(SMAX_zpzz, aa64_sve, sve_smax)
59
+DO_ZPZZ(UMAX_zpzz, aa64_sve, sve_umax)
60
+DO_ZPZZ(SMIN_zpzz, aa64_sve, sve_smin)
61
+DO_ZPZZ(UMIN_zpzz, aa64_sve, sve_umin)
62
+DO_ZPZZ(SABD_zpzz, aa64_sve, sve_sabd)
63
+DO_ZPZZ(UABD_zpzz, aa64_sve, sve_uabd)
64
65
-DO_ZPZZ(MUL, mul)
66
-DO_ZPZZ(SMULH, smulh)
67
-DO_ZPZZ(UMULH, umulh)
68
+DO_ZPZZ(MUL_zpzz, aa64_sve, sve_mul)
69
+DO_ZPZZ(SMULH_zpzz, aa64_sve, sve_smulh)
70
+DO_ZPZZ(UMULH_zpzz, aa64_sve, sve_umulh)
71
72
-DO_ZPZZ(ASR, asr)
73
-DO_ZPZZ(LSR, lsr)
74
-DO_ZPZZ(LSL, lsl)
75
+DO_ZPZZ(ASR_zpzz, aa64_sve, sve_asr)
76
+DO_ZPZZ(LSR_zpzz, aa64_sve, sve_lsr)
77
+DO_ZPZZ(LSL_zpzz, aa64_sve, sve_lsl)
78
79
-static bool trans_SDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
80
-{
81
- static gen_helper_gvec_4 * const fns[4] = {
82
- NULL, NULL, gen_helper_sve_sdiv_zpzz_s, gen_helper_sve_sdiv_zpzz_d
83
- };
84
- return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0);
85
-}
86
+static gen_helper_gvec_4 * const sdiv_fns[4] = {
87
+ NULL, NULL, gen_helper_sve_sdiv_zpzz_s, gen_helper_sve_sdiv_zpzz_d
88
+};
89
+TRANS_FEAT(SDIV_zpzz, aa64_sve, gen_gvec_ool_arg_zpzz, sdiv_fns[a->esz], a, 0)
90
91
-static bool trans_UDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
92
-{
93
- static gen_helper_gvec_4 * const fns[4] = {
94
- NULL, NULL, gen_helper_sve_udiv_zpzz_s, gen_helper_sve_udiv_zpzz_d
95
- };
96
- return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0);
97
-}
98
+static gen_helper_gvec_4 * const udiv_fns[4] = {
99
+ NULL, NULL, gen_helper_sve_udiv_zpzz_s, gen_helper_sve_udiv_zpzz_d
100
+};
101
+TRANS_FEAT(UDIV_zpzz, aa64_sve, gen_gvec_ool_arg_zpzz, udiv_fns[a->esz], a, 0)
102
103
static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
104
{
105
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SQSHLU, aa64_sve2, gen_gvec_ool_arg_zpzi,
106
*/
107
108
#define DO_ZPZW(NAME, name) \
109
-static bool trans_##NAME##_zpzw(DisasContext *s, arg_rprr_esz *a) \
110
-{ \
111
- static gen_helper_gvec_4 * const fns[3] = { \
112
+ static gen_helper_gvec_4 * const name##_zpzw_fns[4] = { \
113
gen_helper_sve_##name##_zpzw_b, gen_helper_sve_##name##_zpzw_h, \
114
- gen_helper_sve_##name##_zpzw_s, \
115
+ gen_helper_sve_##name##_zpzw_s, NULL \
116
}; \
117
- if (a->esz < 0 || a->esz >= 3) { \
118
- return false; \
119
- } \
120
- return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0); \
121
-}
122
+ TRANS_FEAT(NAME##_zpzw, aa64_sve, gen_gvec_ool_arg_zpzz, \
123
+ a->esz < 0 ? NULL : name##_zpzw_fns[a->esz], a, 0)
124
125
DO_ZPZW(ASR, asr)
126
DO_ZPZW(LSR, lsr)
127
--
128
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using do_sve2_zpzz_ool
4
to use TRANS_FEAT and gen_gvec_ool_arg_zpzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-29-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 118 +++++++++++++------------------------
12
1 file changed, 40 insertions(+), 78 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
19
return true;
20
}
21
22
-#undef DO_ZPZZ
23
-
24
/*
25
*** SVE Integer Arithmetic - Unary Predicated Group
26
*/
27
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SQRDMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
28
* SVE2 Integer - Predicated
29
*/
30
31
-static bool do_sve2_zpzz_ool(DisasContext *s, arg_rprr_esz *a,
32
- gen_helper_gvec_4 *fn)
33
-{
34
- if (!dc_isar_feature(aa64_sve2, s)) {
35
- return false;
36
- }
37
- return gen_gvec_ool_arg_zpzz(s, fn, a, 0);
38
-}
39
+static gen_helper_gvec_4 * const sadlp_fns[4] = {
40
+ NULL, gen_helper_sve2_sadalp_zpzz_h,
41
+ gen_helper_sve2_sadalp_zpzz_s, gen_helper_sve2_sadalp_zpzz_d,
42
+};
43
+TRANS_FEAT(SADALP_zpzz, aa64_sve2, gen_gvec_ool_arg_zpzz,
44
+ sadlp_fns[a->esz], a, 0)
45
46
-static bool trans_SADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
47
-{
48
- static gen_helper_gvec_4 * const fns[3] = {
49
- gen_helper_sve2_sadalp_zpzz_h,
50
- gen_helper_sve2_sadalp_zpzz_s,
51
- gen_helper_sve2_sadalp_zpzz_d,
52
- };
53
- if (a->esz == 0) {
54
- return false;
55
- }
56
- return do_sve2_zpzz_ool(s, a, fns[a->esz - 1]);
57
-}
58
-
59
-static bool trans_UADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
60
-{
61
- static gen_helper_gvec_4 * const fns[3] = {
62
- gen_helper_sve2_uadalp_zpzz_h,
63
- gen_helper_sve2_uadalp_zpzz_s,
64
- gen_helper_sve2_uadalp_zpzz_d,
65
- };
66
- if (a->esz == 0) {
67
- return false;
68
- }
69
- return do_sve2_zpzz_ool(s, a, fns[a->esz - 1]);
70
-}
71
+static gen_helper_gvec_4 * const uadlp_fns[4] = {
72
+ NULL, gen_helper_sve2_uadalp_zpzz_h,
73
+ gen_helper_sve2_uadalp_zpzz_s, gen_helper_sve2_uadalp_zpzz_d,
74
+};
75
+TRANS_FEAT(UADALP_zpzz, aa64_sve2, gen_gvec_ool_arg_zpzz,
76
+ uadlp_fns[a->esz], a, 0)
77
78
/*
79
* SVE2 integer unary operations (predicated)
80
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const sqneg_fns[4] = {
81
};
82
TRANS_FEAT(SQNEG, aa64_sve2, gen_gvec_ool_arg_zpz, sqneg_fns[a->esz], a, 0)
83
84
-#define DO_SVE2_ZPZZ(NAME, name) \
85
-static bool trans_##NAME(DisasContext *s, arg_rprr_esz *a) \
86
-{ \
87
- static gen_helper_gvec_4 * const fns[4] = { \
88
- gen_helper_sve2_##name##_zpzz_b, gen_helper_sve2_##name##_zpzz_h, \
89
- gen_helper_sve2_##name##_zpzz_s, gen_helper_sve2_##name##_zpzz_d, \
90
- }; \
91
- return do_sve2_zpzz_ool(s, a, fns[a->esz]); \
92
-}
93
+DO_ZPZZ(SQSHL, aa64_sve2, sve2_sqshl)
94
+DO_ZPZZ(SQRSHL, aa64_sve2, sve2_sqrshl)
95
+DO_ZPZZ(SRSHL, aa64_sve2, sve2_srshl)
96
97
-DO_SVE2_ZPZZ(SQSHL, sqshl)
98
-DO_SVE2_ZPZZ(SQRSHL, sqrshl)
99
-DO_SVE2_ZPZZ(SRSHL, srshl)
100
+DO_ZPZZ(UQSHL, aa64_sve2, sve2_uqshl)
101
+DO_ZPZZ(UQRSHL, aa64_sve2, sve2_uqrshl)
102
+DO_ZPZZ(URSHL, aa64_sve2, sve2_urshl)
103
104
-DO_SVE2_ZPZZ(UQSHL, uqshl)
105
-DO_SVE2_ZPZZ(UQRSHL, uqrshl)
106
-DO_SVE2_ZPZZ(URSHL, urshl)
107
+DO_ZPZZ(SHADD, aa64_sve2, sve2_shadd)
108
+DO_ZPZZ(SRHADD, aa64_sve2, sve2_srhadd)
109
+DO_ZPZZ(SHSUB, aa64_sve2, sve2_shsub)
110
111
-DO_SVE2_ZPZZ(SHADD, shadd)
112
-DO_SVE2_ZPZZ(SRHADD, srhadd)
113
-DO_SVE2_ZPZZ(SHSUB, shsub)
114
+DO_ZPZZ(UHADD, aa64_sve2, sve2_uhadd)
115
+DO_ZPZZ(URHADD, aa64_sve2, sve2_urhadd)
116
+DO_ZPZZ(UHSUB, aa64_sve2, sve2_uhsub)
117
118
-DO_SVE2_ZPZZ(UHADD, uhadd)
119
-DO_SVE2_ZPZZ(URHADD, urhadd)
120
-DO_SVE2_ZPZZ(UHSUB, uhsub)
121
+DO_ZPZZ(ADDP, aa64_sve2, sve2_addp)
122
+DO_ZPZZ(SMAXP, aa64_sve2, sve2_smaxp)
123
+DO_ZPZZ(UMAXP, aa64_sve2, sve2_umaxp)
124
+DO_ZPZZ(SMINP, aa64_sve2, sve2_sminp)
125
+DO_ZPZZ(UMINP, aa64_sve2, sve2_uminp)
126
127
-DO_SVE2_ZPZZ(ADDP, addp)
128
-DO_SVE2_ZPZZ(SMAXP, smaxp)
129
-DO_SVE2_ZPZZ(UMAXP, umaxp)
130
-DO_SVE2_ZPZZ(SMINP, sminp)
131
-DO_SVE2_ZPZZ(UMINP, uminp)
132
-
133
-DO_SVE2_ZPZZ(SQADD_zpzz, sqadd)
134
-DO_SVE2_ZPZZ(UQADD_zpzz, uqadd)
135
-DO_SVE2_ZPZZ(SQSUB_zpzz, sqsub)
136
-DO_SVE2_ZPZZ(UQSUB_zpzz, uqsub)
137
-DO_SVE2_ZPZZ(SUQADD, suqadd)
138
-DO_SVE2_ZPZZ(USQADD, usqadd)
139
+DO_ZPZZ(SQADD_zpzz, aa64_sve2, sve2_sqadd)
140
+DO_ZPZZ(UQADD_zpzz, aa64_sve2, sve2_uqadd)
141
+DO_ZPZZ(SQSUB_zpzz, aa64_sve2, sve2_sqsub)
142
+DO_ZPZZ(UQSUB_zpzz, aa64_sve2, sve2_uqsub)
143
+DO_ZPZZ(SUQADD, aa64_sve2, sve2_suqadd)
144
+DO_ZPZZ(USQADD, aa64_sve2, sve2_usqadd)
145
146
/*
147
* SVE2 Widening Integer Arithmetic
148
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rprr_esz *a) \
149
DO_SVE2_PPZZ_MATCH(MATCH, match)
150
DO_SVE2_PPZZ_MATCH(NMATCH, nmatch)
151
152
-static bool trans_HISTCNT(DisasContext *s, arg_rprr_esz *a)
153
-{
154
- static gen_helper_gvec_4 * const fns[2] = {
155
- gen_helper_sve2_histcnt_s, gen_helper_sve2_histcnt_d
156
- };
157
- if (a->esz < 2) {
158
- return false;
159
- }
160
- return do_sve2_zpzz_ool(s, a, fns[a->esz - 2]);
161
-}
162
+static gen_helper_gvec_4 * const histcnt_fns[4] = {
163
+ NULL, NULL, gen_helper_sve2_histcnt_s, gen_helper_sve2_histcnt_d
164
+};
165
+TRANS_FEAT(HISTCNT, aa64_sve2, gen_gvec_ool_arg_zpzz,
166
+ histcnt_fns[a->esz], a, 0)
167
168
TRANS_FEAT(HISTSEG, aa64_sve2, gen_gvec_ool_arg_zzz,
169
a->esz == 0 ? gen_helper_sve2_histseg : NULL, a, 0)
170
--
171
2.25.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
There is only one caller for gen_gvec_fn_zz; inline it.
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-30-richard.henderson@linaro.org
5
Message-id: 20220708151540.18136-46-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
7
---
10
target/arm/translate-sve.c | 13 +++----------
8
linux-user/elfload.c | 20 ++++++++++++++++++++
11
1 file changed, 3 insertions(+), 10 deletions(-)
9
1 file changed, 20 insertions(+)
12
10
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
11
diff --git a/linux-user/elfload.c b/linux-user/elfload.c
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
13
--- a/linux-user/elfload.c
16
+++ b/target/arm/translate-sve.c
14
+++ b/linux-user/elfload.c
17
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzz(DisasContext *s, gen_helper_gvec_4 *fn,
15
@@ -XXX,XX +XXX,XX @@ enum {
18
return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, data);
16
ARM_HWCAP2_A64_RNG = 1 << 16,
19
}
17
ARM_HWCAP2_A64_BTI = 1 << 17,
20
18
ARM_HWCAP2_A64_MTE = 1 << 18,
21
-/* Invoke a vector expander on two Zregs. */
19
+ ARM_HWCAP2_A64_ECV = 1 << 19,
22
-static void gen_gvec_fn_zz(DisasContext *s, GVecGen2Fn *gvec_fn,
20
+ ARM_HWCAP2_A64_AFP = 1 << 20,
23
- int esz, int rd, int rn)
21
+ ARM_HWCAP2_A64_RPRES = 1 << 21,
24
-{
22
+ ARM_HWCAP2_A64_MTE3 = 1 << 22,
25
- unsigned vsz = vec_full_reg_size(s);
23
+ ARM_HWCAP2_A64_SME = 1 << 23,
26
- gvec_fn(esz, vec_full_reg_offset(s, rd),
24
+ ARM_HWCAP2_A64_SME_I16I64 = 1 << 24,
27
- vec_full_reg_offset(s, rn), vsz, vsz);
25
+ ARM_HWCAP2_A64_SME_F64F64 = 1 << 25,
28
-}
26
+ ARM_HWCAP2_A64_SME_I8I32 = 1 << 26,
29
-
27
+ ARM_HWCAP2_A64_SME_F16F32 = 1 << 27,
30
/* Invoke a vector expander on three Zregs. */
28
+ ARM_HWCAP2_A64_SME_B16F32 = 1 << 28,
31
static void gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
29
+ ARM_HWCAP2_A64_SME_F32F32 = 1 << 29,
32
int esz, int rd, int rn, int rm)
30
+ ARM_HWCAP2_A64_SME_FA64 = 1 << 30,
33
@@ -XXX,XX +XXX,XX @@ static void gen_gvec_fn_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
31
};
34
static bool do_mov_z(DisasContext *s, int rd, int rn)
32
35
{
33
#define ELF_HWCAP get_elf_hwcap()
36
if (sve_access_check(s)) {
34
@@ -XXX,XX +XXX,XX @@ static uint32_t get_elf_hwcap2(void)
37
- gen_gvec_fn_zz(s, tcg_gen_gvec_mov, MO_8, rd, rn);
35
GET_FEATURE_ID(aa64_rndr, ARM_HWCAP2_A64_RNG);
38
+ unsigned vsz = vec_full_reg_size(s);
36
GET_FEATURE_ID(aa64_bti, ARM_HWCAP2_A64_BTI);
39
+ tcg_gen_gvec_mov(MO_8, vec_full_reg_offset(s, rd),
37
GET_FEATURE_ID(aa64_mte, ARM_HWCAP2_A64_MTE);
40
+ vec_full_reg_offset(s, rn), vsz, vsz);
38
+ GET_FEATURE_ID(aa64_sme, (ARM_HWCAP2_A64_SME |
41
}
39
+ ARM_HWCAP2_A64_SME_F32F32 |
42
return true;
40
+ ARM_HWCAP2_A64_SME_B16F32 |
41
+ ARM_HWCAP2_A64_SME_F16F32 |
42
+ ARM_HWCAP2_A64_SME_I8I32));
43
+ GET_FEATURE_ID(aa64_sme_f64f64, ARM_HWCAP2_A64_SME_F64F64);
44
+ GET_FEATURE_ID(aa64_sme_i16i64, ARM_HWCAP2_A64_SME_I16I64);
45
+ GET_FEATURE_ID(aa64_sme_fa64, ARM_HWCAP2_A64_SME_FA64);
46
47
return hwcaps;
43
}
48
}
44
--
49
--
45
2.25.1
50
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-31-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 36 +++++++++++++++---------------------
9
1 file changed, 15 insertions(+), 21 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzz(DisasContext *s, gen_helper_gvec_4 *fn,
16
}
17
18
/* Invoke a vector expander on three Zregs. */
19
-static void gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
20
+static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
21
int esz, int rd, int rn, int rm)
22
{
23
- unsigned vsz = vec_full_reg_size(s);
24
- gvec_fn(esz, vec_full_reg_offset(s, rd),
25
- vec_full_reg_offset(s, rn),
26
- vec_full_reg_offset(s, rm), vsz, vsz);
27
+ if (gvec_fn == NULL) {
28
+ return false;
29
+ }
30
+ if (sve_access_check(s)) {
31
+ unsigned vsz = vec_full_reg_size(s);
32
+ gvec_fn(esz, vec_full_reg_offset(s, rd),
33
+ vec_full_reg_offset(s, rn),
34
+ vec_full_reg_offset(s, rm), vsz, vsz);
35
+ }
36
+ return true;
37
}
38
39
/* Invoke a vector expander on four Zregs. */
40
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
41
42
static bool do_zzz_fn(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *gvec_fn)
43
{
44
- if (sve_access_check(s)) {
45
- gen_gvec_fn_zzz(s, gvec_fn, a->esz, a->rd, a->rn, a->rm);
46
- }
47
- return true;
48
+ return gen_gvec_fn_zzz(s, gvec_fn, a->esz, a->rd, a->rn, a->rm);
49
}
50
51
static bool trans_AND_zzz(DisasContext *s, arg_rrr_esz *a)
52
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
53
if (!dc_isar_feature(aa64_sve2, s)) {
54
return false;
55
}
56
- if (sve_access_check(s)) {
57
- gen_gvec_fn_zzz(s, tcg_gen_gvec_mul, a->esz, a->rd, a->rn, a->rm);
58
- }
59
- return true;
60
+ return gen_gvec_fn_zzz(s, tcg_gen_gvec_mul, a->esz, a->rd, a->rn, a->rm);
61
}
62
63
static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
64
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_fn_zzz(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *fn)
65
if (!dc_isar_feature(aa64_sve2, s)) {
66
return false;
67
}
68
- if (sve_access_check(s)) {
69
- gen_gvec_fn_zzz(s, fn, a->esz, a->rd, a->rn, a->rm);
70
- }
71
- return true;
72
+ return gen_gvec_fn_zzz(s, fn, a->esz, a->rd, a->rn, a->rm);
73
}
74
75
static bool trans_SABA(DisasContext *s, arg_rrr_esz *a)
76
@@ -XXX,XX +XXX,XX @@ static bool trans_RAX1(DisasContext *s, arg_rrr_esz *a)
77
if (!dc_isar_feature(aa64_sve2_sha3, s)) {
78
return false;
79
}
80
- if (sve_access_check(s)) {
81
- gen_gvec_fn_zzz(s, gen_gvec_rax1, MO_64, a->rd, a->rn, a->rm);
82
- }
83
- return true;
84
+ return gen_gvec_fn_zzz(s, gen_gvec_rax1, MO_64, a->rd, a->rn, a->rm);
85
}
86
87
static bool trans_FCVTNT_sh(DisasContext *s, arg_rpr_esz *a)
88
--
89
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Two uses of gen_gvec_fn_zzz can pass on arg_rrr_esz instead.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-33-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate-sve.c | 4 ++--
11
1 file changed, 2 insertions(+), 2 deletions(-)
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
18
if (!dc_isar_feature(aa64_sve2, s)) {
19
return false;
20
}
21
- return gen_gvec_fn_zzz(s, tcg_gen_gvec_mul, a->esz, a->rd, a->rn, a->rm);
22
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_mul, a);
23
}
24
25
static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
26
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_fn_zzz(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *fn)
27
if (!dc_isar_feature(aa64_sve2, s)) {
28
return false;
29
}
30
- return gen_gvec_fn_zzz(s, fn, a->esz, a->rd, a->rn, a->rm);
31
+ return gen_gvec_fn_arg_zzz(s, fn, a);
32
}
33
34
static bool trans_SABA(DisasContext *s, arg_rrr_esz *a)
35
--
36
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions directly using
4
gen_gvec_fn_arg_zzz to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-34-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 66 +++++++-------------------------------
12
1 file changed, 11 insertions(+), 55 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
19
*** SVE Logical - Unpredicated Group
20
*/
21
22
-static bool trans_AND_zzz(DisasContext *s, arg_rrr_esz *a)
23
-{
24
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_and, a);
25
-}
26
-
27
-static bool trans_ORR_zzz(DisasContext *s, arg_rrr_esz *a)
28
-{
29
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_or, a);
30
-}
31
-
32
-static bool trans_EOR_zzz(DisasContext *s, arg_rrr_esz *a)
33
-{
34
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_xor, a);
35
-}
36
-
37
-static bool trans_BIC_zzz(DisasContext *s, arg_rrr_esz *a)
38
-{
39
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_andc, a);
40
-}
41
+TRANS_FEAT(AND_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_and, a)
42
+TRANS_FEAT(ORR_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_or, a)
43
+TRANS_FEAT(EOR_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_xor, a)
44
+TRANS_FEAT(BIC_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_andc, a)
45
46
static void gen_xar8_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, int64_t sh)
47
{
48
@@ -XXX,XX +XXX,XX @@ static bool trans_NBSL(DisasContext *s, arg_rrrr_esz *a)
49
*** SVE Integer Arithmetic - Unpredicated Group
50
*/
51
52
-static bool trans_ADD_zzz(DisasContext *s, arg_rrr_esz *a)
53
-{
54
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_add, a);
55
-}
56
-
57
-static bool trans_SUB_zzz(DisasContext *s, arg_rrr_esz *a)
58
-{
59
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_sub, a);
60
-}
61
-
62
-static bool trans_SQADD_zzz(DisasContext *s, arg_rrr_esz *a)
63
-{
64
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_ssadd, a);
65
-}
66
-
67
-static bool trans_SQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
68
-{
69
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_sssub, a);
70
-}
71
-
72
-static bool trans_UQADD_zzz(DisasContext *s, arg_rrr_esz *a)
73
-{
74
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_usadd, a);
75
-}
76
-
77
-static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
78
-{
79
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_ussub, a);
80
-}
81
+TRANS_FEAT(ADD_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_add, a)
82
+TRANS_FEAT(SUB_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_sub, a)
83
+TRANS_FEAT(SQADD_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_ssadd, a)
84
+TRANS_FEAT(SQSUB_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_sssub, a)
85
+TRANS_FEAT(UQADD_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_usadd, a)
86
+TRANS_FEAT(UQSUB_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_ussub, a)
87
88
/*
89
*** SVE Integer Arithmetic - Binary Predicated Group
90
@@ -XXX,XX +XXX,XX @@ static bool trans_MOVPRFX_z(DisasContext *s, arg_rpr_esz *a)
91
* SVE2 Integer Multiply - Unpredicated
92
*/
93
94
-static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
95
-{
96
- if (!dc_isar_feature(aa64_sve2, s)) {
97
- return false;
98
- }
99
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_mul, a);
100
-}
101
+TRANS_FEAT(MUL_zzz, aa64_sve2, gen_gvec_fn_arg_zzz, tcg_gen_gvec_mul, a)
102
103
static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
104
gen_helper_gvec_smulh_b, gen_helper_gvec_smulh_h,
105
--
106
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using do_sve2_fn_zzz
4
to use TRANS_FEAT and gen_gvec_fn_arg_zzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-35-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 19 ++-----------------
12
1 file changed, 2 insertions(+), 17 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_SLI(DisasContext *s, arg_rri_esz *a)
19
return do_sve2_fn2i(s, a, gen_gvec_sli);
20
}
21
22
-static bool do_sve2_fn_zzz(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *fn)
23
-{
24
- if (!dc_isar_feature(aa64_sve2, s)) {
25
- return false;
26
- }
27
- return gen_gvec_fn_arg_zzz(s, fn, a);
28
-}
29
-
30
-static bool trans_SABA(DisasContext *s, arg_rrr_esz *a)
31
-{
32
- return do_sve2_fn_zzz(s, a, gen_gvec_saba);
33
-}
34
-
35
-static bool trans_UABA(DisasContext *s, arg_rrr_esz *a)
36
-{
37
- return do_sve2_fn_zzz(s, a, gen_gvec_uaba);
38
-}
39
+TRANS_FEAT(SABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_saba, a)
40
+TRANS_FEAT(UABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_uaba, a)
41
42
static bool do_sve2_narrow_extract(DisasContext *s, arg_rri_esz *a,
43
const GVecGen2 ops[3])
44
--
45
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
The decode for RAX1 sets esz to MO_8, because that's what
4
we use by default for "no esz present". We changed that
5
to MO_64 during translation because it is more logical for
6
the operation. However, the esz argument to gen_gvec_rax1
7
is unused and forces MO_64 within that function, so there
8
is no need to do it here as well.
9
10
Simplify to use gen_gvec_fn_arg_zzz and TRANS_FEAT.
11
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Message-id: 20220527181907.189259-36-richard.henderson@linaro.org
14
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
15
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
16
---
17
target/arm/translate-sve.c | 8 +-------
18
1 file changed, 1 insertion(+), 7 deletions(-)
19
20
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/target/arm/translate-sve.c
23
+++ b/target/arm/translate-sve.c
24
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SM4E, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
25
TRANS_FEAT(SM4EKEY, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
26
gen_helper_crypto_sm4ekey, a, 0)
27
28
-static bool trans_RAX1(DisasContext *s, arg_rrr_esz *a)
29
-{
30
- if (!dc_isar_feature(aa64_sve2_sha3, s)) {
31
- return false;
32
- }
33
- return gen_gvec_fn_zzz(s, gen_gvec_rax1, MO_64, a->rd, a->rn, a->rm);
34
-}
35
+TRANS_FEAT(RAX1, aa64_sve2_sha3, gen_gvec_fn_arg_zzz, gen_gvec_rax1, a)
36
37
static bool trans_FCVTNT_sh(DisasContext *s, arg_rpr_esz *a)
38
{
39
--
40
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Merge gen_gvec_fn_zzzz with the sve access check and the
4
dereference of arg_rrrr_esz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-37-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 25 ++++++++++++++-----------
12
1 file changed, 14 insertions(+), 11 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fn_arg_zzz(DisasContext *s, GVecGen3Fn *fn,
19
}
20
21
/* Invoke a vector expander on four Zregs. */
22
-static void gen_gvec_fn_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
23
- int esz, int rd, int rn, int rm, int ra)
24
+static bool gen_gvec_fn_arg_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
25
+ arg_rrrr_esz *a)
26
{
27
- unsigned vsz = vec_full_reg_size(s);
28
- gvec_fn(esz, vec_full_reg_offset(s, rd),
29
- vec_full_reg_offset(s, rn),
30
- vec_full_reg_offset(s, rm),
31
- vec_full_reg_offset(s, ra), vsz, vsz);
32
+ if (gvec_fn == NULL) {
33
+ return false;
34
+ }
35
+ if (sve_access_check(s)) {
36
+ unsigned vsz = vec_full_reg_size(s);
37
+ gvec_fn(a->esz, vec_full_reg_offset(s, a->rd),
38
+ vec_full_reg_offset(s, a->rn),
39
+ vec_full_reg_offset(s, a->rm),
40
+ vec_full_reg_offset(s, a->ra), vsz, vsz);
41
+ }
42
+ return true;
43
}
44
45
/* Invoke a vector move on two Zregs. */
46
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zzzz_fn(DisasContext *s, arg_rrrr_esz *a, GVecGen4Fn *fn)
47
if (!dc_isar_feature(aa64_sve2, s)) {
48
return false;
49
}
50
- if (sve_access_check(s)) {
51
- gen_gvec_fn_zzzz(s, fn, a->esz, a->rd, a->rn, a->rm, a->ra);
52
- }
53
- return true;
54
+ return gen_gvec_fn_arg_zzzz(s, fn, a);
55
}
56
57
static void gen_eor3_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
58
--
59
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using do_sve2_zzzz_fn
4
to use TRANS_FEAT and gen_gvec_fn_arg_zzzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-38-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 38 ++++++--------------------------------
12
1 file changed, 6 insertions(+), 32 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_XAR(DisasContext *s, arg_rrri_esz *a)
19
return true;
20
}
21
22
-static bool do_sve2_zzzz_fn(DisasContext *s, arg_rrrr_esz *a, GVecGen4Fn *fn)
23
-{
24
- if (!dc_isar_feature(aa64_sve2, s)) {
25
- return false;
26
- }
27
- return gen_gvec_fn_arg_zzzz(s, fn, a);
28
-}
29
-
30
static void gen_eor3_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
31
{
32
tcg_gen_xor_i64(d, n, m);
33
@@ -XXX,XX +XXX,XX @@ static void gen_eor3(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
34
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
35
}
36
37
-static bool trans_EOR3(DisasContext *s, arg_rrrr_esz *a)
38
-{
39
- return do_sve2_zzzz_fn(s, a, gen_eor3);
40
-}
41
+TRANS_FEAT(EOR3, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_eor3, a)
42
43
static void gen_bcax_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
44
{
45
@@ -XXX,XX +XXX,XX @@ static void gen_bcax(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
46
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
47
}
48
49
-static bool trans_BCAX(DisasContext *s, arg_rrrr_esz *a)
50
-{
51
- return do_sve2_zzzz_fn(s, a, gen_bcax);
52
-}
53
+TRANS_FEAT(BCAX, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_bcax, a)
54
55
static void gen_bsl(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
56
uint32_t a, uint32_t oprsz, uint32_t maxsz)
57
@@ -XXX,XX +XXX,XX @@ static void gen_bsl(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
58
tcg_gen_gvec_bitsel(vece, d, a, n, m, oprsz, maxsz);
59
}
60
61
-static bool trans_BSL(DisasContext *s, arg_rrrr_esz *a)
62
-{
63
- return do_sve2_zzzz_fn(s, a, gen_bsl);
64
-}
65
+TRANS_FEAT(BSL, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_bsl, a)
66
67
static void gen_bsl1n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
68
{
69
@@ -XXX,XX +XXX,XX @@ static void gen_bsl1n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
70
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
71
}
72
73
-static bool trans_BSL1N(DisasContext *s, arg_rrrr_esz *a)
74
-{
75
- return do_sve2_zzzz_fn(s, a, gen_bsl1n);
76
-}
77
+TRANS_FEAT(BSL1N, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_bsl1n, a)
78
79
static void gen_bsl2n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
80
{
81
@@ -XXX,XX +XXX,XX @@ static void gen_bsl2n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
82
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
83
}
84
85
-static bool trans_BSL2N(DisasContext *s, arg_rrrr_esz *a)
86
-{
87
- return do_sve2_zzzz_fn(s, a, gen_bsl2n);
88
-}
89
+TRANS_FEAT(BSL2N, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_bsl2n, a)
90
91
static void gen_nbsl_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
92
{
93
@@ -XXX,XX +XXX,XX @@ static void gen_nbsl(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
94
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
95
}
96
97
-static bool trans_NBSL(DisasContext *s, arg_rrrr_esz *a)
98
-{
99
- return do_sve2_zzzz_fn(s, a, gen_nbsl);
100
-}
101
+TRANS_FEAT(NBSL, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_nbsl, a)
102
103
/*
104
*** SVE Integer Arithmetic - Unpredicated Group
105
--
106
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-40-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 17 +++--------------
9
1 file changed, 3 insertions(+), 14 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_zz_dbm(DisasContext *s, arg_rr_dbm *a, GVecGen2iFn *gvec_fn)
16
return gen_gvec_fn_zzi(s, gvec_fn, MO_64, a->rd, a->rn, imm);
17
}
18
19
-static bool trans_AND_zzi(DisasContext *s, arg_rr_dbm *a)
20
-{
21
- return do_zz_dbm(s, a, tcg_gen_gvec_andi);
22
-}
23
-
24
-static bool trans_ORR_zzi(DisasContext *s, arg_rr_dbm *a)
25
-{
26
- return do_zz_dbm(s, a, tcg_gen_gvec_ori);
27
-}
28
-
29
-static bool trans_EOR_zzi(DisasContext *s, arg_rr_dbm *a)
30
-{
31
- return do_zz_dbm(s, a, tcg_gen_gvec_xori);
32
-}
33
+TRANS_FEAT(AND_zzi, aa64_sve, do_zz_dbm, a, tcg_gen_gvec_andi)
34
+TRANS_FEAT(ORR_zzi, aa64_sve, do_zz_dbm, a, tcg_gen_gvec_ori)
35
+TRANS_FEAT(EOR_zzi, aa64_sve, do_zz_dbm, a, tcg_gen_gvec_xori)
36
37
static bool trans_DUPM(DisasContext *s, arg_DUPM *a)
38
{
39
--
40
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
The check is already done in gen_gvec_ool_zzzp,
4
which is called by do_sel_z; remove from callers.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-41-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 14 ++++----------
12
1 file changed, 4 insertions(+), 10 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(UQSUB_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_ussub, a)
19
/* Select active elememnts from Zn and inactive elements from Zm,
20
* storing the result in Zd.
21
*/
22
-static void do_sel_z(DisasContext *s, int rd, int rn, int rm, int pg, int esz)
23
+static bool do_sel_z(DisasContext *s, int rd, int rn, int rm, int pg, int esz)
24
{
25
static gen_helper_gvec_4 * const fns[4] = {
26
gen_helper_sve_sel_zpzz_b, gen_helper_sve_sel_zpzz_h,
27
gen_helper_sve_sel_zpzz_s, gen_helper_sve_sel_zpzz_d
28
};
29
- gen_gvec_ool_zzzp(s, fns[esz], rd, rn, rm, pg, 0);
30
+ return gen_gvec_ool_zzzp(s, fns[esz], rd, rn, rm, pg, 0);
31
}
32
33
#define DO_ZPZZ(NAME, FEAT, name) \
34
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(UDIV_zpzz, aa64_sve, gen_gvec_ool_arg_zpzz, udiv_fns[a->esz], a, 0)
35
36
static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
37
{
38
- if (sve_access_check(s)) {
39
- do_sel_z(s, a->rd, a->rn, a->rm, a->pg, a->esz);
40
- }
41
- return true;
42
+ return do_sel_z(s, a->rd, a->rn, a->rm, a->pg, a->esz);
43
}
44
45
/*
46
@@ -XXX,XX +XXX,XX @@ static bool trans_MOVPRFX(DisasContext *s, arg_MOVPRFX *a)
47
48
static bool trans_MOVPRFX_m(DisasContext *s, arg_rpr_esz *a)
49
{
50
- if (sve_access_check(s)) {
51
- do_sel_z(s, a->rd, a->rn, a->rd, a->pg, a->esz);
52
- }
53
- return true;
54
+ return do_sel_z(s, a->rd, a->rn, a->rd, a->pg, a->esz);
55
}
56
57
static bool trans_MOVPRFX_z(DisasContext *s, arg_rpr_esz *a)
58
--
59
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
We have two places that perform this particular operation.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-42-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate-sve.c | 21 +++++++++++++--------
11
1 file changed, 13 insertions(+), 8 deletions(-)
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fn_zzi(DisasContext *s, GVecGen2iFn *gvec_fn,
18
return true;
19
}
20
21
+static bool gen_gvec_fn_arg_zzi(DisasContext *s, GVecGen2iFn *gvec_fn,
22
+ arg_rri_esz *a)
23
+{
24
+ if (a->esz < 0) {
25
+ /* Invalid tsz encoding -- see tszimm_esz. */
26
+ return false;
27
+ }
28
+ return gen_gvec_fn_zzi(s, gvec_fn, a->esz, a->rd, a->rn, a->imm);
29
+}
30
+
31
/* Invoke a vector expander on three Zregs. */
32
static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
33
int esz, int rd, int rn, int rm)
34
@@ -XXX,XX +XXX,XX @@ static bool trans_ADD_zzi(DisasContext *s, arg_rri_esz *a)
35
if (a->esz == 0 && extract32(s->insn, 13, 1)) {
36
return false;
37
}
38
- if (sve_access_check(s)) {
39
- unsigned vsz = vec_full_reg_size(s);
40
- tcg_gen_gvec_addi(a->esz, vec_full_reg_offset(s, a->rd),
41
- vec_full_reg_offset(s, a->rn), a->imm, vsz, vsz);
42
- }
43
- return true;
44
+ return gen_gvec_fn_arg_zzi(s, tcg_gen_gvec_addi, a);
45
}
46
47
static bool trans_SUB_zzi(DisasContext *s, arg_rri_esz *a)
48
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(ADCLT, aa64_sve2, do_adcl, a, true)
49
50
static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
51
{
52
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
53
+ if (!dc_isar_feature(aa64_sve2, s)) {
54
return false;
55
}
56
- return gen_gvec_fn_zzi(s, fn, a->esz, a->rd, a->rn, a->imm);
57
+ return gen_gvec_fn_arg_zzi(s, fn, a);
58
}
59
60
static bool trans_SSRA(DisasContext *s, arg_rri_esz *a)
61
--
62
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using do_sve2_fn2i
4
to use TRANS_FEAT and gen_gvec_fn_arg_zzi.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-43-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 43 ++++++--------------------------------
12
1 file changed, 6 insertions(+), 37 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ static bool do_adcl(DisasContext *s, arg_rrrr_esz *a, bool sel)
19
TRANS_FEAT(ADCLB, aa64_sve2, do_adcl, a, false)
20
TRANS_FEAT(ADCLT, aa64_sve2, do_adcl, a, true)
21
22
-static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
23
-{
24
- if (!dc_isar_feature(aa64_sve2, s)) {
25
- return false;
26
- }
27
- return gen_gvec_fn_arg_zzi(s, fn, a);
28
-}
29
-
30
-static bool trans_SSRA(DisasContext *s, arg_rri_esz *a)
31
-{
32
- return do_sve2_fn2i(s, a, gen_gvec_ssra);
33
-}
34
-
35
-static bool trans_USRA(DisasContext *s, arg_rri_esz *a)
36
-{
37
- return do_sve2_fn2i(s, a, gen_gvec_usra);
38
-}
39
-
40
-static bool trans_SRSRA(DisasContext *s, arg_rri_esz *a)
41
-{
42
- return do_sve2_fn2i(s, a, gen_gvec_srsra);
43
-}
44
-
45
-static bool trans_URSRA(DisasContext *s, arg_rri_esz *a)
46
-{
47
- return do_sve2_fn2i(s, a, gen_gvec_ursra);
48
-}
49
-
50
-static bool trans_SRI(DisasContext *s, arg_rri_esz *a)
51
-{
52
- return do_sve2_fn2i(s, a, gen_gvec_sri);
53
-}
54
-
55
-static bool trans_SLI(DisasContext *s, arg_rri_esz *a)
56
-{
57
- return do_sve2_fn2i(s, a, gen_gvec_sli);
58
-}
59
+TRANS_FEAT(SSRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_ssra, a)
60
+TRANS_FEAT(USRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_usra, a)
61
+TRANS_FEAT(SRSRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_srsra, a)
62
+TRANS_FEAT(URSRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_ursra, a)
63
+TRANS_FEAT(SRI, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_sri, a)
64
+TRANS_FEAT(SLI, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_sli, a)
65
66
TRANS_FEAT(SABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_saba, a)
67
TRANS_FEAT(UABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_uaba, a)
68
--
69
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-44-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 20 +++++++-------------
9
1 file changed, 7 insertions(+), 13 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_vpz_ool(DisasContext *s, arg_rpr_esz *a,
16
}
17
18
#define DO_VPZ(NAME, name) \
19
-static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
20
-{ \
21
- static gen_helper_gvec_reduc * const fns[4] = { \
22
+ static gen_helper_gvec_reduc * const name##_fns[4] = { \
23
gen_helper_sve_##name##_b, gen_helper_sve_##name##_h, \
24
gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
25
}; \
26
- return do_vpz_ool(s, a, fns[a->esz]); \
27
-}
28
+ TRANS_FEAT(NAME, aa64_sve, do_vpz_ool, a, name##_fns[a->esz])
29
30
DO_VPZ(ORV, orv)
31
DO_VPZ(ANDV, andv)
32
@@ -XXX,XX +XXX,XX @@ DO_VPZ(UMAXV, umaxv)
33
DO_VPZ(SMINV, sminv)
34
DO_VPZ(UMINV, uminv)
35
36
-static bool trans_SADDV(DisasContext *s, arg_rpr_esz *a)
37
-{
38
- static gen_helper_gvec_reduc * const fns[4] = {
39
- gen_helper_sve_saddv_b, gen_helper_sve_saddv_h,
40
- gen_helper_sve_saddv_s, NULL
41
- };
42
- return do_vpz_ool(s, a, fns[a->esz]);
43
-}
44
+static gen_helper_gvec_reduc * const saddv_fns[4] = {
45
+ gen_helper_sve_saddv_b, gen_helper_sve_saddv_h,
46
+ gen_helper_sve_saddv_s, NULL
47
+};
48
+TRANS_FEAT(SADDV, aa64_sve, do_vpz_ool, a, saddv_fns[a->esz])
49
50
#undef DO_VPZ
51
52
--
53
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-45-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 17 +++--------------
9
1 file changed, 3 insertions(+), 14 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_shift_imm(DisasContext *s, arg_rri_esz *a, bool asr,
16
return true;
17
}
18
19
-static bool trans_ASR_zzi(DisasContext *s, arg_rri_esz *a)
20
-{
21
- return do_shift_imm(s, a, true, tcg_gen_gvec_sari);
22
-}
23
-
24
-static bool trans_LSR_zzi(DisasContext *s, arg_rri_esz *a)
25
-{
26
- return do_shift_imm(s, a, false, tcg_gen_gvec_shri);
27
-}
28
-
29
-static bool trans_LSL_zzi(DisasContext *s, arg_rri_esz *a)
30
-{
31
- return do_shift_imm(s, a, false, tcg_gen_gvec_shli);
32
-}
33
+TRANS_FEAT(ASR_zzi, aa64_sve, do_shift_imm, a, true, tcg_gen_gvec_sari)
34
+TRANS_FEAT(LSR_zzi, aa64_sve, do_shift_imm, a, false, tcg_gen_gvec_shri)
35
+TRANS_FEAT(LSL_zzi, aa64_sve, do_shift_imm, a, false, tcg_gen_gvec_shli)
36
37
#define DO_ZZW(NAME, name) \
38
static gen_helper_gvec_3 * const name##_zzw_fns[4] = { \
39
--
40
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-47-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 52 +++++++++++++++-----------------------
9
1 file changed, 20 insertions(+), 32 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_shift_zpzi(DisasContext *s, arg_rpri_esz *a, bool asr,
16
return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
17
}
18
19
-static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
20
-{
21
- static gen_helper_gvec_3 * const fns[4] = {
22
- gen_helper_sve_asr_zpzi_b, gen_helper_sve_asr_zpzi_h,
23
- gen_helper_sve_asr_zpzi_s, gen_helper_sve_asr_zpzi_d,
24
- };
25
- return do_shift_zpzi(s, a, true, fns);
26
-}
27
+static gen_helper_gvec_3 * const asr_zpzi_fns[4] = {
28
+ gen_helper_sve_asr_zpzi_b, gen_helper_sve_asr_zpzi_h,
29
+ gen_helper_sve_asr_zpzi_s, gen_helper_sve_asr_zpzi_d,
30
+};
31
+TRANS_FEAT(ASR_zpzi, aa64_sve, do_shift_zpzi, a, true, asr_zpzi_fns)
32
33
-static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
34
-{
35
- static gen_helper_gvec_3 * const fns[4] = {
36
- gen_helper_sve_lsr_zpzi_b, gen_helper_sve_lsr_zpzi_h,
37
- gen_helper_sve_lsr_zpzi_s, gen_helper_sve_lsr_zpzi_d,
38
- };
39
- return do_shift_zpzi(s, a, false, fns);
40
-}
41
+static gen_helper_gvec_3 * const lsr_zpzi_fns[4] = {
42
+ gen_helper_sve_lsr_zpzi_b, gen_helper_sve_lsr_zpzi_h,
43
+ gen_helper_sve_lsr_zpzi_s, gen_helper_sve_lsr_zpzi_d,
44
+};
45
+TRANS_FEAT(LSR_zpzi, aa64_sve, do_shift_zpzi, a, false, lsr_zpzi_fns)
46
47
-static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
48
-{
49
- static gen_helper_gvec_3 * const fns[4] = {
50
- gen_helper_sve_lsl_zpzi_b, gen_helper_sve_lsl_zpzi_h,
51
- gen_helper_sve_lsl_zpzi_s, gen_helper_sve_lsl_zpzi_d,
52
- };
53
- return do_shift_zpzi(s, a, false, fns);
54
-}
55
+static gen_helper_gvec_3 * const lsl_zpzi_fns[4] = {
56
+ gen_helper_sve_lsl_zpzi_b, gen_helper_sve_lsl_zpzi_h,
57
+ gen_helper_sve_lsl_zpzi_s, gen_helper_sve_lsl_zpzi_d,
58
+};
59
+TRANS_FEAT(LSL_zpzi, aa64_sve, do_shift_zpzi, a, false, lsl_zpzi_fns)
60
61
-static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
62
-{
63
- static gen_helper_gvec_3 * const fns[4] = {
64
- gen_helper_sve_asrd_b, gen_helper_sve_asrd_h,
65
- gen_helper_sve_asrd_s, gen_helper_sve_asrd_d,
66
- };
67
- return do_shift_zpzi(s, a, false, fns);
68
-}
69
+static gen_helper_gvec_3 * const asrd_fns[4] = {
70
+ gen_helper_sve_asrd_b, gen_helper_sve_asrd_h,
71
+ gen_helper_sve_asrd_s, gen_helper_sve_asrd_d,
72
+};
73
+TRANS_FEAT(ASRD, aa64_sve, do_shift_zpzi, a, false, asrd_fns)
74
75
static gen_helper_gvec_3 * const sqshl_zpzi_fns[4] = {
76
gen_helper_sve2_sqshl_zpzi_b, gen_helper_sve2_sqshl_zpzi_h,
77
--
78
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Remove the DO_ZPZZZ macro, as it had just the two uses.
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20220527181907.189259-48-richard.henderson@linaro.org
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9
---
10
target/arm/translate-sve.c | 23 ++++++++++-------------
11
1 file changed, 10 insertions(+), 13 deletions(-)
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
16
+++ b/target/arm/translate-sve.c
17
@@ -XXX,XX +XXX,XX @@ static bool do_zpzzz_ool(DisasContext *s, arg_rprrr_esz *a,
18
return true;
19
}
20
21
-#define DO_ZPZZZ(NAME, name) \
22
-static bool trans_##NAME(DisasContext *s, arg_rprrr_esz *a) \
23
-{ \
24
- static gen_helper_gvec_5 * const fns[4] = { \
25
- gen_helper_sve_##name##_b, gen_helper_sve_##name##_h, \
26
- gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
27
- }; \
28
- return do_zpzzz_ool(s, a, fns[a->esz]); \
29
-}
30
+static gen_helper_gvec_5 * const mla_fns[4] = {
31
+ gen_helper_sve_mla_b, gen_helper_sve_mla_h,
32
+ gen_helper_sve_mla_s, gen_helper_sve_mla_d,
33
+};
34
+TRANS_FEAT(MLA, aa64_sve, do_zpzzz_ool, a, mla_fns[a->esz])
35
36
-DO_ZPZZZ(MLA, mla)
37
-DO_ZPZZZ(MLS, mls)
38
-
39
-#undef DO_ZPZZZ
40
+static gen_helper_gvec_5 * const mls_fns[4] = {
41
+ gen_helper_sve_mls_b, gen_helper_sve_mls_h,
42
+ gen_helper_sve_mls_s, gen_helper_sve_mls_d,
43
+};
44
+TRANS_FEAT(MLS, aa64_sve, do_zpzzz_ool, a, mls_fns[a->esz])
45
46
/*
47
*** SVE Index Generation Group
48
--
49
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-50-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 35 ++++++++---------------------------
9
1 file changed, 8 insertions(+), 27 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_index(DisasContext *s, int esz, int rd,
16
return true;
17
}
18
19
-static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
20
-{
21
- TCGv_i64 start = tcg_constant_i64(a->imm1);
22
- TCGv_i64 incr = tcg_constant_i64(a->imm2);
23
- return do_index(s, a->esz, a->rd, start, incr);
24
-}
25
-
26
-static bool trans_INDEX_ir(DisasContext *s, arg_INDEX_ir *a)
27
-{
28
- TCGv_i64 start = tcg_constant_i64(a->imm);
29
- TCGv_i64 incr = cpu_reg(s, a->rm);
30
- return do_index(s, a->esz, a->rd, start, incr);
31
-}
32
-
33
-static bool trans_INDEX_ri(DisasContext *s, arg_INDEX_ri *a)
34
-{
35
- TCGv_i64 start = cpu_reg(s, a->rn);
36
- TCGv_i64 incr = tcg_constant_i64(a->imm);
37
- return do_index(s, a->esz, a->rd, start, incr);
38
-}
39
-
40
-static bool trans_INDEX_rr(DisasContext *s, arg_INDEX_rr *a)
41
-{
42
- TCGv_i64 start = cpu_reg(s, a->rn);
43
- TCGv_i64 incr = cpu_reg(s, a->rm);
44
- return do_index(s, a->esz, a->rd, start, incr);
45
-}
46
+TRANS_FEAT(INDEX_ii, aa64_sve, do_index, a->esz, a->rd,
47
+ tcg_constant_i64(a->imm1), tcg_constant_i64(a->imm2))
48
+TRANS_FEAT(INDEX_ir, aa64_sve, do_index, a->esz, a->rd,
49
+ tcg_constant_i64(a->imm), cpu_reg(s, a->rm))
50
+TRANS_FEAT(INDEX_ri, aa64_sve, do_index, a->esz, a->rd,
51
+ cpu_reg(s, a->rn), tcg_constant_i64(a->imm))
52
+TRANS_FEAT(INDEX_rr, aa64_sve, do_index, a->esz, a->rd,
53
+ cpu_reg(s, a->rn), cpu_reg(s, a->rm))
54
55
/*
56
*** SVE Stack Allocation Group
57
--
58
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-52-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 19 +++++--------------
9
1 file changed, 5 insertions(+), 14 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_predset(DisasContext *s, int esz, int rd, int pat, bool setflag)
16
return true;
17
}
18
19
-static bool trans_PTRUE(DisasContext *s, arg_PTRUE *a)
20
-{
21
- return do_predset(s, a->esz, a->rd, a->pat, a->s);
22
-}
23
+TRANS_FEAT(PTRUE, aa64_sve, do_predset, a->esz, a->rd, a->pat, a->s)
24
25
-static bool trans_SETFFR(DisasContext *s, arg_SETFFR *a)
26
-{
27
- /* Note pat == 31 is #all, to set all elements. */
28
- return do_predset(s, 0, FFR_PRED_NUM, 31, false);
29
-}
30
+/* Note pat == 31 is #all, to set all elements. */
31
+TRANS_FEAT(SETFFR, aa64_sve, do_predset, 0, FFR_PRED_NUM, 31, false)
32
33
-static bool trans_PFALSE(DisasContext *s, arg_PFALSE *a)
34
-{
35
- /* Note pat == 32 is #unimp, to set no elements. */
36
- return do_predset(s, 0, a->rd, 32, false);
37
-}
38
+/* Note pat == 32 is #unimp, to set no elements. */
39
+TRANS_FEAT(PFALSE, aa64_sve, do_predset, 0, a->rd, 32, false)
40
41
static bool trans_RDFFR_p(DisasContext *s, arg_RDFFR_p *a)
42
{
43
--
44
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-54-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_pfirst_pnext(DisasContext *s, arg_rr_esz *a,
16
return true;
17
}
18
19
-static bool trans_PFIRST(DisasContext *s, arg_rr_esz *a)
20
-{
21
- return do_pfirst_pnext(s, a, gen_helper_sve_pfirst);
22
-}
23
-
24
-static bool trans_PNEXT(DisasContext *s, arg_rr_esz *a)
25
-{
26
- return do_pfirst_pnext(s, a, gen_helper_sve_pnext);
27
-}
28
+TRANS_FEAT(PFIRST, aa64_sve, do_pfirst_pnext, a, gen_helper_sve_pfirst)
29
+TRANS_FEAT(PNEXT, aa64_sve, do_pfirst_pnext, a, gen_helper_sve_pnext)
30
31
/*
32
*** SVE Element Count Group
33
--
34
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-55-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 14 ++------------
9
1 file changed, 2 insertions(+), 12 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_EXT(DisasContext *s, int rd, int rn, int rm, int imm)
16
return true;
17
}
18
19
-static bool trans_EXT(DisasContext *s, arg_EXT *a)
20
-{
21
- return do_EXT(s, a->rd, a->rn, a->rm, a->imm);
22
-}
23
-
24
-static bool trans_EXT_sve2(DisasContext *s, arg_rri *a)
25
-{
26
- if (!dc_isar_feature(aa64_sve2, s)) {
27
- return false;
28
- }
29
- return do_EXT(s, a->rd, a->rn, (a->rn + 1) % 32, a->imm);
30
-}
31
+TRANS_FEAT(EXT, aa64_sve, do_EXT, a->rd, a->rn, a->rm, a->imm)
32
+TRANS_FEAT(EXT_sve2, aa64_sve2, do_EXT, a->rd, a->rn, (a->rn + 1) % 32, a->imm)
33
34
/*
35
*** SVE Permute - Unpredicated Group
36
--
37
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-56-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 35 ++++++-----------------------------
9
1 file changed, 6 insertions(+), 29 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_perm_pred2(DisasContext *s, arg_rr_esz *a, bool high_odd,
16
return true;
17
}
18
19
-static bool trans_ZIP1_p(DisasContext *s, arg_rrr_esz *a)
20
-{
21
- return do_perm_pred3(s, a, 0, gen_helper_sve_zip_p);
22
-}
23
-
24
-static bool trans_ZIP2_p(DisasContext *s, arg_rrr_esz *a)
25
-{
26
- return do_perm_pred3(s, a, 1, gen_helper_sve_zip_p);
27
-}
28
-
29
-static bool trans_UZP1_p(DisasContext *s, arg_rrr_esz *a)
30
-{
31
- return do_perm_pred3(s, a, 0, gen_helper_sve_uzp_p);
32
-}
33
-
34
-static bool trans_UZP2_p(DisasContext *s, arg_rrr_esz *a)
35
-{
36
- return do_perm_pred3(s, a, 1, gen_helper_sve_uzp_p);
37
-}
38
-
39
-static bool trans_TRN1_p(DisasContext *s, arg_rrr_esz *a)
40
-{
41
- return do_perm_pred3(s, a, 0, gen_helper_sve_trn_p);
42
-}
43
-
44
-static bool trans_TRN2_p(DisasContext *s, arg_rrr_esz *a)
45
-{
46
- return do_perm_pred3(s, a, 1, gen_helper_sve_trn_p);
47
-}
48
+TRANS_FEAT(ZIP1_p, aa64_sve, do_perm_pred3, a, 0, gen_helper_sve_zip_p)
49
+TRANS_FEAT(ZIP2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_zip_p)
50
+TRANS_FEAT(UZP1_p, aa64_sve, do_perm_pred3, a, 0, gen_helper_sve_uzp_p)
51
+TRANS_FEAT(UZP2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_uzp_p)
52
+TRANS_FEAT(TRN1_p, aa64_sve, do_perm_pred3, a, 0, gen_helper_sve_trn_p)
53
+TRANS_FEAT(TRN2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_trn_p)
54
55
static bool trans_REV_p(DisasContext *s, arg_rr_esz *a)
56
{
57
--
58
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-57-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 17 +++--------------
9
1 file changed, 3 insertions(+), 14 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(UZP2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_uzp_p)
16
TRANS_FEAT(TRN1_p, aa64_sve, do_perm_pred3, a, 0, gen_helper_sve_trn_p)
17
TRANS_FEAT(TRN2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_trn_p)
18
19
-static bool trans_REV_p(DisasContext *s, arg_rr_esz *a)
20
-{
21
- return do_perm_pred2(s, a, 0, gen_helper_sve_rev_p);
22
-}
23
-
24
-static bool trans_PUNPKLO(DisasContext *s, arg_PUNPKLO *a)
25
-{
26
- return do_perm_pred2(s, a, 0, gen_helper_sve_punpk_p);
27
-}
28
-
29
-static bool trans_PUNPKHI(DisasContext *s, arg_PUNPKHI *a)
30
-{
31
- return do_perm_pred2(s, a, 1, gen_helper_sve_punpk_p);
32
-}
33
+TRANS_FEAT(REV_p, aa64_sve, do_perm_pred2, a, 0, gen_helper_sve_rev_p)
34
+TRANS_FEAT(PUNPKLO, aa64_sve, do_perm_pred2, a, 0, gen_helper_sve_punpk_p)
35
+TRANS_FEAT(PUNPKHI, aa64_sve, do_perm_pred2, a, 1, gen_helper_sve_punpk_p)
36
37
/*
38
*** SVE Permute - Interleaving Group
39
--
40
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-59-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 25 +++++++------------------
9
1 file changed, 7 insertions(+), 18 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
16
gen_helper_sve_zip_b, gen_helper_sve_zip_h,
17
gen_helper_sve_zip_s, gen_helper_sve_zip_d,
18
};
19
+ unsigned vsz = vec_full_reg_size(s);
20
+ unsigned high_ofs = high ? vsz / 2 : 0;
21
22
- if (sve_access_check(s)) {
23
- unsigned vsz = vec_full_reg_size(s);
24
- unsigned high_ofs = high ? vsz / 2 : 0;
25
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
26
- vec_full_reg_offset(s, a->rn),
27
- vec_full_reg_offset(s, a->rm),
28
- vsz, vsz, high_ofs, fns[a->esz]);
29
- }
30
- return true;
31
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, high_ofs);
32
}
33
34
static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
35
@@ -XXX,XX +XXX,XX @@ static bool trans_ZIP2_z(DisasContext *s, arg_rrr_esz *a)
36
37
static bool do_zip_q(DisasContext *s, arg_rrr_esz *a, bool high)
38
{
39
+ unsigned vsz = vec_full_reg_size(s);
40
+ unsigned high_ofs = high ? QEMU_ALIGN_DOWN(vsz, 32) / 2 : 0;
41
+
42
if (!dc_isar_feature(aa64_sve_f64mm, s)) {
43
return false;
44
}
45
- if (sve_access_check(s)) {
46
- unsigned vsz = vec_full_reg_size(s);
47
- unsigned high_ofs = high ? QEMU_ALIGN_DOWN(vsz, 32) / 2 : 0;
48
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
49
- vec_full_reg_offset(s, a->rn),
50
- vec_full_reg_offset(s, a->rm),
51
- vsz, vsz, high_ofs, gen_helper_sve2_zip_q);
52
- }
53
- return true;
54
+ return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_zip_q, a, high_ofs);
55
}
56
57
static bool trans_ZIP1_q(DisasContext *s, arg_rrr_esz *a)
58
--
59
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Convert SVE translation functions using do_zip*
4
to use TRANS_FEAT and gen_gvec_ool_arg_zzz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-60-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
11
target/arm/translate-sve.c | 54 +++++++++-----------------------------
12
1 file changed, 13 insertions(+), 41 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
+++ b/target/arm/translate-sve.c
18
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(PUNPKHI, aa64_sve, do_perm_pred2, a, 1, gen_helper_sve_punpk_p)
19
*** SVE Permute - Interleaving Group
20
*/
21
22
-static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
23
-{
24
- static gen_helper_gvec_3 * const fns[4] = {
25
- gen_helper_sve_zip_b, gen_helper_sve_zip_h,
26
- gen_helper_sve_zip_s, gen_helper_sve_zip_d,
27
- };
28
- unsigned vsz = vec_full_reg_size(s);
29
- unsigned high_ofs = high ? vsz / 2 : 0;
30
+static gen_helper_gvec_3 * const zip_fns[4] = {
31
+ gen_helper_sve_zip_b, gen_helper_sve_zip_h,
32
+ gen_helper_sve_zip_s, gen_helper_sve_zip_d,
33
+};
34
+TRANS_FEAT(ZIP1_z, aa64_sve, gen_gvec_ool_arg_zzz,
35
+ zip_fns[a->esz], a, 0)
36
+TRANS_FEAT(ZIP2_z, aa64_sve, gen_gvec_ool_arg_zzz,
37
+ zip_fns[a->esz], a, vec_full_reg_size(s) / 2)
38
39
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, high_ofs);
40
-}
41
-
42
-static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
43
-{
44
- return do_zip(s, a, false);
45
-}
46
-
47
-static bool trans_ZIP2_z(DisasContext *s, arg_rrr_esz *a)
48
-{
49
- return do_zip(s, a, true);
50
-}
51
-
52
-static bool do_zip_q(DisasContext *s, arg_rrr_esz *a, bool high)
53
-{
54
- unsigned vsz = vec_full_reg_size(s);
55
- unsigned high_ofs = high ? QEMU_ALIGN_DOWN(vsz, 32) / 2 : 0;
56
-
57
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
58
- return false;
59
- }
60
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_zip_q, a, high_ofs);
61
-}
62
-
63
-static bool trans_ZIP1_q(DisasContext *s, arg_rrr_esz *a)
64
-{
65
- return do_zip_q(s, a, false);
66
-}
67
-
68
-static bool trans_ZIP2_q(DisasContext *s, arg_rrr_esz *a)
69
-{
70
- return do_zip_q(s, a, true);
71
-}
72
+TRANS_FEAT(ZIP1_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
73
+ gen_helper_sve2_zip_q, a, 0)
74
+TRANS_FEAT(ZIP2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
75
+ gen_helper_sve2_zip_q, a,
76
+ QEMU_ALIGN_DOWN(vec_full_reg_size(s), 32) / 2)
77
78
static gen_helper_gvec_3 * const uzp_fns[4] = {
79
gen_helper_sve_uzp_b, gen_helper_sve_uzp_h,
80
--
81
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-61-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_clast_vector(DisasContext *s, arg_rprr_esz *a, bool before)
16
return true;
17
}
18
19
-static bool trans_CLASTA_z(DisasContext *s, arg_rprr_esz *a)
20
-{
21
- return do_clast_vector(s, a, false);
22
-}
23
-
24
-static bool trans_CLASTB_z(DisasContext *s, arg_rprr_esz *a)
25
-{
26
- return do_clast_vector(s, a, true);
27
-}
28
+TRANS_FEAT(CLASTA_z, aa64_sve, do_clast_vector, a, false)
29
+TRANS_FEAT(CLASTB_z, aa64_sve, do_clast_vector, a, true)
30
31
/* Compute CLAST for a scalar. */
32
static void do_clast_scalar(DisasContext *s, int esz, int pg, int rm,
33
--
34
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-62-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_clast_fp(DisasContext *s, arg_rpr_esz *a, bool before)
16
return true;
17
}
18
19
-static bool trans_CLASTA_v(DisasContext *s, arg_rpr_esz *a)
20
-{
21
- return do_clast_fp(s, a, false);
22
-}
23
-
24
-static bool trans_CLASTB_v(DisasContext *s, arg_rpr_esz *a)
25
-{
26
- return do_clast_fp(s, a, true);
27
-}
28
+TRANS_FEAT(CLASTA_v, aa64_sve, do_clast_fp, a, false)
29
+TRANS_FEAT(CLASTB_v, aa64_sve, do_clast_fp, a, true)
30
31
/* Compute CLAST for a Xreg. */
32
static bool do_clast_general(DisasContext *s, arg_rpr_esz *a, bool before)
33
--
34
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-63-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_clast_general(DisasContext *s, arg_rpr_esz *a, bool before)
16
return true;
17
}
18
19
-static bool trans_CLASTA_r(DisasContext *s, arg_rpr_esz *a)
20
-{
21
- return do_clast_general(s, a, false);
22
-}
23
-
24
-static bool trans_CLASTB_r(DisasContext *s, arg_rpr_esz *a)
25
-{
26
- return do_clast_general(s, a, true);
27
-}
28
+TRANS_FEAT(CLASTA_r, aa64_sve, do_clast_general, a, false)
29
+TRANS_FEAT(CLASTB_r, aa64_sve, do_clast_general, a, true)
30
31
/* Compute LAST for a scalar. */
32
static TCGv_i64 do_last_scalar(DisasContext *s, int esz,
33
--
34
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-64-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_last_fp(DisasContext *s, arg_rpr_esz *a, bool before)
16
return true;
17
}
18
19
-static bool trans_LASTA_v(DisasContext *s, arg_rpr_esz *a)
20
-{
21
- return do_last_fp(s, a, false);
22
-}
23
-
24
-static bool trans_LASTB_v(DisasContext *s, arg_rpr_esz *a)
25
-{
26
- return do_last_fp(s, a, true);
27
-}
28
+TRANS_FEAT(LASTA_v, aa64_sve, do_last_fp, a, false)
29
+TRANS_FEAT(LASTB_v, aa64_sve, do_last_fp, a, true)
30
31
/* Compute LAST for a Xreg. */
32
static bool do_last_general(DisasContext *s, arg_rpr_esz *a, bool before)
33
--
34
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-65-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 11 ++---------
9
1 file changed, 2 insertions(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_last_general(DisasContext *s, arg_rpr_esz *a, bool before)
16
return true;
17
}
18
19
-static bool trans_LASTA_r(DisasContext *s, arg_rpr_esz *a)
20
-{
21
- return do_last_general(s, a, false);
22
-}
23
-
24
-static bool trans_LASTB_r(DisasContext *s, arg_rpr_esz *a)
25
-{
26
- return do_last_general(s, a, true);
27
-}
28
+TRANS_FEAT(LASTA_r, aa64_sve, do_last_general, a, false)
29
+TRANS_FEAT(LASTB_r, aa64_sve, do_last_general, a, true)
30
31
static bool trans_CPY_m_r(DisasContext *s, arg_rpr_esz *a)
32
{
33
--
34
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-67-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 28 ++++++++++++----------------
9
1 file changed, 12 insertions(+), 16 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_ppzz_flags(DisasContext *s, arg_rprr_esz *a,
16
}
17
18
#define DO_PPZZ(NAME, name) \
19
-static bool trans_##NAME##_ppzz(DisasContext *s, arg_rprr_esz *a) \
20
-{ \
21
- static gen_helper_gvec_flags_4 * const fns[4] = { \
22
- gen_helper_sve_##name##_ppzz_b, gen_helper_sve_##name##_ppzz_h, \
23
- gen_helper_sve_##name##_ppzz_s, gen_helper_sve_##name##_ppzz_d, \
24
- }; \
25
- return do_ppzz_flags(s, a, fns[a->esz]); \
26
-}
27
+ static gen_helper_gvec_flags_4 * const name##_ppzz_fns[4] = { \
28
+ gen_helper_sve_##name##_ppzz_b, gen_helper_sve_##name##_ppzz_h, \
29
+ gen_helper_sve_##name##_ppzz_s, gen_helper_sve_##name##_ppzz_d, \
30
+ }; \
31
+ TRANS_FEAT(NAME##_ppzz, aa64_sve, do_ppzz_flags, \
32
+ a, name##_ppzz_fns[a->esz])
33
34
DO_PPZZ(CMPEQ, cmpeq)
35
DO_PPZZ(CMPNE, cmpne)
36
@@ -XXX,XX +XXX,XX @@ DO_PPZZ(CMPHS, cmphs)
37
#undef DO_PPZZ
38
39
#define DO_PPZW(NAME, name) \
40
-static bool trans_##NAME##_ppzw(DisasContext *s, arg_rprr_esz *a) \
41
-{ \
42
- static gen_helper_gvec_flags_4 * const fns[4] = { \
43
- gen_helper_sve_##name##_ppzw_b, gen_helper_sve_##name##_ppzw_h, \
44
- gen_helper_sve_##name##_ppzw_s, NULL \
45
- }; \
46
- return do_ppzz_flags(s, a, fns[a->esz]); \
47
-}
48
+ static gen_helper_gvec_flags_4 * const name##_ppzw_fns[4] = { \
49
+ gen_helper_sve_##name##_ppzw_b, gen_helper_sve_##name##_ppzw_h, \
50
+ gen_helper_sve_##name##_ppzw_s, NULL \
51
+ }; \
52
+ TRANS_FEAT(NAME##_ppzw, aa64_sve, do_ppzz_flags, \
53
+ a, name##_ppzw_fns[a->esz])
54
55
DO_PPZW(CMPEQ, cmpeq)
56
DO_PPZW(CMPNE, cmpne)
57
--
58
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-69-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 8 +++-----
9
1 file changed, 3 insertions(+), 5 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_ppzi_flags(DisasContext *s, arg_rpri_esz *a,
16
}
17
18
#define DO_PPZI(NAME, name) \
19
-static bool trans_##NAME##_ppzi(DisasContext *s, arg_rpri_esz *a) \
20
-{ \
21
- static gen_helper_gvec_flags_3 * const fns[4] = { \
22
+ static gen_helper_gvec_flags_3 * const name##_ppzi_fns[4] = { \
23
gen_helper_sve_##name##_ppzi_b, gen_helper_sve_##name##_ppzi_h, \
24
gen_helper_sve_##name##_ppzi_s, gen_helper_sve_##name##_ppzi_d, \
25
}; \
26
- return do_ppzi_flags(s, a, fns[a->esz]); \
27
-}
28
+ TRANS_FEAT(NAME##_ppzi, aa64_sve, do_ppzi_flags, a, \
29
+ name##_ppzi_fns[a->esz])
30
31
DO_PPZI(CMPEQ, cmpeq)
32
DO_PPZI(CMPNE, cmpne)
33
--
34
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-70-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 45 ++++++++++++--------------------------
9
1 file changed, 14 insertions(+), 31 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_brk2(DisasContext *s, arg_rpr_s *a,
16
return true;
17
}
18
19
-static bool trans_BRKPA(DisasContext *s, arg_rprr_s *a)
20
-{
21
- return do_brk3(s, a, gen_helper_sve_brkpa, gen_helper_sve_brkpas);
22
-}
23
+TRANS_FEAT(BRKPA, aa64_sve, do_brk3, a,
24
+ gen_helper_sve_brkpa, gen_helper_sve_brkpas)
25
+TRANS_FEAT(BRKPB, aa64_sve, do_brk3, a,
26
+ gen_helper_sve_brkpb, gen_helper_sve_brkpbs)
27
28
-static bool trans_BRKPB(DisasContext *s, arg_rprr_s *a)
29
-{
30
- return do_brk3(s, a, gen_helper_sve_brkpb, gen_helper_sve_brkpbs);
31
-}
32
+TRANS_FEAT(BRKA_m, aa64_sve, do_brk2, a,
33
+ gen_helper_sve_brka_m, gen_helper_sve_brkas_m)
34
+TRANS_FEAT(BRKB_m, aa64_sve, do_brk2, a,
35
+ gen_helper_sve_brkb_m, gen_helper_sve_brkbs_m)
36
37
-static bool trans_BRKA_m(DisasContext *s, arg_rpr_s *a)
38
-{
39
- return do_brk2(s, a, gen_helper_sve_brka_m, gen_helper_sve_brkas_m);
40
-}
41
+TRANS_FEAT(BRKA_z, aa64_sve, do_brk2, a,
42
+ gen_helper_sve_brka_z, gen_helper_sve_brkas_z)
43
+TRANS_FEAT(BRKB_z, aa64_sve, do_brk2, a,
44
+ gen_helper_sve_brkb_z, gen_helper_sve_brkbs_z)
45
46
-static bool trans_BRKB_m(DisasContext *s, arg_rpr_s *a)
47
-{
48
- return do_brk2(s, a, gen_helper_sve_brkb_m, gen_helper_sve_brkbs_m);
49
-}
50
-
51
-static bool trans_BRKA_z(DisasContext *s, arg_rpr_s *a)
52
-{
53
- return do_brk2(s, a, gen_helper_sve_brka_z, gen_helper_sve_brkas_z);
54
-}
55
-
56
-static bool trans_BRKB_z(DisasContext *s, arg_rpr_s *a)
57
-{
58
- return do_brk2(s, a, gen_helper_sve_brkb_z, gen_helper_sve_brkbs_z);
59
-}
60
-
61
-static bool trans_BRKN(DisasContext *s, arg_rpr_s *a)
62
-{
63
- return do_brk2(s, a, gen_helper_sve_brkn, gen_helper_sve_brkns);
64
-}
65
+TRANS_FEAT(BRKN, aa64_sve, do_brk2, a,
66
+ gen_helper_sve_brkn, gen_helper_sve_brkns)
67
68
/*
69
*** SVE Predicate Count Group
70
--
71
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-71-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 10 +---------
9
1 file changed, 1 insertion(+), 9 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_SUBR_zzi(DisasContext *s, arg_rri_esz *a)
16
return true;
17
}
18
19
-static bool trans_MUL_zzi(DisasContext *s, arg_rri_esz *a)
20
-{
21
- if (sve_access_check(s)) {
22
- unsigned vsz = vec_full_reg_size(s);
23
- tcg_gen_gvec_muli(a->esz, vec_full_reg_offset(s, a->rd),
24
- vec_full_reg_offset(s, a->rn), a->imm, vsz, vsz);
25
- }
26
- return true;
27
-}
28
+TRANS_FEAT(MUL_zzi, aa64_sve, gen_gvec_fn_arg_zzi, tcg_gen_gvec_muli, a)
29
30
static bool do_zzi_sat(DisasContext *s, arg_rri_esz *a, bool u, bool d)
31
{
32
--
33
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-75-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 5 +----
9
1 file changed, 1 insertion(+), 4 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_DUP_i(DisasContext *s, arg_DUP_i *a)
16
return true;
17
}
18
19
-static bool trans_ADD_zzi(DisasContext *s, arg_rri_esz *a)
20
-{
21
- return gen_gvec_fn_arg_zzi(s, tcg_gen_gvec_addi, a);
22
-}
23
+TRANS_FEAT(ADD_zzi, aa64_sve, gen_gvec_fn_arg_zzi, tcg_gen_gvec_addi, a)
24
25
static bool trans_SUB_zzi(DisasContext *s, arg_rri_esz *a)
26
{
27
--
28
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-76-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 23 ++++-------------------
9
1 file changed, 4 insertions(+), 19 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_zzi_sat(DisasContext *s, arg_rri_esz *a, bool u, bool d)
16
return true;
17
}
18
19
-static bool trans_SQADD_zzi(DisasContext *s, arg_rri_esz *a)
20
-{
21
- return do_zzi_sat(s, a, false, false);
22
-}
23
-
24
-static bool trans_UQADD_zzi(DisasContext *s, arg_rri_esz *a)
25
-{
26
- return do_zzi_sat(s, a, true, false);
27
-}
28
-
29
-static bool trans_SQSUB_zzi(DisasContext *s, arg_rri_esz *a)
30
-{
31
- return do_zzi_sat(s, a, false, true);
32
-}
33
-
34
-static bool trans_UQSUB_zzi(DisasContext *s, arg_rri_esz *a)
35
-{
36
- return do_zzi_sat(s, a, true, true);
37
-}
38
+TRANS_FEAT(SQADD_zzi, aa64_sve, do_zzi_sat, a, false, false)
39
+TRANS_FEAT(UQADD_zzi, aa64_sve, do_zzi_sat, a, true, false)
40
+TRANS_FEAT(SQSUB_zzi, aa64_sve, do_zzi_sat, a, false, true)
41
+TRANS_FEAT(UQSUB_zzi, aa64_sve, do_zzi_sat, a, true, true)
42
43
static bool do_zzi_ool(DisasContext *s, arg_rri_esz *a, gen_helper_gvec_2i *fn)
44
{
45
--
46
2.25.1
diff view generated by jsdifflib
Deleted patch
1
From: Richard Henderson <richard.henderson@linaro.org>
2
1
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-77-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
target/arm/translate-sve.c | 7 ++-----
9
1 file changed, 2 insertions(+), 5 deletions(-)
10
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
+++ b/target/arm/translate-sve.c
15
@@ -XXX,XX +XXX,XX @@ static bool do_zzi_ool(DisasContext *s, arg_rri_esz *a, gen_helper_gvec_2i *fn)
16
}
17
18
#define DO_ZZI(NAME, name) \
19
-static bool trans_##NAME##_zzi(DisasContext *s, arg_rri_esz *a) \
20
-{ \
21
- static gen_helper_gvec_2i * const fns[4] = { \
22
+ static gen_helper_gvec_2i * const name##i_fns[4] = { \
23
gen_helper_sve_##name##i_b, gen_helper_sve_##name##i_h, \
24
gen_helper_sve_##name##i_s, gen_helper_sve_##name##i_d, \
25
}; \
26
- return do_zzi_ool(s, a, fns[a->esz]); \
27
-}
28
+ TRANS_FEAT(NAME##_zzi, aa64_sve, do_zzi_ool, a, name##i_fns[a->esz])
29
30
DO_ZZI(SMAX, smax)
31
DO_ZZI(UMAX, umax)
32
--
33
2.25.1
diff view generated by jsdifflib