1
Massive pullreq but almost all of that is RTH's SVE
1
Another very large pullreq (this one mostly because it has
2
refactoring patchset. The other interesting thing here is
2
RTH's decodetree conversion series in it), but this should be
3
the fix for compiling on aarch64 macos.
3
the last of the really large things in my to-review queue...
4
4
5
thanks
5
thanks
6
-- PMM
6
-- PMM
7
7
8
The following changes since commit f7a1ea403e0282a7f57edd4298c4f65f24165da5:
8
The following changes since commit 83aaec1d5a49f158abaa31797a0f976b3c07e5ca:
9
9
10
Merge tag 'misc-pull-request' of gitlab.com:marcandre.lureau/qemu into staging (2022-05-29 16:34:56 -0700)
10
Merge tag 'pull-tcg-20241212' of https://gitlab.com/rth7680/qemu into staging (2024-12-12 18:45:39 -0500)
11
11
12
are available in the Git repository at:
12
are available in the Git repository at:
13
13
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20220530
14
https://git.linaro.org/people/pmaydell/qemu-arm.git tags/pull-target-arm-20241213
15
15
16
for you to fetch changes up to b1071174d2a2ab371082b7d4b5f19e98edc61ac6:
16
for you to fetch changes up to 48e652c4bd9570f6f24def25355cb3009a7300f8:
17
17
18
target/arm: Remove aa64_sve check from before disas_sve (2022-05-30 17:05:12 +0100)
18
target/arm: Simplify condition for tlbi_el2_cp_reginfo[] (2024-12-13 15:41:09 +0000)
19
19
20
----------------------------------------------------------------
20
----------------------------------------------------------------
21
target-arm queue:
21
target-arm queue:
22
* docs/system/arm: Add FEAT_HCX to list of emulated features
22
* Finish conversion of A64 decoder to decodetree
23
* target/arm/hvf: Include missing "cpregs.h"
23
* Use float_round_to_odd in helper_fcvtx_f64_to_f32
24
* hw/sd/allwinner-sdhost: report FIFO water level as 1 when data ready
24
* Move TLBI insn emulation code out to its own source file
25
* SVE: refactor to use TRANS/TRANS_FEAT macros and push
25
* docs/system/arm: fix broken links, document undocumented properties
26
SVE feature check down to individual insn level
26
* MAINTAINERS: correct an email address
27
27
28
----------------------------------------------------------------
28
----------------------------------------------------------------
29
Icenowy Zheng (1):
29
Brian Cain (1):
30
hw/sd/allwinner-sdhost: report FIFO water level as 1 when data ready
30
MAINTAINERS: correct my email address
31
31
32
Peter Maydell (1):
32
Peter Maydell (10):
33
docs/system/arm: Add FEAT_HCX to list of emulated features
33
target/arm: Move some TLBI insns to their own source file
34
target/arm: Move TLBI insns for AArch32 EL2 to tlbi_insn_helper.c
35
target/arm: Move AArch64 TLBI insns from v8_cp_reginfo[]
36
target/arm: Move the AArch64 EL2 TLBI insns
37
target/arm: Move AArch64 EL3 TLBI insns
38
target/arm: Move TLBI range insns
39
target/arm: Move the TLBI OS insns to tlb-insns.c.
40
target/arm: Move small helper functions to tlb-insns.c
41
target/arm: Move RME TLB insns to tlb-insns.c
42
target/arm: Simplify condition for tlbi_el2_cp_reginfo[]
34
43
35
Philippe Mathieu-Daudé (1):
44
Pierrick Bouvier (4):
36
target/arm/hvf: Include missing "cpregs.h"
45
docs/system/arm/orangepi: update links
46
docs/system/arm/fby35: document execute-in-place property
47
docs/system/arm/xlnx-versal-virt: document ospi-flash property
48
docs/system/arm/virt: document missing properties
37
49
38
Richard Henderson (114):
50
Richard Henderson (70):
39
target/arm: Introduce TRANS, TRANS_FEAT
51
target/arm: Add section labels for "Data Processing (register)"
40
target/arm: Move null function and sve check into gen_gvec_ool_zz
52
target/arm: Convert UDIV, SDIV to decodetree
41
target/arm: Use TRANS_FEAT for gen_gvec_ool_zz
53
target/arm: Convert LSLV, LSRV, ASRV, RORV to decodetree
42
target/arm: Move null function and sve check into gen_gvec_ool_zzz
54
target/arm: Convert CRC32, CRC32C to decodetree
43
target/arm: Introduce gen_gvec_ool_arg_zzz
55
target/arm: Convert SUBP, IRG, GMI to decodetree
44
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zzz
56
target/arm: Convert PACGA to decodetree
45
target/arm: Use TRANS_FEAT for do_sve2_zzz_ool
57
target/arm: Convert RBIT, REV16, REV32, REV64 to decodetree
46
target/arm: Move null function and sve check into gen_gvec_ool_zzzz
58
target/arm: Convert CLZ, CLS to decodetree
47
target/arm: Use TRANS_FEAT for gen_gvec_ool_zzzz
59
target/arm: Convert PAC[ID]*, AUT[ID]* to decodetree
48
target/arm: Introduce gen_gvec_ool_arg_zzzz
60
target/arm: Convert XPAC[ID] to decodetree
49
target/arm: Use TRANS_FEAT for do_sve2_zzzz_ool
61
target/arm: Convert disas_logic_reg to decodetree
50
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zzzz
62
target/arm: Convert disas_add_sub_ext_reg to decodetree
51
target/arm: Rename do_zzxz_ool to gen_gvec_ool_arg_zzxz
63
target/arm: Convert disas_add_sub_reg to decodetree
52
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zzxz
64
target/arm: Convert disas_data_proc_3src to decodetree
53
target/arm: Use TRANS_FEAT for do_sve2_zzz_data
65
target/arm: Convert disas_adc_sbc to decodetree
54
target/arm: Use TRANS_FEAT for do_sve2_zzzz_data
66
target/arm: Convert RMIF to decodetree
55
target/arm: Use TRANS_FEAT for do_sve2_zzw_data
67
target/arm: Convert SETF8, SETF16 to decodetree
56
target/arm: Use TRANS_FEAT for USDOT_zzzz
68
target/arm: Convert CCMP, CCMN to decodetree
57
target/arm: Move null function and sve check into gen_gvec_ool_zzp
69
target/arm: Convert disas_cond_select to decodetree
58
target/arm: Introduce gen_gvec_ool_arg_zpz
70
target/arm: Introduce fp_access_check_scalar_hsd
59
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zpz
71
target/arm: Introduce fp_access_check_vector_hsd
60
target/arm: Use TRANS_FEAT for do_sve2_zpz_data
72
target/arm: Convert FCMP, FCMPE, FCCMP, FCCMPE to decodetree
61
target/arm: Rename do_zpzi_ool to gen_gvec_ool_arg_zpzi
73
target/arm: Fix decode of fp16 vector fabs, fneg, fsqrt
62
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zpzi
74
target/arm: Convert FMOV, FABS, FNEG (scalar) to decodetree
63
target/arm: Move null function and sve check into gen_gvec_ool_zzzp
75
target/arm: Pass fpstatus to vfp_sqrt*
64
target/arm: Introduce gen_gvec_ool_arg_zpzz
76
target/arm: Remove helper_sqrt_f16
65
target/arm: Use TRANS_FEAT for gen_gvec_ool_arg_zpzz
77
target/arm: Convert FSQRT (scalar) to decodetree
66
target/arm: Use TRANS_FEAT for do_sve2_zpzz_ool
78
target/arm: Convert FRINT[NPMSAXI] (scalar) to decodetree
67
target/arm: Merge gen_gvec_fn_zz into do_mov_z
79
target/arm: Convert BFCVT to decodetree
68
target/arm: Move null function and sve check into gen_gvec_fn_zzz
80
target/arm: Convert FRINT{32, 64}[ZX] (scalar) to decodetree
69
target/arm: Rename do_zzz_fn to gen_gvec_fn_arg_zzz
81
target/arm: Convert FCVT (scalar) to decodetree
70
target/arm: More use of gen_gvec_fn_arg_zzz
82
target/arm: Convert handle_fpfpcvt to decodetree
71
target/arm: Use TRANS_FEAT for gen_gvec_fn_arg_zzz
83
target/arm: Convert FJCVTZS to decodetree
72
target/arm: Use TRANS_FEAT for do_sve2_fn_zzz
84
target/arm: Convert handle_fmov to decodetree
73
target/arm: Use TRANS_FEAT for RAX1
85
target/arm: Convert SQABS, SQNEG to decodetree
74
target/arm: Introduce gen_gvec_fn_arg_zzzz
86
target/arm: Convert ABS, NEG to decodetree
75
target/arm: Use TRANS_FEAT for do_sve2_zzzz_fn
87
target/arm: Introduce gen_gvec_cls, gen_gvec_clz
76
target/arm: Introduce gen_gvec_fn_zzi
88
target/arm: Convert CLS, CLZ (vector) to decodetree
77
target/arm: Use TRANS_FEAT for do_zz_dbm
89
target/arm: Introduce gen_gvec_cnt, gen_gvec_rbit
78
target/arm: Hoist sve access check through do_sel_z
90
target/arm: Convert CNT, NOT, RBIT (vector) to decodetree
79
target/arm: Introduce gen_gvec_fn_arg_zzi
91
target/arm: Convert CMGT, CMGE, GMLT, GMLE, CMEQ (zero) to decodetree
80
target/arm: Use TRANS_FEAT for do_sve2_fn2i
92
target/arm: Introduce gen_gvec_rev{16,32,64}
81
target/arm: Use TRANS_FEAT for do_vpz_ool
93
target/arm: Convert handle_rev to decodetree
82
target/arm: Use TRANS_FEAT for do_shift_imm
94
target/arm: Move helper_neon_addlp_{s8, s16} to neon_helper.c
83
target/arm: Introduce do_shift_zpzi
95
target/arm: Introduce gen_gvec_{s,u}{add,ada}lp
84
target/arm: Use TRANS_FEAT for do_shift_zpzi
96
target/arm: Convert handle_2misc_pairwise to decodetree
85
target/arm: Use TRANS_FEAT for do_zpzzz_ool
97
target/arm: Remove helper_neon_{add,sub}l_u{16,32}
86
target/arm: Move sve check into do_index
98
target/arm: Introduce clear_vec
87
target/arm: Use TRANS_FEAT for do_index
99
target/arm: Convert XTN, SQXTUN, SQXTN, UQXTN to decodetree
88
target/arm: Use TRANS_FEAT for do_adr
100
target/arm: Convert FCVTN, BFCVTN to decodetree
89
target/arm: Use TRANS_FEAT for do_predset
101
target/arm: Convert FCVTXN to decodetree
90
target/arm: Use TRANS_FEAT for RDFFR, WRFFR
102
target/arm: Convert SHLL to decodetree
91
target/arm: Use TRANS_FEAT for do_pfirst_pnext
103
target/arm: Implement gen_gvec_fabs, gen_gvec_fneg
92
target/arm: Use TRANS_FEAT for do_EXT
104
target/arm: Convert FABS, FNEG (vector) to decodetree
93
target/arm: Use TRANS_FEAT for do_perm_pred3
105
target/arm: Convert FSQRT (vector) to decodetree
94
target/arm: Use TRANS_FEAT for do_perm_pred2
106
target/arm: Convert FRINT* (vector) to decodetree
95
target/arm: Move sve zip high_ofs into simd_data
107
target/arm: Convert FCVT* (vector, integer) scalar to decodetree
96
target/arm: Use gen_gvec_ool_arg_zzz for do_zip, do_zip_q
108
target/arm: Convert FCVT* (vector, fixed-point) scalar to decodetree
97
target/arm: Use TRANS_FEAT for do_zip, do_zip_q
109
target/arm: Convert [US]CVTF (vector, integer) scalar to decodetree
98
target/arm: Use TRANS_FEAT for do_clast_vector
110
target/arm: Convert [US]CVTF (vector, fixed-point) scalar to decodetree
99
target/arm: Use TRANS_FEAT for do_clast_fp
111
target/arm: Rename helper_gvec_vcvt_[hf][su] with _rz
100
target/arm: Use TRANS_FEAT for do_clast_general
112
target/arm: Convert [US]CVTF (vector) to decodetree
101
target/arm: Use TRANS_FEAT for do_last_fp
113
target/arm: Convert FCVTZ[SU] (vector, fixed-point) to decodetree
102
target/arm: Use TRANS_FEAT for do_last_general
114
target/arm: Convert FCVT* (vector, integer) to decodetree
103
target/arm: Use TRANS_FEAT for SPLICE
115
target/arm: Convert handle_2misc_fcmp_zero to decodetree
104
target/arm: Use TRANS_FEAT for do_ppzz_flags
116
target/arm: Convert FRECPE, FRECPX, FRSQRTE to decodetree
105
target/arm: Use TRANS_FEAT for do_sve2_ppzz_flags
117
target/arm: Introduce gen_gvec_urecpe, gen_gvec_ursqrte
106
target/arm: Use TRANS_FEAT for do_ppzi_flags
118
target/arm: Convert URECPE and URSQRTE to decodetree
107
target/arm: Use TRANS_FEAT for do_brk2, do_brk3
119
target/arm: Convert FCVTL to decodetree
108
target/arm: Use TRANS_FEAT for MUL_zzi
120
target/arm: Use float_round_to_odd in helper_fcvtx_f64_to_f32
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
121
154
docs/system/arm/emulation.rst | 1 +
122
MAINTAINERS | 2 +-
155
target/arm/translate.h | 11 +
123
docs/system/arm/fby35.rst | 5 +
156
target/arm/sve.decode | 57 +-
124
docs/system/arm/orangepi.rst | 4 +-
157
hw/sd/allwinner-sdhost.c | 7 +
125
docs/system/arm/virt.rst | 16 +
158
target/arm/hvf/hvf.c | 1 +
126
docs/system/arm/xlnx-versal-virt.rst | 3 +
159
target/arm/sve_helper.c | 6 +-
127
target/arm/helper.h | 43 +-
160
target/arm/translate-a64.c | 2 +-
128
target/arm/internals.h | 9 +
161
target/arm/translate-sve.c | 5367 +++++++++++++++--------------------------
129
target/arm/tcg/helper-a64.h | 7 -
162
8 files changed, 2067 insertions(+), 3385 deletions(-)
130
target/arm/tcg/translate.h | 35 +
163
131
target/arm/tcg/a64.decode | 502 ++-
132
target/arm/helper.c | 1208 +-------
133
target/arm/tcg-stubs.c | 5 +
134
target/arm/tcg/gengvec.c | 369 +++
135
target/arm/tcg/helper-a64.c | 122 +-
136
target/arm/tcg/neon_helper.c | 106 +-
137
target/arm/tcg/tlb-insns.c | 1266 ++++++++
138
target/arm/tcg/translate-a64.c | 5670 +++++++++++-----------------------
139
target/arm/tcg/translate-neon.c | 337 +-
140
target/arm/tcg/translate-vfp.c | 6 +-
141
target/arm/tcg/vec_helper.c | 65 +-
142
target/arm/vfp_helper.c | 16 +-
143
target/arm/tcg/meson.build | 1 +
144
22 files changed, 4203 insertions(+), 5594 deletions(-)
145
create mode 100644 target/arm/tcg/tlb-insns.c
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Richard Henderson <richard.henderson@linaro.org>
2
2
3
At the same time, use ### to separate 3rd-level sections.
4
We already use ### for 4.1.92 Data Processing (immediate),
5
but not the two following two third-level sections:
6
4.1.93 Branches, and 4.1.94 Loads and stores.
7
8
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-97-richard.henderson@linaro.org
10
Message-id: 20241211163036.2297116-2-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
12
---
8
target/arm/translate-sve.c | 29 ++++++-----------------------
13
target/arm/tcg/a64.decode | 19 +++++++++++++++++--
9
1 file changed, 6 insertions(+), 23 deletions(-)
14
1 file changed, 17 insertions(+), 2 deletions(-)
10
15
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
18
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FCVTX_ds, aa64_sve2, do_frint_mode, a,
20
@@ -XXX,XX +XXX,XX @@ UBFM . 10 100110 . ...... ...... ..... ..... @bitfield_32
16
TRANS_FEAT(FCVTXNT_ds, aa64_sve2, do_frint_mode, a,
21
EXTR 1 00 100111 1 0 rm:5 imm:6 rn:5 rd:5 &extract sf=1
17
float_round_to_odd, gen_helper_sve2_fcvtnt_ds)
22
EXTR 0 00 100111 0 0 rm:5 0 imm:5 rn:5 rd:5 &extract sf=0
18
23
19
-static bool trans_FLOGB(DisasContext *s, arg_rpr_esz *a)
24
-# Branches
20
-{
25
+### Branches
21
- static gen_helper_gvec_3_ptr * const fns[] = {
26
22
- NULL, gen_helper_flogb_h,
27
%imm26 0:s26 !function=times_4
23
- gen_helper_flogb_s, gen_helper_flogb_d
28
@branch . ..... .......................... &i imm=%imm26
24
- };
29
@@ -XXX,XX +XXX,XX @@ HLT 1101 0100 010 ................ 000 00 @i16
25
-
30
# DCPS2 1101 0100 101 ................ 000 10 @i16
26
- if (!dc_isar_feature(aa64_sve2, s) || fns[a->esz] == NULL) {
31
# DCPS3 1101 0100 101 ................ 000 11 @i16
27
- return false;
32
28
- }
33
-# Loads and stores
29
- if (sve_access_check(s)) {
34
+### Loads and stores
30
- TCGv_ptr status =
35
31
- fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
36
&stxr rn rt rt2 rs sz lasr
32
- unsigned vsz = vec_full_reg_size(s);
37
&stlr rn rt sz lasr
33
-
38
@@ -XXX,XX +XXX,XX @@ CPYP 00 011 1 01000 ..... .... 01 ..... ..... @cpy
34
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
39
CPYM 00 011 1 01010 ..... .... 01 ..... ..... @cpy
35
- vec_full_reg_offset(s, a->rn),
40
CPYE 00 011 1 01100 ..... .... 01 ..... ..... @cpy
36
- pred_full_reg_offset(s, a->pg),
41
37
- status, vsz, vsz, 0, fns[a->esz]);
42
+### Data Processing (register)
38
- tcg_temp_free_ptr(status);
43
+
39
- }
44
+# Data Processing (2-source)
40
- return true;
45
+# Data Processing (1-source)
41
-}
46
+# Logical (shifted reg)
42
+static gen_helper_gvec_3_ptr * const flogb_fns[] = {
47
+# Add/subtract (shifted reg)
43
+ NULL, gen_helper_flogb_h,
48
+# Add/subtract (extended reg)
44
+ gen_helper_flogb_s, gen_helper_flogb_d
49
+# Add/subtract (carry)
45
+};
50
+# Rotate right into flags
46
+TRANS_FEAT(FLOGB, aa64_sve2, gen_gvec_fpst_arg_zpz, flogb_fns[a->esz],
51
+# Evaluate into flags
47
+ a, 0, a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
52
+# Conditional compare (regster)
48
53
+# Conditional compare (immediate)
49
static bool do_FMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sub, bool sel)
54
+# Conditional select
50
{
55
+# Data Processing (3-source)
56
+
57
### Cryptographic AES
58
59
AESE 01001110 00 10100 00100 10 ..... ..... @r2r_q1e0
51
--
60
--
52
2.25.1
61
2.34.1
62
63
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: Philippe Mathieu-Daudé <philmd@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-84-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-3-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 | 11 ++---------
8
target/arm/tcg/a64.decode | 7 ++++
9
1 file changed, 2 insertions(+), 9 deletions(-)
9
target/arm/tcg/translate-a64.c | 64 +++++++++++++++++-----------------
10
2 files changed, 39 insertions(+), 32 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_FMLA_zzxz(DisasContext *s, arg_rrxr_esz *a, bool sub)
16
@@ -XXX,XX +XXX,XX @@
16
a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
17
&r rn
18
&ri rd imm
19
&rri_sf rd rn imm sf
20
+&rrr_sf rd rn rm sf
21
&i imm
22
&rr_e rd rn esz
23
&rri_e rd rn imm esz
24
@@ -XXX,XX +XXX,XX @@ CPYE 00 011 1 01100 ..... .... 01 ..... ..... @cpy
25
### Data Processing (register)
26
27
# Data Processing (2-source)
28
+
29
+@rrr_sf sf:1 .......... rm:5 ...... rn:5 rd:5 &rrr_sf
30
+
31
+UDIV . 00 11010110 ..... 00001 0 ..... ..... @rrr_sf
32
+SDIV . 00 11010110 ..... 00001 1 ..... ..... @rrr_sf
33
+
34
# Data Processing (1-source)
35
# Logical (shifted reg)
36
# Add/subtract (shifted reg)
37
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/tcg/translate-a64.c
40
+++ b/target/arm/tcg/translate-a64.c
41
@@ -XXX,XX +XXX,XX @@ TRANS(UQRSHRN_si, do_scalar_shift_imm_narrow, a, uqrshrn_fns, 0, false)
42
TRANS(SQSHRUN_si, do_scalar_shift_imm_narrow, a, sqshrun_fns, MO_SIGN, false)
43
TRANS(SQRSHRUN_si, do_scalar_shift_imm_narrow, a, sqrshrun_fns, MO_SIGN, false)
44
45
+static bool do_div(DisasContext *s, arg_rrr_sf *a, bool is_signed)
46
+{
47
+ TCGv_i64 tcg_n, tcg_m, tcg_rd;
48
+ tcg_rd = cpu_reg(s, a->rd);
49
+
50
+ if (!a->sf && is_signed) {
51
+ tcg_n = tcg_temp_new_i64();
52
+ tcg_m = tcg_temp_new_i64();
53
+ tcg_gen_ext32s_i64(tcg_n, cpu_reg(s, a->rn));
54
+ tcg_gen_ext32s_i64(tcg_m, cpu_reg(s, a->rm));
55
+ } else {
56
+ tcg_n = read_cpu_reg(s, a->rn, a->sf);
57
+ tcg_m = read_cpu_reg(s, a->rm, a->sf);
58
+ }
59
+
60
+ if (is_signed) {
61
+ gen_helper_sdiv64(tcg_rd, tcg_n, tcg_m);
62
+ } else {
63
+ gen_helper_udiv64(tcg_rd, tcg_n, tcg_m);
64
+ }
65
+
66
+ if (!a->sf) { /* zero extend final result */
67
+ tcg_gen_ext32u_i64(tcg_rd, tcg_rd);
68
+ }
69
+ return true;
70
+}
71
+
72
+TRANS(SDIV, do_div, a, true)
73
+TRANS(UDIV, do_div, a, false)
74
+
75
/* Shift a TCGv src by TCGv shift_amount, put result in dst.
76
* Note that it is the caller's responsibility to ensure that the
77
* shift amount is in range (ie 0..31 or 0..63) and provide the ARM
78
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
79
#undef MAP
17
}
80
}
18
81
19
-static bool trans_FMLA_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
82
-static void handle_div(DisasContext *s, bool is_signed, unsigned int sf,
83
- unsigned int rm, unsigned int rn, unsigned int rd)
20
-{
84
-{
21
- return do_FMLA_zzxz(s, a, false);
85
- TCGv_i64 tcg_n, tcg_m, tcg_rd;
86
- tcg_rd = cpu_reg(s, rd);
87
-
88
- if (!sf && is_signed) {
89
- tcg_n = tcg_temp_new_i64();
90
- tcg_m = tcg_temp_new_i64();
91
- tcg_gen_ext32s_i64(tcg_n, cpu_reg(s, rn));
92
- tcg_gen_ext32s_i64(tcg_m, cpu_reg(s, rm));
93
- } else {
94
- tcg_n = read_cpu_reg(s, rn, sf);
95
- tcg_m = read_cpu_reg(s, rm, sf);
96
- }
97
-
98
- if (is_signed) {
99
- gen_helper_sdiv64(tcg_rd, tcg_n, tcg_m);
100
- } else {
101
- gen_helper_udiv64(tcg_rd, tcg_n, tcg_m);
102
- }
103
-
104
- if (!sf) { /* zero extend final result */
105
- tcg_gen_ext32u_i64(tcg_rd, tcg_rd);
106
- }
22
-}
107
-}
23
-
108
24
-static bool trans_FMLS_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
109
/* LSLV, LSRV, ASRV, RORV */
25
-{
110
static void handle_shift_reg(DisasContext *s,
26
- return do_FMLA_zzxz(s, a, true);
111
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn)
27
-}
112
}
28
+TRANS_FEAT(FMLA_zzxz, aa64_sve, do_FMLA_zzxz, a, false)
113
}
29
+TRANS_FEAT(FMLS_zzxz, aa64_sve, do_FMLA_zzxz, a, true)
114
break;
30
115
- case 2: /* UDIV */
31
/*
116
- handle_div(s, false, sf, rm, rn, rd);
32
*** SVE Floating Point Multiply Indexed Group
117
- break;
118
- case 3: /* SDIV */
119
- handle_div(s, true, sf, rm, rn, rd);
120
- break;
121
case 4: /* IRG */
122
if (sf == 0 || !dc_isar_feature(aa64_mte_insn_reg, s)) {
123
goto do_unallocated;
124
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn)
125
}
126
default:
127
do_unallocated:
128
+ case 2: /* UDIV */
129
+ case 3: /* SDIV */
130
unallocated_encoding(s);
131
break;
132
}
33
--
133
--
34
2.25.1
134
2.34.1
135
136
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: Philippe Mathieu-Daudé <philmd@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: 20241211163036.2297116-4-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
target/arm/tcg/a64.decode | 4 +++
9
1 file changed, 4 insertions(+), 24 deletions(-)
9
target/arm/tcg/translate-a64.c | 46 ++++++++++++++++------------------
10
2 files changed, 25 insertions(+), 25 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(BFMMLA, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
16
@@ -XXX,XX +XXX,XX @@ CPYE 00 011 1 01100 ..... .... 01 ..... ..... @cpy
16
17
17
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
18
UDIV . 00 11010110 ..... 00001 0 ..... ..... @rrr_sf
18
{
19
SDIV . 00 11010110 ..... 00001 1 ..... ..... @rrr_sf
19
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
20
+LSLV . 00 11010110 ..... 00100 0 ..... ..... @rrr_sf
20
- return false;
21
+LSRV . 00 11010110 ..... 00100 1 ..... ..... @rrr_sf
21
- }
22
+ASRV . 00 11010110 ..... 00101 0 ..... ..... @rrr_sf
22
return gen_gvec_fpst_zzzz(s, gen_helper_gvec_bfmlal,
23
+RORV . 00 11010110 ..... 00101 1 ..... ..... @rrr_sf
23
a->rd, a->rn, a->rm, a->ra, sel, FPST_FPCR);
24
25
# Data Processing (1-source)
26
# Logical (shifted reg)
27
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/tcg/translate-a64.c
30
+++ b/target/arm/tcg/translate-a64.c
31
@@ -XXX,XX +XXX,XX @@ static void shift_reg_imm(TCGv_i64 dst, TCGv_i64 src, int sf,
32
}
24
}
33
}
25
34
26
-static bool trans_BFMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
35
+static bool do_shift_reg(DisasContext *s, arg_rrr_sf *a,
36
+ enum a64_shift_type shift_type)
37
+{
38
+ TCGv_i64 tcg_shift = tcg_temp_new_i64();
39
+ TCGv_i64 tcg_rd = cpu_reg(s, a->rd);
40
+ TCGv_i64 tcg_rn = read_cpu_reg(s, a->rn, a->sf);
41
+
42
+ tcg_gen_andi_i64(tcg_shift, cpu_reg(s, a->rm), a->sf ? 63 : 31);
43
+ shift_reg(tcg_rd, tcg_rn, a->sf, shift_type, tcg_shift);
44
+ return true;
45
+}
46
+
47
+TRANS(LSLV, do_shift_reg, a, A64_SHIFT_TYPE_LSL)
48
+TRANS(LSRV, do_shift_reg, a, A64_SHIFT_TYPE_LSR)
49
+TRANS(ASRV, do_shift_reg, a, A64_SHIFT_TYPE_ASR)
50
+TRANS(RORV, do_shift_reg, a, A64_SHIFT_TYPE_ROR)
51
+
52
/* Logical (shifted register)
53
* 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0
54
* +----+-----+-----------+-------+---+------+--------+------+------+
55
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
56
}
57
58
59
-/* LSLV, LSRV, ASRV, RORV */
60
-static void handle_shift_reg(DisasContext *s,
61
- enum a64_shift_type shift_type, unsigned int sf,
62
- unsigned int rm, unsigned int rn, unsigned int rd)
27
-{
63
-{
28
- return do_BFMLAL_zzzw(s, a, false);
64
- TCGv_i64 tcg_shift = tcg_temp_new_i64();
65
- TCGv_i64 tcg_rd = cpu_reg(s, rd);
66
- TCGv_i64 tcg_rn = read_cpu_reg(s, rn, sf);
67
-
68
- tcg_gen_andi_i64(tcg_shift, cpu_reg(s, rm), sf ? 63 : 31);
69
- shift_reg(tcg_rd, tcg_rn, sf, shift_type, tcg_shift);
29
-}
70
-}
30
-
71
-
31
-static bool trans_BFMLALT_zzzw(DisasContext *s, arg_rrrr_esz *a)
72
/* CRC32[BHWX], CRC32C[BHWX] */
32
-{
73
static void handle_crc32(DisasContext *s,
33
- return do_BFMLAL_zzzw(s, a, true);
74
unsigned int sf, unsigned int sz, bool crc32c,
34
-}
75
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn)
35
+TRANS_FEAT(BFMLALB_zzzw, aa64_sve_bf16, do_BFMLAL_zzzw, a, false)
76
tcg_gen_or_i64(cpu_reg(s, rd), cpu_reg(s, rm), t);
36
+TRANS_FEAT(BFMLALT_zzzw, aa64_sve_bf16, do_BFMLAL_zzzw, a, true)
77
}
37
78
break;
38
static bool do_BFMLAL_zzxw(DisasContext *s, arg_rrxr_esz *a, bool sel)
79
- case 8: /* LSLV */
39
{
80
- handle_shift_reg(s, A64_SHIFT_TYPE_LSL, sf, rm, rn, rd);
40
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
81
- break;
41
- return false;
82
- case 9: /* LSRV */
42
- }
83
- handle_shift_reg(s, A64_SHIFT_TYPE_LSR, sf, rm, rn, rd);
43
return gen_gvec_fpst_zzzz(s, gen_helper_gvec_bfmlal_idx,
84
- break;
44
a->rd, a->rn, a->rm, a->ra,
85
- case 10: /* ASRV */
45
(a->index << 1) | sel, FPST_FPCR);
86
- handle_shift_reg(s, A64_SHIFT_TYPE_ASR, sf, rm, rn, rd);
46
}
87
- break;
47
88
- case 11: /* RORV */
48
-static bool trans_BFMLALB_zzxw(DisasContext *s, arg_rrxr_esz *a)
89
- handle_shift_reg(s, A64_SHIFT_TYPE_ROR, sf, rm, rn, rd);
49
-{
90
- break;
50
- return do_BFMLAL_zzxw(s, a, false);
91
case 12: /* PACGA */
51
-}
92
if (sf == 0 || !dc_isar_feature(aa64_pauth, s)) {
52
-
93
goto do_unallocated;
53
-static bool trans_BFMLALT_zzxw(DisasContext *s, arg_rrxr_esz *a)
94
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn)
54
-{
95
do_unallocated:
55
- return do_BFMLAL_zzxw(s, a, true);
96
case 2: /* UDIV */
56
-}
97
case 3: /* SDIV */
57
+TRANS_FEAT(BFMLALB_zzxw, aa64_sve_bf16, do_BFMLAL_zzxw, a, false)
98
+ case 8: /* LSLV */
58
+TRANS_FEAT(BFMLALT_zzxw, aa64_sve_bf16, do_BFMLAL_zzxw, a, true)
99
+ case 9: /* LSRV */
100
+ case 10: /* ASRV */
101
+ case 11: /* RORV */
102
unallocated_encoding(s);
103
break;
104
}
59
--
105
--
60
2.25.1
106
2.34.1
107
108
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: Philippe Mathieu-Daudé <philmd@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-76-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-5-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 | 23 ++++-------------------
8
target/arm/tcg/a64.decode | 12 ++++
9
1 file changed, 4 insertions(+), 19 deletions(-)
9
target/arm/tcg/translate-a64.c | 101 +++++++++++++--------------------
10
2 files changed, 53 insertions(+), 60 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_zzi_sat(DisasContext *s, arg_rri_esz *a, bool u, bool d)
16
@@ -XXX,XX +XXX,XX @@
16
return true;
17
@rr_d ........ ... ..... ...... rn:5 rd:5 &rr_e esz=3
18
@rr_sd ........ ... ..... ...... rn:5 rd:5 &rr_e esz=%esz_sd
19
20
+@rrr_b ........ ... rm:5 ...... rn:5 rd:5 &rrr_e esz=0
21
@rrr_h ........ ... rm:5 ...... rn:5 rd:5 &rrr_e esz=1
22
+@rrr_s ........ ... rm:5 ...... rn:5 rd:5 &rrr_e esz=2
23
@rrr_d ........ ... rm:5 ...... rn:5 rd:5 &rrr_e esz=3
24
@rrr_sd ........ ... rm:5 ...... rn:5 rd:5 &rrr_e esz=%esz_sd
25
@rrr_hsd ........ ... rm:5 ...... rn:5 rd:5 &rrr_e esz=%esz_hsd
26
@@ -XXX,XX +XXX,XX @@ LSRV . 00 11010110 ..... 00100 1 ..... ..... @rrr_sf
27
ASRV . 00 11010110 ..... 00101 0 ..... ..... @rrr_sf
28
RORV . 00 11010110 ..... 00101 1 ..... ..... @rrr_sf
29
30
+CRC32 0 00 11010110 ..... 0100 00 ..... ..... @rrr_b
31
+CRC32 0 00 11010110 ..... 0100 01 ..... ..... @rrr_h
32
+CRC32 0 00 11010110 ..... 0100 10 ..... ..... @rrr_s
33
+CRC32 1 00 11010110 ..... 0100 11 ..... ..... @rrr_d
34
+
35
+CRC32C 0 00 11010110 ..... 0101 00 ..... ..... @rrr_b
36
+CRC32C 0 00 11010110 ..... 0101 01 ..... ..... @rrr_h
37
+CRC32C 0 00 11010110 ..... 0101 10 ..... ..... @rrr_s
38
+CRC32C 1 00 11010110 ..... 0101 11 ..... ..... @rrr_d
39
+
40
# Data Processing (1-source)
41
# Logical (shifted reg)
42
# Add/subtract (shifted reg)
43
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/target/arm/tcg/translate-a64.c
46
+++ b/target/arm/tcg/translate-a64.c
47
@@ -XXX,XX +XXX,XX @@ TRANS(LSRV, do_shift_reg, a, A64_SHIFT_TYPE_LSR)
48
TRANS(ASRV, do_shift_reg, a, A64_SHIFT_TYPE_ASR)
49
TRANS(RORV, do_shift_reg, a, A64_SHIFT_TYPE_ROR)
50
51
+static bool do_crc32(DisasContext *s, arg_rrr_e *a, bool crc32c)
52
+{
53
+ TCGv_i64 tcg_acc, tcg_val, tcg_rd;
54
+ TCGv_i32 tcg_bytes;
55
+
56
+ switch (a->esz) {
57
+ case MO_8:
58
+ case MO_16:
59
+ case MO_32:
60
+ tcg_val = tcg_temp_new_i64();
61
+ tcg_gen_extract_i64(tcg_val, cpu_reg(s, a->rm), 0, 8 << a->esz);
62
+ break;
63
+ case MO_64:
64
+ tcg_val = cpu_reg(s, a->rm);
65
+ break;
66
+ default:
67
+ g_assert_not_reached();
68
+ }
69
+ tcg_acc = cpu_reg(s, a->rn);
70
+ tcg_bytes = tcg_constant_i32(1 << a->esz);
71
+ tcg_rd = cpu_reg(s, a->rd);
72
+
73
+ if (crc32c) {
74
+ gen_helper_crc32c_64(tcg_rd, tcg_acc, tcg_val, tcg_bytes);
75
+ } else {
76
+ gen_helper_crc32_64(tcg_rd, tcg_acc, tcg_val, tcg_bytes);
77
+ }
78
+ return true;
79
+}
80
+
81
+TRANS_FEAT(CRC32, aa64_crc32, do_crc32, a, false)
82
+TRANS_FEAT(CRC32C, aa64_crc32, do_crc32, a, true)
83
+
84
/* Logical (shifted register)
85
* 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0
86
* +----+-----+-----------+-------+---+------+--------+------+------+
87
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
17
}
88
}
18
89
19
-static bool trans_SQADD_zzi(DisasContext *s, arg_rri_esz *a)
90
91
-/* CRC32[BHWX], CRC32C[BHWX] */
92
-static void handle_crc32(DisasContext *s,
93
- unsigned int sf, unsigned int sz, bool crc32c,
94
- unsigned int rm, unsigned int rn, unsigned int rd)
20
-{
95
-{
21
- return do_zzi_sat(s, a, false, false);
96
- TCGv_i64 tcg_acc, tcg_val;
97
- TCGv_i32 tcg_bytes;
98
-
99
- if (!dc_isar_feature(aa64_crc32, s)
100
- || (sf == 1 && sz != 3)
101
- || (sf == 0 && sz == 3)) {
102
- unallocated_encoding(s);
103
- return;
104
- }
105
-
106
- if (sz == 3) {
107
- tcg_val = cpu_reg(s, rm);
108
- } else {
109
- uint64_t mask;
110
- switch (sz) {
111
- case 0:
112
- mask = 0xFF;
113
- break;
114
- case 1:
115
- mask = 0xFFFF;
116
- break;
117
- case 2:
118
- mask = 0xFFFFFFFF;
119
- break;
120
- default:
121
- g_assert_not_reached();
122
- }
123
- tcg_val = tcg_temp_new_i64();
124
- tcg_gen_andi_i64(tcg_val, cpu_reg(s, rm), mask);
125
- }
126
-
127
- tcg_acc = cpu_reg(s, rn);
128
- tcg_bytes = tcg_constant_i32(1 << sz);
129
-
130
- if (crc32c) {
131
- gen_helper_crc32c_64(cpu_reg(s, rd), tcg_acc, tcg_val, tcg_bytes);
132
- } else {
133
- gen_helper_crc32_64(cpu_reg(s, rd), tcg_acc, tcg_val, tcg_bytes);
134
- }
22
-}
135
-}
23
-
136
-
24
-static bool trans_UQADD_zzi(DisasContext *s, arg_rri_esz *a)
137
/* Data-processing (2 source)
25
-{
138
* 31 30 29 28 21 20 16 15 10 9 5 4 0
26
- return do_zzi_sat(s, a, true, false);
139
* +----+---+---+-----------------+------+--------+------+------+
27
-}
140
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn)
28
-
141
gen_helper_pacga(cpu_reg(s, rd), tcg_env,
29
-static bool trans_SQSUB_zzi(DisasContext *s, arg_rri_esz *a)
142
cpu_reg(s, rn), cpu_reg_sp(s, rm));
30
-{
143
break;
31
- return do_zzi_sat(s, a, false, true);
144
- case 16:
32
-}
145
- case 17:
33
-
146
- case 18:
34
-static bool trans_UQSUB_zzi(DisasContext *s, arg_rri_esz *a)
147
- case 19:
35
-{
148
- case 20:
36
- return do_zzi_sat(s, a, true, true);
149
- case 21:
37
-}
150
- case 22:
38
+TRANS_FEAT(SQADD_zzi, aa64_sve, do_zzi_sat, a, false, false)
151
- case 23: /* CRC32 */
39
+TRANS_FEAT(UQADD_zzi, aa64_sve, do_zzi_sat, a, true, false)
152
- {
40
+TRANS_FEAT(SQSUB_zzi, aa64_sve, do_zzi_sat, a, false, true)
153
- int sz = extract32(opcode, 0, 2);
41
+TRANS_FEAT(UQSUB_zzi, aa64_sve, do_zzi_sat, a, true, true)
154
- bool crc32c = extract32(opcode, 2, 1);
42
155
- handle_crc32(s, sf, sz, crc32c, rm, rn, rd);
43
static bool do_zzi_ool(DisasContext *s, arg_rri_esz *a, gen_helper_gvec_2i *fn)
156
- break;
44
{
157
- }
158
default:
159
do_unallocated:
160
case 2: /* UDIV */
161
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn)
162
case 9: /* LSRV */
163
case 10: /* ASRV */
164
case 11: /* RORV */
165
+ case 16:
166
+ case 17:
167
+ case 18:
168
+ case 19:
169
+ case 20:
170
+ case 21:
171
+ case 22:
172
+ case 23: /* CRC32 */
173
unallocated_encoding(s);
174
break;
175
}
45
--
176
--
46
2.25.1
177
2.34.1
178
179
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: Philippe Mathieu-Daudé <philmd@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: 20241211163036.2297116-6-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/tcg/a64.decode | 7 +++
13
1 file changed, 129 insertions(+), 263 deletions(-)
9
target/arm/tcg/translate-a64.c | 94 +++++++++++++++++++---------------
10
2 files changed, 59 insertions(+), 42 deletions(-)
14
11
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
16
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
18
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzi(DisasContext *s, gen_helper_gvec_3 *fn,
16
@@ -XXX,XX +XXX,XX @@
20
return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
17
%hlm 11:1 20:2
21
}
18
22
19
&r rn
23
+static bool gen_gvec_fpst_zzp(DisasContext *s, gen_helper_gvec_3_ptr *fn,
20
+&rrr rd rn rm
24
+ int rd, int rn, int pg, int data,
21
&ri rd imm
25
+ ARMFPStatusFlavour flavour)
22
&rri_sf rd rn imm sf
23
&rrr_sf rd rn rm sf
24
@@ -XXX,XX +XXX,XX @@ CPYE 00 011 1 01100 ..... .... 01 ..... ..... @cpy
25
26
# Data Processing (2-source)
27
28
+@rrr . .......... rm:5 ...... rn:5 rd:5 &rrr
29
@rrr_sf sf:1 .......... rm:5 ...... rn:5 rd:5 &rrr_sf
30
31
UDIV . 00 11010110 ..... 00001 0 ..... ..... @rrr_sf
32
@@ -XXX,XX +XXX,XX @@ CRC32C 0 00 11010110 ..... 0101 01 ..... ..... @rrr_h
33
CRC32C 0 00 11010110 ..... 0101 10 ..... ..... @rrr_s
34
CRC32C 1 00 11010110 ..... 0101 11 ..... ..... @rrr_d
35
36
+SUBP 1 00 11010110 ..... 000000 ..... ..... @rrr
37
+SUBPS 1 01 11010110 ..... 000000 ..... ..... @rrr
38
+IRG 1 00 11010110 ..... 000100 ..... ..... @rrr
39
+GMI 1 00 11010110 ..... 000101 ..... ..... @rrr
40
+
41
# Data Processing (1-source)
42
# Logical (shifted reg)
43
# Add/subtract (shifted reg)
44
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/tcg/translate-a64.c
47
+++ b/target/arm/tcg/translate-a64.c
48
@@ -XXX,XX +XXX,XX @@ static bool do_crc32(DisasContext *s, arg_rrr_e *a, bool crc32c)
49
TRANS_FEAT(CRC32, aa64_crc32, do_crc32, a, false)
50
TRANS_FEAT(CRC32C, aa64_crc32, do_crc32, a, true)
51
52
+static bool do_subp(DisasContext *s, arg_rrr *a, bool setflag)
26
+{
53
+{
27
+ if (fn == NULL) {
54
+ TCGv_i64 tcg_n = read_cpu_reg_sp(s, a->rn, true);
28
+ return false;
55
+ TCGv_i64 tcg_m = read_cpu_reg_sp(s, a->rm, true);
29
+ }
56
+ TCGv_i64 tcg_d = cpu_reg(s, a->rd);
30
+ if (sve_access_check(s)) {
31
+ unsigned vsz = vec_full_reg_size(s);
32
+ TCGv_ptr status = fpstatus_ptr(flavour);
33
+
57
+
34
+ tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
58
+ tcg_gen_sextract_i64(tcg_n, tcg_n, 0, 56);
35
+ vec_full_reg_offset(s, rn),
59
+ tcg_gen_sextract_i64(tcg_m, tcg_m, 0, 56);
36
+ pred_full_reg_offset(s, pg),
60
+
37
+ status, vsz, vsz, data, fn);
61
+ if (setflag) {
38
+ tcg_temp_free_ptr(status);
62
+ gen_sub_CC(true, tcg_d, tcg_n, tcg_m);
63
+ } else {
64
+ tcg_gen_sub_i64(tcg_d, tcg_n, tcg_m);
39
+ }
65
+ }
40
+ return true;
66
+ return true;
41
+}
67
+}
42
+
68
+
43
+static bool gen_gvec_fpst_arg_zpz(DisasContext *s, gen_helper_gvec_3_ptr *fn,
69
+TRANS_FEAT(SUBP, aa64_mte_insn_reg, do_subp, a, false)
44
+ arg_rpr_esz *a, int data,
70
+TRANS_FEAT(SUBPS, aa64_mte_insn_reg, do_subp, a, true)
45
+ ARMFPStatusFlavour flavour)
71
+
72
+static bool trans_IRG(DisasContext *s, arg_rrr *a)
46
+{
73
+{
47
+ return gen_gvec_fpst_zzp(s, fn, a->rd, a->rn, a->pg, data, flavour);
74
+ if (dc_isar_feature(aa64_mte_insn_reg, s)) {
75
+ TCGv_i64 tcg_rd = cpu_reg_sp(s, a->rd);
76
+ TCGv_i64 tcg_rn = cpu_reg_sp(s, a->rn);
77
+
78
+ if (s->ata[0]) {
79
+ gen_helper_irg(tcg_rd, tcg_env, tcg_rn, cpu_reg(s, a->rm));
80
+ } else {
81
+ gen_address_with_allocation_tag0(tcg_rd, tcg_rn);
82
+ }
83
+ return true;
84
+ }
85
+ return false;
48
+}
86
+}
49
+
87
+
50
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
88
+static bool trans_GMI(DisasContext *s, arg_rrr *a)
51
static bool gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
89
+{
52
int rd, int rn, int rm, int pg, int data)
90
+ if (dc_isar_feature(aa64_mte_insn_reg, s)) {
53
@@ -XXX,XX +XXX,XX @@ static bool trans_FCMLA_zzxz(DisasContext *s, arg_FCMLA_zzxz *a)
91
+ TCGv_i64 t = tcg_temp_new_i64();
54
*** SVE Floating Point Unary Operations Predicated Group
92
+
55
*/
93
+ tcg_gen_extract_i64(t, cpu_reg_sp(s, a->rn), 56, 4);
56
94
+ tcg_gen_shl_i64(t, tcg_constant_i64(1), t);
57
-static bool do_zpz_ptr(DisasContext *s, int rd, int rn, int pg,
95
+ tcg_gen_or_i64(cpu_reg(s, a->rd), cpu_reg(s, a->rm), t);
58
- bool is_fp16, gen_helper_gvec_3_ptr *fn)
96
+ return true;
59
-{
97
+ }
60
- if (sve_access_check(s)) {
98
+ return false;
61
- unsigned vsz = vec_full_reg_size(s);
99
+}
62
- TCGv_ptr status = fpstatus_ptr(is_fp16 ? FPST_FPCR_F16 : FPST_FPCR);
100
+
63
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
101
/* Logical (shifted register)
64
- vec_full_reg_offset(s, rn),
102
* 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0
65
- pred_full_reg_offset(s, pg),
103
* +----+-----+-----------+-------+---+------+--------+------+------+
66
- status, vsz, vsz, 0, fn);
104
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn)
67
- tcg_temp_free_ptr(status);
105
}
68
- }
106
69
- return true;
107
switch (opcode) {
70
-}
108
- case 0: /* SUBP(S) */
71
+TRANS_FEAT(FCVT_sh, aa64_sve, gen_gvec_fpst_arg_zpz,
109
- if (sf == 0 || !dc_isar_feature(aa64_mte_insn_reg, s)) {
72
+ gen_helper_sve_fcvt_sh, a, 0, FPST_FPCR)
110
- goto do_unallocated;
73
+TRANS_FEAT(FCVT_hs, aa64_sve, gen_gvec_fpst_arg_zpz,
111
- } else {
74
+ gen_helper_sve_fcvt_hs, a, 0, FPST_FPCR)
112
- TCGv_i64 tcg_n, tcg_m, tcg_d;
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
-
113
-
138
-static bool trans_FCVT_ds(DisasContext *s, arg_rpr_esz *a)
114
- tcg_n = read_cpu_reg_sp(s, rn, true);
139
-{
115
- tcg_m = read_cpu_reg_sp(s, rm, true);
140
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_ds);
116
- tcg_gen_sextract_i64(tcg_n, tcg_n, 0, 56);
141
-}
117
- tcg_gen_sextract_i64(tcg_m, tcg_m, 0, 56);
118
- tcg_d = cpu_reg(s, rd);
142
-
119
-
143
-static bool trans_FCVT_sd(DisasContext *s, arg_rpr_esz *a)
120
- if (setflag) {
144
-{
121
- gen_sub_CC(true, tcg_d, tcg_n, tcg_m);
145
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvt_sd);
122
- } else {
146
-}
123
- tcg_gen_sub_i64(tcg_d, tcg_n, tcg_m);
124
- }
125
- }
126
- break;
127
- case 4: /* IRG */
128
- if (sf == 0 || !dc_isar_feature(aa64_mte_insn_reg, s)) {
129
- goto do_unallocated;
130
- }
131
- if (s->ata[0]) {
132
- gen_helper_irg(cpu_reg_sp(s, rd), tcg_env,
133
- cpu_reg_sp(s, rn), cpu_reg(s, rm));
134
- } else {
135
- gen_address_with_allocation_tag0(cpu_reg_sp(s, rd),
136
- cpu_reg_sp(s, rn));
137
- }
138
- break;
139
- case 5: /* GMI */
140
- if (sf == 0 || !dc_isar_feature(aa64_mte_insn_reg, s)) {
141
- goto do_unallocated;
142
- } else {
143
- TCGv_i64 t = tcg_temp_new_i64();
147
-
144
-
148
-static bool trans_FCVTZS_hh(DisasContext *s, arg_rpr_esz *a)
145
- tcg_gen_extract_i64(t, cpu_reg_sp(s, rn), 56, 4);
149
-{
146
- tcg_gen_shl_i64(t, tcg_constant_i64(1), t);
150
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzs_hh);
147
- tcg_gen_or_i64(cpu_reg(s, rd), cpu_reg(s, rm), t);
151
-}
148
- }
152
-
149
- break;
153
-static bool trans_FCVTZU_hh(DisasContext *s, arg_rpr_esz *a)
150
case 12: /* PACGA */
154
-{
151
if (sf == 0 || !dc_isar_feature(aa64_pauth, s)) {
155
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzu_hh);
152
goto do_unallocated;
156
-}
153
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn)
157
-
154
break;
158
-static bool trans_FCVTZS_hs(DisasContext *s, arg_rpr_esz *a)
155
default:
159
-{
156
do_unallocated:
160
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzs_hs);
157
+ case 0: /* SUBP(S) */
161
-}
158
case 2: /* UDIV */
162
-
159
case 3: /* SDIV */
163
-static bool trans_FCVTZU_hs(DisasContext *s, arg_rpr_esz *a)
160
+ case 4: /* IRG */
164
-{
161
+ case 5: /* GMI */
165
- return do_zpz_ptr(s, a->rd, a->rn, a->pg, true, gen_helper_sve_fcvtzu_hs);
162
case 8: /* LSLV */
166
-}
163
case 9: /* LSRV */
167
-
164
case 10: /* ASRV */
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
--
165
--
462
2.25.1
166
2.34.1
167
168
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
Remove disas_data_proc_2src, as this was the last insn
4
and move to be adjacent.
4
decoded by that function.
5
5
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@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: 20241211163036.2297116-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 | 31 ++++++++++++++++---------------
11
target/arm/tcg/a64.decode | 2 ++
12
1 file changed, 16 insertions(+), 15 deletions(-)
12
target/arm/tcg/translate-a64.c | 65 ++++++----------------------------
13
2 files changed, 13 insertions(+), 54 deletions(-)
13
14
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
--- a/target/arm/tcg/a64.decode
17
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/tcg/a64.decode
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
19
@@ -XXX,XX +XXX,XX @@ SUBPS 1 01 11010110 ..... 000000 ..... ..... @rrr
19
return true;
20
IRG 1 00 11010110 ..... 000100 ..... ..... @rrr
21
GMI 1 00 11010110 ..... 000101 ..... ..... @rrr
22
23
+PACGA 1 00 11010110 ..... 001100 ..... ..... @rrr
24
+
25
# Data Processing (1-source)
26
# Logical (shifted reg)
27
# Add/subtract (shifted reg)
28
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/tcg/translate-a64.c
31
+++ b/target/arm/tcg/translate-a64.c
32
@@ -XXX,XX +XXX,XX @@ static bool trans_GMI(DisasContext *s, arg_rrr *a)
33
return false;
20
}
34
}
21
35
22
+static bool gen_gvec_fn_arg_zzz(DisasContext *s, GVecGen3Fn *fn,
36
+static bool trans_PACGA(DisasContext *s, arg_rrr *a)
23
+ arg_rrr_esz *a)
24
+{
37
+{
25
+ return gen_gvec_fn_zzz(s, fn, a->esz, a->rd, a->rn, a->rm);
38
+ if (dc_isar_feature(aa64_pauth, s)) {
39
+ gen_helper_pacga(cpu_reg(s, a->rd), tcg_env,
40
+ cpu_reg(s, a->rn), cpu_reg_sp(s, a->rm));
41
+ return true;
42
+ }
43
+ return false;
26
+}
44
+}
27
+
45
+
28
/* Invoke a vector expander on four Zregs. */
46
/* Logical (shifted register)
29
static void gen_gvec_fn_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
47
* 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0
30
int esz, int rd, int rn, int rm, int ra)
48
* +----+-----+-----------+-------+---+------+--------+------+------+
31
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
49
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
32
*** SVE Logical - Unpredicated Group
50
}
33
*/
51
34
52
35
-static bool do_zzz_fn(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *gvec_fn)
53
-/* Data-processing (2 source)
54
- * 31 30 29 28 21 20 16 15 10 9 5 4 0
55
- * +----+---+---+-----------------+------+--------+------+------+
56
- * | sf | 0 | S | 1 1 0 1 0 1 1 0 | Rm | opcode | Rn | Rd |
57
- * +----+---+---+-----------------+------+--------+------+------+
58
- */
59
-static void disas_data_proc_2src(DisasContext *s, uint32_t insn)
36
-{
60
-{
37
- return gen_gvec_fn_zzz(s, gvec_fn, a->esz, a->rd, a->rn, a->rm);
61
- unsigned int sf, rm, opcode, rn, rd, setflag;
62
- sf = extract32(insn, 31, 1);
63
- setflag = extract32(insn, 29, 1);
64
- rm = extract32(insn, 16, 5);
65
- opcode = extract32(insn, 10, 6);
66
- rn = extract32(insn, 5, 5);
67
- rd = extract32(insn, 0, 5);
68
-
69
- if (setflag && opcode != 0) {
70
- unallocated_encoding(s);
71
- return;
72
- }
73
-
74
- switch (opcode) {
75
- case 12: /* PACGA */
76
- if (sf == 0 || !dc_isar_feature(aa64_pauth, s)) {
77
- goto do_unallocated;
78
- }
79
- gen_helper_pacga(cpu_reg(s, rd), tcg_env,
80
- cpu_reg(s, rn), cpu_reg_sp(s, rm));
81
- break;
82
- default:
83
- do_unallocated:
84
- case 0: /* SUBP(S) */
85
- case 2: /* UDIV */
86
- case 3: /* SDIV */
87
- case 4: /* IRG */
88
- case 5: /* GMI */
89
- case 8: /* LSLV */
90
- case 9: /* LSRV */
91
- case 10: /* ASRV */
92
- case 11: /* RORV */
93
- case 16:
94
- case 17:
95
- case 18:
96
- case 19:
97
- case 20:
98
- case 21:
99
- case 22:
100
- case 23: /* CRC32 */
101
- unallocated_encoding(s);
102
- break;
103
- }
38
-}
104
-}
39
-
105
-
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
}
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
103
/*
106
/*
107
* Data processing - register
108
* 31 30 29 28 25 21 20 16 10 0
109
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
110
if (op0) { /* (1 source) */
111
disas_data_proc_1src(s, insn);
112
} else { /* (2 source) */
113
- disas_data_proc_2src(s, insn);
114
+ goto do_unallocated;
115
}
116
break;
117
case 0x8 ... 0xf: /* (3 source) */
104
--
118
--
105
2.25.1
119
2.34.1
120
121
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-71-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-8-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 | 10 +---------
8
target/arm/tcg/a64.decode | 11 +++
9
1 file changed, 1 insertion(+), 9 deletions(-)
9
target/arm/tcg/translate-a64.c | 137 +++++++++++++++------------------
10
2 files changed, 72 insertions(+), 76 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool trans_SUBR_zzi(DisasContext *s, arg_rri_esz *a)
16
@@ -XXX,XX +XXX,XX @@
16
return true;
17
&r rn
18
&rrr rd rn rm
19
&ri rd imm
20
+&rr rd rn
21
+&rr_sf rd rn sf
22
&rri_sf rd rn imm sf
23
&rrr_sf rd rn rm sf
24
&i imm
25
@@ -XXX,XX +XXX,XX @@ GMI 1 00 11010110 ..... 000101 ..... ..... @rrr
26
PACGA 1 00 11010110 ..... 001100 ..... ..... @rrr
27
28
# Data Processing (1-source)
29
+
30
+@rr . .......... ..... ...... rn:5 rd:5 &rr
31
+@rr_sf sf:1 .......... ..... ...... rn:5 rd:5 &rr_sf
32
+
33
+RBIT . 10 11010110 00000 000000 ..... ..... @rr_sf
34
+REV16 . 10 11010110 00000 000001 ..... ..... @rr_sf
35
+REV32 . 10 11010110 00000 000010 ..... ..... @rr_sf
36
+REV64 1 10 11010110 00000 000011 ..... ..... @rr
37
+
38
# Logical (shifted reg)
39
# Add/subtract (shifted reg)
40
# Add/subtract (extended reg)
41
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
42
index XXXXXXX..XXXXXXX 100644
43
--- a/target/arm/tcg/translate-a64.c
44
+++ b/target/arm/tcg/translate-a64.c
45
@@ -XXX,XX +XXX,XX @@ static bool trans_PACGA(DisasContext *s, arg_rrr *a)
46
return false;
17
}
47
}
18
48
19
-static bool trans_MUL_zzi(DisasContext *s, arg_rri_esz *a)
49
+typedef void ArithOneOp(TCGv_i64, TCGv_i64);
20
-{
50
+
21
- if (sve_access_check(s)) {
51
+static bool gen_rr(DisasContext *s, int rd, int rn, ArithOneOp fn)
22
- unsigned vsz = vec_full_reg_size(s);
52
+{
23
- tcg_gen_gvec_muli(a->esz, vec_full_reg_offset(s, a->rd),
53
+ fn(cpu_reg(s, rd), cpu_reg(s, rn));
24
- vec_full_reg_offset(s, a->rn), a->imm, vsz, vsz);
54
+ return true;
55
+}
56
+
57
+static void gen_rbit32(TCGv_i64 tcg_rd, TCGv_i64 tcg_rn)
58
+{
59
+ TCGv_i32 t32 = tcg_temp_new_i32();
60
+
61
+ tcg_gen_extrl_i64_i32(t32, tcg_rn);
62
+ gen_helper_rbit(t32, t32);
63
+ tcg_gen_extu_i32_i64(tcg_rd, t32);
64
+}
65
+
66
+static void gen_rev16_xx(TCGv_i64 tcg_rd, TCGv_i64 tcg_rn, TCGv_i64 mask)
67
+{
68
+ TCGv_i64 tcg_tmp = tcg_temp_new_i64();
69
+
70
+ tcg_gen_shri_i64(tcg_tmp, tcg_rn, 8);
71
+ tcg_gen_and_i64(tcg_rd, tcg_rn, mask);
72
+ tcg_gen_and_i64(tcg_tmp, tcg_tmp, mask);
73
+ tcg_gen_shli_i64(tcg_rd, tcg_rd, 8);
74
+ tcg_gen_or_i64(tcg_rd, tcg_rd, tcg_tmp);
75
+}
76
+
77
+static void gen_rev16_32(TCGv_i64 tcg_rd, TCGv_i64 tcg_rn)
78
+{
79
+ gen_rev16_xx(tcg_rd, tcg_rn, tcg_constant_i64(0x00ff00ff));
80
+}
81
+
82
+static void gen_rev16_64(TCGv_i64 tcg_rd, TCGv_i64 tcg_rn)
83
+{
84
+ gen_rev16_xx(tcg_rd, tcg_rn, tcg_constant_i64(0x00ff00ff00ff00ffull));
85
+}
86
+
87
+static void gen_rev_32(TCGv_i64 tcg_rd, TCGv_i64 tcg_rn)
88
+{
89
+ tcg_gen_bswap32_i64(tcg_rd, tcg_rn, TCG_BSWAP_OZ);
90
+}
91
+
92
+static void gen_rev32(TCGv_i64 tcg_rd, TCGv_i64 tcg_rn)
93
+{
94
+ tcg_gen_bswap64_i64(tcg_rd, tcg_rn);
95
+ tcg_gen_rotri_i64(tcg_rd, tcg_rd, 32);
96
+}
97
+
98
+TRANS(RBIT, gen_rr, a->rd, a->rn, a->sf ? gen_helper_rbit64 : gen_rbit32)
99
+TRANS(REV16, gen_rr, a->rd, a->rn, a->sf ? gen_rev16_64 : gen_rev16_32)
100
+TRANS(REV32, gen_rr, a->rd, a->rn, a->sf ? gen_rev32 : gen_rev_32)
101
+TRANS(REV64, gen_rr, a->rd, a->rn, tcg_gen_bswap64_i64)
102
+
103
/* Logical (shifted register)
104
* 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0
105
* +----+-----+-----------+-------+---+------+--------+------+------+
106
@@ -XXX,XX +XXX,XX @@ static void handle_cls(DisasContext *s, unsigned int sf,
107
}
108
}
109
110
-static void handle_rbit(DisasContext *s, unsigned int sf,
111
- unsigned int rn, unsigned int rd)
112
-{
113
- TCGv_i64 tcg_rd, tcg_rn;
114
- tcg_rd = cpu_reg(s, rd);
115
- tcg_rn = cpu_reg(s, rn);
116
-
117
- if (sf) {
118
- gen_helper_rbit64(tcg_rd, tcg_rn);
119
- } else {
120
- TCGv_i32 tcg_tmp32 = tcg_temp_new_i32();
121
- tcg_gen_extrl_i64_i32(tcg_tmp32, tcg_rn);
122
- gen_helper_rbit(tcg_tmp32, tcg_tmp32);
123
- tcg_gen_extu_i32_i64(tcg_rd, tcg_tmp32);
25
- }
124
- }
26
- return true;
125
-}
27
-}
126
-
28
+TRANS_FEAT(MUL_zzi, aa64_sve, gen_gvec_fn_arg_zzi, tcg_gen_gvec_muli, a)
127
-/* REV with sf==1, opcode==3 ("REV64") */
29
128
-static void handle_rev64(DisasContext *s, unsigned int sf,
30
static bool do_zzi_sat(DisasContext *s, arg_rri_esz *a, bool u, bool d)
129
- unsigned int rn, unsigned int rd)
31
{
130
-{
131
- if (!sf) {
132
- unallocated_encoding(s);
133
- return;
134
- }
135
- tcg_gen_bswap64_i64(cpu_reg(s, rd), cpu_reg(s, rn));
136
-}
137
-
138
-/* REV with sf==0, opcode==2
139
- * REV32 (sf==1, opcode==2)
140
- */
141
-static void handle_rev32(DisasContext *s, unsigned int sf,
142
- unsigned int rn, unsigned int rd)
143
-{
144
- TCGv_i64 tcg_rd = cpu_reg(s, rd);
145
- TCGv_i64 tcg_rn = cpu_reg(s, rn);
146
-
147
- if (sf) {
148
- tcg_gen_bswap64_i64(tcg_rd, tcg_rn);
149
- tcg_gen_rotri_i64(tcg_rd, tcg_rd, 32);
150
- } else {
151
- tcg_gen_bswap32_i64(tcg_rd, tcg_rn, TCG_BSWAP_OZ);
152
- }
153
-}
154
-
155
-/* REV16 (opcode==1) */
156
-static void handle_rev16(DisasContext *s, unsigned int sf,
157
- unsigned int rn, unsigned int rd)
158
-{
159
- TCGv_i64 tcg_rd = cpu_reg(s, rd);
160
- TCGv_i64 tcg_tmp = tcg_temp_new_i64();
161
- TCGv_i64 tcg_rn = read_cpu_reg(s, rn, sf);
162
- TCGv_i64 mask = tcg_constant_i64(sf ? 0x00ff00ff00ff00ffull : 0x00ff00ff);
163
-
164
- tcg_gen_shri_i64(tcg_tmp, tcg_rn, 8);
165
- tcg_gen_and_i64(tcg_rd, tcg_rn, mask);
166
- tcg_gen_and_i64(tcg_tmp, tcg_tmp, mask);
167
- tcg_gen_shli_i64(tcg_rd, tcg_rd, 8);
168
- tcg_gen_or_i64(tcg_rd, tcg_rd, tcg_tmp);
169
-}
170
-
171
/* Data-processing (1 source)
172
* 31 30 29 28 21 20 16 15 10 9 5 4 0
173
* +----+---+---+-----------------+---------+--------+------+------+
174
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
175
#define MAP(SF, O2, O1) ((SF) | (O1 << 1) | (O2 << 7))
176
177
switch (MAP(sf, opcode2, opcode)) {
178
- case MAP(0, 0x00, 0x00): /* RBIT */
179
- case MAP(1, 0x00, 0x00):
180
- handle_rbit(s, sf, rn, rd);
181
- break;
182
- case MAP(0, 0x00, 0x01): /* REV16 */
183
- case MAP(1, 0x00, 0x01):
184
- handle_rev16(s, sf, rn, rd);
185
- break;
186
- case MAP(0, 0x00, 0x02): /* REV/REV32 */
187
- case MAP(1, 0x00, 0x02):
188
- handle_rev32(s, sf, rn, rd);
189
- break;
190
- case MAP(1, 0x00, 0x03): /* REV64 */
191
- handle_rev64(s, sf, rn, rd);
192
- break;
193
case MAP(0, 0x00, 0x04): /* CLZ */
194
case MAP(1, 0x00, 0x04):
195
handle_clz(s, sf, rn, rd);
196
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
197
break;
198
default:
199
do_unallocated:
200
+ case MAP(0, 0x00, 0x00): /* RBIT */
201
+ case MAP(1, 0x00, 0x00):
202
+ case MAP(0, 0x00, 0x01): /* REV16 */
203
+ case MAP(1, 0x00, 0x01):
204
+ case MAP(0, 0x00, 0x02): /* REV/REV32 */
205
+ case MAP(1, 0x00, 0x02):
206
+ case MAP(1, 0x00, 0x03): /* REV64 */
207
unallocated_encoding(s);
208
break;
209
}
32
--
210
--
33
2.25.1
211
2.34.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: Philippe Mathieu-Daudé <philmd@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-70-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-9-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 | 45 ++++++++++++--------------------------
8
target/arm/tcg/a64.decode | 3 ++
9
1 file changed, 14 insertions(+), 31 deletions(-)
9
target/arm/tcg/translate-a64.c | 72 ++++++++++++++--------------------
10
2 files changed, 33 insertions(+), 42 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_brk2(DisasContext *s, arg_rpr_s *a,
16
@@ -XXX,XX +XXX,XX @@ REV16 . 10 11010110 00000 000001 ..... ..... @rr_sf
16
return true;
17
REV32 . 10 11010110 00000 000010 ..... ..... @rr_sf
18
REV64 1 10 11010110 00000 000011 ..... ..... @rr
19
20
+CLZ . 10 11010110 00000 000100 ..... ..... @rr_sf
21
+CLS . 10 11010110 00000 000101 ..... ..... @rr_sf
22
+
23
# Logical (shifted reg)
24
# Add/subtract (shifted reg)
25
# Add/subtract (extended reg)
26
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/target/arm/tcg/translate-a64.c
29
+++ b/target/arm/tcg/translate-a64.c
30
@@ -XXX,XX +XXX,XX @@ TRANS(REV16, gen_rr, a->rd, a->rn, a->sf ? gen_rev16_64 : gen_rev16_32)
31
TRANS(REV32, gen_rr, a->rd, a->rn, a->sf ? gen_rev32 : gen_rev_32)
32
TRANS(REV64, gen_rr, a->rd, a->rn, tcg_gen_bswap64_i64)
33
34
+static void gen_clz32(TCGv_i64 tcg_rd, TCGv_i64 tcg_rn)
35
+{
36
+ TCGv_i32 t32 = tcg_temp_new_i32();
37
+
38
+ tcg_gen_extrl_i64_i32(t32, tcg_rn);
39
+ tcg_gen_clzi_i32(t32, t32, 32);
40
+ tcg_gen_extu_i32_i64(tcg_rd, t32);
41
+}
42
+
43
+static void gen_clz64(TCGv_i64 tcg_rd, TCGv_i64 tcg_rn)
44
+{
45
+ tcg_gen_clzi_i64(tcg_rd, tcg_rn, 64);
46
+}
47
+
48
+static void gen_cls32(TCGv_i64 tcg_rd, TCGv_i64 tcg_rn)
49
+{
50
+ TCGv_i32 t32 = tcg_temp_new_i32();
51
+
52
+ tcg_gen_extrl_i64_i32(t32, tcg_rn);
53
+ tcg_gen_clrsb_i32(t32, t32);
54
+ tcg_gen_extu_i32_i64(tcg_rd, t32);
55
+}
56
+
57
+TRANS(CLZ, gen_rr, a->rd, a->rn, a->sf ? gen_clz64 : gen_clz32)
58
+TRANS(CLS, gen_rr, a->rd, a->rn, a->sf ? tcg_gen_clrsb_i64 : gen_cls32)
59
+
60
/* Logical (shifted register)
61
* 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0
62
* +----+-----+-----------+-------+---+------+--------+------+------+
63
@@ -XXX,XX +XXX,XX @@ static void disas_cond_select(DisasContext *s, uint32_t insn)
64
}
17
}
65
}
18
66
19
-static bool trans_BRKPA(DisasContext *s, arg_rprr_s *a)
67
-static void handle_clz(DisasContext *s, unsigned int sf,
68
- unsigned int rn, unsigned int rd)
20
-{
69
-{
21
- return do_brk3(s, a, gen_helper_sve_brkpa, gen_helper_sve_brkpas);
70
- TCGv_i64 tcg_rd, tcg_rn;
22
-}
71
- tcg_rd = cpu_reg(s, rd);
23
+TRANS_FEAT(BRKPA, aa64_sve, do_brk3, a,
72
- tcg_rn = cpu_reg(s, rn);
24
+ gen_helper_sve_brkpa, gen_helper_sve_brkpas)
73
-
25
+TRANS_FEAT(BRKPB, aa64_sve, do_brk3, a,
74
- if (sf) {
26
+ gen_helper_sve_brkpb, gen_helper_sve_brkpbs)
75
- tcg_gen_clzi_i64(tcg_rd, tcg_rn, 64);
27
76
- } else {
28
-static bool trans_BRKPB(DisasContext *s, arg_rprr_s *a)
77
- TCGv_i32 tcg_tmp32 = tcg_temp_new_i32();
29
-{
78
- tcg_gen_extrl_i64_i32(tcg_tmp32, tcg_rn);
30
- return do_brk3(s, a, gen_helper_sve_brkpb, gen_helper_sve_brkpbs);
79
- tcg_gen_clzi_i32(tcg_tmp32, tcg_tmp32, 32);
31
-}
80
- tcg_gen_extu_i32_i64(tcg_rd, tcg_tmp32);
32
+TRANS_FEAT(BRKA_m, aa64_sve, do_brk2, a,
81
- }
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
-}
82
-}
50
-
83
-
51
-static bool trans_BRKA_z(DisasContext *s, arg_rpr_s *a)
84
-static void handle_cls(DisasContext *s, unsigned int sf,
85
- unsigned int rn, unsigned int rd)
52
-{
86
-{
53
- return do_brk2(s, a, gen_helper_sve_brka_z, gen_helper_sve_brkas_z);
87
- TCGv_i64 tcg_rd, tcg_rn;
88
- tcg_rd = cpu_reg(s, rd);
89
- tcg_rn = cpu_reg(s, rn);
90
-
91
- if (sf) {
92
- tcg_gen_clrsb_i64(tcg_rd, tcg_rn);
93
- } else {
94
- TCGv_i32 tcg_tmp32 = tcg_temp_new_i32();
95
- tcg_gen_extrl_i64_i32(tcg_tmp32, tcg_rn);
96
- tcg_gen_clrsb_i32(tcg_tmp32, tcg_tmp32);
97
- tcg_gen_extu_i32_i64(tcg_rd, tcg_tmp32);
98
- }
54
-}
99
-}
55
-
100
-
56
-static bool trans_BRKB_z(DisasContext *s, arg_rpr_s *a)
101
/* Data-processing (1 source)
57
-{
102
* 31 30 29 28 21 20 16 15 10 9 5 4 0
58
- return do_brk2(s, a, gen_helper_sve_brkb_z, gen_helper_sve_brkbs_z);
103
* +----+---+---+-----------------+---------+--------+------+------+
59
-}
104
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
60
-
105
#define MAP(SF, O2, O1) ((SF) | (O1 << 1) | (O2 << 7))
61
-static bool trans_BRKN(DisasContext *s, arg_rpr_s *a)
106
62
-{
107
switch (MAP(sf, opcode2, opcode)) {
63
- return do_brk2(s, a, gen_helper_sve_brkn, gen_helper_sve_brkns);
108
- case MAP(0, 0x00, 0x04): /* CLZ */
64
-}
109
- case MAP(1, 0x00, 0x04):
65
+TRANS_FEAT(BRKN, aa64_sve, do_brk2, a,
110
- handle_clz(s, sf, rn, rd);
66
+ gen_helper_sve_brkn, gen_helper_sve_brkns)
111
- break;
67
112
- case MAP(0, 0x00, 0x05): /* CLS */
68
/*
113
- case MAP(1, 0x00, 0x05):
69
*** SVE Predicate Count Group
114
- handle_cls(s, sf, rn, rd);
115
- break;
116
case MAP(1, 0x01, 0x00): /* PACIA */
117
if (s->pauth_active) {
118
tcg_rd = cpu_reg(s, rd);
119
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
120
case MAP(0, 0x00, 0x02): /* REV/REV32 */
121
case MAP(1, 0x00, 0x02):
122
case MAP(1, 0x00, 0x03): /* REV64 */
123
+ case MAP(0, 0x00, 0x04): /* CLZ */
124
+ case MAP(1, 0x00, 0x04):
125
+ case MAP(0, 0x00, 0x05): /* CLS */
126
+ case MAP(1, 0x00, 0x05):
127
unallocated_encoding(s);
128
break;
129
}
70
--
130
--
71
2.25.1
131
2.34.1
132
133
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 includes PACIA, PACIZA, PACIB, PACIZB, PACDA, PACDZA, PACDB,
4
PACDZB, AUTIA, AUTIZA, AUTIB, AUTIZB, AUTDA, AUTDZA, AUTDB, AUTDZB.
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-89-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-10-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 | 29 +++++++----------------------
11
target/arm/tcg/a64.decode | 13 +++
9
1 file changed, 7 insertions(+), 22 deletions(-)
12
target/arm/tcg/translate-a64.c | 173 +++++++++------------------------
13
2 files changed, 58 insertions(+), 128 deletions(-)
10
14
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
17
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ DO_PPZ(FCMNE_ppz0, fcmne0)
19
@@ -XXX,XX +XXX,XX @@ REV64 1 10 11010110 00000 000011 ..... ..... @rr
16
*** SVE floating-point trig multiply-add coefficient
20
CLZ . 10 11010110 00000 000100 ..... ..... @rr_sf
17
*/
21
CLS . 10 11010110 00000 000101 ..... ..... @rr_sf
18
22
19
-static bool trans_FTMAD(DisasContext *s, arg_FTMAD *a)
23
+&pacaut rd rn z
20
-{
24
+@pacaut . .. ........ ..... .. z:1 ... rn:5 rd:5 &pacaut
21
- static gen_helper_gvec_3_ptr * const fns[3] = {
25
+
22
- gen_helper_sve_ftmad_h,
26
+PACIA 1 10 11010110 00001 00.000 ..... ..... @pacaut
23
- gen_helper_sve_ftmad_s,
27
+PACIB 1 10 11010110 00001 00.001 ..... ..... @pacaut
24
- gen_helper_sve_ftmad_d,
28
+PACDA 1 10 11010110 00001 00.010 ..... ..... @pacaut
25
- };
29
+PACDB 1 10 11010110 00001 00.011 ..... ..... @pacaut
26
-
30
+
27
- if (a->esz == 0) {
31
+AUTIA 1 10 11010110 00001 00.100 ..... ..... @pacaut
28
- return false;
32
+AUTIB 1 10 11010110 00001 00.101 ..... ..... @pacaut
29
- }
33
+AUTDA 1 10 11010110 00001 00.110 ..... ..... @pacaut
30
- if (sve_access_check(s)) {
34
+AUTDB 1 10 11010110 00001 00.111 ..... ..... @pacaut
31
- unsigned vsz = vec_full_reg_size(s);
35
+
32
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
36
# Logical (shifted reg)
33
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
37
# Add/subtract (shifted reg)
34
- vec_full_reg_offset(s, a->rn),
38
# Add/subtract (extended reg)
35
- vec_full_reg_offset(s, a->rm),
39
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
36
- status, vsz, vsz, a->imm, fns[a->esz - 1]);
40
index XXXXXXX..XXXXXXX 100644
37
- tcg_temp_free_ptr(status);
41
--- a/target/arm/tcg/translate-a64.c
38
- }
42
+++ b/target/arm/tcg/translate-a64.c
39
- return true;
43
@@ -XXX,XX +XXX,XX @@ static void gen_cls32(TCGv_i64 tcg_rd, TCGv_i64 tcg_rn)
40
-}
44
TRANS(CLZ, gen_rr, a->rd, a->rn, a->sf ? gen_clz64 : gen_clz32)
41
+static gen_helper_gvec_3_ptr * const ftmad_fns[4] = {
45
TRANS(CLS, gen_rr, a->rd, a->rn, a->sf ? tcg_gen_clrsb_i64 : gen_cls32)
42
+ NULL, gen_helper_sve_ftmad_h,
46
43
+ gen_helper_sve_ftmad_s, gen_helper_sve_ftmad_d,
47
+static bool gen_pacaut(DisasContext *s, arg_pacaut *a, NeonGenTwo64OpEnvFn fn)
44
+};
48
+{
45
+TRANS_FEAT(FTMAD, aa64_sve, gen_gvec_fpst_zzz,
49
+ TCGv_i64 tcg_rd, tcg_rn;
46
+ ftmad_fns[a->esz], a->rd, a->rn, a->rm, a->imm,
50
+
47
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
51
+ if (a->z) {
48
52
+ if (a->rn != 31) {
49
/*
53
+ return false;
50
*** SVE Floating Point Accumulating Reduction Group
54
+ }
55
+ tcg_rn = tcg_constant_i64(0);
56
+ } else {
57
+ tcg_rn = cpu_reg_sp(s, a->rn);
58
+ }
59
+ if (s->pauth_active) {
60
+ tcg_rd = cpu_reg(s, a->rd);
61
+ fn(tcg_rd, tcg_env, tcg_rd, tcg_rn);
62
+ }
63
+ return true;
64
+}
65
+
66
+TRANS_FEAT(PACIA, aa64_pauth, gen_pacaut, a, gen_helper_pacia)
67
+TRANS_FEAT(PACIB, aa64_pauth, gen_pacaut, a, gen_helper_pacib)
68
+TRANS_FEAT(PACDA, aa64_pauth, gen_pacaut, a, gen_helper_pacda)
69
+TRANS_FEAT(PACDB, aa64_pauth, gen_pacaut, a, gen_helper_pacdb)
70
+
71
+TRANS_FEAT(AUTIA, aa64_pauth, gen_pacaut, a, gen_helper_autia)
72
+TRANS_FEAT(AUTIB, aa64_pauth, gen_pacaut, a, gen_helper_autib)
73
+TRANS_FEAT(AUTDA, aa64_pauth, gen_pacaut, a, gen_helper_autda)
74
+TRANS_FEAT(AUTDB, aa64_pauth, gen_pacaut, a, gen_helper_autdb)
75
+
76
/* Logical (shifted register)
77
* 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0
78
* +----+-----+-----------+-------+---+------+--------+------+------+
79
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
80
#define MAP(SF, O2, O1) ((SF) | (O1 << 1) | (O2 << 7))
81
82
switch (MAP(sf, opcode2, opcode)) {
83
- case MAP(1, 0x01, 0x00): /* PACIA */
84
- if (s->pauth_active) {
85
- tcg_rd = cpu_reg(s, rd);
86
- gen_helper_pacia(tcg_rd, tcg_env, tcg_rd, cpu_reg_sp(s, rn));
87
- } else if (!dc_isar_feature(aa64_pauth, s)) {
88
- goto do_unallocated;
89
- }
90
- break;
91
- case MAP(1, 0x01, 0x01): /* PACIB */
92
- if (s->pauth_active) {
93
- tcg_rd = cpu_reg(s, rd);
94
- gen_helper_pacib(tcg_rd, tcg_env, tcg_rd, cpu_reg_sp(s, rn));
95
- } else if (!dc_isar_feature(aa64_pauth, s)) {
96
- goto do_unallocated;
97
- }
98
- break;
99
- case MAP(1, 0x01, 0x02): /* PACDA */
100
- if (s->pauth_active) {
101
- tcg_rd = cpu_reg(s, rd);
102
- gen_helper_pacda(tcg_rd, tcg_env, tcg_rd, cpu_reg_sp(s, rn));
103
- } else if (!dc_isar_feature(aa64_pauth, s)) {
104
- goto do_unallocated;
105
- }
106
- break;
107
- case MAP(1, 0x01, 0x03): /* PACDB */
108
- if (s->pauth_active) {
109
- tcg_rd = cpu_reg(s, rd);
110
- gen_helper_pacdb(tcg_rd, tcg_env, tcg_rd, cpu_reg_sp(s, rn));
111
- } else if (!dc_isar_feature(aa64_pauth, s)) {
112
- goto do_unallocated;
113
- }
114
- break;
115
- case MAP(1, 0x01, 0x04): /* AUTIA */
116
- if (s->pauth_active) {
117
- tcg_rd = cpu_reg(s, rd);
118
- gen_helper_autia(tcg_rd, tcg_env, tcg_rd, cpu_reg_sp(s, rn));
119
- } else if (!dc_isar_feature(aa64_pauth, s)) {
120
- goto do_unallocated;
121
- }
122
- break;
123
- case MAP(1, 0x01, 0x05): /* AUTIB */
124
- if (s->pauth_active) {
125
- tcg_rd = cpu_reg(s, rd);
126
- gen_helper_autib(tcg_rd, tcg_env, tcg_rd, cpu_reg_sp(s, rn));
127
- } else if (!dc_isar_feature(aa64_pauth, s)) {
128
- goto do_unallocated;
129
- }
130
- break;
131
- case MAP(1, 0x01, 0x06): /* AUTDA */
132
- if (s->pauth_active) {
133
- tcg_rd = cpu_reg(s, rd);
134
- gen_helper_autda(tcg_rd, tcg_env, tcg_rd, cpu_reg_sp(s, rn));
135
- } else if (!dc_isar_feature(aa64_pauth, s)) {
136
- goto do_unallocated;
137
- }
138
- break;
139
- case MAP(1, 0x01, 0x07): /* AUTDB */
140
- if (s->pauth_active) {
141
- tcg_rd = cpu_reg(s, rd);
142
- gen_helper_autdb(tcg_rd, tcg_env, tcg_rd, cpu_reg_sp(s, rn));
143
- } else if (!dc_isar_feature(aa64_pauth, s)) {
144
- goto do_unallocated;
145
- }
146
- break;
147
- case MAP(1, 0x01, 0x08): /* PACIZA */
148
- if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
149
- goto do_unallocated;
150
- } else if (s->pauth_active) {
151
- tcg_rd = cpu_reg(s, rd);
152
- gen_helper_pacia(tcg_rd, tcg_env, tcg_rd, tcg_constant_i64(0));
153
- }
154
- break;
155
- case MAP(1, 0x01, 0x09): /* PACIZB */
156
- if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
157
- goto do_unallocated;
158
- } else if (s->pauth_active) {
159
- tcg_rd = cpu_reg(s, rd);
160
- gen_helper_pacib(tcg_rd, tcg_env, tcg_rd, tcg_constant_i64(0));
161
- }
162
- break;
163
- case MAP(1, 0x01, 0x0a): /* PACDZA */
164
- if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
165
- goto do_unallocated;
166
- } else if (s->pauth_active) {
167
- tcg_rd = cpu_reg(s, rd);
168
- gen_helper_pacda(tcg_rd, tcg_env, tcg_rd, tcg_constant_i64(0));
169
- }
170
- break;
171
- case MAP(1, 0x01, 0x0b): /* PACDZB */
172
- if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
173
- goto do_unallocated;
174
- } else if (s->pauth_active) {
175
- tcg_rd = cpu_reg(s, rd);
176
- gen_helper_pacdb(tcg_rd, tcg_env, tcg_rd, tcg_constant_i64(0));
177
- }
178
- break;
179
- case MAP(1, 0x01, 0x0c): /* AUTIZA */
180
- if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
181
- goto do_unallocated;
182
- } else if (s->pauth_active) {
183
- tcg_rd = cpu_reg(s, rd);
184
- gen_helper_autia(tcg_rd, tcg_env, tcg_rd, tcg_constant_i64(0));
185
- }
186
- break;
187
- case MAP(1, 0x01, 0x0d): /* AUTIZB */
188
- if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
189
- goto do_unallocated;
190
- } else if (s->pauth_active) {
191
- tcg_rd = cpu_reg(s, rd);
192
- gen_helper_autib(tcg_rd, tcg_env, tcg_rd, tcg_constant_i64(0));
193
- }
194
- break;
195
- case MAP(1, 0x01, 0x0e): /* AUTDZA */
196
- if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
197
- goto do_unallocated;
198
- } else if (s->pauth_active) {
199
- tcg_rd = cpu_reg(s, rd);
200
- gen_helper_autda(tcg_rd, tcg_env, tcg_rd, tcg_constant_i64(0));
201
- }
202
- break;
203
- case MAP(1, 0x01, 0x0f): /* AUTDZB */
204
- if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
205
- goto do_unallocated;
206
- } else if (s->pauth_active) {
207
- tcg_rd = cpu_reg(s, rd);
208
- gen_helper_autdb(tcg_rd, tcg_env, tcg_rd, tcg_constant_i64(0));
209
- }
210
- break;
211
case MAP(1, 0x01, 0x10): /* XPACI */
212
if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
213
goto do_unallocated;
214
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
215
case MAP(1, 0x00, 0x04):
216
case MAP(0, 0x00, 0x05): /* CLS */
217
case MAP(1, 0x00, 0x05):
218
+ case MAP(1, 0x01, 0x00): /* PACIA */
219
+ case MAP(1, 0x01, 0x01): /* PACIB */
220
+ case MAP(1, 0x01, 0x02): /* PACDA */
221
+ case MAP(1, 0x01, 0x03): /* PACDB */
222
+ case MAP(1, 0x01, 0x04): /* AUTIA */
223
+ case MAP(1, 0x01, 0x05): /* AUTIB */
224
+ case MAP(1, 0x01, 0x06): /* AUTDA */
225
+ case MAP(1, 0x01, 0x07): /* AUTDB */
226
+ case MAP(1, 0x01, 0x08): /* PACIZA */
227
+ case MAP(1, 0x01, 0x09): /* PACIZB */
228
+ case MAP(1, 0x01, 0x0a): /* PACDZA */
229
+ case MAP(1, 0x01, 0x0b): /* PACDZB */
230
+ case MAP(1, 0x01, 0x0c): /* AUTIZA */
231
+ case MAP(1, 0x01, 0x0d): /* AUTIZB */
232
+ case MAP(1, 0x01, 0x0e): /* AUTDZA */
233
+ case MAP(1, 0x01, 0x0f): /* AUTDZB */
234
unallocated_encoding(s);
235
break;
236
}
51
--
237
--
52
2.25.1
238
2.34.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 disas_data_proc_1src, as these were the last insns
4
decoded by that function.
5
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@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-65-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-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 | 11 ++---------
11
target/arm/tcg/a64.decode | 3 ++
9
1 file changed, 2 insertions(+), 9 deletions(-)
12
target/arm/tcg/translate-a64.c | 99 +++++-----------------------------
13
2 files changed, 16 insertions(+), 86 deletions(-)
10
14
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
17
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_last_general(DisasContext *s, arg_rpr_esz *a, bool before)
19
@@ -XXX,XX +XXX,XX @@ AUTIB 1 10 11010110 00001 00.101 ..... ..... @pacaut
16
return true;
20
AUTDA 1 10 11010110 00001 00.110 ..... ..... @pacaut
21
AUTDB 1 10 11010110 00001 00.111 ..... ..... @pacaut
22
23
+XPACI 1 10 11010110 00001 010000 11111 rd:5
24
+XPACD 1 10 11010110 00001 010001 11111 rd:5
25
+
26
# Logical (shifted reg)
27
# Add/subtract (shifted reg)
28
# Add/subtract (extended reg)
29
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/tcg/translate-a64.c
32
+++ b/target/arm/tcg/translate-a64.c
33
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(AUTIB, aa64_pauth, gen_pacaut, a, gen_helper_autib)
34
TRANS_FEAT(AUTDA, aa64_pauth, gen_pacaut, a, gen_helper_autda)
35
TRANS_FEAT(AUTDB, aa64_pauth, gen_pacaut, a, gen_helper_autdb)
36
37
+static bool do_xpac(DisasContext *s, int rd, NeonGenOne64OpEnvFn *fn)
38
+{
39
+ if (s->pauth_active) {
40
+ TCGv_i64 tcg_rd = cpu_reg(s, rd);
41
+ fn(tcg_rd, tcg_env, tcg_rd);
42
+ }
43
+ return true;
44
+}
45
+
46
+TRANS_FEAT(XPACI, aa64_pauth, do_xpac, a->rd, gen_helper_xpaci)
47
+TRANS_FEAT(XPACD, aa64_pauth, do_xpac, a->rd, gen_helper_xpacd)
48
+
49
/* Logical (shifted register)
50
* 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0
51
* +----+-----+-----------+-------+---+------+--------+------+------+
52
@@ -XXX,XX +XXX,XX @@ static void disas_cond_select(DisasContext *s, uint32_t insn)
53
}
17
}
54
}
18
55
19
-static bool trans_LASTA_r(DisasContext *s, arg_rpr_esz *a)
56
-/* Data-processing (1 source)
57
- * 31 30 29 28 21 20 16 15 10 9 5 4 0
58
- * +----+---+---+-----------------+---------+--------+------+------+
59
- * | sf | 1 | S | 1 1 0 1 0 1 1 0 | opcode2 | opcode | Rn | Rd |
60
- * +----+---+---+-----------------+---------+--------+------+------+
61
- */
62
-static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
20
-{
63
-{
21
- return do_last_general(s, a, false);
64
- unsigned int sf, opcode, opcode2, rn, rd;
65
- TCGv_i64 tcg_rd;
66
-
67
- if (extract32(insn, 29, 1)) {
68
- unallocated_encoding(s);
69
- return;
70
- }
71
-
72
- sf = extract32(insn, 31, 1);
73
- opcode = extract32(insn, 10, 6);
74
- opcode2 = extract32(insn, 16, 5);
75
- rn = extract32(insn, 5, 5);
76
- rd = extract32(insn, 0, 5);
77
-
78
-#define MAP(SF, O2, O1) ((SF) | (O1 << 1) | (O2 << 7))
79
-
80
- switch (MAP(sf, opcode2, opcode)) {
81
- case MAP(1, 0x01, 0x10): /* XPACI */
82
- if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
83
- goto do_unallocated;
84
- } else if (s->pauth_active) {
85
- tcg_rd = cpu_reg(s, rd);
86
- gen_helper_xpaci(tcg_rd, tcg_env, tcg_rd);
87
- }
88
- break;
89
- case MAP(1, 0x01, 0x11): /* XPACD */
90
- if (!dc_isar_feature(aa64_pauth, s) || rn != 31) {
91
- goto do_unallocated;
92
- } else if (s->pauth_active) {
93
- tcg_rd = cpu_reg(s, rd);
94
- gen_helper_xpacd(tcg_rd, tcg_env, tcg_rd);
95
- }
96
- break;
97
- default:
98
- do_unallocated:
99
- case MAP(0, 0x00, 0x00): /* RBIT */
100
- case MAP(1, 0x00, 0x00):
101
- case MAP(0, 0x00, 0x01): /* REV16 */
102
- case MAP(1, 0x00, 0x01):
103
- case MAP(0, 0x00, 0x02): /* REV/REV32 */
104
- case MAP(1, 0x00, 0x02):
105
- case MAP(1, 0x00, 0x03): /* REV64 */
106
- case MAP(0, 0x00, 0x04): /* CLZ */
107
- case MAP(1, 0x00, 0x04):
108
- case MAP(0, 0x00, 0x05): /* CLS */
109
- case MAP(1, 0x00, 0x05):
110
- case MAP(1, 0x01, 0x00): /* PACIA */
111
- case MAP(1, 0x01, 0x01): /* PACIB */
112
- case MAP(1, 0x01, 0x02): /* PACDA */
113
- case MAP(1, 0x01, 0x03): /* PACDB */
114
- case MAP(1, 0x01, 0x04): /* AUTIA */
115
- case MAP(1, 0x01, 0x05): /* AUTIB */
116
- case MAP(1, 0x01, 0x06): /* AUTDA */
117
- case MAP(1, 0x01, 0x07): /* AUTDB */
118
- case MAP(1, 0x01, 0x08): /* PACIZA */
119
- case MAP(1, 0x01, 0x09): /* PACIZB */
120
- case MAP(1, 0x01, 0x0a): /* PACDZA */
121
- case MAP(1, 0x01, 0x0b): /* PACDZB */
122
- case MAP(1, 0x01, 0x0c): /* AUTIZA */
123
- case MAP(1, 0x01, 0x0d): /* AUTIZB */
124
- case MAP(1, 0x01, 0x0e): /* AUTDZA */
125
- case MAP(1, 0x01, 0x0f): /* AUTDZB */
126
- unallocated_encoding(s);
127
- break;
128
- }
129
-
130
-#undef MAP
22
-}
131
-}
23
-
132
-
24
-static bool trans_LASTB_r(DisasContext *s, arg_rpr_esz *a)
133
-
25
-{
134
/*
26
- return do_last_general(s, a, true);
135
* Data processing - register
27
-}
136
* 31 30 29 28 25 21 20 16 10 0
28
+TRANS_FEAT(LASTA_r, aa64_sve, do_last_general, a, false)
137
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn)
29
+TRANS_FEAT(LASTB_r, aa64_sve, do_last_general, a, true)
138
*/
30
139
static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
31
static bool trans_CPY_m_r(DisasContext *s, arg_rpr_esz *a)
32
{
140
{
141
- int op0 = extract32(insn, 30, 1);
142
int op1 = extract32(insn, 28, 1);
143
int op2 = extract32(insn, 21, 4);
144
int op3 = extract32(insn, 10, 6);
145
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
146
disas_cond_select(s, insn);
147
break;
148
149
- case 0x6: /* Data-processing */
150
- if (op0) { /* (1 source) */
151
- disas_data_proc_1src(s, insn);
152
- } else { /* (2 source) */
153
- goto do_unallocated;
154
- }
155
- break;
156
case 0x8 ... 0xf: /* (3 source) */
157
disas_data_proc_3src(s, insn);
158
break;
159
160
default:
161
do_unallocated:
162
+ case 0x6: /* Data-processing */
163
unallocated_encoding(s);
164
break;
165
}
33
--
166
--
34
2.25.1
167
2.34.1
168
169
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 includes AND, BIC, ORR, ORN, EOR, EON, ANDS, BICS (shifted reg).
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-91-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-12-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 | 14 ++++++--------
10
target/arm/tcg/a64.decode | 9 +++
9
1 file changed, 6 insertions(+), 8 deletions(-)
11
target/arm/tcg/translate-a64.c | 117 ++++++++++++---------------------
12
2 files changed, 51 insertions(+), 75 deletions(-)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_reduce(DisasContext *s, arg_rpr_esz *a,
18
@@ -XXX,XX +XXX,XX @@ XPACI 1 10 11010110 00001 010000 11111 rd:5
19
XPACD 1 10 11010110 00001 010001 11111 rd:5
20
21
# Logical (shifted reg)
22
+
23
+&logic_shift rd rn rm sf sa st n
24
+@logic_shift sf:1 .. ..... st:2 n:1 rm:5 sa:6 rn:5 rd:5 &logic_shift
25
+
26
+AND_r . 00 01010 .. . ..... ...... ..... ..... @logic_shift
27
+ORR_r . 01 01010 .. . ..... ...... ..... ..... @logic_shift
28
+EOR_r . 10 01010 .. . ..... ...... ..... ..... @logic_shift
29
+ANDS_r . 11 01010 .. . ..... ...... ..... ..... @logic_shift
30
+
31
# Add/subtract (shifted reg)
32
# Add/subtract (extended reg)
33
# Add/subtract (carry)
34
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/tcg/translate-a64.c
37
+++ b/target/arm/tcg/translate-a64.c
38
@@ -XXX,XX +XXX,XX @@ static bool do_xpac(DisasContext *s, int rd, NeonGenOne64OpEnvFn *fn)
39
TRANS_FEAT(XPACI, aa64_pauth, do_xpac, a->rd, gen_helper_xpaci)
40
TRANS_FEAT(XPACD, aa64_pauth, do_xpac, a->rd, gen_helper_xpacd)
41
42
-/* Logical (shifted register)
43
- * 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0
44
- * +----+-----+-----------+-------+---+------+--------+------+------+
45
- * | sf | opc | 0 1 0 1 0 | shift | N | Rm | imm6 | Rn | Rd |
46
- * +----+-----+-----------+-------+---+------+--------+------+------+
47
- */
48
-static void disas_logic_reg(DisasContext *s, uint32_t insn)
49
+static bool do_logic_reg(DisasContext *s, arg_logic_shift *a,
50
+ ArithTwoOp *fn, ArithTwoOp *inv_fn, bool setflags)
51
{
52
TCGv_i64 tcg_rd, tcg_rn, tcg_rm;
53
- unsigned int sf, opc, shift_type, invert, rm, shift_amount, rn, rd;
54
55
- sf = extract32(insn, 31, 1);
56
- opc = extract32(insn, 29, 2);
57
- shift_type = extract32(insn, 22, 2);
58
- invert = extract32(insn, 21, 1);
59
- rm = extract32(insn, 16, 5);
60
- shift_amount = extract32(insn, 10, 6);
61
- rn = extract32(insn, 5, 5);
62
- rd = extract32(insn, 0, 5);
63
-
64
- if (!sf && (shift_amount & (1 << 5))) {
65
- unallocated_encoding(s);
66
- return;
67
+ if (!a->sf && (a->sa & (1 << 5))) {
68
+ return false;
69
}
70
71
- tcg_rd = cpu_reg(s, rd);
72
+ tcg_rd = cpu_reg(s, a->rd);
73
+ tcg_rn = cpu_reg(s, a->rn);
74
75
- if (opc == 1 && shift_amount == 0 && shift_type == 0 && rn == 31) {
76
- /* Unshifted ORR and ORN with WZR/XZR is the standard encoding for
77
- * register-register MOV and MVN, so it is worth special casing.
78
- */
79
- tcg_rm = cpu_reg(s, rm);
80
- if (invert) {
81
+ tcg_rm = read_cpu_reg(s, a->rm, a->sf);
82
+ if (a->sa) {
83
+ shift_reg_imm(tcg_rm, tcg_rm, a->sf, a->st, a->sa);
84
+ }
85
+
86
+ (a->n ? inv_fn : fn)(tcg_rd, tcg_rn, tcg_rm);
87
+ if (!a->sf) {
88
+ tcg_gen_ext32u_i64(tcg_rd, tcg_rd);
89
+ }
90
+ if (setflags) {
91
+ gen_logic_CC(a->sf, tcg_rd);
92
+ }
93
+ return true;
94
+}
95
+
96
+static bool trans_ORR_r(DisasContext *s, arg_logic_shift *a)
97
+{
98
+ /*
99
+ * Unshifted ORR and ORN with WZR/XZR is the standard encoding for
100
+ * register-register MOV and MVN, so it is worth special casing.
101
+ */
102
+ if (a->sa == 0 && a->st == 0 && a->rn == 31) {
103
+ TCGv_i64 tcg_rd = cpu_reg(s, a->rd);
104
+ TCGv_i64 tcg_rm = cpu_reg(s, a->rm);
105
+
106
+ if (a->n) {
107
tcg_gen_not_i64(tcg_rd, tcg_rm);
108
- if (!sf) {
109
+ if (!a->sf) {
110
tcg_gen_ext32u_i64(tcg_rd, tcg_rd);
111
}
112
} else {
113
- if (sf) {
114
+ if (a->sf) {
115
tcg_gen_mov_i64(tcg_rd, tcg_rm);
116
} else {
117
tcg_gen_ext32u_i64(tcg_rd, tcg_rm);
118
}
119
}
120
- return;
121
+ return true;
122
}
123
124
- tcg_rm = read_cpu_reg(s, rm, sf);
125
-
126
- if (shift_amount) {
127
- shift_reg_imm(tcg_rm, tcg_rm, sf, shift_type, shift_amount);
128
- }
129
-
130
- tcg_rn = cpu_reg(s, rn);
131
-
132
- switch (opc | (invert << 2)) {
133
- case 0: /* AND */
134
- case 3: /* ANDS */
135
- tcg_gen_and_i64(tcg_rd, tcg_rn, tcg_rm);
136
- break;
137
- case 1: /* ORR */
138
- tcg_gen_or_i64(tcg_rd, tcg_rn, tcg_rm);
139
- break;
140
- case 2: /* EOR */
141
- tcg_gen_xor_i64(tcg_rd, tcg_rn, tcg_rm);
142
- break;
143
- case 4: /* BIC */
144
- case 7: /* BICS */
145
- tcg_gen_andc_i64(tcg_rd, tcg_rn, tcg_rm);
146
- break;
147
- case 5: /* ORN */
148
- tcg_gen_orc_i64(tcg_rd, tcg_rn, tcg_rm);
149
- break;
150
- case 6: /* EON */
151
- tcg_gen_eqv_i64(tcg_rd, tcg_rn, tcg_rm);
152
- break;
153
- default:
154
- assert(FALSE);
155
- break;
156
- }
157
-
158
- if (!sf) {
159
- tcg_gen_ext32u_i64(tcg_rd, tcg_rd);
160
- }
161
-
162
- if (opc == 3) {
163
- gen_logic_CC(sf, tcg_rd);
164
- }
165
+ return do_logic_reg(s, a, tcg_gen_or_i64, tcg_gen_orc_i64, false);
16
}
166
}
17
167
18
#define DO_VPZ(NAME, name) \
168
+TRANS(AND_r, do_logic_reg, a, tcg_gen_and_i64, tcg_gen_andc_i64, false)
19
-static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
169
+TRANS(ANDS_r, do_logic_reg, a, tcg_gen_and_i64, tcg_gen_andc_i64, true)
20
-{ \
170
+TRANS(EOR_r, do_logic_reg, a, tcg_gen_xor_i64, tcg_gen_eqv_i64, false)
21
- static gen_helper_fp_reduce * const fns[4] = { \
22
- NULL, gen_helper_sve_##name##_h, \
23
- gen_helper_sve_##name##_s, \
24
- gen_helper_sve_##name##_d, \
25
+ static gen_helper_fp_reduce * const name##_fns[4] = { \
26
+ NULL, gen_helper_sve_##name##_h, \
27
+ gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
28
}; \
29
- return do_reduce(s, a, fns[a->esz]); \
30
-}
31
+ TRANS_FEAT(NAME, aa64_sve, do_reduce, a, name##_fns[a->esz])
32
33
DO_VPZ(FADDV, faddv)
34
DO_VPZ(FMINNMV, fminnmv)
35
@@ -XXX,XX +XXX,XX @@ DO_VPZ(FMAXNMV, fmaxnmv)
36
DO_VPZ(FMINV, fminv)
37
DO_VPZ(FMAXV, fmaxv)
38
39
+#undef DO_VPZ
40
+
171
+
41
/*
172
/*
42
*** SVE Floating Point Unary Operations - Unpredicated Group
173
* Add/subtract (extended register)
43
*/
174
*
175
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
176
/* Add/sub (shifted register) */
177
disas_add_sub_reg(s, insn);
178
}
179
- } else {
180
- /* Logical (shifted register) */
181
- disas_logic_reg(s, insn);
182
+ return;
183
}
184
- return;
185
+ goto do_unallocated;
186
}
187
188
switch (op2) {
44
--
189
--
45
2.25.1
190
2.34.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
This includes ADD, SUB, ADDS, SUBS (extended register).
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: 20241211163036.2297116-13-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/tcg/a64.decode | 9 +++++
13
1 file changed, 12 insertions(+), 18 deletions(-)
11
target/arm/tcg/translate-a64.c | 65 +++++++++++-----------------------
12
2 files changed, 29 insertions(+), 45 deletions(-)
14
13
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
16
--- a/target/arm/tcg/a64.decode
18
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/tcg/a64.decode
19
@@ -XXX,XX +XXX,XX @@ static void do_dupi_z(DisasContext *s, int rd, uint64_t word)
18
@@ -XXX,XX +XXX,XX @@ ANDS_r . 11 01010 .. . ..... ...... ..... ..... @logic_shift
20
}
19
21
20
# Add/subtract (shifted reg)
22
/* Invoke a vector expander on three Pregs. */
21
# Add/subtract (extended reg)
23
-static void gen_gvec_fn_ppp(DisasContext *s, GVecGen3Fn *gvec_fn,
22
+
24
+static bool gen_gvec_fn_ppp(DisasContext *s, GVecGen3Fn *gvec_fn,
23
+&addsub_ext rd rn rm sf sa st
25
int rd, int rn, int rm)
24
+@addsub_ext sf:1 .. ........ rm:5 st:3 sa:3 rn:5 rd:5 &addsub_ext
25
+
26
+ADD_ext . 00 01011001 ..... ... ... ..... ..... @addsub_ext
27
+SUB_ext . 10 01011001 ..... ... ... ..... ..... @addsub_ext
28
+ADDS_ext . 01 01011001 ..... ... ... ..... ..... @addsub_ext
29
+SUBS_ext . 11 01011001 ..... ... ... ..... ..... @addsub_ext
30
+
31
# Add/subtract (carry)
32
# Rotate right into flags
33
# Evaluate into flags
34
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/tcg/translate-a64.c
37
+++ b/target/arm/tcg/translate-a64.c
38
@@ -XXX,XX +XXX,XX @@ TRANS(AND_r, do_logic_reg, a, tcg_gen_and_i64, tcg_gen_andc_i64, false)
39
TRANS(ANDS_r, do_logic_reg, a, tcg_gen_and_i64, tcg_gen_andc_i64, true)
40
TRANS(EOR_r, do_logic_reg, a, tcg_gen_xor_i64, tcg_gen_eqv_i64, false)
41
42
-/*
43
- * Add/subtract (extended register)
44
- *
45
- * 31|30|29|28 24|23 22|21|20 16|15 13|12 10|9 5|4 0|
46
- * +--+--+--+-----------+-----+--+-------+------+------+----+----+
47
- * |sf|op| S| 0 1 0 1 1 | opt | 1| Rm |option| imm3 | Rn | Rd |
48
- * +--+--+--+-----------+-----+--+-------+------+------+----+----+
49
- *
50
- * sf: 0 -> 32bit, 1 -> 64bit
51
- * op: 0 -> add , 1 -> sub
52
- * S: 1 -> set flags
53
- * opt: 00
54
- * option: extension type (see DecodeRegExtend)
55
- * imm3: optional shift to Rm
56
- *
57
- * Rd = Rn + LSL(extend(Rm), amount)
58
- */
59
-static void disas_add_sub_ext_reg(DisasContext *s, uint32_t insn)
60
+static bool do_addsub_ext(DisasContext *s, arg_addsub_ext *a,
61
+ bool sub_op, bool setflags)
26
{
62
{
27
- unsigned psz = pred_gvec_reg_size(s);
63
- int rd = extract32(insn, 0, 5);
28
- gvec_fn(MO_64, pred_full_reg_offset(s, rd),
64
- int rn = extract32(insn, 5, 5);
29
- pred_full_reg_offset(s, rn),
65
- int imm3 = extract32(insn, 10, 3);
30
- pred_full_reg_offset(s, rm), psz, psz);
66
- int option = extract32(insn, 13, 3);
31
+ if (sve_access_check(s)) {
67
- int rm = extract32(insn, 16, 5);
32
+ unsigned psz = pred_gvec_reg_size(s);
68
- int opt = extract32(insn, 22, 2);
33
+ gvec_fn(MO_64, pred_full_reg_offset(s, rd),
69
- bool setflags = extract32(insn, 29, 1);
34
+ pred_full_reg_offset(s, rn),
70
- bool sub_op = extract32(insn, 30, 1);
35
+ pred_full_reg_offset(s, rm), psz, psz);
71
- bool sf = extract32(insn, 31, 1);
36
+ }
72
+ TCGv_i64 tcg_rm, tcg_rn, tcg_rd, tcg_result;
73
74
- TCGv_i64 tcg_rm, tcg_rn; /* temps */
75
- TCGv_i64 tcg_rd;
76
- TCGv_i64 tcg_result;
77
-
78
- if (imm3 > 4 || opt != 0) {
79
- unallocated_encoding(s);
80
- return;
81
+ if (a->sa > 4) {
82
+ return false;
83
}
84
85
/* non-flag setting ops may use SP */
86
if (!setflags) {
87
- tcg_rd = cpu_reg_sp(s, rd);
88
+ tcg_rd = cpu_reg_sp(s, a->rd);
89
} else {
90
- tcg_rd = cpu_reg(s, rd);
91
+ tcg_rd = cpu_reg(s, a->rd);
92
}
93
- tcg_rn = read_cpu_reg_sp(s, rn, sf);
94
+ tcg_rn = read_cpu_reg_sp(s, a->rn, a->sf);
95
96
- tcg_rm = read_cpu_reg(s, rm, sf);
97
- ext_and_shift_reg(tcg_rm, tcg_rm, option, imm3);
98
+ tcg_rm = read_cpu_reg(s, a->rm, a->sf);
99
+ ext_and_shift_reg(tcg_rm, tcg_rm, a->st, a->sa);
100
101
tcg_result = tcg_temp_new_i64();
102
-
103
if (!setflags) {
104
if (sub_op) {
105
tcg_gen_sub_i64(tcg_result, tcg_rn, tcg_rm);
106
@@ -XXX,XX +XXX,XX @@ static void disas_add_sub_ext_reg(DisasContext *s, uint32_t insn)
107
}
108
} else {
109
if (sub_op) {
110
- gen_sub_CC(sf, tcg_result, tcg_rn, tcg_rm);
111
+ gen_sub_CC(a->sf, tcg_result, tcg_rn, tcg_rm);
112
} else {
113
- gen_add_CC(sf, tcg_result, tcg_rn, tcg_rm);
114
+ gen_add_CC(a->sf, tcg_result, tcg_rn, tcg_rm);
115
}
116
}
117
118
- if (sf) {
119
+ if (a->sf) {
120
tcg_gen_mov_i64(tcg_rd, tcg_result);
121
} else {
122
tcg_gen_ext32u_i64(tcg_rd, tcg_result);
123
}
37
+ return true;
124
+ return true;
38
}
125
}
39
126
40
/* Invoke a vector move on two Pregs. */
127
+TRANS(ADD_ext, do_addsub_ext, a, false, false)
41
@@ -XXX,XX +XXX,XX @@ static bool trans_AND_pppp(DisasContext *s, arg_rprr_s *a)
128
+TRANS(SUB_ext, do_addsub_ext, a, true, false)
42
};
129
+TRANS(ADDS_ext, do_addsub_ext, a, false, true)
43
130
+TRANS(SUBS_ext, do_addsub_ext, a, true, true)
44
if (!a->s) {
131
+
45
- if (!sve_access_check(s)) {
132
/*
46
- return true;
133
* Add/subtract (shifted register)
47
- }
134
*
48
if (a->rn == a->rm) {
135
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
49
if (a->pg == a->rn) {
136
if (!op1) {
50
- do_mov_p(s, a->rd, a->rn);
137
if (op2 & 8) {
51
- } else {
138
if (op2 & 1) {
52
- gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->pg);
139
- /* Add/sub (extended register) */
53
+ return do_mov_p(s, a->rd, a->rn);
140
- disas_add_sub_ext_reg(s, insn);
54
}
141
+ goto do_unallocated;
55
- return true;
142
} else {
56
+ return gen_gvec_fn_ppp(s, tcg_gen_gvec_and, a->rd, a->rn, a->pg);
143
/* Add/sub (shifted register) */
57
} else if (a->pg == a->rn || a->pg == a->rm) {
144
disas_add_sub_reg(s, insn);
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
}
62
}
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
--
145
--
77
2.25.1
146
2.34.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 includes ADD, SUB, ADDS, SUBS (shifted register).
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-77-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-14-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 | 7 ++-----
10
target/arm/tcg/a64.decode | 9 +++++
9
1 file changed, 2 insertions(+), 5 deletions(-)
11
target/arm/tcg/translate-a64.c | 64 ++++++++++------------------------
12
2 files changed, 27 insertions(+), 46 deletions(-)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_zzi_ool(DisasContext *s, arg_rri_esz *a, gen_helper_gvec_2i *fn)
18
@@ -XXX,XX +XXX,XX @@ EOR_r . 10 01010 .. . ..... ...... ..... ..... @logic_shift
19
ANDS_r . 11 01010 .. . ..... ...... ..... ..... @logic_shift
20
21
# Add/subtract (shifted reg)
22
+
23
+&addsub_shift rd rn rm sf sa st
24
+@addsub_shift sf:1 .. ..... st:2 . rm:5 sa:6 rn:5 rd:5 &addsub_shift
25
+
26
+ADD_r . 00 01011 .. 0 ..... ...... ..... ..... @addsub_shift
27
+SUB_r . 10 01011 .. 0 ..... ...... ..... ..... @addsub_shift
28
+ADDS_r . 01 01011 .. 0 ..... ...... ..... ..... @addsub_shift
29
+SUBS_r . 11 01011 .. 0 ..... ...... ..... ..... @addsub_shift
30
+
31
# Add/subtract (extended reg)
32
33
&addsub_ext rd rn rm sf sa st
34
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/tcg/translate-a64.c
37
+++ b/target/arm/tcg/translate-a64.c
38
@@ -XXX,XX +XXX,XX @@ TRANS(SUB_ext, do_addsub_ext, a, true, false)
39
TRANS(ADDS_ext, do_addsub_ext, a, false, true)
40
TRANS(SUBS_ext, do_addsub_ext, a, true, true)
41
42
-/*
43
- * Add/subtract (shifted register)
44
- *
45
- * 31 30 29 28 24 23 22 21 20 16 15 10 9 5 4 0
46
- * +--+--+--+-----------+-----+--+-------+---------+------+------+
47
- * |sf|op| S| 0 1 0 1 1 |shift| 0| Rm | imm6 | Rn | Rd |
48
- * +--+--+--+-----------+-----+--+-------+---------+------+------+
49
- *
50
- * sf: 0 -> 32bit, 1 -> 64bit
51
- * op: 0 -> add , 1 -> sub
52
- * S: 1 -> set flags
53
- * shift: 00 -> LSL, 01 -> LSR, 10 -> ASR, 11 -> RESERVED
54
- * imm6: Shift amount to apply to Rm before the add/sub
55
- */
56
-static void disas_add_sub_reg(DisasContext *s, uint32_t insn)
57
+static bool do_addsub_reg(DisasContext *s, arg_addsub_shift *a,
58
+ bool sub_op, bool setflags)
59
{
60
- int rd = extract32(insn, 0, 5);
61
- int rn = extract32(insn, 5, 5);
62
- int imm6 = extract32(insn, 10, 6);
63
- int rm = extract32(insn, 16, 5);
64
- int shift_type = extract32(insn, 22, 2);
65
- bool setflags = extract32(insn, 29, 1);
66
- bool sub_op = extract32(insn, 30, 1);
67
- bool sf = extract32(insn, 31, 1);
68
+ TCGv_i64 tcg_rd, tcg_rn, tcg_rm, tcg_result;
69
70
- TCGv_i64 tcg_rd = cpu_reg(s, rd);
71
- TCGv_i64 tcg_rn, tcg_rm;
72
- TCGv_i64 tcg_result;
73
-
74
- if ((shift_type == 3) || (!sf && (imm6 > 31))) {
75
- unallocated_encoding(s);
76
- return;
77
+ if (a->st == 3 || (!a->sf && (a->sa & 32))) {
78
+ return false;
79
}
80
81
- tcg_rn = read_cpu_reg(s, rn, sf);
82
- tcg_rm = read_cpu_reg(s, rm, sf);
83
+ tcg_rd = cpu_reg(s, a->rd);
84
+ tcg_rn = read_cpu_reg(s, a->rn, a->sf);
85
+ tcg_rm = read_cpu_reg(s, a->rm, a->sf);
86
87
- shift_reg_imm(tcg_rm, tcg_rm, sf, shift_type, imm6);
88
+ shift_reg_imm(tcg_rm, tcg_rm, a->sf, a->st, a->sa);
89
90
tcg_result = tcg_temp_new_i64();
91
-
92
if (!setflags) {
93
if (sub_op) {
94
tcg_gen_sub_i64(tcg_result, tcg_rn, tcg_rm);
95
@@ -XXX,XX +XXX,XX @@ static void disas_add_sub_reg(DisasContext *s, uint32_t insn)
96
}
97
} else {
98
if (sub_op) {
99
- gen_sub_CC(sf, tcg_result, tcg_rn, tcg_rm);
100
+ gen_sub_CC(a->sf, tcg_result, tcg_rn, tcg_rm);
101
} else {
102
- gen_add_CC(sf, tcg_result, tcg_rn, tcg_rm);
103
+ gen_add_CC(a->sf, tcg_result, tcg_rn, tcg_rm);
104
}
105
}
106
107
- if (sf) {
108
+ if (a->sf) {
109
tcg_gen_mov_i64(tcg_rd, tcg_result);
110
} else {
111
tcg_gen_ext32u_i64(tcg_rd, tcg_result);
112
}
113
+ return true;
16
}
114
}
17
115
18
#define DO_ZZI(NAME, name) \
116
+TRANS(ADD_r, do_addsub_reg, a, false, false)
19
-static bool trans_##NAME##_zzi(DisasContext *s, arg_rri_esz *a) \
117
+TRANS(SUB_r, do_addsub_reg, a, true, false)
20
-{ \
118
+TRANS(ADDS_r, do_addsub_reg, a, false, true)
21
- static gen_helper_gvec_2i * const fns[4] = { \
119
+TRANS(SUBS_r, do_addsub_reg, a, true, true)
22
+ static gen_helper_gvec_2i * const name##i_fns[4] = { \
120
+
23
gen_helper_sve_##name##i_b, gen_helper_sve_##name##i_h, \
121
/* Data-processing (3 source)
24
gen_helper_sve_##name##i_s, gen_helper_sve_##name##i_d, \
122
*
25
}; \
123
* 31 30 29 28 24 23 21 20 16 15 14 10 9 5 4 0
26
- return do_zzi_ool(s, a, fns[a->esz]); \
124
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
27
-}
125
int op3 = extract32(insn, 10, 6);
28
+ TRANS_FEAT(NAME##_zzi, aa64_sve, do_zzi_ool, a, name##i_fns[a->esz])
126
29
127
if (!op1) {
30
DO_ZZI(SMAX, smax)
128
- if (op2 & 8) {
31
DO_ZZI(UMAX, umax)
129
- if (op2 & 1) {
130
- goto do_unallocated;
131
- } else {
132
- /* Add/sub (shifted register) */
133
- disas_add_sub_reg(s, insn);
134
- }
135
- return;
136
- }
137
goto do_unallocated;
138
}
139
32
--
140
--
33
2.25.1
141
2.34.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 includes MADD, MSUB, SMADDL, SMSUBL, UMADDL, UMSUBL, SMULH, UMULH.
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-75-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-15-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 | 5 +----
10
target/arm/tcg/a64.decode | 16 +++++
9
1 file changed, 1 insertion(+), 4 deletions(-)
11
target/arm/tcg/translate-a64.c | 119 ++++++++++++---------------------
12
2 files changed, 59 insertions(+), 76 deletions(-)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool trans_DUP_i(DisasContext *s, arg_DUP_i *a)
18
@@ -XXX,XX +XXX,XX @@ SUBS_ext . 11 01011001 ..... ... ... ..... ..... @addsub_ext
16
return true;
19
# Conditional select
20
# Data Processing (3-source)
21
22
+&rrrr rd rn rm ra
23
+@rrrr . .. ........ rm:5 . ra:5 rn:5 rd:5 &rrrr
24
+
25
+MADD_w 0 00 11011000 ..... 0 ..... ..... ..... @rrrr
26
+MSUB_w 0 00 11011000 ..... 1 ..... ..... ..... @rrrr
27
+MADD_x 1 00 11011000 ..... 0 ..... ..... ..... @rrrr
28
+MSUB_x 1 00 11011000 ..... 1 ..... ..... ..... @rrrr
29
+
30
+SMADDL 1 00 11011001 ..... 0 ..... ..... ..... @rrrr
31
+SMSUBL 1 00 11011001 ..... 1 ..... ..... ..... @rrrr
32
+UMADDL 1 00 11011101 ..... 0 ..... ..... ..... @rrrr
33
+UMSUBL 1 00 11011101 ..... 1 ..... ..... ..... @rrrr
34
+
35
+SMULH 1 00 11011010 ..... 0 11111 ..... ..... @rrr
36
+UMULH 1 00 11011110 ..... 0 11111 ..... ..... @rrr
37
+
38
### Cryptographic AES
39
40
AESE 01001110 00 10100 00100 10 ..... ..... @r2r_q1e0
41
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
42
index XXXXXXX..XXXXXXX 100644
43
--- a/target/arm/tcg/translate-a64.c
44
+++ b/target/arm/tcg/translate-a64.c
45
@@ -XXX,XX +XXX,XX @@ TRANS(SUB_r, do_addsub_reg, a, true, false)
46
TRANS(ADDS_r, do_addsub_reg, a, false, true)
47
TRANS(SUBS_r, do_addsub_reg, a, true, true)
48
49
-/* Data-processing (3 source)
50
- *
51
- * 31 30 29 28 24 23 21 20 16 15 14 10 9 5 4 0
52
- * +--+------+-----------+------+------+----+------+------+------+
53
- * |sf| op54 | 1 1 0 1 1 | op31 | Rm | o0 | Ra | Rn | Rd |
54
- * +--+------+-----------+------+------+----+------+------+------+
55
- */
56
-static void disas_data_proc_3src(DisasContext *s, uint32_t insn)
57
+static bool do_mulh(DisasContext *s, arg_rrr *a,
58
+ void (*fn)(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64))
59
{
60
- int rd = extract32(insn, 0, 5);
61
- int rn = extract32(insn, 5, 5);
62
- int ra = extract32(insn, 10, 5);
63
- int rm = extract32(insn, 16, 5);
64
- int op_id = (extract32(insn, 29, 3) << 4) |
65
- (extract32(insn, 21, 3) << 1) |
66
- extract32(insn, 15, 1);
67
- bool sf = extract32(insn, 31, 1);
68
- bool is_sub = extract32(op_id, 0, 1);
69
- bool is_high = extract32(op_id, 2, 1);
70
- bool is_signed = false;
71
- TCGv_i64 tcg_op1;
72
- TCGv_i64 tcg_op2;
73
- TCGv_i64 tcg_tmp;
74
+ TCGv_i64 discard = tcg_temp_new_i64();
75
+ TCGv_i64 tcg_rd = cpu_reg(s, a->rd);
76
+ TCGv_i64 tcg_rn = cpu_reg(s, a->rn);
77
+ TCGv_i64 tcg_rm = cpu_reg(s, a->rm);
78
79
- /* Note that op_id is sf:op54:op31:o0 so it includes the 32/64 size flag */
80
- switch (op_id) {
81
- case 0x42: /* SMADDL */
82
- case 0x43: /* SMSUBL */
83
- case 0x44: /* SMULH */
84
- is_signed = true;
85
- break;
86
- case 0x0: /* MADD (32bit) */
87
- case 0x1: /* MSUB (32bit) */
88
- case 0x40: /* MADD (64bit) */
89
- case 0x41: /* MSUB (64bit) */
90
- case 0x4a: /* UMADDL */
91
- case 0x4b: /* UMSUBL */
92
- case 0x4c: /* UMULH */
93
- break;
94
- default:
95
- unallocated_encoding(s);
96
- return;
97
- }
98
+ fn(discard, tcg_rd, tcg_rn, tcg_rm);
99
+ return true;
100
+}
101
102
- if (is_high) {
103
- TCGv_i64 low_bits = tcg_temp_new_i64(); /* low bits discarded */
104
- TCGv_i64 tcg_rd = cpu_reg(s, rd);
105
- TCGv_i64 tcg_rn = cpu_reg(s, rn);
106
- TCGv_i64 tcg_rm = cpu_reg(s, rm);
107
+TRANS(SMULH, do_mulh, a, tcg_gen_muls2_i64)
108
+TRANS(UMULH, do_mulh, a, tcg_gen_mulu2_i64)
109
110
- if (is_signed) {
111
- tcg_gen_muls2_i64(low_bits, tcg_rd, tcg_rn, tcg_rm);
112
- } else {
113
- tcg_gen_mulu2_i64(low_bits, tcg_rd, tcg_rn, tcg_rm);
114
- }
115
- return;
116
- }
117
+static bool do_muladd(DisasContext *s, arg_rrrr *a,
118
+ bool sf, bool is_sub, MemOp mop)
119
+{
120
+ TCGv_i64 tcg_rd = cpu_reg(s, a->rd);
121
+ TCGv_i64 tcg_op1, tcg_op2;
122
123
- tcg_op1 = tcg_temp_new_i64();
124
- tcg_op2 = tcg_temp_new_i64();
125
- tcg_tmp = tcg_temp_new_i64();
126
-
127
- if (op_id < 0x42) {
128
- tcg_gen_mov_i64(tcg_op1, cpu_reg(s, rn));
129
- tcg_gen_mov_i64(tcg_op2, cpu_reg(s, rm));
130
+ if (mop == MO_64) {
131
+ tcg_op1 = cpu_reg(s, a->rn);
132
+ tcg_op2 = cpu_reg(s, a->rm);
133
} else {
134
- if (is_signed) {
135
- tcg_gen_ext32s_i64(tcg_op1, cpu_reg(s, rn));
136
- tcg_gen_ext32s_i64(tcg_op2, cpu_reg(s, rm));
137
- } else {
138
- tcg_gen_ext32u_i64(tcg_op1, cpu_reg(s, rn));
139
- tcg_gen_ext32u_i64(tcg_op2, cpu_reg(s, rm));
140
- }
141
+ tcg_op1 = tcg_temp_new_i64();
142
+ tcg_op2 = tcg_temp_new_i64();
143
+ tcg_gen_ext_i64(tcg_op1, cpu_reg(s, a->rn), mop);
144
+ tcg_gen_ext_i64(tcg_op2, cpu_reg(s, a->rm), mop);
145
}
146
147
- if (ra == 31 && !is_sub) {
148
+ if (a->ra == 31 && !is_sub) {
149
/* Special-case MADD with rA == XZR; it is the standard MUL alias */
150
- tcg_gen_mul_i64(cpu_reg(s, rd), tcg_op1, tcg_op2);
151
+ tcg_gen_mul_i64(tcg_rd, tcg_op1, tcg_op2);
152
} else {
153
+ TCGv_i64 tcg_tmp = tcg_temp_new_i64();
154
+ TCGv_i64 tcg_ra = cpu_reg(s, a->ra);
155
+
156
tcg_gen_mul_i64(tcg_tmp, tcg_op1, tcg_op2);
157
if (is_sub) {
158
- tcg_gen_sub_i64(cpu_reg(s, rd), cpu_reg(s, ra), tcg_tmp);
159
+ tcg_gen_sub_i64(tcg_rd, tcg_ra, tcg_tmp);
160
} else {
161
- tcg_gen_add_i64(cpu_reg(s, rd), cpu_reg(s, ra), tcg_tmp);
162
+ tcg_gen_add_i64(tcg_rd, tcg_ra, tcg_tmp);
163
}
164
}
165
166
if (!sf) {
167
- tcg_gen_ext32u_i64(cpu_reg(s, rd), cpu_reg(s, rd));
168
+ tcg_gen_ext32u_i64(tcg_rd, tcg_rd);
169
}
170
+ return true;
17
}
171
}
18
172
19
-static bool trans_ADD_zzi(DisasContext *s, arg_rri_esz *a)
173
+TRANS(MADD_w, do_muladd, a, false, false, MO_64)
20
-{
174
+TRANS(MSUB_w, do_muladd, a, false, true, MO_64)
21
- return gen_gvec_fn_arg_zzi(s, tcg_gen_gvec_addi, a);
175
+TRANS(MADD_x, do_muladd, a, true, false, MO_64)
22
-}
176
+TRANS(MSUB_x, do_muladd, a, true, true, MO_64)
23
+TRANS_FEAT(ADD_zzi, aa64_sve, gen_gvec_fn_arg_zzi, tcg_gen_gvec_addi, a)
177
+
24
178
+TRANS(SMADDL, do_muladd, a, true, false, MO_SL)
25
static bool trans_SUB_zzi(DisasContext *s, arg_rri_esz *a)
179
+TRANS(SMSUBL, do_muladd, a, true, true, MO_SL)
26
{
180
+TRANS(UMADDL, do_muladd, a, true, false, MO_UL)
181
+TRANS(UMSUBL, do_muladd, a, true, true, MO_UL)
182
+
183
/* Add/subtract (with carry)
184
* 31 30 29 28 27 26 25 24 23 22 21 20 16 15 10 9 5 4 0
185
* +--+--+--+------------------------+------+-------------+------+-----+
186
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
187
disas_cond_select(s, insn);
188
break;
189
190
- case 0x8 ... 0xf: /* (3 source) */
191
- disas_data_proc_3src(s, insn);
192
- break;
193
-
194
default:
195
do_unallocated:
196
case 0x6: /* Data-processing */
197
+ case 0x8 ... 0xf: /* (3 source) */
198
unallocated_encoding(s);
199
break;
200
}
27
--
201
--
28
2.25.1
202
2.34.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 includes ADC, SBC, ADCS, SBCS.
4
and do_zzi_sat which are intended to reject an 8-bit shift of an
5
8-bit constant for 8-bit element.
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-73-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-16-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/sve.decode | 35 ++++++++++++++++++++++++++++-------
10
target/arm/tcg/a64.decode | 6 +++++
13
target/arm/translate-sve.c | 9 ---------
11
target/arm/tcg/translate-a64.c | 43 +++++++++++++---------------------
14
2 files changed, 28 insertions(+), 16 deletions(-)
12
2 files changed, 22 insertions(+), 27 deletions(-)
15
13
16
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
14
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/sve.decode
16
--- a/target/arm/tcg/a64.decode
19
+++ b/target/arm/sve.decode
17
+++ b/target/arm/tcg/a64.decode
20
@@ -XXX,XX +XXX,XX @@ FDUP 00100101 esz:2 111 00 1110 imm:8 rd:5
18
@@ -XXX,XX +XXX,XX @@ ADDS_ext . 01 01011001 ..... ... ... ..... ..... @addsub_ext
19
SUBS_ext . 11 01011001 ..... ... ... ..... ..... @addsub_ext
20
21
# Add/subtract (carry)
22
+
23
+ADC . 00 11010000 ..... 000000 ..... ..... @rrr_sf
24
+ADCS . 01 11010000 ..... 000000 ..... ..... @rrr_sf
25
+SBC . 10 11010000 ..... 000000 ..... ..... @rrr_sf
26
+SBCS . 11 11010000 ..... 000000 ..... ..... @rrr_sf
27
+
28
# Rotate right into flags
29
# Evaluate into flags
30
# Conditional compare (regster)
31
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/tcg/translate-a64.c
34
+++ b/target/arm/tcg/translate-a64.c
35
@@ -XXX,XX +XXX,XX @@ TRANS(SMSUBL, do_muladd, a, true, true, MO_SL)
36
TRANS(UMADDL, do_muladd, a, true, false, MO_UL)
37
TRANS(UMSUBL, do_muladd, a, true, true, MO_UL)
38
39
-/* Add/subtract (with carry)
40
- * 31 30 29 28 27 26 25 24 23 22 21 20 16 15 10 9 5 4 0
41
- * +--+--+--+------------------------+------+-------------+------+-----+
42
- * |sf|op| S| 1 1 0 1 0 0 0 0 | rm | 0 0 0 0 0 0 | Rn | Rd |
43
- * +--+--+--+------------------------+------+-------------+------+-----+
44
- */
45
-
46
-static void disas_adc_sbc(DisasContext *s, uint32_t insn)
47
+static bool do_adc_sbc(DisasContext *s, arg_rrr_sf *a,
48
+ bool is_sub, bool setflags)
49
{
50
- unsigned int sf, op, setflags, rm, rn, rd;
51
TCGv_i64 tcg_y, tcg_rn, tcg_rd;
52
53
- sf = extract32(insn, 31, 1);
54
- op = extract32(insn, 30, 1);
55
- setflags = extract32(insn, 29, 1);
56
- rm = extract32(insn, 16, 5);
57
- rn = extract32(insn, 5, 5);
58
- rd = extract32(insn, 0, 5);
59
+ tcg_rd = cpu_reg(s, a->rd);
60
+ tcg_rn = cpu_reg(s, a->rn);
61
62
- tcg_rd = cpu_reg(s, rd);
63
- tcg_rn = cpu_reg(s, rn);
64
-
65
- if (op) {
66
+ if (is_sub) {
67
tcg_y = tcg_temp_new_i64();
68
- tcg_gen_not_i64(tcg_y, cpu_reg(s, rm));
69
+ tcg_gen_not_i64(tcg_y, cpu_reg(s, a->rm));
70
} else {
71
- tcg_y = cpu_reg(s, rm);
72
+ tcg_y = cpu_reg(s, a->rm);
73
}
74
75
if (setflags) {
76
- gen_adc_CC(sf, tcg_rd, tcg_rn, tcg_y);
77
+ gen_adc_CC(a->sf, tcg_rd, tcg_rn, tcg_y);
78
} else {
79
- gen_adc(sf, tcg_rd, tcg_rn, tcg_y);
80
+ gen_adc(a->sf, tcg_rd, tcg_rn, tcg_y);
81
}
82
+ return true;
21
}
83
}
22
84
23
# SVE integer add/subtract immediate (unpredicated)
85
+TRANS(ADC, do_adc_sbc, a, false, false)
24
-ADD_zzi 00100101 .. 100 000 11 . ........ ..... @rdn_sh_i8u
86
+TRANS(SBC, do_adc_sbc, a, true, false)
25
-SUB_zzi 00100101 .. 100 001 11 . ........ ..... @rdn_sh_i8u
87
+TRANS(ADCS, do_adc_sbc, a, false, true)
26
-SUBR_zzi 00100101 .. 100 011 11 . ........ ..... @rdn_sh_i8u
88
+TRANS(SBCS, do_adc_sbc, a, true, true)
27
-SQADD_zzi 00100101 .. 100 100 11 . ........ ..... @rdn_sh_i8u
89
+
28
-UQADD_zzi 00100101 .. 100 101 11 . ........ ..... @rdn_sh_i8u
90
/*
29
-SQSUB_zzi 00100101 .. 100 110 11 . ........ ..... @rdn_sh_i8u
91
* Rotate right into flags
30
-UQSUB_zzi 00100101 .. 100 111 11 . ........ ..... @rdn_sh_i8u
92
* 31 30 29 21 15 10 5 4 0
31
+{
93
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
32
+ INVALID 00100101 00 100 000 11 1 -------- -----
94
switch (op2) {
33
+ ADD_zzi 00100101 .. 100 000 11 . ........ ..... @rdn_sh_i8u
95
case 0x0:
34
+}
96
switch (op3) {
35
+{
97
- case 0x00: /* Add/subtract (with carry) */
36
+ INVALID 00100101 00 100 001 11 1 -------- -----
98
- disas_adc_sbc(s, insn);
37
+ SUB_zzi 00100101 .. 100 001 11 . ........ ..... @rdn_sh_i8u
99
- break;
38
+}
100
-
39
+{
101
case 0x01: /* Rotate right into flags */
40
+ INVALID 00100101 00 100 011 11 1 -------- -----
102
case 0x21:
41
+ SUBR_zzi 00100101 .. 100 011 11 . ........ ..... @rdn_sh_i8u
103
disas_rotate_right_into_flags(s, insn);
42
+}
104
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
43
+{
105
break;
44
+ INVALID 00100101 00 100 100 11 1 -------- -----
106
45
+ SQADD_zzi 00100101 .. 100 100 11 . ........ ..... @rdn_sh_i8u
107
default:
46
+}
108
+ case 0x00: /* Add/subtract (with carry) */
47
+{
109
goto do_unallocated;
48
+ INVALID 00100101 00 100 101 11 1 -------- -----
110
}
49
+ UQADD_zzi 00100101 .. 100 101 11 . ........ ..... @rdn_sh_i8u
111
break;
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
63
index XXXXXXX..XXXXXXX 100644
64
--- a/target/arm/translate-sve.c
65
+++ b/target/arm/translate-sve.c
66
@@ -XXX,XX +XXX,XX @@ static bool trans_DUP_i(DisasContext *s, arg_DUP_i *a)
67
68
static bool trans_ADD_zzi(DisasContext *s, arg_rri_esz *a)
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
}
75
76
@@ -XXX,XX +XXX,XX @@ static bool trans_SUBR_zzi(DisasContext *s, arg_rri_esz *a)
77
.scalar_first = true }
78
};
79
80
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
81
- return false;
82
- }
83
if (sve_access_check(s)) {
84
unsigned vsz = vec_full_reg_size(s);
85
tcg_gen_gvec_2s(vec_full_reg_offset(s, a->rd),
86
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(MUL_zzi, aa64_sve, gen_gvec_fn_arg_zzi, tcg_gen_gvec_muli, a)
87
88
static bool do_zzi_sat(DisasContext *s, arg_rri_esz *a, bool u, bool d)
89
{
90
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
91
- return false;
92
- }
93
if (sve_access_check(s)) {
94
do_sat_addsub_vec(s, a->esz, a->rd, a->rn,
95
tcg_constant_i64(a->imm), u, d);
96
--
112
--
97
2.25.1
113
2.34.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: Philippe Mathieu-Daudé <philmd@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-82-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-17-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 | 5 +----
8
target/arm/tcg/a64.decode | 3 +++
9
1 file changed, 1 insertion(+), 4 deletions(-)
9
target/arm/tcg/translate-a64.c | 32 +++++++++-----------------------
10
2 files changed, 12 insertions(+), 23 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_4 * const udiv_fns[4] = {
16
@@ -XXX,XX +XXX,XX @@ SBC . 10 11010000 ..... 000000 ..... ..... @rrr_sf
16
};
17
SBCS . 11 11010000 ..... 000000 ..... ..... @rrr_sf
17
TRANS_FEAT(UDIV_zpzz, aa64_sve, gen_gvec_ool_arg_zpzz, udiv_fns[a->esz], a, 0)
18
18
19
# Rotate right into flags
19
-static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
20
+
20
-{
21
+RMIF 1 01 11010000 imm:6 00001 rn:5 0 mask:4
21
- return do_sel_z(s, a->rd, a->rn, a->rm, a->pg, a->esz);
22
+
22
-}
23
# Evaluate into flags
23
+TRANS_FEAT(SEL_zpzz, aa64_sve, do_sel_z, a->rd, a->rn, a->rm, a->pg, a->esz)
24
# Conditional compare (regster)
25
# Conditional compare (immediate)
26
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/target/arm/tcg/translate-a64.c
29
+++ b/target/arm/tcg/translate-a64.c
30
@@ -XXX,XX +XXX,XX @@ TRANS(SBC, do_adc_sbc, a, true, false)
31
TRANS(ADCS, do_adc_sbc, a, false, true)
32
TRANS(SBCS, do_adc_sbc, a, true, true)
33
34
-/*
35
- * Rotate right into flags
36
- * 31 30 29 21 15 10 5 4 0
37
- * +--+--+--+-----------------+--------+-----------+------+--+------+
38
- * |sf|op| S| 1 1 0 1 0 0 0 0 | imm6 | 0 0 0 0 1 | Rn |o2| mask |
39
- * +--+--+--+-----------------+--------+-----------+------+--+------+
40
- */
41
-static void disas_rotate_right_into_flags(DisasContext *s, uint32_t insn)
42
+static bool trans_RMIF(DisasContext *s, arg_RMIF *a)
43
{
44
- int mask = extract32(insn, 0, 4);
45
- int o2 = extract32(insn, 4, 1);
46
- int rn = extract32(insn, 5, 5);
47
- int imm6 = extract32(insn, 15, 6);
48
- int sf_op_s = extract32(insn, 29, 3);
49
+ int mask = a->mask;
50
TCGv_i64 tcg_rn;
51
TCGv_i32 nzcv;
52
53
- if (sf_op_s != 5 || o2 != 0 || !dc_isar_feature(aa64_condm_4, s)) {
54
- unallocated_encoding(s);
55
- return;
56
+ if (!dc_isar_feature(aa64_condm_4, s)) {
57
+ return false;
58
}
59
60
- tcg_rn = read_cpu_reg(s, rn, 1);
61
- tcg_gen_rotri_i64(tcg_rn, tcg_rn, imm6);
62
+ tcg_rn = read_cpu_reg(s, a->rn, 1);
63
+ tcg_gen_rotri_i64(tcg_rn, tcg_rn, a->imm);
64
65
nzcv = tcg_temp_new_i32();
66
tcg_gen_extrl_i64_i32(nzcv, tcg_rn);
67
@@ -XXX,XX +XXX,XX @@ static void disas_rotate_right_into_flags(DisasContext *s, uint32_t insn)
68
if (mask & 1) { /* V */
69
tcg_gen_shli_i32(cpu_VF, nzcv, 31 - 0);
70
}
71
+ return true;
72
}
24
73
25
/*
74
/*
26
*** SVE Integer Arithmetic - Unary Predicated Group
75
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
76
switch (op2) {
77
case 0x0:
78
switch (op3) {
79
- case 0x01: /* Rotate right into flags */
80
- case 0x21:
81
- disas_rotate_right_into_flags(s, insn);
82
- break;
83
-
84
case 0x02: /* Evaluate into flags */
85
case 0x12:
86
case 0x22:
87
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
88
89
default:
90
case 0x00: /* Add/subtract (with carry) */
91
+ case 0x01: /* Rotate right into flags */
92
+ case 0x21:
93
goto do_unallocated;
94
}
95
break;
27
--
96
--
28
2.25.1
97
2.34.1
98
99
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 gen_gvec_ool_zz to TRANS_FEAT.
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-4-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-18-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 | 39 +++++++++++++-------------------------
8
target/arm/tcg/a64.decode | 4 +++
11
1 file changed, 13 insertions(+), 26 deletions(-)
9
target/arm/tcg/translate-a64.c | 48 +++++-----------------------------
10
2 files changed, 11 insertions(+), 41 deletions(-)
12
11
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
14
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
16
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
17
@@ -XXX,XX +XXX,XX @@ static bool trans_ADR_u32(DisasContext *s, arg_rrri *a)
16
@@ -XXX,XX +XXX,XX @@ SBCS . 11 11010000 ..... 000000 ..... ..... @rrr_sf
18
*** SVE Integer Misc - Unpredicated Group
17
RMIF 1 01 11010000 imm:6 00001 rn:5 0 mask:4
19
*/
18
20
19
# Evaluate into flags
21
-static bool trans_FEXPA(DisasContext *s, arg_rr_esz *a)
20
+
22
-{
21
+SETF8 0 01 11010000 00000 000010 rn:5 01101
23
- static gen_helper_gvec_2 * const fns[4] = {
22
+SETF16 0 01 11010000 00000 010010 rn:5 01101
24
- NULL,
23
+
25
- gen_helper_sve_fexpa_h,
24
# Conditional compare (regster)
26
- gen_helper_sve_fexpa_s,
25
# Conditional compare (immediate)
27
- gen_helper_sve_fexpa_d,
26
# Conditional select
28
- };
27
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
29
- return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
28
index XXXXXXX..XXXXXXX 100644
30
-}
29
--- a/target/arm/tcg/translate-a64.c
31
+static gen_helper_gvec_2 * const fexpa_fns[4] = {
30
+++ b/target/arm/tcg/translate-a64.c
32
+ NULL, gen_helper_sve_fexpa_h,
31
@@ -XXX,XX +XXX,XX @@ static bool trans_RMIF(DisasContext *s, arg_RMIF *a)
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;
32
return true;
42
}
33
}
43
34
44
-static bool trans_REV_v(DisasContext *s, arg_rr_esz *a)
35
-/*
45
-{
36
- * Evaluate into flags
46
- static gen_helper_gvec_2 * const fns[4] = {
37
- * 31 30 29 21 15 14 10 5 4 0
47
- gen_helper_sve_rev_b, gen_helper_sve_rev_h,
38
- * +--+--+--+-----------------+---------+----+---------+------+--+------+
48
- gen_helper_sve_rev_s, gen_helper_sve_rev_d
39
- * |sf|op| S| 1 1 0 1 0 0 0 0 | opcode2 | sz | 0 0 1 0 | Rn |o3| mask |
49
- };
40
- * +--+--+--+-----------------+---------+----+---------+------+--+------+
50
- return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
41
- */
51
-}
42
-static void disas_evaluate_into_flags(DisasContext *s, uint32_t insn)
52
+static gen_helper_gvec_2 * const rev_fns[4] = {
43
+static bool do_setf(DisasContext *s, int rn, int shift)
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
{
44
{
60
@@ -XXX,XX +XXX,XX @@ static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
45
- int o3_mask = extract32(insn, 0, 5);
61
return true;
46
- int rn = extract32(insn, 5, 5);
47
- int o2 = extract32(insn, 15, 6);
48
- int sz = extract32(insn, 14, 1);
49
- int sf_op_s = extract32(insn, 29, 3);
50
- TCGv_i32 tmp;
51
- int shift;
52
+ TCGv_i32 tmp = tcg_temp_new_i32();
53
54
- if (sf_op_s != 1 || o2 != 0 || o3_mask != 0xd ||
55
- !dc_isar_feature(aa64_condm_4, s)) {
56
- unallocated_encoding(s);
57
- return;
58
- }
59
- shift = sz ? 16 : 24; /* SETF16 or SETF8 */
60
-
61
- tmp = tcg_temp_new_i32();
62
tcg_gen_extrl_i64_i32(tmp, cpu_reg(s, rn));
63
tcg_gen_shli_i32(cpu_NF, tmp, shift);
64
tcg_gen_shli_i32(cpu_VF, tmp, shift - 1);
65
tcg_gen_mov_i32(cpu_ZF, cpu_NF);
66
tcg_gen_xor_i32(cpu_VF, cpu_VF, cpu_NF);
67
+ return true;
62
}
68
}
63
69
64
-static bool trans_AESMC(DisasContext *s, arg_AESMC *a)
70
+TRANS_FEAT(SETF8, aa64_condm_4, do_setf, a->rn, 24)
65
-{
71
+TRANS_FEAT(SETF16, aa64_condm_4, do_setf, a->rn, 16)
66
- if (!dc_isar_feature(aa64_sve2_aes, s)) {
72
+
67
- return false;
73
/* Conditional compare (immediate / register)
68
- }
74
* 31 30 29 28 27 26 25 24 23 22 21 20 16 15 12 11 10 9 5 4 3 0
69
- return gen_gvec_ool_zz(s, gen_helper_crypto_aesmc,
75
* +--+--+--+------------------------+--------+------+----+--+------+--+-----+
70
- a->rd, a->rd, a->decrypt);
76
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
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
int op1 = extract32(insn, 28, 1);
79
int op2 = extract32(insn, 21, 4);
80
- int op3 = extract32(insn, 10, 6);
81
82
if (!op1) {
83
goto do_unallocated;
84
}
85
86
switch (op2) {
87
- case 0x0:
88
- switch (op3) {
89
- case 0x02: /* Evaluate into flags */
90
- case 0x12:
91
- case 0x22:
92
- case 0x32:
93
- disas_evaluate_into_flags(s, insn);
94
- break;
95
-
96
- default:
97
- case 0x00: /* Add/subtract (with carry) */
98
- case 0x01: /* Rotate right into flags */
99
- case 0x21:
100
- goto do_unallocated;
101
- }
102
- break;
103
-
104
case 0x2: /* Conditional compare */
105
disas_cc(s, insn); /* both imm and reg forms */
106
break;
107
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
108
109
default:
110
do_unallocated:
111
+ case 0x0:
112
case 0x6: /* Data-processing */
113
case 0x8 ... 0xf: /* (3 source) */
114
unallocated_encoding(s);
77
--
115
--
78
2.25.1
116
2.34.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-49-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-19-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 | 53 ++++++++++++++++++--------------------
8
target/arm/tcg/a64.decode | 6 ++--
9
1 file changed, 25 insertions(+), 28 deletions(-)
9
target/arm/tcg/translate-a64.c | 66 +++++++++++-----------------------
10
2 files changed, 25 insertions(+), 47 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(MLS, aa64_sve, do_zpzzz_ool, a, mls_fns[a->esz])
16
@@ -XXX,XX +XXX,XX @@ RMIF 1 01 11010000 imm:6 00001 rn:5 0 mask:4
16
*** SVE Index Generation Group
17
SETF8 0 01 11010000 00000 000010 rn:5 01101
17
*/
18
SETF16 0 01 11010000 00000 010010 rn:5 01101
18
19
19
-static void do_index(DisasContext *s, int esz, int rd,
20
-# Conditional compare (regster)
20
+static bool do_index(DisasContext *s, int esz, int rd,
21
-# Conditional compare (immediate)
21
TCGv_i64 start, TCGv_i64 incr)
22
+# Conditional compare
23
+
24
+CCMP sf:1 op:1 1 11010010 y:5 cond:4 imm:1 0 rn:5 0 nzcv:4
25
+
26
# Conditional select
27
# Data Processing (3-source)
28
29
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/tcg/translate-a64.c
32
+++ b/target/arm/tcg/translate-a64.c
33
@@ -XXX,XX +XXX,XX @@ static bool do_setf(DisasContext *s, int rn, int shift)
34
TRANS_FEAT(SETF8, aa64_condm_4, do_setf, a->rn, 24)
35
TRANS_FEAT(SETF16, aa64_condm_4, do_setf, a->rn, 16)
36
37
-/* Conditional compare (immediate / register)
38
- * 31 30 29 28 27 26 25 24 23 22 21 20 16 15 12 11 10 9 5 4 3 0
39
- * +--+--+--+------------------------+--------+------+----+--+------+--+-----+
40
- * |sf|op| S| 1 1 0 1 0 0 1 0 |imm5/rm | cond |i/r |o2| Rn |o3|nzcv |
41
- * +--+--+--+------------------------+--------+------+----+--+------+--+-----+
42
- * [1] y [0] [0]
43
- */
44
-static void disas_cc(DisasContext *s, uint32_t insn)
45
+/* CCMP, CCMN */
46
+static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
22
{
47
{
23
- unsigned vsz = vec_full_reg_size(s);
48
- unsigned int sf, op, y, cond, rn, nzcv, is_imm;
24
- TCGv_i32 desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
49
- TCGv_i32 tcg_t0, tcg_t1, tcg_t2;
25
- TCGv_ptr t_zd = tcg_temp_new_ptr();
50
- TCGv_i64 tcg_tmp, tcg_y, tcg_rn;
26
+ unsigned vsz;
51
+ TCGv_i32 tcg_t0 = tcg_temp_new_i32();
27
+ TCGv_i32 desc;
52
+ TCGv_i32 tcg_t1 = tcg_temp_new_i32();
28
+ TCGv_ptr t_zd;
53
+ TCGv_i32 tcg_t2 = tcg_temp_new_i32();
29
+
54
+ TCGv_i64 tcg_tmp = tcg_temp_new_i64();
30
+ if (!sve_access_check(s)) {
55
+ TCGv_i64 tcg_rn, tcg_y;
31
+ return true;
56
DisasCompare c;
32
+ }
57
-
33
+
58
- if (!extract32(insn, 29, 1)) {
34
+ vsz = vec_full_reg_size(s);
59
- unallocated_encoding(s);
35
+ desc = tcg_constant_i32(simd_desc(vsz, vsz, 0));
60
- return;
36
+ t_zd = tcg_temp_new_ptr();
61
- }
37
62
- if (insn & (1 << 10 | 1 << 4)) {
38
tcg_gen_addi_ptr(t_zd, cpu_env, vec_full_reg_offset(s, rd));
63
- unallocated_encoding(s);
39
if (esz == 3) {
64
- return;
40
@@ -XXX,XX +XXX,XX @@ static void do_index(DisasContext *s, int esz, int rd,
65
- }
41
tcg_temp_free_i32(i32);
66
- sf = extract32(insn, 31, 1);
67
- op = extract32(insn, 30, 1);
68
- is_imm = extract32(insn, 11, 1);
69
- y = extract32(insn, 16, 5); /* y = rm (reg) or imm5 (imm) */
70
- cond = extract32(insn, 12, 4);
71
- rn = extract32(insn, 5, 5);
72
- nzcv = extract32(insn, 0, 4);
73
+ unsigned nzcv;
74
75
/* Set T0 = !COND. */
76
- tcg_t0 = tcg_temp_new_i32();
77
- arm_test_cc(&c, cond);
78
+ arm_test_cc(&c, a->cond);
79
tcg_gen_setcondi_i32(tcg_invert_cond(c.cond), tcg_t0, c.value, 0);
80
81
/* Load the arguments for the new comparison. */
82
- if (is_imm) {
83
- tcg_y = tcg_temp_new_i64();
84
- tcg_gen_movi_i64(tcg_y, y);
85
+ if (a->imm) {
86
+ tcg_y = tcg_constant_i64(a->y);
87
} else {
88
- tcg_y = cpu_reg(s, y);
89
+ tcg_y = cpu_reg(s, a->y);
42
}
90
}
43
tcg_temp_free_ptr(t_zd);
91
- tcg_rn = cpu_reg(s, rn);
92
+ tcg_rn = cpu_reg(s, a->rn);
93
94
/* Set the flags for the new comparison. */
95
- tcg_tmp = tcg_temp_new_i64();
96
- if (op) {
97
- gen_sub_CC(sf, tcg_tmp, tcg_rn, tcg_y);
98
+ if (a->op) {
99
+ gen_sub_CC(a->sf, tcg_tmp, tcg_rn, tcg_y);
100
} else {
101
- gen_add_CC(sf, tcg_tmp, tcg_rn, tcg_y);
102
+ gen_add_CC(a->sf, tcg_tmp, tcg_rn, tcg_y);
103
}
104
105
- /* If COND was false, force the flags to #nzcv. Compute two masks
106
+ /*
107
+ * If COND was false, force the flags to #nzcv. Compute two masks
108
* to help with this: T1 = (COND ? 0 : -1), T2 = (COND ? -1 : 0).
109
* For tcg hosts that support ANDC, we can make do with just T1.
110
* In either case, allow the tcg optimizer to delete any unused mask.
111
*/
112
- tcg_t1 = tcg_temp_new_i32();
113
- tcg_t2 = tcg_temp_new_i32();
114
tcg_gen_neg_i32(tcg_t1, tcg_t0);
115
tcg_gen_subi_i32(tcg_t2, tcg_t0, 1);
116
117
+ nzcv = a->nzcv;
118
if (nzcv & 8) { /* N */
119
tcg_gen_or_i32(cpu_NF, cpu_NF, tcg_t1);
120
} else {
121
@@ -XXX,XX +XXX,XX @@ static void disas_cc(DisasContext *s, uint32_t insn)
122
tcg_gen_and_i32(cpu_VF, cpu_VF, tcg_t2);
123
}
124
}
44
+ return true;
125
+ return true;
45
}
126
}
46
127
47
static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
128
/* Conditional select
48
{
129
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
49
- if (sve_access_check(s)) {
130
}
50
- TCGv_i64 start = tcg_constant_i64(a->imm1);
131
51
- TCGv_i64 incr = tcg_constant_i64(a->imm2);
132
switch (op2) {
52
- do_index(s, a->esz, a->rd, start, incr);
133
- case 0x2: /* Conditional compare */
53
- }
134
- disas_cc(s, insn); /* both imm and reg forms */
54
- return true;
135
- break;
55
+ TCGv_i64 start = tcg_constant_i64(a->imm1);
136
-
56
+ TCGv_i64 incr = tcg_constant_i64(a->imm2);
137
case 0x4: /* Conditional select */
57
+ return do_index(s, a->esz, a->rd, start, incr);
138
disas_cond_select(s, insn);
58
}
139
break;
59
140
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
60
static bool trans_INDEX_ir(DisasContext *s, arg_INDEX_ir *a)
141
default:
61
{
142
do_unallocated:
62
- if (sve_access_check(s)) {
143
case 0x0:
63
- TCGv_i64 start = tcg_constant_i64(a->imm);
144
+ case 0x2: /* Conditional compare */
64
- TCGv_i64 incr = cpu_reg(s, a->rm);
145
case 0x6: /* Data-processing */
65
- do_index(s, a->esz, a->rd, start, incr);
146
case 0x8 ... 0xf: /* (3 source) */
66
- }
147
unallocated_encoding(s);
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
--
148
--
101
2.25.1
149
2.34.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_zzz_ool
3
This includes CSEL, CSINC, CSINV, CSNEG. Remove disas_data_proc_reg,
4
to use TRANS_FEAT and gen_gvec_ool_arg_zzz.
4
as these were the last insns decoded by that function.
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-8-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-20-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 | 88 ++++++++++++++------------------------
11
target/arm/tcg/a64.decode | 3 ++
12
1 file changed, 31 insertions(+), 57 deletions(-)
12
target/arm/tcg/translate-a64.c | 84 ++++++----------------------------
13
2 files changed, 17 insertions(+), 70 deletions(-)
13
14
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
--- a/target/arm/tcg/a64.decode
17
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/tcg/a64.decode
18
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
19
@@ -XXX,XX +XXX,XX @@ SETF16 0 01 11010000 00000 010010 rn:5 01101
20
CCMP sf:1 op:1 1 11010010 y:5 cond:4 imm:1 0 rn:5 0 nzcv:4
21
22
# Conditional select
23
+
24
+CSEL sf:1 else_inv:1 011010100 rm:5 cond:4 0 else_inc:1 rn:5 rd:5
25
+
26
# Data Processing (3-source)
27
28
&rrrr rd rn rm ra
29
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/tcg/translate-a64.c
32
+++ b/target/arm/tcg/translate-a64.c
33
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
19
return true;
34
return true;
20
}
35
}
21
36
22
-static bool do_sve2_zzz_ool(DisasContext *s, arg_rrr_esz *a,
37
-/* Conditional select
23
- gen_helper_gvec_3 *fn)
38
- * 31 30 29 28 21 20 16 15 12 11 10 9 5 4 0
24
-{
39
- * +----+----+---+-----------------+------+------+-----+------+------+
25
- if (!dc_isar_feature(aa64_sve2, s)) {
40
- * | sf | op | S | 1 1 0 1 0 1 0 0 | Rm | cond | op2 | Rn | Rd |
26
- return false;
41
- * +----+----+---+-----------------+------+------+-----+------+------+
42
- */
43
-static void disas_cond_select(DisasContext *s, uint32_t insn)
44
+static bool trans_CSEL(DisasContext *s, arg_CSEL *a)
45
{
46
- unsigned int sf, else_inv, rm, cond, else_inc, rn, rd;
47
- TCGv_i64 tcg_rd, zero;
48
+ TCGv_i64 tcg_rd = cpu_reg(s, a->rd);
49
+ TCGv_i64 zero = tcg_constant_i64(0);
50
DisasCompare64 c;
51
52
- if (extract32(insn, 29, 1) || extract32(insn, 11, 1)) {
53
- /* S == 1 or op2<1> == 1 */
54
- unallocated_encoding(s);
55
- return;
27
- }
56
- }
28
- return gen_gvec_ool_arg_zzz(s, fn, a, 0);
57
- sf = extract32(insn, 31, 1);
29
-}
58
- else_inv = extract32(insn, 30, 1);
30
+static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
59
- rm = extract32(insn, 16, 5);
31
+ gen_helper_gvec_smulh_b, gen_helper_gvec_smulh_h,
60
- cond = extract32(insn, 12, 4);
32
+ gen_helper_gvec_smulh_s, gen_helper_gvec_smulh_d,
61
- else_inc = extract32(insn, 10, 1);
33
+};
62
- rn = extract32(insn, 5, 5);
34
+TRANS_FEAT(SMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
63
- rd = extract32(insn, 0, 5);
35
+ smulh_zzz_fns[a->esz], a, 0)
64
+ a64_test_cc(&c, a->cond);
36
65
37
-static bool trans_SMULH_zzz(DisasContext *s, arg_rrr_esz *a)
66
- tcg_rd = cpu_reg(s, rd);
38
-{
67
-
39
- static gen_helper_gvec_3 * const fns[4] = {
68
- a64_test_cc(&c, cond);
40
- gen_helper_gvec_smulh_b, gen_helper_gvec_smulh_h,
69
- zero = tcg_constant_i64(0);
41
- gen_helper_gvec_smulh_s, gen_helper_gvec_smulh_d,
70
-
42
- };
71
- if (rn == 31 && rm == 31 && (else_inc ^ else_inv)) {
43
- return do_sve2_zzz_ool(s, a, fns[a->esz]);
72
+ if (a->rn == 31 && a->rm == 31 && (a->else_inc ^ a->else_inv)) {
44
-}
73
/* CSET & CSETM. */
45
+static gen_helper_gvec_3 * const umulh_zzz_fns[4] = {
74
- if (else_inv) {
46
+ gen_helper_gvec_umulh_b, gen_helper_gvec_umulh_h,
75
+ if (a->else_inv) {
47
+ gen_helper_gvec_umulh_s, gen_helper_gvec_umulh_d,
76
tcg_gen_negsetcond_i64(tcg_invert_cond(c.cond),
48
+};
77
tcg_rd, c.value, zero);
49
+TRANS_FEAT(UMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
78
} else {
50
+ umulh_zzz_fns[a->esz], a, 0)
79
@@ -XXX,XX +XXX,XX @@ static void disas_cond_select(DisasContext *s, uint32_t insn)
51
80
tcg_rd, c.value, zero);
52
-static bool trans_UMULH_zzz(DisasContext *s, arg_rrr_esz *a)
81
}
53
-{
82
} else {
54
- static gen_helper_gvec_3 * const fns[4] = {
83
- TCGv_i64 t_true = cpu_reg(s, rn);
55
- gen_helper_gvec_umulh_b, gen_helper_gvec_umulh_h,
84
- TCGv_i64 t_false = read_cpu_reg(s, rm, 1);
56
- gen_helper_gvec_umulh_s, gen_helper_gvec_umulh_d,
85
- if (else_inv && else_inc) {
57
- };
86
+ TCGv_i64 t_true = cpu_reg(s, a->rn);
58
- return do_sve2_zzz_ool(s, a, fns[a->esz]);
87
+ TCGv_i64 t_false = read_cpu_reg(s, a->rm, 1);
59
-}
88
+
60
+TRANS_FEAT(PMUL_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
89
+ if (a->else_inv && a->else_inc) {
61
+ gen_helper_gvec_pmul_b, a, 0)
90
tcg_gen_neg_i64(t_false, t_false);
62
91
- } else if (else_inv) {
63
-static bool trans_PMUL_zzz(DisasContext *s, arg_rrr_esz *a)
92
+ } else if (a->else_inv) {
64
-{
93
tcg_gen_not_i64(t_false, t_false);
65
- return do_sve2_zzz_ool(s, a, gen_helper_gvec_pmul_b);
94
- } else if (else_inc) {
66
-}
95
+ } else if (a->else_inc) {
67
+static gen_helper_gvec_3 * const sqdmulh_zzz_fns[4] = {
96
tcg_gen_addi_i64(t_false, t_false, 1);
68
+ gen_helper_sve2_sqdmulh_b, gen_helper_sve2_sqdmulh_h,
97
}
69
+ gen_helper_sve2_sqdmulh_s, gen_helper_sve2_sqdmulh_d,
98
tcg_gen_movcond_i64(c.cond, tcg_rd, c.value, zero, t_true, t_false);
70
+};
99
}
71
+TRANS_FEAT(SQDMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
100
72
+ sqdmulh_zzz_fns[a->esz], a, 0)
101
- if (!sf) {
73
102
+ if (!a->sf) {
74
-static bool trans_SQDMULH_zzz(DisasContext *s, arg_rrr_esz *a)
103
tcg_gen_ext32u_i64(tcg_rd, tcg_rd);
75
-{
104
}
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
-}
105
-}
82
-
106
-
83
-static bool trans_SQRDMULH_zzz(DisasContext *s, arg_rrr_esz *a)
107
-/*
108
- * Data processing - register
109
- * 31 30 29 28 25 21 20 16 10 0
110
- * +--+---+--+---+-------+-----+-------+-------+---------+
111
- * | |op0| |op1| 1 0 1 | op2 | | op3 | |
112
- * +--+---+--+---+-------+-----+-------+-------+---------+
113
- */
114
-static void disas_data_proc_reg(DisasContext *s, uint32_t insn)
84
-{
115
-{
85
- static gen_helper_gvec_3 * const fns[4] = {
116
- int op1 = extract32(insn, 28, 1);
86
- gen_helper_sve2_sqrdmulh_b, gen_helper_sve2_sqrdmulh_h,
117
- int op2 = extract32(insn, 21, 4);
87
- gen_helper_sve2_sqrdmulh_s, gen_helper_sve2_sqrdmulh_d,
118
-
88
- };
119
- if (!op1) {
89
- return do_sve2_zzz_ool(s, a, fns[a->esz]);
120
- goto do_unallocated;
90
-}
121
- }
91
+static gen_helper_gvec_3 * const sqrdmulh_zzz_fns[4] = {
122
-
92
+ gen_helper_sve2_sqrdmulh_b, gen_helper_sve2_sqrdmulh_h,
123
- switch (op2) {
93
+ gen_helper_sve2_sqrdmulh_s, gen_helper_sve2_sqrdmulh_d,
124
- case 0x4: /* Conditional select */
94
+};
125
- disas_cond_select(s, insn);
95
+TRANS_FEAT(SQRDMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
126
- break;
96
+ sqrdmulh_zzz_fns[a->esz], a, 0)
127
-
97
128
- default:
98
/*
129
- do_unallocated:
99
* SVE2 Integer - Predicated
130
- case 0x0:
100
@@ -XXX,XX +XXX,XX @@ static bool trans_UQRSHRNT(DisasContext *s, arg_rri_esz *a)
131
- case 0x2: /* Conditional compare */
132
- case 0x6: /* Data-processing */
133
- case 0x8 ... 0xf: /* (3 source) */
134
- unallocated_encoding(s);
135
- break;
136
- }
137
+ return true;
101
}
138
}
102
139
103
#define DO_SVE2_ZZZ_NARROW(NAME, name) \
140
static void handle_fp_compare(DisasContext *s, int size,
104
-static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
141
@@ -XXX,XX +XXX,XX @@ static bool btype_destination_ok(uint32_t insn, bool bt, int btype)
105
-{ \
142
static void disas_a64_legacy(DisasContext *s, uint32_t insn)
106
- static gen_helper_gvec_3 * const fns[4] = { \
143
{
107
+ static gen_helper_gvec_3 * const name##_fns[4] = { \
144
switch (extract32(insn, 25, 4)) {
108
NULL, gen_helper_sve2_##name##_h, \
145
- case 0x5:
109
gen_helper_sve2_##name##_s, gen_helper_sve2_##name##_d, \
146
- case 0xd: /* Data processing - register */
110
}; \
147
- disas_data_proc_reg(s, insn);
111
- return do_sve2_zzz_ool(s, a, fns[a->esz]); \
148
- break;
112
-}
149
case 0x7:
113
+ TRANS_FEAT(NAME, aa64_sve2, gen_gvec_ool_arg_zzz, \
150
case 0xf: /* Data processing - SIMD and floating point */
114
+ name##_fns[a->esz], a, 0)
151
disas_data_proc_simd_fp(s, insn);
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
--
152
--
135
2.25.1
153
2.34.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
Provide a simple way to check for float64, float32,
4
and float16 support, as well as the fpu enabled.
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: 20241211163036.2297116-21-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/tcg/translate-a64.c | 62 ++++++++++++++++++----------------
9
1 file changed, 23 insertions(+), 29 deletions(-)
12
1 file changed, 32 insertions(+), 30 deletions(-)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/target/arm/tcg/translate-a64.c
14
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/tcg/translate-a64.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 @@ static bool fp_access_check(DisasContext *s)
16
static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a,
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
}
40
+ if (!sve_access_check(s)) {
41
+ return true;
42
+ }
43
+
44
+ vsz = vec_full_reg_size(s);
45
+ tmode = tcg_const_i32(mode);
46
+ status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
47
+
48
+ gen_helper_set_rmode(tmode, tmode, status);
49
+
50
+ tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
51
+ vec_full_reg_offset(s, a->rn),
52
+ pred_full_reg_offset(s, a->pg),
53
+ status, vsz, vsz, 0, fn);
54
+
55
+ gen_helper_set_rmode(tmode, tmode, status);
56
+ tcg_temp_free_i32(tmode);
57
+ tcg_temp_free_ptr(status);
58
return true;
19
return true;
59
}
20
}
60
21
61
static bool trans_FRINTN(DisasContext *s, arg_rpr_esz *a)
22
+/*
23
+ * Return <0 for non-supported element sizes, with MO_16 controlled by
24
+ * FEAT_FP16; return 0 for fp disabled; otherwise return >0 for success.
25
+ */
26
+static int fp_access_check_scalar_hsd(DisasContext *s, MemOp esz)
27
+{
28
+ switch (esz) {
29
+ case MO_64:
30
+ case MO_32:
31
+ break;
32
+ case MO_16:
33
+ if (!dc_isar_feature(aa64_fp16, s)) {
34
+ return -1;
35
+ }
36
+ break;
37
+ default:
38
+ return -1;
39
+ }
40
+ return fp_access_check(s);
41
+}
42
+
43
/*
44
* Check that SVE access is enabled. If it is, return true.
45
* If not, emit code to generate an appropriate exception and return false.
46
@@ -XXX,XX +XXX,XX @@ static bool trans_FCSEL(DisasContext *s, arg_FCSEL *a)
62
{
47
{
63
- if (a->esz == 0) {
48
TCGv_i64 t_true, t_false;
49
DisasCompare64 c;
50
+ int check = fp_access_check_scalar_hsd(s, a->esz);
51
52
- switch (a->esz) {
53
- case MO_32:
54
- case MO_64:
55
- break;
56
- case MO_16:
57
- if (!dc_isar_feature(aa64_fp16, s)) {
58
- return false;
59
- }
60
- break;
61
- default:
64
- return false;
62
- return false;
65
- }
63
- }
66
return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz]);
64
-
67
}
65
- if (!fp_access_check(s)) {
68
66
- return true;
69
static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
67
+ if (check <= 0) {
68
+ return check == 0;
69
}
70
71
/* Zero extend sreg & hreg inputs to 64 bits now. */
72
@@ -XXX,XX +XXX,XX @@ TRANS(FMINV_s, do_fp_reduction, a, gen_helper_vfp_mins)
73
74
static bool trans_FMOVI_s(DisasContext *s, arg_FMOVI_s *a)
70
{
75
{
71
- if (a->esz == 0) {
76
- switch (a->esz) {
77
- case MO_32:
78
- case MO_64:
79
- break;
80
- case MO_16:
81
- if (!dc_isar_feature(aa64_fp16, s)) {
82
- return false;
83
- }
84
- break;
85
- default:
72
- return false;
86
- return false;
73
- }
87
- }
74
return do_frint_mode(s, a, float_round_up, frint_fns[a->esz]);
88
- if (fp_access_check(s)) {
89
- uint64_t imm = vfp_expand_imm(a->esz, a->imm);
90
- write_fp_dreg(s, a->rd, tcg_constant_i64(imm));
91
+ int check = fp_access_check_scalar_hsd(s, a->esz);
92
+ uint64_t imm;
93
+
94
+ if (check <= 0) {
95
+ return check == 0;
96
}
97
+
98
+ imm = vfp_expand_imm(a->esz, a->imm);
99
+ write_fp_dreg(s, a->rd, tcg_constant_i64(imm));
100
return true;
75
}
101
}
76
102
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
101
--
103
--
102
2.25.1
104
2.34.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_zpz_data
3
Provide a simple way to check for float64, float32, and float16
4
to use TRANS_FEAT and gen_gvec_ool_arg_zpz.
4
support vs vector width, as well as the fpu enabled.
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-23-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-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/translate-sve.c | 53 ++++++++++----------------------------
11
target/arm/tcg/translate-a64.c | 135 +++++++++++++--------------------
12
1 file changed, 14 insertions(+), 39 deletions(-)
12
1 file changed, 54 insertions(+), 81 deletions(-)
13
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
16
--- a/target/arm/tcg/translate-a64.c
17
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/tcg/translate-a64.c
18
@@ -XXX,XX +XXX,XX @@ static bool trans_UADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
18
@@ -XXX,XX +XXX,XX @@ static int fp_access_check_scalar_hsd(DisasContext *s, MemOp esz)
19
* SVE2 integer unary operations (predicated)
19
return fp_access_check(s);
20
*/
20
}
21
21
22
-static bool do_sve2_zpz_ool(DisasContext *s, arg_rpr_esz *a,
22
+/* Likewise, but vector MO_64 must have two elements. */
23
- gen_helper_gvec_3 *fn)
23
+static int fp_access_check_vector_hsd(DisasContext *s, bool is_q, MemOp esz)
24
-{
24
+{
25
- if (!dc_isar_feature(aa64_sve2, s)) {
25
+ switch (esz) {
26
+ case MO_64:
27
+ if (!is_q) {
28
+ return -1;
29
+ }
30
+ break;
31
+ case MO_32:
32
+ break;
33
+ case MO_16:
34
+ if (!dc_isar_feature(aa64_fp16, s)) {
35
+ return -1;
36
+ }
37
+ break;
38
+ default:
39
+ return -1;
40
+ }
41
+ return fp_access_check(s);
42
+}
43
+
44
/*
45
* Check that SVE access is enabled. If it is, return true.
46
* If not, emit code to generate an appropriate exception and return false.
47
@@ -XXX,XX +XXX,XX @@ static bool do_fp3_vector(DisasContext *s, arg_qrrr_e *a, int data,
48
gen_helper_gvec_3_ptr * const fns[3])
49
{
50
MemOp esz = a->esz;
51
+ int check = fp_access_check_vector_hsd(s, a->q, esz);
52
53
- switch (esz) {
54
- case MO_64:
55
- if (!a->q) {
56
- return false;
57
- }
58
- break;
59
- case MO_32:
60
- break;
61
- case MO_16:
62
- if (!dc_isar_feature(aa64_fp16, s)) {
63
- return false;
64
- }
65
- break;
66
- default:
26
- return false;
67
- return false;
27
- }
68
- }
28
- return gen_gvec_ool_arg_zpz(s, fn, a, 0);
69
- if (fp_access_check(s)) {
29
-}
70
- gen_gvec_op3_fpst(s, a->q, a->rd, a->rn, a->rm,
30
+TRANS_FEAT(URECPE, aa64_sve2, gen_gvec_ool_arg_zpz,
71
- esz == MO_16, data, fns[esz - 1]);
31
+ a->esz == 2 ? gen_helper_sve2_urecpe_s : NULL, a, 0)
72
+ if (check <= 0) {
32
73
+ return check == 0;
33
-static bool trans_URECPE(DisasContext *s, arg_rpr_esz *a)
74
}
34
-{
75
+
35
- if (a->esz != 2) {
76
+ gen_gvec_op3_fpst(s, a->q, a->rd, a->rn, a->rm,
77
+ esz == MO_16, data, fns[esz - 1]);
78
return true;
79
}
80
81
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FCADD_270, aa64_fcma, do_fp3_vector, a, 1, f_vector_fcadd)
82
83
static bool trans_FCMLA_v(DisasContext *s, arg_FCMLA_v *a)
84
{
85
- gen_helper_gvec_4_ptr *fn;
86
+ static gen_helper_gvec_4_ptr * const fn[] = {
87
+ [MO_16] = gen_helper_gvec_fcmlah,
88
+ [MO_32] = gen_helper_gvec_fcmlas,
89
+ [MO_64] = gen_helper_gvec_fcmlad,
90
+ };
91
+ int check;
92
93
if (!dc_isar_feature(aa64_fcma, s)) {
94
return false;
95
}
96
- switch (a->esz) {
97
- case MO_64:
98
- if (!a->q) {
99
- return false;
100
- }
101
- fn = gen_helper_gvec_fcmlad;
102
- break;
103
- case MO_32:
104
- fn = gen_helper_gvec_fcmlas;
105
- break;
106
- case MO_16:
107
- if (!dc_isar_feature(aa64_fp16, s)) {
108
- return false;
109
- }
110
- fn = gen_helper_gvec_fcmlah;
111
- break;
112
- default:
36
- return false;
113
- return false;
37
- }
114
- }
38
- return do_sve2_zpz_ool(s, a, gen_helper_sve2_urecpe_s);
115
- if (fp_access_check(s)) {
39
-}
116
- gen_gvec_op4_fpst(s, a->q, a->rd, a->rn, a->rm, a->rd,
40
+TRANS_FEAT(URSQRTE, aa64_sve2, gen_gvec_ool_arg_zpz,
117
- a->esz == MO_16, a->rot, fn);
41
+ a->esz == 2 ? gen_helper_sve2_ursqrte_s : NULL, a, 0)
118
+
42
119
+ check = fp_access_check_vector_hsd(s, a->q, a->esz);
43
-static bool trans_URSQRTE(DisasContext *s, arg_rpr_esz *a)
120
+ if (check <= 0) {
44
-{
121
+ return check == 0;
45
- if (a->esz != 2) {
122
}
46
- return false;
123
+
47
- }
124
+ gen_gvec_op4_fpst(s, a->q, a->rd, a->rn, a->rm, a->rd,
48
- return do_sve2_zpz_ool(s, a, gen_helper_sve2_ursqrte_s);
125
+ a->esz == MO_16, a->rot, fn[a->esz]);
49
-}
126
return true;
50
+static gen_helper_gvec_3 * const sqabs_fns[4] = {
127
}
51
+ gen_helper_sve2_sqabs_b, gen_helper_sve2_sqabs_h,
128
52
+ gen_helper_sve2_sqabs_s, gen_helper_sve2_sqabs_d,
129
@@ -XXX,XX +XXX,XX @@ static bool do_fp3_vector_idx(DisasContext *s, arg_qrrx_e *a,
53
+};
130
gen_helper_gvec_3_ptr * const fns[3])
54
+TRANS_FEAT(SQABS, aa64_sve2, gen_gvec_ool_arg_zpz, sqabs_fns[a->esz], a, 0)
131
{
55
132
MemOp esz = a->esz;
56
-static bool trans_SQABS(DisasContext *s, arg_rpr_esz *a)
133
+ int check = fp_access_check_vector_hsd(s, a->q, esz);
57
-{
134
58
- static gen_helper_gvec_3 * const fns[4] = {
135
- switch (esz) {
59
- gen_helper_sve2_sqabs_b, gen_helper_sve2_sqabs_h,
136
- case MO_64:
60
- gen_helper_sve2_sqabs_s, gen_helper_sve2_sqabs_d,
137
- if (!a->q) {
61
- };
138
- return false;
62
- return do_sve2_zpz_ool(s, a, fns[a->esz]);
139
- }
63
-}
140
- break;
64
-
141
- case MO_32:
65
-static bool trans_SQNEG(DisasContext *s, arg_rpr_esz *a)
142
- break;
66
-{
143
- case MO_16:
67
- static gen_helper_gvec_3 * const fns[4] = {
144
- if (!dc_isar_feature(aa64_fp16, s)) {
68
- gen_helper_sve2_sqneg_b, gen_helper_sve2_sqneg_h,
145
- return false;
69
- gen_helper_sve2_sqneg_s, gen_helper_sve2_sqneg_d,
146
- }
70
- };
147
- break;
71
- return do_sve2_zpz_ool(s, a, fns[a->esz]);
148
- default:
72
-}
149
- g_assert_not_reached();
73
+static gen_helper_gvec_3 * const sqneg_fns[4] = {
150
- }
74
+ gen_helper_sve2_sqneg_b, gen_helper_sve2_sqneg_h,
151
- if (fp_access_check(s)) {
75
+ gen_helper_sve2_sqneg_s, gen_helper_sve2_sqneg_d,
152
- gen_gvec_op3_fpst(s, a->q, a->rd, a->rn, a->rm,
76
+};
153
- esz == MO_16, a->idx, fns[esz - 1]);
77
+TRANS_FEAT(SQNEG, aa64_sve2, gen_gvec_ool_arg_zpz, sqneg_fns[a->esz], a, 0)
154
+ if (check <= 0) {
78
155
+ return check == 0;
79
#define DO_SVE2_ZPZZ(NAME, name) \
156
}
80
static bool trans_##NAME(DisasContext *s, arg_rprr_esz *a) \
157
+
158
+ gen_gvec_op3_fpst(s, a->q, a->rd, a->rn, a->rm,
159
+ esz == MO_16, a->idx, fns[esz - 1]);
160
return true;
161
}
162
163
@@ -XXX,XX +XXX,XX @@ static bool do_fmla_vector_idx(DisasContext *s, arg_qrrx_e *a, bool neg)
164
gen_helper_gvec_fmla_idx_d,
165
};
166
MemOp esz = a->esz;
167
+ int check = fp_access_check_vector_hsd(s, a->q, esz);
168
169
- switch (esz) {
170
- case MO_64:
171
- if (!a->q) {
172
- return false;
173
- }
174
- break;
175
- case MO_32:
176
- break;
177
- case MO_16:
178
- if (!dc_isar_feature(aa64_fp16, s)) {
179
- return false;
180
- }
181
- break;
182
- default:
183
- g_assert_not_reached();
184
- }
185
- if (fp_access_check(s)) {
186
- gen_gvec_op4_fpst(s, a->q, a->rd, a->rn, a->rm, a->rd,
187
- esz == MO_16, (a->idx << 1) | neg,
188
- fns[esz - 1]);
189
+ if (check <= 0) {
190
+ return check == 0;
191
}
192
+
193
+ gen_gvec_op4_fpst(s, a->q, a->rd, a->rn, a->rm, a->rd,
194
+ esz == MO_16, (a->idx << 1) | neg,
195
+ fns[esz - 1]);
196
return true;
197
}
198
81
--
199
--
82
2.25.1
200
2.34.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-50-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-23-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 | 35 ++++++++---------------------------
8
target/arm/tcg/a64.decode | 8 +
9
1 file changed, 8 insertions(+), 27 deletions(-)
9
target/arm/tcg/translate-a64.c | 283 ++++++++++++---------------------
10
2 files changed, 112 insertions(+), 179 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_index(DisasContext *s, int esz, int rd,
16
@@ -XXX,XX +XXX,XX @@ FMINV_s 0110 1110 10 11000 01111 10 ..... ..... @rr_q1e2
17
18
FMOVI_s 0001 1110 .. 1 imm:8 100 00000 rd:5 esz=%esz_hsd
19
20
+# Floating-point Compare
21
+
22
+FCMP 00011110 .. 1 rm:5 001000 rn:5 e:1 z:1 000 esz=%esz_hsd
23
+
24
+# Floating-point Conditional Compare
25
+
26
+FCCMP 00011110 .. 1 rm:5 cond:4 01 rn:5 e:1 nzcv:4 esz=%esz_hsd
27
+
28
# Advanced SIMD Modified Immediate / Shift by Immediate
29
30
%abcdefgh 16:3 5:5
31
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/tcg/translate-a64.c
34
+++ b/target/arm/tcg/translate-a64.c
35
@@ -XXX,XX +XXX,XX @@ static bool trans_FMOVI_s(DisasContext *s, arg_FMOVI_s *a)
16
return true;
36
return true;
17
}
37
}
18
38
19
-static bool trans_INDEX_ii(DisasContext *s, arg_INDEX_ii *a)
39
+/*
40
+ * Floating point compare, conditional compare
41
+ */
42
+
43
+static void handle_fp_compare(DisasContext *s, int size,
44
+ unsigned int rn, unsigned int rm,
45
+ bool cmp_with_zero, bool signal_all_nans)
46
+{
47
+ TCGv_i64 tcg_flags = tcg_temp_new_i64();
48
+ TCGv_ptr fpst = fpstatus_ptr(size == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
49
+
50
+ if (size == MO_64) {
51
+ TCGv_i64 tcg_vn, tcg_vm;
52
+
53
+ tcg_vn = read_fp_dreg(s, rn);
54
+ if (cmp_with_zero) {
55
+ tcg_vm = tcg_constant_i64(0);
56
+ } else {
57
+ tcg_vm = read_fp_dreg(s, rm);
58
+ }
59
+ if (signal_all_nans) {
60
+ gen_helper_vfp_cmped_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
61
+ } else {
62
+ gen_helper_vfp_cmpd_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
63
+ }
64
+ } else {
65
+ TCGv_i32 tcg_vn = tcg_temp_new_i32();
66
+ TCGv_i32 tcg_vm = tcg_temp_new_i32();
67
+
68
+ read_vec_element_i32(s, tcg_vn, rn, 0, size);
69
+ if (cmp_with_zero) {
70
+ tcg_gen_movi_i32(tcg_vm, 0);
71
+ } else {
72
+ read_vec_element_i32(s, tcg_vm, rm, 0, size);
73
+ }
74
+
75
+ switch (size) {
76
+ case MO_32:
77
+ if (signal_all_nans) {
78
+ gen_helper_vfp_cmpes_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
79
+ } else {
80
+ gen_helper_vfp_cmps_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
81
+ }
82
+ break;
83
+ case MO_16:
84
+ if (signal_all_nans) {
85
+ gen_helper_vfp_cmpeh_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
86
+ } else {
87
+ gen_helper_vfp_cmph_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
88
+ }
89
+ break;
90
+ default:
91
+ g_assert_not_reached();
92
+ }
93
+ }
94
+
95
+ gen_set_nzcv(tcg_flags);
96
+}
97
+
98
+/* FCMP, FCMPE */
99
+static bool trans_FCMP(DisasContext *s, arg_FCMP *a)
100
+{
101
+ int check = fp_access_check_scalar_hsd(s, a->esz);
102
+
103
+ if (check <= 0) {
104
+ return check == 0;
105
+ }
106
+
107
+ handle_fp_compare(s, a->esz, a->rn, a->rm, a->z, a->e);
108
+ return true;
109
+}
110
+
111
+/* FCCMP, FCCMPE */
112
+static bool trans_FCCMP(DisasContext *s, arg_FCCMP *a)
113
+{
114
+ TCGLabel *label_continue = NULL;
115
+ int check = fp_access_check_scalar_hsd(s, a->esz);
116
+
117
+ if (check <= 0) {
118
+ return check == 0;
119
+ }
120
+
121
+ if (a->cond < 0x0e) { /* not always */
122
+ TCGLabel *label_match = gen_new_label();
123
+ label_continue = gen_new_label();
124
+ arm_gen_test_cc(a->cond, label_match);
125
+ /* nomatch: */
126
+ gen_set_nzcv(tcg_constant_i64(a->nzcv << 28));
127
+ tcg_gen_br(label_continue);
128
+ gen_set_label(label_match);
129
+ }
130
+
131
+ handle_fp_compare(s, a->esz, a->rn, a->rm, false, a->e);
132
+
133
+ if (label_continue) {
134
+ gen_set_label(label_continue);
135
+ }
136
+ return true;
137
+}
138
+
139
/*
140
* Advanced SIMD Modified Immediate
141
*/
142
@@ -XXX,XX +XXX,XX @@ static bool trans_CSEL(DisasContext *s, arg_CSEL *a)
143
return true;
144
}
145
146
-static void handle_fp_compare(DisasContext *s, int size,
147
- unsigned int rn, unsigned int rm,
148
- bool cmp_with_zero, bool signal_all_nans)
20
-{
149
-{
21
- TCGv_i64 start = tcg_constant_i64(a->imm1);
150
- TCGv_i64 tcg_flags = tcg_temp_new_i64();
22
- TCGv_i64 incr = tcg_constant_i64(a->imm2);
151
- TCGv_ptr fpst = fpstatus_ptr(size == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
23
- return do_index(s, a->esz, a->rd, start, incr);
152
-
153
- if (size == MO_64) {
154
- TCGv_i64 tcg_vn, tcg_vm;
155
-
156
- tcg_vn = read_fp_dreg(s, rn);
157
- if (cmp_with_zero) {
158
- tcg_vm = tcg_constant_i64(0);
159
- } else {
160
- tcg_vm = read_fp_dreg(s, rm);
161
- }
162
- if (signal_all_nans) {
163
- gen_helper_vfp_cmped_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
164
- } else {
165
- gen_helper_vfp_cmpd_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
166
- }
167
- } else {
168
- TCGv_i32 tcg_vn = tcg_temp_new_i32();
169
- TCGv_i32 tcg_vm = tcg_temp_new_i32();
170
-
171
- read_vec_element_i32(s, tcg_vn, rn, 0, size);
172
- if (cmp_with_zero) {
173
- tcg_gen_movi_i32(tcg_vm, 0);
174
- } else {
175
- read_vec_element_i32(s, tcg_vm, rm, 0, size);
176
- }
177
-
178
- switch (size) {
179
- case MO_32:
180
- if (signal_all_nans) {
181
- gen_helper_vfp_cmpes_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
182
- } else {
183
- gen_helper_vfp_cmps_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
184
- }
185
- break;
186
- case MO_16:
187
- if (signal_all_nans) {
188
- gen_helper_vfp_cmpeh_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
189
- } else {
190
- gen_helper_vfp_cmph_a64(tcg_flags, tcg_vn, tcg_vm, fpst);
191
- }
192
- break;
193
- default:
194
- g_assert_not_reached();
195
- }
196
- }
197
-
198
- gen_set_nzcv(tcg_flags);
24
-}
199
-}
25
-
200
-
26
-static bool trans_INDEX_ir(DisasContext *s, arg_INDEX_ir *a)
201
-/* Floating point compare
202
- * 31 30 29 28 24 23 22 21 20 16 15 14 13 10 9 5 4 0
203
- * +---+---+---+-----------+------+---+------+-----+---------+------+-------+
204
- * | M | 0 | S | 1 1 1 1 0 | type | 1 | Rm | op | 1 0 0 0 | Rn | op2 |
205
- * +---+---+---+-----------+------+---+------+-----+---------+------+-------+
206
- */
207
-static void disas_fp_compare(DisasContext *s, uint32_t insn)
27
-{
208
-{
28
- TCGv_i64 start = tcg_constant_i64(a->imm);
209
- unsigned int mos, type, rm, op, rn, opc, op2r;
29
- TCGv_i64 incr = cpu_reg(s, a->rm);
210
- int size;
30
- return do_index(s, a->esz, a->rd, start, incr);
211
-
212
- mos = extract32(insn, 29, 3);
213
- type = extract32(insn, 22, 2);
214
- rm = extract32(insn, 16, 5);
215
- op = extract32(insn, 14, 2);
216
- rn = extract32(insn, 5, 5);
217
- opc = extract32(insn, 3, 2);
218
- op2r = extract32(insn, 0, 3);
219
-
220
- if (mos || op || op2r) {
221
- unallocated_encoding(s);
222
- return;
223
- }
224
-
225
- switch (type) {
226
- case 0:
227
- size = MO_32;
228
- break;
229
- case 1:
230
- size = MO_64;
231
- break;
232
- case 3:
233
- size = MO_16;
234
- if (dc_isar_feature(aa64_fp16, s)) {
235
- break;
236
- }
237
- /* fallthru */
238
- default:
239
- unallocated_encoding(s);
240
- return;
241
- }
242
-
243
- if (!fp_access_check(s)) {
244
- return;
245
- }
246
-
247
- handle_fp_compare(s, size, rn, rm, opc & 1, opc & 2);
31
-}
248
-}
32
-
249
-
33
-static bool trans_INDEX_ri(DisasContext *s, arg_INDEX_ri *a)
250
-/* Floating point conditional compare
251
- * 31 30 29 28 24 23 22 21 20 16 15 12 11 10 9 5 4 3 0
252
- * +---+---+---+-----------+------+---+------+------+-----+------+----+------+
253
- * | M | 0 | S | 1 1 1 1 0 | type | 1 | Rm | cond | 0 1 | Rn | op | nzcv |
254
- * +---+---+---+-----------+------+---+------+------+-----+------+----+------+
255
- */
256
-static void disas_fp_ccomp(DisasContext *s, uint32_t insn)
34
-{
257
-{
35
- TCGv_i64 start = cpu_reg(s, a->rn);
258
- unsigned int mos, type, rm, cond, rn, op, nzcv;
36
- TCGv_i64 incr = tcg_constant_i64(a->imm);
259
- TCGLabel *label_continue = NULL;
37
- return do_index(s, a->esz, a->rd, start, incr);
260
- int size;
261
-
262
- mos = extract32(insn, 29, 3);
263
- type = extract32(insn, 22, 2);
264
- rm = extract32(insn, 16, 5);
265
- cond = extract32(insn, 12, 4);
266
- rn = extract32(insn, 5, 5);
267
- op = extract32(insn, 4, 1);
268
- nzcv = extract32(insn, 0, 4);
269
-
270
- if (mos) {
271
- unallocated_encoding(s);
272
- return;
273
- }
274
-
275
- switch (type) {
276
- case 0:
277
- size = MO_32;
278
- break;
279
- case 1:
280
- size = MO_64;
281
- break;
282
- case 3:
283
- size = MO_16;
284
- if (dc_isar_feature(aa64_fp16, s)) {
285
- break;
286
- }
287
- /* fallthru */
288
- default:
289
- unallocated_encoding(s);
290
- return;
291
- }
292
-
293
- if (!fp_access_check(s)) {
294
- return;
295
- }
296
-
297
- if (cond < 0x0e) { /* not always */
298
- TCGLabel *label_match = gen_new_label();
299
- label_continue = gen_new_label();
300
- arm_gen_test_cc(cond, label_match);
301
- /* nomatch: */
302
- gen_set_nzcv(tcg_constant_i64(nzcv << 28));
303
- tcg_gen_br(label_continue);
304
- gen_set_label(label_match);
305
- }
306
-
307
- handle_fp_compare(s, size, rn, rm, false, op);
308
-
309
- if (cond < 0x0e) {
310
- gen_set_label(label_continue);
311
- }
38
-}
312
-}
39
-
313
-
40
-static bool trans_INDEX_rr(DisasContext *s, arg_INDEX_rr *a)
314
/* Floating-point data-processing (1 source) - half precision */
41
-{
315
static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
42
- TCGv_i64 start = cpu_reg(s, a->rn);
316
{
43
- TCGv_i64 incr = cpu_reg(s, a->rm);
317
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_fp(DisasContext *s, uint32_t insn)
44
- return do_index(s, a->esz, a->rd, start, incr);
318
disas_fp_fixed_conv(s, insn);
45
-}
319
} else {
46
+TRANS_FEAT(INDEX_ii, aa64_sve, do_index, a->esz, a->rd,
320
switch (extract32(insn, 10, 2)) {
47
+ tcg_constant_i64(a->imm1), tcg_constant_i64(a->imm2))
321
- case 1:
48
+TRANS_FEAT(INDEX_ir, aa64_sve, do_index, a->esz, a->rd,
322
- /* Floating point conditional compare */
49
+ tcg_constant_i64(a->imm), cpu_reg(s, a->rm))
323
- disas_fp_ccomp(s, insn);
50
+TRANS_FEAT(INDEX_ri, aa64_sve, do_index, a->esz, a->rd,
324
- break;
51
+ cpu_reg(s, a->rn), tcg_constant_i64(a->imm))
325
- case 2:
52
+TRANS_FEAT(INDEX_rr, aa64_sve, do_index, a->esz, a->rd,
326
- /* Floating point data-processing (2 source) */
53
+ cpu_reg(s, a->rn), cpu_reg(s, a->rm))
327
- unallocated_encoding(s); /* in decodetree */
54
328
- break;
55
/*
329
- case 3:
56
*** SVE Stack Allocation Group
330
- /* Floating point conditional select */
331
+ case 1: /* Floating point conditional compare */
332
+ case 2: /* Floating point data-processing (2 source) */
333
+ case 3: /* Floating point conditional select */
334
unallocated_encoding(s); /* in decodetree */
335
break;
336
case 0:
337
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_fp(DisasContext *s, uint32_t insn)
338
break;
339
case 1: /* [15:12] == xx10 */
340
/* Floating point compare */
341
- disas_fp_compare(s, insn);
342
+ unallocated_encoding(s); /* in decodetree */
343
break;
344
case 2: /* [15:12] == x100 */
345
/* Floating point data-processing (1 source) */
57
--
346
--
58
2.25.1
347
2.34.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
These opcodes are only supported as vector operations,
4
not as advsimd scalar. Set only_in_vector, and remove
5
the unreachable implementation of scalar fneg.
6
7
Reported-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-88-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
Message-id: 20241211163036.2297116-24-richard.henderson@linaro.org
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
12
---
8
target/arm/translate-sve.c | 26 +++++++-------------------
13
target/arm/tcg/translate-a64.c | 6 +++---
9
1 file changed, 7 insertions(+), 19 deletions(-)
14
1 file changed, 3 insertions(+), 3 deletions(-)
10
15
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
18
--- a/target/arm/tcg/translate-a64.c
14
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/tcg/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FMLS_zzxz, aa64_sve, do_FMLA_zzxz, a, true)
20
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
16
*** SVE Floating Point Multiply Indexed Group
21
break;
17
*/
22
case 0x2f: /* FABS */
18
23
case 0x6f: /* FNEG */
19
-static bool trans_FMUL_zzx(DisasContext *s, arg_FMUL_zzx *a)
24
+ only_in_vector = true;
20
-{
25
need_fpst = false;
21
- static gen_helper_gvec_3_ptr * const fns[3] = {
26
break;
22
- gen_helper_gvec_fmul_idx_h,
27
case 0x7d: /* FRSQRTE */
23
- gen_helper_gvec_fmul_idx_s,
28
+ break;
24
- gen_helper_gvec_fmul_idx_d,
29
case 0x7f: /* FSQRT (vector) */
25
- };
30
+ only_in_vector = true;
26
-
31
break;
27
- if (sve_access_check(s)) {
32
default:
28
- unsigned vsz = vec_full_reg_size(s);
33
unallocated_encoding(s);
29
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
34
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
30
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
35
case 0x7b: /* FCVTZU */
31
- vec_full_reg_offset(s, a->rn),
36
gen_helper_advsimd_f16touinth(tcg_res, tcg_op, tcg_fpstatus);
32
- vec_full_reg_offset(s, a->rm),
37
break;
33
- status, vsz, vsz, a->index, fns[a->esz - 1]);
38
- case 0x6f: /* FNEG */
34
- tcg_temp_free_ptr(status);
39
- tcg_gen_xori_i32(tcg_res, tcg_op, 0x8000);
35
- }
40
- break;
36
- return true;
41
case 0x7d: /* FRSQRTE */
37
-}
42
gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus);
38
+static gen_helper_gvec_3_ptr * const fmul_idx_fns[4] = {
43
break;
39
+ NULL, gen_helper_gvec_fmul_idx_h,
40
+ gen_helper_gvec_fmul_idx_s, gen_helper_gvec_fmul_idx_d,
41
+};
42
+TRANS_FEAT(FMUL_zzx, aa64_sve, gen_gvec_fpst_zzz,
43
+ fmul_idx_fns[a->esz], a->rd, a->rn, a->rm, a->index,
44
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR)
45
46
/*
47
*** SVE Floating Point Fast Reduction Group
48
--
44
--
49
2.25.1
45
2.34.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
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-42-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-25-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 | 21 +++++++++++++--------
8
target/arm/tcg/a64.decode | 7 +++
11
1 file changed, 13 insertions(+), 8 deletions(-)
9
target/arm/tcg/translate-a64.c | 105 +++++++++++++++++++++++----------
10
2 files changed, 81 insertions(+), 31 deletions(-)
12
11
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
14
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
16
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
17
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fn_zzi(DisasContext *s, GVecGen2iFn *gvec_fn,
16
@@ -XXX,XX +XXX,XX @@
17
@rr_h ........ ... ..... ...... rn:5 rd:5 &rr_e esz=1
18
@rr_d ........ ... ..... ...... rn:5 rd:5 &rr_e esz=3
19
@rr_sd ........ ... ..... ...... rn:5 rd:5 &rr_e esz=%esz_sd
20
+@rr_hsd ........ ... ..... ...... rn:5 rd:5 &rr_e esz=%esz_hsd
21
22
@rrr_b ........ ... rm:5 ...... rn:5 rd:5 &rrr_e esz=0
23
@rrr_h ........ ... rm:5 ...... rn:5 rd:5 &rrr_e esz=1
24
@@ -XXX,XX +XXX,XX @@ FMAXV_s 0110 1110 00 11000 01111 10 ..... ..... @rr_q1e2
25
FMINV_h 0.00 1110 10 11000 01111 10 ..... ..... @qrr_h
26
FMINV_s 0110 1110 10 11000 01111 10 ..... ..... @rr_q1e2
27
28
+# Floating-point data processing (1 source)
29
+
30
+FMOV_s 00011110 .. 1 000000 10000 ..... ..... @rr_hsd
31
+FABS_s 00011110 .. 1 000001 10000 ..... ..... @rr_hsd
32
+FNEG_s 00011110 .. 1 000010 10000 ..... ..... @rr_hsd
33
+
34
# Floating-point Immediate
35
36
FMOVI_s 0001 1110 .. 1 imm:8 100 00000 rd:5 esz=%esz_hsd
37
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/tcg/translate-a64.c
40
+++ b/target/arm/tcg/translate-a64.c
41
@@ -XXX,XX +XXX,XX @@ static bool trans_CSEL(DisasContext *s, arg_CSEL *a)
18
return true;
42
return true;
19
}
43
}
20
44
21
+static bool gen_gvec_fn_arg_zzi(DisasContext *s, GVecGen2iFn *gvec_fn,
45
+typedef struct FPScalar1Int {
22
+ arg_rri_esz *a)
46
+ void (*gen_h)(TCGv_i32, TCGv_i32);
47
+ void (*gen_s)(TCGv_i32, TCGv_i32);
48
+ void (*gen_d)(TCGv_i64, TCGv_i64);
49
+} FPScalar1Int;
50
+
51
+static bool do_fp1_scalar_int(DisasContext *s, arg_rr_e *a,
52
+ const FPScalar1Int *f)
23
+{
53
+{
24
+ if (a->esz < 0) {
54
+ switch (a->esz) {
25
+ /* Invalid tsz encoding -- see tszimm_esz. */
55
+ case MO_64:
56
+ if (fp_access_check(s)) {
57
+ TCGv_i64 t = read_fp_dreg(s, a->rn);
58
+ f->gen_d(t, t);
59
+ write_fp_dreg(s, a->rd, t);
60
+ }
61
+ break;
62
+ case MO_32:
63
+ if (fp_access_check(s)) {
64
+ TCGv_i32 t = read_fp_sreg(s, a->rn);
65
+ f->gen_s(t, t);
66
+ write_fp_sreg(s, a->rd, t);
67
+ }
68
+ break;
69
+ case MO_16:
70
+ if (!dc_isar_feature(aa64_fp16, s)) {
71
+ return false;
72
+ }
73
+ if (fp_access_check(s)) {
74
+ TCGv_i32 t = read_fp_hreg(s, a->rn);
75
+ f->gen_h(t, t);
76
+ write_fp_sreg(s, a->rd, t);
77
+ }
78
+ break;
79
+ default:
26
+ return false;
80
+ return false;
27
+ }
81
+ }
28
+ return gen_gvec_fn_zzi(s, gvec_fn, a->esz, a->rd, a->rn, a->imm);
82
+ return true;
29
+}
83
+}
30
+
84
+
31
/* Invoke a vector expander on three Zregs. */
85
+static const FPScalar1Int f_scalar_fmov = {
32
static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
86
+ tcg_gen_mov_i32,
33
int esz, int rd, int rn, int rm)
87
+ tcg_gen_mov_i32,
34
@@ -XXX,XX +XXX,XX @@ static bool trans_ADD_zzi(DisasContext *s, arg_rri_esz *a)
88
+ tcg_gen_mov_i64,
35
if (a->esz == 0 && extract32(s->insn, 13, 1)) {
89
+};
36
return false;
90
+TRANS(FMOV_s, do_fp1_scalar_int, a, &f_scalar_fmov)
37
}
91
+
38
- if (sve_access_check(s)) {
92
+static const FPScalar1Int f_scalar_fabs = {
39
- unsigned vsz = vec_full_reg_size(s);
93
+ gen_vfp_absh,
40
- tcg_gen_gvec_addi(a->esz, vec_full_reg_offset(s, a->rd),
94
+ gen_vfp_abss,
41
- vec_full_reg_offset(s, a->rn), a->imm, vsz, vsz);
95
+ gen_vfp_absd,
96
+};
97
+TRANS(FABS_s, do_fp1_scalar_int, a, &f_scalar_fabs)
98
+
99
+static const FPScalar1Int f_scalar_fneg = {
100
+ gen_vfp_negh,
101
+ gen_vfp_negs,
102
+ gen_vfp_negd,
103
+};
104
+TRANS(FNEG_s, do_fp1_scalar_int, a, &f_scalar_fneg)
105
+
106
/* Floating-point data-processing (1 source) - half precision */
107
static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
108
{
109
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
110
TCGv_i32 tcg_res = tcg_temp_new_i32();
111
112
switch (opcode) {
113
- case 0x0: /* FMOV */
114
- tcg_gen_mov_i32(tcg_res, tcg_op);
115
- break;
116
- case 0x1: /* FABS */
117
- gen_vfp_absh(tcg_res, tcg_op);
118
- break;
119
- case 0x2: /* FNEG */
120
- gen_vfp_negh(tcg_res, tcg_op);
121
- break;
122
case 0x3: /* FSQRT */
123
fpst = fpstatus_ptr(FPST_FPCR_F16);
124
gen_helper_sqrt_f16(tcg_res, tcg_op, fpst);
125
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
126
gen_helper_advsimd_rinth(tcg_res, tcg_op, fpst);
127
break;
128
default:
129
+ case 0x0: /* FMOV */
130
+ case 0x1: /* FABS */
131
+ case 0x2: /* FNEG */
132
g_assert_not_reached();
133
}
134
135
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
136
tcg_res = tcg_temp_new_i32();
137
138
switch (opcode) {
139
- case 0x0: /* FMOV */
140
- tcg_gen_mov_i32(tcg_res, tcg_op);
141
- goto done;
142
- case 0x1: /* FABS */
143
- gen_vfp_abss(tcg_res, tcg_op);
144
- goto done;
145
- case 0x2: /* FNEG */
146
- gen_vfp_negs(tcg_res, tcg_op);
147
- goto done;
148
case 0x3: /* FSQRT */
149
gen_helper_vfp_sqrts(tcg_res, tcg_op, tcg_env);
150
goto done;
151
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
152
gen_fpst = gen_helper_frint64_s;
153
break;
154
default:
155
+ case 0x0: /* FMOV */
156
+ case 0x1: /* FABS */
157
+ case 0x2: /* FNEG */
158
g_assert_not_reached();
159
}
160
161
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn)
162
TCGv_ptr fpst;
163
int rmode = -1;
164
165
- switch (opcode) {
166
- case 0x0: /* FMOV */
167
- gen_gvec_fn2(s, false, rd, rn, tcg_gen_gvec_mov, 0);
168
- return;
42
- }
169
- }
43
- return true;
170
-
44
+ return gen_gvec_fn_arg_zzi(s, tcg_gen_gvec_addi, a);
171
tcg_op = read_fp_dreg(s, rn);
45
}
172
tcg_res = tcg_temp_new_i64();
46
173
47
static bool trans_SUB_zzi(DisasContext *s, arg_rri_esz *a)
174
switch (opcode) {
48
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(ADCLT, aa64_sve2, do_adcl, a, true)
175
- case 0x1: /* FABS */
49
176
- gen_vfp_absd(tcg_res, tcg_op);
50
static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
177
- goto done;
51
{
178
- case 0x2: /* FNEG */
52
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
179
- gen_vfp_negd(tcg_res, tcg_op);
53
+ if (!dc_isar_feature(aa64_sve2, s)) {
180
- goto done;
54
return false;
181
case 0x3: /* FSQRT */
55
}
182
gen_helper_vfp_sqrtd(tcg_res, tcg_op, tcg_env);
56
- return gen_gvec_fn_zzi(s, fn, a->esz, a->rd, a->rn, a->imm);
183
goto done;
57
+ return gen_gvec_fn_arg_zzi(s, fn, a);
184
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn)
58
}
185
gen_fpst = gen_helper_frint64_d;
59
186
break;
60
static bool trans_SSRA(DisasContext *s, arg_rri_esz *a)
187
default:
188
+ case 0x0: /* FMOV */
189
+ case 0x1: /* FABS */
190
+ case 0x2: /* FNEG */
191
g_assert_not_reached();
192
}
193
194
@@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn)
195
goto do_unallocated;
196
}
197
/* fall through */
198
- case 0x0 ... 0x3:
199
+ case 0x3:
200
case 0x8 ... 0xc:
201
case 0xe ... 0xf:
202
/* 32-to-32 and 64-to-64 ops */
203
@@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn)
204
205
default:
206
do_unallocated:
207
+ case 0x0: /* FMOV */
208
+ case 0x1: /* FABS */
209
+ case 0x2: /* FNEG */
210
unallocated_encoding(s);
211
break;
212
}
61
--
213
--
62
2.25.1
214
2.34.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
Pass fpstatus not env, like most other fp helpers.
4
when the arguments come from arg_rpr_esz.
5
Replaces do_zpz_ool.
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-21-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-26-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 | 45 +++++++++++++++++++++-----------------
10
target/arm/helper.h | 6 +++---
13
1 file changed, 25 insertions(+), 20 deletions(-)
11
target/arm/tcg/translate-a64.c | 15 +++++++--------
12
target/arm/tcg/translate-vfp.c | 6 +++---
13
target/arm/vfp_helper.c | 12 ++++++------
14
4 files changed, 19 insertions(+), 20 deletions(-)
14
15
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/helper.h b/target/arm/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
18
--- a/target/arm/helper.h
18
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/helper.h
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
20
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_maxnumd, f64, f64, f64, ptr)
20
return true;
21
DEF_HELPER_3(vfp_minnumh, f16, f16, f16, ptr)
22
DEF_HELPER_3(vfp_minnums, f32, f32, f32, ptr)
23
DEF_HELPER_3(vfp_minnumd, f64, f64, f64, ptr)
24
-DEF_HELPER_2(vfp_sqrth, f16, f16, env)
25
-DEF_HELPER_2(vfp_sqrts, f32, f32, env)
26
-DEF_HELPER_2(vfp_sqrtd, f64, f64, env)
27
+DEF_HELPER_2(vfp_sqrth, f16, f16, ptr)
28
+DEF_HELPER_2(vfp_sqrts, f32, f32, ptr)
29
+DEF_HELPER_2(vfp_sqrtd, f64, f64, ptr)
30
DEF_HELPER_3(vfp_cmph, void, f16, f16, env)
31
DEF_HELPER_3(vfp_cmps, void, f32, f32, env)
32
DEF_HELPER_3(vfp_cmpd, void, f64, f64, env)
33
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/tcg/translate-a64.c
36
+++ b/target/arm/tcg/translate-a64.c
37
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
38
39
switch (opcode) {
40
case 0x3: /* FSQRT */
41
- gen_helper_vfp_sqrts(tcg_res, tcg_op, tcg_env);
42
- goto done;
43
+ gen_fpst = gen_helper_vfp_sqrts;
44
+ break;
45
case 0x6: /* BFCVT */
46
gen_fpst = gen_helper_bfcvt;
47
break;
48
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
49
gen_fpst(tcg_res, tcg_op, fpst);
50
}
51
52
- done:
53
write_fp_sreg(s, rd, tcg_res);
21
}
54
}
22
55
23
+static bool gen_gvec_ool_arg_zpz(DisasContext *s, gen_helper_gvec_3 *fn,
56
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn)
24
+ arg_rpr_esz *a, int data)
57
25
+{
58
switch (opcode) {
26
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, data);
59
case 0x3: /* FSQRT */
27
+}
60
- gen_helper_vfp_sqrtd(tcg_res, tcg_op, tcg_env);
28
+
61
- goto done;
29
+
62
+ gen_fpst = gen_helper_vfp_sqrtd;
30
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
63
+ break;
31
static void gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
64
case 0x8: /* FRINTN */
32
int rd, int rn, int rm, int pg, int data)
65
case 0x9: /* FRINTP */
33
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
66
case 0xa: /* FRINTM */
34
*** SVE Integer Arithmetic - Unary Predicated Group
67
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn)
35
*/
68
gen_fpst(tcg_res, tcg_op, fpst);
36
69
}
37
-static bool do_zpz_ool(DisasContext *s, arg_rpr_esz *a, gen_helper_gvec_3 *fn)
70
38
-{
71
- done:
39
- return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, 0);
72
write_fp_dreg(s, rd, tcg_res);
40
-}
41
-
42
#define DO_ZPZ(NAME, name) \
43
static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
44
{ \
45
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
46
gen_helper_sve_##name##_b, gen_helper_sve_##name##_h, \
47
gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
48
}; \
49
- return do_zpz_ool(s, a, fns[a->esz]); \
50
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0); \
51
}
73
}
52
74
53
DO_ZPZ(CLS, cls)
75
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
54
@@ -XXX,XX +XXX,XX @@ static bool trans_FABS(DisasContext *s, arg_rpr_esz *a)
76
gen_vfp_negd(tcg_rd, tcg_rn);
55
gen_helper_sve_fabs_s,
77
break;
56
gen_helper_sve_fabs_d
78
case 0x7f: /* FSQRT */
57
};
79
- gen_helper_vfp_sqrtd(tcg_rd, tcg_rn, tcg_env);
58
- return do_zpz_ool(s, a, fns[a->esz]);
80
+ gen_helper_vfp_sqrtd(tcg_rd, tcg_rn, tcg_fpstatus);
59
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
81
break;
82
case 0x1a: /* FCVTNS */
83
case 0x1b: /* FCVTMS */
84
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
85
handle_2misc_fcmp_zero(s, opcode, false, u, is_q, size, rn, rd);
86
return;
87
case 0x7f: /* FSQRT */
88
+ need_fpstatus = true;
89
if (size == 3 && !is_q) {
90
unallocated_encoding(s);
91
return;
92
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
93
gen_vfp_negs(tcg_res, tcg_op);
94
break;
95
case 0x7f: /* FSQRT */
96
- gen_helper_vfp_sqrts(tcg_res, tcg_op, tcg_env);
97
+ gen_helper_vfp_sqrts(tcg_res, tcg_op, tcg_fpstatus);
98
break;
99
case 0x1a: /* FCVTNS */
100
case 0x1b: /* FCVTMS */
101
diff --git a/target/arm/tcg/translate-vfp.c b/target/arm/tcg/translate-vfp.c
102
index XXXXXXX..XXXXXXX 100644
103
--- a/target/arm/tcg/translate-vfp.c
104
+++ b/target/arm/tcg/translate-vfp.c
105
@@ -XXX,XX +XXX,XX @@ DO_VFP_2OP(VNEG, dp, gen_vfp_negd, aa32_fpdp_v2)
106
107
static void gen_VSQRT_hp(TCGv_i32 vd, TCGv_i32 vm)
108
{
109
- gen_helper_vfp_sqrth(vd, vm, tcg_env);
110
+ gen_helper_vfp_sqrth(vd, vm, fpstatus_ptr(FPST_FPCR_F16));
60
}
111
}
61
112
62
static bool trans_FNEG(DisasContext *s, arg_rpr_esz *a)
113
static void gen_VSQRT_sp(TCGv_i32 vd, TCGv_i32 vm)
63
@@ -XXX,XX +XXX,XX @@ static bool trans_FNEG(DisasContext *s, arg_rpr_esz *a)
114
{
64
gen_helper_sve_fneg_s,
115
- gen_helper_vfp_sqrts(vd, vm, tcg_env);
65
gen_helper_sve_fneg_d
116
+ gen_helper_vfp_sqrts(vd, vm, fpstatus_ptr(FPST_FPCR));
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
}
117
}
70
118
71
static bool trans_SXTB(DisasContext *s, arg_rpr_esz *a)
119
static void gen_VSQRT_dp(TCGv_i64 vd, TCGv_i64 vm)
72
@@ -XXX,XX +XXX,XX @@ static bool trans_SXTB(DisasContext *s, arg_rpr_esz *a)
120
{
73
gen_helper_sve_sxtb_s,
121
- gen_helper_vfp_sqrtd(vd, vm, tcg_env);
74
gen_helper_sve_sxtb_d
122
+ gen_helper_vfp_sqrtd(vd, vm, fpstatus_ptr(FPST_FPCR));
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
}
123
}
79
124
80
static bool trans_UXTB(DisasContext *s, arg_rpr_esz *a)
125
DO_VFP_2OP(VSQRT, hp, gen_VSQRT_hp, aa32_fp16_arith)
81
@@ -XXX,XX +XXX,XX @@ static bool trans_UXTB(DisasContext *s, arg_rpr_esz *a)
126
diff --git a/target/arm/vfp_helper.c b/target/arm/vfp_helper.c
82
gen_helper_sve_uxtb_s,
127
index XXXXXXX..XXXXXXX 100644
83
gen_helper_sve_uxtb_d
128
--- a/target/arm/vfp_helper.c
84
};
129
+++ b/target/arm/vfp_helper.c
85
- return do_zpz_ool(s, a, fns[a->esz]);
130
@@ -XXX,XX +XXX,XX @@ VFP_BINOP(minnum)
86
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
131
VFP_BINOP(maxnum)
132
#undef VFP_BINOP
133
134
-dh_ctype_f16 VFP_HELPER(sqrt, h)(dh_ctype_f16 a, CPUARMState *env)
135
+dh_ctype_f16 VFP_HELPER(sqrt, h)(dh_ctype_f16 a, void *fpstp)
136
{
137
- return float16_sqrt(a, &env->vfp.fp_status_f16);
138
+ return float16_sqrt(a, fpstp);
87
}
139
}
88
140
89
static bool trans_SXTH(DisasContext *s, arg_rpr_esz *a)
141
-float32 VFP_HELPER(sqrt, s)(float32 a, CPUARMState *env)
90
@@ -XXX,XX +XXX,XX @@ static bool trans_SXTH(DisasContext *s, arg_rpr_esz *a)
142
+float32 VFP_HELPER(sqrt, s)(float32 a, void *fpstp)
91
gen_helper_sve_sxth_s,
143
{
92
gen_helper_sve_sxth_d
144
- return float32_sqrt(a, &env->vfp.fp_status);
93
};
145
+ return float32_sqrt(a, fpstp);
94
- return do_zpz_ool(s, a, fns[a->esz]);
95
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
96
}
146
}
97
147
98
static bool trans_UXTH(DisasContext *s, arg_rpr_esz *a)
148
-float64 VFP_HELPER(sqrt, d)(float64 a, CPUARMState *env)
99
@@ -XXX,XX +XXX,XX @@ static bool trans_UXTH(DisasContext *s, arg_rpr_esz *a)
149
+float64 VFP_HELPER(sqrt, d)(float64 a, void *fpstp)
100
gen_helper_sve_uxth_s,
150
{
101
gen_helper_sve_uxth_d
151
- return float64_sqrt(a, &env->vfp.fp_status);
102
};
152
+ return float64_sqrt(a, fpstp);
103
- return do_zpz_ool(s, a, fns[a->esz]);
104
+ return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
105
}
153
}
106
154
107
static bool trans_SXTW(DisasContext *s, arg_rpr_esz *a)
155
static void softfloat_to_vfp_compare(CPUARMState *env, FloatRelation cmp)
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
--
156
--
175
2.25.1
157
2.34.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 function is identical with helper_vfp_sqrth.
4
Replace all uses.
5
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@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-64-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-27-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/tcg/helper-a64.h | 1 -
9
1 file changed, 2 insertions(+), 9 deletions(-)
12
target/arm/tcg/helper-a64.c | 11 -----------
13
target/arm/tcg/translate-a64.c | 4 ++--
14
3 files changed, 2 insertions(+), 14 deletions(-)
10
15
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/tcg/helper-a64.h b/target/arm/tcg/helper-a64.h
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
18
--- a/target/arm/tcg/helper-a64.h
14
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/tcg/helper-a64.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_last_fp(DisasContext *s, arg_rpr_esz *a, bool before)
20
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_2(advsimd_rinth_exact, f16, f16, ptr)
16
return true;
21
DEF_HELPER_2(advsimd_rinth, f16, f16, ptr)
22
DEF_HELPER_2(advsimd_f16tosinth, i32, f16, ptr)
23
DEF_HELPER_2(advsimd_f16touinth, i32, f16, ptr)
24
-DEF_HELPER_2(sqrt_f16, f16, f16, ptr)
25
26
DEF_HELPER_2(exception_return, void, env, i64)
27
DEF_HELPER_FLAGS_2(dc_zva, TCG_CALL_NO_WG, void, env, i64)
28
diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/tcg/helper-a64.c
31
+++ b/target/arm/tcg/helper-a64.c
32
@@ -XXX,XX +XXX,XX @@ illegal_return:
33
"resuming execution at 0x%" PRIx64 "\n", cur_el, env->pc);
17
}
34
}
18
35
19
-static bool trans_LASTA_v(DisasContext *s, arg_rpr_esz *a)
36
-/*
37
- * Square Root and Reciprocal square root
38
- */
39
-
40
-uint32_t HELPER(sqrt_f16)(uint32_t a, void *fpstp)
20
-{
41
-{
21
- return do_last_fp(s, a, false);
42
- float_status *s = fpstp;
43
-
44
- return float16_sqrt(a, s);
22
-}
45
-}
23
-
46
-
24
-static bool trans_LASTB_v(DisasContext *s, arg_rpr_esz *a)
47
void HELPER(dc_zva)(CPUARMState *env, uint64_t vaddr_in)
25
-{
48
{
26
- return do_last_fp(s, a, true);
49
uintptr_t ra = GETPC();
27
-}
50
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
28
+TRANS_FEAT(LASTA_v, aa64_sve, do_last_fp, a, false)
51
index XXXXXXX..XXXXXXX 100644
29
+TRANS_FEAT(LASTB_v, aa64_sve, do_last_fp, a, true)
52
--- a/target/arm/tcg/translate-a64.c
30
53
+++ b/target/arm/tcg/translate-a64.c
31
/* Compute LAST for a Xreg. */
54
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
32
static bool do_last_general(DisasContext *s, arg_rpr_esz *a, bool before)
55
switch (opcode) {
56
case 0x3: /* FSQRT */
57
fpst = fpstatus_ptr(FPST_FPCR_F16);
58
- gen_helper_sqrt_f16(tcg_res, tcg_op, fpst);
59
+ gen_helper_vfp_sqrth(tcg_res, tcg_op, fpst);
60
break;
61
case 0x8: /* FRINTN */
62
case 0x9: /* FRINTP */
63
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
64
gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus);
65
break;
66
case 0x7f: /* FSQRT */
67
- gen_helper_sqrt_f16(tcg_res, tcg_op, tcg_fpstatus);
68
+ gen_helper_vfp_sqrth(tcg_res, tcg_op, tcg_fpstatus);
69
break;
70
default:
71
g_assert_not_reached();
33
--
72
--
34
2.25.1
73
2.34.1
74
75
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
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
multiply-add instructions.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-78-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-28-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
7
---
11
target/arm/translate-sve.c | 140 ++++++++++++++-----------------------
8
target/arm/tcg/a64.decode | 1 +
12
1 file changed, 53 insertions(+), 87 deletions(-)
9
target/arm/tcg/translate-a64.c | 72 ++++++++++++++++++++++++++++------
10
2 files changed, 62 insertions(+), 11 deletions(-)
13
11
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
15
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
17
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzxz(DisasContext *s, gen_helper_gvec_4 *fn,
16
@@ -XXX,XX +XXX,XX @@ FMINV_s 0110 1110 10 11000 01111 10 ..... ..... @rr_q1e2
19
return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
17
FMOV_s 00011110 .. 1 000000 10000 ..... ..... @rr_hsd
20
}
18
FABS_s 00011110 .. 1 000001 10000 ..... ..... @rr_hsd
21
19
FNEG_s 00011110 .. 1 000010 10000 ..... ..... @rr_hsd
22
+/* Invoke an out-of-line helper on 4 Zregs, plus a pointer. */
20
+FSQRT_s 00011110 .. 1 000011 10000 ..... ..... @rr_hsd
23
+static bool gen_gvec_ptr_zzzz(DisasContext *s, gen_helper_gvec_4_ptr *fn,
21
24
+ int rd, int rn, int rm, int ra,
22
# Floating-point Immediate
25
+ int data, TCGv_ptr ptr)
23
24
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/target/arm/tcg/translate-a64.c
27
+++ b/target/arm/tcg/translate-a64.c
28
@@ -XXX,XX +XXX,XX @@ static const FPScalar1Int f_scalar_fneg = {
29
};
30
TRANS(FNEG_s, do_fp1_scalar_int, a, &f_scalar_fneg)
31
32
+typedef struct FPScalar1 {
33
+ void (*gen_h)(TCGv_i32, TCGv_i32, TCGv_ptr);
34
+ void (*gen_s)(TCGv_i32, TCGv_i32, TCGv_ptr);
35
+ void (*gen_d)(TCGv_i64, TCGv_i64, TCGv_ptr);
36
+} FPScalar1;
37
+
38
+static bool do_fp1_scalar(DisasContext *s, arg_rr_e *a,
39
+ const FPScalar1 *f, int rmode)
26
+{
40
+{
27
+ if (fn == NULL) {
41
+ TCGv_i32 tcg_rmode = NULL;
28
+ return false;
42
+ TCGv_ptr fpst;
43
+ TCGv_i64 t64;
44
+ TCGv_i32 t32;
45
+ int check = fp_access_check_scalar_hsd(s, a->esz);
46
+
47
+ if (check <= 0) {
48
+ return check == 0;
29
+ }
49
+ }
30
+ if (sve_access_check(s)) {
50
+
31
+ unsigned vsz = vec_full_reg_size(s);
51
+ fpst = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
32
+ tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, rd),
52
+ if (rmode >= 0) {
33
+ vec_full_reg_offset(s, rn),
53
+ tcg_rmode = gen_set_rmode(rmode, fpst);
34
+ vec_full_reg_offset(s, rm),
54
+ }
35
+ vec_full_reg_offset(s, ra),
55
+
36
+ ptr, vsz, vsz, data, fn);
56
+ switch (a->esz) {
57
+ case MO_64:
58
+ t64 = read_fp_dreg(s, a->rn);
59
+ f->gen_d(t64, t64, fpst);
60
+ write_fp_dreg(s, a->rd, t64);
61
+ break;
62
+ case MO_32:
63
+ t32 = read_fp_sreg(s, a->rn);
64
+ f->gen_s(t32, t32, fpst);
65
+ write_fp_sreg(s, a->rd, t32);
66
+ break;
67
+ case MO_16:
68
+ t32 = read_fp_hreg(s, a->rn);
69
+ f->gen_h(t32, t32, fpst);
70
+ write_fp_sreg(s, a->rd, t32);
71
+ break;
72
+ default:
73
+ g_assert_not_reached();
74
+ }
75
+
76
+ if (rmode >= 0) {
77
+ gen_restore_rmode(tcg_rmode, fpst);
37
+ }
78
+ }
38
+ return true;
79
+ return true;
39
+}
80
+}
40
+
81
+
41
+static bool gen_gvec_fpst_zzzz(DisasContext *s, gen_helper_gvec_4_ptr *fn,
82
+static const FPScalar1 f_scalar_fsqrt = {
42
+ int rd, int rn, int rm, int ra,
83
+ gen_helper_vfp_sqrth,
43
+ int data, ARMFPStatusFlavour flavour)
84
+ gen_helper_vfp_sqrts,
44
+{
85
+ gen_helper_vfp_sqrtd,
45
+ TCGv_ptr status = fpstatus_ptr(flavour);
86
+};
46
+ bool ret = gen_gvec_ptr_zzzz(s, fn, rd, rn, rm, ra, data, status);
87
+TRANS(FSQRT_s, do_fp1_scalar, a, &f_scalar_fsqrt, -1)
47
+ tcg_temp_free_ptr(status);
48
+ return ret;
49
+}
50
+
88
+
51
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
89
/* Floating-point data-processing (1 source) - half precision */
52
static bool gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
90
static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
53
int rd, int rn, int pg, int data)
54
@@ -XXX,XX +XXX,XX @@ DO_SVE2_RRXR_ROT(CDOT_zzxw_d, gen_helper_sve2_cdot_idx_d)
55
56
static bool do_FMLA_zzxz(DisasContext *s, arg_rrxr_esz *a, bool sub)
57
{
91
{
58
- static gen_helper_gvec_4_ptr * const fns[3] = {
92
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
59
+ static gen_helper_gvec_4_ptr * const fns[4] = {
93
TCGv_i32 tcg_res = tcg_temp_new_i32();
60
+ NULL,
94
61
gen_helper_gvec_fmla_idx_h,
95
switch (opcode) {
62
gen_helper_gvec_fmla_idx_s,
96
- case 0x3: /* FSQRT */
63
gen_helper_gvec_fmla_idx_d,
97
- fpst = fpstatus_ptr(FPST_FPCR_F16);
64
};
98
- gen_helper_vfp_sqrth(tcg_res, tcg_op, fpst);
65
-
99
- break;
66
- if (sve_access_check(s)) {
100
case 0x8: /* FRINTN */
67
- unsigned vsz = vec_full_reg_size(s);
101
case 0x9: /* FRINTP */
68
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
102
case 0xa: /* FRINTM */
69
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
103
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
70
- vec_full_reg_offset(s, a->rn),
104
case 0x0: /* FMOV */
71
- vec_full_reg_offset(s, a->rm),
105
case 0x1: /* FABS */
72
- vec_full_reg_offset(s, a->ra),
106
case 0x2: /* FNEG */
73
- status, vsz, vsz, (a->index << 1) | sub,
107
+ case 0x3: /* FSQRT */
74
- fns[a->esz - 1]);
108
g_assert_not_reached();
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
}
82
83
static bool trans_FMLA_zzxz(DisasContext *s, arg_FMLA_zzxz *a)
84
@@ -XXX,XX +XXX,XX @@ static bool trans_FCMLA_zpzzz(DisasContext *s, arg_FCMLA_zpzzz *a)
85
86
static bool trans_FCMLA_zzxz(DisasContext *s, arg_FCMLA_zzxz *a)
87
{
88
- static gen_helper_gvec_4_ptr * const fns[2] = {
89
+ static gen_helper_gvec_4_ptr * const fns[4] = {
90
+ NULL,
91
gen_helper_gvec_fcmlah_idx,
92
gen_helper_gvec_fcmlas_idx,
93
+ NULL,
94
};
95
96
- tcg_debug_assert(a->esz == 1 || a->esz == 2);
97
tcg_debug_assert(a->rd == a->ra);
98
- if (sve_access_check(s)) {
99
- unsigned vsz = vec_full_reg_size(s);
100
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
101
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
102
- vec_full_reg_offset(s, a->rn),
103
- vec_full_reg_offset(s, a->rm),
104
- vec_full_reg_offset(s, a->ra),
105
- status, vsz, vsz,
106
- a->index * 4 + a->rot,
107
- fns[a->esz - 1]);
108
- tcg_temp_free_ptr(status);
109
- }
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
}
116
117
/*
118
@@ -XXX,XX +XXX,XX @@ static bool trans_FMMLA(DisasContext *s, arg_rrrr_esz *a)
119
return false;
120
}
109
}
121
110
122
- if (sve_access_check(s)) {
111
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
123
- unsigned vsz = vec_full_reg_size(s);
112
tcg_res = tcg_temp_new_i32();
124
- TCGv_ptr status = fpstatus_ptr(FPST_FPCR);
113
125
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
114
switch (opcode) {
126
- vec_full_reg_offset(s, a->rn),
115
- case 0x3: /* FSQRT */
127
- vec_full_reg_offset(s, a->rm),
116
- gen_fpst = gen_helper_vfp_sqrts;
128
- vec_full_reg_offset(s, a->ra),
117
- break;
129
- status, vsz, vsz, 0, fn);
118
case 0x6: /* BFCVT */
130
- tcg_temp_free_ptr(status);
119
gen_fpst = gen_helper_bfcvt;
131
- }
120
break;
132
- return true;
121
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
133
+ return gen_gvec_fpst_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR);
122
case 0x0: /* FMOV */
134
}
123
case 0x1: /* FABS */
135
124
case 0x2: /* FNEG */
136
static gen_helper_gvec_4 * const sqdmlal_zzzw_fns[] = {
125
+ case 0x3: /* FSQRT */
137
@@ -XXX,XX +XXX,XX @@ static bool do_FMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sub, bool sel)
126
g_assert_not_reached();
138
if (!dc_isar_feature(aa64_sve2, s)) {
139
return false;
140
}
127
}
141
- if (sve_access_check(s)) {
128
142
- unsigned vsz = vec_full_reg_size(s);
129
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn)
143
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
130
tcg_res = tcg_temp_new_i64();
144
- vec_full_reg_offset(s, a->rn),
131
145
- vec_full_reg_offset(s, a->rm),
132
switch (opcode) {
146
- vec_full_reg_offset(s, a->ra),
133
- case 0x3: /* FSQRT */
147
- cpu_env, vsz, vsz, (sel << 1) | sub,
134
- gen_fpst = gen_helper_vfp_sqrtd;
148
- gen_helper_sve2_fmlal_zzzw_s);
135
- break;
149
- }
136
case 0x8: /* FRINTN */
150
- return true;
137
case 0x9: /* FRINTP */
151
+ return gen_gvec_ptr_zzzz(s, gen_helper_sve2_fmlal_zzzw_s,
138
case 0xa: /* FRINTM */
152
+ a->rd, a->rn, a->rm, a->ra,
139
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn)
153
+ (sel << 1) | sub, cpu_env);
140
case 0x0: /* FMOV */
154
}
141
case 0x1: /* FABS */
155
142
case 0x2: /* FNEG */
156
static bool trans_FMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
143
+ case 0x3: /* FSQRT */
157
@@ -XXX,XX +XXX,XX @@ static bool do_FMLAL_zzxw(DisasContext *s, arg_rrxr_esz *a, bool sub, bool sel)
144
g_assert_not_reached();
158
if (!dc_isar_feature(aa64_sve2, s)) {
159
return false;
160
}
145
}
161
- if (sve_access_check(s)) {
146
162
- unsigned vsz = vec_full_reg_size(s);
147
@@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn)
163
- tcg_gen_gvec_4_ptr(vec_full_reg_offset(s, a->rd),
148
goto do_unallocated;
164
- vec_full_reg_offset(s, a->rn),
149
}
165
- vec_full_reg_offset(s, a->rm),
150
/* fall through */
166
- vec_full_reg_offset(s, a->ra),
151
- case 0x3:
167
- cpu_env, vsz, vsz,
152
case 0x8 ... 0xc:
168
- (a->index << 2) | (sel << 1) | sub,
153
case 0xe ... 0xf:
169
- gen_helper_sve2_fmlal_zzxw_s);
154
/* 32-to-32 and 64-to-64 ops */
170
- }
155
@@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn)
171
- return true;
156
case 0x0: /* FMOV */
172
+ return gen_gvec_ptr_zzzz(s, gen_helper_sve2_fmlal_zzxw_s,
157
case 0x1: /* FABS */
173
+ a->rd, a->rn, a->rm, a->ra,
158
case 0x2: /* FNEG */
174
+ (a->index << 2) | (sel << 1) | sub, cpu_env);
159
+ case 0x3: /* FSQRT */
175
}
160
unallocated_encoding(s);
176
161
break;
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
}
162
}
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
--
163
--
224
2.25.1
164
2.34.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
Remove handle_fp_1src_half as these were the last insns
4
makes it easier to split trans_FMMLA by element size,
4
decoded by that function.
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: 20241211163036.2297116-29-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/tcg/a64.decode | 8 +++
13
target/arm/translate-sve.c | 27 ++++-----------------------
12
target/arm/tcg/translate-a64.c | 117 +++++++++++----------------------
14
2 files changed, 7 insertions(+), 27 deletions(-)
13
2 files changed, 46 insertions(+), 79 deletions(-)
15
14
16
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
15
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
17
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/sve.decode
17
--- a/target/arm/tcg/a64.decode
19
+++ b/target/arm/sve.decode
18
+++ b/target/arm/tcg/a64.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 @@ FABS_s 00011110 .. 1 000001 10000 ..... ..... @rr_hsd
21
USDOT_zzzz 01000100 .. 0 ..... 011 110 ..... ..... @rda_rn_rm
20
FNEG_s 00011110 .. 1 000010 10000 ..... ..... @rr_hsd
22
21
FSQRT_s 00011110 .. 1 000011 10000 ..... ..... @rr_hsd
23
### SVE2 floating point matrix multiply accumulate
22
23
+FRINTN_s 00011110 .. 1 001000 10000 ..... ..... @rr_hsd
24
+FRINTP_s 00011110 .. 1 001001 10000 ..... ..... @rr_hsd
25
+FRINTM_s 00011110 .. 1 001010 10000 ..... ..... @rr_hsd
26
+FRINTZ_s 00011110 .. 1 001011 10000 ..... ..... @rr_hsd
27
+FRINTA_s 00011110 .. 1 001100 10000 ..... ..... @rr_hsd
28
+FRINTX_s 00011110 .. 1 001110 10000 ..... ..... @rr_hsd
29
+FRINTI_s 00011110 .. 1 001111 10000 ..... ..... @rr_hsd
30
+
31
# Floating-point Immediate
32
33
FMOVI_s 0001 1110 .. 1 imm:8 100 00000 rd:5 esz=%esz_hsd
34
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/tcg/translate-a64.c
37
+++ b/target/arm/tcg/translate-a64.c
38
@@ -XXX,XX +XXX,XX @@ static const FPScalar1 f_scalar_fsqrt = {
39
};
40
TRANS(FSQRT_s, do_fp1_scalar, a, &f_scalar_fsqrt, -1)
41
42
-/* Floating-point data-processing (1 source) - half precision */
43
-static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn)
24
-{
44
-{
25
- BFMMLA 01100100 01 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
45
- TCGv_ptr fpst = NULL;
26
- FMMLA 01100100 .. 1 ..... 111 001 ..... ..... @rda_rn_rm
46
- TCGv_i32 tcg_op = read_fp_hreg(s, rn);
27
-}
47
- TCGv_i32 tcg_res = tcg_temp_new_i32();
28
+BFMMLA 01100100 01 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
48
+static const FPScalar1 f_scalar_frint = {
29
+FMMLA_s 01100100 10 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
49
+ gen_helper_advsimd_rinth,
30
+FMMLA_d 01100100 11 1 ..... 111 001 ..... ..... @rda_rn_rm_e0
50
+ gen_helper_rints,
31
51
+ gen_helper_rintd,
32
### SVE2 Memory Gather Load Group
52
+};
33
53
+TRANS(FRINTN_s, do_fp1_scalar, a, &f_scalar_frint, FPROUNDING_TIEEVEN)
34
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
54
+TRANS(FRINTP_s, do_fp1_scalar, a, &f_scalar_frint, FPROUNDING_POSINF)
35
index XXXXXXX..XXXXXXX 100644
55
+TRANS(FRINTM_s, do_fp1_scalar, a, &f_scalar_frint, FPROUNDING_NEGINF)
36
--- a/target/arm/translate-sve.c
56
+TRANS(FRINTZ_s, do_fp1_scalar, a, &f_scalar_frint, FPROUNDING_ZERO)
37
+++ b/target/arm/translate-sve.c
57
+TRANS(FRINTA_s, do_fp1_scalar, a, &f_scalar_frint, FPROUNDING_TIEAWAY)
38
@@ -XXX,XX +XXX,XX @@ DO_SVE2_ZPZZ_FP(FMINP, fminp)
58
+TRANS(FRINTI_s, do_fp1_scalar, a, &f_scalar_frint, -1)
39
* SVE Integer Multiply-Add (unpredicated)
59
40
*/
60
- switch (opcode) {
41
61
- case 0x8: /* FRINTN */
42
-static bool trans_FMMLA(DisasContext *s, arg_rrrr_esz *a)
62
- case 0x9: /* FRINTP */
43
-{
63
- case 0xa: /* FRINTM */
44
- gen_helper_gvec_4_ptr *fn;
64
- case 0xb: /* FRINTZ */
65
- case 0xc: /* FRINTA */
66
- {
67
- TCGv_i32 tcg_rmode;
45
-
68
-
46
- switch (a->esz) {
69
- fpst = fpstatus_ptr(FPST_FPCR_F16);
47
- case MO_32:
70
- tcg_rmode = gen_set_rmode(opcode & 7, fpst);
48
- if (!dc_isar_feature(aa64_sve_f32mm, s)) {
71
- gen_helper_advsimd_rinth(tcg_res, tcg_op, fpst);
49
- return false;
72
- gen_restore_rmode(tcg_rmode, fpst);
50
- }
73
- break;
51
- fn = gen_helper_fmmla_s;
74
- }
52
- break;
75
- case 0xe: /* FRINTX */
53
- case MO_64:
76
- fpst = fpstatus_ptr(FPST_FPCR_F16);
54
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
77
- gen_helper_advsimd_rinth_exact(tcg_res, tcg_op, fpst);
55
- return false;
78
- break;
56
- }
79
- case 0xf: /* FRINTI */
57
- fn = gen_helper_fmmla_d;
80
- fpst = fpstatus_ptr(FPST_FPCR_F16);
81
- gen_helper_advsimd_rinth(tcg_res, tcg_op, fpst);
58
- break;
82
- break;
59
- default:
83
- default:
60
- return false;
84
- case 0x0: /* FMOV */
85
- case 0x1: /* FABS */
86
- case 0x2: /* FNEG */
87
- case 0x3: /* FSQRT */
88
- g_assert_not_reached();
61
- }
89
- }
62
-
90
-
63
- return gen_gvec_fpst_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR);
91
- write_fp_sreg(s, rd, tcg_res);
64
-}
92
-}
65
+TRANS_FEAT(FMMLA_s, aa64_sve_f32mm, gen_gvec_fpst_zzzz, gen_helper_fmmla_s,
93
+static const FPScalar1 f_scalar_frintx = {
66
+ a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR)
94
+ gen_helper_advsimd_rinth_exact,
67
+TRANS_FEAT(FMMLA_d, aa64_sve_f64mm, gen_gvec_fpst_zzzz, gen_helper_fmmla_d,
95
+ gen_helper_rints_exact,
68
+ a->rd, a->rn, a->rm, a->ra, 0, FPST_FPCR)
96
+ gen_helper_rintd_exact,
69
97
+};
70
static gen_helper_gvec_4 * const sqdmlal_zzzw_fns[] = {
98
+TRANS(FRINTX_s, do_fp1_scalar, a, &f_scalar_frintx, -1)
71
NULL, gen_helper_sve2_sqdmlal_zzzw_h,
99
100
/* Floating-point data-processing (1 source) - single precision */
101
static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
102
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
103
case 0x6: /* BFCVT */
104
gen_fpst = gen_helper_bfcvt;
105
break;
106
- case 0x8: /* FRINTN */
107
- case 0x9: /* FRINTP */
108
- case 0xa: /* FRINTM */
109
- case 0xb: /* FRINTZ */
110
- case 0xc: /* FRINTA */
111
- rmode = opcode & 7;
112
- gen_fpst = gen_helper_rints;
113
- break;
114
- case 0xe: /* FRINTX */
115
- gen_fpst = gen_helper_rints_exact;
116
- break;
117
- case 0xf: /* FRINTI */
118
- gen_fpst = gen_helper_rints;
119
- break;
120
case 0x10: /* FRINT32Z */
121
rmode = FPROUNDING_ZERO;
122
gen_fpst = gen_helper_frint32_s;
123
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
124
case 0x1: /* FABS */
125
case 0x2: /* FNEG */
126
case 0x3: /* FSQRT */
127
+ case 0x8: /* FRINTN */
128
+ case 0x9: /* FRINTP */
129
+ case 0xa: /* FRINTM */
130
+ case 0xb: /* FRINTZ */
131
+ case 0xc: /* FRINTA */
132
+ case 0xe: /* FRINTX */
133
+ case 0xf: /* FRINTI */
134
g_assert_not_reached();
135
}
136
137
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn)
138
tcg_res = tcg_temp_new_i64();
139
140
switch (opcode) {
141
- case 0x8: /* FRINTN */
142
- case 0x9: /* FRINTP */
143
- case 0xa: /* FRINTM */
144
- case 0xb: /* FRINTZ */
145
- case 0xc: /* FRINTA */
146
- rmode = opcode & 7;
147
- gen_fpst = gen_helper_rintd;
148
- break;
149
- case 0xe: /* FRINTX */
150
- gen_fpst = gen_helper_rintd_exact;
151
- break;
152
- case 0xf: /* FRINTI */
153
- gen_fpst = gen_helper_rintd;
154
- break;
155
case 0x10: /* FRINT32Z */
156
rmode = FPROUNDING_ZERO;
157
gen_fpst = gen_helper_frint32_d;
158
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn)
159
case 0x1: /* FABS */
160
case 0x2: /* FNEG */
161
case 0x3: /* FSQRT */
162
+ case 0x8: /* FRINTN */
163
+ case 0x9: /* FRINTP */
164
+ case 0xa: /* FRINTM */
165
+ case 0xb: /* FRINTZ */
166
+ case 0xc: /* FRINTA */
167
+ case 0xe: /* FRINTX */
168
+ case 0xf: /* FRINTI */
169
g_assert_not_reached();
170
}
171
172
@@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn)
173
if (type > 1 || !dc_isar_feature(aa64_frint, s)) {
174
goto do_unallocated;
175
}
176
- /* fall through */
177
- case 0x8 ... 0xc:
178
- case 0xe ... 0xf:
179
/* 32-to-32 and 64-to-64 ops */
180
switch (type) {
181
case 0:
182
@@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn)
183
handle_fp_1src_double(s, opcode, rd, rn);
184
break;
185
case 3:
186
- if (!dc_isar_feature(aa64_fp16, s)) {
187
- goto do_unallocated;
188
- }
189
-
190
- if (!fp_access_check(s)) {
191
- return;
192
- }
193
- handle_fp_1src_half(s, opcode, rd, rn);
194
- break;
195
default:
196
goto do_unallocated;
197
}
198
@@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn)
199
case 0x1: /* FABS */
200
case 0x2: /* FNEG */
201
case 0x3: /* FSQRT */
202
+ case 0x8: /* FRINTN */
203
+ case 0x9: /* FRINTP */
204
+ case 0xa: /* FRINTM */
205
+ case 0xb: /* FRINTZ */
206
+ case 0xc: /* FRINTA */
207
+ case 0xe: /* FRINTX */
208
+ case 0xf: /* FRINTI */
209
unallocated_encoding(s);
210
break;
211
}
72
--
212
--
73
2.25.1
213
2.34.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-87-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-30-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 | 7 ++-----
8
target/arm/tcg/a64.decode | 3 +++
9
1 file changed, 2 insertions(+), 5 deletions(-)
9
target/arm/tcg/translate-a64.c | 26 +++++++-------------------
10
2 files changed, 10 insertions(+), 19 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
16
@@ -XXX,XX +XXX,XX @@
16
*/
17
&qrrrr_e q rd rn rm ra esz
17
18
18
#define DO_FP3(NAME, name) \
19
@rr_h ........ ... ..... ...... rn:5 rd:5 &rr_e esz=1
19
-static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
20
+@rr_s ........ ... ..... ...... rn:5 rd:5 &rr_e esz=2
20
-{ \
21
@rr_d ........ ... ..... ...... rn:5 rd:5 &rr_e esz=3
21
- static gen_helper_gvec_3_ptr * const fns[4] = { \
22
@rr_sd ........ ... ..... ...... rn:5 rd:5 &rr_e esz=%esz_sd
22
+ static gen_helper_gvec_3_ptr * const name##_fns[4] = { \
23
@rr_hsd ........ ... ..... ...... rn:5 rd:5 &rr_e esz=%esz_hsd
23
NULL, gen_helper_gvec_##name##_h, \
24
@@ -XXX,XX +XXX,XX @@ FRINTA_s 00011110 .. 1 001100 10000 ..... ..... @rr_hsd
24
gen_helper_gvec_##name##_s, gen_helper_gvec_##name##_d \
25
FRINTX_s 00011110 .. 1 001110 10000 ..... ..... @rr_hsd
25
}; \
26
FRINTI_s 00011110 .. 1 001111 10000 ..... ..... @rr_hsd
26
- return gen_gvec_fpst_arg_zzz(s, fns[a->esz], a, 0); \
27
27
-}
28
+BFCVT_s 00011110 01 1 000110 10000 ..... ..... @rr_s
28
+ TRANS_FEAT(NAME, aa64_sve, gen_gvec_fpst_arg_zzz, name##_fns[a->esz], a, 0)
29
+
29
30
# Floating-point Immediate
30
DO_FP3(FADD_zzz, fadd)
31
31
DO_FP3(FSUB_zzz, fsub)
32
FMOVI_s 0001 1110 .. 1 imm:8 100 00000 rd:5 esz=%esz_hsd
33
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/tcg/translate-a64.c
36
+++ b/target/arm/tcg/translate-a64.c
37
@@ -XXX,XX +XXX,XX @@ static const FPScalar1 f_scalar_frintx = {
38
};
39
TRANS(FRINTX_s, do_fp1_scalar, a, &f_scalar_frintx, -1)
40
41
+static const FPScalar1 f_scalar_bfcvt = {
42
+ .gen_s = gen_helper_bfcvt,
43
+};
44
+TRANS_FEAT(BFCVT_s, aa64_bf16, do_fp1_scalar, a, &f_scalar_bfcvt, -1)
45
+
46
/* Floating-point data-processing (1 source) - single precision */
47
static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
48
{
49
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
50
tcg_res = tcg_temp_new_i32();
51
52
switch (opcode) {
53
- case 0x6: /* BFCVT */
54
- gen_fpst = gen_helper_bfcvt;
55
- break;
56
case 0x10: /* FRINT32Z */
57
rmode = FPROUNDING_ZERO;
58
gen_fpst = gen_helper_frint32_s;
59
@@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
60
case 0x1: /* FABS */
61
case 0x2: /* FNEG */
62
case 0x3: /* FSQRT */
63
+ case 0x6: /* BFCVT */
64
case 0x8: /* FRINTN */
65
case 0x9: /* FRINTP */
66
case 0xa: /* FRINTM */
67
@@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn)
68
}
69
break;
70
71
- case 0x6:
72
- switch (type) {
73
- case 1: /* BFCVT */
74
- if (!dc_isar_feature(aa64_bf16, s)) {
75
- goto do_unallocated;
76
- }
77
- if (!fp_access_check(s)) {
78
- return;
79
- }
80
- handle_fp_1src_single(s, opcode, rd, rn);
81
- break;
82
- default:
83
- goto do_unallocated;
84
- }
85
- break;
86
-
87
default:
88
do_unallocated:
89
case 0x0: /* FMOV */
90
case 0x1: /* FABS */
91
case 0x2: /* FNEG */
92
case 0x3: /* FSQRT */
93
+ case 0x6: /* BFCVT */
94
case 0x8: /* FRINTN */
95
case 0x9: /* FRINTP */
96
case 0xa: /* FRINTM */
32
--
97
--
33
2.25.1
98
2.34.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 handle_fp_1src_single and handle_fp_1src_double as
4
these were the last insns decoded by those functions.
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-83-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-31-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/tcg/a64.decode | 5 ++
9
1 file changed, 3 insertions(+), 14 deletions(-)
12
target/arm/tcg/translate-a64.c | 146 ++++-----------------------------
13
2 files changed, 22 insertions(+), 129 deletions(-)
10
14
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
17
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool trans_PRF_rr(DisasContext *s, arg_PRF_rr *a)
19
@@ -XXX,XX +XXX,XX @@ FRINTI_s 00011110 .. 1 001111 10000 ..... ..... @rr_hsd
16
* In the meantime, just emit the moves.
20
17
*/
21
BFCVT_s 00011110 01 1 000110 10000 ..... ..... @rr_s
18
22
19
-static bool trans_MOVPRFX(DisasContext *s, arg_MOVPRFX *a)
23
+FRINT32Z_s 00011110 0. 1 010000 10000 ..... ..... @rr_sd
24
+FRINT32X_s 00011110 0. 1 010001 10000 ..... ..... @rr_sd
25
+FRINT64Z_s 00011110 0. 1 010010 10000 ..... ..... @rr_sd
26
+FRINT64X_s 00011110 0. 1 010011 10000 ..... ..... @rr_sd
27
+
28
# Floating-point Immediate
29
30
FMOVI_s 0001 1110 .. 1 imm:8 100 00000 rd:5 esz=%esz_hsd
31
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/tcg/translate-a64.c
34
+++ b/target/arm/tcg/translate-a64.c
35
@@ -XXX,XX +XXX,XX @@ static const FPScalar1 f_scalar_bfcvt = {
36
};
37
TRANS_FEAT(BFCVT_s, aa64_bf16, do_fp1_scalar, a, &f_scalar_bfcvt, -1)
38
39
-/* Floating-point data-processing (1 source) - single precision */
40
-static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn)
20
-{
41
-{
21
- return do_mov_z(s, a->rd, a->rn);
42
- void (*gen_fpst)(TCGv_i32, TCGv_i32, TCGv_ptr);
43
- TCGv_i32 tcg_op, tcg_res;
44
- TCGv_ptr fpst;
45
- int rmode = -1;
46
+static const FPScalar1 f_scalar_frint32 = {
47
+ NULL,
48
+ gen_helper_frint32_s,
49
+ gen_helper_frint32_d,
50
+};
51
+TRANS_FEAT(FRINT32Z_s, aa64_frint, do_fp1_scalar, a,
52
+ &f_scalar_frint32, FPROUNDING_ZERO)
53
+TRANS_FEAT(FRINT32X_s, aa64_frint, do_fp1_scalar, a, &f_scalar_frint32, -1)
54
55
- tcg_op = read_fp_sreg(s, rn);
56
- tcg_res = tcg_temp_new_i32();
57
-
58
- switch (opcode) {
59
- case 0x10: /* FRINT32Z */
60
- rmode = FPROUNDING_ZERO;
61
- gen_fpst = gen_helper_frint32_s;
62
- break;
63
- case 0x11: /* FRINT32X */
64
- gen_fpst = gen_helper_frint32_s;
65
- break;
66
- case 0x12: /* FRINT64Z */
67
- rmode = FPROUNDING_ZERO;
68
- gen_fpst = gen_helper_frint64_s;
69
- break;
70
- case 0x13: /* FRINT64X */
71
- gen_fpst = gen_helper_frint64_s;
72
- break;
73
- default:
74
- case 0x0: /* FMOV */
75
- case 0x1: /* FABS */
76
- case 0x2: /* FNEG */
77
- case 0x3: /* FSQRT */
78
- case 0x6: /* BFCVT */
79
- case 0x8: /* FRINTN */
80
- case 0x9: /* FRINTP */
81
- case 0xa: /* FRINTM */
82
- case 0xb: /* FRINTZ */
83
- case 0xc: /* FRINTA */
84
- case 0xe: /* FRINTX */
85
- case 0xf: /* FRINTI */
86
- g_assert_not_reached();
87
- }
88
-
89
- fpst = fpstatus_ptr(FPST_FPCR);
90
- if (rmode >= 0) {
91
- TCGv_i32 tcg_rmode = gen_set_rmode(rmode, fpst);
92
- gen_fpst(tcg_res, tcg_op, fpst);
93
- gen_restore_rmode(tcg_rmode, fpst);
94
- } else {
95
- gen_fpst(tcg_res, tcg_op, fpst);
96
- }
97
-
98
- write_fp_sreg(s, rd, tcg_res);
22
-}
99
-}
23
-
100
-
24
-static bool trans_MOVPRFX_m(DisasContext *s, arg_rpr_esz *a)
101
-/* Floating-point data-processing (1 source) - double precision */
102
-static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn)
25
-{
103
-{
26
- return do_sel_z(s, a->rd, a->rn, a->rd, a->pg, a->esz);
104
- void (*gen_fpst)(TCGv_i64, TCGv_i64, TCGv_ptr);
105
- TCGv_i64 tcg_op, tcg_res;
106
- TCGv_ptr fpst;
107
- int rmode = -1;
108
-
109
- tcg_op = read_fp_dreg(s, rn);
110
- tcg_res = tcg_temp_new_i64();
111
-
112
- switch (opcode) {
113
- case 0x10: /* FRINT32Z */
114
- rmode = FPROUNDING_ZERO;
115
- gen_fpst = gen_helper_frint32_d;
116
- break;
117
- case 0x11: /* FRINT32X */
118
- gen_fpst = gen_helper_frint32_d;
119
- break;
120
- case 0x12: /* FRINT64Z */
121
- rmode = FPROUNDING_ZERO;
122
- gen_fpst = gen_helper_frint64_d;
123
- break;
124
- case 0x13: /* FRINT64X */
125
- gen_fpst = gen_helper_frint64_d;
126
- break;
127
- default:
128
- case 0x0: /* FMOV */
129
- case 0x1: /* FABS */
130
- case 0x2: /* FNEG */
131
- case 0x3: /* FSQRT */
132
- case 0x8: /* FRINTN */
133
- case 0x9: /* FRINTP */
134
- case 0xa: /* FRINTM */
135
- case 0xb: /* FRINTZ */
136
- case 0xc: /* FRINTA */
137
- case 0xe: /* FRINTX */
138
- case 0xf: /* FRINTI */
139
- g_assert_not_reached();
140
- }
141
-
142
- fpst = fpstatus_ptr(FPST_FPCR);
143
- if (rmode >= 0) {
144
- TCGv_i32 tcg_rmode = gen_set_rmode(rmode, fpst);
145
- gen_fpst(tcg_res, tcg_op, fpst);
146
- gen_restore_rmode(tcg_rmode, fpst);
147
- } else {
148
- gen_fpst(tcg_res, tcg_op, fpst);
149
- }
150
-
151
- write_fp_dreg(s, rd, tcg_res);
27
-}
152
-}
28
-
153
+static const FPScalar1 f_scalar_frint64 = {
29
-static bool trans_MOVPRFX_z(DisasContext *s, arg_rpr_esz *a)
154
+ NULL,
30
-{
155
+ gen_helper_frint64_s,
31
- return do_movz_zpz(s, a->rd, a->rn, a->pg, a->esz, false);
156
+ gen_helper_frint64_d,
32
-}
157
+};
33
+TRANS_FEAT(MOVPRFX, aa64_sve, do_mov_z, a->rd, a->rn)
158
+TRANS_FEAT(FRINT64Z_s, aa64_frint, do_fp1_scalar, a,
34
+TRANS_FEAT(MOVPRFX_m, aa64_sve, do_sel_z, a->rd, a->rn, a->rd, a->pg, a->esz)
159
+ &f_scalar_frint64, FPROUNDING_ZERO)
35
+TRANS_FEAT(MOVPRFX_z, aa64_sve, do_movz_zpz, a->rd, a->rn, a->pg, a->esz, false)
160
+TRANS_FEAT(FRINT64X_s, aa64_frint, do_fp1_scalar, a, &f_scalar_frint64, -1)
36
161
37
/*
162
static void handle_fp_fcvt(DisasContext *s, int opcode,
38
* SVE2 Integer Multiply - Unpredicated
163
int rd, int rn, int dtype, int ntype)
164
@@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn)
165
break;
166
}
167
168
- case 0x10 ... 0x13: /* FRINT{32,64}{X,Z} */
169
- if (type > 1 || !dc_isar_feature(aa64_frint, s)) {
170
- goto do_unallocated;
171
- }
172
- /* 32-to-32 and 64-to-64 ops */
173
- switch (type) {
174
- case 0:
175
- if (!fp_access_check(s)) {
176
- return;
177
- }
178
- handle_fp_1src_single(s, opcode, rd, rn);
179
- break;
180
- case 1:
181
- if (!fp_access_check(s)) {
182
- return;
183
- }
184
- handle_fp_1src_double(s, opcode, rd, rn);
185
- break;
186
- case 3:
187
- default:
188
- goto do_unallocated;
189
- }
190
- break;
191
-
192
default:
193
do_unallocated:
194
case 0x0: /* FMOV */
195
@@ -XXX,XX +XXX,XX @@ static void disas_fp_1src(DisasContext *s, uint32_t insn)
196
case 0xc: /* FRINTA */
197
case 0xe: /* FRINTX */
198
case 0xf: /* FRINTI */
199
+ case 0x10 ... 0x13: /* FRINT{32,64}{X,Z} */
200
unallocated_encoding(s);
201
break;
202
}
39
--
203
--
40
2.25.1
204
2.34.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
Merge gen_gvec_fn_zzzz with the sve access check and the
3
Remove handle_fp_fcvt and disas_fp_1src as these were
4
dereference of arg_rrrr_esz.
4
the last insns decoded by those functions.
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-37-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-32-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 | 25 ++++++++++++++-----------
11
target/arm/tcg/a64.decode | 7 ++
12
1 file changed, 14 insertions(+), 11 deletions(-)
12
target/arm/tcg/translate-a64.c | 172 +++++++++++++--------------------
13
2 files changed, 74 insertions(+), 105 deletions(-)
13
14
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
--- a/target/arm/tcg/a64.decode
17
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/tcg/a64.decode
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fn_arg_zzz(DisasContext *s, GVecGen3Fn *fn,
19
@@ -XXX,XX +XXX,XX @@ FRINT32X_s 00011110 0. 1 010001 10000 ..... ..... @rr_sd
20
FRINT64Z_s 00011110 0. 1 010010 10000 ..... ..... @rr_sd
21
FRINT64X_s 00011110 0. 1 010011 10000 ..... ..... @rr_sd
22
23
+FCVT_s_ds 00011110 00 1 000101 10000 ..... ..... @rr
24
+FCVT_s_hs 00011110 00 1 000111 10000 ..... ..... @rr
25
+FCVT_s_sd 00011110 01 1 000100 10000 ..... ..... @rr
26
+FCVT_s_hd 00011110 01 1 000111 10000 ..... ..... @rr
27
+FCVT_s_sh 00011110 11 1 000100 10000 ..... ..... @rr
28
+FCVT_s_dh 00011110 11 1 000101 10000 ..... ..... @rr
29
+
30
# Floating-point Immediate
31
32
FMOVI_s 0001 1110 .. 1 imm:8 100 00000 rd:5 esz=%esz_hsd
33
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/tcg/translate-a64.c
36
+++ b/target/arm/tcg/translate-a64.c
37
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FRINT64Z_s, aa64_frint, do_fp1_scalar, a,
38
&f_scalar_frint64, FPROUNDING_ZERO)
39
TRANS_FEAT(FRINT64X_s, aa64_frint, do_fp1_scalar, a, &f_scalar_frint64, -1)
40
41
-static void handle_fp_fcvt(DisasContext *s, int opcode,
42
- int rd, int rn, int dtype, int ntype)
43
+static bool trans_FCVT_s_ds(DisasContext *s, arg_rr *a)
44
{
45
- switch (ntype) {
46
- case 0x0:
47
- {
48
- TCGv_i32 tcg_rn = read_fp_sreg(s, rn);
49
- if (dtype == 1) {
50
- /* Single to double */
51
- TCGv_i64 tcg_rd = tcg_temp_new_i64();
52
- gen_helper_vfp_fcvtds(tcg_rd, tcg_rn, tcg_env);
53
- write_fp_dreg(s, rd, tcg_rd);
54
- } else {
55
- /* Single to half */
56
- TCGv_i32 tcg_rd = tcg_temp_new_i32();
57
- TCGv_i32 ahp = get_ahp_flag();
58
- TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
59
+ if (fp_access_check(s)) {
60
+ TCGv_i32 tcg_rn = read_fp_sreg(s, a->rn);
61
+ TCGv_i64 tcg_rd = tcg_temp_new_i64();
62
63
- gen_helper_vfp_fcvt_f32_to_f16(tcg_rd, tcg_rn, fpst, ahp);
64
- /* write_fp_sreg is OK here because top half of tcg_rd is zero */
65
- write_fp_sreg(s, rd, tcg_rd);
66
- }
67
- break;
68
- }
69
- case 0x1:
70
- {
71
- TCGv_i64 tcg_rn = read_fp_dreg(s, rn);
72
- TCGv_i32 tcg_rd = tcg_temp_new_i32();
73
- if (dtype == 0) {
74
- /* Double to single */
75
- gen_helper_vfp_fcvtsd(tcg_rd, tcg_rn, tcg_env);
76
- } else {
77
- TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
78
- TCGv_i32 ahp = get_ahp_flag();
79
- /* Double to half */
80
- gen_helper_vfp_fcvt_f64_to_f16(tcg_rd, tcg_rn, fpst, ahp);
81
- /* write_fp_sreg is OK here because top half of tcg_rd is zero */
82
- }
83
- write_fp_sreg(s, rd, tcg_rd);
84
- break;
85
- }
86
- case 0x3:
87
- {
88
- TCGv_i32 tcg_rn = read_fp_sreg(s, rn);
89
- TCGv_ptr tcg_fpst = fpstatus_ptr(FPST_FPCR);
90
- TCGv_i32 tcg_ahp = get_ahp_flag();
91
- tcg_gen_ext16u_i32(tcg_rn, tcg_rn);
92
- if (dtype == 0) {
93
- /* Half to single */
94
- TCGv_i32 tcg_rd = tcg_temp_new_i32();
95
- gen_helper_vfp_fcvt_f16_to_f32(tcg_rd, tcg_rn, tcg_fpst, tcg_ahp);
96
- write_fp_sreg(s, rd, tcg_rd);
97
- } else {
98
- /* Half to double */
99
- TCGv_i64 tcg_rd = tcg_temp_new_i64();
100
- gen_helper_vfp_fcvt_f16_to_f64(tcg_rd, tcg_rn, tcg_fpst, tcg_ahp);
101
- write_fp_dreg(s, rd, tcg_rd);
102
- }
103
- break;
104
- }
105
- default:
106
- g_assert_not_reached();
107
+ gen_helper_vfp_fcvtds(tcg_rd, tcg_rn, tcg_env);
108
+ write_fp_dreg(s, a->rd, tcg_rd);
109
}
110
+ return true;
19
}
111
}
20
112
21
/* Invoke a vector expander on four Zregs. */
113
-/* Floating point data-processing (1 source)
22
-static void gen_gvec_fn_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
114
- * 31 30 29 28 24 23 22 21 20 15 14 10 9 5 4 0
23
- int esz, int rd, int rn, int rm, int ra)
115
- * +---+---+---+-----------+------+---+--------+-----------+------+------+
24
+static bool gen_gvec_fn_arg_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
116
- * | M | 0 | S | 1 1 1 1 0 | type | 1 | opcode | 1 0 0 0 0 | Rn | Rd |
25
+ arg_rrrr_esz *a)
117
- * +---+---+---+-----------+------+---+--------+-----------+------+------+
118
- */
119
-static void disas_fp_1src(DisasContext *s, uint32_t insn)
120
+static bool trans_FCVT_s_hs(DisasContext *s, arg_rr *a)
26
{
121
{
27
- unsigned vsz = vec_full_reg_size(s);
122
- int mos = extract32(insn, 29, 3);
28
- gvec_fn(esz, vec_full_reg_offset(s, rd),
123
- int type = extract32(insn, 22, 2);
29
- vec_full_reg_offset(s, rn),
124
- int opcode = extract32(insn, 15, 6);
30
- vec_full_reg_offset(s, rm),
125
- int rn = extract32(insn, 5, 5);
31
- vec_full_reg_offset(s, ra), vsz, vsz);
126
- int rd = extract32(insn, 0, 5);
32
+ if (gvec_fn == NULL) {
127
+ if (fp_access_check(s)) {
33
+ return false;
128
+ TCGv_i32 tmp = read_fp_sreg(s, a->rn);
129
+ TCGv_i32 ahp = get_ahp_flag();
130
+ TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
131
132
- if (mos) {
133
- goto do_unallocated;
134
+ gen_helper_vfp_fcvt_f32_to_f16(tmp, tmp, fpst, ahp);
135
+ /* write_fp_sreg is OK here because top half of result is zero */
136
+ write_fp_sreg(s, a->rd, tmp);
137
}
138
+ return true;
139
+}
140
141
- switch (opcode) {
142
- case 0x4: case 0x5: case 0x7:
143
- {
144
- /* FCVT between half, single and double precision */
145
- int dtype = extract32(opcode, 0, 2);
146
- if (type == 2 || dtype == type) {
147
- goto do_unallocated;
148
- }
149
- if (!fp_access_check(s)) {
150
- return;
151
- }
152
+static bool trans_FCVT_s_sd(DisasContext *s, arg_rr *a)
153
+{
154
+ if (fp_access_check(s)) {
155
+ TCGv_i64 tcg_rn = read_fp_dreg(s, a->rn);
156
+ TCGv_i32 tcg_rd = tcg_temp_new_i32();
157
158
- handle_fp_fcvt(s, opcode, rd, rn, dtype, type);
159
- break;
160
+ gen_helper_vfp_fcvtsd(tcg_rd, tcg_rn, tcg_env);
161
+ write_fp_sreg(s, a->rd, tcg_rd);
162
}
163
+ return true;
164
+}
165
166
- default:
167
- do_unallocated:
168
- case 0x0: /* FMOV */
169
- case 0x1: /* FABS */
170
- case 0x2: /* FNEG */
171
- case 0x3: /* FSQRT */
172
- case 0x6: /* BFCVT */
173
- case 0x8: /* FRINTN */
174
- case 0x9: /* FRINTP */
175
- case 0xa: /* FRINTM */
176
- case 0xb: /* FRINTZ */
177
- case 0xc: /* FRINTA */
178
- case 0xe: /* FRINTX */
179
- case 0xf: /* FRINTI */
180
- case 0x10 ... 0x13: /* FRINT{32,64}{X,Z} */
181
- unallocated_encoding(s);
182
- break;
183
+static bool trans_FCVT_s_hd(DisasContext *s, arg_rr *a)
184
+{
185
+ if (fp_access_check(s)) {
186
+ TCGv_i64 tcg_rn = read_fp_dreg(s, a->rn);
187
+ TCGv_i32 tcg_rd = tcg_temp_new_i32();
188
+ TCGv_i32 ahp = get_ahp_flag();
189
+ TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
190
+
191
+ gen_helper_vfp_fcvt_f64_to_f16(tcg_rd, tcg_rn, fpst, ahp);
192
+ /* write_fp_sreg is OK here because top half of tcg_rd is zero */
193
+ write_fp_sreg(s, a->rd, tcg_rd);
194
}
195
+ return true;
196
+}
197
+
198
+static bool trans_FCVT_s_sh(DisasContext *s, arg_rr *a)
199
+{
200
+ if (fp_access_check(s)) {
201
+ TCGv_i32 tcg_rn = read_fp_hreg(s, a->rn);
202
+ TCGv_i32 tcg_rd = tcg_temp_new_i32();
203
+ TCGv_ptr tcg_fpst = fpstatus_ptr(FPST_FPCR);
204
+ TCGv_i32 tcg_ahp = get_ahp_flag();
205
+
206
+ gen_helper_vfp_fcvt_f16_to_f32(tcg_rd, tcg_rn, tcg_fpst, tcg_ahp);
207
+ write_fp_sreg(s, a->rd, tcg_rd);
34
+ }
208
+ }
35
+ if (sve_access_check(s)) {
209
+ return true;
36
+ unsigned vsz = vec_full_reg_size(s);
210
+}
37
+ gvec_fn(a->esz, vec_full_reg_offset(s, a->rd),
211
+
38
+ vec_full_reg_offset(s, a->rn),
212
+static bool trans_FCVT_s_dh(DisasContext *s, arg_rr *a)
39
+ vec_full_reg_offset(s, a->rm),
213
+{
40
+ vec_full_reg_offset(s, a->ra), vsz, vsz);
214
+ if (fp_access_check(s)) {
215
+ TCGv_i32 tcg_rn = read_fp_hreg(s, a->rn);
216
+ TCGv_i64 tcg_rd = tcg_temp_new_i64();
217
+ TCGv_ptr tcg_fpst = fpstatus_ptr(FPST_FPCR);
218
+ TCGv_i32 tcg_ahp = get_ahp_flag();
219
+
220
+ gen_helper_vfp_fcvt_f16_to_f64(tcg_rd, tcg_rn, tcg_fpst, tcg_ahp);
221
+ write_fp_dreg(s, a->rd, tcg_rd);
41
+ }
222
+ }
42
+ return true;
223
+ return true;
43
}
224
}
44
225
45
/* Invoke a vector move on two Zregs. */
226
/* Handle floating point <=> fixed point conversions. Note that we can
46
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zzzz_fn(DisasContext *s, arg_rrrr_esz *a, GVecGen4Fn *fn)
227
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_fp(DisasContext *s, uint32_t insn)
47
if (!dc_isar_feature(aa64_sve2, s)) {
228
break;
48
return false;
229
case 2: /* [15:12] == x100 */
49
}
230
/* Floating point data-processing (1 source) */
50
- if (sve_access_check(s)) {
231
- disas_fp_1src(s, insn);
51
- gen_gvec_fn_zzzz(s, fn, a->esz, a->rd, a->rn, a->rm, a->ra);
232
+ unallocated_encoding(s); /* in decodetree */
52
- }
233
break;
53
- return true;
234
case 3: /* [15:12] == 1000 */
54
+ return gen_gvec_fn_arg_zzzz(s, fn, a);
235
unallocated_encoding(s);
55
}
56
57
static void gen_eor3_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
58
--
236
--
59
2.25.1
237
2.34.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
This includes SCVTF, UCVTF, FCVT{N,P,M,Z,A}{S,U}.
4
of the illegal esz == 0 into the normal fn == NULL check.
4
Remove disas_fp_fixed_conv as those were the last insns
5
decoded by that function.
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-93-richard.henderson@linaro.org
9
Message-id: 20241211163036.2297116-33-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 | 15 ++++++++-------
12
target/arm/tcg/a64.decode | 40 ++++
12
1 file changed, 8 insertions(+), 7 deletions(-)
13
target/arm/tcg/translate-a64.c | 391 ++++++++++++++-------------------
14
2 files changed, 209 insertions(+), 222 deletions(-)
13
15
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
18
--- a/target/arm/tcg/a64.decode
17
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/tcg/a64.decode
18
@@ -XXX,XX +XXX,XX @@ static bool trans_FCVTZU_dd(DisasContext *s, arg_rpr_esz *a)
20
@@ -XXX,XX +XXX,XX @@ FMAXV_s 0110 1110 00 11000 01111 10 ..... ..... @rr_q1e2
19
return do_zpz_ptr(s, a->rd, a->rn, a->pg, false, gen_helper_sve_fcvtzu_dd);
21
FMINV_h 0.00 1110 10 11000 01111 10 ..... ..... @qrr_h
22
FMINV_s 0110 1110 10 11000 01111 10 ..... ..... @rr_q1e2
23
24
+# Conversion between floating-point and fixed-point (general register)
25
+
26
+&fcvt rd rn esz sf shift
27
+%fcvt_shift32 10:5 !function=rsub_32
28
+%fcvt_shift64 10:6 !function=rsub_64
29
+
30
+@fcvt32 0 ....... .. ...... 1..... rn:5 rd:5 \
31
+ &fcvt sf=0 esz=%esz_hsd shift=%fcvt_shift32
32
+@fcvt64 1 ....... .. ...... ...... rn:5 rd:5 \
33
+ &fcvt sf=1 esz=%esz_hsd shift=%fcvt_shift64
34
+
35
+SCVTF_g . 0011110 .. 000010 ...... ..... ..... @fcvt32
36
+SCVTF_g . 0011110 .. 000010 ...... ..... ..... @fcvt64
37
+UCVTF_g . 0011110 .. 000011 ...... ..... ..... @fcvt32
38
+UCVTF_g . 0011110 .. 000011 ...... ..... ..... @fcvt64
39
+
40
+FCVTZS_g . 0011110 .. 011000 ...... ..... ..... @fcvt32
41
+FCVTZS_g . 0011110 .. 011000 ...... ..... ..... @fcvt64
42
+FCVTZU_g . 0011110 .. 011001 ...... ..... ..... @fcvt32
43
+FCVTZU_g . 0011110 .. 011001 ...... ..... ..... @fcvt64
44
+
45
+# Conversion between floating-point and integer (general register)
46
+
47
+@icvt sf:1 ....... .. ...... ...... rn:5 rd:5 \
48
+ &fcvt esz=%esz_hsd shift=0
49
+
50
+SCVTF_g . 0011110 .. 100010 000000 ..... ..... @icvt
51
+UCVTF_g . 0011110 .. 100011 000000 ..... ..... @icvt
52
+
53
+FCVTNS_g . 0011110 .. 100000 000000 ..... ..... @icvt
54
+FCVTNU_g . 0011110 .. 100001 000000 ..... ..... @icvt
55
+FCVTPS_g . 0011110 .. 101000 000000 ..... ..... @icvt
56
+FCVTPU_g . 0011110 .. 101001 000000 ..... ..... @icvt
57
+FCVTMS_g . 0011110 .. 110000 000000 ..... ..... @icvt
58
+FCVTMU_g . 0011110 .. 110001 000000 ..... ..... @icvt
59
+FCVTZS_g . 0011110 .. 111000 000000 ..... ..... @icvt
60
+FCVTZU_g . 0011110 .. 111001 000000 ..... ..... @icvt
61
+FCVTAS_g . 0011110 .. 100100 000000 ..... ..... @icvt
62
+FCVTAU_g . 0011110 .. 100101 000000 ..... ..... @icvt
63
+
64
# Floating-point data processing (1 source)
65
66
FMOV_s 00011110 .. 1 000000 10000 ..... ..... @rr_hsd
67
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
68
index XXXXXXX..XXXXXXX 100644
69
--- a/target/arm/tcg/translate-a64.c
70
+++ b/target/arm/tcg/translate-a64.c
71
@@ -XXX,XX +XXX,XX @@ static bool trans_FCVT_s_dh(DisasContext *s, arg_rr *a)
72
return true;
20
}
73
}
21
74
22
-static gen_helper_gvec_3_ptr * const frint_fns[3] = {
75
-/* Handle floating point <=> fixed point conversions. Note that we can
23
+static gen_helper_gvec_3_ptr * const frint_fns[] = {
76
- * also deal with fp <=> integer conversions as a special case (scale == 64)
24
+ NULL,
77
- * OPTME: consider handling that special case specially or at least skipping
25
gen_helper_sve_frint_h,
78
- * the call to scalbn in the helpers for zero shifts.
26
gen_helper_sve_frint_s,
79
- */
27
gen_helper_sve_frint_d
80
-static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode,
28
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTI(DisasContext *s, arg_rpr_esz *a)
81
- bool itof, int rmode, int scale, int sf, int type)
29
return false;
82
+static bool do_cvtf_scalar(DisasContext *s, MemOp esz, int rd, int shift,
83
+ TCGv_i64 tcg_int, bool is_signed)
84
{
85
- bool is_signed = !(opcode & 1);
86
TCGv_ptr tcg_fpstatus;
87
TCGv_i32 tcg_shift, tcg_single;
88
TCGv_i64 tcg_double;
89
90
- tcg_fpstatus = fpstatus_ptr(type == 3 ? FPST_FPCR_F16 : FPST_FPCR);
91
+ tcg_fpstatus = fpstatus_ptr(esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
92
+ tcg_shift = tcg_constant_i32(shift);
93
94
- tcg_shift = tcg_constant_i32(64 - scale);
95
-
96
- if (itof) {
97
- TCGv_i64 tcg_int = cpu_reg(s, rn);
98
- if (!sf) {
99
- TCGv_i64 tcg_extend = tcg_temp_new_i64();
100
-
101
- if (is_signed) {
102
- tcg_gen_ext32s_i64(tcg_extend, tcg_int);
103
- } else {
104
- tcg_gen_ext32u_i64(tcg_extend, tcg_int);
105
- }
106
-
107
- tcg_int = tcg_extend;
108
+ switch (esz) {
109
+ case MO_64:
110
+ tcg_double = tcg_temp_new_i64();
111
+ if (is_signed) {
112
+ gen_helper_vfp_sqtod(tcg_double, tcg_int, tcg_shift, tcg_fpstatus);
113
+ } else {
114
+ gen_helper_vfp_uqtod(tcg_double, tcg_int, tcg_shift, tcg_fpstatus);
115
}
116
+ write_fp_dreg(s, rd, tcg_double);
117
+ break;
118
119
- switch (type) {
120
- case 1: /* float64 */
121
- tcg_double = tcg_temp_new_i64();
122
- if (is_signed) {
123
- gen_helper_vfp_sqtod(tcg_double, tcg_int,
124
- tcg_shift, tcg_fpstatus);
125
- } else {
126
- gen_helper_vfp_uqtod(tcg_double, tcg_int,
127
- tcg_shift, tcg_fpstatus);
128
- }
129
- write_fp_dreg(s, rd, tcg_double);
130
- break;
131
-
132
- case 0: /* float32 */
133
- tcg_single = tcg_temp_new_i32();
134
- if (is_signed) {
135
- gen_helper_vfp_sqtos(tcg_single, tcg_int,
136
- tcg_shift, tcg_fpstatus);
137
- } else {
138
- gen_helper_vfp_uqtos(tcg_single, tcg_int,
139
- tcg_shift, tcg_fpstatus);
140
- }
141
- write_fp_sreg(s, rd, tcg_single);
142
- break;
143
-
144
- case 3: /* float16 */
145
- tcg_single = tcg_temp_new_i32();
146
- if (is_signed) {
147
- gen_helper_vfp_sqtoh(tcg_single, tcg_int,
148
- tcg_shift, tcg_fpstatus);
149
- } else {
150
- gen_helper_vfp_uqtoh(tcg_single, tcg_int,
151
- tcg_shift, tcg_fpstatus);
152
- }
153
- write_fp_sreg(s, rd, tcg_single);
154
- break;
155
-
156
- default:
157
- g_assert_not_reached();
158
+ case MO_32:
159
+ tcg_single = tcg_temp_new_i32();
160
+ if (is_signed) {
161
+ gen_helper_vfp_sqtos(tcg_single, tcg_int, tcg_shift, tcg_fpstatus);
162
+ } else {
163
+ gen_helper_vfp_uqtos(tcg_single, tcg_int, tcg_shift, tcg_fpstatus);
164
}
165
- } else {
166
- TCGv_i64 tcg_int = cpu_reg(s, rd);
167
- TCGv_i32 tcg_rmode;
168
+ write_fp_sreg(s, rd, tcg_single);
169
+ break;
170
171
- if (extract32(opcode, 2, 1)) {
172
- /* There are too many rounding modes to all fit into rmode,
173
- * so FCVTA[US] is a special case.
174
- */
175
- rmode = FPROUNDING_TIEAWAY;
176
+ case MO_16:
177
+ tcg_single = tcg_temp_new_i32();
178
+ if (is_signed) {
179
+ gen_helper_vfp_sqtoh(tcg_single, tcg_int, tcg_shift, tcg_fpstatus);
180
+ } else {
181
+ gen_helper_vfp_uqtoh(tcg_single, tcg_int, tcg_shift, tcg_fpstatus);
182
}
183
+ write_fp_sreg(s, rd, tcg_single);
184
+ break;
185
186
- tcg_rmode = gen_set_rmode(rmode, tcg_fpstatus);
187
-
188
- switch (type) {
189
- case 1: /* float64 */
190
- tcg_double = read_fp_dreg(s, rn);
191
- if (is_signed) {
192
- if (!sf) {
193
- gen_helper_vfp_tosld(tcg_int, tcg_double,
194
- tcg_shift, tcg_fpstatus);
195
- } else {
196
- gen_helper_vfp_tosqd(tcg_int, tcg_double,
197
- tcg_shift, tcg_fpstatus);
198
- }
199
- } else {
200
- if (!sf) {
201
- gen_helper_vfp_tould(tcg_int, tcg_double,
202
- tcg_shift, tcg_fpstatus);
203
- } else {
204
- gen_helper_vfp_touqd(tcg_int, tcg_double,
205
- tcg_shift, tcg_fpstatus);
206
- }
207
- }
208
- if (!sf) {
209
- tcg_gen_ext32u_i64(tcg_int, tcg_int);
210
- }
211
- break;
212
-
213
- case 0: /* float32 */
214
- tcg_single = read_fp_sreg(s, rn);
215
- if (sf) {
216
- if (is_signed) {
217
- gen_helper_vfp_tosqs(tcg_int, tcg_single,
218
- tcg_shift, tcg_fpstatus);
219
- } else {
220
- gen_helper_vfp_touqs(tcg_int, tcg_single,
221
- tcg_shift, tcg_fpstatus);
222
- }
223
- } else {
224
- TCGv_i32 tcg_dest = tcg_temp_new_i32();
225
- if (is_signed) {
226
- gen_helper_vfp_tosls(tcg_dest, tcg_single,
227
- tcg_shift, tcg_fpstatus);
228
- } else {
229
- gen_helper_vfp_touls(tcg_dest, tcg_single,
230
- tcg_shift, tcg_fpstatus);
231
- }
232
- tcg_gen_extu_i32_i64(tcg_int, tcg_dest);
233
- }
234
- break;
235
-
236
- case 3: /* float16 */
237
- tcg_single = read_fp_sreg(s, rn);
238
- if (sf) {
239
- if (is_signed) {
240
- gen_helper_vfp_tosqh(tcg_int, tcg_single,
241
- tcg_shift, tcg_fpstatus);
242
- } else {
243
- gen_helper_vfp_touqh(tcg_int, tcg_single,
244
- tcg_shift, tcg_fpstatus);
245
- }
246
- } else {
247
- TCGv_i32 tcg_dest = tcg_temp_new_i32();
248
- if (is_signed) {
249
- gen_helper_vfp_toslh(tcg_dest, tcg_single,
250
- tcg_shift, tcg_fpstatus);
251
- } else {
252
- gen_helper_vfp_toulh(tcg_dest, tcg_single,
253
- tcg_shift, tcg_fpstatus);
254
- }
255
- tcg_gen_extu_i32_i64(tcg_int, tcg_dest);
256
- }
257
- break;
258
-
259
- default:
260
- g_assert_not_reached();
261
- }
262
-
263
- gen_restore_rmode(tcg_rmode, tcg_fpstatus);
264
+ default:
265
+ g_assert_not_reached();
30
}
266
}
31
return do_zpz_ptr(s, a->rd, a->rn, a->pg, a->esz == MO_16,
267
+ return true;
32
- frint_fns[a->esz - 1]);
33
+ frint_fns[a->esz]);
34
}
268
}
35
269
36
static bool trans_FRINTX(DisasContext *s, arg_rpr_esz *a)
270
-/* Floating point <-> fixed point conversions
37
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTN(DisasContext *s, arg_rpr_esz *a)
271
- * 31 30 29 28 24 23 22 21 20 19 18 16 15 10 9 5 4 0
38
if (a->esz == 0) {
272
- * +----+---+---+-----------+------+---+-------+--------+-------+------+------+
39
return false;
273
- * | sf | 0 | S | 1 1 1 1 0 | type | 0 | rmode | opcode | scale | Rn | Rd |
274
- * +----+---+---+-----------+------+---+-------+--------+-------+------+------+
275
- */
276
-static void disas_fp_fixed_conv(DisasContext *s, uint32_t insn)
277
+static bool do_cvtf_g(DisasContext *s, arg_fcvt *a, bool is_signed)
278
{
279
- int rd = extract32(insn, 0, 5);
280
- int rn = extract32(insn, 5, 5);
281
- int scale = extract32(insn, 10, 6);
282
- int opcode = extract32(insn, 16, 3);
283
- int rmode = extract32(insn, 19, 2);
284
- int type = extract32(insn, 22, 2);
285
- bool sbit = extract32(insn, 29, 1);
286
- bool sf = extract32(insn, 31, 1);
287
- bool itof;
288
+ TCGv_i64 tcg_int;
289
+ int check = fp_access_check_scalar_hsd(s, a->esz);
290
291
- if (sbit || (!sf && scale < 32)) {
292
- unallocated_encoding(s);
293
- return;
294
+ if (check <= 0) {
295
+ return check == 0;
40
}
296
}
41
- return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz - 1]);
297
42
+ return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz]);
298
- switch (type) {
299
- case 0: /* float32 */
300
- case 1: /* float64 */
301
- break;
302
- case 3: /* float16 */
303
- if (dc_isar_feature(aa64_fp16, s)) {
304
- break;
305
+ if (a->sf) {
306
+ tcg_int = cpu_reg(s, a->rn);
307
+ } else {
308
+ tcg_int = read_cpu_reg(s, a->rn, true);
309
+ if (is_signed) {
310
+ tcg_gen_ext32s_i64(tcg_int, tcg_int);
311
+ } else {
312
+ tcg_gen_ext32u_i64(tcg_int, tcg_int);
313
}
314
- /* fallthru */
315
- default:
316
- unallocated_encoding(s);
317
- return;
318
}
319
-
320
- switch ((rmode << 3) | opcode) {
321
- case 0x2: /* SCVTF */
322
- case 0x3: /* UCVTF */
323
- itof = true;
324
- break;
325
- case 0x18: /* FCVTZS */
326
- case 0x19: /* FCVTZU */
327
- itof = false;
328
- break;
329
- default:
330
- unallocated_encoding(s);
331
- return;
332
- }
333
-
334
- if (!fp_access_check(s)) {
335
- return;
336
- }
337
-
338
- handle_fpfpcvt(s, rd, rn, opcode, itof, FPROUNDING_ZERO, scale, sf, type);
339
+ return do_cvtf_scalar(s, a->esz, a->rd, a->shift, tcg_int, is_signed);
43
}
340
}
44
341
45
static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
342
+TRANS(SCVTF_g, do_cvtf_g, a, true)
46
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
343
+TRANS(UCVTF_g, do_cvtf_g, a, false)
47
if (a->esz == 0) {
344
+
48
return false;
345
+static void do_fcvt_scalar(DisasContext *s, MemOp out, MemOp esz,
49
}
346
+ TCGv_i64 tcg_out, int shift, int rn,
50
- return do_frint_mode(s, a, float_round_up, frint_fns[a->esz - 1]);
347
+ ARMFPRounding rmode)
51
+ return do_frint_mode(s, a, float_round_up, frint_fns[a->esz]);
348
+{
52
}
349
+ TCGv_ptr tcg_fpstatus;
53
350
+ TCGv_i32 tcg_shift, tcg_rmode, tcg_single;
54
static bool trans_FRINTM(DisasContext *s, arg_rpr_esz *a)
351
+
55
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTM(DisasContext *s, arg_rpr_esz *a)
352
+ tcg_fpstatus = fpstatus_ptr(esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
56
if (a->esz == 0) {
353
+ tcg_shift = tcg_constant_i32(shift);
57
return false;
354
+ tcg_rmode = gen_set_rmode(rmode, tcg_fpstatus);
58
}
355
+
59
- return do_frint_mode(s, a, float_round_down, frint_fns[a->esz - 1]);
356
+ switch (esz) {
60
+ return do_frint_mode(s, a, float_round_down, frint_fns[a->esz]);
357
+ case MO_64:
61
}
358
+ read_vec_element(s, tcg_out, rn, 0, MO_64);
62
359
+ switch (out) {
63
static bool trans_FRINTZ(DisasContext *s, arg_rpr_esz *a)
360
+ case MO_64 | MO_SIGN:
64
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTZ(DisasContext *s, arg_rpr_esz *a)
361
+ gen_helper_vfp_tosqd(tcg_out, tcg_out, tcg_shift, tcg_fpstatus);
65
if (a->esz == 0) {
362
+ break;
66
return false;
363
+ case MO_64:
67
}
364
+ gen_helper_vfp_touqd(tcg_out, tcg_out, tcg_shift, tcg_fpstatus);
68
- return do_frint_mode(s, a, float_round_to_zero, frint_fns[a->esz - 1]);
365
+ break;
69
+ return do_frint_mode(s, a, float_round_to_zero, frint_fns[a->esz]);
366
+ case MO_32 | MO_SIGN:
70
}
367
+ gen_helper_vfp_tosld(tcg_out, tcg_out, tcg_shift, tcg_fpstatus);
71
368
+ break;
72
static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
369
+ case MO_32:
73
@@ -XXX,XX +XXX,XX @@ static bool trans_FRINTA(DisasContext *s, arg_rpr_esz *a)
370
+ gen_helper_vfp_tould(tcg_out, tcg_out, tcg_shift, tcg_fpstatus);
74
if (a->esz == 0) {
371
+ break;
75
return false;
372
+ default:
76
}
373
+ g_assert_not_reached();
77
- return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz - 1]);
374
+ }
78
+ return do_frint_mode(s, a, float_round_ties_away, frint_fns[a->esz]);
375
+ break;
79
}
376
+
80
377
+ case MO_32:
81
static bool trans_FRECPX(DisasContext *s, arg_rpr_esz *a)
378
+ tcg_single = read_fp_sreg(s, rn);
379
+ switch (out) {
380
+ case MO_64 | MO_SIGN:
381
+ gen_helper_vfp_tosqs(tcg_out, tcg_single, tcg_shift, tcg_fpstatus);
382
+ break;
383
+ case MO_64:
384
+ gen_helper_vfp_touqs(tcg_out, tcg_single, tcg_shift, tcg_fpstatus);
385
+ break;
386
+ case MO_32 | MO_SIGN:
387
+ gen_helper_vfp_tosls(tcg_single, tcg_single,
388
+ tcg_shift, tcg_fpstatus);
389
+ tcg_gen_extu_i32_i64(tcg_out, tcg_single);
390
+ break;
391
+ case MO_32:
392
+ gen_helper_vfp_touls(tcg_single, tcg_single,
393
+ tcg_shift, tcg_fpstatus);
394
+ tcg_gen_extu_i32_i64(tcg_out, tcg_single);
395
+ break;
396
+ default:
397
+ g_assert_not_reached();
398
+ }
399
+ break;
400
+
401
+ case MO_16:
402
+ tcg_single = read_fp_hreg(s, rn);
403
+ switch (out) {
404
+ case MO_64 | MO_SIGN:
405
+ gen_helper_vfp_tosqh(tcg_out, tcg_single, tcg_shift, tcg_fpstatus);
406
+ break;
407
+ case MO_64:
408
+ gen_helper_vfp_touqh(tcg_out, tcg_single, tcg_shift, tcg_fpstatus);
409
+ break;
410
+ case MO_32 | MO_SIGN:
411
+ gen_helper_vfp_toslh(tcg_single, tcg_single,
412
+ tcg_shift, tcg_fpstatus);
413
+ tcg_gen_extu_i32_i64(tcg_out, tcg_single);
414
+ break;
415
+ case MO_32:
416
+ gen_helper_vfp_toulh(tcg_single, tcg_single,
417
+ tcg_shift, tcg_fpstatus);
418
+ tcg_gen_extu_i32_i64(tcg_out, tcg_single);
419
+ break;
420
+ default:
421
+ g_assert_not_reached();
422
+ }
423
+ break;
424
+
425
+ default:
426
+ g_assert_not_reached();
427
+ }
428
+
429
+ gen_restore_rmode(tcg_rmode, tcg_fpstatus);
430
+}
431
+
432
+static bool do_fcvt_g(DisasContext *s, arg_fcvt *a,
433
+ ARMFPRounding rmode, bool is_signed)
434
+{
435
+ TCGv_i64 tcg_int;
436
+ int check = fp_access_check_scalar_hsd(s, a->esz);
437
+
438
+ if (check <= 0) {
439
+ return check == 0;
440
+ }
441
+
442
+ tcg_int = cpu_reg(s, a->rd);
443
+ do_fcvt_scalar(s, (a->sf ? MO_64 : MO_32) | (is_signed ? MO_SIGN : 0),
444
+ a->esz, tcg_int, a->shift, a->rn, rmode);
445
+
446
+ if (!a->sf) {
447
+ tcg_gen_ext32u_i64(tcg_int, tcg_int);
448
+ }
449
+ return true;
450
+}
451
+
452
+TRANS(FCVTNS_g, do_fcvt_g, a, FPROUNDING_TIEEVEN, true)
453
+TRANS(FCVTNU_g, do_fcvt_g, a, FPROUNDING_TIEEVEN, false)
454
+TRANS(FCVTPS_g, do_fcvt_g, a, FPROUNDING_POSINF, true)
455
+TRANS(FCVTPU_g, do_fcvt_g, a, FPROUNDING_POSINF, false)
456
+TRANS(FCVTMS_g, do_fcvt_g, a, FPROUNDING_NEGINF, true)
457
+TRANS(FCVTMU_g, do_fcvt_g, a, FPROUNDING_NEGINF, false)
458
+TRANS(FCVTZS_g, do_fcvt_g, a, FPROUNDING_ZERO, true)
459
+TRANS(FCVTZU_g, do_fcvt_g, a, FPROUNDING_ZERO, false)
460
+TRANS(FCVTAS_g, do_fcvt_g, a, FPROUNDING_TIEAWAY, true)
461
+TRANS(FCVTAU_g, do_fcvt_g, a, FPROUNDING_TIEAWAY, false)
462
+
463
static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof)
464
{
465
/* FMOV: gpr to or from float, double, or top half of quad fp reg,
466
@@ -XXX,XX +XXX,XX @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
467
switch (opcode) {
468
case 2: /* SCVTF */
469
case 3: /* UCVTF */
470
- itof = true;
471
- /* fallthru */
472
case 4: /* FCVTAS */
473
case 5: /* FCVTAU */
474
- if (rmode != 0) {
475
- goto do_unallocated;
476
- }
477
- /* fallthru */
478
case 0: /* FCVT[NPMZ]S */
479
case 1: /* FCVT[NPMZ]U */
480
- switch (type) {
481
- case 0: /* float32 */
482
- case 1: /* float64 */
483
- break;
484
- case 3: /* float16 */
485
- if (!dc_isar_feature(aa64_fp16, s)) {
486
- goto do_unallocated;
487
- }
488
- break;
489
- default:
490
- goto do_unallocated;
491
- }
492
- if (!fp_access_check(s)) {
493
- return;
494
- }
495
- handle_fpfpcvt(s, rd, rn, opcode, itof, rmode, 64, sf, type);
496
- break;
497
+ goto do_unallocated;
498
499
default:
500
switch (sf << 7 | type << 5 | rmode << 3 | opcode) {
501
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_fp(DisasContext *s, uint32_t insn)
502
unallocated_encoding(s); /* in decodetree */
503
} else if (extract32(insn, 21, 1) == 0) {
504
/* Floating point to fixed point conversions */
505
- disas_fp_fixed_conv(s, insn);
506
+ unallocated_encoding(s); /* in decodetree */
507
} else {
508
switch (extract32(insn, 10, 2)) {
509
case 1: /* Floating point conditional compare */
82
--
510
--
83
2.25.1
511
2.34.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-31-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-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 | 36 +++++++++++++++---------------------
8
target/arm/tcg/a64.decode | 2 ++
9
1 file changed, 15 insertions(+), 21 deletions(-)
9
target/arm/tcg/translate-a64.c | 41 +++++++++++++++++-----------------
10
2 files changed, 22 insertions(+), 21 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzz(DisasContext *s, gen_helper_gvec_4 *fn,
16
@@ -XXX,XX +XXX,XX @@ FCVTZU_g . 0011110 .. 111001 000000 ..... ..... @icvt
16
}
17
FCVTAS_g . 0011110 .. 100100 000000 ..... ..... @icvt
17
18
FCVTAU_g . 0011110 .. 100101 000000 ..... ..... @icvt
18
/* Invoke a vector expander on three Zregs. */
19
19
-static void gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
20
+FJCVTZS 0 0011110 01 111110 000000 ..... ..... @rr
20
+static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
21
+
21
int esz, int rd, int rn, int rm)
22
# Floating-point data processing (1 source)
22
{
23
23
- unsigned vsz = vec_full_reg_size(s);
24
FMOV_s 00011110 .. 1 000000 10000 ..... ..... @rr_hsd
24
- gvec_fn(esz, vec_full_reg_offset(s, rd),
25
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
25
- vec_full_reg_offset(s, rn),
26
index XXXXXXX..XXXXXXX 100644
26
- vec_full_reg_offset(s, rm), vsz, vsz);
27
--- a/target/arm/tcg/translate-a64.c
27
+ if (gvec_fn == NULL) {
28
+++ b/target/arm/tcg/translate-a64.c
29
@@ -XXX,XX +XXX,XX @@ TRANS(FCVTZU_g, do_fcvt_g, a, FPROUNDING_ZERO, false)
30
TRANS(FCVTAS_g, do_fcvt_g, a, FPROUNDING_TIEAWAY, true)
31
TRANS(FCVTAU_g, do_fcvt_g, a, FPROUNDING_TIEAWAY, false)
32
33
+static bool trans_FJCVTZS(DisasContext *s, arg_FJCVTZS *a)
34
+{
35
+ if (!dc_isar_feature(aa64_jscvt, s)) {
28
+ return false;
36
+ return false;
29
+ }
37
+ }
30
+ if (sve_access_check(s)) {
38
+ if (fp_access_check(s)) {
31
+ unsigned vsz = vec_full_reg_size(s);
39
+ TCGv_i64 t = read_fp_dreg(s, a->rn);
32
+ gvec_fn(esz, vec_full_reg_offset(s, rd),
40
+ TCGv_ptr fpstatus = fpstatus_ptr(FPST_FPCR);
33
+ vec_full_reg_offset(s, rn),
41
+
34
+ vec_full_reg_offset(s, rm), vsz, vsz);
42
+ gen_helper_fjcvtzs(t, t, fpstatus);
43
+
44
+ tcg_gen_ext32u_i64(cpu_reg(s, a->rd), t);
45
+ tcg_gen_extrh_i64_i32(cpu_ZF, t);
46
+ tcg_gen_movi_i32(cpu_CF, 0);
47
+ tcg_gen_movi_i32(cpu_NF, 0);
48
+ tcg_gen_movi_i32(cpu_VF, 0);
35
+ }
49
+ }
36
+ return true;
50
+ return true;
51
+}
52
+
53
static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof)
54
{
55
/* FMOV: gpr to or from float, double, or top half of quad fp reg,
56
@@ -XXX,XX +XXX,XX @@ static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof)
57
}
37
}
58
}
38
59
39
/* Invoke a vector expander on four Zregs. */
60
-static void handle_fjcvtzs(DisasContext *s, int rd, int rn)
40
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
61
-{
41
62
- TCGv_i64 t = read_fp_dreg(s, rn);
42
static bool do_zzz_fn(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *gvec_fn)
63
- TCGv_ptr fpstatus = fpstatus_ptr(FPST_FPCR);
43
{
64
-
44
- if (sve_access_check(s)) {
65
- gen_helper_fjcvtzs(t, t, fpstatus);
45
- gen_gvec_fn_zzz(s, gvec_fn, a->esz, a->rd, a->rn, a->rm);
66
-
46
- }
67
- tcg_gen_ext32u_i64(cpu_reg(s, rd), t);
47
- return true;
68
- tcg_gen_extrh_i64_i32(cpu_ZF, t);
48
+ return gen_gvec_fn_zzz(s, gvec_fn, a->esz, a->rd, a->rn, a->rm);
69
- tcg_gen_movi_i32(cpu_CF, 0);
49
}
70
- tcg_gen_movi_i32(cpu_NF, 0);
50
71
- tcg_gen_movi_i32(cpu_VF, 0);
51
static bool trans_AND_zzz(DisasContext *s, arg_rrr_esz *a)
72
-}
52
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
73
-
53
if (!dc_isar_feature(aa64_sve2, s)) {
74
/* Floating point <-> integer conversions
54
return false;
75
* 31 30 29 28 24 23 22 21 20 19 18 16 15 10 9 5 4 0
55
}
76
* +----+---+---+-----------+------+---+-------+-----+-------------+----+----+
56
- if (sve_access_check(s)) {
77
@@ -XXX,XX +XXX,XX @@ static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
57
- gen_gvec_fn_zzz(s, tcg_gen_gvec_mul, a->esz, a->rd, a->rn, a->rm);
78
break;
58
- }
79
59
- return true;
80
case 0b00111110: /* FJCVTZS */
60
+ return gen_gvec_fn_zzz(s, tcg_gen_gvec_mul, a->esz, a->rd, a->rn, a->rm);
81
- if (!dc_isar_feature(aa64_jscvt, s)) {
61
}
82
- goto do_unallocated;
62
83
- } else if (fp_access_check(s)) {
63
static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
84
- handle_fjcvtzs(s, rd, rn);
64
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_fn_zzz(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *fn)
85
- }
65
if (!dc_isar_feature(aa64_sve2, s)) {
86
- break;
66
return false;
87
-
67
}
88
default:
68
- if (sve_access_check(s)) {
89
do_unallocated:
69
- gen_gvec_fn_zzz(s, fn, a->esz, a->rd, a->rn, a->rm);
90
unallocated_encoding(s);
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
--
91
--
89
2.25.1
92
2.34.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 disas_fp_int_conv and disas_data_proc_fp as these
4
were the last insns decoded by those functions.
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-26-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-35-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 | 42 ++++++++++++++++----------------------
11
target/arm/tcg/a64.decode | 14 ++
9
1 file changed, 18 insertions(+), 24 deletions(-)
12
target/arm/tcg/translate-a64.c | 232 ++++++++++-----------------------
13
2 files changed, 86 insertions(+), 160 deletions(-)
10
14
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
17
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzi(DisasContext *s, gen_helper_gvec_3 *fn,
19
@@ -XXX,XX +XXX,XX @@ FCVTAU_g . 0011110 .. 100101 000000 ..... ..... @icvt
20
21
FJCVTZS 0 0011110 01 111110 000000 ..... ..... @rr
22
23
+FMOV_ws 0 0011110 00 100110 000000 ..... ..... @rr
24
+FMOV_sw 0 0011110 00 100111 000000 ..... ..... @rr
25
+
26
+FMOV_xd 1 0011110 01 100110 000000 ..... ..... @rr
27
+FMOV_dx 1 0011110 01 100111 000000 ..... ..... @rr
28
+
29
+# Move to/from upper half of 128-bit
30
+FMOV_xu 1 0011110 10 101110 000000 ..... ..... @rr
31
+FMOV_ux 1 0011110 10 101111 000000 ..... ..... @rr
32
+
33
+# Half-precision allows both sf=0 and sf=1 with identical results
34
+FMOV_xh - 0011110 11 100110 000000 ..... ..... @rr
35
+FMOV_hx - 0011110 11 100111 000000 ..... ..... @rr
36
+
37
# Floating-point data processing (1 source)
38
39
FMOV_s 00011110 .. 1 000000 10000 ..... ..... @rr_hsd
40
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/arm/tcg/translate-a64.c
43
+++ b/target/arm/tcg/translate-a64.c
44
@@ -XXX,XX +XXX,XX @@ static bool trans_FJCVTZS(DisasContext *s, arg_FJCVTZS *a)
45
return true;
16
}
46
}
17
47
18
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
48
-static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof)
19
-static void gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
49
+static bool trans_FMOV_hx(DisasContext *s, arg_rr *a)
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
{
50
{
23
- unsigned vsz = vec_full_reg_size(s);
51
- /* FMOV: gpr to or from float, double, or top half of quad fp reg,
24
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
52
- * without conversion.
25
- vec_full_reg_offset(s, rn),
53
- */
26
- vec_full_reg_offset(s, rm),
54
-
27
- pred_full_reg_offset(s, pg),
55
- if (itof) {
28
- vsz, vsz, data, fn);
56
- TCGv_i64 tcg_rn = cpu_reg(s, rn);
29
+ if (fn == NULL) {
57
- TCGv_i64 tmp;
58
-
59
- switch (type) {
60
- case 0:
61
- /* 32 bit */
62
- tmp = tcg_temp_new_i64();
63
- tcg_gen_ext32u_i64(tmp, tcg_rn);
64
- write_fp_dreg(s, rd, tmp);
65
- break;
66
- case 1:
67
- /* 64 bit */
68
- write_fp_dreg(s, rd, tcg_rn);
69
- break;
70
- case 2:
71
- /* 64 bit to top half. */
72
- tcg_gen_st_i64(tcg_rn, tcg_env, fp_reg_hi_offset(s, rd));
73
- clear_vec_high(s, true, rd);
74
- break;
75
- case 3:
76
- /* 16 bit */
77
- tmp = tcg_temp_new_i64();
78
- tcg_gen_ext16u_i64(tmp, tcg_rn);
79
- write_fp_dreg(s, rd, tmp);
80
- break;
81
- default:
82
- g_assert_not_reached();
83
- }
84
- } else {
85
- TCGv_i64 tcg_rd = cpu_reg(s, rd);
86
-
87
- switch (type) {
88
- case 0:
89
- /* 32 bit */
90
- tcg_gen_ld32u_i64(tcg_rd, tcg_env, fp_reg_offset(s, rn, MO_32));
91
- break;
92
- case 1:
93
- /* 64 bit */
94
- tcg_gen_ld_i64(tcg_rd, tcg_env, fp_reg_offset(s, rn, MO_64));
95
- break;
96
- case 2:
97
- /* 64 bits from top half */
98
- tcg_gen_ld_i64(tcg_rd, tcg_env, fp_reg_hi_offset(s, rn));
99
- break;
100
- case 3:
101
- /* 16 bit */
102
- tcg_gen_ld16u_i64(tcg_rd, tcg_env, fp_reg_offset(s, rn, MO_16));
103
- break;
104
- default:
105
- g_assert_not_reached();
106
- }
107
+ if (!dc_isar_feature(aa64_fp16, s)) {
30
+ return false;
108
+ return false;
31
+ }
109
}
32
+ if (sve_access_check(s)) {
110
+ if (fp_access_check(s)) {
33
+ unsigned vsz = vec_full_reg_size(s);
111
+ TCGv_i64 tcg_rn = cpu_reg(s, a->rn);
34
+ tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
112
+ TCGv_i64 tmp = tcg_temp_new_i64();
35
+ vec_full_reg_offset(s, rn),
113
+ tcg_gen_ext16u_i64(tmp, tcg_rn);
36
+ vec_full_reg_offset(s, rm),
114
+ write_fp_dreg(s, a->rd, tmp);
37
+ pred_full_reg_offset(s, pg),
38
+ vsz, vsz, data, fn);
39
+ }
115
+ }
40
+ return true;
116
+ return true;
41
}
117
}
42
118
43
/* Invoke a vector expander on two Zregs. */
119
-/* Floating point <-> integer conversions
44
@@ -XXX,XX +XXX,XX @@ static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
120
- * 31 30 29 28 24 23 22 21 20 19 18 16 15 10 9 5 4 0
45
121
- * +----+---+---+-----------+------+---+-------+-----+-------------+----+----+
46
static bool do_zpzz_ool(DisasContext *s, arg_rprr_esz *a, gen_helper_gvec_4 *fn)
122
- * | sf | 0 | S | 1 1 1 1 0 | type | 1 | rmode | opc | 0 0 0 0 0 0 | Rn | Rd |
123
- * +----+---+---+-----------+------+---+-------+-----+-------------+----+----+
124
- */
125
-static void disas_fp_int_conv(DisasContext *s, uint32_t insn)
126
+static bool trans_FMOV_sw(DisasContext *s, arg_rr *a)
47
{
127
{
48
- if (fn == NULL) {
128
- int rd = extract32(insn, 0, 5);
49
- return false;
129
- int rn = extract32(insn, 5, 5);
130
- int opcode = extract32(insn, 16, 3);
131
- int rmode = extract32(insn, 19, 2);
132
- int type = extract32(insn, 22, 2);
133
- bool sbit = extract32(insn, 29, 1);
134
- bool sf = extract32(insn, 31, 1);
135
- bool itof = false;
136
-
137
- if (sbit) {
138
- goto do_unallocated;
50
- }
139
- }
51
- if (sve_access_check(s)) {
140
-
52
- gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, 0);
141
- switch (opcode) {
53
- }
142
- case 2: /* SCVTF */
54
- return true;
143
- case 3: /* UCVTF */
55
+ return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, 0);
144
- case 4: /* FCVTAS */
145
- case 5: /* FCVTAU */
146
- case 0: /* FCVT[NPMZ]S */
147
- case 1: /* FCVT[NPMZ]U */
148
- goto do_unallocated;
149
-
150
- default:
151
- switch (sf << 7 | type << 5 | rmode << 3 | opcode) {
152
- case 0b01100110: /* FMOV half <-> 32-bit int */
153
- case 0b01100111:
154
- case 0b11100110: /* FMOV half <-> 64-bit int */
155
- case 0b11100111:
156
- if (!dc_isar_feature(aa64_fp16, s)) {
157
- goto do_unallocated;
158
- }
159
- /* fallthru */
160
- case 0b00000110: /* FMOV 32-bit */
161
- case 0b00000111:
162
- case 0b10100110: /* FMOV 64-bit */
163
- case 0b10100111:
164
- case 0b11001110: /* FMOV top half of 128-bit */
165
- case 0b11001111:
166
- if (!fp_access_check(s)) {
167
- return;
168
- }
169
- itof = opcode & 1;
170
- handle_fmov(s, rd, rn, type, itof);
171
- break;
172
-
173
- case 0b00111110: /* FJCVTZS */
174
- default:
175
- do_unallocated:
176
- unallocated_encoding(s);
177
- return;
178
- }
179
- break;
180
+ if (fp_access_check(s)) {
181
+ TCGv_i64 tcg_rn = cpu_reg(s, a->rn);
182
+ TCGv_i64 tmp = tcg_temp_new_i64();
183
+ tcg_gen_ext32u_i64(tmp, tcg_rn);
184
+ write_fp_dreg(s, a->rd, tmp);
185
}
186
+ return true;
56
}
187
}
57
188
58
/* Select active elememnts from Zn and inactive elements from Zm,
189
-/* FP-specific subcases of table C3-6 (SIMD and FP data processing)
59
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(REVW, aa64_sve, gen_gvec_ool_arg_zpz,
190
- * 31 30 29 28 25 24 0
60
191
- * +---+---+---+---------+-----------------------------+
61
static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
192
- * | | 0 | | 1 1 1 1 | |
193
- * +---+---+---+---------+-----------------------------+
194
- */
195
-static void disas_data_proc_fp(DisasContext *s, uint32_t insn)
196
+static bool trans_FMOV_dx(DisasContext *s, arg_rr *a)
62
{
197
{
63
- if (sve_access_check(s)) {
198
- if (extract32(insn, 24, 1)) {
64
- gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
199
- unallocated_encoding(s); /* in decodetree */
65
- a->rd, a->rn, a->rm, a->pg, a->esz);
200
- } else if (extract32(insn, 21, 1) == 0) {
66
- }
201
- /* Floating point to fixed point conversions */
67
- return true;
202
- unallocated_encoding(s); /* in decodetree */
68
+ return gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
203
- } else {
69
+ a->rd, a->rn, a->rm, a->pg, a->esz);
204
- switch (extract32(insn, 10, 2)) {
205
- case 1: /* Floating point conditional compare */
206
- case 2: /* Floating point data-processing (2 source) */
207
- case 3: /* Floating point conditional select */
208
- unallocated_encoding(s); /* in decodetree */
209
- break;
210
- case 0:
211
- switch (ctz32(extract32(insn, 12, 4))) {
212
- case 0: /* [15:12] == xxx1 */
213
- /* Floating point immediate */
214
- unallocated_encoding(s); /* in decodetree */
215
- break;
216
- case 1: /* [15:12] == xx10 */
217
- /* Floating point compare */
218
- unallocated_encoding(s); /* in decodetree */
219
- break;
220
- case 2: /* [15:12] == x100 */
221
- /* Floating point data-processing (1 source) */
222
- unallocated_encoding(s); /* in decodetree */
223
- break;
224
- case 3: /* [15:12] == 1000 */
225
- unallocated_encoding(s);
226
- break;
227
- default: /* [15:12] == 0000 */
228
- /* Floating point <-> integer conversions */
229
- disas_fp_int_conv(s, insn);
230
- break;
231
- }
232
- break;
233
- }
234
+ if (fp_access_check(s)) {
235
+ TCGv_i64 tcg_rn = cpu_reg(s, a->rn);
236
+ write_fp_dreg(s, a->rd, tcg_rn);
237
}
238
+ return true;
239
+}
240
+
241
+static bool trans_FMOV_ux(DisasContext *s, arg_rr *a)
242
+{
243
+ if (fp_access_check(s)) {
244
+ TCGv_i64 tcg_rn = cpu_reg(s, a->rn);
245
+ tcg_gen_st_i64(tcg_rn, tcg_env, fp_reg_hi_offset(s, a->rd));
246
+ clear_vec_high(s, true, a->rd);
247
+ }
248
+ return true;
249
+}
250
+
251
+static bool trans_FMOV_xh(DisasContext *s, arg_rr *a)
252
+{
253
+ if (!dc_isar_feature(aa64_fp16, s)) {
254
+ return false;
255
+ }
256
+ if (fp_access_check(s)) {
257
+ TCGv_i64 tcg_rd = cpu_reg(s, a->rd);
258
+ tcg_gen_ld16u_i64(tcg_rd, tcg_env, fp_reg_offset(s, a->rn, MO_16));
259
+ }
260
+ return true;
261
+}
262
+
263
+static bool trans_FMOV_ws(DisasContext *s, arg_rr *a)
264
+{
265
+ if (fp_access_check(s)) {
266
+ TCGv_i64 tcg_rd = cpu_reg(s, a->rd);
267
+ tcg_gen_ld32u_i64(tcg_rd, tcg_env, fp_reg_offset(s, a->rn, MO_32));
268
+ }
269
+ return true;
270
+}
271
+
272
+static bool trans_FMOV_xd(DisasContext *s, arg_rr *a)
273
+{
274
+ if (fp_access_check(s)) {
275
+ TCGv_i64 tcg_rd = cpu_reg(s, a->rd);
276
+ tcg_gen_ld_i64(tcg_rd, tcg_env, fp_reg_offset(s, a->rn, MO_64));
277
+ }
278
+ return true;
279
+}
280
+
281
+static bool trans_FMOV_xu(DisasContext *s, arg_rr *a)
282
+{
283
+ if (fp_access_check(s)) {
284
+ TCGv_i64 tcg_rd = cpu_reg(s, a->rd);
285
+ tcg_gen_ld_i64(tcg_rd, tcg_env, fp_reg_hi_offset(s, a->rn));
286
+ }
287
+ return true;
70
}
288
}
71
289
72
static bool trans_SPLICE_sve2(DisasContext *s, arg_rpr_esz *a)
290
/* Common vector code for handling integer to FP conversion */
73
@@ -XXX,XX +XXX,XX @@ static bool trans_SPLICE_sve2(DisasContext *s, arg_rpr_esz *a)
291
@@ -XXX,XX +XXX,XX @@ static void disas_data_proc_simd(DisasContext *s, uint32_t insn)
74
if (!dc_isar_feature(aa64_sve2, s)) {
292
static void disas_data_proc_simd_fp(DisasContext *s, uint32_t insn)
75
return false;
293
{
76
}
294
if (extract32(insn, 28, 1) == 1 && extract32(insn, 30, 1) == 0) {
77
- if (sve_access_check(s)) {
295
- disas_data_proc_fp(s, insn);
78
- gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
296
+ unallocated_encoding(s); /* in decodetree */
79
- a->rd, a->rn, (a->rn + 1) % 32, a->pg, a->esz);
297
} else {
80
- }
298
/* SIMD, including crypto */
81
- return true;
299
disas_data_proc_simd(s, insn);
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
--
300
--
88
2.25.1
301
2.34.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
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
Split out gen_gvec_fpst_zz as a helper while we're at it.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-92-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-36-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
7
---
11
target/arm/translate-sve.c | 77 ++++++++++++++++++--------------------
8
target/arm/tcg/a64.decode | 11 +++
12
1 file changed, 36 insertions(+), 41 deletions(-)
9
target/arm/tcg/translate-a64.c | 123 +++++++++++++++++++++------------
10
2 files changed, 89 insertions(+), 45 deletions(-)
13
11
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
15
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
17
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
16
@@ -XXX,XX +XXX,XX @@
17
@rr_h ........ ... ..... ...... rn:5 rd:5 &rr_e esz=1
18
@rr_s ........ ... ..... ...... rn:5 rd:5 &rr_e esz=2
19
@rr_d ........ ... ..... ...... rn:5 rd:5 &rr_e esz=3
20
+@rr_e ........ esz:2 . ..... ...... rn:5 rd:5 &rr_e
21
@rr_sd ........ ... ..... ...... rn:5 rd:5 &rr_e esz=%esz_sd
22
@rr_hsd ........ ... ..... ...... rn:5 rd:5 &rr_e esz=%esz_hsd
23
24
@@ -XXX,XX +XXX,XX @@ UQRSHRN_si 0111 11110 .... ... 10011 1 ..... ..... @shri_s
25
SQRSHRUN_si 0111 11110 .... ... 10001 1 ..... ..... @shri_b
26
SQRSHRUN_si 0111 11110 .... ... 10001 1 ..... ..... @shri_h
27
SQRSHRUN_si 0111 11110 .... ... 10001 1 ..... ..... @shri_s
28
+
29
+# Advanced SIMD scalar two-register miscellaneous
30
+
31
+SQABS_s 0101 1110 ..1 00000 01111 0 ..... ..... @rr_e
32
+SQNEG_s 0111 1110 ..1 00000 01111 0 ..... ..... @rr_e
33
+
34
+# Advanced SIMD two-register miscellaneous
35
+
36
+SQABS_v 0.00 1110 ..1 00000 01111 0 ..... ..... @qrr_e
37
+SQNEG_v 0.10 1110 ..1 00000 01111 0 ..... ..... @qrr_e
38
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/arm/tcg/translate-a64.c
41
+++ b/target/arm/tcg/translate-a64.c
42
@@ -XXX,XX +XXX,XX @@ static bool trans_FMOV_xu(DisasContext *s, arg_rr *a)
19
return true;
43
return true;
20
}
44
}
21
45
22
+static bool gen_gvec_fpst_zz(DisasContext *s, gen_helper_gvec_2_ptr *fn,
46
+typedef struct ENVScalar1 {
23
+ int rd, int rn, int data,
47
+ NeonGenOneOpEnvFn *gen_bhs[3];
24
+ ARMFPStatusFlavour flavour)
48
+ NeonGenOne64OpEnvFn *gen_d;
49
+} ENVScalar1;
50
+
51
+static bool do_env_scalar1(DisasContext *s, arg_rr_e *a, const ENVScalar1 *f)
25
+{
52
+{
26
+ if (fn == NULL) {
53
+ if (!fp_access_check(s)) {
27
+ return false;
54
+ return true;
28
+ }
55
+ }
29
+ if (sve_access_check(s)) {
56
+ if (a->esz == MO_64) {
30
+ unsigned vsz = vec_full_reg_size(s);
57
+ TCGv_i64 t = read_fp_dreg(s, a->rn);
31
+ TCGv_ptr status = fpstatus_ptr(flavour);
58
+ f->gen_d(t, tcg_env, t);
32
+
59
+ write_fp_dreg(s, a->rd, t);
33
+ tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, rd),
60
+ } else {
34
+ vec_full_reg_offset(s, rn),
61
+ TCGv_i32 t = tcg_temp_new_i32();
35
+ status, vsz, vsz, data, fn);
62
+
36
+ tcg_temp_free_ptr(status);
63
+ read_vec_element_i32(s, t, a->rn, 0, a->esz);
64
+ f->gen_bhs[a->esz](t, tcg_env, t);
65
+ write_fp_sreg(s, a->rd, t);
37
+ }
66
+ }
38
+ return true;
67
+ return true;
39
+}
68
+}
40
+
69
+
41
+static bool gen_gvec_fpst_arg_zz(DisasContext *s, gen_helper_gvec_2_ptr *fn,
70
+static bool do_env_vector1(DisasContext *s, arg_qrr_e *a, const ENVScalar1 *f)
42
+ arg_rr_esz *a, int data)
43
+{
71
+{
44
+ return gen_gvec_fpst_zz(s, fn, a->rd, a->rn, data,
72
+ if (a->esz == MO_64 && !a->q) {
45
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
73
+ return false;
74
+ }
75
+ if (!fp_access_check(s)) {
76
+ return true;
77
+ }
78
+ if (a->esz == MO_64) {
79
+ TCGv_i64 t = tcg_temp_new_i64();
80
+
81
+ for (int i = 0; i < 2; ++i) {
82
+ read_vec_element(s, t, a->rn, i, MO_64);
83
+ f->gen_d(t, tcg_env, t);
84
+ write_vec_element(s, t, a->rd, i, MO_64);
85
+ }
86
+ } else {
87
+ TCGv_i32 t = tcg_temp_new_i32();
88
+ int n = (a->q ? 16 : 8) >> a->esz;
89
+
90
+ for (int i = 0; i < n; ++i) {
91
+ read_vec_element_i32(s, t, a->rn, i, a->esz);
92
+ f->gen_bhs[a->esz](t, tcg_env, t);
93
+ write_vec_element_i32(s, t, a->rd, i, a->esz);
94
+ }
95
+ }
96
+ clear_vec_high(s, a->q, a->rd);
97
+ return true;
46
+}
98
+}
47
+
99
+
48
/* Invoke an out-of-line helper on 3 Zregs. */
100
+static const ENVScalar1 f_scalar_sqabs = {
49
static bool gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
101
+ { gen_helper_neon_qabs_s8,
50
int rd, int rn, int rm, int data)
102
+ gen_helper_neon_qabs_s16,
51
@@ -XXX,XX +XXX,XX @@ DO_VPZ(FMAXV, fmaxv)
103
+ gen_helper_neon_qabs_s32 },
52
*** SVE Floating Point Unary Operations - Unpredicated Group
104
+ gen_helper_neon_qabs_s64,
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
+};
105
+};
63
+TRANS_FEAT(FRECPE, aa64_sve, gen_gvec_fpst_arg_zz, frecpe_fns[a->esz], a, 0)
106
+TRANS(SQABS_s, do_env_scalar1, a, &f_scalar_sqabs)
64
107
+TRANS(SQABS_v, do_env_vector1, a, &f_scalar_sqabs)
65
- tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, a->rd),
108
+
66
- vec_full_reg_offset(s, a->rn),
109
+static const ENVScalar1 f_scalar_sqneg = {
67
- status, vsz, vsz, 0, fn);
110
+ { gen_helper_neon_qneg_s8,
68
- tcg_temp_free_ptr(status);
111
+ gen_helper_neon_qneg_s16,
69
-}
112
+ gen_helper_neon_qneg_s32 },
70
-
113
+ gen_helper_neon_qneg_s64,
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
+};
114
+};
106
+TRANS_FEAT(FRSQRTE, aa64_sve, gen_gvec_fpst_arg_zz, frsqrte_fns[a->esz], a, 0)
115
+TRANS(SQNEG_s, do_env_scalar1, a, &f_scalar_sqneg)
107
116
+TRANS(SQNEG_v, do_env_vector1, a, &f_scalar_sqneg)
108
/*
117
+
109
*** SVE Floating Point Compare with Zero Group
118
/* Common vector code for handling integer to FP conversion */
119
static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
120
int elements, int is_signed,
121
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
122
*/
123
tcg_gen_not_i64(tcg_rd, tcg_rn);
124
break;
125
- case 0x7: /* SQABS, SQNEG */
126
- if (u) {
127
- gen_helper_neon_qneg_s64(tcg_rd, tcg_env, tcg_rn);
128
- } else {
129
- gen_helper_neon_qabs_s64(tcg_rd, tcg_env, tcg_rn);
130
- }
131
- break;
132
case 0xa: /* CMLT */
133
cond = TCG_COND_LT;
134
do_cmop:
135
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
136
gen_helper_frint64_d(tcg_rd, tcg_rn, tcg_fpstatus);
137
break;
138
default:
139
+ case 0x7: /* SQABS, SQNEG */
140
g_assert_not_reached();
141
}
142
}
143
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
144
TCGv_ptr tcg_fpstatus;
145
146
switch (opcode) {
147
- case 0x7: /* SQABS / SQNEG */
148
- break;
149
case 0xa: /* CMLT */
150
if (u) {
151
unallocated_encoding(s);
152
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
153
break;
154
default:
155
case 0x3: /* USQADD / SUQADD */
156
+ case 0x7: /* SQABS / SQNEG */
157
unallocated_encoding(s);
158
return;
159
}
160
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
161
read_vec_element_i32(s, tcg_rn, rn, 0, size);
162
163
switch (opcode) {
164
- case 0x7: /* SQABS, SQNEG */
165
- {
166
- NeonGenOneOpEnvFn *genfn;
167
- static NeonGenOneOpEnvFn * const fns[3][2] = {
168
- { gen_helper_neon_qabs_s8, gen_helper_neon_qneg_s8 },
169
- { gen_helper_neon_qabs_s16, gen_helper_neon_qneg_s16 },
170
- { gen_helper_neon_qabs_s32, gen_helper_neon_qneg_s32 },
171
- };
172
- genfn = fns[size][u];
173
- genfn(tcg_rd, tcg_env, tcg_rn);
174
- break;
175
- }
176
case 0x1a: /* FCVTNS */
177
case 0x1b: /* FCVTMS */
178
case 0x1c: /* FCVTAS */
179
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
180
tcg_fpstatus);
181
break;
182
default:
183
+ case 0x7: /* SQABS, SQNEG */
184
g_assert_not_reached();
185
}
186
187
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
188
return;
189
}
190
break;
191
- case 0x7: /* SQABS, SQNEG */
192
- if (size == 3 && !is_q) {
193
- unallocated_encoding(s);
194
- return;
195
- }
196
- break;
197
case 0xc ... 0xf:
198
case 0x16 ... 0x1f:
199
{
200
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
201
}
202
default:
203
case 0x3: /* SUQADD, USQADD */
204
+ case 0x7: /* SQABS, SQNEG */
205
unallocated_encoding(s);
206
return;
207
}
208
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
209
tcg_gen_clrsb_i32(tcg_res, tcg_op);
210
}
211
break;
212
- case 0x7: /* SQABS, SQNEG */
213
- if (u) {
214
- gen_helper_neon_qneg_s32(tcg_res, tcg_env, tcg_op);
215
- } else {
216
- gen_helper_neon_qabs_s32(tcg_res, tcg_env, tcg_op);
217
- }
218
- break;
219
case 0x2f: /* FABS */
220
gen_vfp_abss(tcg_res, tcg_op);
221
break;
222
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
223
gen_helper_frint64_s(tcg_res, tcg_op, tcg_fpstatus);
224
break;
225
default:
226
+ case 0x7: /* SQABS, SQNEG */
227
g_assert_not_reached();
228
}
229
} else {
230
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
231
gen_helper_neon_cnt_u8(tcg_res, tcg_op);
232
}
233
break;
234
- case 0x7: /* SQABS, SQNEG */
235
- {
236
- NeonGenOneOpEnvFn *genfn;
237
- static NeonGenOneOpEnvFn * const fns[2][2] = {
238
- { gen_helper_neon_qabs_s8, gen_helper_neon_qneg_s8 },
239
- { gen_helper_neon_qabs_s16, gen_helper_neon_qneg_s16 },
240
- };
241
- genfn = fns[size][u];
242
- genfn(tcg_res, tcg_env, tcg_op);
243
- break;
244
- }
245
case 0x4: /* CLS, CLZ */
246
if (u) {
247
if (size == 0) {
248
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
249
}
250
break;
251
default:
252
+ case 0x7: /* SQABS, SQNEG */
253
g_assert_not_reached();
254
}
255
}
110
--
256
--
111
2.25.1
257
2.34.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-20-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-37-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 | 37 +++++++++++++++----------------------
8
target/arm/tcg/a64.decode | 4 +++
9
1 file changed, 15 insertions(+), 22 deletions(-)
9
target/arm/tcg/translate-a64.c | 46 +++++++++++++++++++++++-----------
10
2 files changed, 35 insertions(+), 15 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzxz(DisasContext *s, gen_helper_gvec_4 *fn,
16
@@ -XXX,XX +XXX,XX @@ SQRSHRUN_si 0111 11110 .... ... 10001 1 ..... ..... @shri_s
16
}
17
17
18
SQABS_s 0101 1110 ..1 00000 01111 0 ..... ..... @rr_e
18
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
19
SQNEG_s 0111 1110 ..1 00000 01111 0 ..... ..... @rr_e
19
-static void gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
20
+ABS_s 0101 1110 111 00000 10111 0 ..... ..... @rr
20
+static bool gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
21
+NEG_s 0111 1110 111 00000 10111 0 ..... ..... @rr
21
int rd, int rn, int pg, int data)
22
22
{
23
# Advanced SIMD two-register miscellaneous
23
- unsigned vsz = vec_full_reg_size(s);
24
24
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
25
SQABS_v 0.00 1110 ..1 00000 01111 0 ..... ..... @qrr_e
25
- vec_full_reg_offset(s, rn),
26
SQNEG_v 0.10 1110 ..1 00000 01111 0 ..... ..... @qrr_e
26
- pred_full_reg_offset(s, pg),
27
+ABS_v 0.00 1110 ..1 00000 10111 0 ..... ..... @qrr_e
27
- vsz, vsz, data, fn);
28
+NEG_v 0.10 1110 ..1 00000 10111 0 ..... ..... @qrr_e
28
+ if (fn == NULL) {
29
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/tcg/translate-a64.c
32
+++ b/target/arm/tcg/translate-a64.c
33
@@ -XXX,XX +XXX,XX @@ static const ENVScalar1 f_scalar_sqneg = {
34
TRANS(SQNEG_s, do_env_scalar1, a, &f_scalar_sqneg)
35
TRANS(SQNEG_v, do_env_vector1, a, &f_scalar_sqneg)
36
37
+static bool do_scalar1_d(DisasContext *s, arg_rr *a, ArithOneOp *f)
38
+{
39
+ if (fp_access_check(s)) {
40
+ TCGv_i64 t = read_fp_dreg(s, a->rn);
41
+ f(t, t);
42
+ write_fp_dreg(s, a->rd, t);
43
+ }
44
+ return true;
45
+}
46
+
47
+TRANS(ABS_s, do_scalar1_d, a, tcg_gen_abs_i64)
48
+TRANS(NEG_s, do_scalar1_d, a, tcg_gen_neg_i64)
49
+
50
+static bool do_gvec_fn2(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
51
+{
52
+ if (!a->q && a->esz == MO_64) {
29
+ return false;
53
+ return false;
30
+ }
54
+ }
31
+ if (sve_access_check(s)) {
55
+ if (fp_access_check(s)) {
32
+ unsigned vsz = vec_full_reg_size(s);
56
+ gen_gvec_fn2(s, a->q, a->rd, a->rn, fn, a->esz);
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
+ }
57
+ }
38
+ return true;
58
+ return true;
59
+}
60
+
61
+TRANS(ABS_v, do_gvec_fn2, a, tcg_gen_gvec_abs)
62
+TRANS(NEG_v, do_gvec_fn2, a, tcg_gen_gvec_neg)
63
+
64
/* Common vector code for handling integer to FP conversion */
65
static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
66
int elements, int is_signed,
67
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
68
case 0x9: /* CMEQ, CMLE */
69
cond = u ? TCG_COND_LE : TCG_COND_EQ;
70
goto do_cmop;
71
- case 0xb: /* ABS, NEG */
72
- if (u) {
73
- tcg_gen_neg_i64(tcg_rd, tcg_rn);
74
- } else {
75
- tcg_gen_abs_i64(tcg_rd, tcg_rn);
76
- }
77
- break;
78
case 0x2f: /* FABS */
79
gen_vfp_absd(tcg_rd, tcg_rn);
80
break;
81
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
82
break;
83
default:
84
case 0x7: /* SQABS, SQNEG */
85
+ case 0xb: /* ABS, NEG */
86
g_assert_not_reached();
87
}
39
}
88
}
40
89
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
41
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
90
/* fall through */
42
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
91
case 0x8: /* CMGT, CMGE */
43
92
case 0x9: /* CMEQ, CMLE */
44
static bool do_zpz_ool(DisasContext *s, arg_rpr_esz *a, gen_helper_gvec_3 *fn)
93
- case 0xb: /* ABS, NEG */
45
{
94
if (size != 3) {
46
- if (fn == NULL) {
95
unallocated_encoding(s);
47
- return false;
96
return;
48
- }
97
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
49
- if (sve_access_check(s)) {
98
default:
50
- gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, 0);
99
case 0x3: /* USQADD / SUQADD */
51
- }
100
case 0x7: /* SQABS / SQNEG */
52
- return true;
101
+ case 0xb: /* ABS, NEG */
53
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, 0);
102
unallocated_encoding(s);
54
}
103
return;
55
104
}
56
#define DO_ZPZ(NAME, name) \
105
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
57
@@ -XXX,XX +XXX,XX @@ static bool do_movz_zpz(DisasContext *s, int rd, int rn, int pg,
106
/* fall through */
58
gen_helper_sve_movz_b, gen_helper_sve_movz_h,
107
case 0x8: /* CMGT, CMGE */
59
gen_helper_sve_movz_s, gen_helper_sve_movz_d,
108
case 0x9: /* CMEQ, CMLE */
60
};
109
- case 0xb: /* ABS, NEG */
61
-
110
if (size == 3 && !is_q) {
62
- if (sve_access_check(s)) {
111
unallocated_encoding(s);
63
- gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
112
return;
64
- }
113
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
65
- return true;
114
default:
66
+ return gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
115
case 0x3: /* SUQADD, USQADD */
67
}
116
case 0x7: /* SQABS, SQNEG */
68
117
+ case 0xb: /* ABS, NEG */
69
static bool do_zpzi_ool(DisasContext *s, arg_rpri_esz *a,
118
unallocated_encoding(s);
70
gen_helper_gvec_3 *fn)
119
return;
71
{
120
}
72
- if (sve_access_check(s)) {
121
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
73
- gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
122
gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_clt0, size);
74
- }
123
return;
75
- return true;
124
case 0xb:
76
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
125
- if (u) { /* ABS, NEG */
77
}
126
- gen_gvec_fn2(s, is_q, rd, rn, tcg_gen_gvec_neg, size);
78
127
- } else {
79
static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
128
- gen_gvec_fn2(s, is_q, rd, rn, tcg_gen_gvec_abs, size);
129
- }
130
- return;
131
+ g_assert_not_reached();
132
}
133
134
if (size == 3) {
80
--
135
--
81
2.25.1
136
2.34.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 gvec interfaces for CLS and CLZ operations.
4
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@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-51-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-38-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 | 23 ++++-------------------
10
target/arm/tcg/translate.h | 5 +++++
9
1 file changed, 4 insertions(+), 19 deletions(-)
11
target/arm/tcg/gengvec.c | 35 +++++++++++++++++++++++++++++++++
12
target/arm/tcg/translate-a64.c | 29 +++++++--------------------
13
target/arm/tcg/translate-neon.c | 29 ++-------------------------
14
4 files changed, 49 insertions(+), 49 deletions(-)
10
15
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
18
--- a/target/arm/tcg/translate.h
14
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/tcg/translate.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_adr(DisasContext *s, arg_rrri *a, gen_helper_gvec_3 *fn)
20
@@ -XXX,XX +XXX,XX @@ void gen_gvec_umaxp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
16
return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, a->imm);
21
void gen_gvec_uminp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
22
uint32_t rm_ofs, uint32_t opr_sz, uint32_t max_sz);
23
24
+void gen_gvec_cls(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
25
+ uint32_t opr_sz, uint32_t max_sz);
26
+void gen_gvec_clz(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
27
+ uint32_t opr_sz, uint32_t max_sz);
28
+
29
/*
30
* Forward to the isar_feature_* tests given a DisasContext pointer.
31
*/
32
diff --git a/target/arm/tcg/gengvec.c b/target/arm/tcg/gengvec.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/tcg/gengvec.c
35
+++ b/target/arm/tcg/gengvec.c
36
@@ -XXX,XX +XXX,XX @@ void gen_gvec_urhadd(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
37
assert(vece <= MO_32);
38
tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs, opr_sz, max_sz, &g[vece]);
17
}
39
}
18
40
+
19
-static bool trans_ADR_p32(DisasContext *s, arg_rrri *a)
41
+void gen_gvec_cls(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
42
+ uint32_t opr_sz, uint32_t max_sz)
43
+{
44
+ static const GVecGen2 g[] = {
45
+ { .fni4 = gen_helper_neon_cls_s8,
46
+ .vece = MO_8 },
47
+ { .fni4 = gen_helper_neon_cls_s16,
48
+ .vece = MO_16 },
49
+ { .fni4 = tcg_gen_clrsb_i32,
50
+ .vece = MO_32 },
51
+ };
52
+ assert(vece <= MO_32);
53
+ tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g[vece]);
54
+}
55
+
56
+static void gen_clz32_i32(TCGv_i32 d, TCGv_i32 n)
57
+{
58
+ tcg_gen_clzi_i32(d, n, 32);
59
+}
60
+
61
+void gen_gvec_clz(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
62
+ uint32_t opr_sz, uint32_t max_sz)
63
+{
64
+ static const GVecGen2 g[] = {
65
+ { .fni4 = gen_helper_neon_clz_u8,
66
+ .vece = MO_8 },
67
+ { .fni4 = gen_helper_neon_clz_u16,
68
+ .vece = MO_16 },
69
+ { .fni4 = gen_clz32_i32,
70
+ .vece = MO_32 },
71
+ };
72
+ assert(vece <= MO_32);
73
+ tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g[vece]);
74
+}
75
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/arm/tcg/translate-a64.c
78
+++ b/target/arm/tcg/translate-a64.c
79
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
80
}
81
82
switch (opcode) {
83
+ case 0x4: /* CLZ, CLS */
84
+ if (u) {
85
+ gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_clz, size);
86
+ } else {
87
+ gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_cls, size);
88
+ }
89
+ return;
90
case 0x5:
91
if (u && size == 0) { /* NOT */
92
gen_gvec_fn2(s, is_q, rd, rn, tcg_gen_gvec_not, 0);
93
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
94
if (size == 2) {
95
/* Special cases for 32 bit elements */
96
switch (opcode) {
97
- case 0x4: /* CLS */
98
- if (u) {
99
- tcg_gen_clzi_i32(tcg_res, tcg_op, 32);
100
- } else {
101
- tcg_gen_clrsb_i32(tcg_res, tcg_op);
102
- }
103
- break;
104
case 0x2f: /* FABS */
105
gen_vfp_abss(tcg_res, tcg_op);
106
break;
107
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
108
gen_helper_neon_cnt_u8(tcg_res, tcg_op);
109
}
110
break;
111
- case 0x4: /* CLS, CLZ */
112
- if (u) {
113
- if (size == 0) {
114
- gen_helper_neon_clz_u8(tcg_res, tcg_op);
115
- } else {
116
- gen_helper_neon_clz_u16(tcg_res, tcg_op);
117
- }
118
- } else {
119
- if (size == 0) {
120
- gen_helper_neon_cls_s8(tcg_res, tcg_op);
121
- } else {
122
- gen_helper_neon_cls_s16(tcg_res, tcg_op);
123
- }
124
- }
125
- break;
126
default:
127
case 0x7: /* SQABS, SQNEG */
128
g_assert_not_reached();
129
diff --git a/target/arm/tcg/translate-neon.c b/target/arm/tcg/translate-neon.c
130
index XXXXXXX..XXXXXXX 100644
131
--- a/target/arm/tcg/translate-neon.c
132
+++ b/target/arm/tcg/translate-neon.c
133
@@ -XXX,XX +XXX,XX @@ DO_2MISC_VEC(VCGT0, gen_gvec_cgt0)
134
DO_2MISC_VEC(VCLE0, gen_gvec_cle0)
135
DO_2MISC_VEC(VCGE0, gen_gvec_cge0)
136
DO_2MISC_VEC(VCLT0, gen_gvec_clt0)
137
+DO_2MISC_VEC(VCLS, gen_gvec_cls)
138
+DO_2MISC_VEC(VCLZ, gen_gvec_clz)
139
140
static bool trans_VMVN(DisasContext *s, arg_2misc *a)
141
{
142
@@ -XXX,XX +XXX,XX @@ static bool trans_VREV16(DisasContext *s, arg_2misc *a)
143
return do_2misc(s, a, gen_rev16);
144
}
145
146
-static bool trans_VCLS(DisasContext *s, arg_2misc *a)
20
-{
147
-{
21
- return do_adr(s, a, gen_helper_sve_adr_p32);
148
- static NeonGenOneOpFn * const fn[] = {
149
- gen_helper_neon_cls_s8,
150
- gen_helper_neon_cls_s16,
151
- gen_helper_neon_cls_s32,
152
- NULL,
153
- };
154
- return do_2misc(s, a, fn[a->size]);
22
-}
155
-}
23
-
156
-
24
-static bool trans_ADR_p64(DisasContext *s, arg_rrri *a)
157
-static void do_VCLZ_32(TCGv_i32 rd, TCGv_i32 rm)
25
-{
158
-{
26
- return do_adr(s, a, gen_helper_sve_adr_p64);
159
- tcg_gen_clzi_i32(rd, rm, 32);
27
-}
160
-}
28
-
161
-
29
-static bool trans_ADR_s32(DisasContext *s, arg_rrri *a)
162
-static bool trans_VCLZ(DisasContext *s, arg_2misc *a)
30
-{
163
-{
31
- return do_adr(s, a, gen_helper_sve_adr_s32);
164
- static NeonGenOneOpFn * const fn[] = {
165
- gen_helper_neon_clz_u8,
166
- gen_helper_neon_clz_u16,
167
- do_VCLZ_32,
168
- NULL,
169
- };
170
- return do_2misc(s, a, fn[a->size]);
32
-}
171
-}
33
-
172
-
34
-static bool trans_ADR_u32(DisasContext *s, arg_rrri *a)
173
static bool trans_VCNT(DisasContext *s, arg_2misc *a)
35
-{
174
{
36
- return do_adr(s, a, gen_helper_sve_adr_u32);
175
if (a->size != 0) {
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
43
/*
44
*** SVE Integer Misc - Unpredicated Group
45
--
176
--
46
2.25.1
177
2.34.1
178
179
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
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-39-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-39-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 | 30 +++++++++++++++++-------------
8
target/arm/tcg/a64.decode | 2 ++
11
1 file changed, 17 insertions(+), 13 deletions(-)
9
target/arm/tcg/translate-a64.c | 37 ++++++++++++++++------------------
10
2 files changed, 19 insertions(+), 20 deletions(-)
12
11
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
14
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
16
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
17
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpzz(DisasContext *s, gen_helper_gvec_4 *fn,
16
@@ -XXX,XX +XXX,XX @@ SQABS_v 0.00 1110 ..1 00000 01111 0 ..... ..... @qrr_e
18
return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, data);
17
SQNEG_v 0.10 1110 ..1 00000 01111 0 ..... ..... @qrr_e
19
}
18
ABS_v 0.00 1110 ..1 00000 10111 0 ..... ..... @qrr_e
20
19
NEG_v 0.10 1110 ..1 00000 10111 0 ..... ..... @qrr_e
21
+/* Invoke a vector expander on two Zregs and an immediate. */
20
+CLS_v 0.00 1110 ..1 00000 01001 0 ..... ..... @qrr_e
22
+static bool gen_gvec_fn_zzi(DisasContext *s, GVecGen2iFn *gvec_fn,
21
+CLZ_v 0.10 1110 ..1 00000 01001 0 ..... ..... @qrr_e
23
+ int esz, int rd, int rn, uint64_t imm)
22
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
23
index XXXXXXX..XXXXXXX 100644
24
--- a/target/arm/tcg/translate-a64.c
25
+++ b/target/arm/tcg/translate-a64.c
26
@@ -XXX,XX +XXX,XX @@ static bool do_gvec_fn2(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
27
TRANS(ABS_v, do_gvec_fn2, a, tcg_gen_gvec_abs)
28
TRANS(NEG_v, do_gvec_fn2, a, tcg_gen_gvec_neg)
29
30
+static bool do_gvec_fn2_bhs(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
24
+{
31
+{
25
+ if (gvec_fn == NULL) {
32
+ if (a->esz == MO_64) {
26
+ return false;
33
+ return false;
27
+ }
34
+ }
28
+ if (sve_access_check(s)) {
35
+ if (fp_access_check(s)) {
29
+ unsigned vsz = vec_full_reg_size(s);
36
+ gen_gvec_fn2(s, a->q, a->rd, a->rn, fn, a->esz);
30
+ gvec_fn(esz, vec_full_reg_offset(s, rd),
31
+ vec_full_reg_offset(s, rn), imm, vsz, vsz);
32
+ }
37
+ }
33
+ return true;
38
+ return true;
34
+}
39
+}
35
+
40
+
36
/* Invoke a vector expander on three Zregs. */
41
+TRANS(CLS_v, do_gvec_fn2_bhs, a, gen_gvec_cls)
37
static bool gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
42
+TRANS(CLZ_v, do_gvec_fn2_bhs, a, gen_gvec_clz)
38
int esz, int rd, int rn, int rm)
43
+
39
@@ -XXX,XX +XXX,XX @@ static bool do_zz_dbm(DisasContext *s, arg_rr_dbm *a, GVecGen2iFn *gvec_fn)
44
/* Common vector code for handling integer to FP conversion */
40
extract32(a->dbm, 6, 6))) {
45
static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
41
return false;
46
int elements, int is_signed,
47
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
48
TCGCond cond;
49
50
switch (opcode) {
51
- case 0x4: /* CLS, CLZ */
52
- if (u) {
53
- tcg_gen_clzi_i64(tcg_rd, tcg_rn, 64);
54
- } else {
55
- tcg_gen_clrsb_i64(tcg_rd, tcg_rn);
56
- }
57
- break;
58
case 0x5: /* NOT */
59
/* This opcode is shared with CNT and RBIT but we have earlier
60
* enforced that size == 3 if and only if this is the NOT insn.
61
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
62
gen_helper_frint64_d(tcg_rd, tcg_rn, tcg_fpstatus);
63
break;
64
default:
65
+ case 0x4: /* CLS, CLZ */
66
case 0x7: /* SQABS, SQNEG */
67
case 0xb: /* ABS, NEG */
68
g_assert_not_reached();
69
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
70
71
handle_2misc_narrow(s, false, opcode, u, is_q, size, rn, rd);
72
return;
73
- case 0x4: /* CLS, CLZ */
74
- if (size == 3) {
75
- unallocated_encoding(s);
76
- return;
77
- }
78
- break;
79
case 0x2: /* SADDLP, UADDLP */
80
case 0x6: /* SADALP, UADALP */
81
if (size == 3) {
82
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
42
}
83
}
43
- if (sve_access_check(s)) {
84
default:
44
- unsigned vsz = vec_full_reg_size(s);
85
case 0x3: /* SUQADD, USQADD */
45
- gvec_fn(MO_64, vec_full_reg_offset(s, a->rd),
86
+ case 0x4: /* CLS, CLZ */
46
- vec_full_reg_offset(s, a->rn), imm, vsz, vsz);
87
case 0x7: /* SQABS, SQNEG */
47
- }
88
case 0xb: /* ABS, NEG */
48
- return true;
89
unallocated_encoding(s);
49
+ return gen_gvec_fn_zzi(s, gvec_fn, MO_64, a->rd, a->rn, imm);
90
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
50
}
51
52
static bool trans_AND_zzi(DisasContext *s, arg_rr_dbm *a)
53
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
54
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
55
return false;
56
}
91
}
57
- if (sve_access_check(s)) {
92
58
- unsigned vsz = vec_full_reg_size(s);
93
switch (opcode) {
59
- unsigned rd_ofs = vec_full_reg_offset(s, a->rd);
94
- case 0x4: /* CLZ, CLS */
60
- unsigned rn_ofs = vec_full_reg_offset(s, a->rn);
95
- if (u) {
61
- fn(a->esz, rd_ofs, rn_ofs, a->imm, vsz, vsz);
96
- gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_clz, size);
62
- }
97
- } else {
63
- return true;
98
- gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_cls, size);
64
+ return gen_gvec_fn_zzi(s, fn, a->esz, a->rd, a->rn, a->imm);
99
- }
65
}
100
- return;
66
101
case 0x5:
67
static bool trans_SSRA(DisasContext *s, arg_rri_esz *a)
102
if (u && size == 0) { /* NOT */
103
gen_gvec_fn2(s, is_q, rd, rn, tcg_gen_gvec_not, 0);
104
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
105
case 0xa: /* CMLT */
106
gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_clt0, size);
107
return;
108
+ case 0x4: /* CLZ, CLS */
109
case 0xb:
110
g_assert_not_reached();
111
}
68
--
112
--
69
2.25.1
113
2.34.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 gvec interfaces for CNT and RBIT operations.
4
Use ctpop8 for CNT and revbit+bswap for RBIT.
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-96-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-40-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 | 53 ++++++++++----------------------------
11
target/arm/helper.h | 4 ++--
9
1 file changed, 14 insertions(+), 39 deletions(-)
12
target/arm/tcg/translate.h | 4 ++++
13
target/arm/tcg/gengvec.c | 16 ++++++++++++++++
14
target/arm/tcg/neon_helper.c | 21 ---------------------
15
target/arm/tcg/translate-a64.c | 32 +++++++++-----------------------
16
target/arm/tcg/translate-neon.c | 16 ++++++++--------
17
target/arm/tcg/vec_helper.c | 24 ++++++++++++++++++++++++
18
7 files changed, 63 insertions(+), 54 deletions(-)
10
19
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
20
diff --git a/target/arm/helper.h b/target/arm/helper.h
12
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
22
--- a/target/arm/helper.h
14
+++ b/target/arm/translate-sve.c
23
+++ b/target/arm/helper.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a,
24
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_1(neon_clz_u16, i32, i32)
16
return true;
25
DEF_HELPER_1(neon_cls_s8, i32, i32)
17
}
26
DEF_HELPER_1(neon_cls_s16, i32, i32)
18
27
DEF_HELPER_1(neon_cls_s32, i32, i32)
19
-static bool trans_FRINTN(DisasContext *s, arg_rpr_esz *a)
28
-DEF_HELPER_1(neon_cnt_u8, i32, i32)
29
-DEF_HELPER_FLAGS_1(neon_rbit_u8, TCG_CALL_NO_RWG_SE, i32, i32)
30
+DEF_HELPER_FLAGS_3(gvec_cnt_b, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
31
+DEF_HELPER_FLAGS_3(gvec_rbit_b, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
32
33
DEF_HELPER_3(neon_qdmulh_s16, i32, env, i32, i32)
34
DEF_HELPER_3(neon_qrdmulh_s16, i32, env, i32, i32)
35
diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/arm/tcg/translate.h
38
+++ b/target/arm/tcg/translate.h
39
@@ -XXX,XX +XXX,XX @@ void gen_gvec_cls(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
40
uint32_t opr_sz, uint32_t max_sz);
41
void gen_gvec_clz(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
42
uint32_t opr_sz, uint32_t max_sz);
43
+void gen_gvec_cnt(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
44
+ uint32_t opr_sz, uint32_t max_sz);
45
+void gen_gvec_rbit(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
46
+ uint32_t opr_sz, uint32_t max_sz);
47
48
/*
49
* Forward to the isar_feature_* tests given a DisasContext pointer.
50
diff --git a/target/arm/tcg/gengvec.c b/target/arm/tcg/gengvec.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/target/arm/tcg/gengvec.c
53
+++ b/target/arm/tcg/gengvec.c
54
@@ -XXX,XX +XXX,XX @@ void gen_gvec_clz(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
55
assert(vece <= MO_32);
56
tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g[vece]);
57
}
58
+
59
+void gen_gvec_cnt(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
60
+ uint32_t opr_sz, uint32_t max_sz)
61
+{
62
+ assert(vece == MO_8);
63
+ tcg_gen_gvec_2_ool(rd_ofs, rn_ofs, opr_sz, max_sz, 0,
64
+ gen_helper_gvec_cnt_b);
65
+}
66
+
67
+void gen_gvec_rbit(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
68
+ uint32_t opr_sz, uint32_t max_sz)
69
+{
70
+ assert(vece == MO_8);
71
+ tcg_gen_gvec_2_ool(rd_ofs, rn_ofs, opr_sz, max_sz, 0,
72
+ gen_helper_gvec_rbit_b);
73
+}
74
diff --git a/target/arm/tcg/neon_helper.c b/target/arm/tcg/neon_helper.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/target/arm/tcg/neon_helper.c
77
+++ b/target/arm/tcg/neon_helper.c
78
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(neon_cls_s32)(uint32_t x)
79
return count - 1;
80
}
81
82
-/* Bit count. */
83
-uint32_t HELPER(neon_cnt_u8)(uint32_t x)
20
-{
84
-{
21
- return do_frint_mode(s, a, float_round_nearest_even, frint_fns[a->esz]);
85
- x = (x & 0x55555555) + ((x >> 1) & 0x55555555);
86
- x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
87
- x = (x & 0x0f0f0f0f) + ((x >> 4) & 0x0f0f0f0f);
88
- return x;
22
-}
89
-}
23
-
90
-
24
-static bool trans_FRINTP(DisasContext *s, arg_rpr_esz *a)
91
-/* Reverse bits in each 8 bit word */
92
-uint32_t HELPER(neon_rbit_u8)(uint32_t x)
25
-{
93
-{
26
- return do_frint_mode(s, a, float_round_up, frint_fns[a->esz]);
94
- x = ((x & 0xf0f0f0f0) >> 4)
95
- | ((x & 0x0f0f0f0f) << 4);
96
- x = ((x & 0x88888888) >> 3)
97
- | ((x & 0x44444444) >> 1)
98
- | ((x & 0x22222222) << 1)
99
- | ((x & 0x11111111) << 3);
100
- return x;
27
-}
101
-}
28
-
102
-
29
-static bool trans_FRINTM(DisasContext *s, arg_rpr_esz *a)
103
#define NEON_QDMULH16(dest, src1, src2, round) do { \
104
uint32_t tmp = (int32_t)(int16_t) src1 * (int16_t) src2; \
105
if ((tmp ^ (tmp << 1)) & SIGNBIT) { \
106
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/target/arm/tcg/translate-a64.c
109
+++ b/target/arm/tcg/translate-a64.c
110
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
111
}
112
113
switch (opcode) {
114
- case 0x5:
115
- if (u && size == 0) { /* NOT */
116
+ case 0x5: /* CNT, NOT, RBIT */
117
+ if (!u) {
118
+ gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_cnt, 0);
119
+ } else if (size) {
120
+ gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_rbit, 0);
121
+ } else {
122
gen_gvec_fn2(s, is_q, rd, rn, tcg_gen_gvec_not, 0);
123
- return;
124
}
125
- break;
126
+ return;
127
case 0x8: /* CMGT, CMGE */
128
if (u) {
129
gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_cge0, size);
130
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
131
} else {
132
int pass;
133
134
+ assert(size == 2);
135
for (pass = 0; pass < (is_q ? 4 : 2); pass++) {
136
TCGv_i32 tcg_op = tcg_temp_new_i32();
137
TCGv_i32 tcg_res = tcg_temp_new_i32();
138
139
read_vec_element_i32(s, tcg_op, rn, pass, MO_32);
140
141
- if (size == 2) {
142
+ {
143
/* Special cases for 32 bit elements */
144
switch (opcode) {
145
case 0x2f: /* FABS */
146
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
147
case 0x7: /* SQABS, SQNEG */
148
g_assert_not_reached();
149
}
150
- } else {
151
- /* Use helpers for 8 and 16 bit elements */
152
- switch (opcode) {
153
- case 0x5: /* CNT, RBIT */
154
- /* For these two insns size is part of the opcode specifier
155
- * (handled earlier); they always operate on byte elements.
156
- */
157
- if (u) {
158
- gen_helper_neon_rbit_u8(tcg_res, tcg_op);
159
- } else {
160
- gen_helper_neon_cnt_u8(tcg_res, tcg_op);
161
- }
162
- break;
163
- default:
164
- case 0x7: /* SQABS, SQNEG */
165
- g_assert_not_reached();
166
- }
167
}
168
-
169
write_vec_element_i32(s, tcg_res, rd, pass, MO_32);
170
}
171
}
172
diff --git a/target/arm/tcg/translate-neon.c b/target/arm/tcg/translate-neon.c
173
index XXXXXXX..XXXXXXX 100644
174
--- a/target/arm/tcg/translate-neon.c
175
+++ b/target/arm/tcg/translate-neon.c
176
@@ -XXX,XX +XXX,XX @@ static bool trans_VMVN(DisasContext *s, arg_2misc *a)
177
return do_2misc_vec(s, a, tcg_gen_gvec_not);
178
}
179
180
+static bool trans_VCNT(DisasContext *s, arg_2misc *a)
181
+{
182
+ if (a->size != 0) {
183
+ return false;
184
+ }
185
+ return do_2misc_vec(s, a, gen_gvec_cnt);
186
+}
187
+
188
#define WRAP_2M_3_OOL_FN(WRAPNAME, FUNC, DATA) \
189
static void WRAPNAME(unsigned vece, uint32_t rd_ofs, \
190
uint32_t rm_ofs, uint32_t oprsz, \
191
@@ -XXX,XX +XXX,XX @@ static bool trans_VREV16(DisasContext *s, arg_2misc *a)
192
return do_2misc(s, a, gen_rev16);
193
}
194
195
-static bool trans_VCNT(DisasContext *s, arg_2misc *a)
30
-{
196
-{
31
- return do_frint_mode(s, a, float_round_down, frint_fns[a->esz]);
197
- if (a->size != 0) {
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;
198
- return false;
64
- }
199
- }
65
- return do_frint_mode(s, a, float_round_to_odd, gen_helper_sve_fcvt_ds);
200
- return do_2misc(s, a, gen_helper_neon_cnt_u8);
66
-}
201
-}
67
-
202
-
68
-static bool trans_FCVTXNT_ds(DisasContext *s, arg_rpr_esz *a)
203
static void gen_VABS_F(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs,
69
-{
204
uint32_t oprsz, uint32_t maxsz)
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
{
205
{
206
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
207
index XXXXXXX..XXXXXXX 100644
208
--- a/target/arm/tcg/vec_helper.c
209
+++ b/target/arm/tcg/vec_helper.c
210
@@ -XXX,XX +XXX,XX @@ DO_CLAMP(gvec_uclamp_b, uint8_t)
211
DO_CLAMP(gvec_uclamp_h, uint16_t)
212
DO_CLAMP(gvec_uclamp_s, uint32_t)
213
DO_CLAMP(gvec_uclamp_d, uint64_t)
214
+
215
+/* Bit count in each 8-bit word. */
216
+void HELPER(gvec_cnt_b)(void *vd, void *vn, uint32_t desc)
217
+{
218
+ intptr_t i, opr_sz = simd_oprsz(desc);
219
+ uint8_t *d = vd, *n = vn;
220
+
221
+ for (i = 0; i < opr_sz; ++i) {
222
+ d[i] = ctpop8(n[i]);
223
+ }
224
+ clear_tail(d, opr_sz, simd_maxsz(desc));
225
+}
226
+
227
+/* Reverse bits in each 8 bit word */
228
+void HELPER(gvec_rbit_b)(void *vd, void *vn, uint32_t desc)
229
+{
230
+ intptr_t i, opr_sz = simd_oprsz(desc);
231
+ uint64_t *d = vd, *n = vn;
232
+
233
+ for (i = 0; i < opr_sz / 8; ++i) {
234
+ d[i] = revbit64(bswap64(n[i]));
235
+ }
236
+ clear_tail(d, opr_sz, simd_maxsz(desc));
237
+}
82
--
238
--
83
2.25.1
239
2.34.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
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
to reject an 8-bit shift of an 8-bit constant for 8-bit element.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-74-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-41-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
7
---
11
target/arm/sve.decode | 10 ++++++++--
8
target/arm/tcg/a64.decode | 4 ++++
12
target/arm/translate-sve.c | 6 ------
9
target/arm/tcg/translate-a64.c | 34 ++++++----------------------------
13
2 files changed, 8 insertions(+), 8 deletions(-)
10
2 files changed, 10 insertions(+), 28 deletions(-)
14
11
15
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
16
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sve.decode
14
--- a/target/arm/tcg/a64.decode
18
+++ b/target/arm/sve.decode
15
+++ b/target/arm/tcg/a64.decode
19
@@ -XXX,XX +XXX,XX @@ DUPM 00000101 11 0000 dbm:13 rd:5
16
@@ -XXX,XX +XXX,XX @@
20
FCPY 00000101 .. 01 .... 110 imm:8 ..... @rdn_pg4
17
@rrr_q1e3 ........ ... rm:5 ...... rn:5 rd:5 &qrrr_e q=1 esz=3
21
18
@rrrr_q1e3 ........ ... rm:5 . ra:5 rn:5 rd:5 &qrrrr_e q=1 esz=3
22
# SVE copy integer immediate (predicated)
19
23
-CPY_m_i 00000101 .. 01 .... 01 . ........ ..... @rdn_pg4 imm=%sh8_i8s
20
+@qrr_b . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=0
24
-CPY_z_i 00000101 .. 01 .... 00 . ........ ..... @rdn_pg4 imm=%sh8_i8s
21
@qrr_h . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=1
25
+{
22
@qrr_e . q:1 ...... esz:2 ...... ...... rn:5 rd:5 &qrr_e
26
+ INVALID 00000101 00 01 ---- 01 1 -------- -----
23
27
+ CPY_m_i 00000101 .. 01 .... 01 . ........ ..... @rdn_pg4 imm=%sh8_i8s
24
@@ -XXX,XX +XXX,XX @@ ABS_v 0.00 1110 ..1 00000 10111 0 ..... ..... @qrr_e
28
+}
25
NEG_v 0.10 1110 ..1 00000 10111 0 ..... ..... @qrr_e
29
+{
26
CLS_v 0.00 1110 ..1 00000 01001 0 ..... ..... @qrr_e
30
+ INVALID 00000101 00 01 ---- 00 1 -------- -----
27
CLZ_v 0.10 1110 ..1 00000 01001 0 ..... ..... @qrr_e
31
+ CPY_z_i 00000101 .. 01 .... 00 . ........ ..... @rdn_pg4 imm=%sh8_i8s
28
+CNT_v 0.00 1110 001 00000 01011 0 ..... ..... @qrr_b
32
+}
29
+NOT_v 0.10 1110 001 00000 01011 0 ..... ..... @qrr_b
33
30
+RBIT_v 0.10 1110 011 00000 01011 0 ..... ..... @qrr_b
34
### SVE Permute - Extract Group
31
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
35
36
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
37
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/translate-sve.c
33
--- a/target/arm/tcg/translate-a64.c
39
+++ b/target/arm/translate-sve.c
34
+++ b/target/arm/tcg/translate-a64.c
40
@@ -XXX,XX +XXX,XX @@ static bool trans_FCPY(DisasContext *s, arg_FCPY *a)
35
@@ -XXX,XX +XXX,XX @@ static bool do_gvec_fn2(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
41
36
42
static bool trans_CPY_m_i(DisasContext *s, arg_rpri_esz *a)
37
TRANS(ABS_v, do_gvec_fn2, a, tcg_gen_gvec_abs)
38
TRANS(NEG_v, do_gvec_fn2, a, tcg_gen_gvec_neg)
39
+TRANS(NOT_v, do_gvec_fn2, a, tcg_gen_gvec_not)
40
+TRANS(CNT_v, do_gvec_fn2, a, gen_gvec_cnt)
41
+TRANS(RBIT_v, do_gvec_fn2, a, gen_gvec_rbit)
42
43
static bool do_gvec_fn2_bhs(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
43
{
44
{
44
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
45
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
45
- return false;
46
TCGCond cond;
46
- }
47
47
if (sve_access_check(s)) {
48
switch (opcode) {
48
do_cpy_m(s, a->esz, a->rd, a->rn, a->pg, tcg_constant_i64(a->imm));
49
- case 0x5: /* NOT */
50
- /* This opcode is shared with CNT and RBIT but we have earlier
51
- * enforced that size == 3 if and only if this is the NOT insn.
52
- */
53
- tcg_gen_not_i64(tcg_rd, tcg_rn);
54
- break;
55
case 0xa: /* CMLT */
56
cond = TCG_COND_LT;
57
do_cmop:
58
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
59
break;
60
default:
61
case 0x4: /* CLS, CLZ */
62
+ case 0x5: /* NOT */
63
case 0x7: /* SQABS, SQNEG */
64
case 0xb: /* ABS, NEG */
65
g_assert_not_reached();
66
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
67
case 0x1: /* REV16 */
68
handle_rev(s, opcode, u, is_q, size, rn, rd);
69
return;
70
- case 0x5: /* CNT, NOT, RBIT */
71
- if (u && size == 0) {
72
- /* NOT */
73
- break;
74
- } else if (u && size == 1) {
75
- /* RBIT */
76
- break;
77
- } else if (!u && size == 0) {
78
- /* CNT */
79
- break;
80
- }
81
- unallocated_encoding(s);
82
- return;
83
case 0x12: /* XTN, XTN2, SQXTUN, SQXTUN2 */
84
case 0x14: /* SQXTN, SQXTN2, UQXTN, UQXTN2 */
85
if (size == 3) {
86
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
87
default:
88
case 0x3: /* SUQADD, USQADD */
89
case 0x4: /* CLS, CLZ */
90
+ case 0x5: /* CNT, NOT, RBIT */
91
case 0x7: /* SQABS, SQNEG */
92
case 0xb: /* ABS, NEG */
93
unallocated_encoding(s);
94
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
49
}
95
}
50
@@ -XXX,XX +XXX,XX @@ static bool trans_CPY_z_i(DisasContext *s, arg_CPY_z_i *a)
96
51
gen_helper_sve_cpy_z_s, gen_helper_sve_cpy_z_d,
97
switch (opcode) {
52
};
98
- case 0x5: /* CNT, NOT, RBIT */
53
99
- if (!u) {
54
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
100
- gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_cnt, 0);
55
- return false;
101
- } else if (size) {
56
- }
102
- gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_rbit, 0);
57
if (sve_access_check(s)) {
103
- } else {
58
unsigned vsz = vec_full_reg_size(s);
104
- gen_gvec_fn2(s, is_q, rd, rn, tcg_gen_gvec_not, 0);
59
tcg_gen_gvec_2i_ool(vec_full_reg_offset(s, a->rd),
105
- }
106
- return;
107
case 0x8: /* CMGT, CMGE */
108
if (u) {
109
gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_cge0, size);
110
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
111
gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_clt0, size);
112
return;
113
case 0x4: /* CLZ, CLS */
114
+ case 0x5: /* CNT, NOT, RBIT */
115
case 0xb:
116
g_assert_not_reached();
117
}
60
--
118
--
61
2.25.1
119
2.34.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
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
which is intended to reject an 8-bit shift of
5
an 8-bit constant for 8-bit element.
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-72-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-42-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/sve.decode | 5 ++++-
8
target/arm/tcg/a64.decode | 10 ++++
13
target/arm/translate-sve.c | 10 ++++++----
9
target/arm/tcg/translate-a64.c | 94 +++++++++++-----------------------
14
2 files changed, 10 insertions(+), 5 deletions(-)
10
2 files changed, 40 insertions(+), 64 deletions(-)
15
11
16
diff --git a/target/arm/sve.decode b/target/arm/sve.decode
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
17
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/sve.decode
14
--- a/target/arm/tcg/a64.decode
19
+++ b/target/arm/sve.decode
15
+++ b/target/arm/tcg/a64.decode
20
@@ -XXX,XX +XXX,XX @@ WHILE_ptr 00100101 esz:2 1 rm:5 001 100 rn:5 rw:1 rd:4
16
@@ -XXX,XX +XXX,XX @@ SQABS_s 0101 1110 ..1 00000 01111 0 ..... ..... @rr_e
21
FDUP 00100101 esz:2 111 00 1110 imm:8 rd:5
17
SQNEG_s 0111 1110 ..1 00000 01111 0 ..... ..... @rr_e
22
18
ABS_s 0101 1110 111 00000 10111 0 ..... ..... @rr
23
# SVE broadcast integer immediate (unpredicated)
19
NEG_s 0111 1110 111 00000 10111 0 ..... ..... @rr
24
-DUP_i 00100101 esz:2 111 00 011 . ........ rd:5 imm=%sh8_i8s
20
+CMGT0_s 0101 1110 111 00000 10001 0 ..... ..... @rr
21
+CMGE0_s 0111 1110 111 00000 10001 0 ..... ..... @rr
22
+CMEQ0_s 0101 1110 111 00000 10011 0 ..... ..... @rr
23
+CMLE0_s 0111 1110 111 00000 10011 0 ..... ..... @rr
24
+CMLT0_s 0101 1110 111 00000 10101 0 ..... ..... @rr
25
26
# Advanced SIMD two-register miscellaneous
27
28
@@ -XXX,XX +XXX,XX @@ CLZ_v 0.10 1110 ..1 00000 01001 0 ..... ..... @qrr_e
29
CNT_v 0.00 1110 001 00000 01011 0 ..... ..... @qrr_b
30
NOT_v 0.10 1110 001 00000 01011 0 ..... ..... @qrr_b
31
RBIT_v 0.10 1110 011 00000 01011 0 ..... ..... @qrr_b
32
+CMGT0_v 0.00 1110 ..1 00000 10001 0 ..... ..... @qrr_e
33
+CMGE0_v 0.10 1110 ..1 00000 10001 0 ..... ..... @qrr_e
34
+CMEQ0_v 0.00 1110 ..1 00000 10011 0 ..... ..... @qrr_e
35
+CMLE0_v 0.10 1110 ..1 00000 10011 0 ..... ..... @qrr_e
36
+CMLT0_v 0.00 1110 ..1 00000 10101 0 ..... ..... @qrr_e
37
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/target/arm/tcg/translate-a64.c
40
+++ b/target/arm/tcg/translate-a64.c
41
@@ -XXX,XX +XXX,XX @@ static bool do_scalar1_d(DisasContext *s, arg_rr *a, ArithOneOp *f)
42
TRANS(ABS_s, do_scalar1_d, a, tcg_gen_abs_i64)
43
TRANS(NEG_s, do_scalar1_d, a, tcg_gen_neg_i64)
44
45
+static bool do_cmop0_d(DisasContext *s, arg_rr *a, TCGCond cond)
25
+{
46
+{
26
+ INVALID 00100101 00 111 00 011 1 -------- -----
47
+ if (fp_access_check(s)) {
27
+ DUP_i 00100101 esz:2 111 00 011 . ........ rd:5 imm=%sh8_i8s
48
+ TCGv_i64 t = read_fp_dreg(s, a->rn);
28
+}
49
+ tcg_gen_negsetcond_i64(cond, t, t, tcg_constant_i64(0));
29
50
+ write_fp_dreg(s, a->rd, t);
30
# SVE integer add/subtract immediate (unpredicated)
51
+ }
31
ADD_zzi 00100101 .. 100 000 11 . ........ ..... @rdn_sh_i8u
32
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/translate-sve.c
35
+++ b/target/arm/translate-sve.c
36
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
37
0x1111111111111111ull, 0x0101010101010101ull
38
};
39
40
+static bool trans_INVALID(DisasContext *s, arg_INVALID *a)
41
+{
42
+ unallocated_encoding(s);
43
+ return true;
52
+ return true;
44
+}
53
+}
45
+
54
+
46
/*
55
+TRANS(CMGT0_s, do_cmop0_d, a, TCG_COND_GT)
47
*** SVE Logical - Unpredicated Group
56
+TRANS(CMGE0_s, do_cmop0_d, a, TCG_COND_GE)
48
*/
57
+TRANS(CMLE0_s, do_cmop0_d, a, TCG_COND_LE)
49
@@ -XXX,XX +XXX,XX @@ static bool trans_FDUP(DisasContext *s, arg_FDUP *a)
58
+TRANS(CMLT0_s, do_cmop0_d, a, TCG_COND_LT)
50
59
+TRANS(CMEQ0_s, do_cmop0_d, a, TCG_COND_EQ)
51
static bool trans_DUP_i(DisasContext *s, arg_DUP_i *a)
60
+
61
static bool do_gvec_fn2(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
52
{
62
{
53
- if (a->esz == 0 && extract32(s->insn, 13, 1)) {
63
if (!a->q && a->esz == MO_64) {
54
- return false;
64
@@ -XXX,XX +XXX,XX @@ TRANS(NEG_v, do_gvec_fn2, a, tcg_gen_gvec_neg)
65
TRANS(NOT_v, do_gvec_fn2, a, tcg_gen_gvec_not)
66
TRANS(CNT_v, do_gvec_fn2, a, gen_gvec_cnt)
67
TRANS(RBIT_v, do_gvec_fn2, a, gen_gvec_rbit)
68
+TRANS(CMGT0_v, do_gvec_fn2, a, gen_gvec_cgt0)
69
+TRANS(CMGE0_v, do_gvec_fn2, a, gen_gvec_cge0)
70
+TRANS(CMLT0_v, do_gvec_fn2, a, gen_gvec_clt0)
71
+TRANS(CMLE0_v, do_gvec_fn2, a, gen_gvec_cle0)
72
+TRANS(CMEQ0_v, do_gvec_fn2, a, gen_gvec_ceq0)
73
74
static bool do_gvec_fn2_bhs(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
75
{
76
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
77
* The caller only need provide tcg_rmode and tcg_fpstatus if the op
78
* requires them.
79
*/
80
- TCGCond cond;
81
-
82
switch (opcode) {
83
- case 0xa: /* CMLT */
84
- cond = TCG_COND_LT;
85
- do_cmop:
86
- /* 64 bit integer comparison against zero, result is test ? -1 : 0. */
87
- tcg_gen_negsetcond_i64(cond, tcg_rd, tcg_rn, tcg_constant_i64(0));
88
- break;
89
- case 0x8: /* CMGT, CMGE */
90
- cond = u ? TCG_COND_GE : TCG_COND_GT;
91
- goto do_cmop;
92
- case 0x9: /* CMEQ, CMLE */
93
- cond = u ? TCG_COND_LE : TCG_COND_EQ;
94
- goto do_cmop;
95
case 0x2f: /* FABS */
96
gen_vfp_absd(tcg_rd, tcg_rn);
97
break;
98
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
99
case 0x4: /* CLS, CLZ */
100
case 0x5: /* NOT */
101
case 0x7: /* SQABS, SQNEG */
102
+ case 0x8: /* CMGT, CMGE */
103
+ case 0x9: /* CMEQ, CMLE */
104
+ case 0xa: /* CMLT */
105
case 0xb: /* ABS, NEG */
106
g_assert_not_reached();
107
}
108
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
109
TCGv_ptr tcg_fpstatus;
110
111
switch (opcode) {
112
- case 0xa: /* CMLT */
113
- if (u) {
114
- unallocated_encoding(s);
115
- return;
116
- }
117
- /* fall through */
118
- case 0x8: /* CMGT, CMGE */
119
- case 0x9: /* CMEQ, CMLE */
120
- if (size != 3) {
121
- unallocated_encoding(s);
122
- return;
123
- }
124
- break;
125
case 0x12: /* SQXTUN */
126
if (!u) {
127
unallocated_encoding(s);
128
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
129
default:
130
case 0x3: /* USQADD / SUQADD */
131
case 0x7: /* SQABS / SQNEG */
132
+ case 0x8: /* CMGT, CMGE */
133
+ case 0x9: /* CMEQ, CMLE */
134
+ case 0xa: /* CMLT */
135
case 0xb: /* ABS, NEG */
136
unallocated_encoding(s);
137
return;
138
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
139
}
140
handle_shll(s, is_q, size, rn, rd);
141
return;
142
- case 0xa: /* CMLT */
143
- if (u == 1) {
144
- unallocated_encoding(s);
145
- return;
146
- }
147
- /* fall through */
148
- case 0x8: /* CMGT, CMGE */
149
- case 0x9: /* CMEQ, CMLE */
150
- if (size == 3 && !is_q) {
151
- unallocated_encoding(s);
152
- return;
153
- }
154
- break;
155
case 0xc ... 0xf:
156
case 0x16 ... 0x1f:
157
{
158
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
159
case 0x4: /* CLS, CLZ */
160
case 0x5: /* CNT, NOT, RBIT */
161
case 0x7: /* SQABS, SQNEG */
162
+ case 0x8: /* CMGT, CMGE */
163
+ case 0x9: /* CMEQ, CMLE */
164
+ case 0xa: /* CMLT */
165
case 0xb: /* ABS, NEG */
166
unallocated_encoding(s);
167
return;
168
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
169
tcg_rmode = NULL;
170
}
171
172
- switch (opcode) {
173
- case 0x8: /* CMGT, CMGE */
174
- if (u) {
175
- gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_cge0, size);
176
- } else {
177
- gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_cgt0, size);
178
- }
179
- return;
180
- case 0x9: /* CMEQ, CMLE */
181
- if (u) {
182
- gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_cle0, size);
183
- } else {
184
- gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_ceq0, size);
185
- }
186
- return;
187
- case 0xa: /* CMLT */
188
- gen_gvec_fn2(s, is_q, rd, rn, gen_gvec_clt0, size);
189
- return;
190
- case 0x4: /* CLZ, CLS */
191
- case 0x5: /* CNT, NOT, RBIT */
192
- case 0xb:
193
- g_assert_not_reached();
55
- }
194
- }
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
-
195
-
60
tcg_gen_gvec_dup_imm(a->esz, dofs, vsz, vsz, a->imm);
196
if (size == 3) {
61
}
197
/* All 64-bit element operations can be shared with scalar 2misc */
62
return true;
198
int pass;
63
--
199
--
64
2.25.1
200
2.34.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-56-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-43-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 | 35 ++++++-----------------------------
8
target/arm/tcg/translate.h | 6 +++
9
1 file changed, 6 insertions(+), 29 deletions(-)
9
target/arm/tcg/gengvec.c | 58 ++++++++++++++++++++++
10
target/arm/tcg/translate-neon.c | 88 +++++++--------------------------
11
3 files changed, 81 insertions(+), 71 deletions(-)
10
12
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
15
--- a/target/arm/tcg/translate.h
14
+++ b/target/arm/translate-sve.c
16
+++ b/target/arm/tcg/translate.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_perm_pred2(DisasContext *s, arg_rr_esz *a, bool high_odd,
17
@@ -XXX,XX +XXX,XX @@ void gen_gvec_cnt(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
18
uint32_t opr_sz, uint32_t max_sz);
19
void gen_gvec_rbit(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
20
uint32_t opr_sz, uint32_t max_sz);
21
+void gen_gvec_rev16(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
22
+ uint32_t opr_sz, uint32_t max_sz);
23
+void gen_gvec_rev32(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
24
+ uint32_t opr_sz, uint32_t max_sz);
25
+void gen_gvec_rev64(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
26
+ uint32_t opr_sz, uint32_t max_sz);
27
28
/*
29
* Forward to the isar_feature_* tests given a DisasContext pointer.
30
diff --git a/target/arm/tcg/gengvec.c b/target/arm/tcg/gengvec.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/tcg/gengvec.c
33
+++ b/target/arm/tcg/gengvec.c
34
@@ -XXX,XX +XXX,XX @@ void gen_gvec_rbit(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
35
tcg_gen_gvec_2_ool(rd_ofs, rn_ofs, opr_sz, max_sz, 0,
36
gen_helper_gvec_rbit_b);
37
}
38
+
39
+void gen_gvec_rev16(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
40
+ uint32_t opr_sz, uint32_t max_sz)
41
+{
42
+ assert(vece == MO_8);
43
+ tcg_gen_gvec_rotli(MO_16, rd_ofs, rn_ofs, 8, opr_sz, max_sz);
44
+}
45
+
46
+static void gen_bswap32_i64(TCGv_i64 d, TCGv_i64 n)
47
+{
48
+ tcg_gen_bswap64_i64(d, n);
49
+ tcg_gen_rotli_i64(d, d, 32);
50
+}
51
+
52
+void gen_gvec_rev32(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
53
+ uint32_t opr_sz, uint32_t max_sz)
54
+{
55
+ static const GVecGen2 g = {
56
+ .fni8 = gen_bswap32_i64,
57
+ .fni4 = tcg_gen_bswap32_i32,
58
+ .prefer_i64 = TCG_TARGET_REG_BITS == 64,
59
+ .vece = MO_32
60
+ };
61
+
62
+ switch (vece) {
63
+ case MO_16:
64
+ tcg_gen_gvec_rotli(MO_32, rd_ofs, rn_ofs, 16, opr_sz, max_sz);
65
+ break;
66
+ case MO_8:
67
+ tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g);
68
+ break;
69
+ default:
70
+ g_assert_not_reached();
71
+ }
72
+}
73
+
74
+void gen_gvec_rev64(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
75
+ uint32_t opr_sz, uint32_t max_sz)
76
+{
77
+ static const GVecGen2 g[] = {
78
+ { .fni8 = tcg_gen_bswap64_i64,
79
+ .vece = MO_64 },
80
+ { .fni8 = tcg_gen_hswap_i64,
81
+ .vece = MO_64 },
82
+ };
83
+
84
+ switch (vece) {
85
+ case MO_32:
86
+ tcg_gen_gvec_rotli(MO_64, rd_ofs, rn_ofs, 32, opr_sz, max_sz);
87
+ break;
88
+ case MO_8:
89
+ case MO_16:
90
+ tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g[vece]);
91
+ break;
92
+ default:
93
+ g_assert_not_reached();
94
+ }
95
+}
96
diff --git a/target/arm/tcg/translate-neon.c b/target/arm/tcg/translate-neon.c
97
index XXXXXXX..XXXXXXX 100644
98
--- a/target/arm/tcg/translate-neon.c
99
+++ b/target/arm/tcg/translate-neon.c
100
@@ -XXX,XX +XXX,XX @@ static bool trans_VDUP_scalar(DisasContext *s, arg_VDUP_scalar *a)
16
return true;
101
return true;
17
}
102
}
18
103
19
-static bool trans_ZIP1_p(DisasContext *s, arg_rrr_esz *a)
104
-static bool trans_VREV64(DisasContext *s, arg_VREV64 *a)
20
-{
105
-{
21
- return do_perm_pred3(s, a, 0, gen_helper_sve_zip_p);
106
- int pass, half;
107
- TCGv_i32 tmp[2];
108
-
109
- if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
110
- return false;
111
- }
112
-
113
- /* UNDEF accesses to D16-D31 if they don't exist. */
114
- if (!dc_isar_feature(aa32_simd_r32, s) &&
115
- ((a->vd | a->vm) & 0x10)) {
116
- return false;
117
- }
118
-
119
- if ((a->vd | a->vm) & a->q) {
120
- return false;
121
- }
122
-
123
- if (a->size == 3) {
124
- return false;
125
- }
126
-
127
- if (!vfp_access_check(s)) {
128
- return true;
129
- }
130
-
131
- tmp[0] = tcg_temp_new_i32();
132
- tmp[1] = tcg_temp_new_i32();
133
-
134
- for (pass = 0; pass < (a->q ? 2 : 1); pass++) {
135
- for (half = 0; half < 2; half++) {
136
- read_neon_element32(tmp[half], a->vm, pass * 2 + half, MO_32);
137
- switch (a->size) {
138
- case 0:
139
- tcg_gen_bswap32_i32(tmp[half], tmp[half]);
140
- break;
141
- case 1:
142
- gen_swap_half(tmp[half], tmp[half]);
143
- break;
144
- case 2:
145
- break;
146
- default:
147
- g_assert_not_reached();
148
- }
149
- }
150
- write_neon_element32(tmp[1], a->vd, pass * 2, MO_32);
151
- write_neon_element32(tmp[0], a->vd, pass * 2 + 1, MO_32);
152
- }
153
- return true;
22
-}
154
-}
23
-
155
-
24
-static bool trans_ZIP2_p(DisasContext *s, arg_rrr_esz *a)
156
static bool do_2misc_pairwise(DisasContext *s, arg_2misc *a,
157
NeonGenWidenFn *widenfn,
158
NeonGenTwo64OpFn *opfn,
159
@@ -XXX,XX +XXX,XX @@ DO_2MISC_VEC(VCGE0, gen_gvec_cge0)
160
DO_2MISC_VEC(VCLT0, gen_gvec_clt0)
161
DO_2MISC_VEC(VCLS, gen_gvec_cls)
162
DO_2MISC_VEC(VCLZ, gen_gvec_clz)
163
+DO_2MISC_VEC(VREV64, gen_gvec_rev64)
164
165
static bool trans_VMVN(DisasContext *s, arg_2misc *a)
166
{
167
@@ -XXX,XX +XXX,XX @@ static bool trans_VCNT(DisasContext *s, arg_2misc *a)
168
return do_2misc_vec(s, a, gen_gvec_cnt);
169
}
170
171
+static bool trans_VREV16(DisasContext *s, arg_2misc *a)
172
+{
173
+ if (a->size != 0) {
174
+ return false;
175
+ }
176
+ return do_2misc_vec(s, a, gen_gvec_rev16);
177
+}
178
+
179
+static bool trans_VREV32(DisasContext *s, arg_2misc *a)
180
+{
181
+ if (a->size != 0 && a->size != 1) {
182
+ return false;
183
+ }
184
+ return do_2misc_vec(s, a, gen_gvec_rev32);
185
+}
186
+
187
#define WRAP_2M_3_OOL_FN(WRAPNAME, FUNC, DATA) \
188
static void WRAPNAME(unsigned vece, uint32_t rd_ofs, \
189
uint32_t rm_ofs, uint32_t oprsz, \
190
@@ -XXX,XX +XXX,XX @@ static bool do_2misc(DisasContext *s, arg_2misc *a, NeonGenOneOpFn *fn)
191
return true;
192
}
193
194
-static bool trans_VREV32(DisasContext *s, arg_2misc *a)
25
-{
195
-{
26
- return do_perm_pred3(s, a, 1, gen_helper_sve_zip_p);
196
- static NeonGenOneOpFn * const fn[] = {
197
- tcg_gen_bswap32_i32,
198
- gen_swap_half,
199
- NULL,
200
- NULL,
201
- };
202
- return do_2misc(s, a, fn[a->size]);
27
-}
203
-}
28
-
204
-
29
-static bool trans_UZP1_p(DisasContext *s, arg_rrr_esz *a)
205
-static bool trans_VREV16(DisasContext *s, arg_2misc *a)
30
-{
206
-{
31
- return do_perm_pred3(s, a, 0, gen_helper_sve_uzp_p);
207
- if (a->size != 0) {
208
- return false;
209
- }
210
- return do_2misc(s, a, gen_rev16);
32
-}
211
-}
33
-
212
-
34
-static bool trans_UZP2_p(DisasContext *s, arg_rrr_esz *a)
213
static void gen_VABS_F(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs,
35
-{
214
uint32_t oprsz, uint32_t maxsz)
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
{
215
{
57
--
216
--
58
2.25.1
217
2.34.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 includes REV16, REV32, REV64.
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-63-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-44-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 | 11 ++---------
10
target/arm/tcg/a64.decode | 5 +++
9
1 file changed, 2 insertions(+), 9 deletions(-)
11
target/arm/tcg/translate-a64.c | 79 +++-------------------------------
12
2 files changed, 10 insertions(+), 74 deletions(-)
10
13
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
16
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_clast_general(DisasContext *s, arg_rpr_esz *a, bool before)
18
@@ -XXX,XX +XXX,XX @@
16
return true;
19
20
@qrr_b . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=0
21
@qrr_h . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=1
22
+@qrr_bh . q:1 ...... . esz:1 ...... ...... rn:5 rd:5 &qrr_e
23
@qrr_e . q:1 ...... esz:2 ...... ...... rn:5 rd:5 &qrr_e
24
25
@qrrr_b . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=0
26
@@ -XXX,XX +XXX,XX @@ CMGE0_v 0.10 1110 ..1 00000 10001 0 ..... ..... @qrr_e
27
CMEQ0_v 0.00 1110 ..1 00000 10011 0 ..... ..... @qrr_e
28
CMLE0_v 0.10 1110 ..1 00000 10011 0 ..... ..... @qrr_e
29
CMLT0_v 0.00 1110 ..1 00000 10101 0 ..... ..... @qrr_e
30
+
31
+REV16_v 0.00 1110 001 00000 00011 0 ..... ..... @qrr_b
32
+REV32_v 0.10 1110 0.1 00000 00001 0 ..... ..... @qrr_bh
33
+REV64_v 0.00 1110 ..1 00000 00001 0 ..... ..... @qrr_e
34
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/tcg/translate-a64.c
37
+++ b/target/arm/tcg/translate-a64.c
38
@@ -XXX,XX +XXX,XX @@ TRANS(CMGE0_v, do_gvec_fn2, a, gen_gvec_cge0)
39
TRANS(CMLT0_v, do_gvec_fn2, a, gen_gvec_clt0)
40
TRANS(CMLE0_v, do_gvec_fn2, a, gen_gvec_cle0)
41
TRANS(CMEQ0_v, do_gvec_fn2, a, gen_gvec_ceq0)
42
+TRANS(REV16_v, do_gvec_fn2, a, gen_gvec_rev16)
43
+TRANS(REV32_v, do_gvec_fn2, a, gen_gvec_rev32)
44
45
static bool do_gvec_fn2_bhs(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
46
{
47
@@ -XXX,XX +XXX,XX @@ static bool do_gvec_fn2_bhs(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
48
49
TRANS(CLS_v, do_gvec_fn2_bhs, a, gen_gvec_cls)
50
TRANS(CLZ_v, do_gvec_fn2_bhs, a, gen_gvec_clz)
51
+TRANS(REV64_v, do_gvec_fn2_bhs, a, gen_gvec_rev64)
52
53
/* Common vector code for handling integer to FP conversion */
54
static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
55
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q,
56
}
17
}
57
}
18
58
19
-static bool trans_CLASTA_r(DisasContext *s, arg_rpr_esz *a)
59
-static void handle_rev(DisasContext *s, int opcode, bool u,
60
- bool is_q, int size, int rn, int rd)
20
-{
61
-{
21
- return do_clast_general(s, a, false);
62
- int op = (opcode << 1) | u;
63
- int opsz = op + size;
64
- int grp_size = 3 - opsz;
65
- int dsize = is_q ? 128 : 64;
66
- int i;
67
-
68
- if (opsz >= 3) {
69
- unallocated_encoding(s);
70
- return;
71
- }
72
-
73
- if (!fp_access_check(s)) {
74
- return;
75
- }
76
-
77
- if (size == 0) {
78
- /* Special case bytes, use bswap op on each group of elements */
79
- int groups = dsize / (8 << grp_size);
80
-
81
- for (i = 0; i < groups; i++) {
82
- TCGv_i64 tcg_tmp = tcg_temp_new_i64();
83
-
84
- read_vec_element(s, tcg_tmp, rn, i, grp_size);
85
- switch (grp_size) {
86
- case MO_16:
87
- tcg_gen_bswap16_i64(tcg_tmp, tcg_tmp, TCG_BSWAP_IZ);
88
- break;
89
- case MO_32:
90
- tcg_gen_bswap32_i64(tcg_tmp, tcg_tmp, TCG_BSWAP_IZ);
91
- break;
92
- case MO_64:
93
- tcg_gen_bswap64_i64(tcg_tmp, tcg_tmp);
94
- break;
95
- default:
96
- g_assert_not_reached();
97
- }
98
- write_vec_element(s, tcg_tmp, rd, i, grp_size);
99
- }
100
- clear_vec_high(s, is_q, rd);
101
- } else {
102
- int revmask = (1 << grp_size) - 1;
103
- int esize = 8 << size;
104
- int elements = dsize / esize;
105
- TCGv_i64 tcg_rn = tcg_temp_new_i64();
106
- TCGv_i64 tcg_rd[2];
107
-
108
- for (i = 0; i < 2; i++) {
109
- tcg_rd[i] = tcg_temp_new_i64();
110
- tcg_gen_movi_i64(tcg_rd[i], 0);
111
- }
112
-
113
- for (i = 0; i < elements; i++) {
114
- int e_rev = (i & 0xf) ^ revmask;
115
- int w = (e_rev * esize) / 64;
116
- int o = (e_rev * esize) % 64;
117
-
118
- read_vec_element(s, tcg_rn, rn, i, size);
119
- tcg_gen_deposit_i64(tcg_rd[w], tcg_rd[w], tcg_rn, o, esize);
120
- }
121
-
122
- for (i = 0; i < 2; i++) {
123
- write_vec_element(s, tcg_rd[i], rd, i, MO_64);
124
- }
125
- clear_vec_high(s, true, rd);
126
- }
22
-}
127
-}
23
-
128
-
24
-static bool trans_CLASTB_r(DisasContext *s, arg_rpr_esz *a)
129
static void handle_2misc_pairwise(DisasContext *s, int opcode, bool u,
25
-{
130
bool is_q, int size, int rn, int rd)
26
- return do_clast_general(s, a, true);
131
{
27
-}
132
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
28
+TRANS_FEAT(CLASTA_r, aa64_sve, do_clast_general, a, false)
133
TCGv_ptr tcg_fpstatus;
29
+TRANS_FEAT(CLASTB_r, aa64_sve, do_clast_general, a, true)
134
30
135
switch (opcode) {
31
/* Compute LAST for a scalar. */
136
- case 0x0: /* REV64, REV32 */
32
static TCGv_i64 do_last_scalar(DisasContext *s, int esz,
137
- case 0x1: /* REV16 */
138
- handle_rev(s, opcode, u, is_q, size, rn, rd);
139
- return;
140
case 0x12: /* XTN, XTN2, SQXTUN, SQXTUN2 */
141
case 0x14: /* SQXTN, SQXTN2, UQXTN, UQXTN2 */
142
if (size == 3) {
143
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
144
break;
145
}
146
default:
147
+ case 0x0: /* REV64, REV32 */
148
+ case 0x1: /* REV16 */
149
case 0x3: /* SUQADD, USQADD */
150
case 0x4: /* CLS, CLZ */
151
case 0x5: /* CNT, NOT, RBIT */
33
--
152
--
34
2.25.1
153
2.34.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_fn
3
Move from helper-a64.c to neon_helper.c so that these
4
to use TRANS_FEAT and gen_gvec_fn_arg_zzzz.
4
functions are available for arm32 code as well.
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-38-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-45-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 | 38 ++++++--------------------------------
11
target/arm/helper.h | 2 ++
12
1 file changed, 6 insertions(+), 32 deletions(-)
12
target/arm/tcg/helper-a64.h | 2 --
13
target/arm/tcg/helper-a64.c | 43 ------------------------------------
14
target/arm/tcg/neon_helper.c | 43 ++++++++++++++++++++++++++++++++++++
15
4 files changed, 45 insertions(+), 45 deletions(-)
13
16
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
17
diff --git a/target/arm/helper.h b/target/arm/helper.h
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
19
--- a/target/arm/helper.h
17
+++ b/target/arm/translate-sve.c
20
+++ b/target/arm/helper.h
18
@@ -XXX,XX +XXX,XX @@ static bool trans_XAR(DisasContext *s, arg_rrri_esz *a)
21
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_2(neon_addl_u16, i64, i64, i64)
19
return true;
22
DEF_HELPER_2(neon_addl_u32, i64, i64, i64)
23
DEF_HELPER_2(neon_paddl_u16, i64, i64, i64)
24
DEF_HELPER_2(neon_paddl_u32, i64, i64, i64)
25
+DEF_HELPER_FLAGS_1(neon_addlp_s8, TCG_CALL_NO_RWG_SE, i64, i64)
26
+DEF_HELPER_FLAGS_1(neon_addlp_s16, TCG_CALL_NO_RWG_SE, i64, i64)
27
DEF_HELPER_2(neon_subl_u16, i64, i64, i64)
28
DEF_HELPER_2(neon_subl_u32, i64, i64, i64)
29
DEF_HELPER_3(neon_addl_saturate_s32, i64, env, i64, i64)
30
diff --git a/target/arm/tcg/helper-a64.h b/target/arm/tcg/helper-a64.h
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/tcg/helper-a64.h
33
+++ b/target/arm/tcg/helper-a64.h
34
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(recpsf_f64, TCG_CALL_NO_RWG, f64, f64, f64, ptr)
35
DEF_HELPER_FLAGS_3(rsqrtsf_f16, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
36
DEF_HELPER_FLAGS_3(rsqrtsf_f32, TCG_CALL_NO_RWG, f32, f32, f32, ptr)
37
DEF_HELPER_FLAGS_3(rsqrtsf_f64, TCG_CALL_NO_RWG, f64, f64, f64, ptr)
38
-DEF_HELPER_FLAGS_1(neon_addlp_s8, TCG_CALL_NO_RWG_SE, i64, i64)
39
DEF_HELPER_FLAGS_1(neon_addlp_u8, TCG_CALL_NO_RWG_SE, i64, i64)
40
-DEF_HELPER_FLAGS_1(neon_addlp_s16, TCG_CALL_NO_RWG_SE, i64, i64)
41
DEF_HELPER_FLAGS_1(neon_addlp_u16, TCG_CALL_NO_RWG_SE, i64, i64)
42
DEF_HELPER_FLAGS_2(frecpx_f64, TCG_CALL_NO_RWG, f64, f64, ptr)
43
DEF_HELPER_FLAGS_2(frecpx_f32, TCG_CALL_NO_RWG, f32, f32, ptr)
44
diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/tcg/helper-a64.c
47
+++ b/target/arm/tcg/helper-a64.c
48
@@ -XXX,XX +XXX,XX @@ float64 HELPER(rsqrtsf_f64)(float64 a, float64 b, void *fpstp)
49
return float64_muladd(a, b, float64_three, float_muladd_halve_result, fpst);
20
}
50
}
21
51
22
-static bool do_sve2_zzzz_fn(DisasContext *s, arg_rrrr_esz *a, GVecGen4Fn *fn)
52
-/* Pairwise long add: add pairs of adjacent elements into
53
- * double-width elements in the result (eg _s8 is an 8x8->16 op)
54
- */
55
-uint64_t HELPER(neon_addlp_s8)(uint64_t a)
23
-{
56
-{
24
- if (!dc_isar_feature(aa64_sve2, s)) {
57
- uint64_t nsignmask = 0x0080008000800080ULL;
25
- return false;
58
- uint64_t wsignmask = 0x8000800080008000ULL;
26
- }
59
- uint64_t elementmask = 0x00ff00ff00ff00ffULL;
27
- return gen_gvec_fn_arg_zzzz(s, fn, a);
60
- uint64_t tmp1, tmp2;
61
- uint64_t res, signres;
62
-
63
- /* Extract odd elements, sign extend each to a 16 bit field */
64
- tmp1 = a & elementmask;
65
- tmp1 ^= nsignmask;
66
- tmp1 |= wsignmask;
67
- tmp1 = (tmp1 - nsignmask) ^ wsignmask;
68
- /* Ditto for the even elements */
69
- tmp2 = (a >> 8) & elementmask;
70
- tmp2 ^= nsignmask;
71
- tmp2 |= wsignmask;
72
- tmp2 = (tmp2 - nsignmask) ^ wsignmask;
73
-
74
- /* calculate the result by summing bits 0..14, 16..22, etc,
75
- * and then adjusting the sign bits 15, 23, etc manually.
76
- * This ensures the addition can't overflow the 16 bit field.
77
- */
78
- signres = (tmp1 ^ tmp2) & wsignmask;
79
- res = (tmp1 & ~wsignmask) + (tmp2 & ~wsignmask);
80
- res ^= signres;
81
-
82
- return res;
28
-}
83
-}
29
-
84
-
30
static void gen_eor3_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
85
uint64_t HELPER(neon_addlp_u8)(uint64_t a)
31
{
86
{
32
tcg_gen_xor_i64(d, n, m);
87
uint64_t tmp;
33
@@ -XXX,XX +XXX,XX @@ static void gen_eor3(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
88
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_addlp_u8)(uint64_t a)
34
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
89
return tmp;
35
}
90
}
36
91
37
-static bool trans_EOR3(DisasContext *s, arg_rrrr_esz *a)
92
-uint64_t HELPER(neon_addlp_s16)(uint64_t a)
38
-{
93
-{
39
- return do_sve2_zzzz_fn(s, a, gen_eor3);
94
- int32_t reslo, reshi;
95
-
96
- reslo = (int32_t)(int16_t)a + (int32_t)(int16_t)(a >> 16);
97
- reshi = (int32_t)(int16_t)(a >> 32) + (int32_t)(int16_t)(a >> 48);
98
-
99
- return (uint32_t)reslo | (((uint64_t)reshi) << 32);
40
-}
100
-}
41
+TRANS_FEAT(EOR3, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_eor3, a)
101
-
42
102
uint64_t HELPER(neon_addlp_u16)(uint64_t a)
43
static void gen_bcax_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
44
{
103
{
45
@@ -XXX,XX +XXX,XX @@ static void gen_bcax(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
104
uint64_t tmp;
46
tcg_gen_gvec_4(d, n, m, a, oprsz, maxsz, &op);
105
diff --git a/target/arm/tcg/neon_helper.c b/target/arm/tcg/neon_helper.c
106
index XXXXXXX..XXXXXXX 100644
107
--- a/target/arm/tcg/neon_helper.c
108
+++ b/target/arm/tcg/neon_helper.c
109
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_paddl_u32)(uint64_t a, uint64_t b)
110
return low + ((uint64_t)high << 32);
47
}
111
}
48
112
49
-static bool trans_BCAX(DisasContext *s, arg_rrrr_esz *a)
113
+/* Pairwise long add: add pairs of adjacent elements into
50
-{
114
+ * double-width elements in the result (eg _s8 is an 8x8->16 op)
51
- return do_sve2_zzzz_fn(s, a, gen_bcax);
115
+ */
52
-}
116
+uint64_t HELPER(neon_addlp_s8)(uint64_t a)
53
+TRANS_FEAT(BCAX, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_bcax, a)
117
+{
54
118
+ uint64_t nsignmask = 0x0080008000800080ULL;
55
static void gen_bsl(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
119
+ uint64_t wsignmask = 0x8000800080008000ULL;
56
uint32_t a, uint32_t oprsz, uint32_t maxsz)
120
+ uint64_t elementmask = 0x00ff00ff00ff00ffULL;
57
@@ -XXX,XX +XXX,XX @@ static void gen_bsl(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
121
+ uint64_t tmp1, tmp2;
58
tcg_gen_gvec_bitsel(vece, d, a, n, m, oprsz, maxsz);
122
+ uint64_t res, signres;
59
}
123
+
60
124
+ /* Extract odd elements, sign extend each to a 16 bit field */
61
-static bool trans_BSL(DisasContext *s, arg_rrrr_esz *a)
125
+ tmp1 = a & elementmask;
62
-{
126
+ tmp1 ^= nsignmask;
63
- return do_sve2_zzzz_fn(s, a, gen_bsl);
127
+ tmp1 |= wsignmask;
64
-}
128
+ tmp1 = (tmp1 - nsignmask) ^ wsignmask;
65
+TRANS_FEAT(BSL, aa64_sve2, gen_gvec_fn_arg_zzzz, gen_bsl, a)
129
+ /* Ditto for the even elements */
66
130
+ tmp2 = (a >> 8) & elementmask;
67
static void gen_bsl1n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
131
+ tmp2 ^= nsignmask;
132
+ tmp2 |= wsignmask;
133
+ tmp2 = (tmp2 - nsignmask) ^ wsignmask;
134
+
135
+ /* calculate the result by summing bits 0..14, 16..22, etc,
136
+ * and then adjusting the sign bits 15, 23, etc manually.
137
+ * This ensures the addition can't overflow the 16 bit field.
138
+ */
139
+ signres = (tmp1 ^ tmp2) & wsignmask;
140
+ res = (tmp1 & ~wsignmask) + (tmp2 & ~wsignmask);
141
+ res ^= signres;
142
+
143
+ return res;
144
+}
145
+
146
+uint64_t HELPER(neon_addlp_s16)(uint64_t a)
147
+{
148
+ int32_t reslo, reshi;
149
+
150
+ reslo = (int32_t)(int16_t)a + (int32_t)(int16_t)(a >> 16);
151
+ reshi = (int32_t)(int16_t)(a >> 32) + (int32_t)(int16_t)(a >> 48);
152
+
153
+ return (uint32_t)reslo | (((uint64_t)reshi) << 32);
154
+}
155
+
156
uint64_t HELPER(neon_subl_u16)(uint64_t a, uint64_t b)
68
{
157
{
69
@@ -XXX,XX +XXX,XX @@ static void gen_bsl1n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
158
uint64_t mask;
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
--
159
--
106
2.25.1
160
2.34.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
3
Pairwise addition with and without accumulation.
4
gen_gvec_ool_arg_zzz to TRANS_FEAT.
5
4
6
Remove trivial wrappers do_aese, do_sm4.
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20220527181907.189259-7-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-46-richard.henderson@linaro.org
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
12
---
9
---
13
target/arm/translate-sve.c | 165 ++++++++++---------------------------
10
target/arm/helper.h | 2 -
14
1 file changed, 45 insertions(+), 120 deletions(-)
11
target/arm/tcg/translate.h | 9 ++
12
target/arm/tcg/gengvec.c | 230 ++++++++++++++++++++++++++++++++
13
target/arm/tcg/neon_helper.c | 22 ---
14
target/arm/tcg/translate-neon.c | 150 +--------------------
15
5 files changed, 243 insertions(+), 170 deletions(-)
15
16
16
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
17
diff --git a/target/arm/helper.h b/target/arm/helper.h
17
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
18
--- a/target/arm/translate-sve.c
19
--- a/target/arm/helper.h
19
+++ b/target/arm/translate-sve.c
20
+++ b/target/arm/helper.h
20
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zzi(DisasContext *s, arg_rri_esz *a)
21
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_1(neon_widen_s16, i64, i32)
22
23
DEF_HELPER_2(neon_addl_u16, i64, i64, i64)
24
DEF_HELPER_2(neon_addl_u32, i64, i64, i64)
25
-DEF_HELPER_2(neon_paddl_u16, i64, i64, i64)
26
-DEF_HELPER_2(neon_paddl_u32, i64, i64, i64)
27
DEF_HELPER_FLAGS_1(neon_addlp_s8, TCG_CALL_NO_RWG_SE, i64, i64)
28
DEF_HELPER_FLAGS_1(neon_addlp_s16, TCG_CALL_NO_RWG_SE, i64, i64)
29
DEF_HELPER_2(neon_subl_u16, i64, i64, i64)
30
diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/tcg/translate.h
33
+++ b/target/arm/tcg/translate.h
34
@@ -XXX,XX +XXX,XX @@ void gen_gvec_rev32(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
35
void gen_gvec_rev64(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
36
uint32_t opr_sz, uint32_t max_sz);
37
38
+void gen_gvec_saddlp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
39
+ uint32_t opr_sz, uint32_t max_sz);
40
+void gen_gvec_sadalp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
41
+ uint32_t opr_sz, uint32_t max_sz);
42
+void gen_gvec_uaddlp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
43
+ uint32_t opr_sz, uint32_t max_sz);
44
+void gen_gvec_uadalp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
45
+ uint32_t opr_sz, uint32_t max_sz);
46
+
47
/*
48
* Forward to the isar_feature_* tests given a DisasContext pointer.
49
*/
50
diff --git a/target/arm/tcg/gengvec.c b/target/arm/tcg/gengvec.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/target/arm/tcg/gengvec.c
53
+++ b/target/arm/tcg/gengvec.c
54
@@ -XXX,XX +XXX,XX @@ void gen_gvec_rev64(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
55
g_assert_not_reached();
56
}
21
}
57
}
22
58
+
23
#define DO_ZZW(NAME, name) \
59
+static void gen_saddlp_vec(unsigned vece, TCGv_vec d, TCGv_vec n)
24
-static bool trans_##NAME##_zzw(DisasContext *s, arg_rrr_esz *a) \
60
+{
25
-{ \
61
+ int half = 4 << vece;
26
- static gen_helper_gvec_3 * const fns[4] = { \
62
+ TCGv_vec t = tcg_temp_new_vec_matching(d);
27
+ static gen_helper_gvec_3 * const name##_zzw_fns[4] = { \
63
+
28
gen_helper_sve_##name##_zzw_b, gen_helper_sve_##name##_zzw_h, \
64
+ tcg_gen_shli_vec(vece, t, n, half);
29
gen_helper_sve_##name##_zzw_s, NULL \
65
+ tcg_gen_sari_vec(vece, d, n, half);
30
}; \
66
+ tcg_gen_sari_vec(vece, t, t, half);
31
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0); \
67
+ tcg_gen_add_vec(vece, d, d, t);
32
-}
68
+}
33
+ TRANS_FEAT(NAME, aa64_sve, gen_gvec_ool_arg_zzz, \
69
+
34
+ name##_zzw_fns[a->esz], a, 0)
70
+static void gen_saddlp_s_i64(TCGv_i64 d, TCGv_i64 n)
35
71
+{
36
-DO_ZZW(ASR, asr)
72
+ TCGv_i64 t = tcg_temp_new_i64();
37
-DO_ZZW(LSR, lsr)
73
+
38
-DO_ZZW(LSL, lsl)
74
+ tcg_gen_ext32s_i64(t, n);
39
+DO_ZZW(ASR_zzw, asr)
75
+ tcg_gen_sari_i64(d, n, 32);
40
+DO_ZZW(LSR_zzw, lsr)
76
+ tcg_gen_add_i64(d, d, t);
41
+DO_ZZW(LSL_zzw, lsl)
77
+}
42
78
+
43
#undef DO_ZZW
79
+void gen_gvec_saddlp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
44
80
+ uint32_t opr_sz, uint32_t max_sz)
45
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2 * const fexpa_fns[4] = {
81
+{
46
TRANS_FEAT(FEXPA, aa64_sve, gen_gvec_ool_zz,
82
+ static const TCGOpcode vecop_list[] = {
47
fexpa_fns[a->esz], a->rd, a->rn, 0)
83
+ INDEX_op_sari_vec, INDEX_op_shli_vec, INDEX_op_add_vec, 0
48
84
+ };
49
-static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
85
+ static const GVecGen2 g[] = {
50
-{
86
+ { .fniv = gen_saddlp_vec,
51
- static gen_helper_gvec_3 * const fns[4] = {
87
+ .fni8 = gen_helper_neon_addlp_s8,
52
- NULL,
88
+ .opt_opc = vecop_list,
53
- gen_helper_sve_ftssel_h,
89
+ .vece = MO_16 },
54
- gen_helper_sve_ftssel_s,
90
+ { .fniv = gen_saddlp_vec,
55
- gen_helper_sve_ftssel_d,
91
+ .fni8 = gen_helper_neon_addlp_s16,
56
- };
92
+ .opt_opc = vecop_list,
57
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
93
+ .vece = MO_32 },
58
-}
94
+ { .fniv = gen_saddlp_vec,
59
+static gen_helper_gvec_3 * const ftssel_fns[4] = {
95
+ .fni8 = gen_saddlp_s_i64,
60
+ NULL, gen_helper_sve_ftssel_h,
96
+ .opt_opc = vecop_list,
61
+ gen_helper_sve_ftssel_s, gen_helper_sve_ftssel_d,
97
+ .vece = MO_64 },
62
+};
98
+ };
63
+TRANS_FEAT(FTSSEL, aa64_sve, gen_gvec_ool_arg_zzz, ftssel_fns[a->esz], a, 0)
99
+ assert(vece <= MO_32);
64
100
+ tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g[vece]);
65
/*
101
+}
66
*** SVE Predicate Logical Operations Group
102
+
67
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2 * const rev_fns[4] = {
103
+static void gen_sadalp_vec(unsigned vece, TCGv_vec d, TCGv_vec n)
68
};
104
+{
69
TRANS_FEAT(REV_v, aa64_sve, gen_gvec_ool_zz, rev_fns[a->esz], a->rd, a->rn, 0)
105
+ TCGv_vec t = tcg_temp_new_vec_matching(d);
70
106
+
71
-static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
107
+ gen_saddlp_vec(vece, t, n);
72
-{
108
+ tcg_gen_add_vec(vece, d, d, t);
73
- static gen_helper_gvec_3 * const fns[4] = {
109
+}
74
- gen_helper_sve_tbl_b, gen_helper_sve_tbl_h,
110
+
75
- gen_helper_sve_tbl_s, gen_helper_sve_tbl_d
111
+static void gen_sadalp_b_i64(TCGv_i64 d, TCGv_i64 n)
76
- };
112
+{
77
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
113
+ TCGv_i64 t = tcg_temp_new_i64();
78
-}
114
+
79
+static gen_helper_gvec_3 * const sve_tbl_fns[4] = {
115
+ gen_helper_neon_addlp_s8(t, n);
80
+ gen_helper_sve_tbl_b, gen_helper_sve_tbl_h,
116
+ tcg_gen_vec_add16_i64(d, d, t);
81
+ gen_helper_sve_tbl_s, gen_helper_sve_tbl_d
117
+}
82
+};
118
+
83
+TRANS_FEAT(TBL, aa64_sve, gen_gvec_ool_arg_zzz, sve_tbl_fns[a->esz], a, 0)
119
+static void gen_sadalp_h_i64(TCGv_i64 d, TCGv_i64 n)
84
120
+{
85
static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
121
+ TCGv_i64 t = tcg_temp_new_i64();
86
{
122
+
87
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
123
+ gen_helper_neon_addlp_s16(t, n);
124
+ tcg_gen_vec_add32_i64(d, d, t);
125
+}
126
+
127
+static void gen_sadalp_s_i64(TCGv_i64 d, TCGv_i64 n)
128
+{
129
+ TCGv_i64 t = tcg_temp_new_i64();
130
+
131
+ gen_saddlp_s_i64(t, n);
132
+ tcg_gen_add_i64(d, d, t);
133
+}
134
+
135
+void gen_gvec_sadalp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
136
+ uint32_t opr_sz, uint32_t max_sz)
137
+{
138
+ static const TCGOpcode vecop_list[] = {
139
+ INDEX_op_sari_vec, INDEX_op_shli_vec, INDEX_op_add_vec, 0
140
+ };
141
+ static const GVecGen2 g[] = {
142
+ { .fniv = gen_sadalp_vec,
143
+ .fni8 = gen_sadalp_b_i64,
144
+ .opt_opc = vecop_list,
145
+ .load_dest = true,
146
+ .vece = MO_16 },
147
+ { .fniv = gen_sadalp_vec,
148
+ .fni8 = gen_sadalp_h_i64,
149
+ .opt_opc = vecop_list,
150
+ .load_dest = true,
151
+ .vece = MO_32 },
152
+ { .fniv = gen_sadalp_vec,
153
+ .fni8 = gen_sadalp_s_i64,
154
+ .opt_opc = vecop_list,
155
+ .load_dest = true,
156
+ .vece = MO_64 },
157
+ };
158
+ assert(vece <= MO_32);
159
+ tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g[vece]);
160
+}
161
+
162
+static void gen_uaddlp_vec(unsigned vece, TCGv_vec d, TCGv_vec n)
163
+{
164
+ int half = 4 << vece;
165
+ TCGv_vec t = tcg_temp_new_vec_matching(d);
166
+ TCGv_vec m = tcg_constant_vec_matching(d, vece, MAKE_64BIT_MASK(0, half));
167
+
168
+ tcg_gen_shri_vec(vece, t, n, half);
169
+ tcg_gen_and_vec(vece, d, n, m);
170
+ tcg_gen_add_vec(vece, d, d, t);
171
+}
172
+
173
+static void gen_uaddlp_b_i64(TCGv_i64 d, TCGv_i64 n)
174
+{
175
+ TCGv_i64 t = tcg_temp_new_i64();
176
+ TCGv_i64 m = tcg_constant_i64(dup_const(MO_16, 0xff));
177
+
178
+ tcg_gen_shri_i64(t, n, 8);
179
+ tcg_gen_and_i64(d, n, m);
180
+ tcg_gen_and_i64(t, t, m);
181
+ /* No carry between widened unsigned elements. */
182
+ tcg_gen_add_i64(d, d, t);
183
+}
184
+
185
+static void gen_uaddlp_h_i64(TCGv_i64 d, TCGv_i64 n)
186
+{
187
+ TCGv_i64 t = tcg_temp_new_i64();
188
+ TCGv_i64 m = tcg_constant_i64(dup_const(MO_32, 0xffff));
189
+
190
+ tcg_gen_shri_i64(t, n, 16);
191
+ tcg_gen_and_i64(d, n, m);
192
+ tcg_gen_and_i64(t, t, m);
193
+ /* No carry between widened unsigned elements. */
194
+ tcg_gen_add_i64(d, d, t);
195
+}
196
+
197
+static void gen_uaddlp_s_i64(TCGv_i64 d, TCGv_i64 n)
198
+{
199
+ TCGv_i64 t = tcg_temp_new_i64();
200
+
201
+ tcg_gen_ext32u_i64(t, n);
202
+ tcg_gen_shri_i64(d, n, 32);
203
+ tcg_gen_add_i64(d, d, t);
204
+}
205
+
206
+void gen_gvec_uaddlp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
207
+ uint32_t opr_sz, uint32_t max_sz)
208
+{
209
+ static const TCGOpcode vecop_list[] = {
210
+ INDEX_op_shri_vec, INDEX_op_add_vec, 0
211
+ };
212
+ static const GVecGen2 g[] = {
213
+ { .fniv = gen_uaddlp_vec,
214
+ .fni8 = gen_uaddlp_b_i64,
215
+ .opt_opc = vecop_list,
216
+ .vece = MO_16 },
217
+ { .fniv = gen_uaddlp_vec,
218
+ .fni8 = gen_uaddlp_h_i64,
219
+ .opt_opc = vecop_list,
220
+ .vece = MO_32 },
221
+ { .fniv = gen_uaddlp_vec,
222
+ .fni8 = gen_uaddlp_s_i64,
223
+ .opt_opc = vecop_list,
224
+ .vece = MO_64 },
225
+ };
226
+ assert(vece <= MO_32);
227
+ tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g[vece]);
228
+}
229
+
230
+static void gen_uadalp_vec(unsigned vece, TCGv_vec d, TCGv_vec n)
231
+{
232
+ TCGv_vec t = tcg_temp_new_vec_matching(d);
233
+
234
+ gen_uaddlp_vec(vece, t, n);
235
+ tcg_gen_add_vec(vece, d, d, t);
236
+}
237
+
238
+static void gen_uadalp_b_i64(TCGv_i64 d, TCGv_i64 n)
239
+{
240
+ TCGv_i64 t = tcg_temp_new_i64();
241
+
242
+ gen_uaddlp_b_i64(t, n);
243
+ tcg_gen_vec_add16_i64(d, d, t);
244
+}
245
+
246
+static void gen_uadalp_h_i64(TCGv_i64 d, TCGv_i64 n)
247
+{
248
+ TCGv_i64 t = tcg_temp_new_i64();
249
+
250
+ gen_uaddlp_h_i64(t, n);
251
+ tcg_gen_vec_add32_i64(d, d, t);
252
+}
253
+
254
+static void gen_uadalp_s_i64(TCGv_i64 d, TCGv_i64 n)
255
+{
256
+ TCGv_i64 t = tcg_temp_new_i64();
257
+
258
+ gen_uaddlp_s_i64(t, n);
259
+ tcg_gen_add_i64(d, d, t);
260
+}
261
+
262
+void gen_gvec_uadalp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
263
+ uint32_t opr_sz, uint32_t max_sz)
264
+{
265
+ static const TCGOpcode vecop_list[] = {
266
+ INDEX_op_shri_vec, INDEX_op_add_vec, 0
267
+ };
268
+ static const GVecGen2 g[] = {
269
+ { .fniv = gen_uadalp_vec,
270
+ .fni8 = gen_uadalp_b_i64,
271
+ .load_dest = true,
272
+ .opt_opc = vecop_list,
273
+ .vece = MO_16 },
274
+ { .fniv = gen_uadalp_vec,
275
+ .fni8 = gen_uadalp_h_i64,
276
+ .load_dest = true,
277
+ .opt_opc = vecop_list,
278
+ .vece = MO_32 },
279
+ { .fniv = gen_uadalp_vec,
280
+ .fni8 = gen_uadalp_s_i64,
281
+ .load_dest = true,
282
+ .opt_opc = vecop_list,
283
+ .vece = MO_64 },
284
+ };
285
+ assert(vece <= MO_32);
286
+ tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g[vece]);
287
+}
288
diff --git a/target/arm/tcg/neon_helper.c b/target/arm/tcg/neon_helper.c
289
index XXXXXXX..XXXXXXX 100644
290
--- a/target/arm/tcg/neon_helper.c
291
+++ b/target/arm/tcg/neon_helper.c
292
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_addl_u32)(uint64_t a, uint64_t b)
293
return (a + b) ^ mask;
294
}
295
296
-uint64_t HELPER(neon_paddl_u16)(uint64_t a, uint64_t b)
297
-{
298
- uint64_t tmp;
299
- uint64_t tmp2;
300
-
301
- tmp = a & 0x0000ffff0000ffffull;
302
- tmp += (a >> 16) & 0x0000ffff0000ffffull;
303
- tmp2 = b & 0xffff0000ffff0000ull;
304
- tmp2 += (b << 16) & 0xffff0000ffff0000ull;
305
- return ( tmp & 0xffff)
306
- | ((tmp >> 16) & 0xffff0000ull)
307
- | ((tmp2 << 16) & 0xffff00000000ull)
308
- | ( tmp2 & 0xffff000000000000ull);
309
-}
310
-
311
-uint64_t HELPER(neon_paddl_u32)(uint64_t a, uint64_t b)
312
-{
313
- uint32_t low = a + (a >> 32);
314
- uint32_t high = b + (b >> 32);
315
- return low + ((uint64_t)high << 32);
316
-}
317
-
318
/* Pairwise long add: add pairs of adjacent elements into
319
* double-width elements in the result (eg _s8 is an 8x8->16 op)
320
*/
321
diff --git a/target/arm/tcg/translate-neon.c b/target/arm/tcg/translate-neon.c
322
index XXXXXXX..XXXXXXX 100644
323
--- a/target/arm/tcg/translate-neon.c
324
+++ b/target/arm/tcg/translate-neon.c
325
@@ -XXX,XX +XXX,XX @@ static bool trans_VDUP_scalar(DisasContext *s, arg_VDUP_scalar *a)
88
return true;
326
return true;
89
}
327
}
90
328
91
-static bool trans_TBX(DisasContext *s, arg_rrr_esz *a)
329
-static bool do_2misc_pairwise(DisasContext *s, arg_2misc *a,
92
-{
330
- NeonGenWidenFn *widenfn,
93
- static gen_helper_gvec_3 * const fns[4] = {
331
- NeonGenTwo64OpFn *opfn,
94
- gen_helper_sve2_tbx_b, gen_helper_sve2_tbx_h,
332
- NeonGenTwo64OpFn *accfn)
95
- gen_helper_sve2_tbx_s, gen_helper_sve2_tbx_d
333
-{
96
- };
334
- /*
97
-
335
- * Pairwise long operations: widen both halves of the pair,
98
- if (!dc_isar_feature(aa64_sve2, s)) {
336
- * combine the pairs with the opfn, and then possibly accumulate
337
- * into the destination with the accfn.
338
- */
339
- int pass;
340
-
341
- if (!arm_dc_feature(s, ARM_FEATURE_NEON)) {
99
- return false;
342
- return false;
100
- }
343
- }
101
- return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
344
-
102
-}
345
- /* UNDEF accesses to D16-D31 if they don't exist. */
103
+static gen_helper_gvec_3 * const tbx_fns[4] = {
346
- if (!dc_isar_feature(aa32_simd_r32, s) &&
104
+ gen_helper_sve2_tbx_b, gen_helper_sve2_tbx_h,
347
- ((a->vd | a->vm) & 0x10)) {
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;
348
- return false;
133
- }
349
- }
134
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_uzp_q, a, 0);
350
-
135
-}
351
- if ((a->vd | a->vm) & a->q) {
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;
352
- return false;
141
- }
353
- }
142
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_uzp_q, a, 16);
354
-
143
-}
355
- if (!widenfn) {
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;
356
- return false;
172
- }
357
- }
173
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_trn_q, a, 0);
358
-
174
-}
359
- if (!vfp_access_check(s)) {
175
-
360
- return true;
176
-static bool trans_TRN2_q(DisasContext *s, arg_rrr_esz *a)
361
- }
177
-{
362
-
178
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
363
- for (pass = 0; pass < a->q + 1; pass++) {
179
- return false;
364
- TCGv_i32 tmp;
180
- }
365
- TCGv_i64 rm0_64, rm1_64, rd_64;
181
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_trn_q, a, 16);
366
-
182
-}
367
- rm0_64 = tcg_temp_new_i64();
183
+TRANS_FEAT(TRN1_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
368
- rm1_64 = tcg_temp_new_i64();
184
+ gen_helper_sve2_trn_q, a, 0)
369
- rd_64 = tcg_temp_new_i64();
185
+TRANS_FEAT(TRN2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
370
-
186
+ gen_helper_sve2_trn_q, a, 16)
371
- tmp = tcg_temp_new_i32();
187
372
- read_neon_element32(tmp, a->vm, pass * 2, MO_32);
188
/*
373
- widenfn(rm0_64, tmp);
189
*** SVE Permute Vector - Predicated Group
374
- read_neon_element32(tmp, a->vm, pass * 2 + 1, MO_32);
190
@@ -XXX,XX +XXX,XX @@ static bool trans_USDOT_zzzz(DisasContext *s, arg_USDOT_zzzz *a)
375
- widenfn(rm1_64, tmp);
191
TRANS_FEAT(AESMC, aa64_sve2_aes, gen_gvec_ool_zz,
376
-
192
gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt)
377
- opfn(rd_64, rm0_64, rm1_64);
193
378
-
194
-static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
379
- if (accfn) {
195
-{
380
- TCGv_i64 tmp64 = tcg_temp_new_i64();
196
- if (!dc_isar_feature(aa64_sve2_aes, s)) {
381
- read_neon_element64(tmp64, a->vd, pass, MO_64);
197
- return false;
382
- accfn(rd_64, tmp64, rd_64);
198
- }
383
- }
199
- return gen_gvec_ool_arg_zzz(s, gen_helper_crypto_aese, a, decrypt);
384
- write_neon_element64(rd_64, a->vd, pass, MO_64);
200
-}
385
- }
201
+TRANS_FEAT(AESE, aa64_sve2_aes, gen_gvec_ool_arg_zzz,
386
- return true;
202
+ gen_helper_crypto_aese, a, false)
387
-}
203
+TRANS_FEAT(AESD, aa64_sve2_aes, gen_gvec_ool_arg_zzz,
388
-
204
+ gen_helper_crypto_aese, a, true)
389
-static bool trans_VPADDL_S(DisasContext *s, arg_2misc *a)
205
390
-{
206
-static bool trans_AESE(DisasContext *s, arg_rrr_esz *a)
391
- static NeonGenWidenFn * const widenfn[] = {
207
-{
392
- gen_helper_neon_widen_s8,
208
- return do_aese(s, a, false);
393
- gen_helper_neon_widen_s16,
209
-}
394
- tcg_gen_ext_i32_i64,
210
-
395
- NULL,
211
-static bool trans_AESD(DisasContext *s, arg_rrr_esz *a)
396
- };
212
-{
397
- static NeonGenTwo64OpFn * const opfn[] = {
213
- return do_aese(s, a, true);
398
- gen_helper_neon_paddl_u16,
214
-}
399
- gen_helper_neon_paddl_u32,
215
-
400
- tcg_gen_add_i64,
216
-static bool do_sm4(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
401
- NULL,
217
-{
402
- };
218
- if (!dc_isar_feature(aa64_sve2_sm4, s)) {
403
-
219
- return false;
404
- return do_2misc_pairwise(s, a, widenfn[a->size], opfn[a->size], NULL);
220
- }
405
-}
221
- return gen_gvec_ool_arg_zzz(s, fn, a, 0);
406
-
222
-}
407
-static bool trans_VPADDL_U(DisasContext *s, arg_2misc *a)
223
-
408
-{
224
-static bool trans_SM4E(DisasContext *s, arg_rrr_esz *a)
409
- static NeonGenWidenFn * const widenfn[] = {
225
-{
410
- gen_helper_neon_widen_u8,
226
- return do_sm4(s, a, gen_helper_crypto_sm4e);
411
- gen_helper_neon_widen_u16,
227
-}
412
- tcg_gen_extu_i32_i64,
228
-
413
- NULL,
229
-static bool trans_SM4EKEY(DisasContext *s, arg_rrr_esz *a)
414
- };
230
-{
415
- static NeonGenTwo64OpFn * const opfn[] = {
231
- return do_sm4(s, a, gen_helper_crypto_sm4ekey);
416
- gen_helper_neon_paddl_u16,
232
-}
417
- gen_helper_neon_paddl_u32,
233
+TRANS_FEAT(SM4E, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
418
- tcg_gen_add_i64,
234
+ gen_helper_crypto_sm4e, a, 0)
419
- NULL,
235
+TRANS_FEAT(SM4EKEY, aa64_sve2_sm4, gen_gvec_ool_arg_zzz,
420
- };
236
+ gen_helper_crypto_sm4ekey, a, 0)
421
-
237
422
- return do_2misc_pairwise(s, a, widenfn[a->size], opfn[a->size], NULL);
238
static bool trans_RAX1(DisasContext *s, arg_rrr_esz *a)
423
-}
424
-
425
-static bool trans_VPADAL_S(DisasContext *s, arg_2misc *a)
426
-{
427
- static NeonGenWidenFn * const widenfn[] = {
428
- gen_helper_neon_widen_s8,
429
- gen_helper_neon_widen_s16,
430
- tcg_gen_ext_i32_i64,
431
- NULL,
432
- };
433
- static NeonGenTwo64OpFn * const opfn[] = {
434
- gen_helper_neon_paddl_u16,
435
- gen_helper_neon_paddl_u32,
436
- tcg_gen_add_i64,
437
- NULL,
438
- };
439
- static NeonGenTwo64OpFn * const accfn[] = {
440
- gen_helper_neon_addl_u16,
441
- gen_helper_neon_addl_u32,
442
- tcg_gen_add_i64,
443
- NULL,
444
- };
445
-
446
- return do_2misc_pairwise(s, a, widenfn[a->size], opfn[a->size],
447
- accfn[a->size]);
448
-}
449
-
450
-static bool trans_VPADAL_U(DisasContext *s, arg_2misc *a)
451
-{
452
- static NeonGenWidenFn * const widenfn[] = {
453
- gen_helper_neon_widen_u8,
454
- gen_helper_neon_widen_u16,
455
- tcg_gen_extu_i32_i64,
456
- NULL,
457
- };
458
- static NeonGenTwo64OpFn * const opfn[] = {
459
- gen_helper_neon_paddl_u16,
460
- gen_helper_neon_paddl_u32,
461
- tcg_gen_add_i64,
462
- NULL,
463
- };
464
- static NeonGenTwo64OpFn * const accfn[] = {
465
- gen_helper_neon_addl_u16,
466
- gen_helper_neon_addl_u32,
467
- tcg_gen_add_i64,
468
- NULL,
469
- };
470
-
471
- return do_2misc_pairwise(s, a, widenfn[a->size], opfn[a->size],
472
- accfn[a->size]);
473
-}
474
-
475
typedef void ZipFn(TCGv_ptr, TCGv_ptr);
476
477
static bool do_zip_uzp(DisasContext *s, arg_2misc *a,
478
@@ -XXX,XX +XXX,XX @@ DO_2MISC_VEC(VCLT0, gen_gvec_clt0)
479
DO_2MISC_VEC(VCLS, gen_gvec_cls)
480
DO_2MISC_VEC(VCLZ, gen_gvec_clz)
481
DO_2MISC_VEC(VREV64, gen_gvec_rev64)
482
+DO_2MISC_VEC(VPADDL_S, gen_gvec_saddlp)
483
+DO_2MISC_VEC(VPADDL_U, gen_gvec_uaddlp)
484
+DO_2MISC_VEC(VPADAL_S, gen_gvec_sadalp)
485
+DO_2MISC_VEC(VPADAL_U, gen_gvec_uadalp)
486
487
static bool trans_VMVN(DisasContext *s, arg_2misc *a)
239
{
488
{
240
--
489
--
241
2.25.1
490
2.34.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
This includes SADDLP, UADDLP, SADALP, UADALP.
4
gen_gvec_ool_arg_zzzz to TRANS_FEAT.
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-13-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-47-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 | 47 ++++++++------------------------------
10
target/arm/tcg/helper-a64.h | 2 -
12
1 file changed, 10 insertions(+), 37 deletions(-)
11
target/arm/tcg/a64.decode | 5 ++
12
target/arm/tcg/helper-a64.c | 18 --------
13
target/arm/tcg/translate-a64.c | 84 +++-------------------------------
14
4 files changed, 11 insertions(+), 98 deletions(-)
13
15
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/tcg/helper-a64.h b/target/arm/tcg/helper-a64.h
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
18
--- a/target/arm/tcg/helper-a64.h
17
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/tcg/helper-a64.h
18
@@ -XXX,XX +XXX,XX @@ static bool trans_FMLSLT_zzxw(DisasContext *s, arg_rrxr_esz *a)
20
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(recpsf_f64, TCG_CALL_NO_RWG, f64, f64, f64, ptr)
19
return do_FMLAL_zzxw(s, a, true, true);
21
DEF_HELPER_FLAGS_3(rsqrtsf_f16, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
22
DEF_HELPER_FLAGS_3(rsqrtsf_f32, TCG_CALL_NO_RWG, f32, f32, f32, ptr)
23
DEF_HELPER_FLAGS_3(rsqrtsf_f64, TCG_CALL_NO_RWG, f64, f64, f64, ptr)
24
-DEF_HELPER_FLAGS_1(neon_addlp_u8, TCG_CALL_NO_RWG_SE, i64, i64)
25
-DEF_HELPER_FLAGS_1(neon_addlp_u16, TCG_CALL_NO_RWG_SE, i64, i64)
26
DEF_HELPER_FLAGS_2(frecpx_f64, TCG_CALL_NO_RWG, f64, f64, ptr)
27
DEF_HELPER_FLAGS_2(frecpx_f32, TCG_CALL_NO_RWG, f32, f32, ptr)
28
DEF_HELPER_FLAGS_2(frecpx_f16, TCG_CALL_NO_RWG, f16, f16, ptr)
29
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/tcg/a64.decode
32
+++ b/target/arm/tcg/a64.decode
33
@@ -XXX,XX +XXX,XX @@ CMLT0_v 0.00 1110 ..1 00000 10101 0 ..... ..... @qrr_e
34
REV16_v 0.00 1110 001 00000 00011 0 ..... ..... @qrr_b
35
REV32_v 0.10 1110 0.1 00000 00001 0 ..... ..... @qrr_bh
36
REV64_v 0.00 1110 ..1 00000 00001 0 ..... ..... @qrr_e
37
+
38
+SADDLP_v 0.00 1110 ..1 00000 00101 0 ..... ..... @qrr_e
39
+UADDLP_v 0.10 1110 ..1 00000 00101 0 ..... ..... @qrr_e
40
+SADALP_v 0.00 1110 ..1 00000 01101 0 ..... ..... @qrr_e
41
+UADALP_v 0.10 1110 ..1 00000 01101 0 ..... ..... @qrr_e
42
diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/arm/tcg/helper-a64.c
45
+++ b/target/arm/tcg/helper-a64.c
46
@@ -XXX,XX +XXX,XX @@ float64 HELPER(rsqrtsf_f64)(float64 a, float64 b, void *fpstp)
47
return float64_muladd(a, b, float64_three, float_muladd_halve_result, fpst);
20
}
48
}
21
49
22
-static bool do_i8mm_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
50
-uint64_t HELPER(neon_addlp_u8)(uint64_t a)
23
- gen_helper_gvec_4 *fn, int data)
24
-{
51
-{
25
- if (!dc_isar_feature(aa64_sve_i8mm, s)) {
52
- uint64_t tmp;
26
- return false;
53
-
27
- }
54
- tmp = a & 0x00ff00ff00ff00ffULL;
28
- return gen_gvec_ool_arg_zzzz(s, fn, a, data);
55
- tmp += (a >> 8) & 0x00ff00ff00ff00ffULL;
29
-}
56
- return tmp;
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
-}
57
-}
41
-
58
-
42
-static bool trans_USMMLA(DisasContext *s, arg_rrrr_esz *a)
59
-uint64_t HELPER(neon_addlp_u16)(uint64_t a)
43
-{
60
-{
44
- return do_i8mm_zzzz_ool(s, a, gen_helper_gvec_usmmla_b, 0);
61
- uint64_t tmp;
62
-
63
- tmp = a & 0x0000ffff0000ffffULL;
64
- tmp += (a >> 16) & 0x0000ffff0000ffffULL;
65
- return tmp;
45
-}
66
-}
46
-
67
-
47
-static bool trans_UMMLA(DisasContext *s, arg_rrrr_esz *a)
68
/* Floating-point reciprocal exponent - see FPRecpX in ARM ARM */
69
uint32_t HELPER(frecpx_f16)(uint32_t a, void *fpstp)
70
{
71
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
72
index XXXXXXX..XXXXXXX 100644
73
--- a/target/arm/tcg/translate-a64.c
74
+++ b/target/arm/tcg/translate-a64.c
75
@@ -XXX,XX +XXX,XX @@ static bool do_gvec_fn2_bhs(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
76
TRANS(CLS_v, do_gvec_fn2_bhs, a, gen_gvec_cls)
77
TRANS(CLZ_v, do_gvec_fn2_bhs, a, gen_gvec_clz)
78
TRANS(REV64_v, do_gvec_fn2_bhs, a, gen_gvec_rev64)
79
+TRANS(SADDLP_v, do_gvec_fn2_bhs, a, gen_gvec_saddlp)
80
+TRANS(UADDLP_v, do_gvec_fn2_bhs, a, gen_gvec_uaddlp)
81
+TRANS(SADALP_v, do_gvec_fn2_bhs, a, gen_gvec_sadalp)
82
+TRANS(UADALP_v, do_gvec_fn2_bhs, a, gen_gvec_uadalp)
83
84
/* Common vector code for handling integer to FP conversion */
85
static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
86
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q,
87
}
88
}
89
90
-static void handle_2misc_pairwise(DisasContext *s, int opcode, bool u,
91
- bool is_q, int size, int rn, int rd)
48
-{
92
-{
49
- return do_i8mm_zzzz_ool(s, a, gen_helper_gvec_ummla_b, 0);
93
- /* Implement the pairwise operations from 2-misc:
94
- * SADDLP, UADDLP, SADALP, UADALP.
95
- * These all add pairs of elements in the input to produce a
96
- * double-width result element in the output (possibly accumulating).
97
- */
98
- bool accum = (opcode == 0x6);
99
- int maxpass = is_q ? 2 : 1;
100
- int pass;
101
- TCGv_i64 tcg_res[2];
102
-
103
- if (size == 2) {
104
- /* 32 + 32 -> 64 op */
105
- MemOp memop = size + (u ? 0 : MO_SIGN);
106
-
107
- for (pass = 0; pass < maxpass; pass++) {
108
- TCGv_i64 tcg_op1 = tcg_temp_new_i64();
109
- TCGv_i64 tcg_op2 = tcg_temp_new_i64();
110
-
111
- tcg_res[pass] = tcg_temp_new_i64();
112
-
113
- read_vec_element(s, tcg_op1, rn, pass * 2, memop);
114
- read_vec_element(s, tcg_op2, rn, pass * 2 + 1, memop);
115
- tcg_gen_add_i64(tcg_res[pass], tcg_op1, tcg_op2);
116
- if (accum) {
117
- read_vec_element(s, tcg_op1, rd, pass, MO_64);
118
- tcg_gen_add_i64(tcg_res[pass], tcg_res[pass], tcg_op1);
119
- }
120
- }
121
- } else {
122
- for (pass = 0; pass < maxpass; pass++) {
123
- TCGv_i64 tcg_op = tcg_temp_new_i64();
124
- NeonGenOne64OpFn *genfn;
125
- static NeonGenOne64OpFn * const fns[2][2] = {
126
- { gen_helper_neon_addlp_s8, gen_helper_neon_addlp_u8 },
127
- { gen_helper_neon_addlp_s16, gen_helper_neon_addlp_u16 },
128
- };
129
-
130
- genfn = fns[size][u];
131
-
132
- tcg_res[pass] = tcg_temp_new_i64();
133
-
134
- read_vec_element(s, tcg_op, rn, pass, MO_64);
135
- genfn(tcg_res[pass], tcg_op);
136
-
137
- if (accum) {
138
- read_vec_element(s, tcg_op, rd, pass, MO_64);
139
- if (size == 0) {
140
- gen_helper_neon_addl_u16(tcg_res[pass],
141
- tcg_res[pass], tcg_op);
142
- } else {
143
- gen_helper_neon_addl_u32(tcg_res[pass],
144
- tcg_res[pass], tcg_op);
145
- }
146
- }
147
- }
148
- }
149
- if (!is_q) {
150
- tcg_res[1] = tcg_constant_i64(0);
151
- }
152
- for (pass = 0; pass < 2; pass++) {
153
- write_vec_element(s, tcg_res[pass], rd, pass, MO_64);
154
- }
50
-}
155
-}
51
-
156
-
52
-static bool trans_BFDOT_zzzz(DisasContext *s, arg_rrrr_esz *a)
157
static void handle_shll(DisasContext *s, bool is_q, int size, int rn, int rd)
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
{
158
{
64
@@ -XXX,XX +XXX,XX @@ static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
159
/* Implement SHLL and SHLL2 */
65
a->rd, a->rn, a->rm, a->ra, a->index);
160
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
66
}
161
67
162
handle_2misc_narrow(s, false, opcode, u, is_q, size, rn, rd);
68
-static bool trans_BFMMLA(DisasContext *s, arg_rrrr_esz *a)
163
return;
69
-{
164
- case 0x2: /* SADDLP, UADDLP */
70
- if (!dc_isar_feature(aa64_sve_bf16, s)) {
165
- case 0x6: /* SADALP, UADALP */
71
- return false;
166
- if (size == 3) {
72
- }
167
- unallocated_encoding(s);
73
- return gen_gvec_ool_arg_zzzz(s, gen_helper_gvec_bfmmla, a, 0);
168
- return;
74
-}
169
- }
75
+TRANS_FEAT(BFMMLA, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
170
- if (!fp_access_check(s)) {
76
+ gen_helper_gvec_bfmmla, a, 0)
171
- return;
77
172
- }
78
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
173
- handle_2misc_pairwise(s, opcode, u, is_q, size, rn, rd);
79
{
174
- return;
175
case 0x13: /* SHLL, SHLL2 */
176
if (u == 0 || size == 3) {
177
unallocated_encoding(s);
178
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
179
default:
180
case 0x0: /* REV64, REV32 */
181
case 0x1: /* REV16 */
182
+ case 0x2: /* SADDLP, UADDLP */
183
case 0x3: /* SUQADD, USQADD */
184
case 0x4: /* CLS, CLZ */
185
case 0x5: /* CNT, NOT, RBIT */
186
+ case 0x6: /* SADALP, UADALP */
187
case 0x7: /* SQABS, SQNEG */
188
case 0x8: /* CMGT, CMGE */
189
case 0x9: /* CMEQ, CMLE */
80
--
190
--
81
2.25.1
191
2.34.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
These have generic equivalents: tcg_gen_vec_{add,sub}{16,32}_i64.
4
to use TRANS_FEAT and gen_gvec_ool_arg_zzzz.
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-12-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-48-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 | 263 +++++++++++--------------------------
10
target/arm/helper.h | 4 ----
12
1 file changed, 79 insertions(+), 184 deletions(-)
11
target/arm/tcg/neon_helper.c | 36 ---------------------------------
12
target/arm/tcg/translate-neon.c | 22 ++++++++++----------
13
3 files changed, 11 insertions(+), 51 deletions(-)
13
14
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/helper.h b/target/arm/helper.h
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
--- a/target/arm/helper.h
17
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/helper.h
18
@@ -XXX,XX +XXX,XX @@ static bool trans_SQCADD_rot270(DisasContext *s, arg_rrr_esz *a)
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_1(neon_widen_s8, i64, i32)
19
return do_cadd(s, a, true, true);
20
DEF_HELPER_1(neon_widen_u16, i64, i32)
21
DEF_HELPER_1(neon_widen_s16, i64, i32)
22
23
-DEF_HELPER_2(neon_addl_u16, i64, i64, i64)
24
-DEF_HELPER_2(neon_addl_u32, i64, i64, i64)
25
DEF_HELPER_FLAGS_1(neon_addlp_s8, TCG_CALL_NO_RWG_SE, i64, i64)
26
DEF_HELPER_FLAGS_1(neon_addlp_s16, TCG_CALL_NO_RWG_SE, i64, i64)
27
-DEF_HELPER_2(neon_subl_u16, i64, i64, i64)
28
-DEF_HELPER_2(neon_subl_u32, i64, i64, i64)
29
DEF_HELPER_3(neon_addl_saturate_s32, i64, env, i64, i64)
30
DEF_HELPER_3(neon_addl_saturate_s64, i64, env, i64, i64)
31
DEF_HELPER_2(neon_abdl_u16, i64, i32, i32)
32
diff --git a/target/arm/tcg/neon_helper.c b/target/arm/tcg/neon_helper.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/arm/tcg/neon_helper.c
35
+++ b/target/arm/tcg/neon_helper.c
36
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_widen_s16)(uint32_t x)
37
return ((uint32_t)(int16_t)x) | (high << 32);
20
}
38
}
21
39
22
-static bool do_sve2_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
40
-uint64_t HELPER(neon_addl_u16)(uint64_t a, uint64_t b)
23
- gen_helper_gvec_4 *fn, int data)
24
-{
41
-{
25
- if (!dc_isar_feature(aa64_sve2, s)) {
42
- uint64_t mask;
26
- return false;
43
- mask = (a ^ b) & 0x8000800080008000ull;
27
- }
44
- a &= ~0x8000800080008000ull;
28
- return gen_gvec_ool_arg_zzzz(s, fn, a, data);
45
- b &= ~0x8000800080008000ull;
29
-}
46
- return (a + b) ^ mask;
30
+static gen_helper_gvec_4 * const sabal_fns[4] = {
31
+ NULL, gen_helper_sve2_sabal_h,
32
+ gen_helper_sve2_sabal_s, gen_helper_sve2_sabal_d,
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
-}
47
-
48
-
48
-static bool trans_SABALB(DisasContext *s, arg_rrrr_esz *a)
49
-uint64_t HELPER(neon_addl_u32)(uint64_t a, uint64_t b)
49
-{
50
-{
50
- return do_abal(s, a, false, false);
51
- uint64_t mask;
52
- mask = (a ^ b) & 0x8000000080000000ull;
53
- a &= ~0x8000000080000000ull;
54
- b &= ~0x8000000080000000ull;
55
- return (a + b) ^ mask;
51
-}
56
-}
52
-
57
-
53
-static bool trans_SABALT(DisasContext *s, arg_rrrr_esz *a)
58
/* Pairwise long add: add pairs of adjacent elements into
59
* double-width elements in the result (eg _s8 is an 8x8->16 op)
60
*/
61
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(neon_addlp_s16)(uint64_t a)
62
return (uint32_t)reslo | (((uint64_t)reshi) << 32);
63
}
64
65
-uint64_t HELPER(neon_subl_u16)(uint64_t a, uint64_t b)
54
-{
66
-{
55
- return do_abal(s, a, false, true);
67
- uint64_t mask;
68
- mask = (a ^ ~b) & 0x8000800080008000ull;
69
- a |= 0x8000800080008000ull;
70
- b &= ~0x8000800080008000ull;
71
- return (a - b) ^ mask;
56
-}
72
-}
57
-
73
-
58
-static bool trans_UABALB(DisasContext *s, arg_rrrr_esz *a)
74
-uint64_t HELPER(neon_subl_u32)(uint64_t a, uint64_t b)
59
-{
75
-{
60
- return do_abal(s, a, true, false);
76
- uint64_t mask;
77
- mask = (a ^ ~b) & 0x8000000080000000ull;
78
- a |= 0x8000000080000000ull;
79
- b &= ~0x8000000080000000ull;
80
- return (a - b) ^ mask;
61
-}
81
-}
62
-
82
-
63
-static bool trans_UABALT(DisasContext *s, arg_rrrr_esz *a)
83
uint64_t HELPER(neon_addl_saturate_s32)(CPUARMState *env, uint64_t a, uint64_t b)
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
{
84
{
76
@@ -XXX,XX +XXX,XX @@ static bool do_adcl(DisasContext *s, arg_rrrr_esz *a, bool sel)
85
uint32_t x, y;
77
* Note that in this case the ESZ field encodes both size and sign.
86
diff --git a/target/arm/tcg/translate-neon.c b/target/arm/tcg/translate-neon.c
78
* Split out 'subtract' into bit 1 of the data field for the helper.
87
index XXXXXXX..XXXXXXX 100644
79
*/
88
--- a/target/arm/tcg/translate-neon.c
80
- return do_sve2_zzzz_ool(s, a, fns[a->esz & 1], (a->esz & 2) | sel);
89
+++ b/target/arm/tcg/translate-neon.c
81
+ return gen_gvec_ool_arg_zzzz(s, fns[a->esz & 1], a, (a->esz & 2) | sel);
90
@@ -XXX,XX +XXX,XX @@ static bool do_prewiden_3d(DisasContext *s, arg_3diff *a,
82
}
91
NULL, NULL, \
83
92
}; \
84
-static bool trans_ADCLB(DisasContext *s, arg_rrrr_esz *a)
93
static NeonGenTwo64OpFn * const addfn[] = { \
85
-{
94
- gen_helper_neon_##OP##l_u16, \
86
- return do_adcl(s, a, false);
95
- gen_helper_neon_##OP##l_u32, \
87
-}
96
+ tcg_gen_vec_##OP##16_i64, \
88
-
97
+ tcg_gen_vec_##OP##32_i64, \
89
-static bool trans_ADCLT(DisasContext *s, arg_rrrr_esz *a)
98
tcg_gen_##OP##_i64, \
90
-{
99
NULL, \
91
- return do_adcl(s, a, true);
100
}; \
92
-}
101
@@ -XXX,XX +XXX,XX @@ static bool do_narrow_3d(DisasContext *s, arg_3diff *a,
93
+TRANS_FEAT(ADCLB, aa64_sve2, do_adcl, a, false)
102
static bool trans_##INSN##_3d(DisasContext *s, arg_3diff *a) \
94
+TRANS_FEAT(ADCLT, aa64_sve2, do_adcl, a, true)
103
{ \
95
104
static NeonGenTwo64OpFn * const addfn[] = { \
96
static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
105
- gen_helper_neon_##OP##l_u16, \
97
{
106
- gen_helper_neon_##OP##l_u32, \
98
@@ -XXX,XX +XXX,XX @@ static bool trans_FMMLA(DisasContext *s, arg_rrrr_esz *a)
107
+ tcg_gen_vec_##OP##16_i64, \
99
return true;
108
+ tcg_gen_vec_##OP##32_i64, \
100
}
109
tcg_gen_##OP##_i64, \
101
110
NULL, \
102
-static bool do_sqdmlal_zzzw(DisasContext *s, arg_rrrr_esz *a,
111
}; \
103
- bool sel1, bool sel2)
112
@@ -XXX,XX +XXX,XX @@ static bool trans_VABAL_S_3d(DisasContext *s, arg_3diff *a)
104
-{
113
NULL,
105
- static gen_helper_gvec_4 * const fns[] = {
114
};
106
- NULL, gen_helper_sve2_sqdmlal_zzzw_h,
115
static NeonGenTwo64OpFn * const addfn[] = {
107
- gen_helper_sve2_sqdmlal_zzzw_s, gen_helper_sve2_sqdmlal_zzzw_d,
116
- gen_helper_neon_addl_u16,
108
- };
117
- gen_helper_neon_addl_u32,
109
- return do_sve2_zzzz_ool(s, a, fns[a->esz], (sel2 << 1) | sel1);
118
+ tcg_gen_vec_add16_i64,
110
-}
119
+ tcg_gen_vec_add32_i64,
111
+static gen_helper_gvec_4 * const sqdmlal_zzzw_fns[] = {
120
tcg_gen_add_i64,
112
+ NULL, gen_helper_sve2_sqdmlal_zzzw_h,
121
NULL,
113
+ gen_helper_sve2_sqdmlal_zzzw_s, gen_helper_sve2_sqdmlal_zzzw_d,
122
};
114
+};
123
@@ -XXX,XX +XXX,XX @@ static bool trans_VABAL_U_3d(DisasContext *s, arg_3diff *a)
115
+TRANS_FEAT(SQDMLALB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
124
NULL,
116
+ sqdmlal_zzzw_fns[a->esz], a, 0)
125
};
117
+TRANS_FEAT(SQDMLALT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
126
static NeonGenTwo64OpFn * const addfn[] = {
118
+ sqdmlal_zzzw_fns[a->esz], a, 3)
127
- gen_helper_neon_addl_u16,
119
+TRANS_FEAT(SQDMLALBT, aa64_sve2, gen_gvec_ool_arg_zzzz,
128
- gen_helper_neon_addl_u32,
120
+ sqdmlal_zzzw_fns[a->esz], a, 2)
129
+ tcg_gen_vec_add16_i64,
121
130
+ tcg_gen_vec_add32_i64,
122
-static bool do_sqdmlsl_zzzw(DisasContext *s, arg_rrrr_esz *a,
131
tcg_gen_add_i64,
123
- bool sel1, bool sel2)
132
NULL,
124
-{
133
};
125
- static gen_helper_gvec_4 * const fns[] = {
134
@@ -XXX,XX +XXX,XX @@ static bool trans_VMULL_U_3d(DisasContext *s, arg_3diff *a)
126
- NULL, gen_helper_sve2_sqdmlsl_zzzw_h,
135
NULL, \
127
- gen_helper_sve2_sqdmlsl_zzzw_s, gen_helper_sve2_sqdmlsl_zzzw_d,
136
}; \
128
- };
137
static NeonGenTwo64OpFn * const accfn[] = { \
129
- return do_sve2_zzzz_ool(s, a, fns[a->esz], (sel2 << 1) | sel1);
138
- gen_helper_neon_##ACC##l_u16, \
130
-}
139
- gen_helper_neon_##ACC##l_u32, \
131
+static gen_helper_gvec_4 * const sqdmlsl_zzzw_fns[] = {
140
+ tcg_gen_vec_##ACC##16_i64, \
132
+ NULL, gen_helper_sve2_sqdmlsl_zzzw_h,
141
+ tcg_gen_vec_##ACC##32_i64, \
133
+ gen_helper_sve2_sqdmlsl_zzzw_s, gen_helper_sve2_sqdmlsl_zzzw_d,
142
tcg_gen_##ACC##_i64, \
134
+};
143
NULL, \
135
+TRANS_FEAT(SQDMLSLB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
144
}; \
136
+ sqdmlsl_zzzw_fns[a->esz], a, 0)
145
@@ -XXX,XX +XXX,XX @@ static bool trans_VMULL_U_2sc(DisasContext *s, arg_2scalar *a)
137
+TRANS_FEAT(SQDMLSLT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
146
}; \
138
+ sqdmlsl_zzzw_fns[a->esz], a, 3)
147
static NeonGenTwo64OpFn * const accfn[] = { \
139
+TRANS_FEAT(SQDMLSLBT, aa64_sve2, gen_gvec_ool_arg_zzzz,
148
NULL, \
140
+ sqdmlsl_zzzw_fns[a->esz], a, 2)
149
- gen_helper_neon_##ACC##l_u32, \
141
150
+ tcg_gen_vec_##ACC##32_i64, \
142
-static bool trans_SQDMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
151
tcg_gen_##ACC##_i64, \
143
-{
152
NULL, \
144
- return do_sqdmlal_zzzw(s, a, false, false);
153
}; \
145
-}
146
+static gen_helper_gvec_4 * const sqrdmlah_fns[] = {
147
+ gen_helper_sve2_sqrdmlah_b, gen_helper_sve2_sqrdmlah_h,
148
+ gen_helper_sve2_sqrdmlah_s, gen_helper_sve2_sqrdmlah_d,
149
+};
150
+TRANS_FEAT(SQRDMLAH_zzzz, aa64_sve2, gen_gvec_ool_arg_zzzz,
151
+ sqrdmlah_fns[a->esz], a, 0)
152
153
-static bool trans_SQDMLALT_zzzw(DisasContext *s, arg_rrrr_esz *a)
154
-{
155
- return do_sqdmlal_zzzw(s, a, true, true);
156
-}
157
+static gen_helper_gvec_4 * const sqrdmlsh_fns[] = {
158
+ gen_helper_sve2_sqrdmlsh_b, gen_helper_sve2_sqrdmlsh_h,
159
+ gen_helper_sve2_sqrdmlsh_s, gen_helper_sve2_sqrdmlsh_d,
160
+};
161
+TRANS_FEAT(SQRDMLSH_zzzz, aa64_sve2, gen_gvec_ool_arg_zzzz,
162
+ sqrdmlsh_fns[a->esz], a, 0)
163
164
-static bool trans_SQDMLALBT(DisasContext *s, arg_rrrr_esz *a)
165
-{
166
- return do_sqdmlal_zzzw(s, a, false, true);
167
-}
168
+static gen_helper_gvec_4 * const smlal_zzzw_fns[] = {
169
+ NULL, gen_helper_sve2_smlal_zzzw_h,
170
+ gen_helper_sve2_smlal_zzzw_s, gen_helper_sve2_smlal_zzzw_d,
171
+};
172
+TRANS_FEAT(SMLALB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
173
+ smlal_zzzw_fns[a->esz], a, 0)
174
+TRANS_FEAT(SMLALT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
175
+ smlal_zzzw_fns[a->esz], a, 1)
176
177
-static bool trans_SQDMLSLB_zzzw(DisasContext *s, arg_rrrr_esz *a)
178
-{
179
- return do_sqdmlsl_zzzw(s, a, false, false);
180
-}
181
+static gen_helper_gvec_4 * const umlal_zzzw_fns[] = {
182
+ NULL, gen_helper_sve2_umlal_zzzw_h,
183
+ gen_helper_sve2_umlal_zzzw_s, gen_helper_sve2_umlal_zzzw_d,
184
+};
185
+TRANS_FEAT(UMLALB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
186
+ umlal_zzzw_fns[a->esz], a, 0)
187
+TRANS_FEAT(UMLALT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
188
+ umlal_zzzw_fns[a->esz], a, 1)
189
190
-static bool trans_SQDMLSLT_zzzw(DisasContext *s, arg_rrrr_esz *a)
191
-{
192
- return do_sqdmlsl_zzzw(s, a, true, true);
193
-}
194
+static gen_helper_gvec_4 * const smlsl_zzzw_fns[] = {
195
+ NULL, gen_helper_sve2_smlsl_zzzw_h,
196
+ gen_helper_sve2_smlsl_zzzw_s, gen_helper_sve2_smlsl_zzzw_d,
197
+};
198
+TRANS_FEAT(SMLSLB_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
199
+ smlsl_zzzw_fns[a->esz], a, 0)
200
+TRANS_FEAT(SMLSLT_zzzw, aa64_sve2, gen_gvec_ool_arg_zzzz,
201
+ smlsl_zzzw_fns[a->esz], a, 1)
202
203
-static bool trans_SQDMLSLBT(DisasContext *s, arg_rrrr_esz *a)
204
-{
205
- return do_sqdmlsl_zzzw(s, a, false, true);
206
-}
207
-
208
-static bool trans_SQRDMLAH_zzzz(DisasContext *s, arg_rrrr_esz *a)
209
-{
210
- static gen_helper_gvec_4 * const fns[] = {
211
- gen_helper_sve2_sqrdmlah_b, gen_helper_sve2_sqrdmlah_h,
212
- gen_helper_sve2_sqrdmlah_s, gen_helper_sve2_sqrdmlah_d,
213
- };
214
- return do_sve2_zzzz_ool(s, a, fns[a->esz], 0);
215
-}
216
-
217
-static bool trans_SQRDMLSH_zzzz(DisasContext *s, arg_rrrr_esz *a)
218
-{
219
- static gen_helper_gvec_4 * const fns[] = {
220
- gen_helper_sve2_sqrdmlsh_b, gen_helper_sve2_sqrdmlsh_h,
221
- gen_helper_sve2_sqrdmlsh_s, gen_helper_sve2_sqrdmlsh_d,
222
- };
223
- return do_sve2_zzzz_ool(s, a, fns[a->esz], 0);
224
-}
225
-
226
-static bool do_smlal_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
227
-{
228
- static gen_helper_gvec_4 * const fns[] = {
229
- NULL, gen_helper_sve2_smlal_zzzw_h,
230
- gen_helper_sve2_smlal_zzzw_s, gen_helper_sve2_smlal_zzzw_d,
231
- };
232
- return do_sve2_zzzz_ool(s, a, fns[a->esz], sel);
233
-}
234
-
235
-static bool trans_SMLALB_zzzw(DisasContext *s, arg_rrrr_esz *a)
236
-{
237
- return do_smlal_zzzw(s, a, false);
238
-}
239
-
240
-static bool trans_SMLALT_zzzw(DisasContext *s, arg_rrrr_esz *a)
241
-{
242
- return do_smlal_zzzw(s, a, true);
243
-}
244
-
245
-static bool do_umlal_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
246
-{
247
- static gen_helper_gvec_4 * const fns[] = {
248
- NULL, gen_helper_sve2_umlal_zzzw_h,
249
- gen_helper_sve2_umlal_zzzw_s, gen_helper_sve2_umlal_zzzw_d,
250
- };
251
- return do_sve2_zzzz_ool(s, a, fns[a->esz], sel);
252
-}
253
-
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
--
154
--
313
2.25.1
155
2.34.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
In a couple of places, clearing the entire vector before storing one
4
eliminate the special case code during translation.
4
element is the easiest solution. Wrap that into a helper function.
5
5
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@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: 20241211163036.2297116-49-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/tcg/translate-a64.c | 21 ++++++++++++---------
12
target/arm/translate-sve.c | 12 ++++++------
12
1 file changed, 12 insertions(+), 9 deletions(-)
13
2 files changed, 10 insertions(+), 8 deletions(-)
14
13
15
diff --git a/target/arm/sve_helper.c b/target/arm/sve_helper.c
14
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/sve_helper.c
16
--- a/target/arm/tcg/translate-a64.c
18
+++ b/target/arm/sve_helper.c
17
+++ b/target/arm/tcg/translate-a64.c
19
@@ -XXX,XX +XXX,XX @@ void HELPER(sve_punpk_p)(void *vd, void *vn, uint32_t pred_desc)
18
@@ -XXX,XX +XXX,XX @@ static TCGv_i32 read_fp_hreg(DisasContext *s, int reg)
20
void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc) \
19
return v;
21
{ \
20
}
22
intptr_t oprsz = simd_oprsz(desc); \
21
23
+ intptr_t odd_ofs = simd_data(desc); \
22
-/* Clear the bits above an N-bit vector, for N = (is_q ? 128 : 64).
24
intptr_t i, oprsz_2 = oprsz / 2; \
23
+static void clear_vec(DisasContext *s, int rd)
25
ARMVectorReg tmp_n, tmp_m; \
24
+{
26
/* We produce output faster than we consume input. \
25
+ unsigned ofs = fp_reg_offset(s, rd, MO_64);
27
@@ -XXX,XX +XXX,XX @@ void HELPER(NAME)(void *vd, void *vn, void *vm, uint32_t desc) \
26
+ unsigned vsz = vec_full_reg_size(s);
28
vm = memcpy(&tmp_m, vm, oprsz_2); \
27
+
29
} \
28
+ tcg_gen_gvec_dup_imm(MO_64, ofs, vsz, vsz, 0);
30
for (i = 0; i < oprsz_2; i += sizeof(TYPE)) { \
29
+}
31
- *(TYPE *)(vd + H(2 * i + 0)) = *(TYPE *)(vn + H(i)); \
30
+
32
- *(TYPE *)(vd + H(2 * i + sizeof(TYPE))) = *(TYPE *)(vm + H(i)); \
31
+/*
33
+ *(TYPE *)(vd + H(2 * i + 0)) = *(TYPE *)(vn + odd_ofs + H(i)); \
32
+ * Clear the bits above an N-bit vector, for N = (is_q ? 128 : 64).
34
+ *(TYPE *)(vd + H(2 * i + sizeof(TYPE))) = \
33
* If SVE is not enabled, then there are only 128 bits in the vector.
35
+ *(TYPE *)(vm + odd_ofs + H(i)); \
34
*/
36
} \
35
static void clear_vec_high(DisasContext *s, bool is_q, int rd)
37
if (sizeof(TYPE) == 16 && unlikely(oprsz & 16)) { \
36
@@ -XXX,XX +XXX,XX @@ static bool trans_SM3SS1(DisasContext *s, arg_SM3SS1 *a)
38
memset(vd + oprsz - 16, 0, 16); \
37
TCGv_i32 tcg_op2 = tcg_temp_new_i32();
39
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
38
TCGv_i32 tcg_op3 = tcg_temp_new_i32();
40
index XXXXXXX..XXXXXXX 100644
39
TCGv_i32 tcg_res = tcg_temp_new_i32();
41
--- a/target/arm/translate-sve.c
40
- unsigned vsz, dofs;
42
+++ b/target/arm/translate-sve.c
41
43
@@ -XXX,XX +XXX,XX @@ static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
42
read_vec_element_i32(s, tcg_op1, a->rn, 3, MO_32);
44
unsigned vsz = vec_full_reg_size(s);
43
read_vec_element_i32(s, tcg_op2, a->rm, 3, MO_32);
45
unsigned high_ofs = high ? vsz / 2 : 0;
44
@@ -XXX,XX +XXX,XX @@ static bool trans_SM3SS1(DisasContext *s, arg_SM3SS1 *a)
46
tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
45
tcg_gen_rotri_i32(tcg_res, tcg_res, 25);
47
- vec_full_reg_offset(s, a->rn) + high_ofs,
46
48
- vec_full_reg_offset(s, a->rm) + high_ofs,
47
/* Clear the whole register first, then store bits [127:96]. */
49
- vsz, vsz, 0, fns[a->esz]);
48
- vsz = vec_full_reg_size(s);
50
+ vec_full_reg_offset(s, a->rn),
49
- dofs = vec_full_reg_offset(s, a->rd);
51
+ vec_full_reg_offset(s, a->rm),
50
- tcg_gen_gvec_dup_imm(MO_64, dofs, vsz, vsz, 0);
52
+ vsz, vsz, high_ofs, fns[a->esz]);
51
+ clear_vec(s, a->rd);
52
write_vec_element_i32(s, tcg_res, a->rd, 3, MO_32);
53
}
53
}
54
return true;
54
return true;
55
}
55
@@ -XXX,XX +XXX,XX @@ static bool do_scalar_muladd_widening_idx(DisasContext *s, arg_rrx_e *a,
56
@@ -XXX,XX +XXX,XX @@ static bool do_zip_q(DisasContext *s, arg_rrr_esz *a, bool high)
56
TCGv_i64 t0 = tcg_temp_new_i64();
57
unsigned vsz = vec_full_reg_size(s);
57
TCGv_i64 t1 = tcg_temp_new_i64();
58
unsigned high_ofs = high ? QEMU_ALIGN_DOWN(vsz, 32) / 2 : 0;
58
TCGv_i64 t2 = tcg_temp_new_i64();
59
tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
59
- unsigned vsz, dofs;
60
- vec_full_reg_offset(s, a->rn) + high_ofs,
60
61
- vec_full_reg_offset(s, a->rm) + high_ofs,
61
if (acc) {
62
- vsz, vsz, 0, gen_helper_sve2_zip_q);
62
read_vec_element(s, t0, a->rd, 0, a->esz + 1);
63
+ vec_full_reg_offset(s, a->rn),
63
@@ -XXX,XX +XXX,XX @@ static bool do_scalar_muladd_widening_idx(DisasContext *s, arg_rrx_e *a,
64
+ vec_full_reg_offset(s, a->rm),
64
fn(t0, t1, t2);
65
+ vsz, vsz, high_ofs, gen_helper_sve2_zip_q);
65
66
/* Clear the whole register first, then store scalar. */
67
- vsz = vec_full_reg_size(s);
68
- dofs = vec_full_reg_offset(s, a->rd);
69
- tcg_gen_gvec_dup_imm(MO_64, dofs, vsz, vsz, 0);
70
+ clear_vec(s, a->rd);
71
write_vec_element(s, t0, a->rd, 0, a->esz + 1);
66
}
72
}
67
return true;
73
return true;
68
}
69
--
74
--
70
2.25.1
75
2.34.1
76
77
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: 20241211163036.2297116-50-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/tcg/a64.decode | 9 ++
13
1 file changed, 30 insertions(+), 20 deletions(-)
9
target/arm/tcg/translate-a64.c | 153 ++++++++++++++++++++-------------
10
2 files changed, 102 insertions(+), 60 deletions(-)
14
11
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
16
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
18
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
16
@@ -XXX,XX +XXX,XX @@ CMEQ0_s 0101 1110 111 00000 10011 0 ..... ..... @rr
20
return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
17
CMLE0_s 0111 1110 111 00000 10011 0 ..... ..... @rr
21
}
18
CMLT0_s 0101 1110 111 00000 10101 0 ..... ..... @rr
22
19
23
+/* Invoke an out-of-line helper on 3 Zregs, plus float_status. */
20
+SQXTUN_s 0111 1110 ..1 00001 00101 0 ..... ..... @rr_e
24
+static bool gen_gvec_fpst_zzz(DisasContext *s, gen_helper_gvec_3_ptr *fn,
21
+SQXTN_s 0101 1110 ..1 00001 01001 0 ..... ..... @rr_e
25
+ int rd, int rn, int rm,
22
+UQXTN_s 0111 1110 ..1 00001 01001 0 ..... ..... @rr_e
26
+ int data, ARMFPStatusFlavour flavour)
23
+
24
# Advanced SIMD two-register miscellaneous
25
26
SQABS_v 0.00 1110 ..1 00000 01111 0 ..... ..... @qrr_e
27
@@ -XXX,XX +XXX,XX @@ SADDLP_v 0.00 1110 ..1 00000 00101 0 ..... ..... @qrr_e
28
UADDLP_v 0.10 1110 ..1 00000 00101 0 ..... ..... @qrr_e
29
SADALP_v 0.00 1110 ..1 00000 01101 0 ..... ..... @qrr_e
30
UADALP_v 0.10 1110 ..1 00000 01101 0 ..... ..... @qrr_e
31
+
32
+XTN 0.00 1110 ..1 00001 00101 0 ..... ..... @qrr_e
33
+SQXTUN_v 0.10 1110 ..1 00001 00101 0 ..... ..... @qrr_e
34
+SQXTN_v 0.00 1110 ..1 00001 01001 0 ..... ..... @qrr_e
35
+UQXTN_v 0.10 1110 ..1 00001 01001 0 ..... ..... @qrr_e
36
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
37
index XXXXXXX..XXXXXXX 100644
38
--- a/target/arm/tcg/translate-a64.c
39
+++ b/target/arm/tcg/translate-a64.c
40
@@ -XXX,XX +XXX,XX @@ TRANS(CMLE0_s, do_cmop0_d, a, TCG_COND_LE)
41
TRANS(CMLT0_s, do_cmop0_d, a, TCG_COND_LT)
42
TRANS(CMEQ0_s, do_cmop0_d, a, TCG_COND_EQ)
43
44
+static bool do_2misc_narrow_scalar(DisasContext *s, arg_rr_e *a,
45
+ ArithOneOp * const fn[3])
27
+{
46
+{
28
+ if (fn == NULL) {
47
+ if (a->esz == MO_64) {
29
+ return false;
48
+ return false;
30
+ }
49
+ }
31
+ if (sve_access_check(s)) {
50
+ if (fp_access_check(s)) {
32
+ unsigned vsz = vec_full_reg_size(s);
51
+ TCGv_i64 t = tcg_temp_new_i64();
33
+ TCGv_ptr status = fpstatus_ptr(flavour);
52
+
34
+
53
+ read_vec_element(s, t, a->rn, 0, a->esz + 1);
35
+ tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, rd),
54
+ fn[a->esz](t, t);
36
+ vec_full_reg_offset(s, rn),
55
+ clear_vec(s, a->rd);
37
+ vec_full_reg_offset(s, rm),
56
+ write_vec_element(s, t, a->rd, 0, a->esz);
38
+ status, vsz, vsz, data, fn);
39
+
40
+ tcg_temp_free_ptr(status);
41
+ }
57
+ }
42
+ return true;
58
+ return true;
43
+}
59
+}
44
+
60
+
45
+static bool gen_gvec_fpst_arg_zzz(DisasContext *s, gen_helper_gvec_3_ptr *fn,
61
+#define WRAP_ENV(NAME) \
46
+ arg_rrr_esz *a, int data)
62
+ static void gen_##NAME(TCGv_i64 d, TCGv_i64 n) \
63
+ { gen_helper_##NAME(d, tcg_env, n); }
64
+
65
+WRAP_ENV(neon_unarrow_sat8)
66
+WRAP_ENV(neon_unarrow_sat16)
67
+WRAP_ENV(neon_unarrow_sat32)
68
+
69
+static ArithOneOp * const f_scalar_sqxtun[] = {
70
+ gen_neon_unarrow_sat8,
71
+ gen_neon_unarrow_sat16,
72
+ gen_neon_unarrow_sat32,
73
+};
74
+TRANS(SQXTUN_s, do_2misc_narrow_scalar, a, f_scalar_sqxtun)
75
+
76
+WRAP_ENV(neon_narrow_sat_s8)
77
+WRAP_ENV(neon_narrow_sat_s16)
78
+WRAP_ENV(neon_narrow_sat_s32)
79
+
80
+static ArithOneOp * const f_scalar_sqxtn[] = {
81
+ gen_neon_narrow_sat_s8,
82
+ gen_neon_narrow_sat_s16,
83
+ gen_neon_narrow_sat_s32,
84
+};
85
+TRANS(SQXTN_s, do_2misc_narrow_scalar, a, f_scalar_sqxtn)
86
+
87
+WRAP_ENV(neon_narrow_sat_u8)
88
+WRAP_ENV(neon_narrow_sat_u16)
89
+WRAP_ENV(neon_narrow_sat_u32)
90
+
91
+static ArithOneOp * const f_scalar_uqxtn[] = {
92
+ gen_neon_narrow_sat_u8,
93
+ gen_neon_narrow_sat_u16,
94
+ gen_neon_narrow_sat_u32,
95
+};
96
+TRANS(UQXTN_s, do_2misc_narrow_scalar, a, f_scalar_uqxtn)
97
+
98
+#undef WRAP_ENV
99
+
100
static bool do_gvec_fn2(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
101
{
102
if (!a->q && a->esz == MO_64) {
103
@@ -XXX,XX +XXX,XX @@ TRANS(UADDLP_v, do_gvec_fn2_bhs, a, gen_gvec_uaddlp)
104
TRANS(SADALP_v, do_gvec_fn2_bhs, a, gen_gvec_sadalp)
105
TRANS(UADALP_v, do_gvec_fn2_bhs, a, gen_gvec_uadalp)
106
107
+static bool do_2misc_narrow_vector(DisasContext *s, arg_qrr_e *a,
108
+ ArithOneOp * const fn[3])
47
+{
109
+{
48
+ return gen_gvec_fpst_zzz(s, fn, a->rd, a->rn, a->rm, data,
110
+ if (a->esz == MO_64) {
49
+ a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
111
+ return false;
112
+ }
113
+ if (fp_access_check(s)) {
114
+ TCGv_i64 t0 = tcg_temp_new_i64();
115
+ TCGv_i64 t1 = tcg_temp_new_i64();
116
+
117
+ read_vec_element(s, t0, a->rn, 0, MO_64);
118
+ read_vec_element(s, t1, a->rn, 1, MO_64);
119
+ fn[a->esz](t0, t0);
120
+ fn[a->esz](t1, t1);
121
+ write_vec_element(s, t0, a->rd, a->q ? 2 : 0, MO_32);
122
+ write_vec_element(s, t1, a->rd, a->q ? 3 : 1, MO_32);
123
+ clear_vec_high(s, a->q, a->rd);
124
+ }
125
+ return true;
50
+}
126
+}
51
+
127
+
52
/* Invoke an out-of-line helper on 4 Zregs. */
128
+static ArithOneOp * const f_scalar_xtn[] = {
53
static bool gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
129
+ gen_helper_neon_narrow_u8,
54
int rd, int rn, int rm, int ra, int data)
130
+ gen_helper_neon_narrow_u16,
55
@@ -XXX,XX +XXX,XX @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a)
131
+ tcg_gen_ext32u_i64,
56
*** SVE Floating Point Arithmetic - Unpredicated Group
132
+};
57
*/
133
+TRANS(XTN, do_2misc_narrow_vector, a, f_scalar_xtn)
58
134
+TRANS(SQXTUN_v, do_2misc_narrow_vector, a, f_scalar_sqxtun)
59
-static bool do_zzz_fp(DisasContext *s, arg_rrr_esz *a,
135
+TRANS(SQXTN_v, do_2misc_narrow_vector, a, f_scalar_sqxtn)
60
- gen_helper_gvec_3_ptr *fn)
136
+TRANS(UQXTN_v, do_2misc_narrow_vector, a, f_scalar_uqxtn)
61
-{
137
+
62
- if (fn == NULL) {
138
/* Common vector code for handling integer to FP conversion */
63
- return false;
139
static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
64
- }
140
int elements, int is_signed,
65
- if (sve_access_check(s)) {
141
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_narrow(DisasContext *s, bool scalar,
66
- unsigned vsz = vec_full_reg_size(s);
142
tcg_res[pass] = tcg_temp_new_i64();
67
- TCGv_ptr status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
143
68
- tcg_gen_gvec_3_ptr(vec_full_reg_offset(s, a->rd),
144
switch (opcode) {
69
- vec_full_reg_offset(s, a->rn),
145
- case 0x12: /* XTN, SQXTUN */
70
- vec_full_reg_offset(s, a->rm),
146
- {
71
- status, vsz, vsz, 0, fn);
147
- static NeonGenOne64OpFn * const xtnfns[3] = {
72
- tcg_temp_free_ptr(status);
148
- gen_helper_neon_narrow_u8,
73
- }
149
- gen_helper_neon_narrow_u16,
74
- return true;
150
- tcg_gen_ext32u_i64,
75
-}
151
- };
152
- static NeonGenOne64OpEnvFn * const sqxtunfns[3] = {
153
- gen_helper_neon_unarrow_sat8,
154
- gen_helper_neon_unarrow_sat16,
155
- gen_helper_neon_unarrow_sat32,
156
- };
157
- if (u) {
158
- genenvfn = sqxtunfns[size];
159
- } else {
160
- genfn = xtnfns[size];
161
- }
162
- break;
163
- }
164
- case 0x14: /* SQXTN, UQXTN */
165
- {
166
- static NeonGenOne64OpEnvFn * const fns[3][2] = {
167
- { gen_helper_neon_narrow_sat_s8,
168
- gen_helper_neon_narrow_sat_u8 },
169
- { gen_helper_neon_narrow_sat_s16,
170
- gen_helper_neon_narrow_sat_u16 },
171
- { gen_helper_neon_narrow_sat_s32,
172
- gen_helper_neon_narrow_sat_u32 },
173
- };
174
- genenvfn = fns[size][u];
175
- break;
176
- }
177
case 0x16: /* FCVTN, FCVTN2 */
178
/* 32 bit to 16 bit or 64 bit to 32 bit float conversion */
179
if (size == 2) {
180
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_narrow(DisasContext *s, bool scalar,
181
}
182
break;
183
default:
184
+ case 0x12: /* XTN, SQXTUN */
185
+ case 0x14: /* SQXTN, UQXTN */
186
g_assert_not_reached();
187
}
188
189
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
190
TCGv_ptr tcg_fpstatus;
191
192
switch (opcode) {
193
- case 0x12: /* SQXTUN */
194
- if (!u) {
195
- unallocated_encoding(s);
196
- return;
197
- }
198
- /* fall through */
199
- case 0x14: /* SQXTN, UQXTN */
200
- if (size == 3) {
201
- unallocated_encoding(s);
202
- return;
203
- }
204
- if (!fp_access_check(s)) {
205
- return;
206
- }
207
- handle_2misc_narrow(s, true, opcode, u, false, size, rn, rd);
208
- return;
209
case 0xc ... 0xf:
210
case 0x16 ... 0x1d:
211
case 0x1f:
212
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
213
case 0x9: /* CMEQ, CMLE */
214
case 0xa: /* CMLT */
215
case 0xb: /* ABS, NEG */
216
+ case 0x12: /* SQXTUN */
217
+ case 0x14: /* SQXTN, UQXTN */
218
unallocated_encoding(s);
219
return;
220
}
221
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
222
TCGv_ptr tcg_fpstatus;
223
224
switch (opcode) {
225
- case 0x12: /* XTN, XTN2, SQXTUN, SQXTUN2 */
226
- case 0x14: /* SQXTN, SQXTN2, UQXTN, UQXTN2 */
227
- if (size == 3) {
228
- unallocated_encoding(s);
229
- return;
230
- }
231
- if (!fp_access_check(s)) {
232
- return;
233
- }
76
-
234
-
77
-
235
- handle_2misc_narrow(s, false, opcode, u, is_q, size, rn, rd);
78
#define DO_FP3(NAME, name) \
236
- return;
79
static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
237
case 0x13: /* SHLL, SHLL2 */
80
{ \
238
if (u == 0 || size == 3) {
81
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *s, arg_rrr_esz *a) \
239
unallocated_encoding(s);
82
NULL, gen_helper_gvec_##name##_h, \
240
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
83
gen_helper_gvec_##name##_s, gen_helper_gvec_##name##_d \
241
case 0x9: /* CMEQ, CMLE */
84
}; \
242
case 0xa: /* CMLT */
85
- return do_zzz_fp(s, a, fns[a->esz]); \
243
case 0xb: /* ABS, NEG */
86
+ return gen_gvec_fpst_arg_zzz(s, fns[a->esz], a, 0); \
244
+ case 0x12: /* XTN, XTN2, SQXTUN, SQXTUN2 */
87
}
245
+ case 0x14: /* SQXTN, SQXTN2, UQXTN, UQXTN2 */
88
246
unallocated_encoding(s);
89
DO_FP3(FADD_zzz, fadd)
247
return;
248
}
90
--
249
--
91
2.25.1
250
2.34.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_zpzz instead of gen_gvec_ool_zzzp
3
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
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>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-27-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-51-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 | 21 +++++++++++----------
8
target/arm/tcg/a64.decode | 5 ++
13
1 file changed, 11 insertions(+), 10 deletions(-)
9
target/arm/tcg/translate-a64.c | 89 ++++++++++++++++++----------------
10
2 files changed, 52 insertions(+), 42 deletions(-)
14
11
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
16
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
18
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
16
@@ -XXX,XX +XXX,XX @@
20
return true;
17
21
}
18
%rd 0:5
22
19
%esz_sd 22:1 !function=plus_2
23
+static bool gen_gvec_ool_arg_zpzz(DisasContext *s, gen_helper_gvec_4 *fn,
20
+%esz_hs 22:1 !function=plus_1
24
+ arg_rprr_esz *a, int data)
21
%esz_hsd 22:2 !function=xor_2
22
%hl 11:1 21:1
23
%hlm 11:1 20:2
24
@@ -XXX,XX +XXX,XX @@
25
@qrr_b . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=0
26
@qrr_h . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=1
27
@qrr_bh . q:1 ...... . esz:1 ...... ...... rn:5 rd:5 &qrr_e
28
+@qrr_hs . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=%esz_hs
29
@qrr_e . q:1 ...... esz:2 ...... ...... rn:5 rd:5 &qrr_e
30
31
@qrrr_b . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=0
32
@@ -XXX,XX +XXX,XX @@ XTN 0.00 1110 ..1 00001 00101 0 ..... ..... @qrr_e
33
SQXTUN_v 0.10 1110 ..1 00001 00101 0 ..... ..... @qrr_e
34
SQXTN_v 0.00 1110 ..1 00001 01001 0 ..... ..... @qrr_e
35
UQXTN_v 0.10 1110 ..1 00001 01001 0 ..... ..... @qrr_e
36
+
37
+FCVTN_v 0.00 1110 0.1 00001 01101 0 ..... ..... @qrr_hs
38
+BFCVTN_v 0.00 1110 101 00001 01101 0 ..... ..... @qrr_h
39
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/arm/tcg/translate-a64.c
42
+++ b/target/arm/tcg/translate-a64.c
43
@@ -XXX,XX +XXX,XX @@ TRANS(SQXTUN_v, do_2misc_narrow_vector, a, f_scalar_sqxtun)
44
TRANS(SQXTN_v, do_2misc_narrow_vector, a, f_scalar_sqxtn)
45
TRANS(UQXTN_v, do_2misc_narrow_vector, a, f_scalar_uqxtn)
46
47
+static void gen_fcvtn_hs(TCGv_i64 d, TCGv_i64 n)
25
+{
48
+{
26
+ return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, data);
49
+ TCGv_i32 tcg_lo = tcg_temp_new_i32();
50
+ TCGv_i32 tcg_hi = tcg_temp_new_i32();
51
+ TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
52
+ TCGv_i32 ahp = get_ahp_flag();
53
+
54
+ tcg_gen_extr_i64_i32(tcg_lo, tcg_hi, n);
55
+ gen_helper_vfp_fcvt_f32_to_f16(tcg_lo, tcg_lo, fpst, ahp);
56
+ gen_helper_vfp_fcvt_f32_to_f16(tcg_hi, tcg_hi, fpst, ahp);
57
+ tcg_gen_deposit_i32(tcg_lo, tcg_lo, tcg_hi, 16, 16);
58
+ tcg_gen_extu_i32_i64(d, tcg_lo);
27
+}
59
+}
28
+
60
+
29
/* Invoke a vector expander on two Zregs. */
61
+static void gen_fcvtn_sd(TCGv_i64 d, TCGv_i64 n)
30
static void gen_gvec_fn_zz(DisasContext *s, GVecGen2Fn *gvec_fn,
62
+{
31
int esz, int rd, int rn)
63
+ TCGv_i32 tmp = tcg_temp_new_i32();
32
@@ -XXX,XX +XXX,XX @@ static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
64
+ gen_helper_vfp_fcvtsd(tmp, n, tcg_env);
33
*** SVE Integer Arithmetic - Binary Predicated Group
65
+ tcg_gen_extu_i32_i64(d, tmp);
34
*/
66
+}
35
67
+
36
-static bool do_zpzz_ool(DisasContext *s, arg_rprr_esz *a, gen_helper_gvec_4 *fn)
68
+static ArithOneOp * const f_vector_fcvtn[] = {
37
-{
69
+ NULL,
38
- return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, 0);
70
+ gen_fcvtn_hs,
39
-}
71
+ gen_fcvtn_sd,
72
+};
73
+TRANS(FCVTN_v, do_2misc_narrow_vector, a, f_vector_fcvtn)
74
+
75
+static void gen_bfcvtn_hs(TCGv_i64 d, TCGv_i64 n)
76
+{
77
+ TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
78
+ TCGv_i32 tmp = tcg_temp_new_i32();
79
+ gen_helper_bfcvt_pair(tmp, n, fpst);
80
+ tcg_gen_extu_i32_i64(d, tmp);
81
+}
82
+
83
+static ArithOneOp * const f_vector_bfcvtn[] = {
84
+ NULL,
85
+ gen_bfcvtn_hs,
86
+ NULL,
87
+};
88
+TRANS_FEAT(BFCVTN_v, aa64_bf16, do_2misc_narrow_vector, a, f_vector_bfcvtn)
89
+
90
/* Common vector code for handling integer to FP conversion */
91
static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
92
int elements, int is_signed,
93
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_narrow(DisasContext *s, bool scalar,
94
tcg_res[pass] = tcg_temp_new_i64();
95
96
switch (opcode) {
97
- case 0x16: /* FCVTN, FCVTN2 */
98
- /* 32 bit to 16 bit or 64 bit to 32 bit float conversion */
99
- if (size == 2) {
100
- TCGv_i32 tmp = tcg_temp_new_i32();
101
- gen_helper_vfp_fcvtsd(tmp, tcg_op, tcg_env);
102
- tcg_gen_extu_i32_i64(tcg_res[pass], tmp);
103
- } else {
104
- TCGv_i32 tcg_lo = tcg_temp_new_i32();
105
- TCGv_i32 tcg_hi = tcg_temp_new_i32();
106
- TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
107
- TCGv_i32 ahp = get_ahp_flag();
40
-
108
-
41
/* Select active elememnts from Zn and inactive elements from Zm,
109
- tcg_gen_extr_i64_i32(tcg_lo, tcg_hi, tcg_op);
42
* storing the result in Zd.
110
- gen_helper_vfp_fcvt_f32_to_f16(tcg_lo, tcg_lo, fpst, ahp);
43
*/
111
- gen_helper_vfp_fcvt_f32_to_f16(tcg_hi, tcg_hi, fpst, ahp);
44
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME##_zpzz(DisasContext *s, arg_rprr_esz *a) \
112
- tcg_gen_deposit_i32(tcg_lo, tcg_lo, tcg_hi, 16, 16);
45
gen_helper_sve_##name##_zpzz_b, gen_helper_sve_##name##_zpzz_h, \
113
- tcg_gen_extu_i32_i64(tcg_res[pass], tcg_lo);
46
gen_helper_sve_##name##_zpzz_s, gen_helper_sve_##name##_zpzz_d, \
114
- }
47
}; \
115
- break;
48
- return do_zpzz_ool(s, a, fns[a->esz]); \
116
- case 0x36: /* BFCVTN, BFCVTN2 */
49
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0); \
117
- {
50
}
118
- TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
51
119
- TCGv_i32 tmp = tcg_temp_new_i32();
52
DO_ZPZZ(AND, and)
120
- gen_helper_bfcvt_pair(tmp, tcg_op, fpst);
53
@@ -XXX,XX +XXX,XX @@ static bool trans_SDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
121
- tcg_gen_extu_i32_i64(tcg_res[pass], tmp);
54
static gen_helper_gvec_4 * const fns[4] = {
122
- }
55
NULL, NULL, gen_helper_sve_sdiv_zpzz_s, gen_helper_sve_sdiv_zpzz_d
123
- break;
56
};
124
case 0x56: /* FCVTXN, FCVTXN2 */
57
- return do_zpzz_ool(s, a, fns[a->esz]);
125
{
58
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0);
126
/*
59
}
127
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_narrow(DisasContext *s, bool scalar,
60
128
default:
61
static bool trans_UDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
129
case 0x12: /* XTN, SQXTUN */
62
@@ -XXX,XX +XXX,XX @@ static bool trans_UDIV_zpzz(DisasContext *s, arg_rprr_esz *a)
130
case 0x14: /* SQXTN, UQXTN */
63
static gen_helper_gvec_4 * const fns[4] = {
131
+ case 0x16: /* FCVTN, FCVTN2 */
64
NULL, NULL, gen_helper_sve_udiv_zpzz_s, gen_helper_sve_udiv_zpzz_d
132
+ case 0x36: /* BFCVTN, BFCVTN2 */
65
};
133
g_assert_not_reached();
66
- return do_zpzz_ool(s, a, fns[a->esz]);
134
}
67
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0);
135
68
}
136
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
69
137
unallocated_encoding(s);
70
static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
138
return;
71
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME##_zpzw(DisasContext *s, arg_rprr_esz *a) \
139
}
72
if (a->esz < 0 || a->esz >= 3) { \
140
- /* fall through */
73
return false; \
141
- case 0x16: /* FCVTN, FCVTN2 */
74
} \
142
- /* handle_2misc_narrow does a 2*size -> size operation, but these
75
- return do_zpzz_ool(s, a, fns[a->esz]); \
143
- * instructions encode the source size rather than dest size.
76
+ return gen_gvec_ool_arg_zpzz(s, fns[a->esz], a, 0); \
144
- */
77
}
145
- if (!fp_access_check(s)) {
78
146
- return;
79
DO_ZPZW(ASR, asr)
147
- }
80
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zpzz_ool(DisasContext *s, arg_rprr_esz *a,
148
- handle_2misc_narrow(s, false, opcode, 0, is_q, size - 1, rn, rd);
81
if (!dc_isar_feature(aa64_sve2, s)) {
149
- return;
82
return false;
150
- case 0x36: /* BFCVTN, BFCVTN2 */
83
}
151
- if (!dc_isar_feature(aa64_bf16, s) || size != 2) {
84
- return do_zpzz_ool(s, a, fn);
152
- unallocated_encoding(s);
85
+ return gen_gvec_ool_arg_zpzz(s, fn, a, 0);
153
- return;
86
}
154
- }
87
155
if (!fp_access_check(s)) {
88
static bool trans_SADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
156
return;
157
}
158
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
159
}
160
break;
161
default:
162
+ case 0x16: /* FCVTN, FCVTN2 */
163
+ case 0x36: /* BFCVTN, BFCVTN2 */
164
unallocated_encoding(s);
165
return;
166
}
89
--
167
--
90
2.25.1
168
2.34.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 handle_2misc_narrow as this was the last insn decoded
4
by that function.
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-62-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-52-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/tcg/a64.decode | 4 ++
9
1 file changed, 2 insertions(+), 9 deletions(-)
12
target/arm/tcg/translate-a64.c | 101 +++++++--------------------------
13
2 files changed, 24 insertions(+), 81 deletions(-)
10
14
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
17
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_clast_fp(DisasContext *s, arg_rpr_esz *a, bool before)
19
@@ -XXX,XX +XXX,XX @@
16
return true;
20
21
@qrr_b . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=0
22
@qrr_h . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=1
23
+@qrr_s . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=2
24
@qrr_bh . q:1 ...... . esz:1 ...... ...... rn:5 rd:5 &qrr_e
25
@qrr_hs . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=%esz_hs
26
@qrr_e . q:1 ...... esz:2 ...... ...... rn:5 rd:5 &qrr_e
27
@@ -XXX,XX +XXX,XX @@ SQXTUN_s 0111 1110 ..1 00001 00101 0 ..... ..... @rr_e
28
SQXTN_s 0101 1110 ..1 00001 01001 0 ..... ..... @rr_e
29
UQXTN_s 0111 1110 ..1 00001 01001 0 ..... ..... @rr_e
30
31
+FCVTXN_s 0111 1110 011 00001 01101 0 ..... ..... @rr_s
32
+
33
# Advanced SIMD two-register miscellaneous
34
35
SQABS_v 0.00 1110 ..1 00000 01111 0 ..... ..... @qrr_e
36
@@ -XXX,XX +XXX,XX @@ SQXTN_v 0.00 1110 ..1 00001 01001 0 ..... ..... @qrr_e
37
UQXTN_v 0.10 1110 ..1 00001 01001 0 ..... ..... @qrr_e
38
39
FCVTN_v 0.00 1110 0.1 00001 01101 0 ..... ..... @qrr_hs
40
+FCVTXN_v 0.10 1110 011 00001 01101 0 ..... ..... @qrr_s
41
BFCVTN_v 0.00 1110 101 00001 01101 0 ..... ..... @qrr_h
42
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/arm/tcg/translate-a64.c
45
+++ b/target/arm/tcg/translate-a64.c
46
@@ -XXX,XX +XXX,XX @@ static ArithOneOp * const f_scalar_uqxtn[] = {
47
};
48
TRANS(UQXTN_s, do_2misc_narrow_scalar, a, f_scalar_uqxtn)
49
50
+static void gen_fcvtxn_sd(TCGv_i64 d, TCGv_i64 n)
51
+{
52
+ /*
53
+ * 64 bit to 32 bit float conversion
54
+ * with von Neumann rounding (round to odd)
55
+ */
56
+ TCGv_i32 tmp = tcg_temp_new_i32();
57
+ gen_helper_fcvtx_f64_to_f32(tmp, n, tcg_env);
58
+ tcg_gen_extu_i32_i64(d, tmp);
59
+}
60
+
61
+static ArithOneOp * const f_scalar_fcvtxn[] = {
62
+ NULL,
63
+ NULL,
64
+ gen_fcvtxn_sd,
65
+};
66
+TRANS(FCVTXN_s, do_2misc_narrow_scalar, a, f_scalar_fcvtxn)
67
+
68
#undef WRAP_ENV
69
70
static bool do_gvec_fn2(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
71
@@ -XXX,XX +XXX,XX @@ static ArithOneOp * const f_vector_fcvtn[] = {
72
gen_fcvtn_sd,
73
};
74
TRANS(FCVTN_v, do_2misc_narrow_vector, a, f_vector_fcvtn)
75
+TRANS(FCVTXN_v, do_2misc_narrow_vector, a, f_scalar_fcvtxn)
76
77
static void gen_bfcvtn_hs(TCGv_i64 d, TCGv_i64 n)
78
{
79
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_reciprocal(DisasContext *s, int opcode,
80
}
17
}
81
}
18
82
19
-static bool trans_CLASTA_v(DisasContext *s, arg_rpr_esz *a)
83
-static void handle_2misc_narrow(DisasContext *s, bool scalar,
84
- int opcode, bool u, bool is_q,
85
- int size, int rn, int rd)
20
-{
86
-{
21
- return do_clast_fp(s, a, false);
87
- /* Handle 2-reg-misc ops which are narrowing (so each 2*size element
88
- * in the source becomes a size element in the destination).
89
- */
90
- int pass;
91
- TCGv_i64 tcg_res[2];
92
- int destelt = is_q ? 2 : 0;
93
- int passes = scalar ? 1 : 2;
94
-
95
- if (scalar) {
96
- tcg_res[1] = tcg_constant_i64(0);
97
- }
98
-
99
- for (pass = 0; pass < passes; pass++) {
100
- TCGv_i64 tcg_op = tcg_temp_new_i64();
101
- NeonGenOne64OpFn *genfn = NULL;
102
- NeonGenOne64OpEnvFn *genenvfn = NULL;
103
-
104
- if (scalar) {
105
- read_vec_element(s, tcg_op, rn, pass, size + 1);
106
- } else {
107
- read_vec_element(s, tcg_op, rn, pass, MO_64);
108
- }
109
- tcg_res[pass] = tcg_temp_new_i64();
110
-
111
- switch (opcode) {
112
- case 0x56: /* FCVTXN, FCVTXN2 */
113
- {
114
- /*
115
- * 64 bit to 32 bit float conversion
116
- * with von Neumann rounding (round to odd)
117
- */
118
- TCGv_i32 tmp = tcg_temp_new_i32();
119
- assert(size == 2);
120
- gen_helper_fcvtx_f64_to_f32(tmp, tcg_op, tcg_env);
121
- tcg_gen_extu_i32_i64(tcg_res[pass], tmp);
122
- }
123
- break;
124
- default:
125
- case 0x12: /* XTN, SQXTUN */
126
- case 0x14: /* SQXTN, UQXTN */
127
- case 0x16: /* FCVTN, FCVTN2 */
128
- case 0x36: /* BFCVTN, BFCVTN2 */
129
- g_assert_not_reached();
130
- }
131
-
132
- if (genfn) {
133
- genfn(tcg_res[pass], tcg_op);
134
- } else if (genenvfn) {
135
- genenvfn(tcg_res[pass], tcg_env, tcg_op);
136
- }
137
- }
138
-
139
- for (pass = 0; pass < 2; pass++) {
140
- write_vec_element(s, tcg_res[pass], rd, destelt + pass, MO_32);
141
- }
142
- clear_vec_high(s, is_q, rd);
22
-}
143
-}
23
-
144
-
24
-static bool trans_CLASTB_v(DisasContext *s, arg_rpr_esz *a)
145
/* AdvSIMD scalar two reg misc
25
-{
146
* 31 30 29 28 24 23 22 21 17 16 12 11 10 9 5 4 0
26
- return do_clast_fp(s, a, true);
147
* +-----+---+-----------+------+-----------+--------+-----+------+------+
27
-}
148
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
28
+TRANS_FEAT(CLASTA_v, aa64_sve, do_clast_fp, a, false)
149
rmode = FPROUNDING_TIEAWAY;
29
+TRANS_FEAT(CLASTB_v, aa64_sve, do_clast_fp, a, true)
150
break;
30
151
case 0x56: /* FCVTXN, FCVTXN2 */
31
/* Compute CLAST for a Xreg. */
152
- if (size == 2) {
32
static bool do_clast_general(DisasContext *s, arg_rpr_esz *a, bool before)
153
- unallocated_encoding(s);
154
- return;
155
- }
156
- if (!fp_access_check(s)) {
157
- return;
158
- }
159
- handle_2misc_narrow(s, true, opcode, u, false, size - 1, rn, rd);
160
- return;
161
default:
162
unallocated_encoding(s);
163
return;
164
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
165
}
166
handle_2misc_reciprocal(s, opcode, false, u, is_q, size, rn, rd);
167
return;
168
- case 0x56: /* FCVTXN, FCVTXN2 */
169
- if (size == 2) {
170
- unallocated_encoding(s);
171
- return;
172
- }
173
- if (!fp_access_check(s)) {
174
- return;
175
- }
176
- handle_2misc_narrow(s, false, opcode, 0, is_q, size - 1, rn, rd);
177
- return;
178
case 0x17: /* FCVTL, FCVTL2 */
179
if (!fp_access_check(s)) {
180
return;
181
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
182
default:
183
case 0x16: /* FCVTN, FCVTN2 */
184
case 0x36: /* BFCVTN, BFCVTN2 */
185
+ case 0x56: /* FCVTXN, FCVTXN2 */
186
unallocated_encoding(s);
187
return;
188
}
33
--
189
--
34
2.25.1
190
2.34.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-9-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-53-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 | 102 ++++++++++++++-----------------------
8
target/arm/tcg/a64.decode | 2 +
9
1 file changed, 38 insertions(+), 64 deletions(-)
9
target/arm/tcg/translate-a64.c | 75 +++++++++++++++++-----------------
10
2 files changed, 40 insertions(+), 37 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
16
@@ -XXX,XX +XXX,XX @@ UQXTN_v 0.10 1110 ..1 00001 01001 0 ..... ..... @qrr_e
16
}
17
FCVTN_v 0.00 1110 0.1 00001 01101 0 ..... ..... @qrr_hs
17
18
FCVTXN_v 0.10 1110 011 00001 01101 0 ..... ..... @qrr_s
18
/* Invoke an out-of-line helper on 4 Zregs. */
19
BFCVTN_v 0.00 1110 101 00001 01101 0 ..... ..... @qrr_h
19
-static void gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
20
+
20
+static bool gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
21
+SHLL_v 0.10 1110 ..1 00001 00111 0 ..... ..... @qrr_e
21
int rd, int rn, int rm, int ra, int data)
22
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
22
{
23
index XXXXXXX..XXXXXXX 100644
23
- unsigned vsz = vec_full_reg_size(s);
24
--- a/target/arm/tcg/translate-a64.c
24
- tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
25
+++ b/target/arm/tcg/translate-a64.c
25
- vec_full_reg_offset(s, rn),
26
@@ -XXX,XX +XXX,XX @@ static ArithOneOp * const f_vector_bfcvtn[] = {
26
- vec_full_reg_offset(s, rm),
27
};
27
- vec_full_reg_offset(s, ra),
28
TRANS_FEAT(BFCVTN_v, aa64_bf16, do_2misc_narrow_vector, a, f_vector_bfcvtn)
28
- vsz, vsz, data, fn);
29
29
+ if (fn == NULL) {
30
+static bool trans_SHLL_v(DisasContext *s, arg_qrr_e *a)
31
+{
32
+ static NeonGenWidenFn * const widenfns[3] = {
33
+ gen_helper_neon_widen_u8,
34
+ gen_helper_neon_widen_u16,
35
+ tcg_gen_extu_i32_i64,
36
+ };
37
+ NeonGenWidenFn *widenfn;
38
+ TCGv_i64 tcg_res[2];
39
+ TCGv_i32 tcg_op;
40
+ int part, pass;
41
+
42
+ if (a->esz == MO_64) {
30
+ return false;
43
+ return false;
31
+ }
44
+ }
32
+ if (sve_access_check(s)) {
45
+ if (!fp_access_check(s)) {
33
+ unsigned vsz = vec_full_reg_size(s);
46
+ return true;
34
+ tcg_gen_gvec_4_ool(vec_full_reg_offset(s, rd),
47
+ }
35
+ vec_full_reg_offset(s, rn),
48
+
36
+ vec_full_reg_offset(s, rm),
49
+ tcg_op = tcg_temp_new_i32();
37
+ vec_full_reg_offset(s, ra),
50
+ widenfn = widenfns[a->esz];
38
+ vsz, vsz, data, fn);
51
+ part = a->q ? 2 : 0;
52
+
53
+ for (pass = 0; pass < 2; pass++) {
54
+ read_vec_element_i32(s, tcg_op, a->rn, part + pass, MO_32);
55
+ tcg_res[pass] = tcg_temp_new_i64();
56
+ widenfn(tcg_res[pass], tcg_op);
57
+ tcg_gen_shli_i64(tcg_res[pass], tcg_res[pass], 8 << a->esz);
58
+ }
59
+
60
+ for (pass = 0; pass < 2; pass++) {
61
+ write_vec_element(s, tcg_res[pass], a->rd, pass, MO_64);
39
+ }
62
+ }
40
+ return true;
63
+ return true;
64
+}
65
+
66
+
67
/* Common vector code for handling integer to FP conversion */
68
static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
69
int elements, int is_signed,
70
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q,
71
}
41
}
72
}
42
73
43
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
74
-static void handle_shll(DisasContext *s, bool is_q, int size, int rn, int rd)
44
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
75
-{
45
if (!dc_isar_feature(aa64_sve2, s)) {
76
- /* Implement SHLL and SHLL2 */
46
return false;
77
- int pass;
47
}
78
- int part = is_q ? 2 : 0;
48
- if (sve_access_check(s)) {
79
- TCGv_i64 tcg_res[2];
49
- gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
80
-
50
- (a->rn + 1) % 32, a->rm, 0);
81
- for (pass = 0; pass < 2; pass++) {
82
- static NeonGenWidenFn * const widenfns[3] = {
83
- gen_helper_neon_widen_u8,
84
- gen_helper_neon_widen_u16,
85
- tcg_gen_extu_i32_i64,
86
- };
87
- NeonGenWidenFn *widenfn = widenfns[size];
88
- TCGv_i32 tcg_op = tcg_temp_new_i32();
89
-
90
- read_vec_element_i32(s, tcg_op, rn, part + pass, MO_32);
91
- tcg_res[pass] = tcg_temp_new_i64();
92
- widenfn(tcg_res[pass], tcg_op);
93
- tcg_gen_shli_i64(tcg_res[pass], tcg_res[pass], 8 << size);
51
- }
94
- }
52
- return true;
53
+ return gen_gvec_ool_zzzz(s, fns[a->esz], a->rd, a->rn,
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
-
95
-
63
- if (sve_access_check(s)) {
96
- for (pass = 0; pass < 2; pass++) {
64
- gen_gvec_ool_zzzz(s, fns[a->u][a->sz], a->rd, a->rn, a->rm, a->ra, 0);
97
- write_vec_element(s, tcg_res[pass], rd, pass, MO_64);
65
- }
98
- }
66
- return true;
99
-}
67
+ return gen_gvec_ool_zzzz(s, fns[a->u][a->sz],
100
-
68
+ a->rd, a->rn, a->rm, a->ra, 0);
101
/* AdvSIMD two reg misc
69
}
102
* 31 30 29 28 24 23 22 21 17 16 12 11 10 9 5 4 0
70
103
* +---+---+---+-----------+------+-----------+--------+-----+------+------+
71
/*
104
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
72
@@ -XXX,XX +XXX,XX @@ static bool trans_DOT_zzzz(DisasContext *s, arg_DOT_zzzz *a)
105
TCGv_ptr tcg_fpstatus;
73
static bool do_zzxz_ool(DisasContext *s, arg_rrxr_esz *a,
106
74
gen_helper_gvec_4 *fn)
107
switch (opcode) {
75
{
108
- case 0x13: /* SHLL, SHLL2 */
76
- if (fn == NULL) {
109
- if (u == 0 || size == 3) {
77
- return false;
110
- unallocated_encoding(s);
78
- }
111
- return;
79
- if (sve_access_check(s)) {
112
- }
80
- gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
113
- if (!fp_access_check(s)) {
81
- }
114
- return;
82
- return true;
115
- }
83
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
116
- handle_shll(s, is_q, size, rn, rd);
84
}
117
- return;
85
118
case 0xc ... 0xf:
86
#define DO_RRXR(NAME, FUNC) \
119
case 0x16 ... 0x1f:
87
@@ -XXX,XX +XXX,XX @@ static bool trans_SQCADD_rot270(DisasContext *s, arg_rrr_esz *a)
120
{
88
static bool do_sve2_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
121
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
89
gen_helper_gvec_4 *fn, int data)
122
case 0xa: /* CMLT */
90
{
123
case 0xb: /* ABS, NEG */
91
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
124
case 0x12: /* XTN, XTN2, SQXTUN, SQXTUN2 */
92
+ if (!dc_isar_feature(aa64_sve2, s)) {
125
+ case 0x13: /* SHLL, SHLL2 */
93
return false;
126
case 0x14: /* SQXTN, SQXTN2, UQXTN, UQXTN2 */
94
}
127
unallocated_encoding(s);
95
- if (sve_access_check(s)) {
128
return;
96
- gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
97
- }
98
- return true;
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
--
129
--
205
2.25.1
130
2.34.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
Move the current implementation out of translate-neon.c,
4
when the arguments come from arg_rrr_esz.
4
and extend to handle all element sizes.
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: 20241211163036.2297116-54-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/tcg/translate.h | 6 ++++++
13
1 file changed, 21 insertions(+), 27 deletions(-)
12
target/arm/tcg/gengvec.c | 14 ++++++++++++++
13
target/arm/tcg/translate-neon.c | 20 ++------------------
14
3 files changed, 22 insertions(+), 18 deletions(-)
14
15
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h
16
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
18
--- a/target/arm/tcg/translate.h
18
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/tcg/translate.h
19
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
20
@@ -XXX,XX +XXX,XX @@ void gen_gvec_uaddlp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
21
void gen_gvec_uadalp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
22
uint32_t opr_sz, uint32_t max_sz);
23
24
+/* These exclusively manipulate the sign bit. */
25
+void gen_gvec_fabs(unsigned vece, uint32_t dofs, uint32_t aofs,
26
+ uint32_t oprsz, uint32_t maxsz);
27
+void gen_gvec_fneg(unsigned vece, uint32_t dofs, uint32_t aofs,
28
+ uint32_t oprsz, uint32_t maxsz);
29
+
30
/*
31
* Forward to the isar_feature_* tests given a DisasContext pointer.
32
*/
33
diff --git a/target/arm/tcg/gengvec.c b/target/arm/tcg/gengvec.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/arm/tcg/gengvec.c
36
+++ b/target/arm/tcg/gengvec.c
37
@@ -XXX,XX +XXX,XX @@ void gen_gvec_uadalp(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
38
assert(vece <= MO_32);
39
tcg_gen_gvec_2(rd_ofs, rn_ofs, opr_sz, max_sz, &g[vece]);
40
}
41
+
42
+void gen_gvec_fabs(unsigned vece, uint32_t dofs, uint32_t aofs,
43
+ uint32_t oprsz, uint32_t maxsz)
44
+{
45
+ uint64_t s_bit = 1ull << ((8 << vece) - 1);
46
+ tcg_gen_gvec_andi(vece, dofs, aofs, s_bit - 1, oprsz, maxsz);
47
+}
48
+
49
+void gen_gvec_fneg(unsigned vece, uint32_t dofs, uint32_t aofs,
50
+ uint32_t oprsz, uint32_t maxsz)
51
+{
52
+ uint64_t s_bit = 1ull << ((8 << vece) - 1);
53
+ tcg_gen_gvec_xori(vece, dofs, aofs, s_bit, oprsz, maxsz);
54
+}
55
diff --git a/target/arm/tcg/translate-neon.c b/target/arm/tcg/translate-neon.c
56
index XXXXXXX..XXXXXXX 100644
57
--- a/target/arm/tcg/translate-neon.c
58
+++ b/target/arm/tcg/translate-neon.c
59
@@ -XXX,XX +XXX,XX @@ static bool do_2misc(DisasContext *s, arg_2misc *a, NeonGenOneOpFn *fn)
20
return true;
60
return true;
21
}
61
}
22
62
23
+static bool gen_gvec_ool_arg_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
63
-static void gen_VABS_F(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs,
24
+ arg_rrr_esz *a, int data)
64
- uint32_t oprsz, uint32_t maxsz)
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
-{
65
-{
38
- return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
66
- tcg_gen_gvec_andi(vece, rd_ofs, rm_ofs,
67
- vece == MO_16 ? 0x7fff : 0x7fffffff,
68
- oprsz, maxsz);
39
-}
69
-}
40
-
70
-
41
#define DO_ZZW(NAME, name) \
71
static bool trans_VABS_F(DisasContext *s, arg_2misc *a)
42
static bool trans_##NAME##_zzw(DisasContext *s, arg_rrr_esz *a) \
72
{
43
{ \
73
if (a->size == MO_16) {
44
@@ -XXX,XX +XXX,XX @@ static bool trans_##NAME##_zzw(DisasContext *s, arg_rrr_esz *a) \
74
@@ -XXX,XX +XXX,XX @@ static bool trans_VABS_F(DisasContext *s, arg_2misc *a)
45
gen_helper_sve_##name##_zzw_b, gen_helper_sve_##name##_zzw_h, \
75
} else if (a->size != MO_32) {
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;
76
return false;
74
}
77
}
75
- return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
78
- return do_2misc_vec(s, a, gen_VABS_F);
76
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, 0);
77
}
78
79
static bool trans_UNPK(DisasContext *s, arg_UNPK *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
-}
79
-}
89
-
80
-
90
static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
81
-static void gen_VNEG_F(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs,
91
{
82
- uint32_t oprsz, uint32_t maxsz)
92
return do_zip(s, a, false);
83
-{
93
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const uzp_fns[4] = {
84
- tcg_gen_gvec_xori(vece, rd_ofs, rm_ofs,
94
85
- vece == MO_16 ? 0x8000 : 0x80000000,
95
static bool trans_UZP1_z(DisasContext *s, arg_rrr_esz *a)
86
- oprsz, maxsz);
96
{
87
+ return do_2misc_vec(s, a, gen_gvec_fabs);
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
}
88
}
100
89
101
static bool trans_UZP2_z(DisasContext *s, arg_rrr_esz *a)
90
static bool trans_VNEG_F(DisasContext *s, arg_2misc *a)
102
{
91
@@ -XXX,XX +XXX,XX @@ static bool trans_VNEG_F(DisasContext *s, arg_2misc *a)
103
- return do_zzz_data_ool(s, a, 1 << a->esz, uzp_fns[a->esz]);
92
} else if (a->size != MO_32) {
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)) {
110
return false;
93
return false;
111
}
94
}
112
- return do_zzz_data_ool(s, a, 0, gen_helper_sve2_uzp_q);
95
- return do_2misc_vec(s, a, gen_VNEG_F);
113
+ return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_uzp_q, a, 0);
96
+ return do_2misc_vec(s, a, gen_gvec_fneg);
114
}
97
}
115
98
116
static bool trans_UZP2_q(DisasContext *s, arg_rrr_esz *a)
99
static bool trans_VRECPE(DisasContext *s, arg_2misc *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
--
100
--
188
2.25.1
101
2.34.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
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
when the arguments come from arg_rrrr_esz.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-11-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-55-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
7
---
11
target/arm/translate-sve.c | 16 ++++++++++------
8
target/arm/tcg/a64.decode | 7 +++++
12
1 file changed, 10 insertions(+), 6 deletions(-)
9
target/arm/tcg/translate-a64.c | 54 +++++++++++++++-------------------
10
2 files changed, 31 insertions(+), 30 deletions(-)
13
11
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
15
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
17
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
16
@@ -XXX,XX +XXX,XX @@
17
@qrr_s . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=2
18
@qrr_bh . q:1 ...... . esz:1 ...... ...... rn:5 rd:5 &qrr_e
19
@qrr_hs . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=%esz_hs
20
+@qrr_sd . q:1 ...... .. ...... ...... rn:5 rd:5 &qrr_e esz=%esz_sd
21
@qrr_e . q:1 ...... esz:2 ...... ...... rn:5 rd:5 &qrr_e
22
23
@qrrr_b . q:1 ...... ... rm:5 ...... rn:5 rd:5 &qrrr_e esz=0
24
@@ -XXX,XX +XXX,XX @@ FCVTXN_v 0.10 1110 011 00001 01101 0 ..... ..... @qrr_s
25
BFCVTN_v 0.00 1110 101 00001 01101 0 ..... ..... @qrr_h
26
27
SHLL_v 0.10 1110 ..1 00001 00111 0 ..... ..... @qrr_e
28
+
29
+FABS_v 0.00 1110 111 11000 11111 0 ..... ..... @qrr_h
30
+FABS_v 0.00 1110 1.1 00000 11111 0 ..... ..... @qrr_sd
31
+
32
+FNEG_v 0.10 1110 111 11000 11111 0 ..... ..... @qrr_h
33
+FNEG_v 0.10 1110 1.1 00000 11111 0 ..... ..... @qrr_sd
34
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/tcg/translate-a64.c
37
+++ b/target/arm/tcg/translate-a64.c
38
@@ -XXX,XX +XXX,XX @@ static bool trans_SHLL_v(DisasContext *s, arg_qrr_e *a)
19
return true;
39
return true;
20
}
40
}
21
41
22
+static bool gen_gvec_ool_arg_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
42
+static bool do_fabs_fneg_v(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
23
+ arg_rrrr_esz *a, int data)
24
+{
43
+{
25
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
44
+ int check = fp_access_check_vector_hsd(s, a->q, a->esz);
45
+
46
+ if (check <= 0) {
47
+ return check == 0;
48
+ }
49
+
50
+ gen_gvec_fn2(s, a->q, a->rd, a->rn, fn, a->esz);
51
+ return true;
26
+}
52
+}
27
+
53
+
28
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
54
+TRANS(FABS_v, do_fabs_fneg_v, a, gen_gvec_fabs)
29
static void gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
55
+TRANS(FNEG_v, do_fabs_fneg_v, a, gen_gvec_fneg)
30
int rd, int rn, int pg, int data)
56
31
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
57
/* Common vector code for handling integer to FP conversion */
32
if (!dc_isar_feature(aa64_sve2, s)) {
58
static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
33
return false;
59
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
60
* requires them.
61
*/
62
switch (opcode) {
63
- case 0x2f: /* FABS */
64
- gen_vfp_absd(tcg_rd, tcg_rn);
65
- break;
66
- case 0x6f: /* FNEG */
67
- gen_vfp_negd(tcg_rd, tcg_rn);
68
- break;
69
case 0x7f: /* FSQRT */
70
gen_helper_vfp_sqrtd(tcg_rd, tcg_rn, tcg_fpstatus);
71
break;
72
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
73
case 0x9: /* CMEQ, CMLE */
74
case 0xa: /* CMLT */
75
case 0xb: /* ABS, NEG */
76
+ case 0x2f: /* FABS */
77
+ case 0x6f: /* FNEG */
78
g_assert_not_reached();
34
}
79
}
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
}
80
}
38
81
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
39
static bool do_abal(DisasContext *s, arg_rrrr_esz *a, bool uns, bool sel)
82
opcode |= (extract32(size, 1, 1) << 5) | (u << 6);
40
@@ -XXX,XX +XXX,XX @@ static bool do_i8mm_zzzz_ool(DisasContext *s, arg_rrrr_esz *a,
83
size = is_double ? 3 : 2;
41
if (!dc_isar_feature(aa64_sve_i8mm, s)) {
84
switch (opcode) {
42
return false;
85
- case 0x2f: /* FABS */
86
- case 0x6f: /* FNEG */
87
- if (size == 3 && !is_q) {
88
- unallocated_encoding(s);
89
- return;
90
- }
91
- break;
92
case 0x1d: /* SCVTF */
93
case 0x5d: /* UCVTF */
94
{
95
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
96
case 0x16: /* FCVTN, FCVTN2 */
97
case 0x36: /* BFCVTN, BFCVTN2 */
98
case 0x56: /* FCVTXN, FCVTXN2 */
99
+ case 0x2f: /* FABS */
100
+ case 0x6f: /* FNEG */
101
unallocated_encoding(s);
102
return;
103
}
104
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
105
{
106
/* Special cases for 32 bit elements */
107
switch (opcode) {
108
- case 0x2f: /* FABS */
109
- gen_vfp_abss(tcg_res, tcg_op);
110
- break;
111
- case 0x6f: /* FNEG */
112
- gen_vfp_negs(tcg_res, tcg_op);
113
- break;
114
case 0x7f: /* FSQRT */
115
gen_helper_vfp_sqrts(tcg_res, tcg_op, tcg_fpstatus);
116
break;
117
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
118
break;
119
default:
120
case 0x7: /* SQABS, SQNEG */
121
+ case 0x2f: /* FABS */
122
+ case 0x6f: /* FNEG */
123
g_assert_not_reached();
124
}
125
}
126
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
127
case 0x7b: /* FCVTZU */
128
rmode = FPROUNDING_ZERO;
129
break;
130
- case 0x2f: /* FABS */
131
- case 0x6f: /* FNEG */
132
- only_in_vector = true;
133
- need_fpst = false;
134
- break;
135
case 0x7d: /* FRSQRTE */
136
break;
137
case 0x7f: /* FSQRT (vector) */
138
only_in_vector = true;
139
break;
140
default:
141
+ case 0x2f: /* FABS */
142
+ case 0x6f: /* FNEG */
143
unallocated_encoding(s);
144
return;
43
}
145
}
44
- return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
146
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
45
+ return gen_gvec_ool_arg_zzzz(s, fn, a, data);
147
case 0x59: /* FRINTX */
46
}
148
gen_helper_advsimd_rinth_exact(tcg_res, tcg_op, tcg_fpstatus);
47
149
break;
48
static bool trans_SMMLA(DisasContext *s, arg_rrrr_esz *a)
150
- case 0x2f: /* FABS */
49
@@ -XXX,XX +XXX,XX @@ static bool trans_BFDOT_zzzz(DisasContext *s, arg_rrrr_esz *a)
151
- tcg_gen_andi_i32(tcg_res, tcg_op, 0x7fff);
50
if (!dc_isar_feature(aa64_sve_bf16, s)) {
152
- break;
51
return false;
153
- case 0x6f: /* FNEG */
52
}
154
- tcg_gen_xori_i32(tcg_res, tcg_op, 0x8000);
53
- return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfdot,
155
- break;
54
- a->rd, a->rn, a->rm, a->ra, 0);
156
case 0x7d: /* FRSQRTE */
55
+ return gen_gvec_ool_arg_zzzz(s, gen_helper_gvec_bfdot, a, 0);
157
gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus);
56
}
158
break;
57
159
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
58
static bool trans_BFDOT_zzxz(DisasContext *s, arg_rrxr_esz *a)
160
gen_helper_vfp_sqrth(tcg_res, tcg_op, tcg_fpstatus);
59
@@ -XXX,XX +XXX,XX @@ static bool trans_BFMMLA(DisasContext *s, arg_rrrr_esz *a)
161
break;
60
if (!dc_isar_feature(aa64_sve_bf16, s)) {
162
default:
61
return false;
163
+ case 0x2f: /* FABS */
62
}
164
+ case 0x6f: /* FNEG */
63
- return gen_gvec_ool_zzzz(s, gen_helper_gvec_bfmmla,
165
g_assert_not_reached();
64
- a->rd, a->rn, a->rm, a->ra, 0);
166
}
65
+ return gen_gvec_ool_arg_zzzz(s, gen_helper_gvec_bfmmla, a, 0);
167
66
}
67
68
static bool do_BFMLAL_zzzw(DisasContext *s, arg_rrrr_esz *a, bool sel)
69
--
168
--
70
2.25.1
169
2.34.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
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-46-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-56-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 | 68 +++++++++++++++++---------------------
8
target/arm/tcg/a64.decode | 3 ++
11
1 file changed, 30 insertions(+), 38 deletions(-)
9
target/arm/tcg/translate-a64.c | 69 ++++++++++++++++++++++++----------
10
2 files changed, 53 insertions(+), 19 deletions(-)
12
11
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
14
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
16
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
17
@@ -XXX,XX +XXX,XX @@ static bool do_movz_zpz(DisasContext *s, int rd, int rn, int pg,
16
@@ -XXX,XX +XXX,XX @@ FABS_v 0.00 1110 1.1 00000 11111 0 ..... ..... @qrr_sd
18
return gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
17
19
}
18
FNEG_v 0.10 1110 111 11000 11111 0 ..... ..... @qrr_h
20
19
FNEG_v 0.10 1110 1.1 00000 11111 0 ..... ..... @qrr_sd
21
+static bool do_shift_zpzi(DisasContext *s, arg_rpri_esz *a, bool asr,
20
+
22
+ gen_helper_gvec_3 * const fns[4])
21
+FSQRT_v 0.10 1110 111 11001 11111 0 ..... ..... @qrr_h
22
+FSQRT_v 0.10 1110 1.1 00001 11111 0 ..... ..... @qrr_sd
23
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
24
index XXXXXXX..XXXXXXX 100644
25
--- a/target/arm/tcg/translate-a64.c
26
+++ b/target/arm/tcg/translate-a64.c
27
@@ -XXX,XX +XXX,XX @@ static bool do_fabs_fneg_v(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
28
TRANS(FABS_v, do_fabs_fneg_v, a, gen_gvec_fabs)
29
TRANS(FNEG_v, do_fabs_fneg_v, a, gen_gvec_fneg)
30
31
+static bool do_fp1_vector(DisasContext *s, arg_qrr_e *a,
32
+ const FPScalar1 *f, int rmode)
23
+{
33
+{
24
+ int max;
34
+ TCGv_i32 tcg_rmode = NULL;
35
+ TCGv_ptr fpst;
36
+ int check = fp_access_check_vector_hsd(s, a->q, a->esz);
25
+
37
+
26
+ if (a->esz < 0) {
38
+ if (check <= 0) {
27
+ /* Invalid tsz encoding -- see tszimm_esz. */
39
+ return check == 0;
28
+ return false;
29
+ }
40
+ }
30
+
41
+
31
+ /*
42
+ fpst = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
32
+ * Shift by element size is architecturally valid.
43
+ if (rmode >= 0) {
33
+ * For arithmetic right-shift, it's the same as by one less.
44
+ tcg_rmode = gen_set_rmode(rmode, fpst);
34
+ * For logical shifts and ASRD, it is a zeroing operation.
45
+ }
35
+ */
46
+
36
+ max = 8 << a->esz;
47
+ if (a->esz == MO_64) {
37
+ if (a->imm >= max) {
48
+ TCGv_i64 t64 = tcg_temp_new_i64();
38
+ if (asr) {
49
+
39
+ a->imm = max - 1;
50
+ for (int pass = 0; pass < 2; ++pass) {
40
+ } else {
51
+ read_vec_element(s, t64, a->rn, pass, MO_64);
41
+ return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
52
+ f->gen_d(t64, t64, fpst);
53
+ write_vec_element(s, t64, a->rd, pass, MO_64);
54
+ }
55
+ } else {
56
+ TCGv_i32 t32 = tcg_temp_new_i32();
57
+ void (*gen)(TCGv_i32, TCGv_i32, TCGv_ptr)
58
+ = (a->esz == MO_16 ? f->gen_h : f->gen_s);
59
+
60
+ for (int pass = 0, n = (a->q ? 16 : 8) >> a->esz; pass < n; ++pass) {
61
+ read_vec_element_i32(s, t32, a->rn, pass, a->esz);
62
+ gen(t32, t32, fpst);
63
+ write_vec_element_i32(s, t32, a->rd, pass, a->esz);
42
+ }
64
+ }
43
+ }
65
+ }
44
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
66
+ clear_vec_high(s, a->q, a->rd);
67
+
68
+ if (rmode >= 0) {
69
+ gen_restore_rmode(tcg_rmode, fpst);
70
+ }
71
+ return true;
45
+}
72
+}
46
+
73
+
47
static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
74
+TRANS(FSQRT_v, do_fp1_vector, a, &f_scalar_fsqrt, -1)
48
{
75
+
49
static gen_helper_gvec_3 * const fns[4] = {
76
/* Common vector code for handling integer to FP conversion */
50
gen_helper_sve_asr_zpzi_b, gen_helper_sve_asr_zpzi_h,
77
static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
51
gen_helper_sve_asr_zpzi_s, gen_helper_sve_asr_zpzi_d,
78
int elements, int is_signed,
52
};
79
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
53
- if (a->esz < 0) {
80
* requires them.
54
- /* Invalid tsz encoding -- see tszimm_esz. */
81
*/
55
- return false;
82
switch (opcode) {
56
- }
83
- case 0x7f: /* FSQRT */
57
- /* Shift by element size is architecturally valid. For
84
- gen_helper_vfp_sqrtd(tcg_rd, tcg_rn, tcg_fpstatus);
58
- arithmetic right-shift, it's the same as by one less. */
85
- break;
59
- a->imm = MIN(a->imm, (8 << a->esz) - 1);
86
case 0x1a: /* FCVTNS */
60
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
87
case 0x1b: /* FCVTMS */
61
+ return do_shift_zpzi(s, a, true, fns);
88
case 0x1c: /* FCVTAS */
89
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
90
case 0xb: /* ABS, NEG */
91
case 0x2f: /* FABS */
92
case 0x6f: /* FNEG */
93
+ case 0x7f: /* FSQRT */
94
g_assert_not_reached();
95
}
62
}
96
}
63
97
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
64
static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
98
}
65
@@ -XXX,XX +XXX,XX @@ static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
99
handle_2misc_fcmp_zero(s, opcode, false, u, is_q, size, rn, rd);
66
gen_helper_sve_lsr_zpzi_b, gen_helper_sve_lsr_zpzi_h,
100
return;
67
gen_helper_sve_lsr_zpzi_s, gen_helper_sve_lsr_zpzi_d,
101
- case 0x7f: /* FSQRT */
68
};
102
- need_fpstatus = true;
69
- if (a->esz < 0) {
103
- if (size == 3 && !is_q) {
70
- return false;
104
- unallocated_encoding(s);
71
- }
105
- return;
72
- /* Shift by element size is architecturally valid.
106
- }
73
- For logical shifts, it is a zeroing operation. */
107
- break;
74
- if (a->imm >= (8 << a->esz)) {
108
case 0x1a: /* FCVTNS */
75
- return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
109
case 0x1b: /* FCVTMS */
76
- } else {
110
case 0x3a: /* FCVTPS */
77
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
111
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
78
- }
112
case 0x56: /* FCVTXN, FCVTXN2 */
79
+ return do_shift_zpzi(s, a, false, fns);
113
case 0x2f: /* FABS */
80
}
114
case 0x6f: /* FNEG */
81
115
+ case 0x7f: /* FSQRT */
82
static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
116
unallocated_encoding(s);
83
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
117
return;
84
gen_helper_sve_lsl_zpzi_b, gen_helper_sve_lsl_zpzi_h,
118
}
85
gen_helper_sve_lsl_zpzi_s, gen_helper_sve_lsl_zpzi_d,
119
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
86
};
120
{
87
- if (a->esz < 0) {
121
/* Special cases for 32 bit elements */
88
- return false;
122
switch (opcode) {
89
- }
123
- case 0x7f: /* FSQRT */
90
- /* Shift by element size is architecturally valid.
124
- gen_helper_vfp_sqrts(tcg_res, tcg_op, tcg_fpstatus);
91
- For logical shifts, it is a zeroing operation. */
125
- break;
92
- if (a->imm >= (8 << a->esz)) {
126
case 0x1a: /* FCVTNS */
93
- return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
127
case 0x1b: /* FCVTMS */
94
- } else {
128
case 0x1c: /* FCVTAS */
95
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
129
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
96
- }
130
case 0x7: /* SQABS, SQNEG */
97
+ return do_shift_zpzi(s, a, false, fns);
131
case 0x2f: /* FABS */
98
}
132
case 0x6f: /* FNEG */
99
133
+ case 0x7f: /* FSQRT */
100
static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
134
g_assert_not_reached();
101
@@ -XXX,XX +XXX,XX @@ static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
135
}
102
gen_helper_sve_asrd_b, gen_helper_sve_asrd_h,
136
}
103
gen_helper_sve_asrd_s, gen_helper_sve_asrd_d,
137
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
104
};
138
break;
105
- if (a->esz < 0) {
139
case 0x7d: /* FRSQRTE */
106
- return false;
140
break;
107
- }
141
- case 0x7f: /* FSQRT (vector) */
108
- /* Shift by element size is architecturally valid. For arithmetic
142
- only_in_vector = true;
109
- right shift for division, it is a zeroing operation. */
143
- break;
110
- if (a->imm >= (8 << a->esz)) {
144
default:
111
- return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
145
case 0x2f: /* FABS */
112
- } else {
146
case 0x6f: /* FNEG */
113
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
147
+ case 0x7f: /* FSQRT (vector) */
114
- }
148
unallocated_encoding(s);
115
+ return do_shift_zpzi(s, a, false, fns);
149
return;
116
}
150
}
117
151
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
118
static gen_helper_gvec_3 * const sqshl_zpzi_fns[4] = {
152
case 0x7d: /* FRSQRTE */
153
gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus);
154
break;
155
- case 0x7f: /* FSQRT */
156
- gen_helper_vfp_sqrth(tcg_res, tcg_op, tcg_fpstatus);
157
- break;
158
default:
159
case 0x2f: /* FABS */
160
case 0x6f: /* FNEG */
161
+ case 0x7f: /* FSQRT */
162
g_assert_not_reached();
163
}
164
119
--
165
--
120
2.25.1
166
2.34.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-69-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-57-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 | 8 +++-----
8
target/arm/tcg/a64.decode | 26 +++++
9
1 file changed, 3 insertions(+), 5 deletions(-)
9
target/arm/tcg/translate-a64.c | 176 ++++++++++++---------------------
10
2 files changed, 88 insertions(+), 114 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_ppzi_flags(DisasContext *s, arg_rpri_esz *a,
16
@@ -XXX,XX +XXX,XX @@ FNEG_v 0.10 1110 1.1 00000 11111 0 ..... ..... @qrr_sd
17
18
FSQRT_v 0.10 1110 111 11001 11111 0 ..... ..... @qrr_h
19
FSQRT_v 0.10 1110 1.1 00001 11111 0 ..... ..... @qrr_sd
20
+
21
+FRINTN_v 0.00 1110 011 11001 10001 0 ..... ..... @qrr_h
22
+FRINTN_v 0.00 1110 0.1 00001 10001 0 ..... ..... @qrr_sd
23
+
24
+FRINTM_v 0.00 1110 011 11001 10011 0 ..... ..... @qrr_h
25
+FRINTM_v 0.00 1110 0.1 00001 10011 0 ..... ..... @qrr_sd
26
+
27
+FRINTP_v 0.00 1110 111 11001 10001 0 ..... ..... @qrr_h
28
+FRINTP_v 0.00 1110 1.1 00001 10001 0 ..... ..... @qrr_sd
29
+
30
+FRINTZ_v 0.00 1110 111 11001 10011 0 ..... ..... @qrr_h
31
+FRINTZ_v 0.00 1110 1.1 00001 10011 0 ..... ..... @qrr_sd
32
+
33
+FRINTA_v 0.10 1110 011 11001 10001 0 ..... ..... @qrr_h
34
+FRINTA_v 0.10 1110 0.1 00001 10001 0 ..... ..... @qrr_sd
35
+
36
+FRINTX_v 0.10 1110 011 11001 10011 0 ..... ..... @qrr_h
37
+FRINTX_v 0.10 1110 0.1 00001 10011 0 ..... ..... @qrr_sd
38
+
39
+FRINTI_v 0.10 1110 111 11001 10011 0 ..... ..... @qrr_h
40
+FRINTI_v 0.10 1110 1.1 00001 10011 0 ..... ..... @qrr_sd
41
+
42
+FRINT32Z_v 0.00 1110 0.1 00001 11101 0 ..... ..... @qrr_sd
43
+FRINT32X_v 0.10 1110 0.1 00001 11101 0 ..... ..... @qrr_sd
44
+FRINT64Z_v 0.00 1110 0.1 00001 11111 0 ..... ..... @qrr_sd
45
+FRINT64X_v 0.10 1110 0.1 00001 11111 0 ..... ..... @qrr_sd
46
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/target/arm/tcg/translate-a64.c
49
+++ b/target/arm/tcg/translate-a64.c
50
@@ -XXX,XX +XXX,XX @@ static bool do_fp1_vector(DisasContext *s, arg_qrr_e *a,
51
52
TRANS(FSQRT_v, do_fp1_vector, a, &f_scalar_fsqrt, -1)
53
54
+TRANS(FRINTN_v, do_fp1_vector, a, &f_scalar_frint, FPROUNDING_TIEEVEN)
55
+TRANS(FRINTP_v, do_fp1_vector, a, &f_scalar_frint, FPROUNDING_POSINF)
56
+TRANS(FRINTM_v, do_fp1_vector, a, &f_scalar_frint, FPROUNDING_NEGINF)
57
+TRANS(FRINTZ_v, do_fp1_vector, a, &f_scalar_frint, FPROUNDING_ZERO)
58
+TRANS(FRINTA_v, do_fp1_vector, a, &f_scalar_frint, FPROUNDING_TIEAWAY)
59
+TRANS(FRINTI_v, do_fp1_vector, a, &f_scalar_frint, -1)
60
+TRANS(FRINTX_v, do_fp1_vector, a, &f_scalar_frintx, -1)
61
+
62
+TRANS_FEAT(FRINT32Z_v, aa64_frint, do_fp1_vector, a,
63
+ &f_scalar_frint32, FPROUNDING_ZERO)
64
+TRANS_FEAT(FRINT32X_v, aa64_frint, do_fp1_vector, a, &f_scalar_frint32, -1)
65
+TRANS_FEAT(FRINT64Z_v, aa64_frint, do_fp1_vector, a,
66
+ &f_scalar_frint64, FPROUNDING_ZERO)
67
+TRANS_FEAT(FRINT64X_v, aa64_frint, do_fp1_vector, a, &f_scalar_frint64, -1)
68
+
69
/* Common vector code for handling integer to FP conversion */
70
static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
71
int elements, int is_signed,
72
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
73
case 0x7b: /* FCVTZU */
74
gen_helper_vfp_touqd(tcg_rd, tcg_rn, tcg_constant_i32(0), tcg_fpstatus);
75
break;
76
- case 0x18: /* FRINTN */
77
- case 0x19: /* FRINTM */
78
- case 0x38: /* FRINTP */
79
- case 0x39: /* FRINTZ */
80
- case 0x58: /* FRINTA */
81
- case 0x79: /* FRINTI */
82
- gen_helper_rintd(tcg_rd, tcg_rn, tcg_fpstatus);
83
- break;
84
- case 0x59: /* FRINTX */
85
- gen_helper_rintd_exact(tcg_rd, tcg_rn, tcg_fpstatus);
86
- break;
87
- case 0x1e: /* FRINT32Z */
88
- case 0x5e: /* FRINT32X */
89
- gen_helper_frint32_d(tcg_rd, tcg_rn, tcg_fpstatus);
90
- break;
91
- case 0x1f: /* FRINT64Z */
92
- case 0x5f: /* FRINT64X */
93
- gen_helper_frint64_d(tcg_rd, tcg_rn, tcg_fpstatus);
94
- break;
95
default:
96
case 0x4: /* CLS, CLZ */
97
case 0x5: /* NOT */
98
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_64(DisasContext *s, int opcode, bool u,
99
case 0x2f: /* FABS */
100
case 0x6f: /* FNEG */
101
case 0x7f: /* FSQRT */
102
+ case 0x18: /* FRINTN */
103
+ case 0x19: /* FRINTM */
104
+ case 0x38: /* FRINTP */
105
+ case 0x39: /* FRINTZ */
106
+ case 0x58: /* FRINTA */
107
+ case 0x79: /* FRINTI */
108
+ case 0x59: /* FRINTX */
109
+ case 0x1e: /* FRINT32Z */
110
+ case 0x5e: /* FRINT32X */
111
+ case 0x1f: /* FRINT64Z */
112
+ case 0x5f: /* FRINT64X */
113
g_assert_not_reached();
114
}
16
}
115
}
17
116
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
18
#define DO_PPZI(NAME, name) \
117
}
19
-static bool trans_##NAME##_ppzi(DisasContext *s, arg_rpri_esz *a) \
118
handle_2misc_widening(s, opcode, is_q, size, rn, rd);
20
-{ \
119
return;
21
- static gen_helper_gvec_flags_3 * const fns[4] = { \
120
- case 0x18: /* FRINTN */
22
+ static gen_helper_gvec_flags_3 * const name##_ppzi_fns[4] = { \
121
- case 0x19: /* FRINTM */
23
gen_helper_sve_##name##_ppzi_b, gen_helper_sve_##name##_ppzi_h, \
122
- case 0x38: /* FRINTP */
24
gen_helper_sve_##name##_ppzi_s, gen_helper_sve_##name##_ppzi_d, \
123
- case 0x39: /* FRINTZ */
25
}; \
124
- rmode = extract32(opcode, 5, 1) | (extract32(opcode, 0, 1) << 1);
26
- return do_ppzi_flags(s, a, fns[a->esz]); \
125
- /* fall through */
27
-}
126
- case 0x59: /* FRINTX */
28
+ TRANS_FEAT(NAME##_ppzi, aa64_sve, do_ppzi_flags, a, \
127
- case 0x79: /* FRINTI */
29
+ name##_ppzi_fns[a->esz])
128
- need_fpstatus = true;
30
129
- if (size == 3 && !is_q) {
31
DO_PPZI(CMPEQ, cmpeq)
130
- unallocated_encoding(s);
32
DO_PPZI(CMPNE, cmpne)
131
- return;
132
- }
133
- break;
134
- case 0x58: /* FRINTA */
135
- rmode = FPROUNDING_TIEAWAY;
136
- need_fpstatus = true;
137
- if (size == 3 && !is_q) {
138
- unallocated_encoding(s);
139
- return;
140
- }
141
- break;
142
case 0x7c: /* URSQRTE */
143
if (size == 3) {
144
unallocated_encoding(s);
145
return;
146
}
147
break;
148
- case 0x1e: /* FRINT32Z */
149
- case 0x1f: /* FRINT64Z */
150
- rmode = FPROUNDING_ZERO;
151
- /* fall through */
152
- case 0x5e: /* FRINT32X */
153
- case 0x5f: /* FRINT64X */
154
- need_fpstatus = true;
155
- if ((size == 3 && !is_q) || !dc_isar_feature(aa64_frint, s)) {
156
- unallocated_encoding(s);
157
- return;
158
- }
159
- break;
160
default:
161
case 0x16: /* FCVTN, FCVTN2 */
162
case 0x36: /* BFCVTN, BFCVTN2 */
163
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
164
case 0x2f: /* FABS */
165
case 0x6f: /* FNEG */
166
case 0x7f: /* FSQRT */
167
+ case 0x18: /* FRINTN */
168
+ case 0x19: /* FRINTM */
169
+ case 0x38: /* FRINTP */
170
+ case 0x39: /* FRINTZ */
171
+ case 0x59: /* FRINTX */
172
+ case 0x79: /* FRINTI */
173
+ case 0x58: /* FRINTA */
174
+ case 0x1e: /* FRINT32Z */
175
+ case 0x1f: /* FRINT64Z */
176
+ case 0x5e: /* FRINT32X */
177
+ case 0x5f: /* FRINT64X */
178
unallocated_encoding(s);
179
return;
180
}
181
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
182
gen_helper_vfp_touls(tcg_res, tcg_op,
183
tcg_constant_i32(0), tcg_fpstatus);
184
break;
185
- case 0x18: /* FRINTN */
186
- case 0x19: /* FRINTM */
187
- case 0x38: /* FRINTP */
188
- case 0x39: /* FRINTZ */
189
- case 0x58: /* FRINTA */
190
- case 0x79: /* FRINTI */
191
- gen_helper_rints(tcg_res, tcg_op, tcg_fpstatus);
192
- break;
193
- case 0x59: /* FRINTX */
194
- gen_helper_rints_exact(tcg_res, tcg_op, tcg_fpstatus);
195
- break;
196
case 0x7c: /* URSQRTE */
197
gen_helper_rsqrte_u32(tcg_res, tcg_op);
198
break;
199
- case 0x1e: /* FRINT32Z */
200
- case 0x5e: /* FRINT32X */
201
- gen_helper_frint32_s(tcg_res, tcg_op, tcg_fpstatus);
202
- break;
203
- case 0x1f: /* FRINT64Z */
204
- case 0x5f: /* FRINT64X */
205
- gen_helper_frint64_s(tcg_res, tcg_op, tcg_fpstatus);
206
- break;
207
default:
208
case 0x7: /* SQABS, SQNEG */
209
case 0x2f: /* FABS */
210
case 0x6f: /* FNEG */
211
case 0x7f: /* FSQRT */
212
+ case 0x18: /* FRINTN */
213
+ case 0x19: /* FRINTM */
214
+ case 0x38: /* FRINTP */
215
+ case 0x39: /* FRINTZ */
216
+ case 0x58: /* FRINTA */
217
+ case 0x79: /* FRINTI */
218
+ case 0x59: /* FRINTX */
219
+ case 0x1e: /* FRINT32Z */
220
+ case 0x5e: /* FRINT32X */
221
+ case 0x1f: /* FRINT64Z */
222
+ case 0x5f: /* FRINT64X */
223
g_assert_not_reached();
224
}
225
}
226
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
227
int rn, rd;
228
bool is_q;
229
bool is_scalar;
230
- bool only_in_vector = false;
231
232
int pass;
233
TCGv_i32 tcg_rmode = NULL;
234
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
235
case 0x3d: /* FRECPE */
236
case 0x3f: /* FRECPX */
237
break;
238
- case 0x18: /* FRINTN */
239
- only_in_vector = true;
240
- rmode = FPROUNDING_TIEEVEN;
241
- break;
242
- case 0x19: /* FRINTM */
243
- only_in_vector = true;
244
- rmode = FPROUNDING_NEGINF;
245
- break;
246
- case 0x38: /* FRINTP */
247
- only_in_vector = true;
248
- rmode = FPROUNDING_POSINF;
249
- break;
250
- case 0x39: /* FRINTZ */
251
- only_in_vector = true;
252
- rmode = FPROUNDING_ZERO;
253
- break;
254
- case 0x58: /* FRINTA */
255
- only_in_vector = true;
256
- rmode = FPROUNDING_TIEAWAY;
257
- break;
258
- case 0x59: /* FRINTX */
259
- case 0x79: /* FRINTI */
260
- only_in_vector = true;
261
- /* current rounding mode */
262
- break;
263
case 0x1a: /* FCVTNS */
264
rmode = FPROUNDING_TIEEVEN;
265
break;
266
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
267
case 0x2f: /* FABS */
268
case 0x6f: /* FNEG */
269
case 0x7f: /* FSQRT (vector) */
270
+ case 0x18: /* FRINTN */
271
+ case 0x19: /* FRINTM */
272
+ case 0x38: /* FRINTP */
273
+ case 0x39: /* FRINTZ */
274
+ case 0x58: /* FRINTA */
275
+ case 0x59: /* FRINTX */
276
+ case 0x79: /* FRINTI */
277
unallocated_encoding(s);
278
return;
279
}
280
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
281
unallocated_encoding(s);
282
return;
283
}
284
- /* FRINTxx is only in the vector form */
285
- if (only_in_vector) {
286
- unallocated_encoding(s);
287
- return;
288
- }
289
}
290
291
if (!fp_access_check(s)) {
292
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
293
case 0x7b: /* FCVTZU */
294
gen_helper_advsimd_f16touinth(tcg_res, tcg_op, tcg_fpstatus);
295
break;
296
- case 0x18: /* FRINTN */
297
- case 0x19: /* FRINTM */
298
- case 0x38: /* FRINTP */
299
- case 0x39: /* FRINTZ */
300
- case 0x58: /* FRINTA */
301
- case 0x79: /* FRINTI */
302
- gen_helper_advsimd_rinth(tcg_res, tcg_op, tcg_fpstatus);
303
- break;
304
- case 0x59: /* FRINTX */
305
- gen_helper_advsimd_rinth_exact(tcg_res, tcg_op, tcg_fpstatus);
306
- break;
307
case 0x7d: /* FRSQRTE */
308
gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus);
309
break;
310
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
311
case 0x2f: /* FABS */
312
case 0x6f: /* FNEG */
313
case 0x7f: /* FSQRT */
314
+ case 0x18: /* FRINTN */
315
+ case 0x19: /* FRINTM */
316
+ case 0x38: /* FRINTP */
317
+ case 0x39: /* FRINTZ */
318
+ case 0x58: /* FRINTA */
319
+ case 0x79: /* FRINTI */
320
+ case 0x59: /* FRINTX */
321
g_assert_not_reached();
322
}
323
33
--
324
--
34
2.25.1
325
2.34.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
Arm silliness with naming, the scalar insns described
4
as part of the vector instructions, as separate from
5
the "regular" scalar insns which output to general registers.
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-67-richard.henderson@linaro.org
9
Message-id: 20241211163036.2297116-58-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 | 28 ++++++++++++----------------
12
target/arm/tcg/a64.decode | 30 ++++++++
9
1 file changed, 12 insertions(+), 16 deletions(-)
13
target/arm/tcg/translate-a64.c | 133 ++++++++++++++-------------------
14
2 files changed, 86 insertions(+), 77 deletions(-)
10
15
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
18
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_ppzz_flags(DisasContext *s, arg_rprr_esz *a,
20
@@ -XXX,XX +XXX,XX @@ UQXTN_s 0111 1110 ..1 00001 01001 0 ..... ..... @rr_e
21
22
FCVTXN_s 0111 1110 011 00001 01101 0 ..... ..... @rr_s
23
24
+@icvt_h . ....... .. ...... ...... rn:5 rd:5 \
25
+ &fcvt sf=0 esz=1 shift=0
26
+@icvt_sd . ....... .. ...... ...... rn:5 rd:5 \
27
+ &fcvt sf=0 esz=%esz_sd shift=0
28
+
29
+FCVTNS_f 0101 1110 011 11001 10101 0 ..... ..... @icvt_h
30
+FCVTNS_f 0101 1110 0.1 00001 10101 0 ..... ..... @icvt_sd
31
+FCVTNU_f 0111 1110 011 11001 10101 0 ..... ..... @icvt_h
32
+FCVTNU_f 0111 1110 0.1 00001 10101 0 ..... ..... @icvt_sd
33
+
34
+FCVTPS_f 0101 1110 111 11001 10101 0 ..... ..... @icvt_h
35
+FCVTPS_f 0101 1110 1.1 00001 10101 0 ..... ..... @icvt_sd
36
+FCVTPU_f 0111 1110 111 11001 10101 0 ..... ..... @icvt_h
37
+FCVTPU_f 0111 1110 1.1 00001 10101 0 ..... ..... @icvt_sd
38
+
39
+FCVTMS_f 0101 1110 011 11001 10111 0 ..... ..... @icvt_h
40
+FCVTMS_f 0101 1110 0.1 00001 10111 0 ..... ..... @icvt_sd
41
+FCVTMU_f 0111 1110 011 11001 10111 0 ..... ..... @icvt_h
42
+FCVTMU_f 0111 1110 0.1 00001 10111 0 ..... ..... @icvt_sd
43
+
44
+FCVTZS_f 0101 1110 111 11001 10111 0 ..... ..... @icvt_h
45
+FCVTZS_f 0101 1110 1.1 00001 10111 0 ..... ..... @icvt_sd
46
+FCVTZU_f 0111 1110 111 11001 10111 0 ..... ..... @icvt_h
47
+FCVTZU_f 0111 1110 1.1 00001 10111 0 ..... ..... @icvt_sd
48
+
49
+FCVTAS_f 0101 1110 011 11001 11001 0 ..... ..... @icvt_h
50
+FCVTAS_f 0101 1110 0.1 00001 11001 0 ..... ..... @icvt_sd
51
+FCVTAU_f 0111 1110 011 11001 11001 0 ..... ..... @icvt_h
52
+FCVTAU_f 0111 1110 0.1 00001 11001 0 ..... ..... @icvt_sd
53
+
54
# Advanced SIMD two-register miscellaneous
55
56
SQABS_v 0.00 1110 ..1 00000 01111 0 ..... ..... @qrr_e
57
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/target/arm/tcg/translate-a64.c
60
+++ b/target/arm/tcg/translate-a64.c
61
@@ -XXX,XX +XXX,XX @@ static void do_fcvt_scalar(DisasContext *s, MemOp out, MemOp esz,
62
tcg_shift, tcg_fpstatus);
63
tcg_gen_extu_i32_i64(tcg_out, tcg_single);
64
break;
65
+ case MO_16 | MO_SIGN:
66
+ gen_helper_vfp_toshh(tcg_single, tcg_single,
67
+ tcg_shift, tcg_fpstatus);
68
+ tcg_gen_extu_i32_i64(tcg_out, tcg_single);
69
+ break;
70
+ case MO_16:
71
+ gen_helper_vfp_touhh(tcg_single, tcg_single,
72
+ tcg_shift, tcg_fpstatus);
73
+ tcg_gen_extu_i32_i64(tcg_out, tcg_single);
74
+ break;
75
default:
76
g_assert_not_reached();
77
}
78
@@ -XXX,XX +XXX,XX @@ TRANS(FCVTZU_g, do_fcvt_g, a, FPROUNDING_ZERO, false)
79
TRANS(FCVTAS_g, do_fcvt_g, a, FPROUNDING_TIEAWAY, true)
80
TRANS(FCVTAU_g, do_fcvt_g, a, FPROUNDING_TIEAWAY, false)
81
82
+/*
83
+ * FCVT* (vector), scalar version.
84
+ * Which sounds weird, but really just means output to fp register
85
+ * instead of output to general register. Input and output element
86
+ * size are always equal.
87
+ */
88
+static bool do_fcvt_f(DisasContext *s, arg_fcvt *a,
89
+ ARMFPRounding rmode, bool is_signed)
90
+{
91
+ TCGv_i64 tcg_int;
92
+ int check = fp_access_check_scalar_hsd(s, a->esz);
93
+
94
+ if (check <= 0) {
95
+ return check == 0;
96
+ }
97
+
98
+ tcg_int = tcg_temp_new_i64();
99
+ do_fcvt_scalar(s, a->esz | (is_signed ? MO_SIGN : 0),
100
+ a->esz, tcg_int, a->shift, a->rn, rmode);
101
+
102
+ clear_vec(s, a->rd);
103
+ write_vec_element(s, tcg_int, a->rd, 0, a->esz);
104
+ return true;
105
+}
106
+
107
+TRANS(FCVTNS_f, do_fcvt_f, a, FPROUNDING_TIEEVEN, true)
108
+TRANS(FCVTNU_f, do_fcvt_f, a, FPROUNDING_TIEEVEN, false)
109
+TRANS(FCVTPS_f, do_fcvt_f, a, FPROUNDING_POSINF, true)
110
+TRANS(FCVTPU_f, do_fcvt_f, a, FPROUNDING_POSINF, false)
111
+TRANS(FCVTMS_f, do_fcvt_f, a, FPROUNDING_NEGINF, true)
112
+TRANS(FCVTMU_f, do_fcvt_f, a, FPROUNDING_NEGINF, false)
113
+TRANS(FCVTZS_f, do_fcvt_f, a, FPROUNDING_ZERO, true)
114
+TRANS(FCVTZU_f, do_fcvt_f, a, FPROUNDING_ZERO, false)
115
+TRANS(FCVTAS_f, do_fcvt_f, a, FPROUNDING_TIEAWAY, true)
116
+TRANS(FCVTAU_f, do_fcvt_f, a, FPROUNDING_TIEAWAY, false)
117
+
118
static bool trans_FJCVTZS(DisasContext *s, arg_FJCVTZS *a)
119
{
120
if (!dc_isar_feature(aa64_jscvt, s)) {
121
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
122
int opcode = extract32(insn, 12, 5);
123
int size = extract32(insn, 22, 2);
124
bool u = extract32(insn, 29, 1);
125
- bool is_fcvt = false;
126
- int rmode;
127
- TCGv_i32 tcg_rmode;
128
- TCGv_ptr tcg_fpstatus;
129
130
switch (opcode) {
131
case 0xc ... 0xf:
132
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
133
case 0x5b: /* FCVTMU */
134
case 0x7a: /* FCVTPU */
135
case 0x7b: /* FCVTZU */
136
- is_fcvt = true;
137
- rmode = extract32(opcode, 5, 1) | (extract32(opcode, 0, 1) << 1);
138
- break;
139
case 0x1c: /* FCVTAS */
140
case 0x5c: /* FCVTAU */
141
- /* TIEAWAY doesn't fit in the usual rounding mode encoding */
142
- is_fcvt = true;
143
- rmode = FPROUNDING_TIEAWAY;
144
- break;
145
case 0x56: /* FCVTXN, FCVTXN2 */
146
default:
147
unallocated_encoding(s);
148
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
149
unallocated_encoding(s);
150
return;
151
}
152
-
153
- if (!fp_access_check(s)) {
154
- return;
155
- }
156
-
157
- if (is_fcvt) {
158
- tcg_fpstatus = fpstatus_ptr(FPST_FPCR);
159
- tcg_rmode = gen_set_rmode(rmode, tcg_fpstatus);
160
- } else {
161
- tcg_fpstatus = NULL;
162
- tcg_rmode = NULL;
163
- }
164
-
165
- if (size == 3) {
166
- TCGv_i64 tcg_rn = read_fp_dreg(s, rn);
167
- TCGv_i64 tcg_rd = tcg_temp_new_i64();
168
-
169
- handle_2misc_64(s, opcode, u, tcg_rd, tcg_rn, tcg_rmode, tcg_fpstatus);
170
- write_fp_dreg(s, rd, tcg_rd);
171
- } else {
172
- TCGv_i32 tcg_rn = tcg_temp_new_i32();
173
- TCGv_i32 tcg_rd = tcg_temp_new_i32();
174
-
175
- read_vec_element_i32(s, tcg_rn, rn, 0, size);
176
-
177
- switch (opcode) {
178
- case 0x1a: /* FCVTNS */
179
- case 0x1b: /* FCVTMS */
180
- case 0x1c: /* FCVTAS */
181
- case 0x3a: /* FCVTPS */
182
- case 0x3b: /* FCVTZS */
183
- gen_helper_vfp_tosls(tcg_rd, tcg_rn, tcg_constant_i32(0),
184
- tcg_fpstatus);
185
- break;
186
- case 0x5a: /* FCVTNU */
187
- case 0x5b: /* FCVTMU */
188
- case 0x5c: /* FCVTAU */
189
- case 0x7a: /* FCVTPU */
190
- case 0x7b: /* FCVTZU */
191
- gen_helper_vfp_touls(tcg_rd, tcg_rn, tcg_constant_i32(0),
192
- tcg_fpstatus);
193
- break;
194
- default:
195
- case 0x7: /* SQABS, SQNEG */
196
- g_assert_not_reached();
197
- }
198
-
199
- write_fp_sreg(s, rd, tcg_rd);
200
- }
201
-
202
- if (is_fcvt) {
203
- gen_restore_rmode(tcg_rmode, tcg_fpstatus);
204
- }
205
+ g_assert_not_reached();
16
}
206
}
17
207
18
#define DO_PPZZ(NAME, name) \
208
/* AdvSIMD shift by immediate
19
-static bool trans_##NAME##_ppzz(DisasContext *s, arg_rprr_esz *a) \
209
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
20
-{ \
210
TCGv_i32 tcg_res = tcg_temp_new_i32();
21
- static gen_helper_gvec_flags_4 * const fns[4] = { \
211
22
- gen_helper_sve_##name##_ppzz_b, gen_helper_sve_##name##_ppzz_h, \
212
switch (fpop) {
23
- gen_helper_sve_##name##_ppzz_s, gen_helper_sve_##name##_ppzz_d, \
213
- case 0x1a: /* FCVTNS */
24
- }; \
214
- case 0x1b: /* FCVTMS */
25
- return do_ppzz_flags(s, a, fns[a->esz]); \
215
- case 0x1c: /* FCVTAS */
26
-}
216
- case 0x3a: /* FCVTPS */
27
+ static gen_helper_gvec_flags_4 * const name##_ppzz_fns[4] = { \
217
- case 0x3b: /* FCVTZS */
28
+ gen_helper_sve_##name##_ppzz_b, gen_helper_sve_##name##_ppzz_h, \
218
- gen_helper_advsimd_f16tosinth(tcg_res, tcg_op, tcg_fpstatus);
29
+ gen_helper_sve_##name##_ppzz_s, gen_helper_sve_##name##_ppzz_d, \
219
- break;
30
+ }; \
220
case 0x3d: /* FRECPE */
31
+ TRANS_FEAT(NAME##_ppzz, aa64_sve, do_ppzz_flags, \
221
gen_helper_recpe_f16(tcg_res, tcg_op, tcg_fpstatus);
32
+ a, name##_ppzz_fns[a->esz])
222
break;
33
223
case 0x3f: /* FRECPX */
34
DO_PPZZ(CMPEQ, cmpeq)
224
gen_helper_frecpx_f16(tcg_res, tcg_op, tcg_fpstatus);
35
DO_PPZZ(CMPNE, cmpne)
225
break;
36
@@ -XXX,XX +XXX,XX @@ DO_PPZZ(CMPHS, cmphs)
226
+ case 0x7d: /* FRSQRTE */
37
#undef DO_PPZZ
227
+ gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus);
38
228
+ break;
39
#define DO_PPZW(NAME, name) \
229
+ default:
40
-static bool trans_##NAME##_ppzw(DisasContext *s, arg_rprr_esz *a) \
230
+ case 0x1a: /* FCVTNS */
41
-{ \
231
+ case 0x1b: /* FCVTMS */
42
- static gen_helper_gvec_flags_4 * const fns[4] = { \
232
+ case 0x1c: /* FCVTAS */
43
- gen_helper_sve_##name##_ppzw_b, gen_helper_sve_##name##_ppzw_h, \
233
+ case 0x3a: /* FCVTPS */
44
- gen_helper_sve_##name##_ppzw_s, NULL \
234
+ case 0x3b: /* FCVTZS */
45
- }; \
235
case 0x5a: /* FCVTNU */
46
- return do_ppzz_flags(s, a, fns[a->esz]); \
236
case 0x5b: /* FCVTMU */
47
-}
237
case 0x5c: /* FCVTAU */
48
+ static gen_helper_gvec_flags_4 * const name##_ppzw_fns[4] = { \
238
case 0x7a: /* FCVTPU */
49
+ gen_helper_sve_##name##_ppzw_b, gen_helper_sve_##name##_ppzw_h, \
239
case 0x7b: /* FCVTZU */
50
+ gen_helper_sve_##name##_ppzw_s, NULL \
240
- gen_helper_advsimd_f16touinth(tcg_res, tcg_op, tcg_fpstatus);
51
+ }; \
241
- break;
52
+ TRANS_FEAT(NAME##_ppzw, aa64_sve, do_ppzz_flags, \
242
- case 0x7d: /* FRSQRTE */
53
+ a, name##_ppzw_fns[a->esz])
243
- gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus);
54
244
- break;
55
DO_PPZW(CMPEQ, cmpeq)
245
- default:
56
DO_PPZW(CMPNE, cmpne)
246
g_assert_not_reached();
247
}
248
57
--
249
--
58
2.25.1
250
2.34.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-68-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-59-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
target/arm/tcg/a64.decode | 19 +++++++++++++++++++
9
1 file changed, 8 insertions(+), 20 deletions(-)
9
target/arm/tcg/translate-a64.c | 4 +---
10
2 files changed, 20 insertions(+), 3 deletions(-)
10
11
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
14
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
15
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ DO_SVE2_ZZZ_NARROW(SUBHNT, subhnt)
16
@@ -XXX,XX +XXX,XX @@ FCVTAS_f 0101 1110 0.1 00001 11001 0 ..... ..... @icvt_sd
16
DO_SVE2_ZZZ_NARROW(RSUBHNB, rsubhnb)
17
FCVTAU_f 0111 1110 011 11001 11001 0 ..... ..... @icvt_h
17
DO_SVE2_ZZZ_NARROW(RSUBHNT, rsubhnt)
18
FCVTAU_f 0111 1110 0.1 00001 11001 0 ..... ..... @icvt_sd
18
19
19
-static bool do_sve2_ppzz_flags(DisasContext *s, arg_rprr_esz *a,
20
+%fcvt_f_sh_h 16:4 !function=rsub_16
20
- gen_helper_gvec_flags_4 *fn)
21
+%fcvt_f_sh_s 16:5 !function=rsub_32
21
-{
22
+%fcvt_f_sh_d 16:6 !function=rsub_64
22
- if (!dc_isar_feature(aa64_sve2, s)) {
23
+
23
- return false;
24
+@fcvt_fixed_h .... .... . 001 .... ...... rn:5 rd:5 \
24
- }
25
+ &fcvt sf=0 esz=1 shift=%fcvt_f_sh_h
25
- return do_ppzz_flags(s, a, fn);
26
+@fcvt_fixed_s .... .... . 01 ..... ...... rn:5 rd:5 \
26
-}
27
+ &fcvt sf=0 esz=2 shift=%fcvt_f_sh_s
27
+static gen_helper_gvec_flags_4 * const match_fns[4] = {
28
+@fcvt_fixed_d .... .... . 1 ...... ...... rn:5 rd:5 \
28
+ gen_helper_sve2_match_ppzz_b, gen_helper_sve2_match_ppzz_h, NULL, NULL
29
+ &fcvt sf=0 esz=3 shift=%fcvt_f_sh_d
29
+};
30
+
30
+TRANS_FEAT(MATCH, aa64_sve2, do_ppzz_flags, a, match_fns[a->esz])
31
+FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_h
31
32
+FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_s
32
-#define DO_SVE2_PPZZ_MATCH(NAME, name) \
33
+FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_d
33
-static bool trans_##NAME(DisasContext *s, arg_rprr_esz *a) \
34
+
34
-{ \
35
+FCVTZU_f 0111 1111 0 ....... 111111 ..... ..... @fcvt_fixed_h
35
- static gen_helper_gvec_flags_4 * const fns[4] = { \
36
+FCVTZU_f 0111 1111 0 ....... 111111 ..... ..... @fcvt_fixed_s
36
- gen_helper_sve2_##name##_ppzz_b, gen_helper_sve2_##name##_ppzz_h, \
37
+FCVTZU_f 0111 1111 0 ....... 111111 ..... ..... @fcvt_fixed_d
37
- NULL, NULL \
38
+
38
- }; \
39
# Advanced SIMD two-register miscellaneous
39
- return do_sve2_ppzz_flags(s, a, fns[a->esz]); \
40
40
-}
41
SQABS_v 0.00 1110 ..1 00000 01111 0 ..... ..... @qrr_e
41
-
42
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
42
-DO_SVE2_PPZZ_MATCH(MATCH, match)
43
index XXXXXXX..XXXXXXX 100644
43
-DO_SVE2_PPZZ_MATCH(NMATCH, nmatch)
44
--- a/target/arm/tcg/translate-a64.c
44
+static gen_helper_gvec_flags_4 * const nmatch_fns[4] = {
45
+++ b/target/arm/tcg/translate-a64.c
45
+ gen_helper_sve2_nmatch_ppzz_b, gen_helper_sve2_nmatch_ppzz_h, NULL, NULL
46
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_shift_imm(DisasContext *s, uint32_t insn)
46
+};
47
handle_simd_shift_intfp_conv(s, true, false, is_u, immh, immb,
47
+TRANS_FEAT(NMATCH, aa64_sve2, do_ppzz_flags, a, nmatch_fns[a->esz])
48
opcode, rn, rd);
48
49
break;
49
static gen_helper_gvec_4 * const histcnt_fns[4] = {
50
- case 0x1f: /* FCVTZS, FCVTZU */
50
NULL, NULL, gen_helper_sve2_histcnt_s, gen_helper_sve2_histcnt_d
51
- handle_simd_shift_fpint_conv(s, true, false, is_u, immh, immb, rn, rd);
52
- break;
53
default:
54
case 0x00: /* SSHR / USHR */
55
case 0x02: /* SSRA / USRA */
56
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_shift_imm(DisasContext *s, uint32_t insn)
57
case 0x11: /* SQRSHRUN */
58
case 0x12: /* SQSHRN, UQSHRN */
59
case 0x13: /* SQRSHRN, UQRSHRN */
60
+ case 0x1f: /* FCVTZS, FCVTZU */
61
unallocated_encoding(s);
62
break;
63
}
51
--
64
--
52
2.25.1
65
2.34.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
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-2-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-60-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.h | 11 +++++++++++
8
target/arm/tcg/a64.decode | 6 ++++++
11
1 file changed, 11 insertions(+)
9
target/arm/tcg/translate-a64.c | 35 ++++++++++++++++++++++++----------
10
2 files changed, 31 insertions(+), 10 deletions(-)
12
11
13
diff --git a/target/arm/translate.h b/target/arm/translate.h
12
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
14
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate.h
14
--- a/target/arm/tcg/a64.decode
16
+++ b/target/arm/translate.h
15
+++ b/target/arm/tcg/a64.decode
17
@@ -XXX,XX +XXX,XX @@ static inline MemOp finalize_memop(DisasContext *s, MemOp opc)
16
@@ -XXX,XX +XXX,XX @@ FCVTXN_s 0111 1110 011 00001 01101 0 ..... ..... @rr_s
18
*/
17
@icvt_sd . ....... .. ...... ...... rn:5 rd:5 \
19
uint64_t asimd_imm_const(uint32_t imm, int cmode, int op);
18
&fcvt sf=0 esz=%esz_sd shift=0
19
20
+SCVTF_f 0101 1110 011 11001 11011 0 ..... ..... @icvt_h
21
+SCVTF_f 0101 1110 0.1 00001 11011 0 ..... ..... @icvt_sd
22
+
23
+UCVTF_f 0111 1110 011 11001 11011 0 ..... ..... @icvt_h
24
+UCVTF_f 0111 1110 0.1 00001 11011 0 ..... ..... @icvt_sd
25
+
26
FCVTNS_f 0101 1110 011 11001 10101 0 ..... ..... @icvt_h
27
FCVTNS_f 0101 1110 0.1 00001 10101 0 ..... ..... @icvt_sd
28
FCVTNU_f 0111 1110 011 11001 10101 0 ..... ..... @icvt_h
29
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/tcg/translate-a64.c
32
+++ b/target/arm/tcg/translate-a64.c
33
@@ -XXX,XX +XXX,XX @@ static bool do_cvtf_g(DisasContext *s, arg_fcvt *a, bool is_signed)
34
TRANS(SCVTF_g, do_cvtf_g, a, true)
35
TRANS(UCVTF_g, do_cvtf_g, a, false)
20
36
21
+/*
37
+/*
22
+ * Helpers for implementing sets of trans_* functions.
38
+ * [US]CVTF (vector), scalar version.
23
+ * Defer the implementation of NAME to FUNC, with optional extra arguments.
39
+ * Which sounds weird, but really just means input from fp register
40
+ * instead of input from general register. Input and output element
41
+ * size are always equal.
24
+ */
42
+ */
25
+#define TRANS(NAME, FUNC, ...) \
43
+static bool do_cvtf_f(DisasContext *s, arg_fcvt *a, bool is_signed)
26
+ static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
44
+{
27
+ { return FUNC(s, __VA_ARGS__); }
45
+ TCGv_i64 tcg_int;
28
+#define TRANS_FEAT(NAME, FEAT, FUNC, ...) \
46
+ int check = fp_access_check_scalar_hsd(s, a->esz);
29
+ static bool trans_##NAME(DisasContext *s, arg_##NAME *a) \
30
+ { return dc_isar_feature(FEAT, s) && FUNC(s, __VA_ARGS__); }
31
+
47
+
32
#endif /* TARGET_ARM_TRANSLATE_H */
48
+ if (check <= 0) {
49
+ return check == 0;
50
+ }
51
+
52
+ tcg_int = tcg_temp_new_i64();
53
+ read_vec_element(s, tcg_int, a->rn, 0, a->esz | (is_signed ? MO_SIGN : 0));
54
+ return do_cvtf_scalar(s, a->esz, a->rd, a->shift, tcg_int, is_signed);
55
+}
56
+
57
+TRANS(SCVTF_f, do_cvtf_f, a, true)
58
+TRANS(UCVTF_f, do_cvtf_f, a, false)
59
+
60
static void do_fcvt_scalar(DisasContext *s, MemOp out, MemOp esz,
61
TCGv_i64 tcg_out, int shift, int rn,
62
ARMFPRounding rmode)
63
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
64
case 0x6d: /* FCMLE (zero) */
65
handle_2misc_fcmp_zero(s, opcode, true, u, true, size, rn, rd);
66
return;
67
- case 0x1d: /* SCVTF */
68
- case 0x5d: /* UCVTF */
69
- {
70
- bool is_signed = (opcode == 0x1d);
71
- if (!fp_access_check(s)) {
72
- return;
73
- }
74
- handle_simd_intfp_conv(s, rd, rn, 1, is_signed, 0, size);
75
- return;
76
- }
77
case 0x3d: /* FRECPE */
78
case 0x3f: /* FRECPX */
79
case 0x7d: /* FRSQRTE */
80
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
81
case 0x1c: /* FCVTAS */
82
case 0x5c: /* FCVTAU */
83
case 0x56: /* FCVTXN, FCVTXN2 */
84
+ case 0x1d: /* SCVTF */
85
+ case 0x5d: /* UCVTF */
86
default:
87
unallocated_encoding(s);
88
return;
33
--
89
--
34
2.25.1
90
2.34.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 disas_simd_scalar_shift_imm as these were the
4
last insns decoded by that function.
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-61-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-61-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/tcg/a64.decode | 8 ++++++
9
1 file changed, 2 insertions(+), 9 deletions(-)
12
target/arm/tcg/translate-a64.c | 47 ----------------------------------
13
2 files changed, 8 insertions(+), 47 deletions(-)
10
14
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
17
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_clast_vector(DisasContext *s, arg_rprr_esz *a, bool before)
19
@@ -XXX,XX +XXX,XX @@ FCVTAU_f 0111 1110 0.1 00001 11001 0 ..... ..... @icvt_sd
16
return true;
20
@fcvt_fixed_d .... .... . 1 ...... ...... rn:5 rd:5 \
21
&fcvt sf=0 esz=3 shift=%fcvt_f_sh_d
22
23
+SCVTF_f 0101 1111 0 ....... 111001 ..... ..... @fcvt_fixed_h
24
+SCVTF_f 0101 1111 0 ....... 111001 ..... ..... @fcvt_fixed_s
25
+SCVTF_f 0101 1111 0 ....... 111001 ..... ..... @fcvt_fixed_d
26
+
27
+UCVTF_f 0111 1111 0 ....... 111001 ..... ..... @fcvt_fixed_h
28
+UCVTF_f 0111 1111 0 ....... 111001 ..... ..... @fcvt_fixed_s
29
+UCVTF_f 0111 1111 0 ....... 111001 ..... ..... @fcvt_fixed_d
30
+
31
FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_h
32
FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_s
33
FCVTZS_f 0101 1111 0 ....... 111111 ..... ..... @fcvt_fixed_d
34
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/tcg/translate-a64.c
37
+++ b/target/arm/tcg/translate-a64.c
38
@@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar,
39
gen_restore_rmode(tcg_rmode, tcg_fpstatus);
17
}
40
}
18
41
19
-static bool trans_CLASTA_z(DisasContext *s, arg_rprr_esz *a)
42
-/* AdvSIMD scalar shift by immediate
43
- * 31 30 29 28 23 22 19 18 16 15 11 10 9 5 4 0
44
- * +-----+---+-------------+------+------+--------+---+------+------+
45
- * | 0 1 | U | 1 1 1 1 1 0 | immh | immb | opcode | 1 | Rn | Rd |
46
- * +-----+---+-------------+------+------+--------+---+------+------+
47
- *
48
- * This is the scalar version so it works on a fixed sized registers
49
- */
50
-static void disas_simd_scalar_shift_imm(DisasContext *s, uint32_t insn)
20
-{
51
-{
21
- return do_clast_vector(s, a, false);
52
- int rd = extract32(insn, 0, 5);
53
- int rn = extract32(insn, 5, 5);
54
- int opcode = extract32(insn, 11, 5);
55
- int immb = extract32(insn, 16, 3);
56
- int immh = extract32(insn, 19, 4);
57
- bool is_u = extract32(insn, 29, 1);
58
-
59
- if (immh == 0) {
60
- unallocated_encoding(s);
61
- return;
62
- }
63
-
64
- switch (opcode) {
65
- case 0x1c: /* SCVTF, UCVTF */
66
- handle_simd_shift_intfp_conv(s, true, false, is_u, immh, immb,
67
- opcode, rn, rd);
68
- break;
69
- default:
70
- case 0x00: /* SSHR / USHR */
71
- case 0x02: /* SSRA / USRA */
72
- case 0x04: /* SRSHR / URSHR */
73
- case 0x06: /* SRSRA / URSRA */
74
- case 0x08: /* SRI */
75
- case 0x0a: /* SHL / SLI */
76
- case 0x0c: /* SQSHLU */
77
- case 0x0e: /* SQSHL, UQSHL */
78
- case 0x10: /* SQSHRUN */
79
- case 0x11: /* SQRSHRUN */
80
- case 0x12: /* SQSHRN, UQSHRN */
81
- case 0x13: /* SQRSHRN, UQRSHRN */
82
- case 0x1f: /* FCVTZS, FCVTZU */
83
- unallocated_encoding(s);
84
- break;
85
- }
22
-}
86
-}
23
-
87
-
24
-static bool trans_CLASTB_z(DisasContext *s, arg_rprr_esz *a)
88
static void handle_2misc_64(DisasContext *s, int opcode, bool u,
25
-{
89
TCGv_i64 tcg_rd, TCGv_i64 tcg_rn,
26
- return do_clast_vector(s, a, true);
90
TCGv_i32 tcg_rmode, TCGv_ptr tcg_fpstatus)
27
-}
91
@@ -XXX,XX +XXX,XX @@ static const AArch64DecodeTable data_proc_simd[] = {
28
+TRANS_FEAT(CLASTA_z, aa64_sve, do_clast_vector, a, false)
92
{ 0x0e200800, 0x9f3e0c00, disas_simd_two_reg_misc },
29
+TRANS_FEAT(CLASTB_z, aa64_sve, do_clast_vector, a, true)
93
{ 0x0f000400, 0x9f800400, disas_simd_shift_imm },
30
94
{ 0x5e200800, 0xdf3e0c00, disas_simd_scalar_two_reg_misc },
31
/* Compute CLAST for a scalar. */
95
- { 0x5f000400, 0xdf800400, disas_simd_scalar_shift_imm },
32
static void do_clast_scalar(DisasContext *s, int esz, int pg, int rm,
96
{ 0x0e780800, 0x8f7e0c00, disas_simd_two_reg_misc_fp16 },
97
{ 0x00000000, 0x00000000, NULL }
98
};
33
--
99
--
34
2.25.1
100
2.34.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
Emphasize that these functions use round-to-zero 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-44-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-62-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 | 20 +++++++-------------
10
target/arm/helper.h | 8 ++++----
9
1 file changed, 7 insertions(+), 13 deletions(-)
11
target/arm/tcg/translate-neon.c | 8 ++++----
12
target/arm/tcg/vec_helper.c | 8 ++++----
13
3 files changed, 12 insertions(+), 12 deletions(-)
10
14
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/helper.h b/target/arm/helper.h
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
17
--- a/target/arm/helper.h
14
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/helper.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_vpz_ool(DisasContext *s, arg_rpr_esz *a,
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_touizs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
16
}
20
17
21
DEF_HELPER_FLAGS_4(gvec_vcvt_sf, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
18
#define DO_VPZ(NAME, name) \
22
DEF_HELPER_FLAGS_4(gvec_vcvt_uf, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
19
-static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
23
-DEF_HELPER_FLAGS_4(gvec_vcvt_fs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
20
-{ \
24
-DEF_HELPER_FLAGS_4(gvec_vcvt_fu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
21
- static gen_helper_gvec_reduc * const fns[4] = { \
25
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_fs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
22
+ static gen_helper_gvec_reduc * const name##_fns[4] = { \
26
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_fu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
23
gen_helper_sve_##name##_b, gen_helper_sve_##name##_h, \
27
24
gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
28
DEF_HELPER_FLAGS_4(gvec_vcvt_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
25
}; \
29
DEF_HELPER_FLAGS_4(gvec_vcvt_uh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
26
- return do_vpz_ool(s, a, fns[a->esz]); \
30
-DEF_HELPER_FLAGS_4(gvec_vcvt_hs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
27
-}
31
-DEF_HELPER_FLAGS_4(gvec_vcvt_hu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
28
+ TRANS_FEAT(NAME, aa64_sve, do_vpz_ool, a, name##_fns[a->esz])
32
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
29
33
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
30
DO_VPZ(ORV, orv)
34
31
DO_VPZ(ANDV, andv)
35
DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
32
@@ -XXX,XX +XXX,XX @@ DO_VPZ(UMAXV, umaxv)
36
DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
33
DO_VPZ(SMINV, sminv)
37
diff --git a/target/arm/tcg/translate-neon.c b/target/arm/tcg/translate-neon.c
34
DO_VPZ(UMINV, uminv)
38
index XXXXXXX..XXXXXXX 100644
35
39
--- a/target/arm/tcg/translate-neon.c
36
-static bool trans_SADDV(DisasContext *s, arg_rpr_esz *a)
40
+++ b/target/arm/tcg/translate-neon.c
37
-{
41
@@ -XXX,XX +XXX,XX @@ static bool do_fp_2sh(DisasContext *s, arg_2reg_shift *a,
38
- static gen_helper_gvec_reduc * const fns[4] = {
42
39
- gen_helper_sve_saddv_b, gen_helper_sve_saddv_h,
43
DO_FP_2SH(VCVT_SF, gen_helper_gvec_vcvt_sf)
40
- gen_helper_sve_saddv_s, NULL
44
DO_FP_2SH(VCVT_UF, gen_helper_gvec_vcvt_uf)
41
- };
45
-DO_FP_2SH(VCVT_FS, gen_helper_gvec_vcvt_fs)
42
- return do_vpz_ool(s, a, fns[a->esz]);
46
-DO_FP_2SH(VCVT_FU, gen_helper_gvec_vcvt_fu)
43
-}
47
+DO_FP_2SH(VCVT_FS, gen_helper_gvec_vcvt_rz_fs)
44
+static gen_helper_gvec_reduc * const saddv_fns[4] = {
48
+DO_FP_2SH(VCVT_FU, gen_helper_gvec_vcvt_rz_fu)
45
+ gen_helper_sve_saddv_b, gen_helper_sve_saddv_h,
49
46
+ gen_helper_sve_saddv_s, NULL
50
DO_FP_2SH(VCVT_SH, gen_helper_gvec_vcvt_sh)
47
+};
51
DO_FP_2SH(VCVT_UH, gen_helper_gvec_vcvt_uh)
48
+TRANS_FEAT(SADDV, aa64_sve, do_vpz_ool, a, saddv_fns[a->esz])
52
-DO_FP_2SH(VCVT_HS, gen_helper_gvec_vcvt_hs)
49
53
-DO_FP_2SH(VCVT_HU, gen_helper_gvec_vcvt_hu)
50
#undef DO_VPZ
54
+DO_FP_2SH(VCVT_HS, gen_helper_gvec_vcvt_rz_hs)
55
+DO_FP_2SH(VCVT_HU, gen_helper_gvec_vcvt_rz_hu)
56
57
static bool do_1reg_imm(DisasContext *s, arg_1reg_imm *a,
58
GVecGen2iFn *fn)
59
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/target/arm/tcg/vec_helper.c
62
+++ b/target/arm/tcg/vec_helper.c
63
@@ -XXX,XX +XXX,XX @@ DO_3OP_PAIR(gvec_uminp_s, MIN, uint32_t, H4)
64
65
DO_VCVT_FIXED(gvec_vcvt_sf, helper_vfp_sltos, uint32_t)
66
DO_VCVT_FIXED(gvec_vcvt_uf, helper_vfp_ultos, uint32_t)
67
-DO_VCVT_FIXED(gvec_vcvt_fs, helper_vfp_tosls_round_to_zero, uint32_t)
68
-DO_VCVT_FIXED(gvec_vcvt_fu, helper_vfp_touls_round_to_zero, uint32_t)
69
+DO_VCVT_FIXED(gvec_vcvt_rz_fs, helper_vfp_tosls_round_to_zero, uint32_t)
70
+DO_VCVT_FIXED(gvec_vcvt_rz_fu, helper_vfp_touls_round_to_zero, uint32_t)
71
DO_VCVT_FIXED(gvec_vcvt_sh, helper_vfp_shtoh, uint16_t)
72
DO_VCVT_FIXED(gvec_vcvt_uh, helper_vfp_uhtoh, uint16_t)
73
-DO_VCVT_FIXED(gvec_vcvt_hs, helper_vfp_toshh_round_to_zero, uint16_t)
74
-DO_VCVT_FIXED(gvec_vcvt_hu, helper_vfp_touhh_round_to_zero, uint16_t)
75
+DO_VCVT_FIXED(gvec_vcvt_rz_hs, helper_vfp_toshh_round_to_zero, uint16_t)
76
+DO_VCVT_FIXED(gvec_vcvt_rz_hu, helper_vfp_touhh_round_to_zero, uint16_t)
77
78
#undef DO_VCVT_FIXED
51
79
52
--
80
--
53
2.25.1
81
2.34.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 handle_simd_intfp_conv and handle_simd_shift_intfp_conv
4
as these were the last insns decoded by those functions.
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-5-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-63-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 | 74 ++++++++++++--------------------------
11
target/arm/helper.h | 3 +
9
1 file changed, 23 insertions(+), 51 deletions(-)
12
target/arm/tcg/a64.decode | 22 ++++
13
target/arm/tcg/translate-a64.c | 201 ++++++---------------------------
14
target/arm/tcg/vec_helper.c | 7 +-
15
4 files changed, 66 insertions(+), 167 deletions(-)
10
16
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
17
diff --git a/target/arm/helper.h b/target/arm/helper.h
12
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
19
--- a/target/arm/helper.h
14
+++ b/target/arm/translate-sve.c
20
+++ b/target/arm/helper.h
15
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
21
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_vcvt_uh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
16
}
22
DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hs, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
17
23
DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
18
/* Invoke an out-of-line helper on 3 Zregs. */
24
19
-static void gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
25
+DEF_HELPER_FLAGS_4(gvec_vcvt_sd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
20
+static bool gen_gvec_ool_zzz(DisasContext *s, gen_helper_gvec_3 *fn,
26
+DEF_HELPER_FLAGS_4(gvec_vcvt_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
21
int rd, int rn, int rm, int data)
27
+
28
DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
29
DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
30
DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
31
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/arm/tcg/a64.decode
34
+++ b/target/arm/tcg/a64.decode
35
@@ -XXX,XX +XXX,XX @@ FRINT32Z_v 0.00 1110 0.1 00001 11101 0 ..... ..... @qrr_sd
36
FRINT32X_v 0.10 1110 0.1 00001 11101 0 ..... ..... @qrr_sd
37
FRINT64Z_v 0.00 1110 0.1 00001 11111 0 ..... ..... @qrr_sd
38
FRINT64X_v 0.10 1110 0.1 00001 11111 0 ..... ..... @qrr_sd
39
+
40
+SCVTF_vi 0.00 1110 011 11001 11011 0 ..... ..... @qrr_h
41
+SCVTF_vi 0.00 1110 0.1 00001 11011 0 ..... ..... @qrr_sd
42
+
43
+UCVTF_vi 0.10 1110 011 11001 11011 0 ..... ..... @qrr_h
44
+UCVTF_vi 0.10 1110 0.1 00001 11011 0 ..... ..... @qrr_sd
45
+
46
+&fcvt_q rd rn esz q shift
47
+@fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \
48
+ &fcvt_q esz=1 shift=%fcvt_f_sh_h
49
+@fcvtq_s . q:1 . ...... 01 ..... ...... rn:5 rd:5 \
50
+ &fcvt_q esz=2 shift=%fcvt_f_sh_s
51
+@fcvtq_d . q:1 . ...... 1 ...... ...... rn:5 rd:5 \
52
+ &fcvt_q esz=3 shift=%fcvt_f_sh_d
53
+
54
+SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_h
55
+SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_s
56
+SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_d
57
+
58
+UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_h
59
+UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_s
60
+UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_d
61
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/target/arm/tcg/translate-a64.c
64
+++ b/target/arm/tcg/translate-a64.c
65
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FRINT64Z_v, aa64_frint, do_fp1_vector, a,
66
&f_scalar_frint64, FPROUNDING_ZERO)
67
TRANS_FEAT(FRINT64X_v, aa64_frint, do_fp1_vector, a, &f_scalar_frint64, -1)
68
69
-/* Common vector code for handling integer to FP conversion */
70
-static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn,
71
- int elements, int is_signed,
72
- int fracbits, int size)
73
+static bool do_gvec_op2_fpst(DisasContext *s, MemOp esz, bool is_q,
74
+ int rd, int rn, int data,
75
+ gen_helper_gvec_2_ptr * const fns[3])
22
{
76
{
23
- unsigned vsz = vec_full_reg_size(s);
77
- TCGv_ptr tcg_fpst = fpstatus_ptr(size == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
24
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
78
- TCGv_i32 tcg_shift = NULL;
25
- vec_full_reg_offset(s, rn),
79
+ int check = fp_access_check_vector_hsd(s, is_q, esz);
26
- vec_full_reg_offset(s, rm),
80
+ TCGv_ptr fpst;
27
- vsz, vsz, data, fn);
81
28
+ if (fn == NULL) {
82
- MemOp mop = size | (is_signed ? MO_SIGN : 0);
29
+ return false;
83
- int pass;
30
+ }
84
-
31
+ if (sve_access_check(s)) {
85
- if (fracbits || size == MO_64) {
32
+ unsigned vsz = vec_full_reg_size(s);
86
- tcg_shift = tcg_constant_i32(fracbits);
33
+ tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
87
+ if (check <= 0) {
34
+ vec_full_reg_offset(s, rn),
88
+ return check == 0;
35
+ vec_full_reg_offset(s, rm),
89
}
36
+ vsz, vsz, data, fn);
90
37
+ }
91
- if (size == MO_64) {
92
- TCGv_i64 tcg_int64 = tcg_temp_new_i64();
93
- TCGv_i64 tcg_double = tcg_temp_new_i64();
94
-
95
- for (pass = 0; pass < elements; pass++) {
96
- read_vec_element(s, tcg_int64, rn, pass, mop);
97
-
98
- if (is_signed) {
99
- gen_helper_vfp_sqtod(tcg_double, tcg_int64,
100
- tcg_shift, tcg_fpst);
101
- } else {
102
- gen_helper_vfp_uqtod(tcg_double, tcg_int64,
103
- tcg_shift, tcg_fpst);
104
- }
105
- if (elements == 1) {
106
- write_fp_dreg(s, rd, tcg_double);
107
- } else {
108
- write_vec_element(s, tcg_double, rd, pass, MO_64);
109
- }
110
- }
111
- } else {
112
- TCGv_i32 tcg_int32 = tcg_temp_new_i32();
113
- TCGv_i32 tcg_float = tcg_temp_new_i32();
114
-
115
- for (pass = 0; pass < elements; pass++) {
116
- read_vec_element_i32(s, tcg_int32, rn, pass, mop);
117
-
118
- switch (size) {
119
- case MO_32:
120
- if (fracbits) {
121
- if (is_signed) {
122
- gen_helper_vfp_sltos(tcg_float, tcg_int32,
123
- tcg_shift, tcg_fpst);
124
- } else {
125
- gen_helper_vfp_ultos(tcg_float, tcg_int32,
126
- tcg_shift, tcg_fpst);
127
- }
128
- } else {
129
- if (is_signed) {
130
- gen_helper_vfp_sitos(tcg_float, tcg_int32, tcg_fpst);
131
- } else {
132
- gen_helper_vfp_uitos(tcg_float, tcg_int32, tcg_fpst);
133
- }
134
- }
135
- break;
136
- case MO_16:
137
- if (fracbits) {
138
- if (is_signed) {
139
- gen_helper_vfp_sltoh(tcg_float, tcg_int32,
140
- tcg_shift, tcg_fpst);
141
- } else {
142
- gen_helper_vfp_ultoh(tcg_float, tcg_int32,
143
- tcg_shift, tcg_fpst);
144
- }
145
- } else {
146
- if (is_signed) {
147
- gen_helper_vfp_sitoh(tcg_float, tcg_int32, tcg_fpst);
148
- } else {
149
- gen_helper_vfp_uitoh(tcg_float, tcg_int32, tcg_fpst);
150
- }
151
- }
152
- break;
153
- default:
154
- g_assert_not_reached();
155
- }
156
-
157
- if (elements == 1) {
158
- write_fp_sreg(s, rd, tcg_float);
159
- } else {
160
- write_vec_element_i32(s, tcg_float, rd, pass, size);
161
- }
162
- }
163
- }
164
-
165
- clear_vec_high(s, elements << size == 16, rd);
166
+ fpst = fpstatus_ptr(esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
167
+ tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, rd),
168
+ vec_full_reg_offset(s, rn), fpst,
169
+ is_q ? 16 : 8, vec_full_reg_size(s),
170
+ data, fns[esz - 1]);
38
+ return true;
171
+ return true;
39
}
172
}
40
173
41
/* Invoke an out-of-line helper on 4 Zregs. */
174
-/* UCVTF/SCVTF - Integer to FP conversion */
42
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zzi(DisasContext *s, arg_rri_esz *a)
175
-static void handle_simd_shift_intfp_conv(DisasContext *s, bool is_scalar,
43
176
- bool is_q, bool is_u,
44
static bool do_zzw_ool(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
177
- int immh, int immb, int opcode,
45
{
178
- int rn, int rd)
46
- if (fn == NULL) {
179
-{
47
- return false;
180
- int size, elements, fracbits;
48
- }
181
- int immhb = immh << 3 | immb;
49
- if (sve_access_check(s)) {
182
+static gen_helper_gvec_2_ptr * const f_scvtf_v[] = {
50
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
183
+ gen_helper_gvec_vcvt_sh,
51
- }
184
+ gen_helper_gvec_vcvt_sf,
52
- return true;
185
+ gen_helper_gvec_vcvt_sd,
53
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
186
+};
54
}
187
+TRANS(SCVTF_vi, do_gvec_op2_fpst,
55
188
+ a->esz, a->q, a->rd, a->rn, 0, f_scvtf_v)
56
#define DO_ZZW(NAME, name) \
189
+TRANS(SCVTF_vf, do_gvec_op2_fpst,
57
@@ -XXX,XX +XXX,XX @@ static bool trans_RDVL(DisasContext *s, arg_RDVL *a)
190
+ a->esz, a->q, a->rd, a->rn, a->shift, f_scvtf_v)
58
191
59
static bool do_adr(DisasContext *s, arg_rrri *a, gen_helper_gvec_3 *fn)
192
- if (immh & 8) {
60
{
193
- size = MO_64;
61
- if (sve_access_check(s)) {
194
- if (!is_scalar && !is_q) {
62
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, a->imm);
195
- unallocated_encoding(s);
63
- }
196
- return;
64
- return true;
197
- }
65
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, a->imm);
198
- } else if (immh & 4) {
66
}
199
- size = MO_32;
67
200
- } else if (immh & 2) {
68
static bool trans_ADR_p32(DisasContext *s, arg_rrri *a)
201
- size = MO_16;
69
@@ -XXX,XX +XXX,XX @@ static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
202
- if (!dc_isar_feature(aa64_fp16, s)) {
70
gen_helper_sve_ftssel_s,
203
- unallocated_encoding(s);
71
gen_helper_sve_ftssel_d,
204
- return;
72
};
205
- }
73
- if (a->esz == 0) {
206
- } else {
74
- return false;
207
- /* immh == 0 would be a failure of the decode logic */
75
- }
208
- g_assert(immh == 1);
76
- if (sve_access_check(s)) {
209
- unallocated_encoding(s);
77
- gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
210
- return;
78
- }
211
- }
79
- return true;
212
-
80
+ return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
213
- if (is_scalar) {
81
}
214
- elements = 1;
82
215
- } else {
83
/*
216
- elements = (8 << is_q) >> size;
84
@@ -XXX,XX +XXX,XX @@ static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
217
- }
85
gen_helper_sve_tbl_b, gen_helper_sve_tbl_h,
218
- fracbits = (16 << size) - immhb;
86
gen_helper_sve_tbl_s, gen_helper_sve_tbl_d
219
-
87
};
220
- if (!fp_access_check(s)) {
88
-
221
- return;
89
- if (sve_access_check(s)) {
222
- }
90
- gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
223
-
91
- }
224
- handle_simd_intfp_conv(s, rd, rn, elements, !is_u, fracbits, size);
92
- return true;
225
-}
93
+ return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
226
+static gen_helper_gvec_2_ptr * const f_ucvtf_v[] = {
94
}
227
+ gen_helper_gvec_vcvt_uh,
95
228
+ gen_helper_gvec_vcvt_uf,
96
static bool trans_TBL_sve2(DisasContext *s, arg_rrr_esz *a)
229
+ gen_helper_gvec_vcvt_ud,
97
@@ -XXX,XX +XXX,XX @@ static bool trans_TBX(DisasContext *s, arg_rrr_esz *a)
230
+};
98
if (!dc_isar_feature(aa64_sve2, s)) {
231
+TRANS(UCVTF_vi, do_gvec_op2_fpst,
99
return false;
232
+ a->esz, a->q, a->rd, a->rn, 0, f_ucvtf_v)
100
}
233
+TRANS(UCVTF_vf, do_gvec_op2_fpst,
101
- if (sve_access_check(s)) {
234
+ a->esz, a->q, a->rd, a->rn, a->shift, f_ucvtf_v)
102
- gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
235
103
- }
236
/* FCVTZS, FVCVTZU - FP to fixedpoint conversion */
104
- return true;
237
static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar,
105
+ return gen_gvec_ool_zzz(s, fns[a->esz], a->rd, a->rn, a->rm, 0);
238
@@ -XXX,XX +XXX,XX @@ static void disas_simd_shift_imm(DisasContext *s, uint32_t insn)
106
}
239
}
107
240
108
static bool trans_UNPK(DisasContext *s, arg_UNPK *a)
241
switch (opcode) {
109
@@ -XXX,XX +XXX,XX @@ static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
242
- case 0x1c: /* SCVTF / UCVTF */
110
static bool do_zzz_data_ool(DisasContext *s, arg_rrr_esz *a, int data,
243
- handle_simd_shift_intfp_conv(s, false, is_q, is_u, immh, immb,
111
gen_helper_gvec_3 *fn)
244
- opcode, rn, rd);
112
{
245
- break;
113
- if (sve_access_check(s)) {
246
case 0x1f: /* FCVTZS/ FCVTZU */
114
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
247
handle_simd_shift_fpint_conv(s, false, is_q, is_u, immh, immb, rn, rd);
115
- }
248
return;
116
- return true;
249
@@ -XXX,XX +XXX,XX @@ static void disas_simd_shift_imm(DisasContext *s, uint32_t insn)
117
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, data);
250
case 0x12: /* SQSHRN / UQSHRN */
118
}
251
case 0x13: /* SQRSHRN / UQRSHRN */
119
252
case 0x14: /* SSHLL / USHLL */
120
static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
253
+ case 0x1c: /* SCVTF / UCVTF */
121
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
254
unallocated_encoding(s);
122
static bool do_sve2_zzz_ool(DisasContext *s, arg_rrr_esz *a,
255
return;
123
gen_helper_gvec_3 *fn)
256
}
124
{
257
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
125
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
258
opcode |= (extract32(size, 1, 1) << 5) | (u << 6);
126
+ if (!dc_isar_feature(aa64_sve2, s)) {
259
size = is_double ? 3 : 2;
127
return false;
260
switch (opcode) {
128
}
261
- case 0x1d: /* SCVTF */
129
- if (sve_access_check(s)) {
262
- case 0x5d: /* UCVTF */
130
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
263
- {
131
- }
264
- bool is_signed = (opcode == 0x1d) ? true : false;
132
- return true;
265
- int elements = is_double ? 2 : is_q ? 4 : 2;
133
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
266
- if (is_double && !is_q) {
134
}
267
- unallocated_encoding(s);
135
268
- return;
136
static bool trans_SMULH_zzz(DisasContext *s, arg_rrr_esz *a)
269
- }
137
@@ -XXX,XX +XXX,XX @@ static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
270
- if (!fp_access_check(s)) {
138
if (!dc_isar_feature(aa64_sve2_aes, s)) {
271
- return;
139
return false;
272
- }
140
}
273
- handle_simd_intfp_conv(s, rd, rn, elements, is_signed, 0, size);
141
- if (sve_access_check(s)) {
274
- return;
142
- gen_gvec_ool_zzz(s, gen_helper_crypto_aese,
275
- }
143
- a->rd, a->rn, a->rm, decrypt);
276
case 0x2c: /* FCMGT (zero) */
144
- }
277
case 0x2d: /* FCMEQ (zero) */
145
- return true;
278
case 0x2e: /* FCMLT (zero) */
146
+ return gen_gvec_ool_zzz(s, gen_helper_crypto_aese,
279
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
147
+ a->rd, a->rn, a->rm, decrypt);
280
case 0x1f: /* FRINT64Z */
148
}
281
case 0x5e: /* FRINT32X */
149
282
case 0x5f: /* FRINT64X */
150
static bool trans_AESE(DisasContext *s, arg_rrr_esz *a)
283
+ case 0x1d: /* SCVTF */
151
@@ -XXX,XX +XXX,XX @@ static bool do_sm4(DisasContext *s, arg_rrr_esz *a, gen_helper_gvec_3 *fn)
284
+ case 0x5d: /* UCVTF */
152
if (!dc_isar_feature(aa64_sve2_sm4, s)) {
285
unallocated_encoding(s);
153
return false;
286
return;
154
}
287
}
155
- if (sve_access_check(s)) {
288
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
156
- gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
289
fpop = deposit32(fpop, 6, 1, u);
157
- }
290
158
- return true;
291
switch (fpop) {
159
+ return gen_gvec_ool_zzz(s, fn, a->rd, a->rn, a->rm, 0);
292
- case 0x1d: /* SCVTF */
160
}
293
- case 0x5d: /* UCVTF */
161
294
- {
162
static bool trans_SM4E(DisasContext *s, arg_rrr_esz *a)
295
- int elements;
296
-
297
- if (is_scalar) {
298
- elements = 1;
299
- } else {
300
- elements = (is_q ? 8 : 4);
301
- }
302
-
303
- if (!fp_access_check(s)) {
304
- return;
305
- }
306
- handle_simd_intfp_conv(s, rd, rn, elements, !u, 0, MO_16);
307
- return;
308
- }
309
- break;
310
case 0x2c: /* FCMGT (zero) */
311
case 0x2d: /* FCMEQ (zero) */
312
case 0x2e: /* FCMLT (zero) */
313
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
314
case 0x58: /* FRINTA */
315
case 0x59: /* FRINTX */
316
case 0x79: /* FRINTI */
317
+ case 0x1d: /* SCVTF */
318
+ case 0x5d: /* UCVTF */
319
unallocated_encoding(s);
320
return;
321
}
322
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
323
index XXXXXXX..XXXXXXX 100644
324
--- a/target/arm/tcg/vec_helper.c
325
+++ b/target/arm/tcg/vec_helper.c
326
@@ -XXX,XX +XXX,XX @@ DO_3OP_PAIR(gvec_uminp_s, MIN, uint32_t, H4)
327
clear_tail(d, oprsz, simd_maxsz(desc)); \
328
}
329
330
+DO_VCVT_FIXED(gvec_vcvt_sd, helper_vfp_sqtod, uint64_t)
331
+DO_VCVT_FIXED(gvec_vcvt_ud, helper_vfp_uqtod, uint64_t)
332
DO_VCVT_FIXED(gvec_vcvt_sf, helper_vfp_sltos, uint32_t)
333
DO_VCVT_FIXED(gvec_vcvt_uf, helper_vfp_ultos, uint32_t)
334
-DO_VCVT_FIXED(gvec_vcvt_rz_fs, helper_vfp_tosls_round_to_zero, uint32_t)
335
-DO_VCVT_FIXED(gvec_vcvt_rz_fu, helper_vfp_touls_round_to_zero, uint32_t)
336
DO_VCVT_FIXED(gvec_vcvt_sh, helper_vfp_shtoh, uint16_t)
337
DO_VCVT_FIXED(gvec_vcvt_uh, helper_vfp_uhtoh, uint16_t)
338
+
339
+DO_VCVT_FIXED(gvec_vcvt_rz_fs, helper_vfp_tosls_round_to_zero, uint32_t)
340
+DO_VCVT_FIXED(gvec_vcvt_rz_fu, helper_vfp_touls_round_to_zero, uint32_t)
341
DO_VCVT_FIXED(gvec_vcvt_rz_hs, helper_vfp_toshh_round_to_zero, uint16_t)
342
DO_VCVT_FIXED(gvec_vcvt_rz_hu, helper_vfp_touhh_round_to_zero, uint16_t)
343
163
--
344
--
164
2.25.1
345
2.34.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 handle_simd_shift_fpint_conv and disas_simd_shift_imm
4
as these were the last insns decoded by those functions.
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-55-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-64-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/helper.h | 4 +
9
1 file changed, 2 insertions(+), 12 deletions(-)
12
target/arm/tcg/a64.decode | 8 ++
13
target/arm/tcg/translate-a64.c | 160 +++------------------------------
14
target/arm/tcg/vec_helper.c | 2 +
15
target/arm/vfp_helper.c | 4 +
16
5 files changed, 32 insertions(+), 146 deletions(-)
10
17
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
18
diff --git a/target/arm/helper.h b/target/arm/helper.h
12
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
20
--- a/target/arm/helper.h
14
+++ b/target/arm/translate-sve.c
21
+++ b/target/arm/helper.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_EXT(DisasContext *s, int rd, int rn, int rm, int imm)
22
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(vfp_touhs_round_to_zero, i32, f32, i32, ptr)
16
return true;
23
DEF_HELPER_3(vfp_touls_round_to_zero, i32, f32, i32, ptr)
24
DEF_HELPER_3(vfp_toshd_round_to_zero, i64, f64, i32, ptr)
25
DEF_HELPER_3(vfp_tosld_round_to_zero, i64, f64, i32, ptr)
26
+DEF_HELPER_3(vfp_tosqd_round_to_zero, i64, f64, i32, ptr)
27
DEF_HELPER_3(vfp_touhd_round_to_zero, i64, f64, i32, ptr)
28
DEF_HELPER_3(vfp_tould_round_to_zero, i64, f64, i32, ptr)
29
+DEF_HELPER_3(vfp_touqd_round_to_zero, i64, f64, i32, ptr)
30
DEF_HELPER_3(vfp_touhh, i32, f16, i32, ptr)
31
DEF_HELPER_3(vfp_toshh, i32, f16, i32, ptr)
32
DEF_HELPER_3(vfp_toulh, i32, f16, i32, ptr)
33
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_vcvt_rz_hu, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
34
35
DEF_HELPER_FLAGS_4(gvec_vcvt_sd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
36
DEF_HELPER_FLAGS_4(gvec_vcvt_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
37
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_ds, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
38
+DEF_HELPER_FLAGS_4(gvec_vcvt_rz_du, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
39
40
DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
41
DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
42
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/arm/tcg/a64.decode
45
+++ b/target/arm/tcg/a64.decode
46
@@ -XXX,XX +XXX,XX @@ SCVTF_vf 0.00 11110 ....... 111001 ..... ..... @fcvtq_d
47
UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_h
48
UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_s
49
UCVTF_vf 0.10 11110 ....... 111001 ..... ..... @fcvtq_d
50
+
51
+FCVTZS_vf 0.00 11110 ....... 111111 ..... ..... @fcvtq_h
52
+FCVTZS_vf 0.00 11110 ....... 111111 ..... ..... @fcvtq_s
53
+FCVTZS_vf 0.00 11110 ....... 111111 ..... ..... @fcvtq_d
54
+
55
+FCVTZU_vf 0.10 11110 ....... 111111 ..... ..... @fcvtq_h
56
+FCVTZU_vf 0.10 11110 ....... 111111 ..... ..... @fcvtq_s
57
+FCVTZU_vf 0.10 11110 ....... 111111 ..... ..... @fcvtq_d
58
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
59
index XXXXXXX..XXXXXXX 100644
60
--- a/target/arm/tcg/translate-a64.c
61
+++ b/target/arm/tcg/translate-a64.c
62
@@ -XXX,XX +XXX,XX @@ TRANS(UCVTF_vi, do_gvec_op2_fpst,
63
TRANS(UCVTF_vf, do_gvec_op2_fpst,
64
a->esz, a->q, a->rd, a->rn, a->shift, f_ucvtf_v)
65
66
-/* FCVTZS, FVCVTZU - FP to fixedpoint conversion */
67
-static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar,
68
- bool is_q, bool is_u,
69
- int immh, int immb, int rn, int rd)
70
-{
71
- int immhb = immh << 3 | immb;
72
- int pass, size, fracbits;
73
- TCGv_ptr tcg_fpstatus;
74
- TCGv_i32 tcg_rmode, tcg_shift;
75
+static gen_helper_gvec_2_ptr * const f_fcvtzs_vf[] = {
76
+ gen_helper_gvec_vcvt_rz_hs,
77
+ gen_helper_gvec_vcvt_rz_fs,
78
+ gen_helper_gvec_vcvt_rz_ds,
79
+};
80
+TRANS(FCVTZS_vf, do_gvec_op2_fpst,
81
+ a->esz, a->q, a->rd, a->rn, a->shift, f_fcvtzs_vf)
82
83
- if (immh & 0x8) {
84
- size = MO_64;
85
- if (!is_scalar && !is_q) {
86
- unallocated_encoding(s);
87
- return;
88
- }
89
- } else if (immh & 0x4) {
90
- size = MO_32;
91
- } else if (immh & 0x2) {
92
- size = MO_16;
93
- if (!dc_isar_feature(aa64_fp16, s)) {
94
- unallocated_encoding(s);
95
- return;
96
- }
97
- } else {
98
- /* Should have split out AdvSIMD modified immediate earlier. */
99
- assert(immh == 1);
100
- unallocated_encoding(s);
101
- return;
102
- }
103
-
104
- if (!fp_access_check(s)) {
105
- return;
106
- }
107
-
108
- assert(!(is_scalar && is_q));
109
-
110
- tcg_fpstatus = fpstatus_ptr(size == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
111
- tcg_rmode = gen_set_rmode(FPROUNDING_ZERO, tcg_fpstatus);
112
- fracbits = (16 << size) - immhb;
113
- tcg_shift = tcg_constant_i32(fracbits);
114
-
115
- if (size == MO_64) {
116
- int maxpass = is_scalar ? 1 : 2;
117
-
118
- for (pass = 0; pass < maxpass; pass++) {
119
- TCGv_i64 tcg_op = tcg_temp_new_i64();
120
-
121
- read_vec_element(s, tcg_op, rn, pass, MO_64);
122
- if (is_u) {
123
- gen_helper_vfp_touqd(tcg_op, tcg_op, tcg_shift, tcg_fpstatus);
124
- } else {
125
- gen_helper_vfp_tosqd(tcg_op, tcg_op, tcg_shift, tcg_fpstatus);
126
- }
127
- write_vec_element(s, tcg_op, rd, pass, MO_64);
128
- }
129
- clear_vec_high(s, is_q, rd);
130
- } else {
131
- void (*fn)(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_ptr);
132
- int maxpass = is_scalar ? 1 : ((8 << is_q) >> size);
133
-
134
- switch (size) {
135
- case MO_16:
136
- if (is_u) {
137
- fn = gen_helper_vfp_touhh;
138
- } else {
139
- fn = gen_helper_vfp_toshh;
140
- }
141
- break;
142
- case MO_32:
143
- if (is_u) {
144
- fn = gen_helper_vfp_touls;
145
- } else {
146
- fn = gen_helper_vfp_tosls;
147
- }
148
- break;
149
- default:
150
- g_assert_not_reached();
151
- }
152
-
153
- for (pass = 0; pass < maxpass; pass++) {
154
- TCGv_i32 tcg_op = tcg_temp_new_i32();
155
-
156
- read_vec_element_i32(s, tcg_op, rn, pass, size);
157
- fn(tcg_op, tcg_op, tcg_shift, tcg_fpstatus);
158
- if (is_scalar) {
159
- if (size == MO_16 && !is_u) {
160
- tcg_gen_ext16u_i32(tcg_op, tcg_op);
161
- }
162
- write_fp_sreg(s, rd, tcg_op);
163
- } else {
164
- write_vec_element_i32(s, tcg_op, rd, pass, size);
165
- }
166
- }
167
- if (!is_scalar) {
168
- clear_vec_high(s, is_q, rd);
169
- }
170
- }
171
-
172
- gen_restore_rmode(tcg_rmode, tcg_fpstatus);
173
-}
174
+static gen_helper_gvec_2_ptr * const f_fcvtzu_vf[] = {
175
+ gen_helper_gvec_vcvt_rz_hu,
176
+ gen_helper_gvec_vcvt_rz_fu,
177
+ gen_helper_gvec_vcvt_rz_du,
178
+};
179
+TRANS(FCVTZU_vf, do_gvec_op2_fpst,
180
+ a->esz, a->q, a->rd, a->rn, a->shift, f_fcvtzu_vf)
181
182
static void handle_2misc_64(DisasContext *s, int opcode, bool u,
183
TCGv_i64 tcg_rd, TCGv_i64 tcg_rn,
184
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
185
g_assert_not_reached();
17
}
186
}
18
187
19
-static bool trans_EXT(DisasContext *s, arg_EXT *a)
188
-/* AdvSIMD shift by immediate
189
- * 31 30 29 28 23 22 19 18 16 15 11 10 9 5 4 0
190
- * +---+---+---+-------------+------+------+--------+---+------+------+
191
- * | 0 | Q | U | 0 1 1 1 1 0 | immh | immb | opcode | 1 | Rn | Rd |
192
- * +---+---+---+-------------+------+------+--------+---+------+------+
193
- */
194
-static void disas_simd_shift_imm(DisasContext *s, uint32_t insn)
20
-{
195
-{
21
- return do_EXT(s, a->rd, a->rn, a->rm, a->imm);
196
- int rd = extract32(insn, 0, 5);
197
- int rn = extract32(insn, 5, 5);
198
- int opcode = extract32(insn, 11, 5);
199
- int immb = extract32(insn, 16, 3);
200
- int immh = extract32(insn, 19, 4);
201
- bool is_u = extract32(insn, 29, 1);
202
- bool is_q = extract32(insn, 30, 1);
203
-
204
- if (immh == 0) {
205
- unallocated_encoding(s);
206
- return;
207
- }
208
-
209
- switch (opcode) {
210
- case 0x1f: /* FCVTZS/ FCVTZU */
211
- handle_simd_shift_fpint_conv(s, false, is_q, is_u, immh, immb, rn, rd);
212
- return;
213
- default:
214
- case 0x00: /* SSHR / USHR */
215
- case 0x02: /* SSRA / USRA (accumulate) */
216
- case 0x04: /* SRSHR / URSHR (rounding) */
217
- case 0x06: /* SRSRA / URSRA (accum + rounding) */
218
- case 0x08: /* SRI */
219
- case 0x0a: /* SHL / SLI */
220
- case 0x0c: /* SQSHLU */
221
- case 0x0e: /* SQSHL, UQSHL */
222
- case 0x10: /* SHRN / SQSHRUN */
223
- case 0x11: /* RSHRN / SQRSHRUN */
224
- case 0x12: /* SQSHRN / UQSHRN */
225
- case 0x13: /* SQRSHRN / UQRSHRN */
226
- case 0x14: /* SSHLL / USHLL */
227
- case 0x1c: /* SCVTF / UCVTF */
228
- unallocated_encoding(s);
229
- return;
230
- }
22
-}
231
-}
23
-
232
-
24
-static bool trans_EXT_sve2(DisasContext *s, arg_rri *a)
233
static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q,
25
-{
234
int size, int rn, int rd)
26
- if (!dc_isar_feature(aa64_sve2, s)) {
235
{
27
- return false;
236
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
28
- }
237
static const AArch64DecodeTable data_proc_simd[] = {
29
- return do_EXT(s, a->rd, a->rn, (a->rn + 1) % 32, a->imm);
238
/* pattern , mask , fn */
30
-}
239
{ 0x0e200800, 0x9f3e0c00, disas_simd_two_reg_misc },
31
+TRANS_FEAT(EXT, aa64_sve, do_EXT, a->rd, a->rn, a->rm, a->imm)
240
- { 0x0f000400, 0x9f800400, disas_simd_shift_imm },
32
+TRANS_FEAT(EXT_sve2, aa64_sve2, do_EXT, a->rd, a->rn, (a->rn + 1) % 32, a->imm)
241
{ 0x5e200800, 0xdf3e0c00, disas_simd_scalar_two_reg_misc },
33
242
{ 0x0e780800, 0x8f7e0c00, disas_simd_two_reg_misc_fp16 },
34
/*
243
{ 0x00000000, 0x00000000, NULL }
35
*** SVE Permute - Unpredicated Group
244
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
245
index XXXXXXX..XXXXXXX 100644
246
--- a/target/arm/tcg/vec_helper.c
247
+++ b/target/arm/tcg/vec_helper.c
248
@@ -XXX,XX +XXX,XX @@ DO_VCVT_FIXED(gvec_vcvt_uf, helper_vfp_ultos, uint32_t)
249
DO_VCVT_FIXED(gvec_vcvt_sh, helper_vfp_shtoh, uint16_t)
250
DO_VCVT_FIXED(gvec_vcvt_uh, helper_vfp_uhtoh, uint16_t)
251
252
+DO_VCVT_FIXED(gvec_vcvt_rz_ds, helper_vfp_tosqd_round_to_zero, uint64_t)
253
+DO_VCVT_FIXED(gvec_vcvt_rz_du, helper_vfp_touqd_round_to_zero, uint64_t)
254
DO_VCVT_FIXED(gvec_vcvt_rz_fs, helper_vfp_tosls_round_to_zero, uint32_t)
255
DO_VCVT_FIXED(gvec_vcvt_rz_fu, helper_vfp_touls_round_to_zero, uint32_t)
256
DO_VCVT_FIXED(gvec_vcvt_rz_hs, helper_vfp_toshh_round_to_zero, uint16_t)
257
diff --git a/target/arm/vfp_helper.c b/target/arm/vfp_helper.c
258
index XXXXXXX..XXXXXXX 100644
259
--- a/target/arm/vfp_helper.c
260
+++ b/target/arm/vfp_helper.c
261
@@ -XXX,XX +XXX,XX @@ VFP_CONV_FIX_A64(sq, h, 16, dh_ctype_f16, 64, int64)
262
VFP_CONV_FIX(uh, h, 16, dh_ctype_f16, 32, uint16)
263
VFP_CONV_FIX(ul, h, 16, dh_ctype_f16, 32, uint32)
264
VFP_CONV_FIX_A64(uq, h, 16, dh_ctype_f16, 64, uint64)
265
+VFP_CONV_FLOAT_FIX_ROUND(sq, d, 64, float64, 64, int64,
266
+ float_round_to_zero, _round_to_zero)
267
+VFP_CONV_FLOAT_FIX_ROUND(uq, d, 64, float64, 64, uint64,
268
+ float_round_to_zero, _round_to_zero)
269
270
#undef VFP_CONV_FIX
271
#undef VFP_CONV_FIX_FLOAT
36
--
272
--
37
2.25.1
273
2.34.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 handle_2misc_64 as these were the last insns decoded
4
by that function. Remove helper_advsimd_f16to[su]inth as unused;
5
we now always go through helper_vfp_to[su]hh or a specialized
6
vector function instead.
7
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-40-richard.henderson@linaro.org
10
Message-id: 20241211163036.2297116-65-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
12
---
8
target/arm/translate-sve.c | 17 +++--------------
13
target/arm/helper.h | 2 +
9
1 file changed, 3 insertions(+), 14 deletions(-)
14
target/arm/tcg/helper-a64.h | 2 -
15
target/arm/tcg/a64.decode | 25 ++++
16
target/arm/tcg/helper-a64.c | 32 -----
17
target/arm/tcg/translate-a64.c | 227 +++++++++++----------------------
18
target/arm/tcg/vec_helper.c | 2 +
19
6 files changed, 102 insertions(+), 188 deletions(-)
10
20
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
21
diff --git a/target/arm/helper.h b/target/arm/helper.h
12
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
23
--- a/target/arm/helper.h
14
+++ b/target/arm/translate-sve.c
24
+++ b/target/arm/helper.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_zz_dbm(DisasContext *s, arg_rr_dbm *a, GVecGen2iFn *gvec_fn)
25
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_vcvt_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
16
return gen_gvec_fn_zzi(s, gvec_fn, MO_64, a->rd, a->rn, imm);
26
DEF_HELPER_FLAGS_4(gvec_vcvt_rz_ds, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
27
DEF_HELPER_FLAGS_4(gvec_vcvt_rz_du, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
28
29
+DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sd, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
30
+DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ud, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
31
DEF_HELPER_FLAGS_4(gvec_vcvt_rm_ss, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
32
DEF_HELPER_FLAGS_4(gvec_vcvt_rm_us, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
33
DEF_HELPER_FLAGS_4(gvec_vcvt_rm_sh, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
34
diff --git a/target/arm/tcg/helper-a64.h b/target/arm/tcg/helper-a64.h
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/tcg/helper-a64.h
37
+++ b/target/arm/tcg/helper-a64.h
38
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(advsimd_mulx2h, i32, i32, i32, ptr)
39
DEF_HELPER_4(advsimd_muladd2h, i32, i32, i32, i32, ptr)
40
DEF_HELPER_2(advsimd_rinth_exact, f16, f16, ptr)
41
DEF_HELPER_2(advsimd_rinth, f16, f16, ptr)
42
-DEF_HELPER_2(advsimd_f16tosinth, i32, f16, ptr)
43
-DEF_HELPER_2(advsimd_f16touinth, i32, f16, ptr)
44
45
DEF_HELPER_2(exception_return, void, env, i64)
46
DEF_HELPER_FLAGS_2(dc_zva, TCG_CALL_NO_WG, void, env, i64)
47
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
48
index XXXXXXX..XXXXXXX 100644
49
--- a/target/arm/tcg/a64.decode
50
+++ b/target/arm/tcg/a64.decode
51
@@ -XXX,XX +XXX,XX @@ SCVTF_vi 0.00 1110 0.1 00001 11011 0 ..... ..... @qrr_sd
52
UCVTF_vi 0.10 1110 011 11001 11011 0 ..... ..... @qrr_h
53
UCVTF_vi 0.10 1110 0.1 00001 11011 0 ..... ..... @qrr_sd
54
55
+FCVTNS_vi 0.00 1110 011 11001 10101 0 ..... ..... @qrr_h
56
+FCVTNS_vi 0.00 1110 0.1 00001 10101 0 ..... ..... @qrr_sd
57
+FCVTNU_vi 0.10 1110 011 11001 10101 0 ..... ..... @qrr_h
58
+FCVTNU_vi 0.10 1110 0.1 00001 10101 0 ..... ..... @qrr_sd
59
+
60
+FCVTPS_vi 0.00 1110 111 11001 10101 0 ..... ..... @qrr_h
61
+FCVTPS_vi 0.00 1110 1.1 00001 10101 0 ..... ..... @qrr_sd
62
+FCVTPU_vi 0.10 1110 111 11001 10101 0 ..... ..... @qrr_h
63
+FCVTPU_vi 0.10 1110 1.1 00001 10101 0 ..... ..... @qrr_sd
64
+
65
+FCVTMS_vi 0.00 1110 011 11001 10111 0 ..... ..... @qrr_h
66
+FCVTMS_vi 0.00 1110 0.1 00001 10111 0 ..... ..... @qrr_sd
67
+FCVTMU_vi 0.10 1110 011 11001 10111 0 ..... ..... @qrr_h
68
+FCVTMU_vi 0.10 1110 0.1 00001 10111 0 ..... ..... @qrr_sd
69
+
70
+FCVTZS_vi 0.00 1110 111 11001 10111 0 ..... ..... @qrr_h
71
+FCVTZS_vi 0.00 1110 1.1 00001 10111 0 ..... ..... @qrr_sd
72
+FCVTZU_vi 0.10 1110 111 11001 10111 0 ..... ..... @qrr_h
73
+FCVTZU_vi 0.10 1110 1.1 00001 10111 0 ..... ..... @qrr_sd
74
+
75
+FCVTAS_vi 0.00 1110 011 11001 11001 0 ..... ..... @qrr_h
76
+FCVTAS_vi 0.00 1110 0.1 00001 11001 0 ..... ..... @qrr_sd
77
+FCVTAU_vi 0.10 1110 011 11001 11001 0 ..... ..... @qrr_h
78
+FCVTAU_vi 0.10 1110 0.1 00001 11001 0 ..... ..... @qrr_sd
79
+
80
&fcvt_q rd rn esz q shift
81
@fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \
82
&fcvt_q esz=1 shift=%fcvt_f_sh_h
83
diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
84
index XXXXXXX..XXXXXXX 100644
85
--- a/target/arm/tcg/helper-a64.c
86
+++ b/target/arm/tcg/helper-a64.c
87
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(advsimd_rinth)(uint32_t x, void *fp_status)
88
return ret;
17
}
89
}
18
90
19
-static bool trans_AND_zzi(DisasContext *s, arg_rr_dbm *a)
91
-/*
92
- * Half-precision floating point conversion functions
93
- *
94
- * There are a multitude of conversion functions with various
95
- * different rounding modes. This is dealt with by the calling code
96
- * setting the mode appropriately before calling the helper.
97
- */
98
-
99
-uint32_t HELPER(advsimd_f16tosinth)(uint32_t a, void *fpstp)
20
-{
100
-{
21
- return do_zz_dbm(s, a, tcg_gen_gvec_andi);
101
- float_status *fpst = fpstp;
102
-
103
- /* Invalid if we are passed a NaN */
104
- if (float16_is_any_nan(a)) {
105
- float_raise(float_flag_invalid, fpst);
106
- return 0;
107
- }
108
- return float16_to_int16(a, fpst);
22
-}
109
-}
23
-
110
-
24
-static bool trans_ORR_zzi(DisasContext *s, arg_rr_dbm *a)
111
-uint32_t HELPER(advsimd_f16touinth)(uint32_t a, void *fpstp)
25
-{
112
-{
26
- return do_zz_dbm(s, a, tcg_gen_gvec_ori);
113
- float_status *fpst = fpstp;
114
-
115
- /* Invalid if we are passed a NaN */
116
- if (float16_is_any_nan(a)) {
117
- float_raise(float_flag_invalid, fpst);
118
- return 0;
119
- }
120
- return float16_to_uint16(a, fpst);
27
-}
121
-}
28
-
122
-
29
-static bool trans_EOR_zzi(DisasContext *s, arg_rr_dbm *a)
123
static int el_from_spsr(uint32_t spsr)
124
{
125
/* Return the exception level that this SPSR is requesting a return to,
126
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
127
index XXXXXXX..XXXXXXX 100644
128
--- a/target/arm/tcg/translate-a64.c
129
+++ b/target/arm/tcg/translate-a64.c
130
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2_ptr * const f_fcvtzu_vf[] = {
131
TRANS(FCVTZU_vf, do_gvec_op2_fpst,
132
a->esz, a->q, a->rd, a->rn, a->shift, f_fcvtzu_vf)
133
134
-static void handle_2misc_64(DisasContext *s, int opcode, bool u,
135
- TCGv_i64 tcg_rd, TCGv_i64 tcg_rn,
136
- TCGv_i32 tcg_rmode, TCGv_ptr tcg_fpstatus)
30
-{
137
-{
31
- return do_zz_dbm(s, a, tcg_gen_gvec_xori);
138
- /* Handle 64->64 opcodes which are shared between the scalar and
139
- * vector 2-reg-misc groups. We cover every integer opcode where size == 3
140
- * is valid in either group and also the double-precision fp ops.
141
- * The caller only need provide tcg_rmode and tcg_fpstatus if the op
142
- * requires them.
143
- */
144
- switch (opcode) {
145
- case 0x1a: /* FCVTNS */
146
- case 0x1b: /* FCVTMS */
147
- case 0x1c: /* FCVTAS */
148
- case 0x3a: /* FCVTPS */
149
- case 0x3b: /* FCVTZS */
150
- gen_helper_vfp_tosqd(tcg_rd, tcg_rn, tcg_constant_i32(0), tcg_fpstatus);
151
- break;
152
- case 0x5a: /* FCVTNU */
153
- case 0x5b: /* FCVTMU */
154
- case 0x5c: /* FCVTAU */
155
- case 0x7a: /* FCVTPU */
156
- case 0x7b: /* FCVTZU */
157
- gen_helper_vfp_touqd(tcg_rd, tcg_rn, tcg_constant_i32(0), tcg_fpstatus);
158
- break;
159
- default:
160
- case 0x4: /* CLS, CLZ */
161
- case 0x5: /* NOT */
162
- case 0x7: /* SQABS, SQNEG */
163
- case 0x8: /* CMGT, CMGE */
164
- case 0x9: /* CMEQ, CMLE */
165
- case 0xa: /* CMLT */
166
- case 0xb: /* ABS, NEG */
167
- case 0x2f: /* FABS */
168
- case 0x6f: /* FNEG */
169
- case 0x7f: /* FSQRT */
170
- case 0x18: /* FRINTN */
171
- case 0x19: /* FRINTM */
172
- case 0x38: /* FRINTP */
173
- case 0x39: /* FRINTZ */
174
- case 0x58: /* FRINTA */
175
- case 0x79: /* FRINTI */
176
- case 0x59: /* FRINTX */
177
- case 0x1e: /* FRINT32Z */
178
- case 0x5e: /* FRINT32X */
179
- case 0x1f: /* FRINT64Z */
180
- case 0x5f: /* FRINT64X */
181
- g_assert_not_reached();
182
- }
32
-}
183
-}
33
+TRANS_FEAT(AND_zzi, aa64_sve, do_zz_dbm, a, tcg_gen_gvec_andi)
184
+static gen_helper_gvec_2_ptr * const f_fcvt_s_vi[] = {
34
+TRANS_FEAT(ORR_zzi, aa64_sve, do_zz_dbm, a, tcg_gen_gvec_ori)
185
+ gen_helper_gvec_vcvt_rm_sh,
35
+TRANS_FEAT(EOR_zzi, aa64_sve, do_zz_dbm, a, tcg_gen_gvec_xori)
186
+ gen_helper_gvec_vcvt_rm_ss,
36
187
+ gen_helper_gvec_vcvt_rm_sd,
37
static bool trans_DUPM(DisasContext *s, arg_DUPM *a)
188
+};
38
{
189
+
190
+static gen_helper_gvec_2_ptr * const f_fcvt_u_vi[] = {
191
+ gen_helper_gvec_vcvt_rm_uh,
192
+ gen_helper_gvec_vcvt_rm_us,
193
+ gen_helper_gvec_vcvt_rm_ud,
194
+};
195
+
196
+TRANS(FCVTNS_vi, do_gvec_op2_fpst,
197
+ a->esz, a->q, a->rd, a->rn, float_round_nearest_even, f_fcvt_s_vi)
198
+TRANS(FCVTNU_vi, do_gvec_op2_fpst,
199
+ a->esz, a->q, a->rd, a->rn, float_round_nearest_even, f_fcvt_u_vi)
200
+TRANS(FCVTPS_vi, do_gvec_op2_fpst,
201
+ a->esz, a->q, a->rd, a->rn, float_round_up, f_fcvt_s_vi)
202
+TRANS(FCVTPU_vi, do_gvec_op2_fpst,
203
+ a->esz, a->q, a->rd, a->rn, float_round_up, f_fcvt_u_vi)
204
+TRANS(FCVTMS_vi, do_gvec_op2_fpst,
205
+ a->esz, a->q, a->rd, a->rn, float_round_down, f_fcvt_s_vi)
206
+TRANS(FCVTMU_vi, do_gvec_op2_fpst,
207
+ a->esz, a->q, a->rd, a->rn, float_round_down, f_fcvt_u_vi)
208
+TRANS(FCVTZS_vi, do_gvec_op2_fpst,
209
+ a->esz, a->q, a->rd, a->rn, float_round_to_zero, f_fcvt_s_vi)
210
+TRANS(FCVTZU_vi, do_gvec_op2_fpst,
211
+ a->esz, a->q, a->rd, a->rn, float_round_to_zero, f_fcvt_u_vi)
212
+TRANS(FCVTAS_vi, do_gvec_op2_fpst,
213
+ a->esz, a->q, a->rd, a->rn, float_round_ties_away, f_fcvt_s_vi)
214
+TRANS(FCVTAU_vi, do_gvec_op2_fpst,
215
+ a->esz, a->q, a->rd, a->rn, float_round_ties_away, f_fcvt_u_vi)
216
217
static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
218
bool is_scalar, bool is_u, bool is_q,
219
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
220
}
221
handle_2misc_fcmp_zero(s, opcode, false, u, is_q, size, rn, rd);
222
return;
223
- case 0x1a: /* FCVTNS */
224
- case 0x1b: /* FCVTMS */
225
- case 0x3a: /* FCVTPS */
226
- case 0x3b: /* FCVTZS */
227
- case 0x5a: /* FCVTNU */
228
- case 0x5b: /* FCVTMU */
229
- case 0x7a: /* FCVTPU */
230
- case 0x7b: /* FCVTZU */
231
- need_fpstatus = true;
232
- rmode = extract32(opcode, 5, 1) | (extract32(opcode, 0, 1) << 1);
233
- if (size == 3 && !is_q) {
234
- unallocated_encoding(s);
235
- return;
236
- }
237
- break;
238
- case 0x5c: /* FCVTAU */
239
- case 0x1c: /* FCVTAS */
240
- need_fpstatus = true;
241
- rmode = FPROUNDING_TIEAWAY;
242
- if (size == 3 && !is_q) {
243
- unallocated_encoding(s);
244
- return;
245
- }
246
- break;
247
case 0x3c: /* URECPE */
248
if (size == 3) {
249
unallocated_encoding(s);
250
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
251
case 0x5f: /* FRINT64X */
252
case 0x1d: /* SCVTF */
253
case 0x5d: /* UCVTF */
254
+ case 0x1a: /* FCVTNS */
255
+ case 0x1b: /* FCVTMS */
256
+ case 0x3a: /* FCVTPS */
257
+ case 0x3b: /* FCVTZS */
258
+ case 0x5a: /* FCVTNU */
259
+ case 0x5b: /* FCVTMU */
260
+ case 0x7a: /* FCVTPU */
261
+ case 0x7b: /* FCVTZU */
262
+ case 0x5c: /* FCVTAU */
263
+ case 0x1c: /* FCVTAS */
264
unallocated_encoding(s);
265
return;
266
}
267
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
268
tcg_rmode = NULL;
269
}
270
271
- if (size == 3) {
272
- /* All 64-bit element operations can be shared with scalar 2misc */
273
- int pass;
274
-
275
- /* Coverity claims (size == 3 && !is_q) has been eliminated
276
- * from all paths leading to here.
277
- */
278
- tcg_debug_assert(is_q);
279
- for (pass = 0; pass < 2; pass++) {
280
- TCGv_i64 tcg_op = tcg_temp_new_i64();
281
- TCGv_i64 tcg_res = tcg_temp_new_i64();
282
-
283
- read_vec_element(s, tcg_op, rn, pass, MO_64);
284
-
285
- handle_2misc_64(s, opcode, u, tcg_res, tcg_op,
286
- tcg_rmode, tcg_fpstatus);
287
-
288
- write_vec_element(s, tcg_res, rd, pass, MO_64);
289
- }
290
- } else {
291
+ {
292
int pass;
293
294
assert(size == 2);
295
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
296
{
297
/* Special cases for 32 bit elements */
298
switch (opcode) {
299
- case 0x1a: /* FCVTNS */
300
- case 0x1b: /* FCVTMS */
301
- case 0x1c: /* FCVTAS */
302
- case 0x3a: /* FCVTPS */
303
- case 0x3b: /* FCVTZS */
304
- gen_helper_vfp_tosls(tcg_res, tcg_op,
305
- tcg_constant_i32(0), tcg_fpstatus);
306
- break;
307
- case 0x5a: /* FCVTNU */
308
- case 0x5b: /* FCVTMU */
309
- case 0x5c: /* FCVTAU */
310
- case 0x7a: /* FCVTPU */
311
- case 0x7b: /* FCVTZU */
312
- gen_helper_vfp_touls(tcg_res, tcg_op,
313
- tcg_constant_i32(0), tcg_fpstatus);
314
- break;
315
case 0x7c: /* URSQRTE */
316
gen_helper_rsqrte_u32(tcg_res, tcg_op);
317
break;
318
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
319
case 0x5e: /* FRINT32X */
320
case 0x1f: /* FRINT64Z */
321
case 0x5f: /* FRINT64X */
322
+ case 0x1a: /* FCVTNS */
323
+ case 0x1b: /* FCVTMS */
324
+ case 0x1c: /* FCVTAS */
325
+ case 0x3a: /* FCVTPS */
326
+ case 0x3b: /* FCVTZS */
327
+ case 0x5a: /* FCVTNU */
328
+ case 0x5b: /* FCVTMU */
329
+ case 0x5c: /* FCVTAU */
330
+ case 0x7a: /* FCVTPU */
331
+ case 0x7b: /* FCVTZU */
332
g_assert_not_reached();
333
}
334
}
335
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
336
case 0x3d: /* FRECPE */
337
case 0x3f: /* FRECPX */
338
break;
339
- case 0x1a: /* FCVTNS */
340
- rmode = FPROUNDING_TIEEVEN;
341
- break;
342
- case 0x1b: /* FCVTMS */
343
- rmode = FPROUNDING_NEGINF;
344
- break;
345
- case 0x1c: /* FCVTAS */
346
- rmode = FPROUNDING_TIEAWAY;
347
- break;
348
- case 0x3a: /* FCVTPS */
349
- rmode = FPROUNDING_POSINF;
350
- break;
351
- case 0x3b: /* FCVTZS */
352
- rmode = FPROUNDING_ZERO;
353
- break;
354
- case 0x5a: /* FCVTNU */
355
- rmode = FPROUNDING_TIEEVEN;
356
- break;
357
- case 0x5b: /* FCVTMU */
358
- rmode = FPROUNDING_NEGINF;
359
- break;
360
- case 0x5c: /* FCVTAU */
361
- rmode = FPROUNDING_TIEAWAY;
362
- break;
363
- case 0x7a: /* FCVTPU */
364
- rmode = FPROUNDING_POSINF;
365
- break;
366
- case 0x7b: /* FCVTZU */
367
- rmode = FPROUNDING_ZERO;
368
- break;
369
case 0x7d: /* FRSQRTE */
370
break;
371
default:
372
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
373
case 0x79: /* FRINTI */
374
case 0x1d: /* SCVTF */
375
case 0x5d: /* UCVTF */
376
+ case 0x1a: /* FCVTNS */
377
+ case 0x1b: /* FCVTMS */
378
+ case 0x1c: /* FCVTAS */
379
+ case 0x3a: /* FCVTPS */
380
+ case 0x3b: /* FCVTZS */
381
+ case 0x5a: /* FCVTNU */
382
+ case 0x5b: /* FCVTMU */
383
+ case 0x5c: /* FCVTAU */
384
+ case 0x7a: /* FCVTPU */
385
+ case 0x7b: /* FCVTZU */
386
unallocated_encoding(s);
387
return;
388
}
389
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
390
read_vec_element_i32(s, tcg_op, rn, pass, MO_16);
391
392
switch (fpop) {
393
- case 0x1a: /* FCVTNS */
394
- case 0x1b: /* FCVTMS */
395
- case 0x1c: /* FCVTAS */
396
- case 0x3a: /* FCVTPS */
397
- case 0x3b: /* FCVTZS */
398
- gen_helper_advsimd_f16tosinth(tcg_res, tcg_op, tcg_fpstatus);
399
- break;
400
case 0x3d: /* FRECPE */
401
gen_helper_recpe_f16(tcg_res, tcg_op, tcg_fpstatus);
402
break;
403
- case 0x5a: /* FCVTNU */
404
- case 0x5b: /* FCVTMU */
405
- case 0x5c: /* FCVTAU */
406
- case 0x7a: /* FCVTPU */
407
- case 0x7b: /* FCVTZU */
408
- gen_helper_advsimd_f16touinth(tcg_res, tcg_op, tcg_fpstatus);
409
- break;
410
case 0x7d: /* FRSQRTE */
411
gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus);
412
break;
413
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
414
case 0x58: /* FRINTA */
415
case 0x79: /* FRINTI */
416
case 0x59: /* FRINTX */
417
+ case 0x1a: /* FCVTNS */
418
+ case 0x1b: /* FCVTMS */
419
+ case 0x1c: /* FCVTAS */
420
+ case 0x3a: /* FCVTPS */
421
+ case 0x3b: /* FCVTZS */
422
+ case 0x5a: /* FCVTNU */
423
+ case 0x5b: /* FCVTMU */
424
+ case 0x5c: /* FCVTAU */
425
+ case 0x7a: /* FCVTPU */
426
+ case 0x7b: /* FCVTZU */
427
g_assert_not_reached();
428
}
429
430
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
431
index XXXXXXX..XXXXXXX 100644
432
--- a/target/arm/tcg/vec_helper.c
433
+++ b/target/arm/tcg/vec_helper.c
434
@@ -XXX,XX +XXX,XX @@ DO_VCVT_FIXED(gvec_vcvt_rz_hu, helper_vfp_touhh_round_to_zero, uint16_t)
435
clear_tail(d, oprsz, simd_maxsz(desc)); \
436
}
437
438
+DO_VCVT_RMODE(gvec_vcvt_rm_sd, helper_vfp_tosqd, uint64_t)
439
+DO_VCVT_RMODE(gvec_vcvt_rm_ud, helper_vfp_touqd, uint64_t)
440
DO_VCVT_RMODE(gvec_vcvt_rm_ss, helper_vfp_tosls, uint32_t)
441
DO_VCVT_RMODE(gvec_vcvt_rm_us, helper_vfp_touls, uint32_t)
442
DO_VCVT_RMODE(gvec_vcvt_rm_sh, helper_vfp_toshh, uint16_t)
39
--
443
--
40
2.25.1
444
2.34.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 includes FCMEQ, FCMGT, FCMGE, FCMLT, FCMLE.
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-3-richard.henderson@linaro.org
7
Message-id: 20241211163036.2297116-66-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 | 36 +++++++++++++++---------------------
10
target/arm/helper.h | 5 +
9
1 file changed, 15 insertions(+), 21 deletions(-)
11
target/arm/tcg/a64.decode | 30 ++++
12
target/arm/tcg/translate-a64.c | 249 +++++++++++++--------------------
13
target/arm/tcg/vec_helper.c | 4 +-
14
4 files changed, 138 insertions(+), 150 deletions(-)
10
15
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/helper.h b/target/arm/helper.h
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
18
--- a/target/arm/helper.h
14
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/helper.h
15
@@ -XXX,XX +XXX,XX @@ static int pred_gvec_reg_size(DisasContext *s)
20
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_frsqrte_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
16
}
21
17
22
DEF_HELPER_FLAGS_4(gvec_fcgt0_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
18
/* Invoke an out-of-line helper on 2 Zregs. */
23
DEF_HELPER_FLAGS_4(gvec_fcgt0_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
19
-static void gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
24
+DEF_HELPER_FLAGS_4(gvec_fcgt0_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
20
+static bool gen_gvec_ool_zz(DisasContext *s, gen_helper_gvec_2 *fn,
25
21
int rd, int rn, int data)
26
DEF_HELPER_FLAGS_4(gvec_fcge0_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
22
{
27
DEF_HELPER_FLAGS_4(gvec_fcge0_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
23
- unsigned vsz = vec_full_reg_size(s);
28
+DEF_HELPER_FLAGS_4(gvec_fcge0_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
24
- tcg_gen_gvec_2_ool(vec_full_reg_offset(s, rd),
29
25
- vec_full_reg_offset(s, rn),
30
DEF_HELPER_FLAGS_4(gvec_fceq0_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
26
- vsz, vsz, data, fn);
31
DEF_HELPER_FLAGS_4(gvec_fceq0_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
27
+ if (fn == NULL) {
32
+DEF_HELPER_FLAGS_4(gvec_fceq0_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
33
34
DEF_HELPER_FLAGS_4(gvec_fcle0_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
35
DEF_HELPER_FLAGS_4(gvec_fcle0_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
36
+DEF_HELPER_FLAGS_4(gvec_fcle0_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
37
38
DEF_HELPER_FLAGS_4(gvec_fclt0_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
39
DEF_HELPER_FLAGS_4(gvec_fclt0_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
40
+DEF_HELPER_FLAGS_4(gvec_fclt0_d, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
41
42
DEF_HELPER_FLAGS_5(gvec_fadd_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
43
DEF_HELPER_FLAGS_5(gvec_fadd_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, ptr, i32)
44
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/arm/tcg/a64.decode
47
+++ b/target/arm/tcg/a64.decode
48
@@ -XXX,XX +XXX,XX @@ UQXTN_s 0111 1110 ..1 00001 01001 0 ..... ..... @rr_e
49
50
FCVTXN_s 0111 1110 011 00001 01101 0 ..... ..... @rr_s
51
52
+FCMGT0_s 0101 1110 111 11000 11001 0 ..... ..... @rr_h
53
+FCMGT0_s 0101 1110 1.1 00000 11001 0 ..... ..... @rr_sd
54
+
55
+FCMGE0_s 0111 1110 111 11000 11001 0 ..... ..... @rr_h
56
+FCMGE0_s 0111 1110 1.1 00000 11001 0 ..... ..... @rr_sd
57
+
58
+FCMEQ0_s 0101 1110 111 11000 11011 0 ..... ..... @rr_h
59
+FCMEQ0_s 0101 1110 1.1 00000 11011 0 ..... ..... @rr_sd
60
+
61
+FCMLE0_s 0111 1110 111 11000 11011 0 ..... ..... @rr_h
62
+FCMLE0_s 0111 1110 1.1 00000 11011 0 ..... ..... @rr_sd
63
+
64
+FCMLT0_s 0101 1110 111 11000 11101 0 ..... ..... @rr_h
65
+FCMLT0_s 0101 1110 1.1 00000 11101 0 ..... ..... @rr_sd
66
+
67
@icvt_h . ....... .. ...... ...... rn:5 rd:5 \
68
&fcvt sf=0 esz=1 shift=0
69
@icvt_sd . ....... .. ...... ...... rn:5 rd:5 \
70
@@ -XXX,XX +XXX,XX @@ FCVTAS_vi 0.00 1110 0.1 00001 11001 0 ..... ..... @qrr_sd
71
FCVTAU_vi 0.10 1110 011 11001 11001 0 ..... ..... @qrr_h
72
FCVTAU_vi 0.10 1110 0.1 00001 11001 0 ..... ..... @qrr_sd
73
74
+FCMGT0_v 0.00 1110 111 11000 11001 0 ..... ..... @qrr_h
75
+FCMGT0_v 0.00 1110 1.1 00000 11001 0 ..... ..... @qrr_sd
76
+
77
+FCMGE0_v 0.10 1110 111 11000 11001 0 ..... ..... @qrr_h
78
+FCMGE0_v 0.10 1110 1.1 00000 11001 0 ..... ..... @qrr_sd
79
+
80
+FCMEQ0_v 0.00 1110 111 11000 11011 0 ..... ..... @qrr_h
81
+FCMEQ0_v 0.00 1110 1.1 00000 11011 0 ..... ..... @qrr_sd
82
+
83
+FCMLE0_v 0.10 1110 111 11000 11011 0 ..... ..... @qrr_h
84
+FCMLE0_v 0.10 1110 1.1 00000 11011 0 ..... ..... @qrr_sd
85
+
86
+FCMLT0_v 0.00 1110 111 11000 11101 0 ..... ..... @qrr_h
87
+FCMLT0_v 0.00 1110 1.1 00000 11101 0 ..... ..... @qrr_sd
88
+
89
&fcvt_q rd rn esz q shift
90
@fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \
91
&fcvt_q esz=1 shift=%fcvt_f_sh_h
92
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
93
index XXXXXXX..XXXXXXX 100644
94
--- a/target/arm/tcg/translate-a64.c
95
+++ b/target/arm/tcg/translate-a64.c
96
@@ -XXX,XX +XXX,XX @@ static const FPScalar f_scalar_frsqrts = {
97
};
98
TRANS(FRSQRTS_s, do_fp3_scalar, a, &f_scalar_frsqrts)
99
100
+static bool do_fcmp0_s(DisasContext *s, arg_rr_e *a,
101
+ const FPScalar *f, bool swap)
102
+{
103
+ switch (a->esz) {
104
+ case MO_64:
105
+ if (fp_access_check(s)) {
106
+ TCGv_i64 t0 = read_fp_dreg(s, a->rn);
107
+ TCGv_i64 t1 = tcg_constant_i64(0);
108
+ if (swap) {
109
+ f->gen_d(t0, t1, t0, fpstatus_ptr(FPST_FPCR));
110
+ } else {
111
+ f->gen_d(t0, t0, t1, fpstatus_ptr(FPST_FPCR));
112
+ }
113
+ write_fp_dreg(s, a->rd, t0);
114
+ }
115
+ break;
116
+ case MO_32:
117
+ if (fp_access_check(s)) {
118
+ TCGv_i32 t0 = read_fp_sreg(s, a->rn);
119
+ TCGv_i32 t1 = tcg_constant_i32(0);
120
+ if (swap) {
121
+ f->gen_s(t0, t1, t0, fpstatus_ptr(FPST_FPCR));
122
+ } else {
123
+ f->gen_s(t0, t0, t1, fpstatus_ptr(FPST_FPCR));
124
+ }
125
+ write_fp_sreg(s, a->rd, t0);
126
+ }
127
+ break;
128
+ case MO_16:
129
+ if (!dc_isar_feature(aa64_fp16, s)) {
130
+ return false;
131
+ }
132
+ if (fp_access_check(s)) {
133
+ TCGv_i32 t0 = read_fp_hreg(s, a->rn);
134
+ TCGv_i32 t1 = tcg_constant_i32(0);
135
+ if (swap) {
136
+ f->gen_h(t0, t1, t0, fpstatus_ptr(FPST_FPCR_F16));
137
+ } else {
138
+ f->gen_h(t0, t0, t1, fpstatus_ptr(FPST_FPCR_F16));
139
+ }
140
+ write_fp_sreg(s, a->rd, t0);
141
+ }
142
+ break;
143
+ default:
28
+ return false;
144
+ return false;
29
+ }
145
+ }
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;
146
+ return true;
37
}
147
+}
38
148
+
39
/* Invoke an out-of-line helper on 3 Zregs. */
149
+TRANS(FCMEQ0_s, do_fcmp0_s, a, &f_scalar_fcmeq, false)
40
@@ -XXX,XX +XXX,XX @@ static bool trans_FEXPA(DisasContext *s, arg_rr_esz *a)
150
+TRANS(FCMGT0_s, do_fcmp0_s, a, &f_scalar_fcmgt, false)
41
gen_helper_sve_fexpa_s,
151
+TRANS(FCMGE0_s, do_fcmp0_s, a, &f_scalar_fcmge, false)
42
gen_helper_sve_fexpa_d,
152
+TRANS(FCMLT0_s, do_fcmp0_s, a, &f_scalar_fcmgt, true)
43
};
153
+TRANS(FCMLE0_s, do_fcmp0_s, a, &f_scalar_fcmge, true)
44
- if (a->esz == 0) {
154
+
45
- return false;
155
static bool do_satacc_s(DisasContext *s, arg_rrr_e *a,
156
MemOp sgn_n, MemOp sgn_m,
157
void (*gen_bhs)(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64, MemOp),
158
@@ -XXX,XX +XXX,XX @@ TRANS(FCVTAS_vi, do_gvec_op2_fpst,
159
TRANS(FCVTAU_vi, do_gvec_op2_fpst,
160
a->esz, a->q, a->rd, a->rn, float_round_ties_away, f_fcvt_u_vi)
161
162
-static void handle_2misc_fcmp_zero(DisasContext *s, int opcode,
163
- bool is_scalar, bool is_u, bool is_q,
164
- int size, int rn, int rd)
165
-{
166
- bool is_double = (size == MO_64);
167
- TCGv_ptr fpst;
168
+static gen_helper_gvec_2_ptr * const f_fceq0[] = {
169
+ gen_helper_gvec_fceq0_h,
170
+ gen_helper_gvec_fceq0_s,
171
+ gen_helper_gvec_fceq0_d,
172
+};
173
+TRANS(FCMEQ0_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_fceq0)
174
175
- if (!fp_access_check(s)) {
176
- return;
46
- }
177
- }
47
- if (sve_access_check(s)) {
178
+static gen_helper_gvec_2_ptr * const f_fcgt0[] = {
48
- gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
179
+ gen_helper_gvec_fcgt0_h,
180
+ gen_helper_gvec_fcgt0_s,
181
+ gen_helper_gvec_fcgt0_d,
182
+};
183
+TRANS(FCMGT0_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_fcgt0)
184
185
- fpst = fpstatus_ptr(size == MO_16 ? FPST_FPCR_F16 : FPST_FPCR);
186
+static gen_helper_gvec_2_ptr * const f_fcge0[] = {
187
+ gen_helper_gvec_fcge0_h,
188
+ gen_helper_gvec_fcge0_s,
189
+ gen_helper_gvec_fcge0_d,
190
+};
191
+TRANS(FCMGE0_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_fcge0)
192
193
- if (is_double) {
194
- TCGv_i64 tcg_op = tcg_temp_new_i64();
195
- TCGv_i64 tcg_zero = tcg_constant_i64(0);
196
- TCGv_i64 tcg_res = tcg_temp_new_i64();
197
- NeonGenTwoDoubleOpFn *genfn;
198
- bool swap = false;
199
- int pass;
200
+static gen_helper_gvec_2_ptr * const f_fclt0[] = {
201
+ gen_helper_gvec_fclt0_h,
202
+ gen_helper_gvec_fclt0_s,
203
+ gen_helper_gvec_fclt0_d,
204
+};
205
+TRANS(FCMLT0_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_fclt0)
206
207
- switch (opcode) {
208
- case 0x2e: /* FCMLT (zero) */
209
- swap = true;
210
- /* fallthrough */
211
- case 0x2c: /* FCMGT (zero) */
212
- genfn = gen_helper_neon_cgt_f64;
213
- break;
214
- case 0x2d: /* FCMEQ (zero) */
215
- genfn = gen_helper_neon_ceq_f64;
216
- break;
217
- case 0x6d: /* FCMLE (zero) */
218
- swap = true;
219
- /* fall through */
220
- case 0x6c: /* FCMGE (zero) */
221
- genfn = gen_helper_neon_cge_f64;
222
- break;
223
- default:
224
- g_assert_not_reached();
225
- }
226
-
227
- for (pass = 0; pass < (is_scalar ? 1 : 2); pass++) {
228
- read_vec_element(s, tcg_op, rn, pass, MO_64);
229
- if (swap) {
230
- genfn(tcg_res, tcg_zero, tcg_op, fpst);
231
- } else {
232
- genfn(tcg_res, tcg_op, tcg_zero, fpst);
233
- }
234
- write_vec_element(s, tcg_res, rd, pass, MO_64);
235
- }
236
-
237
- clear_vec_high(s, !is_scalar, rd);
238
- } else {
239
- TCGv_i32 tcg_op = tcg_temp_new_i32();
240
- TCGv_i32 tcg_zero = tcg_constant_i32(0);
241
- TCGv_i32 tcg_res = tcg_temp_new_i32();
242
- NeonGenTwoSingleOpFn *genfn;
243
- bool swap = false;
244
- int pass, maxpasses;
245
-
246
- if (size == MO_16) {
247
- switch (opcode) {
248
- case 0x2e: /* FCMLT (zero) */
249
- swap = true;
250
- /* fall through */
251
- case 0x2c: /* FCMGT (zero) */
252
- genfn = gen_helper_advsimd_cgt_f16;
253
- break;
254
- case 0x2d: /* FCMEQ (zero) */
255
- genfn = gen_helper_advsimd_ceq_f16;
256
- break;
257
- case 0x6d: /* FCMLE (zero) */
258
- swap = true;
259
- /* fall through */
260
- case 0x6c: /* FCMGE (zero) */
261
- genfn = gen_helper_advsimd_cge_f16;
262
- break;
263
- default:
264
- g_assert_not_reached();
265
- }
266
- } else {
267
- switch (opcode) {
268
- case 0x2e: /* FCMLT (zero) */
269
- swap = true;
270
- /* fall through */
271
- case 0x2c: /* FCMGT (zero) */
272
- genfn = gen_helper_neon_cgt_f32;
273
- break;
274
- case 0x2d: /* FCMEQ (zero) */
275
- genfn = gen_helper_neon_ceq_f32;
276
- break;
277
- case 0x6d: /* FCMLE (zero) */
278
- swap = true;
279
- /* fall through */
280
- case 0x6c: /* FCMGE (zero) */
281
- genfn = gen_helper_neon_cge_f32;
282
- break;
283
- default:
284
- g_assert_not_reached();
285
- }
286
- }
287
-
288
- if (is_scalar) {
289
- maxpasses = 1;
290
- } else {
291
- int vector_size = 8 << is_q;
292
- maxpasses = vector_size >> size;
293
- }
294
-
295
- for (pass = 0; pass < maxpasses; pass++) {
296
- read_vec_element_i32(s, tcg_op, rn, pass, size);
297
- if (swap) {
298
- genfn(tcg_res, tcg_zero, tcg_op, fpst);
299
- } else {
300
- genfn(tcg_res, tcg_op, tcg_zero, fpst);
301
- }
302
- if (is_scalar) {
303
- write_fp_sreg(s, rd, tcg_res);
304
- } else {
305
- write_vec_element_i32(s, tcg_res, rd, pass, size);
306
- }
307
- }
308
-
309
- if (!is_scalar) {
310
- clear_vec_high(s, is_q, rd);
311
- }
49
- }
312
- }
50
- return true;
313
-}
51
+ return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
314
+static gen_helper_gvec_2_ptr * const f_fcle0[] = {
52
}
315
+ gen_helper_gvec_fcle0_h,
53
316
+ gen_helper_gvec_fcle0_s,
54
static bool trans_FTSSEL(DisasContext *s, arg_rrr_esz *a)
317
+ gen_helper_gvec_fcle0_d,
55
@@ -XXX,XX +XXX,XX @@ static bool trans_REV_v(DisasContext *s, arg_rr_esz *a)
318
+};
56
gen_helper_sve_rev_b, gen_helper_sve_rev_h,
319
+TRANS(FCMLE0_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_fcle0)
57
gen_helper_sve_rev_s, gen_helper_sve_rev_d
320
58
};
321
static void handle_2misc_reciprocal(DisasContext *s, int opcode,
59
-
322
bool is_scalar, bool is_u, bool is_q,
60
- if (sve_access_check(s)) {
323
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
61
- gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
324
opcode |= (extract32(size, 1, 1) << 5) | (u << 6);
62
- }
325
size = extract32(size, 0, 1) ? 3 : 2;
63
- return true;
326
switch (opcode) {
64
+ return gen_gvec_ool_zz(s, fns[a->esz], a->rd, a->rn, 0);
327
- case 0x2c: /* FCMGT (zero) */
65
}
328
- case 0x2d: /* FCMEQ (zero) */
66
329
- case 0x2e: /* FCMLT (zero) */
67
static bool trans_TBL(DisasContext *s, arg_rrr_esz *a)
330
- case 0x6c: /* FCMGE (zero) */
68
@@ -XXX,XX +XXX,XX @@ static bool trans_AESMC(DisasContext *s, arg_AESMC *a)
331
- case 0x6d: /* FCMLE (zero) */
69
if (!dc_isar_feature(aa64_sve2_aes, s)) {
332
- handle_2misc_fcmp_zero(s, opcode, true, u, true, size, rn, rd);
70
return false;
333
- return;
334
case 0x3d: /* FRECPE */
335
case 0x3f: /* FRECPX */
336
case 0x7d: /* FRSQRTE */
337
@@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
338
case 0x56: /* FCVTXN, FCVTXN2 */
339
case 0x1d: /* SCVTF */
340
case 0x5d: /* UCVTF */
341
+ case 0x2c: /* FCMGT (zero) */
342
+ case 0x2d: /* FCMEQ (zero) */
343
+ case 0x2e: /* FCMLT (zero) */
344
+ case 0x6c: /* FCMGE (zero) */
345
+ case 0x6d: /* FCMLE (zero) */
346
default:
347
unallocated_encoding(s);
348
return;
349
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
350
opcode |= (extract32(size, 1, 1) << 5) | (u << 6);
351
size = is_double ? 3 : 2;
352
switch (opcode) {
353
- case 0x2c: /* FCMGT (zero) */
354
- case 0x2d: /* FCMEQ (zero) */
355
- case 0x2e: /* FCMLT (zero) */
356
- case 0x6c: /* FCMGE (zero) */
357
- case 0x6d: /* FCMLE (zero) */
358
- if (size == 3 && !is_q) {
359
- unallocated_encoding(s);
360
- return;
361
- }
362
- handle_2misc_fcmp_zero(s, opcode, false, u, is_q, size, rn, rd);
363
- return;
364
case 0x3c: /* URECPE */
365
if (size == 3) {
366
unallocated_encoding(s);
367
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
368
case 0x7b: /* FCVTZU */
369
case 0x5c: /* FCVTAU */
370
case 0x1c: /* FCVTAS */
371
+ case 0x2c: /* FCMGT (zero) */
372
+ case 0x2d: /* FCMEQ (zero) */
373
+ case 0x2e: /* FCMLT (zero) */
374
+ case 0x6c: /* FCMGE (zero) */
375
+ case 0x6d: /* FCMLE (zero) */
376
unallocated_encoding(s);
377
return;
378
}
379
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
380
fpop = deposit32(fpop, 6, 1, u);
381
382
switch (fpop) {
383
- case 0x2c: /* FCMGT (zero) */
384
- case 0x2d: /* FCMEQ (zero) */
385
- case 0x2e: /* FCMLT (zero) */
386
- case 0x6c: /* FCMGE (zero) */
387
- case 0x6d: /* FCMLE (zero) */
388
- handle_2misc_fcmp_zero(s, fpop, is_scalar, 0, is_q, MO_16, rn, rd);
389
- return;
390
case 0x3d: /* FRECPE */
391
case 0x3f: /* FRECPX */
392
break;
393
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
394
case 0x5c: /* FCVTAU */
395
case 0x7a: /* FCVTPU */
396
case 0x7b: /* FCVTZU */
397
+ case 0x2c: /* FCMGT (zero) */
398
+ case 0x2d: /* FCMEQ (zero) */
399
+ case 0x2e: /* FCMLT (zero) */
400
+ case 0x6c: /* FCMGE (zero) */
401
+ case 0x6d: /* FCMLE (zero) */
402
unallocated_encoding(s);
403
return;
71
}
404
}
72
- if (sve_access_check(s)) {
405
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
73
- gen_gvec_ool_zz(s, gen_helper_crypto_aesmc, a->rd, a->rd, a->decrypt);
406
index XXXXXXX..XXXXXXX 100644
74
- }
407
--- a/target/arm/tcg/vec_helper.c
75
- return true;
408
+++ b/target/arm/tcg/vec_helper.c
76
+ return gen_gvec_ool_zz(s, gen_helper_crypto_aesmc,
409
@@ -XXX,XX +XXX,XX @@ DO_2OP(gvec_touszh, vfp_touszh, float16)
77
+ a->rd, a->rd, a->decrypt);
410
#define DO_2OP_CMP0(FN, CMPOP, DIRN) \
78
}
411
WRAP_CMP0_##DIRN(FN, CMPOP, float16) \
79
412
WRAP_CMP0_##DIRN(FN, CMPOP, float32) \
80
static bool do_aese(DisasContext *s, arg_rrr_esz *a, bool decrypt)
413
+ WRAP_CMP0_##DIRN(FN, CMPOP, float64) \
414
DO_2OP(gvec_f##FN##0_h, float16_##FN##0, float16) \
415
- DO_2OP(gvec_f##FN##0_s, float32_##FN##0, float32)
416
+ DO_2OP(gvec_f##FN##0_s, float32_##FN##0, float32) \
417
+ DO_2OP(gvec_f##FN##0_d, float64_##FN##0, float64)
418
419
DO_2OP_CMP0(cgt, cgt, FWD)
420
DO_2OP_CMP0(cge, cge, FWD)
81
--
421
--
82
2.25.1
422
2.34.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_fn_zzz
3
Remove disas_simd_scalar_two_reg_misc and
4
to use TRANS_FEAT and gen_gvec_fn_arg_zzz.
4
disas_simd_two_reg_misc_fp16 as these were the
5
last insns decoded by those functions.
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-35-richard.henderson@linaro.org
9
Message-id: 20241211163036.2297116-67-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 | 19 ++-----------------
12
target/arm/tcg/a64.decode | 15 ++
12
1 file changed, 2 insertions(+), 17 deletions(-)
13
target/arm/tcg/translate-a64.c | 329 ++++-----------------------------
14
2 files changed, 53 insertions(+), 291 deletions(-)
13
15
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
16
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
18
--- a/target/arm/tcg/a64.decode
17
+++ b/target/arm/translate-sve.c
19
+++ b/target/arm/tcg/a64.decode
18
@@ -XXX,XX +XXX,XX @@ static bool trans_SLI(DisasContext *s, arg_rri_esz *a)
20
@@ -XXX,XX +XXX,XX @@ FCMLE0_s 0111 1110 1.1 00000 11011 0 ..... ..... @rr_sd
19
return do_sve2_fn2i(s, a, gen_gvec_sli);
21
FCMLT0_s 0101 1110 111 11000 11101 0 ..... ..... @rr_h
22
FCMLT0_s 0101 1110 1.1 00000 11101 0 ..... ..... @rr_sd
23
24
+FRECPE_s 0101 1110 111 11001 11011 0 ..... ..... @rr_h
25
+FRECPE_s 0101 1110 1.1 00001 11011 0 ..... ..... @rr_sd
26
+
27
+FRECPX_s 0101 1110 111 11001 11111 0 ..... ..... @rr_h
28
+FRECPX_s 0101 1110 1.1 00001 11111 0 ..... ..... @rr_sd
29
+
30
+FRSQRTE_s 0111 1110 111 11001 11011 0 ..... ..... @rr_h
31
+FRSQRTE_s 0111 1110 1.1 00001 11011 0 ..... ..... @rr_sd
32
+
33
@icvt_h . ....... .. ...... ...... rn:5 rd:5 \
34
&fcvt sf=0 esz=1 shift=0
35
@icvt_sd . ....... .. ...... ...... rn:5 rd:5 \
36
@@ -XXX,XX +XXX,XX @@ FCMLE0_v 0.10 1110 1.1 00000 11011 0 ..... ..... @qrr_sd
37
FCMLT0_v 0.00 1110 111 11000 11101 0 ..... ..... @qrr_h
38
FCMLT0_v 0.00 1110 1.1 00000 11101 0 ..... ..... @qrr_sd
39
40
+FRECPE_v 0.00 1110 111 11001 11011 0 ..... ..... @qrr_h
41
+FRECPE_v 0.00 1110 1.1 00001 11011 0 ..... ..... @qrr_sd
42
+
43
+FRSQRTE_v 0.10 1110 111 11001 11011 0 ..... ..... @qrr_h
44
+FRSQRTE_v 0.10 1110 1.1 00001 11011 0 ..... ..... @qrr_sd
45
+
46
&fcvt_q rd rn esz q shift
47
@fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \
48
&fcvt_q esz=1 shift=%fcvt_f_sh_h
49
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
50
index XXXXXXX..XXXXXXX 100644
51
--- a/target/arm/tcg/translate-a64.c
52
+++ b/target/arm/tcg/translate-a64.c
53
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FRINT64Z_s, aa64_frint, do_fp1_scalar, a,
54
&f_scalar_frint64, FPROUNDING_ZERO)
55
TRANS_FEAT(FRINT64X_s, aa64_frint, do_fp1_scalar, a, &f_scalar_frint64, -1)
56
57
+static const FPScalar1 f_scalar_frecpe = {
58
+ gen_helper_recpe_f16,
59
+ gen_helper_recpe_f32,
60
+ gen_helper_recpe_f64,
61
+};
62
+TRANS(FRECPE_s, do_fp1_scalar, a, &f_scalar_frecpe, -1)
63
+
64
+static const FPScalar1 f_scalar_frecpx = {
65
+ gen_helper_frecpx_f16,
66
+ gen_helper_frecpx_f32,
67
+ gen_helper_frecpx_f64,
68
+};
69
+TRANS(FRECPX_s, do_fp1_scalar, a, &f_scalar_frecpx, -1)
70
+
71
+static const FPScalar1 f_scalar_frsqrte = {
72
+ gen_helper_rsqrte_f16,
73
+ gen_helper_rsqrte_f32,
74
+ gen_helper_rsqrte_f64,
75
+};
76
+TRANS(FRSQRTE_s, do_fp1_scalar, a, &f_scalar_frsqrte, -1)
77
+
78
static bool trans_FCVT_s_ds(DisasContext *s, arg_rr *a)
79
{
80
if (fp_access_check(s)) {
81
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2_ptr * const f_fcle0[] = {
82
};
83
TRANS(FCMLE0_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_fcle0)
84
85
+static gen_helper_gvec_2_ptr * const f_frecpe[] = {
86
+ gen_helper_gvec_frecpe_h,
87
+ gen_helper_gvec_frecpe_s,
88
+ gen_helper_gvec_frecpe_d,
89
+};
90
+TRANS(FRECPE_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_frecpe)
91
+
92
+static gen_helper_gvec_2_ptr * const f_frsqrte[] = {
93
+ gen_helper_gvec_frsqrte_h,
94
+ gen_helper_gvec_frsqrte_s,
95
+ gen_helper_gvec_frsqrte_d,
96
+};
97
+TRANS(FRSQRTE_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_frsqrte)
98
+
99
static void handle_2misc_reciprocal(DisasContext *s, int opcode,
100
bool is_scalar, bool is_u, bool is_q,
101
int size, int rn, int rd)
102
{
103
bool is_double = (size == 3);
104
- TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
105
106
if (is_double) {
107
- TCGv_i64 tcg_op = tcg_temp_new_i64();
108
- TCGv_i64 tcg_res = tcg_temp_new_i64();
109
- int pass;
110
-
111
- for (pass = 0; pass < (is_scalar ? 1 : 2); pass++) {
112
- read_vec_element(s, tcg_op, rn, pass, MO_64);
113
- switch (opcode) {
114
- case 0x3d: /* FRECPE */
115
- gen_helper_recpe_f64(tcg_res, tcg_op, fpst);
116
- break;
117
- case 0x3f: /* FRECPX */
118
- gen_helper_frecpx_f64(tcg_res, tcg_op, fpst);
119
- break;
120
- case 0x7d: /* FRSQRTE */
121
- gen_helper_rsqrte_f64(tcg_res, tcg_op, fpst);
122
- break;
123
- default:
124
- g_assert_not_reached();
125
- }
126
- write_vec_element(s, tcg_res, rd, pass, MO_64);
127
- }
128
- clear_vec_high(s, !is_scalar, rd);
129
+ g_assert_not_reached();
130
} else {
131
TCGv_i32 tcg_op = tcg_temp_new_i32();
132
TCGv_i32 tcg_res = tcg_temp_new_i32();
133
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_reciprocal(DisasContext *s, int opcode,
134
gen_helper_recpe_u32(tcg_res, tcg_op);
135
break;
136
case 0x3d: /* FRECPE */
137
- gen_helper_recpe_f32(tcg_res, tcg_op, fpst);
138
- break;
139
case 0x3f: /* FRECPX */
140
- gen_helper_frecpx_f32(tcg_res, tcg_op, fpst);
141
- break;
142
case 0x7d: /* FRSQRTE */
143
- gen_helper_rsqrte_f32(tcg_res, tcg_op, fpst);
144
- break;
145
default:
146
g_assert_not_reached();
147
}
148
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_reciprocal(DisasContext *s, int opcode,
149
}
20
}
150
}
21
151
22
-static bool do_sve2_fn_zzz(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *fn)
152
-/* AdvSIMD scalar two reg misc
153
- * 31 30 29 28 24 23 22 21 17 16 12 11 10 9 5 4 0
154
- * +-----+---+-----------+------+-----------+--------+-----+------+------+
155
- * | 0 1 | U | 1 1 1 1 0 | size | 1 0 0 0 0 | opcode | 1 0 | Rn | Rd |
156
- * +-----+---+-----------+------+-----------+--------+-----+------+------+
157
- */
158
-static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn)
23
-{
159
-{
24
- if (!dc_isar_feature(aa64_sve2, s)) {
160
- int rd = extract32(insn, 0, 5);
25
- return false;
161
- int rn = extract32(insn, 5, 5);
26
- }
162
- int opcode = extract32(insn, 12, 5);
27
- return gen_gvec_fn_arg_zzz(s, fn, a);
163
- int size = extract32(insn, 22, 2);
164
- bool u = extract32(insn, 29, 1);
165
-
166
- switch (opcode) {
167
- case 0xc ... 0xf:
168
- case 0x16 ... 0x1d:
169
- case 0x1f:
170
- /* Floating point: U, size[1] and opcode indicate operation;
171
- * size[0] indicates single or double precision.
172
- */
173
- opcode |= (extract32(size, 1, 1) << 5) | (u << 6);
174
- size = extract32(size, 0, 1) ? 3 : 2;
175
- switch (opcode) {
176
- case 0x3d: /* FRECPE */
177
- case 0x3f: /* FRECPX */
178
- case 0x7d: /* FRSQRTE */
179
- if (!fp_access_check(s)) {
180
- return;
181
- }
182
- handle_2misc_reciprocal(s, opcode, true, u, true, size, rn, rd);
183
- return;
184
- case 0x1a: /* FCVTNS */
185
- case 0x1b: /* FCVTMS */
186
- case 0x3a: /* FCVTPS */
187
- case 0x3b: /* FCVTZS */
188
- case 0x5a: /* FCVTNU */
189
- case 0x5b: /* FCVTMU */
190
- case 0x7a: /* FCVTPU */
191
- case 0x7b: /* FCVTZU */
192
- case 0x1c: /* FCVTAS */
193
- case 0x5c: /* FCVTAU */
194
- case 0x56: /* FCVTXN, FCVTXN2 */
195
- case 0x1d: /* SCVTF */
196
- case 0x5d: /* UCVTF */
197
- case 0x2c: /* FCMGT (zero) */
198
- case 0x2d: /* FCMEQ (zero) */
199
- case 0x2e: /* FCMLT (zero) */
200
- case 0x6c: /* FCMGE (zero) */
201
- case 0x6d: /* FCMLE (zero) */
202
- default:
203
- unallocated_encoding(s);
204
- return;
205
- }
206
- break;
207
- default:
208
- case 0x3: /* USQADD / SUQADD */
209
- case 0x7: /* SQABS / SQNEG */
210
- case 0x8: /* CMGT, CMGE */
211
- case 0x9: /* CMEQ, CMLE */
212
- case 0xa: /* CMLT */
213
- case 0xb: /* ABS, NEG */
214
- case 0x12: /* SQXTUN */
215
- case 0x14: /* SQXTN, UQXTN */
216
- unallocated_encoding(s);
217
- return;
218
- }
219
- g_assert_not_reached();
28
-}
220
-}
29
-
221
-
30
-static bool trans_SABA(DisasContext *s, arg_rrr_esz *a)
222
static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q,
223
int size, int rn, int rd)
224
{
225
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
226
unallocated_encoding(s);
227
return;
228
}
229
- /* fall through */
230
- case 0x3d: /* FRECPE */
231
- case 0x7d: /* FRSQRTE */
232
- if (size == 3 && !is_q) {
233
- unallocated_encoding(s);
234
- return;
235
- }
236
if (!fp_access_check(s)) {
237
return;
238
}
239
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
240
case 0x2e: /* FCMLT (zero) */
241
case 0x6c: /* FCMGE (zero) */
242
case 0x6d: /* FCMLE (zero) */
243
+ case 0x3d: /* FRECPE */
244
+ case 0x7d: /* FRSQRTE */
245
unallocated_encoding(s);
246
return;
247
}
248
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
249
}
250
}
251
252
-/* AdvSIMD [scalar] two register miscellaneous (FP16)
253
- *
254
- * 31 30 29 28 27 24 23 22 21 17 16 12 11 10 9 5 4 0
255
- * +---+---+---+---+---------+---+-------------+--------+-----+------+------+
256
- * | 0 | Q | U | S | 1 1 1 0 | a | 1 1 1 1 0 0 | opcode | 1 0 | Rn | Rd |
257
- * +---+---+---+---+---------+---+-------------+--------+-----+------+------+
258
- * mask: 1000 1111 0111 1110 0000 1100 0000 0000 0x8f7e 0c00
259
- * val: 0000 1110 0111 1000 0000 1000 0000 0000 0x0e78 0800
260
- *
261
- * This actually covers two groups where scalar access is governed by
262
- * bit 28. A bunch of the instructions (float to integral) only exist
263
- * in the vector form and are un-allocated for the scalar decode. Also
264
- * in the scalar decode Q is always 1.
265
- */
266
-static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
31
-{
267
-{
32
- return do_sve2_fn_zzz(s, a, gen_gvec_saba);
268
- int fpop, opcode, a, u;
269
- int rn, rd;
270
- bool is_q;
271
- bool is_scalar;
272
-
273
- int pass;
274
- TCGv_i32 tcg_rmode = NULL;
275
- TCGv_ptr tcg_fpstatus = NULL;
276
- bool need_fpst = true;
277
- int rmode = -1;
278
-
279
- if (!dc_isar_feature(aa64_fp16, s)) {
280
- unallocated_encoding(s);
281
- return;
282
- }
283
-
284
- rd = extract32(insn, 0, 5);
285
- rn = extract32(insn, 5, 5);
286
-
287
- a = extract32(insn, 23, 1);
288
- u = extract32(insn, 29, 1);
289
- is_scalar = extract32(insn, 28, 1);
290
- is_q = extract32(insn, 30, 1);
291
-
292
- opcode = extract32(insn, 12, 5);
293
- fpop = deposit32(opcode, 5, 1, a);
294
- fpop = deposit32(fpop, 6, 1, u);
295
-
296
- switch (fpop) {
297
- case 0x3d: /* FRECPE */
298
- case 0x3f: /* FRECPX */
299
- break;
300
- case 0x7d: /* FRSQRTE */
301
- break;
302
- default:
303
- case 0x2f: /* FABS */
304
- case 0x6f: /* FNEG */
305
- case 0x7f: /* FSQRT (vector) */
306
- case 0x18: /* FRINTN */
307
- case 0x19: /* FRINTM */
308
- case 0x38: /* FRINTP */
309
- case 0x39: /* FRINTZ */
310
- case 0x58: /* FRINTA */
311
- case 0x59: /* FRINTX */
312
- case 0x79: /* FRINTI */
313
- case 0x1d: /* SCVTF */
314
- case 0x5d: /* UCVTF */
315
- case 0x1a: /* FCVTNS */
316
- case 0x1b: /* FCVTMS */
317
- case 0x1c: /* FCVTAS */
318
- case 0x3a: /* FCVTPS */
319
- case 0x3b: /* FCVTZS */
320
- case 0x5a: /* FCVTNU */
321
- case 0x5b: /* FCVTMU */
322
- case 0x5c: /* FCVTAU */
323
- case 0x7a: /* FCVTPU */
324
- case 0x7b: /* FCVTZU */
325
- case 0x2c: /* FCMGT (zero) */
326
- case 0x2d: /* FCMEQ (zero) */
327
- case 0x2e: /* FCMLT (zero) */
328
- case 0x6c: /* FCMGE (zero) */
329
- case 0x6d: /* FCMLE (zero) */
330
- unallocated_encoding(s);
331
- return;
332
- }
333
-
334
-
335
- /* Check additional constraints for the scalar encoding */
336
- if (is_scalar) {
337
- if (!is_q) {
338
- unallocated_encoding(s);
339
- return;
340
- }
341
- }
342
-
343
- if (!fp_access_check(s)) {
344
- return;
345
- }
346
-
347
- if (rmode >= 0 || need_fpst) {
348
- tcg_fpstatus = fpstatus_ptr(FPST_FPCR_F16);
349
- }
350
-
351
- if (rmode >= 0) {
352
- tcg_rmode = gen_set_rmode(rmode, tcg_fpstatus);
353
- }
354
-
355
- if (is_scalar) {
356
- TCGv_i32 tcg_op = read_fp_hreg(s, rn);
357
- TCGv_i32 tcg_res = tcg_temp_new_i32();
358
-
359
- switch (fpop) {
360
- case 0x3d: /* FRECPE */
361
- gen_helper_recpe_f16(tcg_res, tcg_op, tcg_fpstatus);
362
- break;
363
- case 0x3f: /* FRECPX */
364
- gen_helper_frecpx_f16(tcg_res, tcg_op, tcg_fpstatus);
365
- break;
366
- case 0x7d: /* FRSQRTE */
367
- gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus);
368
- break;
369
- default:
370
- case 0x1a: /* FCVTNS */
371
- case 0x1b: /* FCVTMS */
372
- case 0x1c: /* FCVTAS */
373
- case 0x3a: /* FCVTPS */
374
- case 0x3b: /* FCVTZS */
375
- case 0x5a: /* FCVTNU */
376
- case 0x5b: /* FCVTMU */
377
- case 0x5c: /* FCVTAU */
378
- case 0x7a: /* FCVTPU */
379
- case 0x7b: /* FCVTZU */
380
- g_assert_not_reached();
381
- }
382
-
383
- /* limit any sign extension going on */
384
- tcg_gen_andi_i32(tcg_res, tcg_res, 0xffff);
385
- write_fp_sreg(s, rd, tcg_res);
386
- } else {
387
- for (pass = 0; pass < (is_q ? 8 : 4); pass++) {
388
- TCGv_i32 tcg_op = tcg_temp_new_i32();
389
- TCGv_i32 tcg_res = tcg_temp_new_i32();
390
-
391
- read_vec_element_i32(s, tcg_op, rn, pass, MO_16);
392
-
393
- switch (fpop) {
394
- case 0x3d: /* FRECPE */
395
- gen_helper_recpe_f16(tcg_res, tcg_op, tcg_fpstatus);
396
- break;
397
- case 0x7d: /* FRSQRTE */
398
- gen_helper_rsqrte_f16(tcg_res, tcg_op, tcg_fpstatus);
399
- break;
400
- default:
401
- case 0x2f: /* FABS */
402
- case 0x6f: /* FNEG */
403
- case 0x7f: /* FSQRT */
404
- case 0x18: /* FRINTN */
405
- case 0x19: /* FRINTM */
406
- case 0x38: /* FRINTP */
407
- case 0x39: /* FRINTZ */
408
- case 0x58: /* FRINTA */
409
- case 0x79: /* FRINTI */
410
- case 0x59: /* FRINTX */
411
- case 0x1a: /* FCVTNS */
412
- case 0x1b: /* FCVTMS */
413
- case 0x1c: /* FCVTAS */
414
- case 0x3a: /* FCVTPS */
415
- case 0x3b: /* FCVTZS */
416
- case 0x5a: /* FCVTNU */
417
- case 0x5b: /* FCVTMU */
418
- case 0x5c: /* FCVTAU */
419
- case 0x7a: /* FCVTPU */
420
- case 0x7b: /* FCVTZU */
421
- g_assert_not_reached();
422
- }
423
-
424
- write_vec_element_i32(s, tcg_res, rd, pass, MO_16);
425
- }
426
-
427
- clear_vec_high(s, is_q, rd);
428
- }
429
-
430
- if (tcg_rmode) {
431
- gen_restore_rmode(tcg_rmode, tcg_fpstatus);
432
- }
33
-}
433
-}
34
-
434
-
35
-static bool trans_UABA(DisasContext *s, arg_rrr_esz *a)
435
/* C3.6 Data processing - SIMD, inc Crypto
36
-{
436
*
37
- return do_sve2_fn_zzz(s, a, gen_gvec_uaba);
437
* As the decode gets a little complex we are using a table based
38
-}
438
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn)
39
+TRANS_FEAT(SABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_saba, a)
439
static const AArch64DecodeTable data_proc_simd[] = {
40
+TRANS_FEAT(UABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_uaba, a)
440
/* pattern , mask , fn */
41
441
{ 0x0e200800, 0x9f3e0c00, disas_simd_two_reg_misc },
42
static bool do_sve2_narrow_extract(DisasContext *s, arg_rri_esz *a,
442
- { 0x5e200800, 0xdf3e0c00, disas_simd_scalar_two_reg_misc },
43
const GVecGen2 ops[3])
443
- { 0x0e780800, 0x8f7e0c00, disas_simd_two_reg_misc_fp16 },
444
{ 0x00000000, 0x00000000, NULL }
445
};
446
44
--
447
--
45
2.25.1
448
2.34.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
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
4
and move to be adjacent.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-14-richard.henderson@linaro.org
5
Message-id: 20241211163036.2297116-68-richard.henderson@linaro.org
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
10
---
7
---
11
target/arm/translate-sve.c | 18 +++++++++---------
8
target/arm/helper.h | 3 +++
12
1 file changed, 9 insertions(+), 9 deletions(-)
9
target/arm/tcg/translate.h | 5 +++++
10
target/arm/tcg/gengvec.c | 16 ++++++++++++++++
11
target/arm/tcg/translate-neon.c | 4 ++--
12
target/arm/tcg/vec_helper.c | 22 ++++++++++++++++++++++
13
5 files changed, 48 insertions(+), 2 deletions(-)
13
14
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/helper.h b/target/arm/helper.h
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
17
--- a/target/arm/helper.h
17
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/helper.h
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zzzz(DisasContext *s, gen_helper_gvec_4 *fn,
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(gvec_uminp_b, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
19
return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, data);
20
DEF_HELPER_FLAGS_4(gvec_uminp_h, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
21
DEF_HELPER_FLAGS_4(gvec_uminp_s, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
22
23
+DEF_HELPER_FLAGS_3(gvec_urecpe_s, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
24
+DEF_HELPER_FLAGS_3(gvec_ursqrte_s, TCG_CALL_NO_RWG, void, ptr, ptr, i32)
25
+
26
#ifdef TARGET_AARCH64
27
#include "tcg/helper-a64.h"
28
#include "tcg/helper-sve.h"
29
diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h
30
index XXXXXXX..XXXXXXX 100644
31
--- a/target/arm/tcg/translate.h
32
+++ b/target/arm/tcg/translate.h
33
@@ -XXX,XX +XXX,XX @@ void gen_gvec_fabs(unsigned vece, uint32_t dofs, uint32_t aofs,
34
void gen_gvec_fneg(unsigned vece, uint32_t dofs, uint32_t aofs,
35
uint32_t oprsz, uint32_t maxsz);
36
37
+void gen_gvec_urecpe(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
38
+ uint32_t opr_sz, uint32_t max_sz);
39
+void gen_gvec_ursqrte(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
40
+ uint32_t opr_sz, uint32_t max_sz);
41
+
42
/*
43
* Forward to the isar_feature_* tests given a DisasContext pointer.
44
*/
45
diff --git a/target/arm/tcg/gengvec.c b/target/arm/tcg/gengvec.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/arm/tcg/gengvec.c
48
+++ b/target/arm/tcg/gengvec.c
49
@@ -XXX,XX +XXX,XX @@ void gen_gvec_fneg(unsigned vece, uint32_t dofs, uint32_t aofs,
50
uint64_t s_bit = 1ull << ((8 << vece) - 1);
51
tcg_gen_gvec_xori(vece, dofs, aofs, s_bit, oprsz, maxsz);
20
}
52
}
21
53
+
22
+static bool gen_gvec_ool_arg_zzxz(DisasContext *s, gen_helper_gvec_4 *fn,
54
+void gen_gvec_urecpe(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
23
+ arg_rrxr_esz *a)
55
+ uint32_t opr_sz, uint32_t max_sz)
24
+{
56
+{
25
+ return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
57
+ assert(vece == MO_32);
58
+ tcg_gen_gvec_2_ool(rd_ofs, rn_ofs, opr_sz, max_sz, 0,
59
+ gen_helper_gvec_urecpe_s);
26
+}
60
+}
27
+
61
+
28
/* Invoke an out-of-line helper on 2 Zregs and a predicate. */
62
+void gen_gvec_ursqrte(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
29
static void gen_gvec_ool_zzp(DisasContext *s, gen_helper_gvec_3 *fn,
63
+ uint32_t opr_sz, uint32_t max_sz)
30
int rd, int rn, int pg, int data)
64
+{
31
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(DOT_zzzz, aa64_sve, gen_gvec_ool_zzzz,
65
+ assert(vece == MO_32);
32
* SVE Multiply - Indexed
66
+ tcg_gen_gvec_2_ool(rd_ofs, rn_ofs, opr_sz, max_sz, 0,
33
*/
67
+ gen_helper_gvec_ursqrte_s);
34
68
+}
35
-static bool do_zzxz_ool(DisasContext *s, arg_rrxr_esz *a,
69
diff --git a/target/arm/tcg/translate-neon.c b/target/arm/tcg/translate-neon.c
36
- gen_helper_gvec_4 *fn)
70
index XXXXXXX..XXXXXXX 100644
37
-{
71
--- a/target/arm/tcg/translate-neon.c
38
- return gen_gvec_ool_zzzz(s, fn, a->rd, a->rn, a->rm, a->ra, a->index);
72
+++ b/target/arm/tcg/translate-neon.c
39
-}
73
@@ -XXX,XX +XXX,XX @@ static bool trans_VRECPE(DisasContext *s, arg_2misc *a)
40
-
74
if (a->size != 2) {
41
#define DO_RRXR(NAME, FUNC) \
42
static bool NAME(DisasContext *s, arg_rrxr_esz *a) \
43
- { return do_zzxz_ool(s, a, FUNC); }
44
+ { return gen_gvec_ool_arg_zzxz(s, FUNC, a); }
45
46
DO_RRXR(trans_SDOT_zzxw_s, gen_helper_gvec_sdot_idx_b)
47
DO_RRXR(trans_SDOT_zzxw_d, gen_helper_gvec_sdot_idx_h)
48
@@ -XXX,XX +XXX,XX @@ static bool trans_SUDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
49
if (!dc_isar_feature(aa64_sve_i8mm, s)) {
50
return false;
75
return false;
51
}
76
}
52
- return do_zzxz_ool(s, a, gen_helper_gvec_sudot_idx_b);
77
- return do_2misc(s, a, gen_helper_recpe_u32);
53
+ return gen_gvec_ool_arg_zzxz(s, gen_helper_gvec_sudot_idx_b, a);
78
+ return do_2misc_vec(s, a, gen_gvec_urecpe);
54
}
79
}
55
80
56
static bool trans_USDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
81
static bool trans_VRSQRTE(DisasContext *s, arg_2misc *a)
57
@@ -XXX,XX +XXX,XX @@ static bool trans_USDOT_zzxw_s(DisasContext *s, arg_rrxr_esz *a)
82
@@ -XXX,XX +XXX,XX @@ static bool trans_VRSQRTE(DisasContext *s, arg_2misc *a)
58
if (!dc_isar_feature(aa64_sve_i8mm, s)) {
83
if (a->size != 2) {
59
return false;
84
return false;
60
}
85
}
61
- return do_zzxz_ool(s, a, gen_helper_gvec_usdot_idx_b);
86
- return do_2misc(s, a, gen_helper_rsqrte_u32);
62
+ return gen_gvec_ool_arg_zzxz(s, gen_helper_gvec_usdot_idx_b, a);
87
+ return do_2misc_vec(s, a, gen_gvec_ursqrte);
63
}
88
}
64
89
65
#undef DO_RRXR
90
#define WRAP_1OP_ENV_FN(WRAPNAME, FUNC) \
91
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
92
index XXXXXXX..XXXXXXX 100644
93
--- a/target/arm/tcg/vec_helper.c
94
+++ b/target/arm/tcg/vec_helper.c
95
@@ -XXX,XX +XXX,XX @@ void HELPER(gvec_rbit_b)(void *vd, void *vn, uint32_t desc)
96
}
97
clear_tail(d, opr_sz, simd_maxsz(desc));
98
}
99
+
100
+void HELPER(gvec_urecpe_s)(void *vd, void *vn, uint32_t desc)
101
+{
102
+ intptr_t i, opr_sz = simd_oprsz(desc);
103
+ uint32_t *d = vd, *n = vn;
104
+
105
+ for (i = 0; i < opr_sz / 4; ++i) {
106
+ d[i] = helper_recpe_u32(n[i]);
107
+ }
108
+ clear_tail(d, opr_sz, simd_maxsz(desc));
109
+}
110
+
111
+void HELPER(gvec_ursqrte_s)(void *vd, void *vn, uint32_t desc)
112
+{
113
+ intptr_t i, opr_sz = simd_oprsz(desc);
114
+ uint32_t *d = vd, *n = vn;
115
+
116
+ for (i = 0; i < opr_sz / 4; ++i) {
117
+ d[i] = helper_rsqrte_u32(n[i]);
118
+ }
119
+ clear_tail(d, opr_sz, simd_maxsz(desc));
120
+}
66
--
121
--
67
2.25.1
122
2.34.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 handle_2misc_reciprocal as these were the last
4
insns decoded by that function.
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-59-richard.henderson@linaro.org
8
Message-id: 20241211163036.2297116-69-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 | 25 +++++++------------------
11
target/arm/tcg/a64.decode | 3 +
9
1 file changed, 7 insertions(+), 18 deletions(-)
12
target/arm/tcg/translate-a64.c | 139 ++-------------------------------
13
2 files changed, 8 insertions(+), 134 deletions(-)
10
14
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
17
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
18
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
19
@@ -XXX,XX +XXX,XX @@ FRECPE_v 0.00 1110 1.1 00001 11011 0 ..... ..... @qrr_sd
16
gen_helper_sve_zip_b, gen_helper_sve_zip_h,
20
FRSQRTE_v 0.10 1110 111 11001 11011 0 ..... ..... @qrr_h
17
gen_helper_sve_zip_s, gen_helper_sve_zip_d,
21
FRSQRTE_v 0.10 1110 1.1 00001 11011 0 ..... ..... @qrr_sd
18
};
22
19
+ unsigned vsz = vec_full_reg_size(s);
23
+URECPE_v 0.00 1110 101 00001 11001 0 ..... ..... @qrr_s
20
+ unsigned high_ofs = high ? vsz / 2 : 0;
24
+URSQRTE_v 0.10 1110 101 00001 11001 0 ..... ..... @qrr_s
21
25
+
22
- if (sve_access_check(s)) {
26
&fcvt_q rd rn esz q shift
23
- unsigned vsz = vec_full_reg_size(s);
27
@fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \
24
- unsigned high_ofs = high ? vsz / 2 : 0;
28
&fcvt_q esz=1 shift=%fcvt_f_sh_h
25
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, a->rd),
29
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
26
- vec_full_reg_offset(s, a->rn),
30
index XXXXXXX..XXXXXXX 100644
27
- vec_full_reg_offset(s, a->rm),
31
--- a/target/arm/tcg/translate-a64.c
28
- vsz, vsz, high_ofs, fns[a->esz]);
32
+++ b/target/arm/tcg/translate-a64.c
29
- }
33
@@ -XXX,XX +XXX,XX @@ TRANS(CMLE0_v, do_gvec_fn2, a, gen_gvec_cle0)
30
- return true;
34
TRANS(CMEQ0_v, do_gvec_fn2, a, gen_gvec_ceq0)
31
+ return gen_gvec_ool_arg_zzz(s, fns[a->esz], a, high_ofs);
35
TRANS(REV16_v, do_gvec_fn2, a, gen_gvec_rev16)
36
TRANS(REV32_v, do_gvec_fn2, a, gen_gvec_rev32)
37
+TRANS(URECPE_v, do_gvec_fn2, a, gen_gvec_urecpe)
38
+TRANS(URSQRTE_v, do_gvec_fn2, a, gen_gvec_ursqrte)
39
40
static bool do_gvec_fn2_bhs(DisasContext *s, arg_qrr_e *a, GVecGen2Fn *fn)
41
{
42
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2_ptr * const f_frsqrte[] = {
43
};
44
TRANS(FRSQRTE_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_frsqrte)
45
46
-static void handle_2misc_reciprocal(DisasContext *s, int opcode,
47
- bool is_scalar, bool is_u, bool is_q,
48
- int size, int rn, int rd)
49
-{
50
- bool is_double = (size == 3);
51
-
52
- if (is_double) {
53
- g_assert_not_reached();
54
- } else {
55
- TCGv_i32 tcg_op = tcg_temp_new_i32();
56
- TCGv_i32 tcg_res = tcg_temp_new_i32();
57
- int pass, maxpasses;
58
-
59
- if (is_scalar) {
60
- maxpasses = 1;
61
- } else {
62
- maxpasses = is_q ? 4 : 2;
63
- }
64
-
65
- for (pass = 0; pass < maxpasses; pass++) {
66
- read_vec_element_i32(s, tcg_op, rn, pass, MO_32);
67
-
68
- switch (opcode) {
69
- case 0x3c: /* URECPE */
70
- gen_helper_recpe_u32(tcg_res, tcg_op);
71
- break;
72
- case 0x3d: /* FRECPE */
73
- case 0x3f: /* FRECPX */
74
- case 0x7d: /* FRSQRTE */
75
- default:
76
- g_assert_not_reached();
77
- }
78
-
79
- if (is_scalar) {
80
- write_fp_sreg(s, rd, tcg_res);
81
- } else {
82
- write_vec_element_i32(s, tcg_res, rd, pass, MO_32);
83
- }
84
- }
85
- if (!is_scalar) {
86
- clear_vec_high(s, is_q, rd);
87
- }
88
- }
89
-}
90
-
91
static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q,
92
int size, int rn, int rd)
93
{
94
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
95
bool is_q = extract32(insn, 30, 1);
96
int rn = extract32(insn, 5, 5);
97
int rd = extract32(insn, 0, 5);
98
- bool need_fpstatus = false;
99
- int rmode = -1;
100
- TCGv_i32 tcg_rmode;
101
- TCGv_ptr tcg_fpstatus;
102
103
switch (opcode) {
104
case 0xc ... 0xf:
105
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
106
opcode |= (extract32(size, 1, 1) << 5) | (u << 6);
107
size = is_double ? 3 : 2;
108
switch (opcode) {
109
- case 0x3c: /* URECPE */
110
- if (size == 3) {
111
- unallocated_encoding(s);
112
- return;
113
- }
114
- if (!fp_access_check(s)) {
115
- return;
116
- }
117
- handle_2misc_reciprocal(s, opcode, false, u, is_q, size, rn, rd);
118
- return;
119
case 0x17: /* FCVTL, FCVTL2 */
120
if (!fp_access_check(s)) {
121
return;
122
}
123
handle_2misc_widening(s, opcode, is_q, size, rn, rd);
124
return;
125
- case 0x7c: /* URSQRTE */
126
- if (size == 3) {
127
- unallocated_encoding(s);
128
- return;
129
- }
130
- break;
131
default:
132
case 0x16: /* FCVTN, FCVTN2 */
133
case 0x36: /* BFCVTN, BFCVTN2 */
134
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
135
case 0x6d: /* FCMLE (zero) */
136
case 0x3d: /* FRECPE */
137
case 0x7d: /* FRSQRTE */
138
+ case 0x3c: /* URECPE */
139
+ case 0x7c: /* URSQRTE */
140
unallocated_encoding(s);
141
return;
142
}
143
@@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
144
unallocated_encoding(s);
145
return;
146
}
147
-
148
- if (!fp_access_check(s)) {
149
- return;
150
- }
151
-
152
- if (need_fpstatus || rmode >= 0) {
153
- tcg_fpstatus = fpstatus_ptr(FPST_FPCR);
154
- } else {
155
- tcg_fpstatus = NULL;
156
- }
157
- if (rmode >= 0) {
158
- tcg_rmode = gen_set_rmode(rmode, tcg_fpstatus);
159
- } else {
160
- tcg_rmode = NULL;
161
- }
162
-
163
- {
164
- int pass;
165
-
166
- assert(size == 2);
167
- for (pass = 0; pass < (is_q ? 4 : 2); pass++) {
168
- TCGv_i32 tcg_op = tcg_temp_new_i32();
169
- TCGv_i32 tcg_res = tcg_temp_new_i32();
170
-
171
- read_vec_element_i32(s, tcg_op, rn, pass, MO_32);
172
-
173
- {
174
- /* Special cases for 32 bit elements */
175
- switch (opcode) {
176
- case 0x7c: /* URSQRTE */
177
- gen_helper_rsqrte_u32(tcg_res, tcg_op);
178
- break;
179
- default:
180
- case 0x7: /* SQABS, SQNEG */
181
- case 0x2f: /* FABS */
182
- case 0x6f: /* FNEG */
183
- case 0x7f: /* FSQRT */
184
- case 0x18: /* FRINTN */
185
- case 0x19: /* FRINTM */
186
- case 0x38: /* FRINTP */
187
- case 0x39: /* FRINTZ */
188
- case 0x58: /* FRINTA */
189
- case 0x79: /* FRINTI */
190
- case 0x59: /* FRINTX */
191
- case 0x1e: /* FRINT32Z */
192
- case 0x5e: /* FRINT32X */
193
- case 0x1f: /* FRINT64Z */
194
- case 0x5f: /* FRINT64X */
195
- case 0x1a: /* FCVTNS */
196
- case 0x1b: /* FCVTMS */
197
- case 0x1c: /* FCVTAS */
198
- case 0x3a: /* FCVTPS */
199
- case 0x3b: /* FCVTZS */
200
- case 0x5a: /* FCVTNU */
201
- case 0x5b: /* FCVTMU */
202
- case 0x5c: /* FCVTAU */
203
- case 0x7a: /* FCVTPU */
204
- case 0x7b: /* FCVTZU */
205
- g_assert_not_reached();
206
- }
207
- }
208
- write_vec_element_i32(s, tcg_res, rd, pass, MO_32);
209
- }
210
- }
211
- clear_vec_high(s, is_q, rd);
212
-
213
- if (tcg_rmode) {
214
- gen_restore_rmode(tcg_rmode, tcg_fpstatus);
215
- }
216
+ g_assert_not_reached();
32
}
217
}
33
218
34
static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
219
/* C3.6 Data processing - SIMD, inc Crypto
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
--
220
--
59
2.25.1
221
2.34.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 lookup_disas_fn, handle_2misc_widening,
4
disas_simd_two_reg_misc, disas_data_proc_simd,
5
disas_data_proc_simd_fp, disas_a64_legacy, as
6
this is the final insn to be converted.
7
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-id: 20220527181907.189259-90-richard.henderson@linaro.org
10
Message-id: 20241211163036.2297116-70-richard.henderson@linaro.org
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
7
---
12
---
8
target/arm/translate-sve.c | 30 +++++++++++++++++-------------
13
target/arm/tcg/a64.decode | 2 +
9
1 file changed, 17 insertions(+), 13 deletions(-)
14
target/arm/tcg/translate-a64.c | 202 +++------------------------------
15
2 files changed, 18 insertions(+), 186 deletions(-)
10
16
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
17
diff --git a/target/arm/tcg/a64.decode b/target/arm/tcg/a64.decode
12
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
19
--- a/target/arm/tcg/a64.decode
14
+++ b/target/arm/translate-sve.c
20
+++ b/target/arm/tcg/a64.decode
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(FMUL_zzx, aa64_sve, gen_gvec_fpst_zzz,
21
@@ -XXX,XX +XXX,XX @@ FRSQRTE_v 0.10 1110 1.1 00001 11011 0 ..... ..... @qrr_sd
16
typedef void gen_helper_fp_reduce(TCGv_i64, TCGv_ptr, TCGv_ptr,
22
URECPE_v 0.00 1110 101 00001 11001 0 ..... ..... @qrr_s
17
TCGv_ptr, TCGv_i32);
23
URSQRTE_v 0.10 1110 101 00001 11001 0 ..... ..... @qrr_s
18
24
19
-static void do_reduce(DisasContext *s, arg_rpr_esz *a,
25
+FCVTL_v 0.00 1110 0.1 00001 01111 0 ..... ..... @qrr_sd
20
+static bool do_reduce(DisasContext *s, arg_rpr_esz *a,
26
+
21
gen_helper_fp_reduce *fn)
27
&fcvt_q rd rn esz q shift
28
@fcvtq_h . q:1 . ...... 001 .... ...... rn:5 rd:5 \
29
&fcvt_q esz=1 shift=%fcvt_f_sh_h
30
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/arm/tcg/translate-a64.c
33
+++ b/target/arm/tcg/translate-a64.c
34
@@ -XXX,XX +XXX,XX @@ static inline void gen_check_sp_alignment(DisasContext *s)
35
*/
36
}
37
38
-/*
39
- * This provides a simple table based table lookup decoder. It is
40
- * intended to be used when the relevant bits for decode are too
41
- * awkwardly placed and switch/if based logic would be confusing and
42
- * deeply nested. Since it's a linear search through the table, tables
43
- * should be kept small.
44
- *
45
- * It returns the first handler where insn & mask == pattern, or
46
- * NULL if there is no match.
47
- * The table is terminated by an empty mask (i.e. 0)
48
- */
49
-static inline AArch64DecodeFn *lookup_disas_fn(const AArch64DecodeTable *table,
50
- uint32_t insn)
51
-{
52
- const AArch64DecodeTable *tptr = table;
53
-
54
- while (tptr->mask) {
55
- if ((insn & tptr->mask) == tptr->pattern) {
56
- return tptr->disas_fn;
57
- }
58
- tptr++;
59
- }
60
- return NULL;
61
-}
62
-
63
/*
64
* The instruction disassembly implemented here matches
65
* the instruction encoding classifications in chapter C4
66
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_2_ptr * const f_frsqrte[] = {
67
};
68
TRANS(FRSQRTE_v, do_gvec_op2_fpst, a->esz, a->q, a->rd, a->rn, 0, f_frsqrte)
69
70
-static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q,
71
- int size, int rn, int rd)
72
+static bool trans_FCVTL_v(DisasContext *s, arg_qrr_e *a)
22
{
73
{
23
- unsigned vsz = vec_full_reg_size(s);
74
/* Handle 2-reg-misc ops which are widening (so each size element
24
- unsigned p2vsz = pow2ceil(vsz);
75
* in the source becomes a 2*size element in the destination.
25
- TCGv_i32 t_desc = tcg_constant_i32(simd_desc(vsz, vsz, p2vsz));
76
@@ -XXX,XX +XXX,XX @@ static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q,
26
+ unsigned vsz, p2vsz;
77
*/
27
+ TCGv_i32 t_desc;
78
int pass;
28
TCGv_ptr t_zn, t_pg, status;
79
29
TCGv_i64 temp;
80
- if (size == 3) {
30
81
+ if (!fp_access_check(s)) {
31
+ if (fn == NULL) {
32
+ return false;
33
+ }
34
+ if (!sve_access_check(s)) {
35
+ return true;
82
+ return true;
36
+ }
83
+ }
37
+
84
+
38
+ vsz = vec_full_reg_size(s);
85
+ if (a->esz == MO_64) {
39
+ p2vsz = pow2ceil(vsz);
86
/* 32 -> 64 bit fp conversion */
40
+ t_desc = tcg_constant_i32(simd_desc(vsz, vsz, p2vsz));
87
TCGv_i64 tcg_res[2];
41
temp = tcg_temp_new_i64();
88
- int srcelt = is_q ? 2 : 0;
42
t_zn = tcg_temp_new_ptr();
89
+ TCGv_i32 tcg_op = tcg_temp_new_i32();
43
t_pg = tcg_temp_new_ptr();
90
+ int srcelt = a->q ? 2 : 0;
44
@@ -XXX,XX +XXX,XX @@ static void do_reduce(DisasContext *s, arg_rpr_esz *a,
91
45
92
for (pass = 0; pass < 2; pass++) {
46
write_fp_dreg(s, a->rd, temp);
93
- TCGv_i32 tcg_op = tcg_temp_new_i32();
47
tcg_temp_free_i64(temp);
94
tcg_res[pass] = tcg_temp_new_i64();
95
-
96
- read_vec_element_i32(s, tcg_op, rn, srcelt + pass, MO_32);
97
+ read_vec_element_i32(s, tcg_op, a->rn, srcelt + pass, MO_32);
98
gen_helper_vfp_fcvtds(tcg_res[pass], tcg_op, tcg_env);
99
}
100
for (pass = 0; pass < 2; pass++) {
101
- write_vec_element(s, tcg_res[pass], rd, pass, MO_64);
102
+ write_vec_element(s, tcg_res[pass], a->rd, pass, MO_64);
103
}
104
} else {
105
/* 16 -> 32 bit fp conversion */
106
- int srcelt = is_q ? 4 : 0;
107
+ int srcelt = a->q ? 4 : 0;
108
TCGv_i32 tcg_res[4];
109
TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR);
110
TCGv_i32 ahp = get_ahp_flag();
111
112
for (pass = 0; pass < 4; pass++) {
113
tcg_res[pass] = tcg_temp_new_i32();
114
-
115
- read_vec_element_i32(s, tcg_res[pass], rn, srcelt + pass, MO_16);
116
+ read_vec_element_i32(s, tcg_res[pass], a->rn, srcelt + pass, MO_16);
117
gen_helper_vfp_fcvt_f16_to_f32(tcg_res[pass], tcg_res[pass],
118
fpst, ahp);
119
}
120
for (pass = 0; pass < 4; pass++) {
121
- write_vec_element_i32(s, tcg_res[pass], rd, pass, MO_32);
122
+ write_vec_element_i32(s, tcg_res[pass], a->rd, pass, MO_32);
123
}
124
}
125
-}
126
-
127
-/* AdvSIMD two reg misc
128
- * 31 30 29 28 24 23 22 21 17 16 12 11 10 9 5 4 0
129
- * +---+---+---+-----------+------+-----------+--------+-----+------+------+
130
- * | 0 | Q | U | 0 1 1 1 0 | size | 1 0 0 0 0 | opcode | 1 0 | Rn | Rd |
131
- * +---+---+---+-----------+------+-----------+--------+-----+------+------+
132
- */
133
-static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn)
134
-{
135
- int size = extract32(insn, 22, 2);
136
- int opcode = extract32(insn, 12, 5);
137
- bool u = extract32(insn, 29, 1);
138
- bool is_q = extract32(insn, 30, 1);
139
- int rn = extract32(insn, 5, 5);
140
- int rd = extract32(insn, 0, 5);
141
-
142
- switch (opcode) {
143
- case 0xc ... 0xf:
144
- case 0x16 ... 0x1f:
145
- {
146
- /* Floating point: U, size[1] and opcode indicate operation;
147
- * size[0] indicates single or double precision.
148
- */
149
- int is_double = extract32(size, 0, 1);
150
- opcode |= (extract32(size, 1, 1) << 5) | (u << 6);
151
- size = is_double ? 3 : 2;
152
- switch (opcode) {
153
- case 0x17: /* FCVTL, FCVTL2 */
154
- if (!fp_access_check(s)) {
155
- return;
156
- }
157
- handle_2misc_widening(s, opcode, is_q, size, rn, rd);
158
- return;
159
- default:
160
- case 0x16: /* FCVTN, FCVTN2 */
161
- case 0x36: /* BFCVTN, BFCVTN2 */
162
- case 0x56: /* FCVTXN, FCVTXN2 */
163
- case 0x2f: /* FABS */
164
- case 0x6f: /* FNEG */
165
- case 0x7f: /* FSQRT */
166
- case 0x18: /* FRINTN */
167
- case 0x19: /* FRINTM */
168
- case 0x38: /* FRINTP */
169
- case 0x39: /* FRINTZ */
170
- case 0x59: /* FRINTX */
171
- case 0x79: /* FRINTI */
172
- case 0x58: /* FRINTA */
173
- case 0x1e: /* FRINT32Z */
174
- case 0x1f: /* FRINT64Z */
175
- case 0x5e: /* FRINT32X */
176
- case 0x5f: /* FRINT64X */
177
- case 0x1d: /* SCVTF */
178
- case 0x5d: /* UCVTF */
179
- case 0x1a: /* FCVTNS */
180
- case 0x1b: /* FCVTMS */
181
- case 0x3a: /* FCVTPS */
182
- case 0x3b: /* FCVTZS */
183
- case 0x5a: /* FCVTNU */
184
- case 0x5b: /* FCVTMU */
185
- case 0x7a: /* FCVTPU */
186
- case 0x7b: /* FCVTZU */
187
- case 0x5c: /* FCVTAU */
188
- case 0x1c: /* FCVTAS */
189
- case 0x2c: /* FCMGT (zero) */
190
- case 0x2d: /* FCMEQ (zero) */
191
- case 0x2e: /* FCMLT (zero) */
192
- case 0x6c: /* FCMGE (zero) */
193
- case 0x6d: /* FCMLE (zero) */
194
- case 0x3d: /* FRECPE */
195
- case 0x7d: /* FRSQRTE */
196
- case 0x3c: /* URECPE */
197
- case 0x7c: /* URSQRTE */
198
- unallocated_encoding(s);
199
- return;
200
- }
201
- break;
202
- }
203
- default:
204
- case 0x0: /* REV64, REV32 */
205
- case 0x1: /* REV16 */
206
- case 0x2: /* SADDLP, UADDLP */
207
- case 0x3: /* SUQADD, USQADD */
208
- case 0x4: /* CLS, CLZ */
209
- case 0x5: /* CNT, NOT, RBIT */
210
- case 0x6: /* SADALP, UADALP */
211
- case 0x7: /* SQABS, SQNEG */
212
- case 0x8: /* CMGT, CMGE */
213
- case 0x9: /* CMEQ, CMLE */
214
- case 0xa: /* CMLT */
215
- case 0xb: /* ABS, NEG */
216
- case 0x12: /* XTN, XTN2, SQXTUN, SQXTUN2 */
217
- case 0x13: /* SHLL, SHLL2 */
218
- case 0x14: /* SQXTN, SQXTN2, UQXTN, UQXTN2 */
219
- unallocated_encoding(s);
220
- return;
221
- }
222
- g_assert_not_reached();
223
-}
224
-
225
-/* C3.6 Data processing - SIMD, inc Crypto
226
- *
227
- * As the decode gets a little complex we are using a table based
228
- * approach for this part of the decode.
229
- */
230
-static const AArch64DecodeTable data_proc_simd[] = {
231
- /* pattern , mask , fn */
232
- { 0x0e200800, 0x9f3e0c00, disas_simd_two_reg_misc },
233
- { 0x00000000, 0x00000000, NULL }
234
-};
235
-
236
-static void disas_data_proc_simd(DisasContext *s, uint32_t insn)
237
-{
238
- /* Note that this is called with all non-FP cases from
239
- * table C3-6 so it must UNDEF for entries not specifically
240
- * allocated to instructions in that table.
241
- */
242
- AArch64DecodeFn *fn = lookup_disas_fn(&data_proc_simd[0], insn);
243
- if (fn) {
244
- fn(s, insn);
245
- } else {
246
- unallocated_encoding(s);
247
- }
248
-}
249
-
250
-/* C3.6 Data processing - SIMD and floating point */
251
-static void disas_data_proc_simd_fp(DisasContext *s, uint32_t insn)
252
-{
253
- if (extract32(insn, 28, 1) == 1 && extract32(insn, 30, 1) == 0) {
254
- unallocated_encoding(s); /* in decodetree */
255
- } else {
256
- /* SIMD, including crypto */
257
- disas_data_proc_simd(s, insn);
258
- }
259
+ clear_vec_high(s, true, a->rd);
48
+ return true;
260
+ return true;
49
}
261
}
50
262
51
#define DO_VPZ(NAME, name) \
263
static bool trans_OK(DisasContext *s, arg_OK *a)
52
static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
264
@@ -XXX,XX +XXX,XX @@ static bool btype_destination_ok(uint32_t insn, bool bt, int btype)
53
{ \
265
return false;
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
}
266
}
70
267
71
DO_VPZ(FADDV, faddv)
268
-/* C3.1 A64 instruction index by encoding */
269
-static void disas_a64_legacy(DisasContext *s, uint32_t insn)
270
-{
271
- switch (extract32(insn, 25, 4)) {
272
- case 0x7:
273
- case 0xf: /* Data processing - SIMD and floating point */
274
- disas_data_proc_simd_fp(s, insn);
275
- break;
276
- default:
277
- unallocated_encoding(s);
278
- break;
279
- }
280
-}
281
-
282
static void aarch64_tr_init_disas_context(DisasContextBase *dcbase,
283
CPUState *cpu)
284
{
285
@@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
286
if (!disas_a64(s, insn) &&
287
!disas_sme(s, insn) &&
288
!disas_sve(s, insn)) {
289
- disas_a64_legacy(s, insn);
290
+ unallocated_encoding(s);
291
}
292
293
/*
72
--
294
--
73
2.25.1
295
2.34.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
Softfloat has native support for round-to-odd. Use it.
4
same operation could be performed with NAND or NOR,
5
only bother with the official alias.
6
4
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-81-richard.henderson@linaro.org
6
Message-id: 20241206031428.78634-1-richard.henderson@linaro.org
9
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
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 | 5 +++++
10
target/arm/tcg/helper-a64.c | 18 ++++--------------
13
1 file changed, 5 insertions(+)
11
1 file changed, 4 insertions(+), 14 deletions(-)
14
12
15
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/target/arm/translate-sve.c
15
--- a/target/arm/tcg/helper-a64.c
18
+++ b/target/arm/translate-sve.c
16
+++ b/target/arm/tcg/helper-a64.c
19
@@ -XXX,XX +XXX,XX @@ static bool trans_EOR_pppp(DisasContext *s, arg_rprr_s *a)
17
@@ -XXX,XX +XXX,XX @@ float64 HELPER(frecpx_f64)(float64 a, void *fpstp)
20
.fno = gen_helper_sve_eor_pppp,
18
21
.prefer_i64 = TCG_TARGET_REG_BITS == 64,
19
float32 HELPER(fcvtx_f64_to_f32)(float64 a, CPUARMState *env)
22
};
20
{
23
+
21
- /* Von Neumann rounding is implemented by using round-to-zero
24
+ /* Alias NOT (predicate) is EOR Pd.B, Pg/Z, Pn.B, Pg.B */
22
- * and then setting the LSB of the result if Inexact was raised.
25
+ if (!a->s && a->pg == a->rm) {
23
- */
26
+ return gen_gvec_fn_ppp(s, tcg_gen_gvec_andc, a->rd, a->pg, a->rn);
24
float32 r;
27
+ }
25
float_status *fpst = &env->vfp.fp_status;
28
return do_pppp_flags(s, a, &op);
26
- float_status tstat = *fpst;
27
- int exflags;
28
+ int old = get_float_rounding_mode(fpst);
29
30
- set_float_rounding_mode(float_round_to_zero, &tstat);
31
- set_float_exception_flags(0, &tstat);
32
- r = float64_to_float32(a, &tstat);
33
- exflags = get_float_exception_flags(&tstat);
34
- if (exflags & float_flag_inexact) {
35
- r = make_float32(float32_val(r) | 1);
36
- }
37
- exflags |= get_float_exception_flags(fpst);
38
- set_float_exception_flags(exflags, fpst);
39
+ set_float_rounding_mode(float_round_to_odd, fpst);
40
+ r = float64_to_float32(a, fpst);
41
+ set_float_rounding_mode(old, fpst);
42
return r;
29
}
43
}
30
44
31
--
45
--
32
2.25.1
46
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
2
3
Two uses of gen_gvec_fn_zzz can pass on arg_rrr_esz instead.
3
www.orangepi.org does not support https, it's expected to stick to http.
4
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Reviewed-by: Niek Linnenbank <nieklinnenbank@gmail.com>
6
Message-id: 20220527181907.189259-33-richard.henderson@linaro.org
6
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
Message-id: 20241206192254.3889131-2-pierrick.bouvier@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-sve.c | 4 ++--
10
docs/system/arm/orangepi.rst | 4 ++--
11
1 file changed, 2 insertions(+), 2 deletions(-)
11
1 file changed, 2 insertions(+), 2 deletions(-)
12
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
diff --git a/docs/system/arm/orangepi.rst b/docs/system/arm/orangepi.rst
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
15
--- a/docs/system/arm/orangepi.rst
16
+++ b/target/arm/translate-sve.c
16
+++ b/docs/system/arm/orangepi.rst
17
@@ -XXX,XX +XXX,XX @@ static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
17
@@ -XXX,XX +XXX,XX @@ Orange Pi PC images
18
if (!dc_isar_feature(aa64_sve2, s)) {
18
Note that the mainline kernel does not have a root filesystem. You may provide it
19
return false;
19
with an official Orange Pi PC image from the official website:
20
}
20
21
- return gen_gvec_fn_zzz(s, tcg_gen_gvec_mul, a->esz, a->rd, a->rn, a->rm);
21
- http://www.orangepi.org/downloadresources/
22
+ return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_mul, a);
22
+ http://www.orangepi.org/html/serviceAndSupport/index.html
23
}
23
24
24
Another possibility is to run an Armbian image for Orange Pi PC which
25
static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
25
can be downloaded from:
26
@@ -XXX,XX +XXX,XX @@ static bool do_sve2_fn_zzz(DisasContext *s, arg_rrr_esz *a, GVecGen3Fn *fn)
26
@@ -XXX,XX +XXX,XX @@ including the Orange Pi PC. NetBSD 9.0 is known to work best for the Orange Pi P
27
if (!dc_isar_feature(aa64_sve2, s)) {
27
board and provides a fully working system with serial console, networking and storage.
28
return false;
28
For the Orange Pi PC machine, get the 'evbarm-earmv7hf' based image from:
29
}
29
30
- return gen_gvec_fn_zzz(s, fn, a->esz, a->rd, a->rn, a->rm);
30
- https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.0/evbarm-earmv7hf/binary/gzimg/armv7.img.gz
31
+ return gen_gvec_fn_arg_zzz(s, fn, a);
31
+ https://archive.netbsd.org/pub/NetBSD-archive/NetBSD-9.0/evbarm-earmv7hf/binary/gzimg/armv7.img.gz
32
}
32
33
33
The image requires manually installing U-Boot in the image. Build U-Boot with
34
static bool trans_SABA(DisasContext *s, arg_rrr_esz *a)
34
the orangepi_pc_defconfig configuration as described in the previous section.
35
--
35
--
36
2.25.1
36
2.34.1
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <f4bug@amsat.org>
1
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
2
3
Fix when building HVF on macOS Aarch64:
3
Reviewed-by: Cédric Le Goater <clg@redhat.com>
4
4
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
target/arm/hvf/hvf.c:586:15: error: unknown type name 'ARMCPRegInfo'; did you mean 'ARMCPUInfo'?
5
Message-id: 20241206192254.3889131-3-pierrick.bouvier@linaro.org
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>
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
37
---
7
---
38
target/arm/hvf/hvf.c | 1 +
8
docs/system/arm/fby35.rst | 5 +++++
39
1 file changed, 1 insertion(+)
9
1 file changed, 5 insertions(+)
40
10
41
diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c
11
diff --git a/docs/system/arm/fby35.rst b/docs/system/arm/fby35.rst
42
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
43
--- a/target/arm/hvf/hvf.c
13
--- a/docs/system/arm/fby35.rst
44
+++ b/target/arm/hvf/hvf.c
14
+++ b/docs/system/arm/fby35.rst
45
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@ process starts.
46
#include "sysemu/hvf_int.h"
16
$ screen /dev/tty0 # In a separate TMUX pane, terminal window, etc.
47
#include "sysemu/hw_accel.h"
17
$ screen /dev/tty1
48
#include "hvf_arm.h"
18
$ (qemu) c         # Start the boot process once screen is setup.
49
+#include "cpregs.h"
19
+
50
20
+This machine model supports emulation of the boot from the CE0 flash device by
51
#include <mach/mach_time.h>
21
+setting option ``execute-in-place``. When using this option, the CPU fetches
52
22
+instructions to execute by reading CE0 and not from a preloaded ROM
23
+initialized at machine init time. As a result, execution will be slower.
53
--
24
--
54
2.25.1
25
2.34.1
55
26
56
27
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
4
Message-id: 20220527181907.189259-66-richard.henderson@linaro.org
4
Message-id: 20241206192254.3889131-4-pierrick.bouvier@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 | 17 ++++-------------
8
docs/system/arm/xlnx-versal-virt.rst | 3 +++
9
1 file changed, 4 insertions(+), 13 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/docs/system/arm/xlnx-versal-virt.rst b/docs/system/arm/xlnx-versal-virt.rst
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
13
--- a/docs/system/arm/xlnx-versal-virt.rst
14
+++ b/target/arm/translate-sve.c
14
+++ b/docs/system/arm/xlnx-versal-virt.rst
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(REVH, aa64_sve, gen_gvec_ool_arg_zpz, revh_fns[a->esz], a, 0)
15
@@ -XXX,XX +XXX,XX @@ Run the following at the U-Boot prompt:
16
TRANS_FEAT(REVW, aa64_sve, gen_gvec_ool_arg_zpz,
16
fdt set /chosen/dom0 reg <0x00000000 0x40000000 0x0 0x03100000>
17
a->esz == 3 ? gen_helper_sve_revw_d : NULL, a, 0)
17
booti 30000000 - 20000000
18
18
19
-static bool trans_SPLICE(DisasContext *s, arg_rprr_esz *a)
19
+It's possible to change the OSPI flash model emulated by using the machine model
20
-{
20
+option ``ospi-flash``.
21
- return gen_gvec_ool_zzzp(s, gen_helper_sve_splice,
21
+
22
- a->rd, a->rn, a->rm, a->pg, a->esz);
22
BBRAM File Backend
23
-}
23
""""""""""""""""""
24
+TRANS_FEAT(SPLICE, aa64_sve, gen_gvec_ool_arg_zpzz,
24
BBRAM can have an optional file backend, which must be a seekable
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
--
25
--
41
2.25.1
26
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
2
3
Convert SVE translation functions using do_sve2_zzz_data
3
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
4
to use TRANS_FEAT and gen_gvec_ool_zzz.
4
Message-id: 20241206192254.3889131-5-pierrick.bouvier@linaro.org
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
7
---
8
docs/system/arm/virt.rst | 16 ++++++++++++++++
9
1 file changed, 16 insertions(+)
5
10
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
diff --git a/docs/system/arm/virt.rst b/docs/system/arm/virt.rst
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
12
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
13
--- a/docs/system/arm/virt.rst
17
+++ b/target/arm/translate-sve.c
14
+++ b/docs/system/arm/virt.rst
18
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SUDOT_zzxw_s, aa64_sve_i8mm, gen_gvec_ool_arg_zzxz,
15
@@ -XXX,XX +XXX,XX @@ iommu
19
TRANS_FEAT(USDOT_zzxw_s, aa64_sve_i8mm, gen_gvec_ool_arg_zzxz,
16
``smmuv3``
20
gen_helper_gvec_usdot_idx_b, a)
17
Create an SMMUv3
21
18
22
-static bool do_sve2_zzz_data(DisasContext *s, int rd, int rn, int rm, int data,
19
+default-bus-bypass-iommu
23
- gen_helper_gvec_3 *fn)
20
+ Set ``on``/``off`` to enable/disable `bypass_iommu
24
-{
21
+ <https://gitlab.com/qemu-project/qemu/-/blob/master/docs/bypass-iommu.txt>`_
25
- if (fn == NULL || !dc_isar_feature(aa64_sve2, s)) {
22
+ for default root bus.
26
- return false;
23
+
27
- }
24
ras
28
- if (sve_access_check(s)) {
25
Set ``on``/``off`` to enable/disable reporting host memory errors to a guest
29
- unsigned vsz = vec_full_reg_size(s);
26
using ACPI and guest external abort exceptions. The default is off.
30
- tcg_gen_gvec_3_ool(vec_full_reg_offset(s, rd),
27
31
- vec_full_reg_offset(s, rn),
28
+acpi
32
- vec_full_reg_offset(s, rm),
29
+ Set ``on``/``off``/``auto`` to enable/disable ACPI.
33
- vsz, vsz, data, fn);
30
+
34
- }
31
dtb-randomness
35
- return true;
32
Set ``on``/``off`` to pass random seeds via the guest DTB
36
-}
33
rng-seed and kaslr-seed nodes (in both "/chosen" and
37
-
34
@@ -XXX,XX +XXX,XX @@ dtb-randomness
38
#define DO_SVE2_RRX(NAME, FUNC) \
35
dtb-kaslr-seed
39
- static bool NAME(DisasContext *s, arg_rrx_esz *a) \
36
A deprecated synonym for dtb-randomness.
40
- { return do_sve2_zzz_data(s, a->rd, a->rn, a->rm, a->index, FUNC); }
37
41
+ TRANS_FEAT(NAME, aa64_sve, gen_gvec_ool_zzz, FUNC, \
38
+x-oem-id
42
+ a->rd, a->rn, a->rm, a->index)
39
+ Set string (up to 6 bytes) to override the default value of field OEMID in ACPI
43
40
+ table header.
44
-DO_SVE2_RRX(trans_MUL_zzx_h, gen_helper_gvec_mul_idx_h)
41
+
45
-DO_SVE2_RRX(trans_MUL_zzx_s, gen_helper_gvec_mul_idx_s)
42
+x-oem-table-id
46
-DO_SVE2_RRX(trans_MUL_zzx_d, gen_helper_gvec_mul_idx_d)
43
+ Set string (up to 8 bytes) to override the default value of field OEM Table ID
47
+DO_SVE2_RRX(MUL_zzx_h, gen_helper_gvec_mul_idx_h)
44
+ in ACPI table header.
48
+DO_SVE2_RRX(MUL_zzx_s, gen_helper_gvec_mul_idx_s)
45
+
49
+DO_SVE2_RRX(MUL_zzx_d, gen_helper_gvec_mul_idx_d)
46
Linux guest kernel configuration
50
47
""""""""""""""""""""""""""""""""
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
48
105
--
49
--
106
2.25.1
50
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
From: Brian Cain <brian.cain@oss.qualcomm.com>
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Mea culpa, I don't know how I got this wrong in 2dfe93699c. Still
4
Message-id: 20220527181907.189259-57-richard.henderson@linaro.org
4
getting used to the new address, I suppose. Somehow I got it right in the
5
mailmap, though.
6
7
Signed-off-by: Brian Cain <brian.cain@oss.qualcomm.com>
8
Message-id: 20241209181242.1434231-1-brian.cain@oss.qualcomm.com
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
9
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 | 17 +++--------------
12
MAINTAINERS | 2 +-
9
1 file changed, 3 insertions(+), 14 deletions(-)
13
1 file changed, 1 insertion(+), 1 deletion(-)
10
14
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
diff --git a/MAINTAINERS b/MAINTAINERS
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
17
--- a/MAINTAINERS
14
+++ b/target/arm/translate-sve.c
18
+++ b/MAINTAINERS
15
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(UZP2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_uzp_p)
19
@@ -XXX,XX +XXX,XX @@ F: target/avr/
16
TRANS_FEAT(TRN1_p, aa64_sve, do_perm_pred3, a, 0, gen_helper_sve_trn_p)
20
F: tests/functional/test_avr_mega2560.py
17
TRANS_FEAT(TRN2_p, aa64_sve, do_perm_pred3, a, 1, gen_helper_sve_trn_p)
21
18
22
Hexagon TCG CPUs
19
-static bool trans_REV_p(DisasContext *s, arg_rr_esz *a)
23
-M: Brian Cain <bcain@oss.qualcomm.com>
20
-{
24
+M: Brian Cain <brian.cain@oss.qualcomm.com>
21
- return do_perm_pred2(s, a, 0, gen_helper_sve_rev_p);
25
S: Supported
22
-}
26
F: target/hexagon/
23
-
27
X: target/hexagon/idef-parser/
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
--
28
--
40
2.25.1
29
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
target/arm/helper.c is very large and unwieldy. One subset of code
2
that we can pull out into its own file is the cpreg arrays and
3
corresponding functions for the TLBI instructions.
2
4
3
Convert SVE translation functions using do_sve2_zpzz_ool
5
Because these are instructions they are only relevant for TCG and we
4
to use TRANS_FEAT and gen_gvec_ool_arg_zpzz.
6
can make the new file only be built for CONFIG_TCG.
5
7
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
In this commit we move the AArch32 instructions from:
7
Message-id: 20220527181907.189259-29-richard.henderson@linaro.org
9
not_v7_cp_reginfo[]
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
v7_cp_reginfo[]
11
v7mp_cp_reginfo[]
12
v8_cp_reginfo[]
13
into a new file target/arm/tcg/tlb-insns.c.
14
15
A few small functions are used both by functions we haven't yet moved
16
across and by functions we have already moved. We temporarily make
17
these global with a prototype in cpregs.h; when the move of all TLBI
18
insns is complete these will return to being file-local.
19
20
For CONFIG_TCG, this is just moving code around. For a KVM only
21
build, these cpregs will no longer be added to the cpregs hashtable
22
for the CPU. However this should not be a behaviour change, because:
23
* we never try to migration sync or otherwise include
24
ARM_CP_NO_RAW cpregs
25
* for migration we treat the kernel's list of system registers
26
as the authoritative one, so these TLBI insns were never
27
in it anyway
28
The no-tcg stub of define_tlb_insn_regs() therefore does nothing.
29
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
30
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
31
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
32
Message-id: 20241210160452.2427965-2-peter.maydell@linaro.org
10
---
33
---
11
target/arm/translate-sve.c | 118 +++++++++++++------------------------
34
target/arm/cpregs.h | 14 +++
12
1 file changed, 40 insertions(+), 78 deletions(-)
35
target/arm/internals.h | 3 +
36
target/arm/helper.c | 231 ++--------------------------------
37
target/arm/tcg-stubs.c | 5 +
38
target/arm/tcg/tlb-insns.c | 246 +++++++++++++++++++++++++++++++++++++
39
target/arm/tcg/meson.build | 1 +
40
6 files changed, 280 insertions(+), 220 deletions(-)
41
create mode 100644 target/arm/tcg/tlb-insns.c
13
42
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
43
diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h
15
index XXXXXXX..XXXXXXX 100644
44
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
45
--- a/target/arm/cpregs.h
17
+++ b/target/arm/translate-sve.c
46
+++ b/target/arm/cpregs.h
18
@@ -XXX,XX +XXX,XX @@ static bool trans_SEL_zpzz(DisasContext *s, arg_rprr_esz *a)
47
@@ -XXX,XX +XXX,XX @@ static inline bool arm_cpreg_traps_in_nv(const ARMCPRegInfo *ri)
19
return true;
48
return ri->opc1 == 4 || ri->opc1 == 5;
20
}
49
}
21
50
22
-#undef DO_ZPZZ
51
+/*
52
+ * Temporary declarations of functions until the move to tlb_insn_helper.c
53
+ * is complete and we can make the functions static again
54
+ */
55
+CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
56
+ bool isread);
57
+CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
58
+ bool isread);
59
+bool tlb_force_broadcast(CPUARMState *env);
60
+void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
61
+ uint64_t value);
62
+void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
63
+ uint64_t value);
64
+
65
#endif /* TARGET_ARM_CPREGS_H */
66
diff --git a/target/arm/internals.h b/target/arm/internals.h
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/arm/internals.h
69
+++ b/target/arm/internals.h
70
@@ -XXX,XX +XXX,XX @@ static inline uint64_t pauth_ptr_mask(ARMVAParameters param)
71
/* Add the cpreg definitions for debug related system registers */
72
void define_debug_regs(ARMCPU *cpu);
73
74
+/* Add the cpreg definitions for TLBI instructions */
75
+void define_tlb_insn_regs(ARMCPU *cpu);
76
+
77
/* Effective value of MDCR_EL2 */
78
static inline uint64_t arm_mdcr_el2_eff(CPUARMState *env)
79
{
80
diff --git a/target/arm/helper.c b/target/arm/helper.c
81
index XXXXXXX..XXXXXXX 100644
82
--- a/target/arm/helper.c
83
+++ b/target/arm/helper.c
84
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tacr(CPUARMState *env, const ARMCPRegInfo *ri,
85
}
86
87
/* Check for traps from EL1 due to HCR_EL2.TTLB. */
88
-static CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
89
- bool isread)
90
+CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
91
+ bool isread)
92
{
93
if (arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_TTLB)) {
94
return CP_ACCESS_TRAP_EL2;
95
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
96
}
97
98
/* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBIS. */
99
-static CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
100
- bool isread)
101
+CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
102
+ bool isread)
103
{
104
if (arm_current_el(env) == 1 &&
105
(arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBIS))) {
106
@@ -XXX,XX +XXX,XX @@ static int alle1_tlbmask(CPUARMState *env)
107
ARMMMUIdxBit_Stage2_S);
108
}
109
110
-
111
-/* IS variants of TLB operations must affect all cores */
112
-static void tlbiall_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
113
- uint64_t value)
114
-{
115
- CPUState *cs = env_cpu(env);
116
-
117
- tlb_flush_all_cpus_synced(cs);
118
-}
119
-
120
-static void tlbiasid_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
121
- uint64_t value)
122
-{
123
- CPUState *cs = env_cpu(env);
124
-
125
- tlb_flush_all_cpus_synced(cs);
126
-}
127
-
128
-static void tlbimva_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
129
- uint64_t value)
130
-{
131
- CPUState *cs = env_cpu(env);
132
-
133
- tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
134
-}
135
-
136
-static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
137
- uint64_t value)
138
-{
139
- CPUState *cs = env_cpu(env);
140
-
141
- tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
142
-}
23
-
143
-
24
/*
144
/*
25
*** SVE Integer Arithmetic - Unary Predicated Group
145
* Non-IS variants of TLB operations are upgraded to
146
* IS versions if we are at EL1 and HCR_EL2.FB is effectively set to
147
* force broadcast of these operations.
26
*/
148
*/
27
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(SQRDMULH_zzz, aa64_sve2, gen_gvec_ool_arg_zzz,
149
-static bool tlb_force_broadcast(CPUARMState *env)
28
* SVE2 Integer - Predicated
150
+bool tlb_force_broadcast(CPUARMState *env)
29
*/
151
{
30
152
return arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_FB);
31
-static bool do_sve2_zpzz_ool(DisasContext *s, arg_rprr_esz *a,
153
}
32
- gen_helper_gvec_4 *fn)
154
33
-{
155
-static void tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri,
34
- if (!dc_isar_feature(aa64_sve2, s)) {
156
- uint64_t value)
35
- return false;
157
-{
158
- /* Invalidate all (TLBIALL) */
159
- CPUState *cs = env_cpu(env);
160
-
161
- if (tlb_force_broadcast(env)) {
162
- tlb_flush_all_cpus_synced(cs);
163
- } else {
164
- tlb_flush(cs);
36
- }
165
- }
37
- return gen_gvec_ool_arg_zpzz(s, fn, a, 0);
166
-}
38
-}
167
-
39
+static gen_helper_gvec_4 * const sadlp_fns[4] = {
168
-static void tlbimva_write(CPUARMState *env, const ARMCPRegInfo *ri,
40
+ NULL, gen_helper_sve2_sadalp_zpzz_h,
169
- uint64_t value)
41
+ gen_helper_sve2_sadalp_zpzz_s, gen_helper_sve2_sadalp_zpzz_d,
170
-{
171
- /* Invalidate single TLB entry by MVA and ASID (TLBIMVA) */
172
- CPUState *cs = env_cpu(env);
173
-
174
- value &= TARGET_PAGE_MASK;
175
- if (tlb_force_broadcast(env)) {
176
- tlb_flush_page_all_cpus_synced(cs, value);
177
- } else {
178
- tlb_flush_page(cs, value);
179
- }
180
-}
181
-
182
-static void tlbiasid_write(CPUARMState *env, const ARMCPRegInfo *ri,
183
- uint64_t value)
184
-{
185
- /* Invalidate by ASID (TLBIASID) */
186
- CPUState *cs = env_cpu(env);
187
-
188
- if (tlb_force_broadcast(env)) {
189
- tlb_flush_all_cpus_synced(cs);
190
- } else {
191
- tlb_flush(cs);
192
- }
193
-}
194
-
195
-static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri,
196
- uint64_t value)
197
-{
198
- /* Invalidate single entry by MVA, all ASIDs (TLBIMVAA) */
199
- CPUState *cs = env_cpu(env);
200
-
201
- value &= TARGET_PAGE_MASK;
202
- if (tlb_force_broadcast(env)) {
203
- tlb_flush_page_all_cpus_synced(cs, value);
204
- } else {
205
- tlb_flush_page(cs, value);
206
- }
207
-}
208
-
209
static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
210
uint64_t value)
211
{
212
@@ -XXX,XX +XXX,XX @@ static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
213
tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2);
214
}
215
216
-static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
217
- uint64_t value)
218
+void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
219
+ uint64_t value)
220
{
221
CPUState *cs = env_cpu(env);
222
uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
223
@@ -XXX,XX +XXX,XX @@ static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
224
tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E2);
225
}
226
227
-static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
228
- uint64_t value)
229
+void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
230
+ uint64_t value)
231
{
232
CPUState *cs = env_cpu(env);
233
uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
234
@@ -XXX,XX +XXX,XX @@ static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
235
ARMMMUIdxBit_E2);
236
}
237
238
-static void tlbiipas2_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
239
- uint64_t value)
240
-{
241
- CPUState *cs = env_cpu(env);
242
- uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12;
243
-
244
- tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2);
245
-}
246
-
247
-static void tlbiipas2is_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
248
- uint64_t value)
249
-{
250
- CPUState *cs = env_cpu(env);
251
- uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12;
252
-
253
- tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, ARMMMUIdxBit_Stage2);
254
-}
255
-
256
static const ARMCPRegInfo cp_reginfo[] = {
257
/*
258
* Define the secure and non-secure FCSE identifier CP registers
259
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo not_v7_cp_reginfo[] = {
260
*/
261
{ .name = "DBGDIDR", .cp = 14, .crn = 0, .crm = 0, .opc1 = 0, .opc2 = 0,
262
.access = PL0_R, .type = ARM_CP_CONST, .resetvalue = 0 },
263
- /*
264
- * MMU TLB control. Note that the wildcarding means we cover not just
265
- * the unified TLB ops but also the dside/iside/inner-shareable variants.
266
- */
267
- { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY,
268
- .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write,
269
- .type = ARM_CP_NO_RAW },
270
- { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY,
271
- .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write,
272
- .type = ARM_CP_NO_RAW },
273
- { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY,
274
- .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write,
275
- .type = ARM_CP_NO_RAW },
276
- { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY,
277
- .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write,
278
- .type = ARM_CP_NO_RAW },
279
{ .name = "PRRR", .cp = 15, .crn = 10, .crm = 2,
280
.opc1 = 0, .opc2 = 0, .access = PL1_RW, .type = ARM_CP_NOP },
281
{ .name = "NMRR", .cp = 15, .crn = 10, .crm = 2,
282
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
283
.opc0 = 3, .opc1 = 0, .crn = 12, .crm = 1, .opc2 = 0,
284
.fgt = FGT_ISR_EL1,
285
.type = ARM_CP_NO_RAW, .access = PL1_R, .readfn = isr_read },
286
- /* 32 bit ITLB invalidates */
287
- { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0,
288
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
289
- .writefn = tlbiall_write },
290
- { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
291
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
292
- .writefn = tlbimva_write },
293
- { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2,
294
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
295
- .writefn = tlbiasid_write },
296
- /* 32 bit DTLB invalidates */
297
- { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0,
298
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
299
- .writefn = tlbiall_write },
300
- { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
301
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
302
- .writefn = tlbimva_write },
303
- { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2,
304
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
305
- .writefn = tlbiasid_write },
306
- /* 32 bit TLB invalidates */
307
- { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
308
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
309
- .writefn = tlbiall_write },
310
- { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
311
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
312
- .writefn = tlbimva_write },
313
- { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
314
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
315
- .writefn = tlbiasid_write },
316
- { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
317
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
318
- .writefn = tlbimvaa_write },
319
-};
320
-
321
-static const ARMCPRegInfo v7mp_cp_reginfo[] = {
322
- /* 32 bit TLB invalidates, Inner Shareable */
323
- { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
324
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
325
- .writefn = tlbiall_is_write },
326
- { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
327
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
328
- .writefn = tlbimva_is_write },
329
- { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
330
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
331
- .writefn = tlbiasid_is_write },
332
- { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
333
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
334
- .writefn = tlbimvaa_is_write },
335
};
336
337
static const ARMCPRegInfo pmovsset_cp_reginfo[] = {
338
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
339
.fieldoffset = offsetof(CPUARMState, cp15.par_el[1]),
340
.writefn = par_write },
341
#endif
342
- /* TLB invalidate last level of translation table walk */
343
- { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
344
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
345
- .writefn = tlbimva_is_write },
346
- { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
347
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
348
- .writefn = tlbimvaa_is_write },
349
- { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
350
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
351
- .writefn = tlbimva_write },
352
- { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
353
- .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
354
- .writefn = tlbimvaa_write },
355
- { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
356
- .type = ARM_CP_NO_RAW, .access = PL2_W,
357
- .writefn = tlbimva_hyp_write },
358
- { .name = "TLBIMVALHIS",
359
- .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
360
- .type = ARM_CP_NO_RAW, .access = PL2_W,
361
- .writefn = tlbimva_hyp_is_write },
362
- { .name = "TLBIIPAS2",
363
- .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
364
- .type = ARM_CP_NO_RAW, .access = PL2_W,
365
- .writefn = tlbiipas2_hyp_write },
366
- { .name = "TLBIIPAS2IS",
367
- .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
368
- .type = ARM_CP_NO_RAW, .access = PL2_W,
369
- .writefn = tlbiipas2is_hyp_write },
370
- { .name = "TLBIIPAS2L",
371
- .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
372
- .type = ARM_CP_NO_RAW, .access = PL2_W,
373
- .writefn = tlbiipas2_hyp_write },
374
- { .name = "TLBIIPAS2LIS",
375
- .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
376
- .type = ARM_CP_NO_RAW, .access = PL2_W,
377
- .writefn = tlbiipas2is_hyp_write },
378
/* 32 bit cache operations */
379
{ .name = "ICIALLUIS", .cp = 15, .opc1 = 0, .crn = 7, .crm = 1, .opc2 = 0,
380
.type = ARM_CP_NOP, .access = PL1_W, .accessfn = access_ticab },
381
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
382
define_arm_cp_regs(cpu, not_v8_cp_reginfo);
383
}
384
385
+ define_tlb_insn_regs(cpu);
386
+
387
if (arm_feature(env, ARM_FEATURE_V6)) {
388
/* The ID registers all have impdef reset values */
389
ARMCPRegInfo v6_idregs[] = {
390
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
391
if (arm_feature(env, ARM_FEATURE_V6K)) {
392
define_arm_cp_regs(cpu, v6k_cp_reginfo);
393
}
394
- if (arm_feature(env, ARM_FEATURE_V7MP) &&
395
- !arm_feature(env, ARM_FEATURE_PMSA)) {
396
- define_arm_cp_regs(cpu, v7mp_cp_reginfo);
397
- }
398
if (arm_feature(env, ARM_FEATURE_V7VE)) {
399
define_arm_cp_regs(cpu, pmovsset_cp_reginfo);
400
}
401
diff --git a/target/arm/tcg-stubs.c b/target/arm/tcg-stubs.c
402
index XXXXXXX..XXXXXXX 100644
403
--- a/target/arm/tcg-stubs.c
404
+++ b/target/arm/tcg-stubs.c
405
@@ -XXX,XX +XXX,XX @@ void raise_exception_ra(CPUARMState *env, uint32_t excp, uint32_t syndrome,
406
void assert_hflags_rebuild_correctly(CPUARMState *env)
407
{
408
}
409
+
410
+/* TLBI insns are only used by TCG, so we don't need to do anything for KVM */
411
+void define_tlb_insn_regs(ARMCPU *cpu)
412
+{
413
+}
414
diff --git a/target/arm/tcg/tlb-insns.c b/target/arm/tcg/tlb-insns.c
415
new file mode 100644
416
index XXXXXXX..XXXXXXX
417
--- /dev/null
418
+++ b/target/arm/tcg/tlb-insns.c
419
@@ -XXX,XX +XXX,XX @@
420
+/*
421
+ * Helpers for TLBI insns
422
+ *
423
+ * This code is licensed under the GNU GPL v2 or later.
424
+ *
425
+ * SPDX-License-Identifier: GPL-2.0-or-later
426
+ */
427
+#include "qemu/osdep.h"
428
+#include "exec/exec-all.h"
429
+#include "cpu.h"
430
+#include "internals.h"
431
+#include "cpu-features.h"
432
+#include "cpregs.h"
433
+
434
+/* IS variants of TLB operations must affect all cores */
435
+static void tlbiall_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
436
+ uint64_t value)
437
+{
438
+ CPUState *cs = env_cpu(env);
439
+
440
+ tlb_flush_all_cpus_synced(cs);
441
+}
442
+
443
+static void tlbiasid_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
444
+ uint64_t value)
445
+{
446
+ CPUState *cs = env_cpu(env);
447
+
448
+ tlb_flush_all_cpus_synced(cs);
449
+}
450
+
451
+static void tlbimva_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
452
+ uint64_t value)
453
+{
454
+ CPUState *cs = env_cpu(env);
455
+
456
+ tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
457
+}
458
+
459
+static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
460
+ uint64_t value)
461
+{
462
+ CPUState *cs = env_cpu(env);
463
+
464
+ tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
465
+}
466
+
467
+static void tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri,
468
+ uint64_t value)
469
+{
470
+ /* Invalidate all (TLBIALL) */
471
+ CPUState *cs = env_cpu(env);
472
+
473
+ if (tlb_force_broadcast(env)) {
474
+ tlb_flush_all_cpus_synced(cs);
475
+ } else {
476
+ tlb_flush(cs);
477
+ }
478
+}
479
+
480
+static void tlbimva_write(CPUARMState *env, const ARMCPRegInfo *ri,
481
+ uint64_t value)
482
+{
483
+ /* Invalidate single TLB entry by MVA and ASID (TLBIMVA) */
484
+ CPUState *cs = env_cpu(env);
485
+
486
+ value &= TARGET_PAGE_MASK;
487
+ if (tlb_force_broadcast(env)) {
488
+ tlb_flush_page_all_cpus_synced(cs, value);
489
+ } else {
490
+ tlb_flush_page(cs, value);
491
+ }
492
+}
493
+
494
+static void tlbiasid_write(CPUARMState *env, const ARMCPRegInfo *ri,
495
+ uint64_t value)
496
+{
497
+ /* Invalidate by ASID (TLBIASID) */
498
+ CPUState *cs = env_cpu(env);
499
+
500
+ if (tlb_force_broadcast(env)) {
501
+ tlb_flush_all_cpus_synced(cs);
502
+ } else {
503
+ tlb_flush(cs);
504
+ }
505
+}
506
+
507
+static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri,
508
+ uint64_t value)
509
+{
510
+ /* Invalidate single entry by MVA, all ASIDs (TLBIMVAA) */
511
+ CPUState *cs = env_cpu(env);
512
+
513
+ value &= TARGET_PAGE_MASK;
514
+ if (tlb_force_broadcast(env)) {
515
+ tlb_flush_page_all_cpus_synced(cs, value);
516
+ } else {
517
+ tlb_flush_page(cs, value);
518
+ }
519
+}
520
+
521
+static void tlbiipas2_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
522
+ uint64_t value)
523
+{
524
+ CPUState *cs = env_cpu(env);
525
+ uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12;
526
+
527
+ tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_Stage2);
528
+}
529
+
530
+static void tlbiipas2is_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
531
+ uint64_t value)
532
+{
533
+ CPUState *cs = env_cpu(env);
534
+ uint64_t pageaddr = (value & MAKE_64BIT_MASK(0, 28)) << 12;
535
+
536
+ tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, ARMMMUIdxBit_Stage2);
537
+}
538
+
539
+static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = {
540
+ /*
541
+ * MMU TLB control. Note that the wildcarding means we cover not just
542
+ * the unified TLB ops but also the dside/iside/inner-shareable variants.
543
+ */
544
+ { .name = "TLBIALL", .cp = 15, .crn = 8, .crm = CP_ANY,
545
+ .opc1 = CP_ANY, .opc2 = 0, .access = PL1_W, .writefn = tlbiall_write,
546
+ .type = ARM_CP_NO_RAW },
547
+ { .name = "TLBIMVA", .cp = 15, .crn = 8, .crm = CP_ANY,
548
+ .opc1 = CP_ANY, .opc2 = 1, .access = PL1_W, .writefn = tlbimva_write,
549
+ .type = ARM_CP_NO_RAW },
550
+ { .name = "TLBIASID", .cp = 15, .crn = 8, .crm = CP_ANY,
551
+ .opc1 = CP_ANY, .opc2 = 2, .access = PL1_W, .writefn = tlbiasid_write,
552
+ .type = ARM_CP_NO_RAW },
553
+ { .name = "TLBIMVAA", .cp = 15, .crn = 8, .crm = CP_ANY,
554
+ .opc1 = CP_ANY, .opc2 = 3, .access = PL1_W, .writefn = tlbimvaa_write,
555
+ .type = ARM_CP_NO_RAW },
42
+};
556
+};
43
+TRANS_FEAT(SADALP_zpzz, aa64_sve2, gen_gvec_ool_arg_zpzz,
557
+
44
+ sadlp_fns[a->esz], a, 0)
558
+static const ARMCPRegInfo tlbi_v7_cp_reginfo[] = {
45
559
+ /* 32 bit ITLB invalidates */
46
-static bool trans_SADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
560
+ { .name = "ITLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 0,
47
-{
561
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
48
- static gen_helper_gvec_4 * const fns[3] = {
562
+ .writefn = tlbiall_write },
49
- gen_helper_sve2_sadalp_zpzz_h,
563
+ { .name = "ITLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
50
- gen_helper_sve2_sadalp_zpzz_s,
564
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
51
- gen_helper_sve2_sadalp_zpzz_d,
565
+ .writefn = tlbimva_write },
52
- };
566
+ { .name = "ITLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 2,
53
- if (a->esz == 0) {
567
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
54
- return false;
568
+ .writefn = tlbiasid_write },
55
- }
569
+ /* 32 bit DTLB invalidates */
56
- return do_sve2_zpzz_ool(s, a, fns[a->esz - 1]);
570
+ { .name = "DTLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 0,
57
-}
571
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
58
-
572
+ .writefn = tlbiall_write },
59
-static bool trans_UADALP_zpzz(DisasContext *s, arg_rprr_esz *a)
573
+ { .name = "DTLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
60
-{
574
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
61
- static gen_helper_gvec_4 * const fns[3] = {
575
+ .writefn = tlbimva_write },
62
- gen_helper_sve2_uadalp_zpzz_h,
576
+ { .name = "DTLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 2,
63
- gen_helper_sve2_uadalp_zpzz_s,
577
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
64
- gen_helper_sve2_uadalp_zpzz_d,
578
+ .writefn = tlbiasid_write },
65
- };
579
+ /* 32 bit TLB invalidates */
66
- if (a->esz == 0) {
580
+ { .name = "TLBIALL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
67
- return false;
581
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
68
- }
582
+ .writefn = tlbiall_write },
69
- return do_sve2_zpzz_ool(s, a, fns[a->esz - 1]);
583
+ { .name = "TLBIMVA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
70
-}
584
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
71
+static gen_helper_gvec_4 * const uadlp_fns[4] = {
585
+ .writefn = tlbimva_write },
72
+ NULL, gen_helper_sve2_uadalp_zpzz_h,
586
+ { .name = "TLBIASID", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
73
+ gen_helper_sve2_uadalp_zpzz_s, gen_helper_sve2_uadalp_zpzz_d,
587
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
588
+ .writefn = tlbiasid_write },
589
+ { .name = "TLBIMVAA", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
590
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
591
+ .writefn = tlbimvaa_write },
74
+};
592
+};
75
+TRANS_FEAT(UADALP_zpzz, aa64_sve2, gen_gvec_ool_arg_zpzz,
593
+
76
+ uadlp_fns[a->esz], a, 0)
594
+static const ARMCPRegInfo tlbi_v7mp_cp_reginfo[] = {
77
595
+ /* 32 bit TLB invalidates, Inner Shareable */
78
/*
596
+ { .name = "TLBIALLIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
79
* SVE2 integer unary operations (predicated)
597
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
80
@@ -XXX,XX +XXX,XX @@ static gen_helper_gvec_3 * const sqneg_fns[4] = {
598
+ .writefn = tlbiall_is_write },
81
};
599
+ { .name = "TLBIMVAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
82
TRANS_FEAT(SQNEG, aa64_sve2, gen_gvec_ool_arg_zpz, sqneg_fns[a->esz], a, 0)
600
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
83
601
+ .writefn = tlbimva_is_write },
84
-#define DO_SVE2_ZPZZ(NAME, name) \
602
+ { .name = "TLBIASIDIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
85
-static bool trans_##NAME(DisasContext *s, arg_rprr_esz *a) \
603
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
86
-{ \
604
+ .writefn = tlbiasid_is_write },
87
- static gen_helper_gvec_4 * const fns[4] = { \
605
+ { .name = "TLBIMVAAIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
88
- gen_helper_sve2_##name##_zpzz_b, gen_helper_sve2_##name##_zpzz_h, \
606
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
89
- gen_helper_sve2_##name##_zpzz_s, gen_helper_sve2_##name##_zpzz_d, \
607
+ .writefn = tlbimvaa_is_write },
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
+};
608
+};
165
+TRANS_FEAT(HISTCNT, aa64_sve2, gen_gvec_ool_arg_zpzz,
609
+
166
+ histcnt_fns[a->esz], a, 0)
610
+static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = {
167
611
+ /* AArch32 TLB invalidate last level of translation table walk */
168
TRANS_FEAT(HISTSEG, aa64_sve2, gen_gvec_ool_arg_zzz,
612
+ { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
169
a->esz == 0 ? gen_helper_sve2_histseg : NULL, a, 0)
613
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
614
+ .writefn = tlbimva_is_write },
615
+ { .name = "TLBIMVAALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
616
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlbis,
617
+ .writefn = tlbimvaa_is_write },
618
+ { .name = "TLBIMVAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
619
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
620
+ .writefn = tlbimva_write },
621
+ { .name = "TLBIMVAAL", .cp = 15, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
622
+ .type = ARM_CP_NO_RAW, .access = PL1_W, .accessfn = access_ttlb,
623
+ .writefn = tlbimvaa_write },
624
+ { .name = "TLBIMVALH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
625
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
626
+ .writefn = tlbimva_hyp_write },
627
+ { .name = "TLBIMVALHIS",
628
+ .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
629
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
630
+ .writefn = tlbimva_hyp_is_write },
631
+ { .name = "TLBIIPAS2",
632
+ .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
633
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
634
+ .writefn = tlbiipas2_hyp_write },
635
+ { .name = "TLBIIPAS2IS",
636
+ .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
637
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
638
+ .writefn = tlbiipas2is_hyp_write },
639
+ { .name = "TLBIIPAS2L",
640
+ .cp = 15, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
641
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
642
+ .writefn = tlbiipas2_hyp_write },
643
+ { .name = "TLBIIPAS2LIS",
644
+ .cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
645
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
646
+ .writefn = tlbiipas2is_hyp_write },
647
+};
648
+
649
+void define_tlb_insn_regs(ARMCPU *cpu)
650
+{
651
+ CPUARMState *env = &cpu->env;
652
+
653
+ if (!arm_feature(env, ARM_FEATURE_V7)) {
654
+ define_arm_cp_regs(cpu, tlbi_not_v7_cp_reginfo);
655
+ } else {
656
+ define_arm_cp_regs(cpu, tlbi_v7_cp_reginfo);
657
+ }
658
+ if (arm_feature(env, ARM_FEATURE_V7MP) &&
659
+ !arm_feature(env, ARM_FEATURE_PMSA)) {
660
+ define_arm_cp_regs(cpu, tlbi_v7mp_cp_reginfo);
661
+ }
662
+ if (arm_feature(env, ARM_FEATURE_V8)) {
663
+ define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo);
664
+ }
665
+}
666
diff --git a/target/arm/tcg/meson.build b/target/arm/tcg/meson.build
667
index XXXXXXX..XXXXXXX 100644
668
--- a/target/arm/tcg/meson.build
669
+++ b/target/arm/tcg/meson.build
670
@@ -XXX,XX +XXX,XX @@ arm_ss.add(files(
671
'op_helper.c',
672
'tlb_helper.c',
673
'vec_helper.c',
674
+ 'tlb-insns.c',
675
))
676
677
arm_ss.add(when: 'TARGET_AARCH64', if_true: files(
170
--
678
--
171
2.25.1
679
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
Move the AArch32 TLBI insns for AArch32 EL2 to tlbi_insn_helper.c.
2
2
To keep this as an obviously pure code-movement, we retain the
3
Convert some SVE translation functions using
3
same condition for registering tlbi_el2_cp_reginfo that we use for
4
gen_gvec_ool_arg_zpzi to TRANS_FEAT.
4
el2_cp_reginfo. We'll be able to simplify this condition later,
5
5
since the need to define the reginfo for EL3-without-EL2 doesn't
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
apply for the TLBI ops specifically.
7
Message-id: 20220527181907.189259-25-richard.henderson@linaro.org
7
8
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
This move brings all the uses of tlbimva_hyp_write() and
9
tlbimva_hyp_is_write() back into a single file, so we can move those
10
also, and make them file-local again.
11
12
The helper alle1_tlbmask() is an exception to the pattern that we
13
only need to make these functions global temporarily, because once
14
this refactoring is complete it will be called by both code in
15
helper.c (vttbr_write()) and by code in tlb-insns.c. We therefore
16
put its prototype in a permanent home in internals.h.
17
9
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
18
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
20
Message-id: 20241210160452.2427965-3-peter.maydell@linaro.org
10
---
21
---
11
target/arm/translate-sve.c | 85 ++++++++++++++------------------------
22
target/arm/cpregs.h | 4 --
12
1 file changed, 30 insertions(+), 55 deletions(-)
23
target/arm/internals.h | 6 +++
13
24
target/arm/helper.c | 74 +--------------------------------
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
25
target/arm/tcg/tlb-insns.c | 85 ++++++++++++++++++++++++++++++++++++++
15
index XXXXXXX..XXXXXXX 100644
26
4 files changed, 92 insertions(+), 77 deletions(-)
16
--- a/target/arm/translate-sve.c
27
17
+++ b/target/arm/translate-sve.c
28
diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h
18
@@ -XXX,XX +XXX,XX @@ static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/cpregs.h
31
+++ b/target/arm/cpregs.h
32
@@ -XXX,XX +XXX,XX @@ CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
33
CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
34
bool isread);
35
bool tlb_force_broadcast(CPUARMState *env);
36
-void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
37
- uint64_t value);
38
-void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
39
- uint64_t value);
40
41
#endif /* TARGET_ARM_CPREGS_H */
42
diff --git a/target/arm/internals.h b/target/arm/internals.h
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/arm/internals.h
45
+++ b/target/arm/internals.h
46
@@ -XXX,XX +XXX,XX @@ uint64_t gt_get_countervalue(CPUARMState *env);
47
* and CNTVCT_EL0 (this will be either 0 or the value of CNTVOFF_EL2).
48
*/
49
uint64_t gt_virt_cnt_offset(CPUARMState *env);
50
+
51
+/*
52
+ * Return mask of ARMMMUIdxBit values corresponding to an "invalidate
53
+ * all EL1" scope; this covers stage 1 and stage 2.
54
+ */
55
+int alle1_tlbmask(CPUARMState *env);
56
#endif
57
diff --git a/target/arm/helper.c b/target/arm/helper.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/target/arm/helper.c
60
+++ b/target/arm/helper.c
61
@@ -XXX,XX +XXX,XX @@ static void contextidr_write(CPUARMState *env, const ARMCPRegInfo *ri,
62
raw_write(env, ri, value);
63
}
64
65
-static int alle1_tlbmask(CPUARMState *env)
66
+int alle1_tlbmask(CPUARMState *env)
67
{
68
/*
69
* Note that the 'ALL' scope must invalidate both stage 1 and
70
@@ -XXX,XX +XXX,XX @@ bool tlb_force_broadcast(CPUARMState *env)
71
return arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_FB);
72
}
73
74
-static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
75
- uint64_t value)
76
-{
77
- CPUState *cs = env_cpu(env);
78
-
79
- tlb_flush_by_mmuidx(cs, alle1_tlbmask(env));
80
-}
81
-
82
-static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
83
- uint64_t value)
84
-{
85
- CPUState *cs = env_cpu(env);
86
-
87
- tlb_flush_by_mmuidx_all_cpus_synced(cs, alle1_tlbmask(env));
88
-}
89
-
90
-
91
-static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
92
- uint64_t value)
93
-{
94
- CPUState *cs = env_cpu(env);
95
-
96
- tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E2);
97
-}
98
-
99
-static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
100
- uint64_t value)
101
-{
102
- CPUState *cs = env_cpu(env);
103
-
104
- tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2);
105
-}
106
-
107
-void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
108
- uint64_t value)
109
-{
110
- CPUState *cs = env_cpu(env);
111
- uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
112
-
113
- tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E2);
114
-}
115
-
116
-void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
117
- uint64_t value)
118
-{
119
- CPUState *cs = env_cpu(env);
120
- uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
121
-
122
- tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
123
- ARMMMUIdxBit_E2);
124
-}
125
-
126
static const ARMCPRegInfo cp_reginfo[] = {
127
/*
128
* Define the secure and non-secure FCSE identifier CP registers
129
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
130
{ .name = "HTTBR", .cp = 15, .opc1 = 4, .crm = 2,
131
.access = PL2_RW, .type = ARM_CP_64BIT | ARM_CP_ALIAS,
132
.fieldoffset = offsetof(CPUARMState, cp15.ttbr0_el[2]) },
133
- { .name = "TLBIALLNSNH",
134
- .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
135
- .type = ARM_CP_NO_RAW, .access = PL2_W,
136
- .writefn = tlbiall_nsnh_write },
137
- { .name = "TLBIALLNSNHIS",
138
- .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
139
- .type = ARM_CP_NO_RAW, .access = PL2_W,
140
- .writefn = tlbiall_nsnh_is_write },
141
- { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
142
- .type = ARM_CP_NO_RAW, .access = PL2_W,
143
- .writefn = tlbiall_hyp_write },
144
- { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
145
- .type = ARM_CP_NO_RAW, .access = PL2_W,
146
- .writefn = tlbiall_hyp_is_write },
147
- { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
148
- .type = ARM_CP_NO_RAW, .access = PL2_W,
149
- .writefn = tlbimva_hyp_write },
150
- { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
151
- .type = ARM_CP_NO_RAW, .access = PL2_W,
152
- .writefn = tlbimva_hyp_is_write },
153
{ .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64,
154
.opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
155
.access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
156
diff --git a/target/arm/tcg/tlb-insns.c b/target/arm/tcg/tlb-insns.c
157
index XXXXXXX..XXXXXXX 100644
158
--- a/target/arm/tcg/tlb-insns.c
159
+++ b/target/arm/tcg/tlb-insns.c
160
@@ -XXX,XX +XXX,XX @@ static void tlbimvaa_write(CPUARMState *env, const ARMCPRegInfo *ri,
19
}
161
}
20
}
162
}
21
163
22
-static bool trans_SQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
164
+static void tlbimva_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
23
-{
165
+ uint64_t value)
24
- static gen_helper_gvec_3 * const fns[4] = {
166
+{
25
- gen_helper_sve2_sqshl_zpzi_b, gen_helper_sve2_sqshl_zpzi_h,
167
+ CPUState *cs = env_cpu(env);
26
- gen_helper_sve2_sqshl_zpzi_s, gen_helper_sve2_sqshl_zpzi_d,
168
+ uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
27
- };
169
+
28
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
170
+ tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E2);
29
- return false;
171
+}
30
- }
172
+
31
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
173
+static void tlbimva_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
32
-}
174
+ uint64_t value)
33
+static gen_helper_gvec_3 * const sqshl_zpzi_fns[4] = {
175
+{
34
+ gen_helper_sve2_sqshl_zpzi_b, gen_helper_sve2_sqshl_zpzi_h,
176
+ CPUState *cs = env_cpu(env);
35
+ gen_helper_sve2_sqshl_zpzi_s, gen_helper_sve2_sqshl_zpzi_d,
177
+ uint64_t pageaddr = value & ~MAKE_64BIT_MASK(0, 12);
178
+
179
+ tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr,
180
+ ARMMMUIdxBit_E2);
181
+}
182
+
183
static void tlbiipas2_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
184
uint64_t value)
185
{
186
@@ -XXX,XX +XXX,XX @@ static void tlbiipas2is_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
187
tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, ARMMMUIdxBit_Stage2);
188
}
189
190
+static void tlbiall_nsnh_write(CPUARMState *env, const ARMCPRegInfo *ri,
191
+ uint64_t value)
192
+{
193
+ CPUState *cs = env_cpu(env);
194
+
195
+ tlb_flush_by_mmuidx(cs, alle1_tlbmask(env));
196
+}
197
+
198
+static void tlbiall_nsnh_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
199
+ uint64_t value)
200
+{
201
+ CPUState *cs = env_cpu(env);
202
+
203
+ tlb_flush_by_mmuidx_all_cpus_synced(cs, alle1_tlbmask(env));
204
+}
205
+
206
+
207
+static void tlbiall_hyp_write(CPUARMState *env, const ARMCPRegInfo *ri,
208
+ uint64_t value)
209
+{
210
+ CPUState *cs = env_cpu(env);
211
+
212
+ tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E2);
213
+}
214
+
215
+static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
216
+ uint64_t value)
217
+{
218
+ CPUState *cs = env_cpu(env);
219
+
220
+ tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2);
221
+}
222
+
223
static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = {
224
/*
225
* MMU TLB control. Note that the wildcarding means we cover not just
226
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = {
227
.writefn = tlbiipas2is_hyp_write },
228
};
229
230
+static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
231
+ { .name = "TLBIALLNSNH",
232
+ .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
233
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
234
+ .writefn = tlbiall_nsnh_write },
235
+ { .name = "TLBIALLNSNHIS",
236
+ .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
237
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
238
+ .writefn = tlbiall_nsnh_is_write },
239
+ { .name = "TLBIALLH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
240
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
241
+ .writefn = tlbiall_hyp_write },
242
+ { .name = "TLBIALLHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
243
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
244
+ .writefn = tlbiall_hyp_is_write },
245
+ { .name = "TLBIMVAH", .cp = 15, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
246
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
247
+ .writefn = tlbimva_hyp_write },
248
+ { .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
249
+ .type = ARM_CP_NO_RAW, .access = PL2_W,
250
+ .writefn = tlbimva_hyp_is_write },
36
+};
251
+};
37
+TRANS_FEAT(SQSHL_zpzi, aa64_sve2, gen_gvec_ool_arg_zpzi,
252
+
38
+ a->esz < 0 ? NULL : sqshl_zpzi_fns[a->esz], a)
253
void define_tlb_insn_regs(ARMCPU *cpu)
39
254
{
40
-static bool trans_UQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
255
CPUARMState *env = &cpu->env;
41
-{
256
@@ -XXX,XX +XXX,XX @@ void define_tlb_insn_regs(ARMCPU *cpu)
42
- static gen_helper_gvec_3 * const fns[4] = {
257
if (arm_feature(env, ARM_FEATURE_V8)) {
43
- gen_helper_sve2_uqshl_zpzi_b, gen_helper_sve2_uqshl_zpzi_h,
258
define_arm_cp_regs(cpu, tlbi_v8_cp_reginfo);
44
- gen_helper_sve2_uqshl_zpzi_s, gen_helper_sve2_uqshl_zpzi_d,
259
}
45
- };
260
+ /*
46
- if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
261
+ * We retain the existing logic for when to register these TLBI
47
- return false;
262
+ * ops (i.e. matching the condition for el2_cp_reginfo[] in
48
- }
263
+ * helper.c), but we will be able to simplify this later.
49
- return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
264
+ */
50
-}
265
+ if (arm_feature(env, ARM_FEATURE_EL2)
51
+static gen_helper_gvec_3 * const uqshl_zpzi_fns[4] = {
266
+ || (arm_feature(env, ARM_FEATURE_EL3)
52
+ gen_helper_sve2_uqshl_zpzi_b, gen_helper_sve2_uqshl_zpzi_h,
267
+ && arm_feature(env, ARM_FEATURE_V8))) {
53
+ gen_helper_sve2_uqshl_zpzi_s, gen_helper_sve2_uqshl_zpzi_d,
268
+ define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
54
+};
269
+ }
55
+TRANS_FEAT(UQSHL_zpzi, aa64_sve2, gen_gvec_ool_arg_zpzi,
270
}
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
--
271
--
115
2.25.1
272
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
Move the AArch64 TLBI insns that are declared in v8_cp_reginfo[]
2
into tlb-insns.c.
2
3
3
Convert SVE translation functions using do_zip*
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
to use TRANS_FEAT and gen_gvec_ool_arg_zzz.
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20241210160452.2427965-4-peter.maydell@linaro.org
7
---
8
target/arm/cpregs.h | 11 +++
9
target/arm/helper.c | 182 +++----------------------------------
10
target/arm/tcg/tlb-insns.c | 160 ++++++++++++++++++++++++++++++++
11
3 files changed, 182 insertions(+), 171 deletions(-)
5
12
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h
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
14
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
15
--- a/target/arm/cpregs.h
17
+++ b/target/arm/translate-sve.c
16
+++ b/target/arm/cpregs.h
18
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(PUNPKHI, aa64_sve, do_perm_pred2, a, 1, gen_helper_sve_punpk_p)
17
@@ -XXX,XX +XXX,XX @@ CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
19
*** SVE Permute - Interleaving Group
18
CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
19
bool isread);
20
bool tlb_force_broadcast(CPUARMState *env);
21
+int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
22
+ uint64_t addr);
23
+int vae1_tlbbits(CPUARMState *env, uint64_t addr);
24
+int vae1_tlbmask(CPUARMState *env);
25
+int ipas2e1_tlbmask(CPUARMState *env, int64_t value);
26
+void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
27
+ uint64_t value);
28
+void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
29
+ uint64_t value);
30
+void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
31
+ uint64_t value);
32
33
#endif /* TARGET_ARM_CPREGS_H */
34
diff --git a/target/arm/helper.c b/target/arm/helper.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/arm/helper.c
37
+++ b/target/arm/helper.c
38
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tocu(CPUARMState *env, const ARMCPRegInfo *ri,
39
* Page D4-1736 (DDI0487A.b)
20
*/
40
*/
21
41
22
-static bool do_zip(DisasContext *s, arg_rrr_esz *a, bool high)
42
-static int vae1_tlbmask(CPUARMState *env)
43
+int vae1_tlbmask(CPUARMState *env)
44
{
45
uint64_t hcr = arm_hcr_el2_eff(env);
46
uint16_t mask;
47
@@ -XXX,XX +XXX,XX @@ static int vae2_tlbmask(CPUARMState *env)
48
}
49
50
/* Return 56 if TBI is enabled, 64 otherwise. */
51
-static int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
52
- uint64_t addr)
53
+int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
54
+ uint64_t addr)
55
{
56
uint64_t tcr = regime_tcr(env, mmu_idx);
57
int tbi = aa64_va_parameter_tbi(tcr, mmu_idx);
58
@@ -XXX,XX +XXX,XX @@ static int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
59
return (tbi >> select) & 1 ? 56 : 64;
60
}
61
62
-static int vae1_tlbbits(CPUARMState *env, uint64_t addr)
63
+int vae1_tlbbits(CPUARMState *env, uint64_t addr)
64
{
65
uint64_t hcr = arm_hcr_el2_eff(env);
66
ARMMMUIdx mmu_idx;
67
@@ -XXX,XX +XXX,XX @@ static int vae2_tlbbits(CPUARMState *env, uint64_t addr)
68
return tlbbits_for_regime(env, mmu_idx, addr);
69
}
70
71
-static void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
72
- uint64_t value)
73
+void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
74
+ uint64_t value)
75
{
76
CPUState *cs = env_cpu(env);
77
int mask = vae1_tlbmask(env);
78
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
79
tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
80
}
81
82
-static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
83
- uint64_t value)
23
-{
84
-{
24
- static gen_helper_gvec_3 * const fns[4] = {
85
- CPUState *cs = env_cpu(env);
25
- gen_helper_sve_zip_b, gen_helper_sve_zip_h,
86
- int mask = vae1_tlbmask(env);
26
- gen_helper_sve_zip_s, gen_helper_sve_zip_d,
87
-
27
- };
88
- if (tlb_force_broadcast(env)) {
28
- unsigned vsz = vec_full_reg_size(s);
89
- tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
29
- unsigned high_ofs = high ? vsz / 2 : 0;
90
- } else {
30
+static gen_helper_gvec_3 * const zip_fns[4] = {
91
- tlb_flush_by_mmuidx(cs, mask);
31
+ gen_helper_sve_zip_b, gen_helper_sve_zip_h,
92
- }
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
-}
93
-}
41
-
94
-
42
-static bool trans_ZIP1_z(DisasContext *s, arg_rrr_esz *a)
95
static int e2_tlbmask(CPUARMState *env)
96
{
97
return (ARMMMUIdxBit_E20_0 |
98
@@ -XXX,XX +XXX,XX @@ static int e2_tlbmask(CPUARMState *env)
99
ARMMMUIdxBit_E2);
100
}
101
102
-static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
103
- uint64_t value)
43
-{
104
-{
44
- return do_zip(s, a, false);
105
- CPUState *cs = env_cpu(env);
106
- int mask = alle1_tlbmask(env);
107
-
108
- tlb_flush_by_mmuidx(cs, mask);
45
-}
109
-}
46
-
110
-
47
-static bool trans_ZIP2_z(DisasContext *s, arg_rrr_esz *a)
111
static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri,
112
uint64_t value)
113
{
114
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
115
tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E3);
116
}
117
118
-static void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
119
- uint64_t value)
120
+void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
121
+ uint64_t value)
122
{
123
CPUState *cs = env_cpu(env);
124
int mask = alle1_tlbmask(env);
125
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
126
tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E3);
127
}
128
129
-static void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
130
- uint64_t value)
131
+void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
132
+ uint64_t value)
133
{
134
CPUState *cs = env_cpu(env);
135
int mask = vae1_tlbmask(env);
136
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
137
tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
138
}
139
140
-static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
141
- uint64_t value)
48
-{
142
-{
49
- return do_zip(s, a, true);
143
- /*
144
- * Invalidate by VA, EL1&0 (AArch64 version).
145
- * Currently handles all of VAE1, VAAE1, VAALE1 and VALE1,
146
- * since we don't support flush-for-specific-ASID-only or
147
- * flush-last-level-only.
148
- */
149
- CPUState *cs = env_cpu(env);
150
- int mask = vae1_tlbmask(env);
151
- uint64_t pageaddr = sextract64(value << 12, 0, 56);
152
- int bits = vae1_tlbbits(env, pageaddr);
153
-
154
- if (tlb_force_broadcast(env)) {
155
- tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
156
- } else {
157
- tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
158
- }
50
-}
159
-}
51
-
160
-
52
-static bool do_zip_q(DisasContext *s, arg_rrr_esz *a, bool high)
161
static void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
162
uint64_t value)
163
{
164
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
165
ARMMMUIdxBit_E3, bits);
166
}
167
168
-static int ipas2e1_tlbmask(CPUARMState *env, int64_t value)
169
+int ipas2e1_tlbmask(CPUARMState *env, int64_t value)
170
{
171
/*
172
* The MSB of value is the NS field, which only applies if SEL2
173
@@ -XXX,XX +XXX,XX @@ static int ipas2e1_tlbmask(CPUARMState *env, int64_t value)
174
: ARMMMUIdxBit_Stage2);
175
}
176
177
-static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
178
- uint64_t value)
53
-{
179
-{
54
- unsigned vsz = vec_full_reg_size(s);
180
- CPUState *cs = env_cpu(env);
55
- unsigned high_ofs = high ? QEMU_ALIGN_DOWN(vsz, 32) / 2 : 0;
181
- int mask = ipas2e1_tlbmask(env, value);
56
-
182
- uint64_t pageaddr = sextract64(value << 12, 0, 56);
57
- if (!dc_isar_feature(aa64_sve_f64mm, s)) {
183
-
58
- return false;
184
- if (tlb_force_broadcast(env)) {
185
- tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
186
- } else {
187
- tlb_flush_page_by_mmuidx(cs, pageaddr, mask);
59
- }
188
- }
60
- return gen_gvec_ool_arg_zzz(s, gen_helper_sve2_zip_q, a, high_ofs);
61
-}
189
-}
62
-
190
-
63
-static bool trans_ZIP1_q(DisasContext *s, arg_rrr_esz *a)
191
-static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
192
- uint64_t value)
64
-{
193
-{
65
- return do_zip_q(s, a, false);
194
- CPUState *cs = env_cpu(env);
195
- int mask = ipas2e1_tlbmask(env, value);
196
- uint64_t pageaddr = sextract64(value << 12, 0, 56);
197
-
198
- tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
66
-}
199
-}
67
-
200
-
68
-static bool trans_ZIP2_q(DisasContext *s, arg_rrr_esz *a)
201
#ifdef TARGET_AARCH64
69
-{
202
typedef struct {
70
- return do_zip_q(s, a, true);
203
uint64_t base;
71
-}
204
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
72
+TRANS_FEAT(ZIP1_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
205
.opc0 = 1, .opc1 = 0, .crn = 7, .crm = 14, .opc2 = 2,
73
+ gen_helper_sve2_zip_q, a, 0)
206
.fgt = FGT_DCCISW,
74
+TRANS_FEAT(ZIP2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
207
.access = PL1_W, .accessfn = access_tsw, .type = ARM_CP_NOP },
75
+ gen_helper_sve2_zip_q, a,
208
- /* TLBI operations */
76
+ QEMU_ALIGN_DOWN(vec_full_reg_size(s), 32) / 2)
209
- { .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64,
77
210
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
78
static gen_helper_gvec_3 * const uzp_fns[4] = {
211
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
79
gen_helper_sve_uzp_b, gen_helper_sve_uzp_h,
212
- .fgt = FGT_TLBIVMALLE1IS,
213
- .writefn = tlbi_aa64_vmalle1is_write },
214
- { .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64,
215
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
216
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
217
- .fgt = FGT_TLBIVAE1IS,
218
- .writefn = tlbi_aa64_vae1is_write },
219
- { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64,
220
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
221
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
222
- .fgt = FGT_TLBIASIDE1IS,
223
- .writefn = tlbi_aa64_vmalle1is_write },
224
- { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64,
225
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
226
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
227
- .fgt = FGT_TLBIVAAE1IS,
228
- .writefn = tlbi_aa64_vae1is_write },
229
- { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64,
230
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
231
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
232
- .fgt = FGT_TLBIVALE1IS,
233
- .writefn = tlbi_aa64_vae1is_write },
234
- { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64,
235
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
236
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
237
- .fgt = FGT_TLBIVAALE1IS,
238
- .writefn = tlbi_aa64_vae1is_write },
239
- { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64,
240
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
241
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
242
- .fgt = FGT_TLBIVMALLE1,
243
- .writefn = tlbi_aa64_vmalle1_write },
244
- { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64,
245
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
246
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
247
- .fgt = FGT_TLBIVAE1,
248
- .writefn = tlbi_aa64_vae1_write },
249
- { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64,
250
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
251
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
252
- .fgt = FGT_TLBIASIDE1,
253
- .writefn = tlbi_aa64_vmalle1_write },
254
- { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64,
255
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
256
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
257
- .fgt = FGT_TLBIVAAE1,
258
- .writefn = tlbi_aa64_vae1_write },
259
- { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64,
260
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
261
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
262
- .fgt = FGT_TLBIVALE1,
263
- .writefn = tlbi_aa64_vae1_write },
264
- { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64,
265
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
266
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
267
- .fgt = FGT_TLBIVAALE1,
268
- .writefn = tlbi_aa64_vae1_write },
269
- { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
270
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
271
- .access = PL2_W, .type = ARM_CP_NO_RAW,
272
- .writefn = tlbi_aa64_ipas2e1is_write },
273
- { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64,
274
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
275
- .access = PL2_W, .type = ARM_CP_NO_RAW,
276
- .writefn = tlbi_aa64_ipas2e1is_write },
277
- { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64,
278
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
279
- .access = PL2_W, .type = ARM_CP_NO_RAW,
280
- .writefn = tlbi_aa64_alle1is_write },
281
- { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64,
282
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6,
283
- .access = PL2_W, .type = ARM_CP_NO_RAW,
284
- .writefn = tlbi_aa64_alle1is_write },
285
- { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64,
286
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
287
- .access = PL2_W, .type = ARM_CP_NO_RAW,
288
- .writefn = tlbi_aa64_ipas2e1_write },
289
- { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64,
290
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
291
- .access = PL2_W, .type = ARM_CP_NO_RAW,
292
- .writefn = tlbi_aa64_ipas2e1_write },
293
- { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64,
294
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
295
- .access = PL2_W, .type = ARM_CP_NO_RAW,
296
- .writefn = tlbi_aa64_alle1_write },
297
- { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64,
298
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6,
299
- .access = PL2_W, .type = ARM_CP_NO_RAW,
300
- .writefn = tlbi_aa64_alle1is_write },
301
#ifndef CONFIG_USER_ONLY
302
/* 64 bit address translation operations */
303
{ .name = "AT_S1E1R", .state = ARM_CP_STATE_AA64,
304
diff --git a/target/arm/tcg/tlb-insns.c b/target/arm/tcg/tlb-insns.c
305
index XXXXXXX..XXXXXXX 100644
306
--- a/target/arm/tcg/tlb-insns.c
307
+++ b/target/arm/tcg/tlb-insns.c
308
@@ -XXX,XX +XXX,XX @@ static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
309
tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2);
310
}
311
312
+static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
313
+ uint64_t value)
314
+{
315
+ CPUState *cs = env_cpu(env);
316
+ int mask = vae1_tlbmask(env);
317
+
318
+ if (tlb_force_broadcast(env)) {
319
+ tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
320
+ } else {
321
+ tlb_flush_by_mmuidx(cs, mask);
322
+ }
323
+}
324
+
325
+static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
326
+ uint64_t value)
327
+{
328
+ CPUState *cs = env_cpu(env);
329
+ int mask = alle1_tlbmask(env);
330
+
331
+ tlb_flush_by_mmuidx(cs, mask);
332
+}
333
+
334
+static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
335
+ uint64_t value)
336
+{
337
+ /*
338
+ * Invalidate by VA, EL1&0 (AArch64 version).
339
+ * Currently handles all of VAE1, VAAE1, VAALE1 and VALE1,
340
+ * since we don't support flush-for-specific-ASID-only or
341
+ * flush-last-level-only.
342
+ */
343
+ CPUState *cs = env_cpu(env);
344
+ int mask = vae1_tlbmask(env);
345
+ uint64_t pageaddr = sextract64(value << 12, 0, 56);
346
+ int bits = vae1_tlbbits(env, pageaddr);
347
+
348
+ if (tlb_force_broadcast(env)) {
349
+ tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
350
+ } else {
351
+ tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
352
+ }
353
+}
354
+
355
+static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
356
+ uint64_t value)
357
+{
358
+ CPUState *cs = env_cpu(env);
359
+ int mask = ipas2e1_tlbmask(env, value);
360
+ uint64_t pageaddr = sextract64(value << 12, 0, 56);
361
+
362
+ if (tlb_force_broadcast(env)) {
363
+ tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
364
+ } else {
365
+ tlb_flush_page_by_mmuidx(cs, pageaddr, mask);
366
+ }
367
+}
368
+
369
+static void tlbi_aa64_ipas2e1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
370
+ uint64_t value)
371
+{
372
+ CPUState *cs = env_cpu(env);
373
+ int mask = ipas2e1_tlbmask(env, value);
374
+ uint64_t pageaddr = sextract64(value << 12, 0, 56);
375
+
376
+ tlb_flush_page_by_mmuidx_all_cpus_synced(cs, pageaddr, mask);
377
+}
378
+
379
static const ARMCPRegInfo tlbi_not_v7_cp_reginfo[] = {
380
/*
381
* MMU TLB control. Note that the wildcarding means we cover not just
382
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo tlbi_v8_cp_reginfo[] = {
383
.cp = 15, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
384
.type = ARM_CP_NO_RAW, .access = PL2_W,
385
.writefn = tlbiipas2is_hyp_write },
386
+ /* AArch64 TLBI operations */
387
+ { .name = "TLBI_VMALLE1IS", .state = ARM_CP_STATE_AA64,
388
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 0,
389
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
390
+ .fgt = FGT_TLBIVMALLE1IS,
391
+ .writefn = tlbi_aa64_vmalle1is_write },
392
+ { .name = "TLBI_VAE1IS", .state = ARM_CP_STATE_AA64,
393
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 1,
394
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
395
+ .fgt = FGT_TLBIVAE1IS,
396
+ .writefn = tlbi_aa64_vae1is_write },
397
+ { .name = "TLBI_ASIDE1IS", .state = ARM_CP_STATE_AA64,
398
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 2,
399
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
400
+ .fgt = FGT_TLBIASIDE1IS,
401
+ .writefn = tlbi_aa64_vmalle1is_write },
402
+ { .name = "TLBI_VAAE1IS", .state = ARM_CP_STATE_AA64,
403
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 3,
404
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
405
+ .fgt = FGT_TLBIVAAE1IS,
406
+ .writefn = tlbi_aa64_vae1is_write },
407
+ { .name = "TLBI_VALE1IS", .state = ARM_CP_STATE_AA64,
408
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
409
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
410
+ .fgt = FGT_TLBIVALE1IS,
411
+ .writefn = tlbi_aa64_vae1is_write },
412
+ { .name = "TLBI_VAALE1IS", .state = ARM_CP_STATE_AA64,
413
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 7,
414
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
415
+ .fgt = FGT_TLBIVAALE1IS,
416
+ .writefn = tlbi_aa64_vae1is_write },
417
+ { .name = "TLBI_VMALLE1", .state = ARM_CP_STATE_AA64,
418
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 0,
419
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
420
+ .fgt = FGT_TLBIVMALLE1,
421
+ .writefn = tlbi_aa64_vmalle1_write },
422
+ { .name = "TLBI_VAE1", .state = ARM_CP_STATE_AA64,
423
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 1,
424
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
425
+ .fgt = FGT_TLBIVAE1,
426
+ .writefn = tlbi_aa64_vae1_write },
427
+ { .name = "TLBI_ASIDE1", .state = ARM_CP_STATE_AA64,
428
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 2,
429
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
430
+ .fgt = FGT_TLBIASIDE1,
431
+ .writefn = tlbi_aa64_vmalle1_write },
432
+ { .name = "TLBI_VAAE1", .state = ARM_CP_STATE_AA64,
433
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 3,
434
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
435
+ .fgt = FGT_TLBIVAAE1,
436
+ .writefn = tlbi_aa64_vae1_write },
437
+ { .name = "TLBI_VALE1", .state = ARM_CP_STATE_AA64,
438
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 5,
439
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
440
+ .fgt = FGT_TLBIVALE1,
441
+ .writefn = tlbi_aa64_vae1_write },
442
+ { .name = "TLBI_VAALE1", .state = ARM_CP_STATE_AA64,
443
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 7, .opc2 = 7,
444
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
445
+ .fgt = FGT_TLBIVAALE1,
446
+ .writefn = tlbi_aa64_vae1_write },
447
+ { .name = "TLBI_IPAS2E1IS", .state = ARM_CP_STATE_AA64,
448
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 1,
449
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
450
+ .writefn = tlbi_aa64_ipas2e1is_write },
451
+ { .name = "TLBI_IPAS2LE1IS", .state = ARM_CP_STATE_AA64,
452
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 5,
453
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
454
+ .writefn = tlbi_aa64_ipas2e1is_write },
455
+ { .name = "TLBI_ALLE1IS", .state = ARM_CP_STATE_AA64,
456
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 4,
457
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
458
+ .writefn = tlbi_aa64_alle1is_write },
459
+ { .name = "TLBI_VMALLS12E1IS", .state = ARM_CP_STATE_AA64,
460
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 6,
461
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
462
+ .writefn = tlbi_aa64_alle1is_write },
463
+ { .name = "TLBI_IPAS2E1", .state = ARM_CP_STATE_AA64,
464
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 1,
465
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
466
+ .writefn = tlbi_aa64_ipas2e1_write },
467
+ { .name = "TLBI_IPAS2LE1", .state = ARM_CP_STATE_AA64,
468
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 5,
469
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
470
+ .writefn = tlbi_aa64_ipas2e1_write },
471
+ { .name = "TLBI_ALLE1", .state = ARM_CP_STATE_AA64,
472
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 4,
473
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
474
+ .writefn = tlbi_aa64_alle1_write },
475
+ { .name = "TLBI_VMALLS12E1", .state = ARM_CP_STATE_AA64,
476
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 6,
477
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
478
+ .writefn = tlbi_aa64_alle1is_write },
479
};
480
481
static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
80
--
482
--
81
2.25.1
483
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
Move the AArch64 EL2 TLBI insn definitions that were
2
in el2_cp_reginfo[] across to tlb-insns.c.
2
3
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>
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20241210160452.2427965-5-peter.maydell@linaro.org
7
---
7
---
8
target/arm/translate-sve.c | 17 +++--------------
8
target/arm/cpregs.h | 7 +++++
9
1 file changed, 3 insertions(+), 14 deletions(-)
9
target/arm/helper.c | 61 ++++----------------------------------
10
target/arm/tcg/tlb-insns.c | 49 ++++++++++++++++++++++++++++++
11
3 files changed, 62 insertions(+), 55 deletions(-)
10
12
11
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
13
diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h
12
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/translate-sve.c
15
--- a/target/arm/cpregs.h
14
+++ b/target/arm/translate-sve.c
16
+++ b/target/arm/cpregs.h
15
@@ -XXX,XX +XXX,XX @@ static bool do_shift_imm(DisasContext *s, arg_rri_esz *a, bool asr,
17
@@ -XXX,XX +XXX,XX @@ bool tlb_force_broadcast(CPUARMState *env);
16
return true;
18
int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
17
}
19
uint64_t addr);
18
20
int vae1_tlbbits(CPUARMState *env, uint64_t addr);
19
-static bool trans_ASR_zzi(DisasContext *s, arg_rri_esz *a)
21
+int vae2_tlbbits(CPUARMState *env, uint64_t addr);
22
int vae1_tlbmask(CPUARMState *env);
23
+int vae2_tlbmask(CPUARMState *env);
24
int ipas2e1_tlbmask(CPUARMState *env, int64_t value);
25
+int e2_tlbmask(CPUARMState *env);
26
void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
27
uint64_t value);
28
void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
29
uint64_t value);
30
void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
31
uint64_t value);
32
+void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
33
+ uint64_t value);
34
+void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
35
+ uint64_t value);
36
37
#endif /* TARGET_ARM_CPREGS_H */
38
diff --git a/target/arm/helper.c b/target/arm/helper.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/arm/helper.c
41
+++ b/target/arm/helper.c
42
@@ -XXX,XX +XXX,XX @@ int vae1_tlbmask(CPUARMState *env)
43
return mask;
44
}
45
46
-static int vae2_tlbmask(CPUARMState *env)
47
+int vae2_tlbmask(CPUARMState *env)
48
{
49
uint64_t hcr = arm_hcr_el2_eff(env);
50
uint16_t mask;
51
@@ -XXX,XX +XXX,XX @@ int vae1_tlbbits(CPUARMState *env, uint64_t addr)
52
return tlbbits_for_regime(env, mmu_idx, addr);
53
}
54
55
-static int vae2_tlbbits(CPUARMState *env, uint64_t addr)
56
+int vae2_tlbbits(CPUARMState *env, uint64_t addr)
57
{
58
uint64_t hcr = arm_hcr_el2_eff(env);
59
ARMMMUIdx mmu_idx;
60
@@ -XXX,XX +XXX,XX @@ void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
61
tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
62
}
63
64
-static int e2_tlbmask(CPUARMState *env)
65
+int e2_tlbmask(CPUARMState *env)
66
{
67
return (ARMMMUIdxBit_E20_0 |
68
ARMMMUIdxBit_E20_2 |
69
@@ -XXX,XX +XXX,XX @@ static int e2_tlbmask(CPUARMState *env)
70
ARMMMUIdxBit_E2);
71
}
72
73
-static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri,
74
- uint64_t value)
20
-{
75
-{
21
- return do_shift_imm(s, a, true, tcg_gen_gvec_sari);
76
- CPUState *cs = env_cpu(env);
77
- int mask = e2_tlbmask(env);
78
-
79
- tlb_flush_by_mmuidx(cs, mask);
22
-}
80
-}
23
-
81
-
24
-static bool trans_LSR_zzi(DisasContext *s, arg_rri_esz *a)
82
static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
83
uint64_t value)
84
{
85
@@ -XXX,XX +XXX,XX @@ void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
86
tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
87
}
88
89
-static void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
90
- uint64_t value)
91
+void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
92
+ uint64_t value)
93
{
94
CPUState *cs = env_cpu(env);
95
int mask = e2_tlbmask(env);
96
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
97
tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E3);
98
}
99
100
-static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
101
- uint64_t value)
25
-{
102
-{
26
- return do_shift_imm(s, a, false, tcg_gen_gvec_shri);
103
- /*
104
- * Invalidate by VA, EL2
105
- * Currently handles both VAE2 and VALE2, since we don't support
106
- * flush-last-level-only.
107
- */
108
- CPUState *cs = env_cpu(env);
109
- int mask = vae2_tlbmask(env);
110
- uint64_t pageaddr = sextract64(value << 12, 0, 56);
111
- int bits = vae2_tlbbits(env, pageaddr);
112
-
113
- tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
27
-}
114
-}
28
-
115
-
29
-static bool trans_LSL_zzi(DisasContext *s, arg_rri_esz *a)
116
static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
30
-{
117
uint64_t value)
31
- return do_shift_imm(s, a, false, tcg_gen_gvec_shli);
118
{
32
-}
119
@@ -XXX,XX +XXX,XX @@ void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
33
+TRANS_FEAT(ASR_zzi, aa64_sve, do_shift_imm, a, true, tcg_gen_gvec_sari)
120
tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
34
+TRANS_FEAT(LSR_zzi, aa64_sve, do_shift_imm, a, false, tcg_gen_gvec_shri)
121
}
35
+TRANS_FEAT(LSL_zzi, aa64_sve, do_shift_imm, a, false, tcg_gen_gvec_shli)
122
36
123
-static void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
37
#define DO_ZZW(NAME, name) \
124
+void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
38
static gen_helper_gvec_3 * const name##_zzw_fns[4] = { \
125
uint64_t value)
126
{
127
CPUState *cs = env_cpu(env);
128
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
129
{ .name = "HTTBR", .cp = 15, .opc1 = 4, .crm = 2,
130
.access = PL2_RW, .type = ARM_CP_64BIT | ARM_CP_ALIAS,
131
.fieldoffset = offsetof(CPUARMState, cp15.ttbr0_el[2]) },
132
- { .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64,
133
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
134
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
135
- .writefn = tlbi_aa64_alle2_write },
136
- { .name = "TLBI_VAE2", .state = ARM_CP_STATE_AA64,
137
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
138
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
139
- .writefn = tlbi_aa64_vae2_write },
140
- { .name = "TLBI_VALE2", .state = ARM_CP_STATE_AA64,
141
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
142
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
143
- .writefn = tlbi_aa64_vae2_write },
144
- { .name = "TLBI_ALLE2IS", .state = ARM_CP_STATE_AA64,
145
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
146
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
147
- .writefn = tlbi_aa64_alle2is_write },
148
- { .name = "TLBI_VAE2IS", .state = ARM_CP_STATE_AA64,
149
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
150
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
151
- .writefn = tlbi_aa64_vae2is_write },
152
- { .name = "TLBI_VALE2IS", .state = ARM_CP_STATE_AA64,
153
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
154
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
155
- .writefn = tlbi_aa64_vae2is_write },
156
#ifndef CONFIG_USER_ONLY
157
/*
158
* Unlike the other EL2-related AT operations, these must
159
diff --git a/target/arm/tcg/tlb-insns.c b/target/arm/tcg/tlb-insns.c
160
index XXXXXXX..XXXXXXX 100644
161
--- a/target/arm/tcg/tlb-insns.c
162
+++ b/target/arm/tcg/tlb-insns.c
163
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
164
tlb_flush_by_mmuidx(cs, mask);
165
}
166
167
+static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri,
168
+ uint64_t value)
169
+{
170
+ CPUState *cs = env_cpu(env);
171
+ int mask = e2_tlbmask(env);
172
+
173
+ tlb_flush_by_mmuidx(cs, mask);
174
+}
175
+
176
+static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
177
+ uint64_t value)
178
+{
179
+ /*
180
+ * Invalidate by VA, EL2
181
+ * Currently handles both VAE2 and VALE2, since we don't support
182
+ * flush-last-level-only.
183
+ */
184
+ CPUState *cs = env_cpu(env);
185
+ int mask = vae2_tlbmask(env);
186
+ uint64_t pageaddr = sextract64(value << 12, 0, 56);
187
+ int bits = vae2_tlbbits(env, pageaddr);
188
+
189
+ tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
190
+}
191
+
192
static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
193
uint64_t value)
194
{
195
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
196
{ .name = "TLBIMVAHIS", .cp = 15, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
197
.type = ARM_CP_NO_RAW, .access = PL2_W,
198
.writefn = tlbimva_hyp_is_write },
199
+ { .name = "TLBI_ALLE2", .state = ARM_CP_STATE_AA64,
200
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 0,
201
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
202
+ .writefn = tlbi_aa64_alle2_write },
203
+ { .name = "TLBI_VAE2", .state = ARM_CP_STATE_AA64,
204
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 1,
205
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
206
+ .writefn = tlbi_aa64_vae2_write },
207
+ { .name = "TLBI_VALE2", .state = ARM_CP_STATE_AA64,
208
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 7, .opc2 = 5,
209
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
210
+ .writefn = tlbi_aa64_vae2_write },
211
+ { .name = "TLBI_ALLE2IS", .state = ARM_CP_STATE_AA64,
212
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 0,
213
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
214
+ .writefn = tlbi_aa64_alle2is_write },
215
+ { .name = "TLBI_VAE2IS", .state = ARM_CP_STATE_AA64,
216
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
217
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
218
+ .writefn = tlbi_aa64_vae2is_write },
219
+ { .name = "TLBI_VALE2IS", .state = ARM_CP_STATE_AA64,
220
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 5,
221
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
222
+ .writefn = tlbi_aa64_vae2is_write },
223
};
224
225
void define_tlb_insn_regs(ARMCPU *cpu)
39
--
226
--
40
2.25.1
227
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
Move the AArch64 EL3 TLBI insns from el3_cp_reginfo[] across
2
to tlb-insns.c.
2
3
3
Convert SVE translation functions directly using
4
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
gen_gvec_fn_arg_zzz to TRANS_FEAT.
5
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Message-id: 20241210160452.2427965-6-peter.maydell@linaro.org
7
---
8
target/arm/cpregs.h | 4 +++
9
target/arm/helper.c | 56 +++-----------------------------------
10
target/arm/tcg/tlb-insns.c | 54 ++++++++++++++++++++++++++++++++++++
11
3 files changed, 62 insertions(+), 52 deletions(-)
5
12
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h
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
14
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
15
--- a/target/arm/cpregs.h
17
+++ b/target/arm/translate-sve.c
16
+++ b/target/arm/cpregs.h
18
@@ -XXX,XX +XXX,XX @@ const uint64_t pred_esz_masks[4] = {
17
@@ -XXX,XX +XXX,XX @@ void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
19
*** SVE Logical - Unpredicated Group
18
uint64_t value);
20
*/
19
void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
21
20
uint64_t value);
22
-static bool trans_AND_zzz(DisasContext *s, arg_rrr_esz *a)
21
+void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
22
+ uint64_t value);
23
+void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
24
+ uint64_t value);
25
26
#endif /* TARGET_ARM_CPREGS_H */
27
diff --git a/target/arm/helper.c b/target/arm/helper.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/helper.c
30
+++ b/target/arm/helper.c
31
@@ -XXX,XX +XXX,XX @@ int e2_tlbmask(CPUARMState *env)
32
ARMMMUIdxBit_E2);
33
}
34
35
-static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
36
- uint64_t value)
23
-{
37
-{
24
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_and, a);
38
- ARMCPU *cpu = env_archcpu(env);
39
- CPUState *cs = CPU(cpu);
40
-
41
- tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E3);
25
-}
42
-}
26
-
43
-
27
-static bool trans_ORR_zzz(DisasContext *s, arg_rrr_esz *a)
44
void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
45
uint64_t value)
46
{
47
@@ -XXX,XX +XXX,XX @@ void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
48
tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
49
}
50
51
-static void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
52
- uint64_t value)
53
+void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
54
+ uint64_t value)
55
{
56
CPUState *cs = env_cpu(env);
57
58
tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E3);
59
}
60
61
-static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
62
- uint64_t value)
28
-{
63
-{
29
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_or, a);
64
- /*
65
- * Invalidate by VA, EL3
66
- * Currently handles both VAE3 and VALE3, since we don't support
67
- * flush-last-level-only.
68
- */
69
- ARMCPU *cpu = env_archcpu(env);
70
- CPUState *cs = CPU(cpu);
71
- uint64_t pageaddr = sextract64(value << 12, 0, 56);
72
-
73
- tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E3);
30
-}
74
-}
31
-
75
-
32
-static bool trans_EOR_zzz(DisasContext *s, arg_rrr_esz *a)
76
void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
33
-{
77
uint64_t value)
34
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_xor, a);
78
{
35
-}
79
@@ -XXX,XX +XXX,XX @@ void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
36
-
80
tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
37
-static bool trans_BIC_zzz(DisasContext *s, arg_rrr_esz *a)
81
}
38
-{
82
39
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_andc, a);
83
-static void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
40
-}
84
- uint64_t value)
41
+TRANS_FEAT(AND_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_and, a)
85
+void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
42
+TRANS_FEAT(ORR_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_or, a)
86
+ uint64_t value)
43
+TRANS_FEAT(EOR_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_xor, a)
87
{
44
+TRANS_FEAT(BIC_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_andc, a)
88
CPUState *cs = env_cpu(env);
45
89
uint64_t pageaddr = sextract64(value << 12, 0, 56);
46
static void gen_xar8_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, int64_t sh)
90
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo el3_cp_reginfo[] = {
47
{
91
.opc0 = 3, .opc1 = 6, .crn = 5, .crm = 1, .opc2 = 1,
48
@@ -XXX,XX +XXX,XX @@ static bool trans_NBSL(DisasContext *s, arg_rrrr_esz *a)
92
.access = PL3_RW, .type = ARM_CP_CONST,
49
*** SVE Integer Arithmetic - Unpredicated Group
93
.resetvalue = 0 },
50
*/
94
- { .name = "TLBI_ALLE3IS", .state = ARM_CP_STATE_AA64,
51
95
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 0,
52
-static bool trans_ADD_zzz(DisasContext *s, arg_rrr_esz *a)
96
- .access = PL3_W, .type = ARM_CP_NO_RAW,
53
-{
97
- .writefn = tlbi_aa64_alle3is_write },
54
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_add, a);
98
- { .name = "TLBI_VAE3IS", .state = ARM_CP_STATE_AA64,
55
-}
99
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 1,
56
-
100
- .access = PL3_W, .type = ARM_CP_NO_RAW,
57
-static bool trans_SUB_zzz(DisasContext *s, arg_rrr_esz *a)
101
- .writefn = tlbi_aa64_vae3is_write },
58
-{
102
- { .name = "TLBI_VALE3IS", .state = ARM_CP_STATE_AA64,
59
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_sub, a);
103
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 5,
60
-}
104
- .access = PL3_W, .type = ARM_CP_NO_RAW,
61
-
105
- .writefn = tlbi_aa64_vae3is_write },
62
-static bool trans_SQADD_zzz(DisasContext *s, arg_rrr_esz *a)
106
- { .name = "TLBI_ALLE3", .state = ARM_CP_STATE_AA64,
63
-{
107
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 0,
64
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_ssadd, a);
108
- .access = PL3_W, .type = ARM_CP_NO_RAW,
65
-}
109
- .writefn = tlbi_aa64_alle3_write },
66
-
110
- { .name = "TLBI_VAE3", .state = ARM_CP_STATE_AA64,
67
-static bool trans_SQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
111
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 1,
68
-{
112
- .access = PL3_W, .type = ARM_CP_NO_RAW,
69
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_sssub, a);
113
- .writefn = tlbi_aa64_vae3_write },
70
-}
114
- { .name = "TLBI_VALE3", .state = ARM_CP_STATE_AA64,
71
-
115
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 5,
72
-static bool trans_UQADD_zzz(DisasContext *s, arg_rrr_esz *a)
116
- .access = PL3_W, .type = ARM_CP_NO_RAW,
73
-{
117
- .writefn = tlbi_aa64_vae3_write },
74
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_usadd, a);
118
};
75
-}
119
76
-
120
#ifndef CONFIG_USER_ONLY
77
-static bool trans_UQSUB_zzz(DisasContext *s, arg_rrr_esz *a)
121
diff --git a/target/arm/tcg/tlb-insns.c b/target/arm/tcg/tlb-insns.c
78
-{
122
index XXXXXXX..XXXXXXX 100644
79
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_ussub, a);
123
--- a/target/arm/tcg/tlb-insns.c
80
-}
124
+++ b/target/arm/tcg/tlb-insns.c
81
+TRANS_FEAT(ADD_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_add, a)
125
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_alle2_write(CPUARMState *env, const ARMCPRegInfo *ri,
82
+TRANS_FEAT(SUB_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_sub, a)
126
tlb_flush_by_mmuidx(cs, mask);
83
+TRANS_FEAT(SQADD_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_ssadd, a)
127
}
84
+TRANS_FEAT(SQSUB_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_sssub, a)
128
85
+TRANS_FEAT(UQADD_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_usadd, a)
129
+static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
86
+TRANS_FEAT(UQSUB_zzz, aa64_sve, gen_gvec_fn_arg_zzz, tcg_gen_gvec_ussub, a)
130
+ uint64_t value)
87
131
+{
88
/*
132
+ ARMCPU *cpu = env_archcpu(env);
89
*** SVE Integer Arithmetic - Binary Predicated Group
133
+ CPUState *cs = CPU(cpu);
90
@@ -XXX,XX +XXX,XX @@ static bool trans_MOVPRFX_z(DisasContext *s, arg_rpr_esz *a)
134
+
91
* SVE2 Integer Multiply - Unpredicated
135
+ tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E3);
92
*/
136
+}
93
137
+
94
-static bool trans_MUL_zzz(DisasContext *s, arg_rrr_esz *a)
138
static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
95
-{
139
uint64_t value)
96
- if (!dc_isar_feature(aa64_sve2, s)) {
140
{
97
- return false;
141
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
98
- }
142
tlb_flush_page_bits_by_mmuidx(cs, pageaddr, mask, bits);
99
- return gen_gvec_fn_arg_zzz(s, tcg_gen_gvec_mul, a);
143
}
100
-}
144
101
+TRANS_FEAT(MUL_zzz, aa64_sve2, gen_gvec_fn_arg_zzz, tcg_gen_gvec_mul, a)
145
+static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
102
146
+ uint64_t value)
103
static gen_helper_gvec_3 * const smulh_zzz_fns[4] = {
147
+{
104
gen_helper_gvec_smulh_b, gen_helper_gvec_smulh_h,
148
+ /*
149
+ * Invalidate by VA, EL3
150
+ * Currently handles both VAE3 and VALE3, since we don't support
151
+ * flush-last-level-only.
152
+ */
153
+ ARMCPU *cpu = env_archcpu(env);
154
+ CPUState *cs = CPU(cpu);
155
+ uint64_t pageaddr = sextract64(value << 12, 0, 56);
156
+
157
+ tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E3);
158
+}
159
+
160
static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
161
uint64_t value)
162
{
163
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo tlbi_el2_cp_reginfo[] = {
164
.writefn = tlbi_aa64_vae2is_write },
165
};
166
167
+static const ARMCPRegInfo tlbi_el3_cp_reginfo[] = {
168
+ { .name = "TLBI_ALLE3IS", .state = ARM_CP_STATE_AA64,
169
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 0,
170
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
171
+ .writefn = tlbi_aa64_alle3is_write },
172
+ { .name = "TLBI_VAE3IS", .state = ARM_CP_STATE_AA64,
173
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 1,
174
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
175
+ .writefn = tlbi_aa64_vae3is_write },
176
+ { .name = "TLBI_VALE3IS", .state = ARM_CP_STATE_AA64,
177
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 3, .opc2 = 5,
178
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
179
+ .writefn = tlbi_aa64_vae3is_write },
180
+ { .name = "TLBI_ALLE3", .state = ARM_CP_STATE_AA64,
181
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 0,
182
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
183
+ .writefn = tlbi_aa64_alle3_write },
184
+ { .name = "TLBI_VAE3", .state = ARM_CP_STATE_AA64,
185
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 1,
186
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
187
+ .writefn = tlbi_aa64_vae3_write },
188
+ { .name = "TLBI_VALE3", .state = ARM_CP_STATE_AA64,
189
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 5,
190
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
191
+ .writefn = tlbi_aa64_vae3_write },
192
+};
193
+
194
void define_tlb_insn_regs(ARMCPU *cpu)
195
{
196
CPUARMState *env = &cpu->env;
197
@@ -XXX,XX +XXX,XX @@ void define_tlb_insn_regs(ARMCPU *cpu)
198
&& arm_feature(env, ARM_FEATURE_V8))) {
199
define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
200
}
201
+ if (arm_feature(env, ARM_FEATURE_EL3)) {
202
+ define_arm_cp_regs(cpu, tlbi_el3_cp_reginfo);
203
+ }
204
}
105
--
205
--
106
2.25.1
206
2.34.1
diff view generated by jsdifflib
1
From: Icenowy Zheng <uwu@icenowy.me>
1
Move the TLBI invalidate-range insns across to tlb-insns.c.
2
2
3
U-Boot queries the FIFO water level to reduce checking status register
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
when doing PIO SD card operation.
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20241210160452.2427965-7-peter.maydell@linaro.org
6
---
7
target/arm/cpregs.h | 2 +
8
target/arm/helper.c | 330 +------------------------------------
9
target/arm/tcg/tlb-insns.c | 329 ++++++++++++++++++++++++++++++++++++
10
3 files changed, 333 insertions(+), 328 deletions(-)
5
11
6
Report a FIFO water level of 1 when data is ready, to prevent the code
12
diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h
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
13
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/sd/allwinner-sdhost.c
14
--- a/target/arm/cpregs.h
20
+++ b/hw/sd/allwinner-sdhost.c
15
+++ b/target/arm/cpregs.h
21
@@ -XXX,XX +XXX,XX @@ enum {
16
@@ -XXX,XX +XXX,XX @@ CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
17
bool isread);
18
CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
19
bool isread);
20
+CPAccessResult access_ttlbos(CPUARMState *env, const ARMCPRegInfo *ri,
21
+ bool isread);
22
bool tlb_force_broadcast(CPUARMState *env);
23
int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
24
uint64_t addr);
25
diff --git a/target/arm/helper.c b/target/arm/helper.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/target/arm/helper.c
28
+++ b/target/arm/helper.c
29
@@ -XXX,XX +XXX,XX @@ CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
30
31
#ifdef TARGET_AARCH64
32
/* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBOS. */
33
-static CPAccessResult access_ttlbos(CPUARMState *env, const ARMCPRegInfo *ri,
34
- bool isread)
35
+CPAccessResult access_ttlbos(CPUARMState *env, const ARMCPRegInfo *ri,
36
+ bool isread)
37
{
38
if (arm_current_el(env) == 1 &&
39
(arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBOS))) {
40
@@ -XXX,XX +XXX,XX @@ int ipas2e1_tlbmask(CPUARMState *env, int64_t value)
41
: ARMMMUIdxBit_Stage2);
42
}
43
44
-#ifdef TARGET_AARCH64
45
-typedef struct {
46
- uint64_t base;
47
- uint64_t length;
48
-} TLBIRange;
49
-
50
-static ARMGranuleSize tlbi_range_tg_to_gran_size(int tg)
51
-{
52
- /*
53
- * Note that the TLBI range TG field encoding differs from both
54
- * TG0 and TG1 encodings.
55
- */
56
- switch (tg) {
57
- case 1:
58
- return Gran4K;
59
- case 2:
60
- return Gran16K;
61
- case 3:
62
- return Gran64K;
63
- default:
64
- return GranInvalid;
65
- }
66
-}
67
-
68
-static TLBIRange tlbi_aa64_get_range(CPUARMState *env, ARMMMUIdx mmuidx,
69
- uint64_t value)
70
-{
71
- unsigned int page_size_granule, page_shift, num, scale, exponent;
72
- /* Extract one bit to represent the va selector in use. */
73
- uint64_t select = sextract64(value, 36, 1);
74
- ARMVAParameters param = aa64_va_parameters(env, select, mmuidx, true, false);
75
- TLBIRange ret = { };
76
- ARMGranuleSize gran;
77
-
78
- page_size_granule = extract64(value, 46, 2);
79
- gran = tlbi_range_tg_to_gran_size(page_size_granule);
80
-
81
- /* The granule encoded in value must match the granule in use. */
82
- if (gran != param.gran) {
83
- qemu_log_mask(LOG_GUEST_ERROR, "Invalid tlbi page size granule %d\n",
84
- page_size_granule);
85
- return ret;
86
- }
87
-
88
- page_shift = arm_granule_bits(gran);
89
- num = extract64(value, 39, 5);
90
- scale = extract64(value, 44, 2);
91
- exponent = (5 * scale) + 1;
92
-
93
- ret.length = (num + 1) << (exponent + page_shift);
94
-
95
- if (param.select) {
96
- ret.base = sextract64(value, 0, 37);
97
- } else {
98
- ret.base = extract64(value, 0, 37);
99
- }
100
- if (param.ds) {
101
- /*
102
- * With DS=1, BaseADDR is always shifted 16 so that it is able
103
- * to address all 52 va bits. The input address is perforce
104
- * aligned on a 64k boundary regardless of translation granule.
105
- */
106
- page_shift = 16;
107
- }
108
- ret.base <<= page_shift;
109
-
110
- return ret;
111
-}
112
-
113
-static void do_rvae_write(CPUARMState *env, uint64_t value,
114
- int idxmap, bool synced)
115
-{
116
- ARMMMUIdx one_idx = ARM_MMU_IDX_A | ctz32(idxmap);
117
- TLBIRange range;
118
- int bits;
119
-
120
- range = tlbi_aa64_get_range(env, one_idx, value);
121
- bits = tlbbits_for_regime(env, one_idx, range.base);
122
-
123
- if (synced) {
124
- tlb_flush_range_by_mmuidx_all_cpus_synced(env_cpu(env),
125
- range.base,
126
- range.length,
127
- idxmap,
128
- bits);
129
- } else {
130
- tlb_flush_range_by_mmuidx(env_cpu(env), range.base,
131
- range.length, idxmap, bits);
132
- }
133
-}
134
-
135
-static void tlbi_aa64_rvae1_write(CPUARMState *env,
136
- const ARMCPRegInfo *ri,
137
- uint64_t value)
138
-{
139
- /*
140
- * Invalidate by VA range, EL1&0.
141
- * Currently handles all of RVAE1, RVAAE1, RVAALE1 and RVALE1,
142
- * since we don't support flush-for-specific-ASID-only or
143
- * flush-last-level-only.
144
- */
145
-
146
- do_rvae_write(env, value, vae1_tlbmask(env),
147
- tlb_force_broadcast(env));
148
-}
149
-
150
-static void tlbi_aa64_rvae1is_write(CPUARMState *env,
151
- const ARMCPRegInfo *ri,
152
- uint64_t value)
153
-{
154
- /*
155
- * Invalidate by VA range, Inner/Outer Shareable EL1&0.
156
- * Currently handles all of RVAE1IS, RVAE1OS, RVAAE1IS, RVAAE1OS,
157
- * RVAALE1IS, RVAALE1OS, RVALE1IS and RVALE1OS, since we don't support
158
- * flush-for-specific-ASID-only, flush-last-level-only or inner/outer
159
- * shareable specific flushes.
160
- */
161
-
162
- do_rvae_write(env, value, vae1_tlbmask(env), true);
163
-}
164
-
165
-static void tlbi_aa64_rvae2_write(CPUARMState *env,
166
- const ARMCPRegInfo *ri,
167
- uint64_t value)
168
-{
169
- /*
170
- * Invalidate by VA range, EL2.
171
- * Currently handles all of RVAE2 and RVALE2,
172
- * since we don't support flush-for-specific-ASID-only or
173
- * flush-last-level-only.
174
- */
175
-
176
- do_rvae_write(env, value, vae2_tlbmask(env),
177
- tlb_force_broadcast(env));
178
-
179
-
180
-}
181
-
182
-static void tlbi_aa64_rvae2is_write(CPUARMState *env,
183
- const ARMCPRegInfo *ri,
184
- uint64_t value)
185
-{
186
- /*
187
- * Invalidate by VA range, Inner/Outer Shareable, EL2.
188
- * Currently handles all of RVAE2IS, RVAE2OS, RVALE2IS and RVALE2OS,
189
- * since we don't support flush-for-specific-ASID-only,
190
- * flush-last-level-only or inner/outer shareable specific flushes.
191
- */
192
-
193
- do_rvae_write(env, value, vae2_tlbmask(env), true);
194
-
195
-}
196
-
197
-static void tlbi_aa64_rvae3_write(CPUARMState *env,
198
- const ARMCPRegInfo *ri,
199
- uint64_t value)
200
-{
201
- /*
202
- * Invalidate by VA range, EL3.
203
- * Currently handles all of RVAE3 and RVALE3,
204
- * since we don't support flush-for-specific-ASID-only or
205
- * flush-last-level-only.
206
- */
207
-
208
- do_rvae_write(env, value, ARMMMUIdxBit_E3, tlb_force_broadcast(env));
209
-}
210
-
211
-static void tlbi_aa64_rvae3is_write(CPUARMState *env,
212
- const ARMCPRegInfo *ri,
213
- uint64_t value)
214
-{
215
- /*
216
- * Invalidate by VA range, EL3, Inner/Outer Shareable.
217
- * Currently handles all of RVAE3IS, RVAE3OS, RVALE3IS and RVALE3OS,
218
- * since we don't support flush-for-specific-ASID-only,
219
- * flush-last-level-only or inner/outer specific flushes.
220
- */
221
-
222
- do_rvae_write(env, value, ARMMMUIdxBit_E3, true);
223
-}
224
-
225
-static void tlbi_aa64_ripas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
226
- uint64_t value)
227
-{
228
- do_rvae_write(env, value, ipas2e1_tlbmask(env, value),
229
- tlb_force_broadcast(env));
230
-}
231
-
232
-static void tlbi_aa64_ripas2e1is_write(CPUARMState *env,
233
- const ARMCPRegInfo *ri,
234
- uint64_t value)
235
-{
236
- do_rvae_write(env, value, ipas2e1_tlbmask(env, value), true);
237
-}
238
-#endif
239
-
240
static CPAccessResult aa64_zva_access(CPUARMState *env, const ARMCPRegInfo *ri,
241
bool isread)
242
{
243
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo pauth_reginfo[] = {
244
.fieldoffset = offsetof(CPUARMState, keys.apib.hi) },
22
};
245
};
23
246
24
enum {
247
-static const ARMCPRegInfo tlbirange_reginfo[] = {
25
+ SD_STAR_FIFO_EMPTY = (1 << 2),
248
- { .name = "TLBI_RVAE1IS", .state = ARM_CP_STATE_AA64,
26
SD_STAR_CARD_PRESENT = (1 << 8),
249
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 1,
27
+ SD_STAR_FIFO_LEVEL_1 = (1 << 17),
250
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
251
- .fgt = FGT_TLBIRVAE1IS,
252
- .writefn = tlbi_aa64_rvae1is_write },
253
- { .name = "TLBI_RVAAE1IS", .state = ARM_CP_STATE_AA64,
254
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 3,
255
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
256
- .fgt = FGT_TLBIRVAAE1IS,
257
- .writefn = tlbi_aa64_rvae1is_write },
258
- { .name = "TLBI_RVALE1IS", .state = ARM_CP_STATE_AA64,
259
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 5,
260
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
261
- .fgt = FGT_TLBIRVALE1IS,
262
- .writefn = tlbi_aa64_rvae1is_write },
263
- { .name = "TLBI_RVAALE1IS", .state = ARM_CP_STATE_AA64,
264
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 7,
265
- .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
266
- .fgt = FGT_TLBIRVAALE1IS,
267
- .writefn = tlbi_aa64_rvae1is_write },
268
- { .name = "TLBI_RVAE1OS", .state = ARM_CP_STATE_AA64,
269
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
270
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
271
- .fgt = FGT_TLBIRVAE1OS,
272
- .writefn = tlbi_aa64_rvae1is_write },
273
- { .name = "TLBI_RVAAE1OS", .state = ARM_CP_STATE_AA64,
274
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 3,
275
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
276
- .fgt = FGT_TLBIRVAAE1OS,
277
- .writefn = tlbi_aa64_rvae1is_write },
278
- { .name = "TLBI_RVALE1OS", .state = ARM_CP_STATE_AA64,
279
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 5,
280
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
281
- .fgt = FGT_TLBIRVALE1OS,
282
- .writefn = tlbi_aa64_rvae1is_write },
283
- { .name = "TLBI_RVAALE1OS", .state = ARM_CP_STATE_AA64,
284
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 7,
285
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
286
- .fgt = FGT_TLBIRVAALE1OS,
287
- .writefn = tlbi_aa64_rvae1is_write },
288
- { .name = "TLBI_RVAE1", .state = ARM_CP_STATE_AA64,
289
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
290
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
291
- .fgt = FGT_TLBIRVAE1,
292
- .writefn = tlbi_aa64_rvae1_write },
293
- { .name = "TLBI_RVAAE1", .state = ARM_CP_STATE_AA64,
294
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 3,
295
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
296
- .fgt = FGT_TLBIRVAAE1,
297
- .writefn = tlbi_aa64_rvae1_write },
298
- { .name = "TLBI_RVALE1", .state = ARM_CP_STATE_AA64,
299
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 5,
300
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
301
- .fgt = FGT_TLBIRVALE1,
302
- .writefn = tlbi_aa64_rvae1_write },
303
- { .name = "TLBI_RVAALE1", .state = ARM_CP_STATE_AA64,
304
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 7,
305
- .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
306
- .fgt = FGT_TLBIRVAALE1,
307
- .writefn = tlbi_aa64_rvae1_write },
308
- { .name = "TLBI_RIPAS2E1IS", .state = ARM_CP_STATE_AA64,
309
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 2,
310
- .access = PL2_W, .type = ARM_CP_NO_RAW,
311
- .writefn = tlbi_aa64_ripas2e1is_write },
312
- { .name = "TLBI_RIPAS2LE1IS", .state = ARM_CP_STATE_AA64,
313
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 6,
314
- .access = PL2_W, .type = ARM_CP_NO_RAW,
315
- .writefn = tlbi_aa64_ripas2e1is_write },
316
- { .name = "TLBI_RVAE2IS", .state = ARM_CP_STATE_AA64,
317
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 1,
318
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
319
- .writefn = tlbi_aa64_rvae2is_write },
320
- { .name = "TLBI_RVALE2IS", .state = ARM_CP_STATE_AA64,
321
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 5,
322
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
323
- .writefn = tlbi_aa64_rvae2is_write },
324
- { .name = "TLBI_RIPAS2E1", .state = ARM_CP_STATE_AA64,
325
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 2,
326
- .access = PL2_W, .type = ARM_CP_NO_RAW,
327
- .writefn = tlbi_aa64_ripas2e1_write },
328
- { .name = "TLBI_RIPAS2LE1", .state = ARM_CP_STATE_AA64,
329
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 6,
330
- .access = PL2_W, .type = ARM_CP_NO_RAW,
331
- .writefn = tlbi_aa64_ripas2e1_write },
332
- { .name = "TLBI_RVAE2OS", .state = ARM_CP_STATE_AA64,
333
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 1,
334
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
335
- .writefn = tlbi_aa64_rvae2is_write },
336
- { .name = "TLBI_RVALE2OS", .state = ARM_CP_STATE_AA64,
337
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 5,
338
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
339
- .writefn = tlbi_aa64_rvae2is_write },
340
- { .name = "TLBI_RVAE2", .state = ARM_CP_STATE_AA64,
341
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 1,
342
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
343
- .writefn = tlbi_aa64_rvae2_write },
344
- { .name = "TLBI_RVALE2", .state = ARM_CP_STATE_AA64,
345
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 5,
346
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
347
- .writefn = tlbi_aa64_rvae2_write },
348
- { .name = "TLBI_RVAE3IS", .state = ARM_CP_STATE_AA64,
349
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 1,
350
- .access = PL3_W, .type = ARM_CP_NO_RAW,
351
- .writefn = tlbi_aa64_rvae3is_write },
352
- { .name = "TLBI_RVALE3IS", .state = ARM_CP_STATE_AA64,
353
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 5,
354
- .access = PL3_W, .type = ARM_CP_NO_RAW,
355
- .writefn = tlbi_aa64_rvae3is_write },
356
- { .name = "TLBI_RVAE3OS", .state = ARM_CP_STATE_AA64,
357
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 1,
358
- .access = PL3_W, .type = ARM_CP_NO_RAW,
359
- .writefn = tlbi_aa64_rvae3is_write },
360
- { .name = "TLBI_RVALE3OS", .state = ARM_CP_STATE_AA64,
361
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 5,
362
- .access = PL3_W, .type = ARM_CP_NO_RAW,
363
- .writefn = tlbi_aa64_rvae3is_write },
364
- { .name = "TLBI_RVAE3", .state = ARM_CP_STATE_AA64,
365
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 1,
366
- .access = PL3_W, .type = ARM_CP_NO_RAW,
367
- .writefn = tlbi_aa64_rvae3_write },
368
- { .name = "TLBI_RVALE3", .state = ARM_CP_STATE_AA64,
369
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 5,
370
- .access = PL3_W, .type = ARM_CP_NO_RAW,
371
- .writefn = tlbi_aa64_rvae3_write },
372
-};
373
-
374
static const ARMCPRegInfo tlbios_reginfo[] = {
375
{ .name = "TLBI_VMALLE1OS", .state = ARM_CP_STATE_AA64,
376
.opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 0,
377
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
378
if (cpu_isar_feature(aa64_rndr, cpu)) {
379
define_arm_cp_regs(cpu, rndr_reginfo);
380
}
381
- if (cpu_isar_feature(aa64_tlbirange, cpu)) {
382
- define_arm_cp_regs(cpu, tlbirange_reginfo);
383
- }
384
if (cpu_isar_feature(aa64_tlbios, cpu)) {
385
define_arm_cp_regs(cpu, tlbios_reginfo);
386
}
387
diff --git a/target/arm/tcg/tlb-insns.c b/target/arm/tcg/tlb-insns.c
388
index XXXXXXX..XXXXXXX 100644
389
--- a/target/arm/tcg/tlb-insns.c
390
+++ b/target/arm/tcg/tlb-insns.c
391
@@ -XXX,XX +XXX,XX @@
392
* SPDX-License-Identifier: GPL-2.0-or-later
393
*/
394
#include "qemu/osdep.h"
395
+#include "qemu/log.h"
396
#include "exec/exec-all.h"
397
#include "cpu.h"
398
#include "internals.h"
399
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo tlbi_el3_cp_reginfo[] = {
400
.writefn = tlbi_aa64_vae3_write },
28
};
401
};
29
402
30
enum {
403
+#ifdef TARGET_AARCH64
31
@@ -XXX,XX +XXX,XX @@ static uint64_t allwinner_sdhost_read(void *opaque, hwaddr offset,
404
+typedef struct {
32
break;
405
+ uint64_t base;
33
case REG_SD_STAR: /* Status */
406
+ uint64_t length;
34
res = s->status;
407
+} TLBIRange;
35
+ if (sdbus_data_ready(&s->sdbus)) {
408
+
36
+ res |= SD_STAR_FIFO_LEVEL_1;
409
+static ARMGranuleSize tlbi_range_tg_to_gran_size(int tg)
37
+ } else {
410
+{
38
+ res |= SD_STAR_FIFO_EMPTY;
411
+ /*
39
+ }
412
+ * Note that the TLBI range TG field encoding differs from both
40
break;
413
+ * TG0 and TG1 encodings.
41
case REG_SD_FWLR: /* FIFO Water Level */
414
+ */
42
res = s->fifo_wlevel;
415
+ switch (tg) {
416
+ case 1:
417
+ return Gran4K;
418
+ case 2:
419
+ return Gran16K;
420
+ case 3:
421
+ return Gran64K;
422
+ default:
423
+ return GranInvalid;
424
+ }
425
+}
426
+
427
+static TLBIRange tlbi_aa64_get_range(CPUARMState *env, ARMMMUIdx mmuidx,
428
+ uint64_t value)
429
+{
430
+ unsigned int page_size_granule, page_shift, num, scale, exponent;
431
+ /* Extract one bit to represent the va selector in use. */
432
+ uint64_t select = sextract64(value, 36, 1);
433
+ ARMVAParameters param = aa64_va_parameters(env, select, mmuidx, true, false);
434
+ TLBIRange ret = { };
435
+ ARMGranuleSize gran;
436
+
437
+ page_size_granule = extract64(value, 46, 2);
438
+ gran = tlbi_range_tg_to_gran_size(page_size_granule);
439
+
440
+ /* The granule encoded in value must match the granule in use. */
441
+ if (gran != param.gran) {
442
+ qemu_log_mask(LOG_GUEST_ERROR, "Invalid tlbi page size granule %d\n",
443
+ page_size_granule);
444
+ return ret;
445
+ }
446
+
447
+ page_shift = arm_granule_bits(gran);
448
+ num = extract64(value, 39, 5);
449
+ scale = extract64(value, 44, 2);
450
+ exponent = (5 * scale) + 1;
451
+
452
+ ret.length = (num + 1) << (exponent + page_shift);
453
+
454
+ if (param.select) {
455
+ ret.base = sextract64(value, 0, 37);
456
+ } else {
457
+ ret.base = extract64(value, 0, 37);
458
+ }
459
+ if (param.ds) {
460
+ /*
461
+ * With DS=1, BaseADDR is always shifted 16 so that it is able
462
+ * to address all 52 va bits. The input address is perforce
463
+ * aligned on a 64k boundary regardless of translation granule.
464
+ */
465
+ page_shift = 16;
466
+ }
467
+ ret.base <<= page_shift;
468
+
469
+ return ret;
470
+}
471
+
472
+static void do_rvae_write(CPUARMState *env, uint64_t value,
473
+ int idxmap, bool synced)
474
+{
475
+ ARMMMUIdx one_idx = ARM_MMU_IDX_A | ctz32(idxmap);
476
+ TLBIRange range;
477
+ int bits;
478
+
479
+ range = tlbi_aa64_get_range(env, one_idx, value);
480
+ bits = tlbbits_for_regime(env, one_idx, range.base);
481
+
482
+ if (synced) {
483
+ tlb_flush_range_by_mmuidx_all_cpus_synced(env_cpu(env),
484
+ range.base,
485
+ range.length,
486
+ idxmap,
487
+ bits);
488
+ } else {
489
+ tlb_flush_range_by_mmuidx(env_cpu(env), range.base,
490
+ range.length, idxmap, bits);
491
+ }
492
+}
493
+
494
+static void tlbi_aa64_rvae1_write(CPUARMState *env,
495
+ const ARMCPRegInfo *ri,
496
+ uint64_t value)
497
+{
498
+ /*
499
+ * Invalidate by VA range, EL1&0.
500
+ * Currently handles all of RVAE1, RVAAE1, RVAALE1 and RVALE1,
501
+ * since we don't support flush-for-specific-ASID-only or
502
+ * flush-last-level-only.
503
+ */
504
+
505
+ do_rvae_write(env, value, vae1_tlbmask(env),
506
+ tlb_force_broadcast(env));
507
+}
508
+
509
+static void tlbi_aa64_rvae1is_write(CPUARMState *env,
510
+ const ARMCPRegInfo *ri,
511
+ uint64_t value)
512
+{
513
+ /*
514
+ * Invalidate by VA range, Inner/Outer Shareable EL1&0.
515
+ * Currently handles all of RVAE1IS, RVAE1OS, RVAAE1IS, RVAAE1OS,
516
+ * RVAALE1IS, RVAALE1OS, RVALE1IS and RVALE1OS, since we don't support
517
+ * flush-for-specific-ASID-only, flush-last-level-only or inner/outer
518
+ * shareable specific flushes.
519
+ */
520
+
521
+ do_rvae_write(env, value, vae1_tlbmask(env), true);
522
+}
523
+
524
+static void tlbi_aa64_rvae2_write(CPUARMState *env,
525
+ const ARMCPRegInfo *ri,
526
+ uint64_t value)
527
+{
528
+ /*
529
+ * Invalidate by VA range, EL2.
530
+ * Currently handles all of RVAE2 and RVALE2,
531
+ * since we don't support flush-for-specific-ASID-only or
532
+ * flush-last-level-only.
533
+ */
534
+
535
+ do_rvae_write(env, value, vae2_tlbmask(env),
536
+ tlb_force_broadcast(env));
537
+
538
+
539
+}
540
+
541
+static void tlbi_aa64_rvae2is_write(CPUARMState *env,
542
+ const ARMCPRegInfo *ri,
543
+ uint64_t value)
544
+{
545
+ /*
546
+ * Invalidate by VA range, Inner/Outer Shareable, EL2.
547
+ * Currently handles all of RVAE2IS, RVAE2OS, RVALE2IS and RVALE2OS,
548
+ * since we don't support flush-for-specific-ASID-only,
549
+ * flush-last-level-only or inner/outer shareable specific flushes.
550
+ */
551
+
552
+ do_rvae_write(env, value, vae2_tlbmask(env), true);
553
+
554
+}
555
+
556
+static void tlbi_aa64_rvae3_write(CPUARMState *env,
557
+ const ARMCPRegInfo *ri,
558
+ uint64_t value)
559
+{
560
+ /*
561
+ * Invalidate by VA range, EL3.
562
+ * Currently handles all of RVAE3 and RVALE3,
563
+ * since we don't support flush-for-specific-ASID-only or
564
+ * flush-last-level-only.
565
+ */
566
+
567
+ do_rvae_write(env, value, ARMMMUIdxBit_E3, tlb_force_broadcast(env));
568
+}
569
+
570
+static void tlbi_aa64_rvae3is_write(CPUARMState *env,
571
+ const ARMCPRegInfo *ri,
572
+ uint64_t value)
573
+{
574
+ /*
575
+ * Invalidate by VA range, EL3, Inner/Outer Shareable.
576
+ * Currently handles all of RVAE3IS, RVAE3OS, RVALE3IS and RVALE3OS,
577
+ * since we don't support flush-for-specific-ASID-only,
578
+ * flush-last-level-only or inner/outer specific flushes.
579
+ */
580
+
581
+ do_rvae_write(env, value, ARMMMUIdxBit_E3, true);
582
+}
583
+
584
+static void tlbi_aa64_ripas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
585
+ uint64_t value)
586
+{
587
+ do_rvae_write(env, value, ipas2e1_tlbmask(env, value),
588
+ tlb_force_broadcast(env));
589
+}
590
+
591
+static void tlbi_aa64_ripas2e1is_write(CPUARMState *env,
592
+ const ARMCPRegInfo *ri,
593
+ uint64_t value)
594
+{
595
+ do_rvae_write(env, value, ipas2e1_tlbmask(env, value), true);
596
+}
597
+
598
+static const ARMCPRegInfo tlbirange_reginfo[] = {
599
+ { .name = "TLBI_RVAE1IS", .state = ARM_CP_STATE_AA64,
600
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 1,
601
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
602
+ .fgt = FGT_TLBIRVAE1IS,
603
+ .writefn = tlbi_aa64_rvae1is_write },
604
+ { .name = "TLBI_RVAAE1IS", .state = ARM_CP_STATE_AA64,
605
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 3,
606
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
607
+ .fgt = FGT_TLBIRVAAE1IS,
608
+ .writefn = tlbi_aa64_rvae1is_write },
609
+ { .name = "TLBI_RVALE1IS", .state = ARM_CP_STATE_AA64,
610
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 5,
611
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
612
+ .fgt = FGT_TLBIRVALE1IS,
613
+ .writefn = tlbi_aa64_rvae1is_write },
614
+ { .name = "TLBI_RVAALE1IS", .state = ARM_CP_STATE_AA64,
615
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 2, .opc2 = 7,
616
+ .access = PL1_W, .accessfn = access_ttlbis, .type = ARM_CP_NO_RAW,
617
+ .fgt = FGT_TLBIRVAALE1IS,
618
+ .writefn = tlbi_aa64_rvae1is_write },
619
+ { .name = "TLBI_RVAE1OS", .state = ARM_CP_STATE_AA64,
620
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 1,
621
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
622
+ .fgt = FGT_TLBIRVAE1OS,
623
+ .writefn = tlbi_aa64_rvae1is_write },
624
+ { .name = "TLBI_RVAAE1OS", .state = ARM_CP_STATE_AA64,
625
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 3,
626
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
627
+ .fgt = FGT_TLBIRVAAE1OS,
628
+ .writefn = tlbi_aa64_rvae1is_write },
629
+ { .name = "TLBI_RVALE1OS", .state = ARM_CP_STATE_AA64,
630
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 5,
631
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
632
+ .fgt = FGT_TLBIRVALE1OS,
633
+ .writefn = tlbi_aa64_rvae1is_write },
634
+ { .name = "TLBI_RVAALE1OS", .state = ARM_CP_STATE_AA64,
635
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 5, .opc2 = 7,
636
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
637
+ .fgt = FGT_TLBIRVAALE1OS,
638
+ .writefn = tlbi_aa64_rvae1is_write },
639
+ { .name = "TLBI_RVAE1", .state = ARM_CP_STATE_AA64,
640
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 1,
641
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
642
+ .fgt = FGT_TLBIRVAE1,
643
+ .writefn = tlbi_aa64_rvae1_write },
644
+ { .name = "TLBI_RVAAE1", .state = ARM_CP_STATE_AA64,
645
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 3,
646
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
647
+ .fgt = FGT_TLBIRVAAE1,
648
+ .writefn = tlbi_aa64_rvae1_write },
649
+ { .name = "TLBI_RVALE1", .state = ARM_CP_STATE_AA64,
650
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 5,
651
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
652
+ .fgt = FGT_TLBIRVALE1,
653
+ .writefn = tlbi_aa64_rvae1_write },
654
+ { .name = "TLBI_RVAALE1", .state = ARM_CP_STATE_AA64,
655
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 6, .opc2 = 7,
656
+ .access = PL1_W, .accessfn = access_ttlb, .type = ARM_CP_NO_RAW,
657
+ .fgt = FGT_TLBIRVAALE1,
658
+ .writefn = tlbi_aa64_rvae1_write },
659
+ { .name = "TLBI_RIPAS2E1IS", .state = ARM_CP_STATE_AA64,
660
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 2,
661
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
662
+ .writefn = tlbi_aa64_ripas2e1is_write },
663
+ { .name = "TLBI_RIPAS2LE1IS", .state = ARM_CP_STATE_AA64,
664
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 0, .opc2 = 6,
665
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
666
+ .writefn = tlbi_aa64_ripas2e1is_write },
667
+ { .name = "TLBI_RVAE2IS", .state = ARM_CP_STATE_AA64,
668
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 1,
669
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
670
+ .writefn = tlbi_aa64_rvae2is_write },
671
+ { .name = "TLBI_RVALE2IS", .state = ARM_CP_STATE_AA64,
672
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 2, .opc2 = 5,
673
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
674
+ .writefn = tlbi_aa64_rvae2is_write },
675
+ { .name = "TLBI_RIPAS2E1", .state = ARM_CP_STATE_AA64,
676
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 2,
677
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
678
+ .writefn = tlbi_aa64_ripas2e1_write },
679
+ { .name = "TLBI_RIPAS2LE1", .state = ARM_CP_STATE_AA64,
680
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 6,
681
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
682
+ .writefn = tlbi_aa64_ripas2e1_write },
683
+ { .name = "TLBI_RVAE2OS", .state = ARM_CP_STATE_AA64,
684
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 1,
685
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
686
+ .writefn = tlbi_aa64_rvae2is_write },
687
+ { .name = "TLBI_RVALE2OS", .state = ARM_CP_STATE_AA64,
688
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 5, .opc2 = 5,
689
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
690
+ .writefn = tlbi_aa64_rvae2is_write },
691
+ { .name = "TLBI_RVAE2", .state = ARM_CP_STATE_AA64,
692
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 1,
693
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
694
+ .writefn = tlbi_aa64_rvae2_write },
695
+ { .name = "TLBI_RVALE2", .state = ARM_CP_STATE_AA64,
696
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 6, .opc2 = 5,
697
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
698
+ .writefn = tlbi_aa64_rvae2_write },
699
+ { .name = "TLBI_RVAE3IS", .state = ARM_CP_STATE_AA64,
700
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 1,
701
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
702
+ .writefn = tlbi_aa64_rvae3is_write },
703
+ { .name = "TLBI_RVALE3IS", .state = ARM_CP_STATE_AA64,
704
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 2, .opc2 = 5,
705
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
706
+ .writefn = tlbi_aa64_rvae3is_write },
707
+ { .name = "TLBI_RVAE3OS", .state = ARM_CP_STATE_AA64,
708
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 1,
709
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
710
+ .writefn = tlbi_aa64_rvae3is_write },
711
+ { .name = "TLBI_RVALE3OS", .state = ARM_CP_STATE_AA64,
712
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 5, .opc2 = 5,
713
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
714
+ .writefn = tlbi_aa64_rvae3is_write },
715
+ { .name = "TLBI_RVAE3", .state = ARM_CP_STATE_AA64,
716
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 1,
717
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
718
+ .writefn = tlbi_aa64_rvae3_write },
719
+ { .name = "TLBI_RVALE3", .state = ARM_CP_STATE_AA64,
720
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 6, .opc2 = 5,
721
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
722
+ .writefn = tlbi_aa64_rvae3_write },
723
+};
724
+#endif
725
+
726
void define_tlb_insn_regs(ARMCPU *cpu)
727
{
728
CPUARMState *env = &cpu->env;
729
@@ -XXX,XX +XXX,XX @@ void define_tlb_insn_regs(ARMCPU *cpu)
730
if (arm_feature(env, ARM_FEATURE_EL3)) {
731
define_arm_cp_regs(cpu, tlbi_el3_cp_reginfo);
732
}
733
+#ifdef TARGET_AARCH64
734
+ if (cpu_isar_feature(aa64_tlbirange, cpu)) {
735
+ define_arm_cp_regs(cpu, tlbirange_reginfo);
736
+ }
737
+#endif
738
}
43
--
739
--
44
2.25.1
740
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
Move the TLBI OS insns across to tlb-insns.c.
2
2
3
There is only one caller for gen_gvec_fn_zz; inline it.
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20241210160452.2427965-8-peter.maydell@linaro.org
6
---
7
target/arm/helper.c | 80 --------------------------------------
8
target/arm/tcg/tlb-insns.c | 80 ++++++++++++++++++++++++++++++++++++++
9
2 files changed, 80 insertions(+), 80 deletions(-)
4
10
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
diff --git a/target/arm/helper.c b/target/arm/helper.c
6
Message-id: 20220527181907.189259-30-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 | 13 +++----------
11
1 file changed, 3 insertions(+), 10 deletions(-)
12
13
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/target/arm/translate-sve.c
13
--- a/target/arm/helper.c
16
+++ b/target/arm/translate-sve.c
14
+++ b/target/arm/helper.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 @@ static const ARMCPRegInfo pauth_reginfo[] = {
18
return gen_gvec_ool_zzzp(s, fn, a->rd, a->rn, a->rm, a->pg, data);
16
.fieldoffset = offsetof(CPUARMState, keys.apib.hi) },
19
}
17
};
20
18
21
-/* Invoke a vector expander on two Zregs. */
19
-static const ARMCPRegInfo tlbios_reginfo[] = {
22
-static void gen_gvec_fn_zz(DisasContext *s, GVecGen2Fn *gvec_fn,
20
- { .name = "TLBI_VMALLE1OS", .state = ARM_CP_STATE_AA64,
23
- int esz, int rd, int rn)
21
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 0,
24
-{
22
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
25
- unsigned vsz = vec_full_reg_size(s);
23
- .fgt = FGT_TLBIVMALLE1OS,
26
- gvec_fn(esz, vec_full_reg_offset(s, rd),
24
- .writefn = tlbi_aa64_vmalle1is_write },
27
- vec_full_reg_offset(s, rn), vsz, vsz);
25
- { .name = "TLBI_VAE1OS", .state = ARM_CP_STATE_AA64,
28
-}
26
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 1,
27
- .fgt = FGT_TLBIVAE1OS,
28
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
29
- .writefn = tlbi_aa64_vae1is_write },
30
- { .name = "TLBI_ASIDE1OS", .state = ARM_CP_STATE_AA64,
31
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 2,
32
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
33
- .fgt = FGT_TLBIASIDE1OS,
34
- .writefn = tlbi_aa64_vmalle1is_write },
35
- { .name = "TLBI_VAAE1OS", .state = ARM_CP_STATE_AA64,
36
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 3,
37
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
38
- .fgt = FGT_TLBIVAAE1OS,
39
- .writefn = tlbi_aa64_vae1is_write },
40
- { .name = "TLBI_VALE1OS", .state = ARM_CP_STATE_AA64,
41
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 5,
42
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
43
- .fgt = FGT_TLBIVALE1OS,
44
- .writefn = tlbi_aa64_vae1is_write },
45
- { .name = "TLBI_VAALE1OS", .state = ARM_CP_STATE_AA64,
46
- .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 7,
47
- .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
48
- .fgt = FGT_TLBIVAALE1OS,
49
- .writefn = tlbi_aa64_vae1is_write },
50
- { .name = "TLBI_ALLE2OS", .state = ARM_CP_STATE_AA64,
51
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 0,
52
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
53
- .writefn = tlbi_aa64_alle2is_write },
54
- { .name = "TLBI_VAE2OS", .state = ARM_CP_STATE_AA64,
55
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 1,
56
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
57
- .writefn = tlbi_aa64_vae2is_write },
58
- { .name = "TLBI_ALLE1OS", .state = ARM_CP_STATE_AA64,
59
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 4,
60
- .access = PL2_W, .type = ARM_CP_NO_RAW,
61
- .writefn = tlbi_aa64_alle1is_write },
62
- { .name = "TLBI_VALE2OS", .state = ARM_CP_STATE_AA64,
63
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 5,
64
- .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
65
- .writefn = tlbi_aa64_vae2is_write },
66
- { .name = "TLBI_VMALLS12E1OS", .state = ARM_CP_STATE_AA64,
67
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 6,
68
- .access = PL2_W, .type = ARM_CP_NO_RAW,
69
- .writefn = tlbi_aa64_alle1is_write },
70
- { .name = "TLBI_IPAS2E1OS", .state = ARM_CP_STATE_AA64,
71
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 0,
72
- .access = PL2_W, .type = ARM_CP_NOP },
73
- { .name = "TLBI_RIPAS2E1OS", .state = ARM_CP_STATE_AA64,
74
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 3,
75
- .access = PL2_W, .type = ARM_CP_NOP },
76
- { .name = "TLBI_IPAS2LE1OS", .state = ARM_CP_STATE_AA64,
77
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 4,
78
- .access = PL2_W, .type = ARM_CP_NOP },
79
- { .name = "TLBI_RIPAS2LE1OS", .state = ARM_CP_STATE_AA64,
80
- .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 7,
81
- .access = PL2_W, .type = ARM_CP_NOP },
82
- { .name = "TLBI_ALLE3OS", .state = ARM_CP_STATE_AA64,
83
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 0,
84
- .access = PL3_W, .type = ARM_CP_NO_RAW,
85
- .writefn = tlbi_aa64_alle3is_write },
86
- { .name = "TLBI_VAE3OS", .state = ARM_CP_STATE_AA64,
87
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 1,
88
- .access = PL3_W, .type = ARM_CP_NO_RAW,
89
- .writefn = tlbi_aa64_vae3is_write },
90
- { .name = "TLBI_VALE3OS", .state = ARM_CP_STATE_AA64,
91
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 5,
92
- .access = PL3_W, .type = ARM_CP_NO_RAW,
93
- .writefn = tlbi_aa64_vae3is_write },
94
-};
29
-
95
-
30
/* Invoke a vector expander on three Zregs. */
96
static uint64_t rndr_readfn(CPUARMState *env, const ARMCPRegInfo *ri)
31
static void gen_gvec_fn_zzz(DisasContext *s, GVecGen3Fn *gvec_fn,
32
int esz, int rd, int rn, int rm)
33
@@ -XXX,XX +XXX,XX @@ static void gen_gvec_fn_zzzz(DisasContext *s, GVecGen4Fn *gvec_fn,
34
static bool do_mov_z(DisasContext *s, int rd, int rn)
35
{
97
{
36
if (sve_access_check(s)) {
98
Error *err = NULL;
37
- gen_gvec_fn_zz(s, tcg_gen_gvec_mov, MO_8, rd, rn);
99
@@ -XXX,XX +XXX,XX @@ void register_cp_regs_for_features(ARMCPU *cpu)
38
+ unsigned vsz = vec_full_reg_size(s);
100
if (cpu_isar_feature(aa64_rndr, cpu)) {
39
+ tcg_gen_gvec_mov(MO_8, vec_full_reg_offset(s, rd),
101
define_arm_cp_regs(cpu, rndr_reginfo);
40
+ vec_full_reg_offset(s, rn), vsz, vsz);
41
}
102
}
42
return true;
103
- if (cpu_isar_feature(aa64_tlbios, cpu)) {
104
- define_arm_cp_regs(cpu, tlbios_reginfo);
105
- }
106
/* Data Cache clean instructions up to PoP */
107
if (cpu_isar_feature(aa64_dcpop, cpu)) {
108
define_one_arm_cp_reg(cpu, dcpop_reg);
109
diff --git a/target/arm/tcg/tlb-insns.c b/target/arm/tcg/tlb-insns.c
110
index XXXXXXX..XXXXXXX 100644
111
--- a/target/arm/tcg/tlb-insns.c
112
+++ b/target/arm/tcg/tlb-insns.c
113
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo tlbirange_reginfo[] = {
114
.access = PL3_W, .type = ARM_CP_NO_RAW,
115
.writefn = tlbi_aa64_rvae3_write },
116
};
117
+
118
+static const ARMCPRegInfo tlbios_reginfo[] = {
119
+ { .name = "TLBI_VMALLE1OS", .state = ARM_CP_STATE_AA64,
120
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 0,
121
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
122
+ .fgt = FGT_TLBIVMALLE1OS,
123
+ .writefn = tlbi_aa64_vmalle1is_write },
124
+ { .name = "TLBI_VAE1OS", .state = ARM_CP_STATE_AA64,
125
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 1,
126
+ .fgt = FGT_TLBIVAE1OS,
127
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
128
+ .writefn = tlbi_aa64_vae1is_write },
129
+ { .name = "TLBI_ASIDE1OS", .state = ARM_CP_STATE_AA64,
130
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 2,
131
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
132
+ .fgt = FGT_TLBIASIDE1OS,
133
+ .writefn = tlbi_aa64_vmalle1is_write },
134
+ { .name = "TLBI_VAAE1OS", .state = ARM_CP_STATE_AA64,
135
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 3,
136
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
137
+ .fgt = FGT_TLBIVAAE1OS,
138
+ .writefn = tlbi_aa64_vae1is_write },
139
+ { .name = "TLBI_VALE1OS", .state = ARM_CP_STATE_AA64,
140
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 5,
141
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
142
+ .fgt = FGT_TLBIVALE1OS,
143
+ .writefn = tlbi_aa64_vae1is_write },
144
+ { .name = "TLBI_VAALE1OS", .state = ARM_CP_STATE_AA64,
145
+ .opc0 = 1, .opc1 = 0, .crn = 8, .crm = 1, .opc2 = 7,
146
+ .access = PL1_W, .accessfn = access_ttlbos, .type = ARM_CP_NO_RAW,
147
+ .fgt = FGT_TLBIVAALE1OS,
148
+ .writefn = tlbi_aa64_vae1is_write },
149
+ { .name = "TLBI_ALLE2OS", .state = ARM_CP_STATE_AA64,
150
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 0,
151
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
152
+ .writefn = tlbi_aa64_alle2is_write },
153
+ { .name = "TLBI_VAE2OS", .state = ARM_CP_STATE_AA64,
154
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 1,
155
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
156
+ .writefn = tlbi_aa64_vae2is_write },
157
+ { .name = "TLBI_ALLE1OS", .state = ARM_CP_STATE_AA64,
158
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 4,
159
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
160
+ .writefn = tlbi_aa64_alle1is_write },
161
+ { .name = "TLBI_VALE2OS", .state = ARM_CP_STATE_AA64,
162
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 5,
163
+ .access = PL2_W, .type = ARM_CP_NO_RAW | ARM_CP_EL3_NO_EL2_UNDEF,
164
+ .writefn = tlbi_aa64_vae2is_write },
165
+ { .name = "TLBI_VMALLS12E1OS", .state = ARM_CP_STATE_AA64,
166
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 1, .opc2 = 6,
167
+ .access = PL2_W, .type = ARM_CP_NO_RAW,
168
+ .writefn = tlbi_aa64_alle1is_write },
169
+ { .name = "TLBI_IPAS2E1OS", .state = ARM_CP_STATE_AA64,
170
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 0,
171
+ .access = PL2_W, .type = ARM_CP_NOP },
172
+ { .name = "TLBI_RIPAS2E1OS", .state = ARM_CP_STATE_AA64,
173
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 3,
174
+ .access = PL2_W, .type = ARM_CP_NOP },
175
+ { .name = "TLBI_IPAS2LE1OS", .state = ARM_CP_STATE_AA64,
176
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 4,
177
+ .access = PL2_W, .type = ARM_CP_NOP },
178
+ { .name = "TLBI_RIPAS2LE1OS", .state = ARM_CP_STATE_AA64,
179
+ .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 4, .opc2 = 7,
180
+ .access = PL2_W, .type = ARM_CP_NOP },
181
+ { .name = "TLBI_ALLE3OS", .state = ARM_CP_STATE_AA64,
182
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 0,
183
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
184
+ .writefn = tlbi_aa64_alle3is_write },
185
+ { .name = "TLBI_VAE3OS", .state = ARM_CP_STATE_AA64,
186
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 1,
187
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
188
+ .writefn = tlbi_aa64_vae3is_write },
189
+ { .name = "TLBI_VALE3OS", .state = ARM_CP_STATE_AA64,
190
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 5,
191
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
192
+ .writefn = tlbi_aa64_vae3is_write },
193
+};
194
#endif
195
196
void define_tlb_insn_regs(ARMCPU *cpu)
197
@@ -XXX,XX +XXX,XX @@ void define_tlb_insn_regs(ARMCPU *cpu)
198
if (cpu_isar_feature(aa64_tlbirange, cpu)) {
199
define_arm_cp_regs(cpu, tlbirange_reginfo);
200
}
201
+ if (cpu_isar_feature(aa64_tlbios, cpu)) {
202
+ define_arm_cp_regs(cpu, tlbios_reginfo);
203
+ }
204
#endif
43
}
205
}
44
--
206
--
45
2.25.1
207
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
The remaining functions that we temporarily made global are now
2
used only from callsits in tlb-insns.c; move them across and
3
make them file-local again.
2
4
3
Rename the function to match gen_gvec_ool_arg_zpz,
5
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
and move to be adjacent.
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20241210160452.2427965-9-peter.maydell@linaro.org
8
---
9
target/arm/cpregs.h | 34 ------
10
target/arm/helper.c | 220 -------------------------------------
11
target/arm/tcg/tlb-insns.c | 220 +++++++++++++++++++++++++++++++++++++
12
3 files changed, 220 insertions(+), 254 deletions(-)
5
13
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
diff --git a/target/arm/cpregs.h b/target/arm/cpregs.h
7
Message-id: 20220527181907.189259-24-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 | 29 ++++++++++++++---------------
12
1 file changed, 14 insertions(+), 15 deletions(-)
13
14
diff --git a/target/arm/translate-sve.c b/target/arm/translate-sve.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
16
--- a/target/arm/cpregs.h
17
+++ b/target/arm/translate-sve.c
17
+++ b/target/arm/cpregs.h
18
@@ -XXX,XX +XXX,XX @@ static bool gen_gvec_ool_arg_zpz(DisasContext *s, gen_helper_gvec_3 *fn,
18
@@ -XXX,XX +XXX,XX @@ static inline bool arm_cpreg_traps_in_nv(const ARMCPRegInfo *ri)
19
return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, data);
19
return ri->opc1 == 4 || ri->opc1 == 5;
20
}
20
}
21
21
22
+static bool gen_gvec_ool_arg_zpzi(DisasContext *s, gen_helper_gvec_3 *fn,
22
-/*
23
+ arg_rpri_esz *a)
23
- * Temporary declarations of functions until the move to tlb_insn_helper.c
24
+{
24
- * is complete and we can make the functions static again
25
+ return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
25
- */
26
+}
26
-CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
27
27
- bool isread);
28
/* Invoke an out-of-line helper on 3 Zregs and a predicate. */
28
-CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
29
static void gen_gvec_ool_zzzp(DisasContext *s, gen_helper_gvec_4 *fn,
29
- bool isread);
30
@@ -XXX,XX +XXX,XX @@ static bool do_movz_zpz(DisasContext *s, int rd, int rn, int pg,
30
-CPAccessResult access_ttlbos(CPUARMState *env, const ARMCPRegInfo *ri,
31
return gen_gvec_ool_zzp(s, fns[esz], rd, rn, pg, invert);
31
- bool isread);
32
}
32
-bool tlb_force_broadcast(CPUARMState *env);
33
33
-int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
34
-static bool do_zpzi_ool(DisasContext *s, arg_rpri_esz *a,
34
- uint64_t addr);
35
- gen_helper_gvec_3 *fn)
35
-int vae1_tlbbits(CPUARMState *env, uint64_t addr);
36
-{
36
-int vae2_tlbbits(CPUARMState *env, uint64_t addr);
37
- return gen_gvec_ool_zzp(s, fn, a->rd, a->rn, a->pg, a->imm);
37
-int vae1_tlbmask(CPUARMState *env);
38
-}
38
-int vae2_tlbmask(CPUARMState *env);
39
-
39
-int ipas2e1_tlbmask(CPUARMState *env, int64_t value);
40
static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
40
-int e2_tlbmask(CPUARMState *env);
41
{
41
-void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
42
static gen_helper_gvec_3 * const fns[4] = {
42
- uint64_t value);
43
@@ -XXX,XX +XXX,XX @@ static bool trans_ASR_zpzi(DisasContext *s, arg_rpri_esz *a)
43
-void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
44
/* Shift by element size is architecturally valid. For
44
- uint64_t value);
45
arithmetic right-shift, it's the same as by one less. */
45
-void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
46
a->imm = MIN(a->imm, (8 << a->esz) - 1);
46
- uint64_t value);
47
- return do_zpzi_ool(s, a, fns[a->esz]);
47
-void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
48
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
48
- uint64_t value);
49
}
49
-void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
50
50
- uint64_t value);
51
static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
51
-void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
52
@@ -XXX,XX +XXX,XX @@ static bool trans_LSR_zpzi(DisasContext *s, arg_rpri_esz *a)
52
- uint64_t value);
53
if (a->imm >= (8 << a->esz)) {
53
-void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
54
return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
54
- uint64_t value);
55
} else {
55
-
56
- return do_zpzi_ool(s, a, fns[a->esz]);
56
#endif /* TARGET_ARM_CPREGS_H */
57
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
57
diff --git a/target/arm/helper.c b/target/arm/helper.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/target/arm/helper.c
60
+++ b/target/arm/helper.c
61
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tacr(CPUARMState *env, const ARMCPRegInfo *ri,
62
return CP_ACCESS_OK;
63
}
64
65
-/* Check for traps from EL1 due to HCR_EL2.TTLB. */
66
-CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
67
- bool isread)
68
-{
69
- if (arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_TTLB)) {
70
- return CP_ACCESS_TRAP_EL2;
71
- }
72
- return CP_ACCESS_OK;
73
-}
74
-
75
-/* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBIS. */
76
-CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
77
- bool isread)
78
-{
79
- if (arm_current_el(env) == 1 &&
80
- (arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBIS))) {
81
- return CP_ACCESS_TRAP_EL2;
82
- }
83
- return CP_ACCESS_OK;
84
-}
85
-
86
-#ifdef TARGET_AARCH64
87
-/* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBOS. */
88
-CPAccessResult access_ttlbos(CPUARMState *env, const ARMCPRegInfo *ri,
89
- bool isread)
90
-{
91
- if (arm_current_el(env) == 1 &&
92
- (arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBOS))) {
93
- return CP_ACCESS_TRAP_EL2;
94
- }
95
- return CP_ACCESS_OK;
96
-}
97
-#endif
98
-
99
static void dacr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
100
{
101
ARMCPU *cpu = env_archcpu(env);
102
@@ -XXX,XX +XXX,XX @@ int alle1_tlbmask(CPUARMState *env)
103
ARMMMUIdxBit_Stage2_S);
104
}
105
106
-/*
107
- * Non-IS variants of TLB operations are upgraded to
108
- * IS versions if we are at EL1 and HCR_EL2.FB is effectively set to
109
- * force broadcast of these operations.
110
- */
111
-bool tlb_force_broadcast(CPUARMState *env)
112
-{
113
- return arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_FB);
114
-}
115
-
116
static const ARMCPRegInfo cp_reginfo[] = {
117
/*
118
* Define the secure and non-secure FCSE identifier CP registers
119
@@ -XXX,XX +XXX,XX @@ static CPAccessResult access_tocu(CPUARMState *env, const ARMCPRegInfo *ri,
120
return do_cacheop_pou_access(env, HCR_TOCU | HCR_TPU);
121
}
122
123
-/*
124
- * See: D4.7.2 TLB maintenance requirements and the TLB maintenance instructions
125
- * Page D4-1736 (DDI0487A.b)
126
- */
127
-
128
-int vae1_tlbmask(CPUARMState *env)
129
-{
130
- uint64_t hcr = arm_hcr_el2_eff(env);
131
- uint16_t mask;
132
-
133
- assert(arm_feature(env, ARM_FEATURE_AARCH64));
134
-
135
- if ((hcr & (HCR_E2H | HCR_TGE)) == (HCR_E2H | HCR_TGE)) {
136
- mask = ARMMMUIdxBit_E20_2 |
137
- ARMMMUIdxBit_E20_2_PAN |
138
- ARMMMUIdxBit_E20_0;
139
- } else {
140
- /* This is AArch64 only, so we don't need to touch the EL30_x TLBs */
141
- mask = ARMMMUIdxBit_E10_1 |
142
- ARMMMUIdxBit_E10_1_PAN |
143
- ARMMMUIdxBit_E10_0;
144
- }
145
- return mask;
146
-}
147
-
148
-int vae2_tlbmask(CPUARMState *env)
149
-{
150
- uint64_t hcr = arm_hcr_el2_eff(env);
151
- uint16_t mask;
152
-
153
- if (hcr & HCR_E2H) {
154
- mask = ARMMMUIdxBit_E20_2 |
155
- ARMMMUIdxBit_E20_2_PAN |
156
- ARMMMUIdxBit_E20_0;
157
- } else {
158
- mask = ARMMMUIdxBit_E2;
159
- }
160
- return mask;
161
-}
162
-
163
-/* Return 56 if TBI is enabled, 64 otherwise. */
164
-int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
165
- uint64_t addr)
166
-{
167
- uint64_t tcr = regime_tcr(env, mmu_idx);
168
- int tbi = aa64_va_parameter_tbi(tcr, mmu_idx);
169
- int select = extract64(addr, 55, 1);
170
-
171
- return (tbi >> select) & 1 ? 56 : 64;
172
-}
173
-
174
-int vae1_tlbbits(CPUARMState *env, uint64_t addr)
175
-{
176
- uint64_t hcr = arm_hcr_el2_eff(env);
177
- ARMMMUIdx mmu_idx;
178
-
179
- assert(arm_feature(env, ARM_FEATURE_AARCH64));
180
-
181
- /* Only the regime of the mmu_idx below is significant. */
182
- if ((hcr & (HCR_E2H | HCR_TGE)) == (HCR_E2H | HCR_TGE)) {
183
- mmu_idx = ARMMMUIdx_E20_0;
184
- } else {
185
- mmu_idx = ARMMMUIdx_E10_0;
186
- }
187
-
188
- return tlbbits_for_regime(env, mmu_idx, addr);
189
-}
190
-
191
-int vae2_tlbbits(CPUARMState *env, uint64_t addr)
192
-{
193
- uint64_t hcr = arm_hcr_el2_eff(env);
194
- ARMMMUIdx mmu_idx;
195
-
196
- /*
197
- * Only the regime of the mmu_idx below is significant.
198
- * Regime EL2&0 has two ranges with separate TBI configuration, while EL2
199
- * only has one.
200
- */
201
- if (hcr & HCR_E2H) {
202
- mmu_idx = ARMMMUIdx_E20_2;
203
- } else {
204
- mmu_idx = ARMMMUIdx_E2;
205
- }
206
-
207
- return tlbbits_for_regime(env, mmu_idx, addr);
208
-}
209
-
210
-void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
211
- uint64_t value)
212
-{
213
- CPUState *cs = env_cpu(env);
214
- int mask = vae1_tlbmask(env);
215
-
216
- tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
217
-}
218
-
219
-int e2_tlbmask(CPUARMState *env)
220
-{
221
- return (ARMMMUIdxBit_E20_0 |
222
- ARMMMUIdxBit_E20_2 |
223
- ARMMMUIdxBit_E20_2_PAN |
224
- ARMMMUIdxBit_E2);
225
-}
226
-
227
-void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
228
- uint64_t value)
229
-{
230
- CPUState *cs = env_cpu(env);
231
- int mask = alle1_tlbmask(env);
232
-
233
- tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
234
-}
235
-
236
-void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
237
- uint64_t value)
238
-{
239
- CPUState *cs = env_cpu(env);
240
- int mask = e2_tlbmask(env);
241
-
242
- tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
243
-}
244
-
245
-void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
246
- uint64_t value)
247
-{
248
- CPUState *cs = env_cpu(env);
249
-
250
- tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E3);
251
-}
252
-
253
-void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
254
- uint64_t value)
255
-{
256
- CPUState *cs = env_cpu(env);
257
- int mask = vae1_tlbmask(env);
258
- uint64_t pageaddr = sextract64(value << 12, 0, 56);
259
- int bits = vae1_tlbbits(env, pageaddr);
260
-
261
- tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
262
-}
263
-
264
-void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
265
- uint64_t value)
266
-{
267
- CPUState *cs = env_cpu(env);
268
- int mask = vae2_tlbmask(env);
269
- uint64_t pageaddr = sextract64(value << 12, 0, 56);
270
- int bits = vae2_tlbbits(env, pageaddr);
271
-
272
- tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
273
-}
274
-
275
-void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
276
- uint64_t value)
277
-{
278
- CPUState *cs = env_cpu(env);
279
- uint64_t pageaddr = sextract64(value << 12, 0, 56);
280
- int bits = tlbbits_for_regime(env, ARMMMUIdx_E3, pageaddr);
281
-
282
- tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr,
283
- ARMMMUIdxBit_E3, bits);
284
-}
285
-
286
-int ipas2e1_tlbmask(CPUARMState *env, int64_t value)
287
-{
288
- /*
289
- * The MSB of value is the NS field, which only applies if SEL2
290
- * is implemented and SCR_EL3.NS is not set (i.e. in secure mode).
291
- */
292
- return (value >= 0
293
- && cpu_isar_feature(aa64_sel2, env_archcpu(env))
294
- && arm_is_secure_below_el3(env)
295
- ? ARMMMUIdxBit_Stage2_S
296
- : ARMMMUIdxBit_Stage2);
297
-}
298
-
299
static CPAccessResult aa64_zva_access(CPUARMState *env, const ARMCPRegInfo *ri,
300
bool isread)
301
{
302
diff --git a/target/arm/tcg/tlb-insns.c b/target/arm/tcg/tlb-insns.c
303
index XXXXXXX..XXXXXXX 100644
304
--- a/target/arm/tcg/tlb-insns.c
305
+++ b/target/arm/tcg/tlb-insns.c
306
@@ -XXX,XX +XXX,XX @@
307
#include "cpu-features.h"
308
#include "cpregs.h"
309
310
+/* Check for traps from EL1 due to HCR_EL2.TTLB. */
311
+static CPAccessResult access_ttlb(CPUARMState *env, const ARMCPRegInfo *ri,
312
+ bool isread)
313
+{
314
+ if (arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_TTLB)) {
315
+ return CP_ACCESS_TRAP_EL2;
316
+ }
317
+ return CP_ACCESS_OK;
318
+}
319
+
320
+/* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBIS. */
321
+static CPAccessResult access_ttlbis(CPUARMState *env, const ARMCPRegInfo *ri,
322
+ bool isread)
323
+{
324
+ if (arm_current_el(env) == 1 &&
325
+ (arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBIS))) {
326
+ return CP_ACCESS_TRAP_EL2;
327
+ }
328
+ return CP_ACCESS_OK;
329
+}
330
+
331
+#ifdef TARGET_AARCH64
332
+/* Check for traps from EL1 due to HCR_EL2.TTLB or TTLBOS. */
333
+static CPAccessResult access_ttlbos(CPUARMState *env, const ARMCPRegInfo *ri,
334
+ bool isread)
335
+{
336
+ if (arm_current_el(env) == 1 &&
337
+ (arm_hcr_el2_eff(env) & (HCR_TTLB | HCR_TTLBOS))) {
338
+ return CP_ACCESS_TRAP_EL2;
339
+ }
340
+ return CP_ACCESS_OK;
341
+}
342
+#endif
343
+
344
/* IS variants of TLB operations must affect all cores */
345
static void tlbiall_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
346
uint64_t value)
347
@@ -XXX,XX +XXX,XX @@ static void tlbimvaa_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
348
tlb_flush_page_all_cpus_synced(cs, value & TARGET_PAGE_MASK);
349
}
350
351
+/*
352
+ * Non-IS variants of TLB operations are upgraded to
353
+ * IS versions if we are at EL1 and HCR_EL2.FB is effectively set to
354
+ * force broadcast of these operations.
355
+ */
356
+static bool tlb_force_broadcast(CPUARMState *env)
357
+{
358
+ return arm_current_el(env) == 1 && (arm_hcr_el2_eff(env) & HCR_FB);
359
+}
360
+
361
static void tlbiall_write(CPUARMState *env, const ARMCPRegInfo *ri,
362
uint64_t value)
363
{
364
@@ -XXX,XX +XXX,XX @@ static void tlbiall_hyp_is_write(CPUARMState *env, const ARMCPRegInfo *ri,
365
tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E2);
366
}
367
368
+/*
369
+ * See: D4.7.2 TLB maintenance requirements and the TLB maintenance instructions
370
+ * Page D4-1736 (DDI0487A.b)
371
+ */
372
+
373
+static int vae1_tlbmask(CPUARMState *env)
374
+{
375
+ uint64_t hcr = arm_hcr_el2_eff(env);
376
+ uint16_t mask;
377
+
378
+ assert(arm_feature(env, ARM_FEATURE_AARCH64));
379
+
380
+ if ((hcr & (HCR_E2H | HCR_TGE)) == (HCR_E2H | HCR_TGE)) {
381
+ mask = ARMMMUIdxBit_E20_2 |
382
+ ARMMMUIdxBit_E20_2_PAN |
383
+ ARMMMUIdxBit_E20_0;
384
+ } else {
385
+ /* This is AArch64 only, so we don't need to touch the EL30_x TLBs */
386
+ mask = ARMMMUIdxBit_E10_1 |
387
+ ARMMMUIdxBit_E10_1_PAN |
388
+ ARMMMUIdxBit_E10_0;
389
+ }
390
+ return mask;
391
+}
392
+
393
+static int vae2_tlbmask(CPUARMState *env)
394
+{
395
+ uint64_t hcr = arm_hcr_el2_eff(env);
396
+ uint16_t mask;
397
+
398
+ if (hcr & HCR_E2H) {
399
+ mask = ARMMMUIdxBit_E20_2 |
400
+ ARMMMUIdxBit_E20_2_PAN |
401
+ ARMMMUIdxBit_E20_0;
402
+ } else {
403
+ mask = ARMMMUIdxBit_E2;
404
+ }
405
+ return mask;
406
+}
407
+
408
+/* Return 56 if TBI is enabled, 64 otherwise. */
409
+static int tlbbits_for_regime(CPUARMState *env, ARMMMUIdx mmu_idx,
410
+ uint64_t addr)
411
+{
412
+ uint64_t tcr = regime_tcr(env, mmu_idx);
413
+ int tbi = aa64_va_parameter_tbi(tcr, mmu_idx);
414
+ int select = extract64(addr, 55, 1);
415
+
416
+ return (tbi >> select) & 1 ? 56 : 64;
417
+}
418
+
419
+static int vae1_tlbbits(CPUARMState *env, uint64_t addr)
420
+{
421
+ uint64_t hcr = arm_hcr_el2_eff(env);
422
+ ARMMMUIdx mmu_idx;
423
+
424
+ assert(arm_feature(env, ARM_FEATURE_AARCH64));
425
+
426
+ /* Only the regime of the mmu_idx below is significant. */
427
+ if ((hcr & (HCR_E2H | HCR_TGE)) == (HCR_E2H | HCR_TGE)) {
428
+ mmu_idx = ARMMMUIdx_E20_0;
429
+ } else {
430
+ mmu_idx = ARMMMUIdx_E10_0;
431
+ }
432
+
433
+ return tlbbits_for_regime(env, mmu_idx, addr);
434
+}
435
+
436
+static int vae2_tlbbits(CPUARMState *env, uint64_t addr)
437
+{
438
+ uint64_t hcr = arm_hcr_el2_eff(env);
439
+ ARMMMUIdx mmu_idx;
440
+
441
+ /*
442
+ * Only the regime of the mmu_idx below is significant.
443
+ * Regime EL2&0 has two ranges with separate TBI configuration, while EL2
444
+ * only has one.
445
+ */
446
+ if (hcr & HCR_E2H) {
447
+ mmu_idx = ARMMMUIdx_E20_2;
448
+ } else {
449
+ mmu_idx = ARMMMUIdx_E2;
450
+ }
451
+
452
+ return tlbbits_for_regime(env, mmu_idx, addr);
453
+}
454
+
455
+static void tlbi_aa64_vmalle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
456
+ uint64_t value)
457
+{
458
+ CPUState *cs = env_cpu(env);
459
+ int mask = vae1_tlbmask(env);
460
+
461
+ tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
462
+}
463
+
464
static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
465
uint64_t value)
466
{
467
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vmalle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
58
}
468
}
59
}
469
}
60
470
61
@@ -XXX,XX +XXX,XX @@ static bool trans_LSL_zpzi(DisasContext *s, arg_rpri_esz *a)
471
+static int e2_tlbmask(CPUARMState *env)
62
if (a->imm >= (8 << a->esz)) {
472
+{
63
return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
473
+ return (ARMMMUIdxBit_E20_0 |
64
} else {
474
+ ARMMMUIdxBit_E20_2 |
65
- return do_zpzi_ool(s, a, fns[a->esz]);
475
+ ARMMMUIdxBit_E20_2_PAN |
66
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
476
+ ARMMMUIdxBit_E2);
477
+}
478
+
479
static void tlbi_aa64_alle1_write(CPUARMState *env, const ARMCPRegInfo *ri,
480
uint64_t value)
481
{
482
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_alle3_write(CPUARMState *env, const ARMCPRegInfo *ri,
483
tlb_flush_by_mmuidx(cs, ARMMMUIdxBit_E3);
484
}
485
486
+static void tlbi_aa64_alle1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
487
+ uint64_t value)
488
+{
489
+ CPUState *cs = env_cpu(env);
490
+ int mask = alle1_tlbmask(env);
491
+
492
+ tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
493
+}
494
+
495
+static void tlbi_aa64_alle2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
496
+ uint64_t value)
497
+{
498
+ CPUState *cs = env_cpu(env);
499
+ int mask = e2_tlbmask(env);
500
+
501
+ tlb_flush_by_mmuidx_all_cpus_synced(cs, mask);
502
+}
503
+
504
+static void tlbi_aa64_alle3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
505
+ uint64_t value)
506
+{
507
+ CPUState *cs = env_cpu(env);
508
+
509
+ tlb_flush_by_mmuidx_all_cpus_synced(cs, ARMMMUIdxBit_E3);
510
+}
511
+
512
static void tlbi_aa64_vae2_write(CPUARMState *env, const ARMCPRegInfo *ri,
513
uint64_t value)
514
{
515
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vae3_write(CPUARMState *env, const ARMCPRegInfo *ri,
516
tlb_flush_page_by_mmuidx(cs, pageaddr, ARMMMUIdxBit_E3);
517
}
518
519
+static void tlbi_aa64_vae1is_write(CPUARMState *env, const ARMCPRegInfo *ri,
520
+ uint64_t value)
521
+{
522
+ CPUState *cs = env_cpu(env);
523
+ int mask = vae1_tlbmask(env);
524
+ uint64_t pageaddr = sextract64(value << 12, 0, 56);
525
+ int bits = vae1_tlbbits(env, pageaddr);
526
+
527
+ tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
528
+}
529
+
530
static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
531
uint64_t value)
532
{
533
@@ -XXX,XX +XXX,XX @@ static void tlbi_aa64_vae1_write(CPUARMState *env, const ARMCPRegInfo *ri,
67
}
534
}
68
}
535
}
69
536
70
@@ -XXX,XX +XXX,XX @@ static bool trans_ASRD(DisasContext *s, arg_rpri_esz *a)
537
+static void tlbi_aa64_vae2is_write(CPUARMState *env, const ARMCPRegInfo *ri,
71
if (a->imm >= (8 << a->esz)) {
538
+ uint64_t value)
72
return do_movz_zpz(s, a->rd, a->rd, a->pg, a->esz, true);
539
+{
73
} else {
540
+ CPUState *cs = env_cpu(env);
74
- return do_zpzi_ool(s, a, fns[a->esz]);
541
+ int mask = vae2_tlbmask(env);
75
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
542
+ uint64_t pageaddr = sextract64(value << 12, 0, 56);
76
}
543
+ int bits = vae2_tlbbits(env, pageaddr);
77
}
544
+
78
545
+ tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr, mask, bits);
79
@@ -XXX,XX +XXX,XX @@ static bool trans_SQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
546
+}
80
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
547
+
81
return false;
548
+static void tlbi_aa64_vae3is_write(CPUARMState *env, const ARMCPRegInfo *ri,
82
}
549
+ uint64_t value)
83
- return do_zpzi_ool(s, a, fns[a->esz]);
550
+{
84
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
551
+ CPUState *cs = env_cpu(env);
85
}
552
+ uint64_t pageaddr = sextract64(value << 12, 0, 56);
86
553
+ int bits = tlbbits_for_regime(env, ARMMMUIdx_E3, pageaddr);
87
static bool trans_UQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
554
+
88
@@ -XXX,XX +XXX,XX @@ static bool trans_UQSHL_zpzi(DisasContext *s, arg_rpri_esz *a)
555
+ tlb_flush_page_bits_by_mmuidx_all_cpus_synced(cs, pageaddr,
89
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
556
+ ARMMMUIdxBit_E3, bits);
90
return false;
557
+}
91
}
558
+
92
- return do_zpzi_ool(s, a, fns[a->esz]);
559
+static int ipas2e1_tlbmask(CPUARMState *env, int64_t value)
93
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
560
+{
94
}
561
+ /*
95
562
+ * The MSB of value is the NS field, which only applies if SEL2
96
static bool trans_SRSHR(DisasContext *s, arg_rpri_esz *a)
563
+ * is implemented and SCR_EL3.NS is not set (i.e. in secure mode).
97
@@ -XXX,XX +XXX,XX @@ static bool trans_SRSHR(DisasContext *s, arg_rpri_esz *a)
564
+ */
98
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
565
+ return (value >= 0
99
return false;
566
+ && cpu_isar_feature(aa64_sel2, env_archcpu(env))
100
}
567
+ && arm_is_secure_below_el3(env)
101
- return do_zpzi_ool(s, a, fns[a->esz]);
568
+ ? ARMMMUIdxBit_Stage2_S
102
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
569
+ : ARMMMUIdxBit_Stage2);
103
}
570
+}
104
571
+
105
static bool trans_URSHR(DisasContext *s, arg_rpri_esz *a)
572
static void tlbi_aa64_ipas2e1_write(CPUARMState *env, const ARMCPRegInfo *ri,
106
@@ -XXX,XX +XXX,XX @@ static bool trans_URSHR(DisasContext *s, arg_rpri_esz *a)
573
uint64_t value)
107
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
574
{
108
return false;
109
}
110
- return do_zpzi_ool(s, a, fns[a->esz]);
111
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
112
}
113
114
static bool trans_SQSHLU(DisasContext *s, arg_rpri_esz *a)
115
@@ -XXX,XX +XXX,XX @@ static bool trans_SQSHLU(DisasContext *s, arg_rpri_esz *a)
116
if (a->esz < 0 || !dc_isar_feature(aa64_sve2, s)) {
117
return false;
118
}
119
- return do_zpzi_ool(s, a, fns[a->esz]);
120
+ return gen_gvec_ool_arg_zpzi(s, fns[a->esz], a);
121
}
122
123
/*
124
--
575
--
125
2.25.1
576
2.34.1
diff view generated by jsdifflib
1
From: Richard Henderson <richard.henderson@linaro.org>
1
Move the FEAT_RME specific TLB insns across to tlb-insns.c.
2
2
3
Convert SVE translation functions using do_sve2_fn2i
3
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
4
to use TRANS_FEAT and gen_gvec_fn_arg_zzi.
4
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Message-id: 20241210160452.2427965-10-peter.maydell@linaro.org
6
---
7
target/arm/helper.c | 38 --------------------------------
8
target/arm/tcg/tlb-insns.c | 45 ++++++++++++++++++++++++++++++++++++++
9
2 files changed, 45 insertions(+), 38 deletions(-)
5
10
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
diff --git a/target/arm/helper.c b/target/arm/helper.c
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
12
index XXXXXXX..XXXXXXX 100644
16
--- a/target/arm/translate-sve.c
13
--- a/target/arm/helper.c
17
+++ b/target/arm/translate-sve.c
14
+++ b/target/arm/helper.c
18
@@ -XXX,XX +XXX,XX @@ static bool do_adcl(DisasContext *s, arg_rrrr_esz *a, bool sel)
15
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo sme_reginfo[] = {
19
TRANS_FEAT(ADCLB, aa64_sve2, do_adcl, a, false)
16
.type = ARM_CP_CONST, .resetvalue = 0 },
20
TRANS_FEAT(ADCLT, aa64_sve2, do_adcl, a, true)
17
};
21
18
22
-static bool do_sve2_fn2i(DisasContext *s, arg_rri_esz *a, GVecGen2iFn *fn)
19
-static void tlbi_aa64_paall_write(CPUARMState *env, const ARMCPRegInfo *ri,
20
- uint64_t value)
23
-{
21
-{
24
- if (!dc_isar_feature(aa64_sve2, s)) {
22
- CPUState *cs = env_cpu(env);
25
- return false;
23
-
26
- }
24
- tlb_flush(cs);
27
- return gen_gvec_fn_arg_zzi(s, fn, a);
28
-}
25
-}
29
-
26
-
30
-static bool trans_SSRA(DisasContext *s, arg_rri_esz *a)
27
static void gpccr_write(CPUARMState *env, const ARMCPRegInfo *ri,
28
uint64_t value)
29
{
30
@@ -XXX,XX +XXX,XX @@ static void gpccr_reset(CPUARMState *env, const ARMCPRegInfo *ri)
31
env_archcpu(env)->reset_l0gptsz);
32
}
33
34
-static void tlbi_aa64_paallos_write(CPUARMState *env, const ARMCPRegInfo *ri,
35
- uint64_t value)
31
-{
36
-{
32
- return do_sve2_fn2i(s, a, gen_gvec_ssra);
37
- CPUState *cs = env_cpu(env);
38
-
39
- tlb_flush_all_cpus_synced(cs);
33
-}
40
-}
34
-
41
-
35
-static bool trans_USRA(DisasContext *s, arg_rri_esz *a)
42
static const ARMCPRegInfo rme_reginfo[] = {
36
-{
43
{ .name = "GPCCR_EL3", .state = ARM_CP_STATE_AA64,
37
- return do_sve2_fn2i(s, a, gen_gvec_usra);
44
.opc0 = 3, .opc1 = 6, .crn = 2, .crm = 1, .opc2 = 6,
38
-}
45
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo rme_reginfo[] = {
39
-
46
{ .name = "MFAR_EL3", .state = ARM_CP_STATE_AA64,
40
-static bool trans_SRSRA(DisasContext *s, arg_rri_esz *a)
47
.opc0 = 3, .opc1 = 6, .crn = 6, .crm = 0, .opc2 = 5,
41
-{
48
.access = PL3_RW, .fieldoffset = offsetof(CPUARMState, cp15.mfar_el3) },
42
- return do_sve2_fn2i(s, a, gen_gvec_srsra);
49
- { .name = "TLBI_PAALL", .state = ARM_CP_STATE_AA64,
43
-}
50
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 4,
44
-
51
- .access = PL3_W, .type = ARM_CP_NO_RAW,
45
-static bool trans_URSRA(DisasContext *s, arg_rri_esz *a)
52
- .writefn = tlbi_aa64_paall_write },
46
-{
53
- { .name = "TLBI_PAALLOS", .state = ARM_CP_STATE_AA64,
47
- return do_sve2_fn2i(s, a, gen_gvec_ursra);
54
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 4,
48
-}
55
- .access = PL3_W, .type = ARM_CP_NO_RAW,
49
-
56
- .writefn = tlbi_aa64_paallos_write },
50
-static bool trans_SRI(DisasContext *s, arg_rri_esz *a)
57
- /*
51
-{
58
- * QEMU does not have a way to invalidate by physical address, thus
52
- return do_sve2_fn2i(s, a, gen_gvec_sri);
59
- * invalidating a range of physical addresses is accomplished by
53
-}
60
- * flushing all tlb entries in the outer shareable domain,
54
-
61
- * just like PAALLOS.
55
-static bool trans_SLI(DisasContext *s, arg_rri_esz *a)
62
- */
56
-{
63
- { .name = "TLBI_RPALOS", .state = ARM_CP_STATE_AA64,
57
- return do_sve2_fn2i(s, a, gen_gvec_sli);
64
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 7,
58
-}
65
- .access = PL3_W, .type = ARM_CP_NO_RAW,
59
+TRANS_FEAT(SSRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_ssra, a)
66
- .writefn = tlbi_aa64_paallos_write },
60
+TRANS_FEAT(USRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_usra, a)
67
- { .name = "TLBI_RPAOS", .state = ARM_CP_STATE_AA64,
61
+TRANS_FEAT(SRSRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_srsra, a)
68
- .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 3,
62
+TRANS_FEAT(URSRA, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_ursra, a)
69
- .access = PL3_W, .type = ARM_CP_NO_RAW,
63
+TRANS_FEAT(SRI, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_sri, a)
70
- .writefn = tlbi_aa64_paallos_write },
64
+TRANS_FEAT(SLI, aa64_sve2, gen_gvec_fn_arg_zzi, gen_gvec_sli, a)
71
{ .name = "DC_CIPAPA", .state = ARM_CP_STATE_AA64,
65
72
.opc0 = 1, .opc1 = 6, .crn = 7, .crm = 14, .opc2 = 1,
66
TRANS_FEAT(SABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_saba, a)
73
.access = PL3_W, .type = ARM_CP_NOP },
67
TRANS_FEAT(UABA, aa64_sve2, gen_gvec_fn_arg_zzz, gen_gvec_uaba, a)
74
diff --git a/target/arm/tcg/tlb-insns.c b/target/arm/tcg/tlb-insns.c
75
index XXXXXXX..XXXXXXX 100644
76
--- a/target/arm/tcg/tlb-insns.c
77
+++ b/target/arm/tcg/tlb-insns.c
78
@@ -XXX,XX +XXX,XX @@ static const ARMCPRegInfo tlbios_reginfo[] = {
79
.access = PL3_W, .type = ARM_CP_NO_RAW,
80
.writefn = tlbi_aa64_vae3is_write },
81
};
82
+
83
+static void tlbi_aa64_paall_write(CPUARMState *env, const ARMCPRegInfo *ri,
84
+ uint64_t value)
85
+{
86
+ CPUState *cs = env_cpu(env);
87
+
88
+ tlb_flush(cs);
89
+}
90
+
91
+static void tlbi_aa64_paallos_write(CPUARMState *env, const ARMCPRegInfo *ri,
92
+ uint64_t value)
93
+{
94
+ CPUState *cs = env_cpu(env);
95
+
96
+ tlb_flush_all_cpus_synced(cs);
97
+}
98
+
99
+static const ARMCPRegInfo tlbi_rme_reginfo[] = {
100
+ { .name = "TLBI_PAALL", .state = ARM_CP_STATE_AA64,
101
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 7, .opc2 = 4,
102
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
103
+ .writefn = tlbi_aa64_paall_write },
104
+ { .name = "TLBI_PAALLOS", .state = ARM_CP_STATE_AA64,
105
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 1, .opc2 = 4,
106
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
107
+ .writefn = tlbi_aa64_paallos_write },
108
+ /*
109
+ * QEMU does not have a way to invalidate by physical address, thus
110
+ * invalidating a range of physical addresses is accomplished by
111
+ * flushing all tlb entries in the outer shareable domain,
112
+ * just like PAALLOS.
113
+ */
114
+ { .name = "TLBI_RPALOS", .state = ARM_CP_STATE_AA64,
115
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 7,
116
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
117
+ .writefn = tlbi_aa64_paallos_write },
118
+ { .name = "TLBI_RPAOS", .state = ARM_CP_STATE_AA64,
119
+ .opc0 = 1, .opc1 = 6, .crn = 8, .crm = 4, .opc2 = 3,
120
+ .access = PL3_W, .type = ARM_CP_NO_RAW,
121
+ .writefn = tlbi_aa64_paallos_write },
122
+};
123
+
124
#endif
125
126
void define_tlb_insn_regs(ARMCPU *cpu)
127
@@ -XXX,XX +XXX,XX @@ void define_tlb_insn_regs(ARMCPU *cpu)
128
if (cpu_isar_feature(aa64_tlbios, cpu)) {
129
define_arm_cp_regs(cpu, tlbios_reginfo);
130
}
131
+ if (cpu_isar_feature(aa64_rme, cpu)) {
132
+ define_arm_cp_regs(cpu, tlbi_rme_reginfo);
133
+ }
134
#endif
135
}
68
--
136
--
69
2.25.1
137
2.34.1
diff view generated by jsdifflib
1
In commit 5814d587fe861fe9 we added support for emulating
1
We currently register the tlbi_el2_cp_reginfo[] TLBI insns if EL2 is
2
FEAT_HCX (Support for the HCRX_EL2 register). However we
2
implemented, or if EL3 and v8 is implemented. This is a copy of the
3
forgot to add it to the list in emulated.rst. Correct the
3
logic used for el2_cp_reginfo[], but for the specific case of the
4
omission.
4
TLBI insns we can simplify it. This is because we do not need the
5
"if EL2 does not exist but EL3 does then EL2 registers should exist
6
and be RAZ/WI" handling here: all our cpregs are for instructions,
7
which UNDEF when EL3 exists and EL2 does not.
5
8
6
Fixes: 5814d587fe861fe9 ("target/arm: Enable FEAT_HCX for -cpu max")
9
Simplify the condition down to just "if EL2 exists".
10
This is not a behaviour change because:
11
* for AArch64 insns we marked them with ARM_CP_EL3_NO_EL2_UNDEF,
12
which meant that define_arm_cp_regs() would ignore them if
13
EL2 wasn't present
14
* for AArch32 insns, the .access = PL2_W meant that if EL2
15
was not present the only way to get at them was from AArch32
16
EL3; but we have no CPUs which have ARM_FEATURE_V8 but
17
start in AArch32
18
7
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
20
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Message-id: 20220520084320.424166-1-peter.maydell@linaro.org
21
Message-id: 20241210160452.2427965-11-peter.maydell@linaro.org
10
---
22
---
11
docs/system/arm/emulation.rst | 1 +
23
target/arm/tcg/tlb-insns.c | 4 +---
12
1 file changed, 1 insertion(+)
24
1 file changed, 1 insertion(+), 3 deletions(-)
13
25
14
diff --git a/docs/system/arm/emulation.rst b/docs/system/arm/emulation.rst
26
diff --git a/target/arm/tcg/tlb-insns.c b/target/arm/tcg/tlb-insns.c
15
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
16
--- a/docs/system/arm/emulation.rst
28
--- a/target/arm/tcg/tlb-insns.c
17
+++ b/docs/system/arm/emulation.rst
29
+++ b/target/arm/tcg/tlb-insns.c
18
@@ -XXX,XX +XXX,XX @@ the following architecture extensions:
30
@@ -XXX,XX +XXX,XX @@ void define_tlb_insn_regs(ARMCPU *cpu)
19
- FEAT_FRINTTS (Floating-point to integer instructions)
31
* ops (i.e. matching the condition for el2_cp_reginfo[] in
20
- FEAT_FlagM (Flag manipulation instructions v2)
32
* helper.c), but we will be able to simplify this later.
21
- FEAT_FlagM2 (Enhancements to flag manipulation instructions)
33
*/
22
+- FEAT_HCX (Support for the HCRX_EL2 register)
34
- if (arm_feature(env, ARM_FEATURE_EL2)
23
- FEAT_HPDS (Hierarchical permission disables)
35
- || (arm_feature(env, ARM_FEATURE_EL3)
24
- FEAT_I8MM (AArch64 Int8 matrix multiplication instructions)
36
- && arm_feature(env, ARM_FEATURE_V8))) {
25
- FEAT_IDST (ID space trap handling)
37
+ if (arm_feature(env, ARM_FEATURE_EL2)) {
38
define_arm_cp_regs(cpu, tlbi_el2_cp_reginfo);
39
}
40
if (arm_feature(env, ARM_FEATURE_EL3)) {
26
--
41
--
27
2.25.1
42
2.34.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_zzxz to TRANS_FEAT. Also include
5
BFDOT_zzxz, which was using gen_gvec_ool_zzzz.
6
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-id: 20220527181907.189259-15-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 | 48 +++++++++++---------------------------
13
1 file changed, 14 insertions(+), 34 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 @@ TRANS_FEAT(DOT_zzzz, aa64_sve, gen_gvec_ool_zzzz,
20
* SVE Multiply - Indexed
21
*/
22
23
-#define DO_RRXR(NAME, FUNC) \
24
- static bool NAME(DisasContext *s, arg_rrxr_esz *a) \
25
- { return gen_gvec_ool_arg_zzxz(s, FUNC, a); }
26
+TRANS_FEAT(SDOT_zzxw_s, aa64_sve, gen_gvec_ool_arg_zzxz,
27
+ gen_helper_gvec_sdot_idx_b, a)
28
+TRANS_FEAT(SDOT_zzxw_d, aa64_sve, gen_gvec_ool_arg_zzxz,
29
+ gen_helper_gvec_sdot_idx_h, a)
30
+TRANS_FEAT(UDOT_zzxw_s, aa64_sve, gen_gvec_ool_arg_zzxz,
31
+ gen_helper_gvec_udot_idx_b, a)
32
+TRANS_FEAT(UDOT_zzxw_d, aa64_sve, gen_gvec_ool_arg_zzxz,
33
+ gen_helper_gvec_udot_idx_h, a)
34
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
66
TRANS_FEAT(BFDOT_zzzz, aa64_sve_bf16, gen_gvec_ool_arg_zzzz,
67
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
--
83
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
Convert SVE translation functions directly using
4
gen_gvec_ool_arg_zpz to TRANS_FEAT.
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Message-id: 20220527181907.189259-22-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 | 189 ++++++++++++-------------------------
12
1 file changed, 60 insertions(+), 129 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
*** SVE Integer Arithmetic - Unary Predicated Group
20
*/
21
22
-#define DO_ZPZ(NAME, name) \
23
-static bool trans_##NAME(DisasContext *s, arg_rpr_esz *a) \
24
-{ \
25
- static gen_helper_gvec_3 * const fns[4] = { \
26
- gen_helper_sve_##name##_b, gen_helper_sve_##name##_h, \
27
- gen_helper_sve_##name##_s, gen_helper_sve_##name##_d, \
28
+#define DO_ZPZ(NAME, FEAT, name) \
29
+ static gen_helper_gvec_3 * const name##_fns[4] = { \
30
+ gen_helper_##name##_b, gen_helper_##name##_h, \
31
+ gen_helper_##name##_s, gen_helper_##name##_d, \
32
}; \
33
- return gen_gvec_ool_arg_zpz(s, 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
163
/*
164
*** SVE Integer Reduction Group
165
@@ -XXX,XX +XXX,XX @@ TRANS_FEAT(TRN2_q, aa64_sve_f64mm, gen_gvec_ool_arg_zzz,
166
*** SVE Permute Vector - Predicated Group
167
*/
168
169
-static bool trans_COMPACT(DisasContext *s, arg_rpr_esz *a)
170
-{
171
- static gen_helper_gvec_3 * const fns[4] = {
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
181
/* Call the helper that computes the ARM LastActiveElement pseudocode
182
* 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)
184
return true;
185
}
186
187
-static bool trans_REVB(DisasContext *s, arg_rpr_esz *a)
188
-{
189
- static gen_helper_gvec_3 * const fns[4] = {
190
- NULL,
191
- gen_helper_sve_revb_h,
192
- gen_helper_sve_revb_s,
193
- gen_helper_sve_revb_d,
194
- };
195
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
196
-}
197
+static gen_helper_gvec_3 * const revb_fns[4] = {
198
+ NULL, gen_helper_sve_revb_h,
199
+ gen_helper_sve_revb_s, gen_helper_sve_revb_d,
200
+};
201
+TRANS_FEAT(REVB, aa64_sve, gen_gvec_ool_arg_zpz, revb_fns[a->esz], a, 0)
202
203
-static bool trans_REVH(DisasContext *s, arg_rpr_esz *a)
204
-{
205
- static gen_helper_gvec_3 * const fns[4] = {
206
- NULL,
207
- NULL,
208
- gen_helper_sve_revh_s,
209
- gen_helper_sve_revh_d,
210
- };
211
- return gen_gvec_ool_arg_zpz(s, fns[a->esz], a, 0);
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
--
240
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
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
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
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-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-53-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 trans_RDFFR_p(DisasContext *s, arg_RDFFR_p *a)
16
return trans_AND_pppp(s, &alt_a);
17
}
18
19
-static bool trans_RDFFR(DisasContext *s, arg_RDFFR *a)
20
-{
21
- return do_mov_p(s, a->rd, FFR_PRED_NUM);
22
-}
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
31
static bool do_pfirst_pnext(DisasContext *s, arg_rr_esz *a,
32
void (*gen_fn)(TCGv_i32, TCGv_ptr,
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-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