1
The following changes since commit 7fe6cb68117ac856e03c93d18aca09de015392b0:
1
Note that I have refreshed the expiry of my public key.
2
2
and pushed to keys.openpgp.org.
3
Merge tag 'pull-target-arm-20230530-1' of https://git.linaro.org/people/pmaydell/qemu-arm into staging (2023-05-30 08:02:05 -0700)
3
4
5
r~
6
7
8
The following changes since commit 4d5d933bbc7cc52f6cc6b9021f91fa06266222d5:
9
10
Merge tag 'pull-xenfv-20250116' of git://git.infradead.org/users/dwmw2/qemu into staging (2025-01-16 09:03:43 -0500)
4
11
5
are available in the Git repository at:
12
are available in the Git repository at:
6
13
7
https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20230530
14
https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20250117
8
15
9
for you to fetch changes up to 276d77de503e8f5f5cbd3f7d94302ca12d1d982e:
16
for you to fetch changes up to db1649823d4f27b924a5aa5f9e0111457accb798:
10
17
11
tests/decode: Add tests for various named-field cases (2023-05-30 10:55:39 -0700)
18
softfloat: Constify helpers returning float_status field (2025-01-17 08:29:25 -0800)
12
19
13
----------------------------------------------------------------
20
----------------------------------------------------------------
14
Improvements to 128-bit atomics:
21
tcg:
15
- Separate __int128_t type and arithmetic detection
22
- Add TCGOP_TYPE, TCGOP_FLAGS.
16
- Support 128-bit load/store in backend for i386, aarch64, ppc64, s390x
23
- Pass type and flags to tcg_op_supported, tcg_target_op_def.
17
- Accelerate atomics via host/include/
24
- Split out tcg-target-has.h and unexport from tcg.h.
18
Decodetree:
25
- Reorg constraint processing; constify TCGOpDef.
19
- Add named field syntax
26
- Make extract, sextract, deposit opcodes mandatory.
20
- Move tests to meson
27
- Merge ext{8,16,32}{s,u} opcodes into {s}extract.
28
tcg/mips: Expand bswap unconditionally
29
tcg/riscv: Use SRAIW, SRLIW for {s}extract_i64
30
tcg/riscv: Use BEXTI for single-bit extractions
31
tcg/sparc64: Use SRA, SRL for {s}extract_i64
32
33
disas/riscv: Guard dec->cfg dereference for host disassemble
34
util/cpuinfo-riscv: Detect Zbs
35
accel/tcg: Call tcg_tb_insert() for one-insn TBs
36
linux-user: Add missing /proc/cpuinfo fields for sparc
21
37
22
----------------------------------------------------------------
38
----------------------------------------------------------------
23
Peter Maydell (5):
39
Helge Deller (1):
24
docs: Document decodetree named field syntax
40
linux-user: Add missing /proc/cpuinfo fields for sparc
25
scripts/decodetree: Pass lvalue-formatter function to str_extract()
41
26
scripts/decodetree: Implement a topological sort
42
Ilya Leoshkevich (2):
27
scripts/decodetree: Implement named field support
43
tcg: Document tb_lookup() and tcg_tb_lookup()
28
tests/decode: Add tests for various named-field cases
44
accel/tcg: Call tcg_tb_insert() for one-insn TBs
29
45
30
Richard Henderson (22):
46
LIU Zhiwei (1):
31
tcg: Fix register move type in tcg_out_ld_helper_ret
47
disas/riscv: Guard dec->cfg dereference for host disassemble
32
accel/tcg: Fix check for page writeability in load_atomic16_or_exit
48
33
meson: Split test for __int128_t type from __int128_t arithmetic
49
Philippe Mathieu-Daudé (1):
34
qemu/atomic128: Add x86_64 atomic128-ldst.h
50
softfloat: Constify helpers returning float_status field
35
tcg/i386: Support 128-bit load/store
51
36
tcg/aarch64: Rename temporaries
52
Richard Henderson (63):
37
tcg/aarch64: Reserve TCG_REG_TMP1, TCG_REG_TMP2
53
tcg: Move call abi parameters from tcg-target.h to tcg-target.c.inc
38
tcg/aarch64: Simplify constraints on qemu_ld/st
54
tcg: Replace TCGOP_VECL with TCGOP_TYPE
39
tcg/aarch64: Support 128-bit load/store
55
tcg: Move tcg_op_insert_{after,before} decls to tcg-internal.h
40
tcg/ppc: Support 128-bit load/store
56
tcg: Copy TCGOP_TYPE in tcg_op_insert_{after,before}
41
tcg/s390x: Support 128-bit load/store
57
tcg: Add TCGOP_FLAGS
42
accel/tcg: Extract load_atom_extract_al16_or_al8 to host header
58
tcg: Add type and flags arguments to tcg_op_supported
43
accel/tcg: Extract store_atom_insert_al16 to host header
59
target/arm: Do not test TCG_TARGET_HAS_bitsel_vec
44
accel/tcg: Add x86_64 load_atom_extract_al16_or_al8
60
target/arm: Use tcg_op_supported
45
accel/tcg: Add aarch64 lse2 load_atom_extract_al16_or_al8
61
target/tricore: Use tcg_op_supported
46
accel/tcg: Add aarch64 store_atom_insert_al16
62
tcg: Add tcg_op_deposit_valid
47
tcg: Remove TCG_TARGET_TLB_DISPLACEMENT_BITS
63
target/i386: Remove TCG_TARGET_extract_tl_valid
48
decodetree: Add --test-for-error
64
target/i386: Use tcg_op_deposit_valid
49
decodetree: Fix recursion in prop_format and build_tree
65
target/i386: Use tcg_op_supported
50
decodetree: Diagnose empty pattern group
66
tcg: Remove TCG_TARGET_NEED_LDST_LABELS and TCG_TARGET_NEED_POOL_LABELS
51
decodetree: Do not remove output_file from /dev
67
tcg: Rename tcg-target.opc.h to tcg-target-opc.h.inc
52
tests/decode: Convert tests to meson
68
tcg/tci: Move TCI specific opcodes to tcg-target-opc.h.inc
53
69
tcg: Move fallback tcg_can_emit_vec_op out of line
54
docs/devel/decodetree.rst | 33 ++-
70
tcg/ppc: Remove TCGPowerISA enum
55
meson.build | 15 +-
71
tcg: Extract default TCG_TARGET_HAS_foo definitions to 'tcg-has.h'
56
host/include/aarch64/host/load-extract-al16-al8.h | 40 ++++
72
tcg/aarch64: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
57
host/include/aarch64/host/store-insert-al16.h | 47 ++++
73
tcg/arm: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
58
host/include/generic/host/load-extract-al16-al8.h | 45 ++++
74
tcg/i386: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
59
host/include/generic/host/store-insert-al16.h | 50 ++++
75
tcg/loongarch64: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
60
host/include/x86_64/host/atomic128-ldst.h | 68 ++++++
76
tcg/mips: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
61
host/include/x86_64/host/load-extract-al16-al8.h | 50 ++++
77
tcg/ppc: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
62
include/qemu/int128.h | 4 +-
78
tcg/riscv: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
63
tcg/aarch64/tcg-target-con-set.h | 4 +-
79
tcg/s390x: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
64
tcg/aarch64/tcg-target-con-str.h | 1 -
80
tcg/sparc64: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
65
tcg/aarch64/tcg-target.h | 12 +-
81
tcg/tci: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
66
tcg/arm/tcg-target.h | 1 -
82
tcg: Include 'tcg-target-has.h' once in 'tcg-has.h'
67
tcg/i386/tcg-target.h | 5 +-
83
tcg: Only include 'tcg-has.h' when necessary
68
tcg/mips/tcg-target.h | 1 -
84
tcg: Split out tcg-target-mo.h
69
tcg/ppc/tcg-target-con-set.h | 2 +
85
tcg: Use C_NotImplemented in tcg_target_op_def
70
tcg/ppc/tcg-target-con-str.h | 1 +
86
tcg: Change have_vec to has_type in tcg_op_supported
71
tcg/ppc/tcg-target.h | 4 +-
87
tcg: Reorg process_op_defs
72
tcg/riscv/tcg-target.h | 1 -
88
tcg: Remove args_ct from TCGOpDef
73
tcg/s390x/tcg-target-con-set.h | 2 +
89
tcg: Constify tcg_op_defs
74
tcg/s390x/tcg-target.h | 3 +-
90
tcg: Validate op supported in opcode_args_ct
75
tcg/sparc64/tcg-target.h | 1 -
91
tcg: Add TCG_OPF_NOT_PRESENT to opcodes without inputs or outputs
76
tcg/tci/tcg-target.h | 1 -
92
tcg: Pass type and flags to tcg_target_op_def
77
tests/decode/err_field10.decode | 7 +
93
tcg: Add TCGType argument to tcg_out_op
78
tests/decode/err_field7.decode | 7 +
94
tcg: Remove TCG_OPF_64BIT
79
tests/decode/err_field8.decode | 8 +
95
tcg: Drop implementation checks from tcg-opc.h
80
tests/decode/err_field9.decode | 14 ++
96
tcg: Replace IMPLVEC with TCG_OPF_VECTOR
81
tests/decode/succ_named_field.decode | 19 ++
97
tcg/mips: Expand bswap unconditionally
82
tcg/tcg.c | 4 +-
98
tcg/i386: Handle all 8-bit extensions for i686
83
accel/tcg/ldst_atomicity.c.inc | 80 +------
99
tcg/i386: Fold the ext{8,16,32}[us] cases into {s}extract
84
tcg/aarch64/tcg-target.c.inc | 243 +++++++++++++++-----
100
tcg/aarch64: Provide TCG_TARGET_{s}extract_valid
85
tcg/i386/tcg-target.c.inc | 191 +++++++++++++++-
101
tcg/aarch64: Expand extract with offset 0 with andi
86
tcg/ppc/tcg-target.c.inc | 108 ++++++++-
102
tcg/arm: Add full [US]XT[BH] into {s}extract
87
tcg/s390x/tcg-target.c.inc | 107 ++++++++-
103
tcg/loongarch64: Fold the ext{8,16,32}[us] cases into {s}extract
88
scripts/decodetree.py | 265 ++++++++++++++++++++--
104
tcg/mips: Fold the ext{8,16,32}[us] cases into {s}extract
89
tests/decode/check.sh | 24 --
105
tcg/ppc: Fold the ext{8,16,32}[us] cases into {s}extract
90
tests/decode/meson.build | 64 ++++++
106
tcg/riscv64: Fold the ext{8,16,32}[us] cases into {s}extract
91
tests/meson.build | 5 +-
107
tcg/riscv: Use SRAIW, SRLIW for {s}extract_i64
92
38 files changed, 1312 insertions(+), 225 deletions(-)
108
tcg/s390x: Fold the ext{8,16,32}[us] cases into {s}extract
93
create mode 100644 host/include/aarch64/host/load-extract-al16-al8.h
109
tcg/sparc64: Use SRA, SRL for {s}extract_i64
94
create mode 100644 host/include/aarch64/host/store-insert-al16.h
110
tcg/tci: Provide TCG_TARGET_{s}extract_valid
95
create mode 100644 host/include/generic/host/load-extract-al16-al8.h
111
tcg/tci: Remove assertions for deposit and extract
96
create mode 100644 host/include/generic/host/store-insert-al16.h
112
tcg: Remove TCG_TARGET_HAS_{s}extract_{i32,i64}
97
create mode 100644 host/include/x86_64/host/atomic128-ldst.h
113
tcg: Remove TCG_TARGET_HAS_deposit_{i32,i64}
98
create mode 100644 host/include/x86_64/host/load-extract-al16-al8.h
114
util/cpuinfo-riscv: Detect Zbs
99
create mode 100644 tests/decode/err_field10.decode
115
tcg/riscv: Use BEXTI for single-bit extractions
100
create mode 100644 tests/decode/err_field7.decode
116
101
create mode 100644 tests/decode/err_field8.decode
117
accel/tcg/internal-target.h | 1 +
102
create mode 100644 tests/decode/err_field9.decode
118
host/include/riscv/host/cpuinfo.h | 5 +-
103
create mode 100644 tests/decode/succ_named_field.decode
119
include/fpu/softfloat-helpers.h | 25 +-
104
delete mode 100755 tests/decode/check.sh
120
include/tcg/tcg-opc.h | 355 +++++-------
105
create mode 100644 tests/decode/meson.build
121
include/tcg/tcg.h | 187 ++----
122
linux-user/sparc/target_proc.h | 20 +-
123
tcg/aarch64/tcg-target-has.h | 117 ++++
124
tcg/aarch64/tcg-target-mo.h | 12 +
125
tcg/aarch64/tcg-target.h | 126 ----
126
tcg/arm/tcg-target-has.h | 100 ++++
127
tcg/arm/tcg-target-mo.h | 13 +
128
tcg/arm/tcg-target.h | 86 ---
129
tcg/i386/tcg-target-has.h | 169 ++++++
130
tcg/i386/tcg-target-mo.h | 19 +
131
tcg/i386/tcg-target.h | 162 ------
132
tcg/loongarch64/tcg-target-has.h | 119 ++++
133
tcg/loongarch64/tcg-target-mo.h | 12 +
134
tcg/loongarch64/tcg-target.h | 115 ----
135
tcg/mips/tcg-target-has.h | 135 +++++
136
tcg/mips/tcg-target-mo.h | 13 +
137
tcg/mips/tcg-target.h | 130 -----
138
tcg/ppc/tcg-target-has.h | 131 +++++
139
tcg/ppc/tcg-target-mo.h | 12 +
140
tcg/ppc/tcg-target.h | 126 ----
141
tcg/riscv/tcg-target-has.h | 135 +++++
142
tcg/riscv/tcg-target-mo.h | 12 +
143
tcg/riscv/tcg-target.h | 116 ----
144
tcg/s390x/tcg-target-has.h | 137 +++++
145
tcg/s390x/tcg-target-mo.h | 12 +
146
tcg/s390x/tcg-target.h | 126 ----
147
tcg/sparc64/tcg-target-has.h | 87 +++
148
tcg/sparc64/tcg-target-mo.h | 12 +
149
tcg/sparc64/tcg-target.h | 91 ---
150
tcg/tcg-has.h | 101 ++++
151
tcg/tcg-internal.h | 18 +-
152
tcg/tci/tcg-target-has.h | 81 +++
153
tcg/tci/tcg-target-mo.h | 17 +
154
tcg/tci/tcg-target.h | 94 ---
155
accel/tcg/cpu-exec.c | 15 +-
156
accel/tcg/translate-all.c | 29 +-
157
disas/riscv.c | 23 +-
158
target/arm/tcg/translate-a64.c | 10 +-
159
target/arm/tcg/translate-sve.c | 22 +-
160
target/arm/tcg/translate.c | 2 +-
161
target/tricore/translate.c | 4 +-
162
tcg/optimize.c | 27 +-
163
tcg/tcg-common.c | 5 +-
164
tcg/tcg-op-gvec.c | 1 +
165
tcg/tcg-op-ldst.c | 29 +-
166
tcg/tcg-op-vec.c | 9 +-
167
tcg/tcg-op.c | 149 ++---
168
tcg/tcg.c | 643 ++++++++++++++-------
169
tcg/tci.c | 13 +-
170
util/cpuinfo-riscv.c | 18 +-
171
docs/devel/tcg-ops.rst | 15 +-
172
target/i386/tcg/emit.c.inc | 14 +-
173
.../{tcg-target.opc.h => tcg-target-opc.h.inc} | 4 +-
174
tcg/aarch64/tcg-target.c.inc | 33 +-
175
tcg/arm/{tcg-target.opc.h => tcg-target-opc.h.inc} | 6 +-
176
tcg/arm/tcg-target.c.inc | 71 ++-
177
.../{tcg-target.opc.h => tcg-target-opc.h.inc} | 22 +-
178
tcg/i386/tcg-target.c.inc | 121 +++-
179
.../{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
180
tcg/loongarch64/tcg-target.c.inc | 59 +-
181
tcg/mips/tcg-target-opc.h.inc | 1 +
182
tcg/mips/tcg-target.c.inc | 55 +-
183
tcg/ppc/{tcg-target.opc.h => tcg-target-opc.h.inc} | 12 +-
184
tcg/ppc/tcg-target.c.inc | 39 +-
185
.../{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
186
tcg/riscv/tcg-target.c.inc | 66 ++-
187
.../{tcg-target.opc.h => tcg-target-opc.h.inc} | 6 +-
188
tcg/s390x/tcg-target.c.inc | 59 +-
189
tcg/sparc64/tcg-target-opc.h.inc | 1 +
190
tcg/sparc64/tcg-target.c.inc | 29 +-
191
tcg/tcg-ldst.c.inc | 65 ---
192
tcg/tcg-pool.c.inc | 162 ------
193
tcg/tci/tcg-target-opc.h.inc | 4 +
194
tcg/tci/tcg-target.c.inc | 53 +-
195
78 files changed, 2856 insertions(+), 2269 deletions(-)
196
create mode 100644 tcg/aarch64/tcg-target-has.h
197
create mode 100644 tcg/aarch64/tcg-target-mo.h
198
create mode 100644 tcg/arm/tcg-target-has.h
199
create mode 100644 tcg/arm/tcg-target-mo.h
200
create mode 100644 tcg/i386/tcg-target-has.h
201
create mode 100644 tcg/i386/tcg-target-mo.h
202
create mode 100644 tcg/loongarch64/tcg-target-has.h
203
create mode 100644 tcg/loongarch64/tcg-target-mo.h
204
create mode 100644 tcg/mips/tcg-target-has.h
205
create mode 100644 tcg/mips/tcg-target-mo.h
206
create mode 100644 tcg/ppc/tcg-target-has.h
207
create mode 100644 tcg/ppc/tcg-target-mo.h
208
create mode 100644 tcg/riscv/tcg-target-has.h
209
create mode 100644 tcg/riscv/tcg-target-mo.h
210
create mode 100644 tcg/s390x/tcg-target-has.h
211
create mode 100644 tcg/s390x/tcg-target-mo.h
212
create mode 100644 tcg/sparc64/tcg-target-has.h
213
create mode 100644 tcg/sparc64/tcg-target-mo.h
214
create mode 100644 tcg/tcg-has.h
215
create mode 100644 tcg/tci/tcg-target-has.h
216
create mode 100644 tcg/tci/tcg-target-mo.h
217
rename tcg/aarch64/{tcg-target.opc.h => tcg-target-opc.h.inc} (82%)
218
rename tcg/arm/{tcg-target.opc.h => tcg-target-opc.h.inc} (75%)
219
rename tcg/i386/{tcg-target.opc.h => tcg-target-opc.h.inc} (72%)
220
rename tcg/loongarch64/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
221
create mode 100644 tcg/mips/tcg-target-opc.h.inc
222
rename tcg/ppc/{tcg-target.opc.h => tcg-target-opc.h.inc} (83%)
223
rename tcg/riscv/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
224
rename tcg/s390x/{tcg-target.opc.h => tcg-target-opc.h.inc} (75%)
225
create mode 100644 tcg/sparc64/tcg-target-opc.h.inc
226
delete mode 100644 tcg/tcg-ldst.c.inc
227
delete mode 100644 tcg/tcg-pool.c.inc
228
create mode 100644 tcg/tci/tcg-target-opc.h.inc
229
diff view generated by jsdifflib
New patch
1
From: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
1
2
3
For riscv host, it will set dec->cfg to zero. Thus we shuld guard
4
the dec->cfg deference for riscv host disassemble.
5
6
And in general, we should only use dec->cfg for target in three cases:
7
8
1) For not incompatible encodings, such as zcmp/zcmt/zfinx.
9
2) For maybe-ops encodings, they are better to be disassembled to
10
the "real" extensions, such as zicfiss. The guard of dec->zimop
11
and dec->zcmop is for comment and avoid check for every extension
12
that encoded in maybe-ops area.
13
3) For custom encodings, we have to use dec->cfg to disassemble
14
custom encodings using the same encoding area.
15
16
Signed-off-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
17
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
18
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
19
Message-ID: <20241206032411.52528-1-zhiwei_liu@linux.alibaba.com>
20
---
21
disas/riscv.c | 23 ++++++++++++-----------
22
1 file changed, 12 insertions(+), 11 deletions(-)
23
24
diff --git a/disas/riscv.c b/disas/riscv.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/disas/riscv.c
27
+++ b/disas/riscv.c
28
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
29
break;
30
case 2: op = rv_op_c_li; break;
31
case 3:
32
- if (dec->cfg->ext_zcmop) {
33
+ if (dec->cfg && dec->cfg->ext_zcmop) {
34
if ((((inst >> 2) & 0b111111) == 0b100000) &&
35
(((inst >> 11) & 0b11) == 0b0)) {
36
unsigned int cmop_code = 0;
37
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
38
op = rv_op_c_sqsp;
39
} else {
40
op = rv_op_c_fsdsp;
41
- if (dec->cfg->ext_zcmp && ((inst >> 12) & 0b01)) {
42
+ if (dec->cfg && dec->cfg->ext_zcmp && ((inst >> 12) & 0b01)) {
43
switch ((inst >> 8) & 0b01111) {
44
case 8:
45
if (((inst >> 4) & 0b01111) >= 4) {
46
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
47
} else {
48
switch ((inst >> 10) & 0b011) {
49
case 0:
50
- if (!dec->cfg->ext_zcmt) {
51
+ if (dec->cfg && !dec->cfg->ext_zcmt) {
52
break;
53
}
54
if (((inst >> 2) & 0xFF) >= 32) {
55
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
56
}
57
break;
58
case 3:
59
- if (!dec->cfg->ext_zcmp) {
60
+ if (dec->cfg && !dec->cfg->ext_zcmp) {
61
break;
62
}
63
switch ((inst >> 5) & 0b011) {
64
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
65
break;
66
case 5:
67
op = rv_op_auipc;
68
- if (dec->cfg->ext_zicfilp &&
69
+ if (dec->cfg && dec->cfg->ext_zicfilp &&
70
(((inst >> 7) & 0b11111) == 0b00000)) {
71
op = rv_op_lpad;
72
}
73
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
74
case 2: op = rv_op_csrrs; break;
75
case 3: op = rv_op_csrrc; break;
76
case 4:
77
- if (dec->cfg->ext_zimop) {
78
+ if (dec->cfg && dec->cfg->ext_zimop) {
79
int imm_mop5, imm_mop3, reg_num;
80
if ((extract32(inst, 22, 10) & 0b1011001111)
81
== 0b1000000111) {
82
@@ -XXX,XX +XXX,XX @@ static GString *format_inst(size_t tab, rv_decode *dec)
83
g_string_append(buf, rv_ireg_name_sym[dec->rs2]);
84
break;
85
case '3':
86
- if (dec->cfg->ext_zfinx) {
87
+ if (dec->cfg && dec->cfg->ext_zfinx) {
88
g_string_append(buf, rv_ireg_name_sym[dec->rd]);
89
} else {
90
g_string_append(buf, rv_freg_name_sym[dec->rd]);
91
}
92
break;
93
case '4':
94
- if (dec->cfg->ext_zfinx) {
95
+ if (dec->cfg && dec->cfg->ext_zfinx) {
96
g_string_append(buf, rv_ireg_name_sym[dec->rs1]);
97
} else {
98
g_string_append(buf, rv_freg_name_sym[dec->rs1]);
99
}
100
break;
101
case '5':
102
- if (dec->cfg->ext_zfinx) {
103
+ if (dec->cfg && dec->cfg->ext_zfinx) {
104
g_string_append(buf, rv_ireg_name_sym[dec->rs2]);
105
} else {
106
g_string_append(buf, rv_freg_name_sym[dec->rs2]);
107
}
108
break;
109
case '6':
110
- if (dec->cfg->ext_zfinx) {
111
+ if (dec->cfg && dec->cfg->ext_zfinx) {
112
g_string_append(buf, rv_ireg_name_sym[dec->rs3]);
113
} else {
114
g_string_append(buf, rv_freg_name_sym[dec->rs3]);
115
@@ -XXX,XX +XXX,XX @@ static GString *disasm_inst(rv_isa isa, uint64_t pc, rv_inst inst,
116
const rv_opcode_data *opcode_data = decoders[i].opcode_data;
117
void (*decode_func)(rv_decode *, rv_isa) = decoders[i].decode_func;
118
119
- if (guard_func(cfg)) {
120
+ /* always_true_p don't dereference cfg */
121
+ if (((i == 0) || cfg) && guard_func(cfg)) {
122
dec.opcode_data = opcode_data;
123
decode_func(&dec, isa);
124
if (dec.op != rv_op_illegal)
125
--
126
2.43.0
diff view generated by jsdifflib
1
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
1
These defines are not required outside of tcg/tcg.c,
2
which includes tcg-target.c.inc before use.
3
Reduces the exported symbol set of tcg-target.h.
4
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
7
---
4
tcg/i386/tcg-target.h | 4 +-
8
tcg/aarch64/tcg-target.h | 13 -------------
5
tcg/i386/tcg-target.c.inc | 191 +++++++++++++++++++++++++++++++++++++-
9
tcg/arm/tcg-target.h | 8 --------
6
2 files changed, 190 insertions(+), 5 deletions(-)
10
tcg/i386/tcg-target.h | 20 --------------------
11
tcg/loongarch64/tcg-target.h | 9 ---------
12
tcg/mips/tcg-target.h | 14 --------------
13
tcg/riscv/tcg-target.h | 9 ---------
14
tcg/s390x/tcg-target.h | 8 --------
15
tcg/sparc64/tcg-target.h | 11 -----------
16
tcg/tci/tcg-target.h | 14 --------------
17
tcg/aarch64/tcg-target.c.inc | 13 +++++++++++++
18
tcg/arm/tcg-target.c.inc | 8 ++++++++
19
tcg/i386/tcg-target.c.inc | 20 ++++++++++++++++++++
20
tcg/loongarch64/tcg-target.c.inc | 9 +++++++++
21
tcg/mips/tcg-target.c.inc | 14 ++++++++++++++
22
tcg/riscv/tcg-target.c.inc | 9 +++++++++
23
tcg/s390x/tcg-target.c.inc | 8 ++++++++
24
tcg/sparc64/tcg-target.c.inc | 10 ++++++++++
25
tcg/tci/tcg-target.c.inc | 14 ++++++++++++++
26
18 files changed, 105 insertions(+), 106 deletions(-)
7
27
28
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
29
index XXXXXXX..XXXXXXX 100644
30
--- a/tcg/aarch64/tcg-target.h
31
+++ b/tcg/aarch64/tcg-target.h
32
@@ -XXX,XX +XXX,XX @@ typedef enum {
33
34
#define TCG_TARGET_NB_REGS 64
35
36
-/* used for function call generation */
37
-#define TCG_REG_CALL_STACK TCG_REG_SP
38
-#define TCG_TARGET_STACK_ALIGN 16
39
-#define TCG_TARGET_CALL_STACK_OFFSET 0
40
-#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
41
-#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
42
-#ifdef CONFIG_DARWIN
43
-# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
44
-#else
45
-# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
46
-#endif
47
-#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
48
-
49
#define have_lse (cpuinfo & CPUINFO_LSE)
50
#define have_lse2 (cpuinfo & CPUINFO_LSE2)
51
52
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
53
index XXXXXXX..XXXXXXX 100644
54
--- a/tcg/arm/tcg-target.h
55
+++ b/tcg/arm/tcg-target.h
56
@@ -XXX,XX +XXX,XX @@ extern bool use_idiv_instructions;
57
extern bool use_neon_instructions;
58
#endif
59
60
-/* used for function call generation */
61
-#define TCG_TARGET_STACK_ALIGN        8
62
-#define TCG_TARGET_CALL_STACK_OFFSET    0
63
-#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
64
-#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
65
-#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
66
-#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
67
-
68
/* optional instructions */
69
#define TCG_TARGET_HAS_ext8s_i32 1
70
#define TCG_TARGET_HAS_ext16s_i32 1
8
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
71
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
9
index XXXXXXX..XXXXXXX 100644
72
index XXXXXXX..XXXXXXX 100644
10
--- a/tcg/i386/tcg-target.h
73
--- a/tcg/i386/tcg-target.h
11
+++ b/tcg/i386/tcg-target.h
74
+++ b/tcg/i386/tcg-target.h
12
@@ -XXX,XX +XXX,XX @@ typedef enum {
75
@@ -XXX,XX +XXX,XX @@ typedef enum {
76
TCG_REG_CALL_STACK = TCG_REG_ESP
77
} TCGReg;
78
79
-/* used for function call generation */
80
-#define TCG_TARGET_STACK_ALIGN 16
81
-#if defined(_WIN64)
82
-#define TCG_TARGET_CALL_STACK_OFFSET 32
83
-#else
84
-#define TCG_TARGET_CALL_STACK_OFFSET 0
85
-#endif
86
-#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
87
-#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
88
-#if defined(_WIN64)
89
-# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_BY_REF
90
-# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_VEC
91
-#elif TCG_TARGET_REG_BITS == 64
92
-# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
93
-# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
94
-#else
95
-# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
96
-# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
97
-#endif
98
-
99
#define have_bmi1 (cpuinfo & CPUINFO_BMI1)
100
#define have_popcnt (cpuinfo & CPUINFO_POPCNT)
13
#define have_avx1 (cpuinfo & CPUINFO_AVX1)
101
#define have_avx1 (cpuinfo & CPUINFO_AVX1)
14
#define have_avx2 (cpuinfo & CPUINFO_AVX2)
102
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
15
#define have_movbe (cpuinfo & CPUINFO_MOVBE)
103
index XXXXXXX..XXXXXXX 100644
16
-#define have_atomic16 (cpuinfo & CPUINFO_ATOMIC_VMOVDQA)
104
--- a/tcg/loongarch64/tcg-target.h
17
105
+++ b/tcg/loongarch64/tcg-target.h
18
/*
106
@@ -XXX,XX +XXX,XX @@ typedef enum {
19
* There are interesting instructions in AVX512, so long as we have AVX512VL,
107
TCG_VEC_TMP0 = TCG_REG_V23,
20
@@ -XXX,XX +XXX,XX @@ typedef enum {
108
} TCGReg;
21
#define TCG_TARGET_HAS_qemu_st8_i32 1
109
110
-/* used for function call generation */
111
-#define TCG_REG_CALL_STACK TCG_REG_SP
112
-#define TCG_TARGET_STACK_ALIGN 16
113
-#define TCG_TARGET_CALL_STACK_OFFSET 0
114
-#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
115
-#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
116
-#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
117
-#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
118
-
119
/* optional instructions */
120
#define TCG_TARGET_HAS_negsetcond_i32 0
121
#define TCG_TARGET_HAS_div_i32 1
122
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
123
index XXXXXXX..XXXXXXX 100644
124
--- a/tcg/mips/tcg-target.h
125
+++ b/tcg/mips/tcg-target.h
126
@@ -XXX,XX +XXX,XX @@ typedef enum {
127
TCG_AREG0 = TCG_REG_S8,
128
} TCGReg;
129
130
-/* used for function call generation */
131
-#define TCG_TARGET_STACK_ALIGN 16
132
-#if _MIPS_SIM == _ABIO32
133
-# define TCG_TARGET_CALL_STACK_OFFSET 16
134
-# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
135
-# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
136
-#else
137
-# define TCG_TARGET_CALL_STACK_OFFSET 0
138
-# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
139
-# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
140
-#endif
141
-#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
142
-#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
143
-
144
/* MOVN/MOVZ instructions detection */
145
#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
146
defined(_MIPS_ARCH_LOONGSON2E) || defined(_MIPS_ARCH_LOONGSON2F) || \
147
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
148
index XXXXXXX..XXXXXXX 100644
149
--- a/tcg/riscv/tcg-target.h
150
+++ b/tcg/riscv/tcg-target.h
151
@@ -XXX,XX +XXX,XX @@ typedef enum {
152
TCG_REG_TMP2 = TCG_REG_T4,
153
} TCGReg;
154
155
-/* used for function call generation */
156
-#define TCG_REG_CALL_STACK TCG_REG_SP
157
-#define TCG_TARGET_STACK_ALIGN 16
158
-#define TCG_TARGET_CALL_STACK_OFFSET 0
159
-#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
160
-#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
161
-#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
162
-#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
163
-
164
/* optional instructions */
165
#define TCG_TARGET_HAS_negsetcond_i32 1
166
#define TCG_TARGET_HAS_div_i32 1
167
diff --git a/tcg/s390x/tcg-target.h b/tcg/s390x/tcg-target.h
168
index XXXXXXX..XXXXXXX 100644
169
--- a/tcg/s390x/tcg-target.h
170
+++ b/tcg/s390x/tcg-target.h
171
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
172
#define TCG_TARGET_HAS_cmpsel_vec 1
173
#define TCG_TARGET_HAS_tst_vec 0
174
175
-/* used for function call generation */
176
-#define TCG_TARGET_STACK_ALIGN        8
177
-#define TCG_TARGET_CALL_STACK_OFFSET    160
178
-#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
179
-#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
180
-#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_BY_REF
181
-#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
182
-
183
#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
184
#define TCG_TARGET_NEED_LDST_LABELS
185
#define TCG_TARGET_NEED_POOL_LABELS
186
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
187
index XXXXXXX..XXXXXXX 100644
188
--- a/tcg/sparc64/tcg-target.h
189
+++ b/tcg/sparc64/tcg-target.h
190
@@ -XXX,XX +XXX,XX @@ typedef enum {
191
TCG_REG_I7,
192
} TCGReg;
193
194
-/* used for function call generation */
195
-#define TCG_REG_CALL_STACK TCG_REG_O6
196
-
197
-#define TCG_TARGET_STACK_BIAS 2047
198
-#define TCG_TARGET_STACK_ALIGN 16
199
-#define TCG_TARGET_CALL_STACK_OFFSET (128 + 6*8 + TCG_TARGET_STACK_BIAS)
200
-#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
201
-#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
202
-#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
203
-#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
204
-
205
#if defined(__VIS__) && __VIS__ >= 0x300
206
#define use_vis3_instructions 1
207
#else
208
diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h
209
index XXXXXXX..XXXXXXX 100644
210
--- a/tcg/tci/tcg-target.h
211
+++ b/tcg/tci/tcg-target.h
212
@@ -XXX,XX +XXX,XX @@ typedef enum {
213
TCG_REG_CALL_STACK = TCG_REG_R15,
214
} TCGReg;
215
216
-/* Used for function call generation. */
217
-#define TCG_TARGET_CALL_STACK_OFFSET 0
218
-#define TCG_TARGET_STACK_ALIGN 8
219
-#if TCG_TARGET_REG_BITS == 32
220
-# define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EVEN
221
-# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
222
-# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
223
-#else
224
-# define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
225
-# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
226
-# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
227
-#endif
228
-#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
229
-
230
#define HAVE_TCG_QEMU_TB_EXEC
231
#define TCG_TARGET_NEED_POOL_LABELS
232
233
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
234
index XXXXXXX..XXXXXXX 100644
235
--- a/tcg/aarch64/tcg-target.c.inc
236
+++ b/tcg/aarch64/tcg-target.c.inc
237
@@ -XXX,XX +XXX,XX @@
238
#include "../tcg-pool.c.inc"
239
#include "qemu/bitops.h"
240
241
+/* Used for function call generation. */
242
+#define TCG_REG_CALL_STACK TCG_REG_SP
243
+#define TCG_TARGET_STACK_ALIGN 16
244
+#define TCG_TARGET_CALL_STACK_OFFSET 0
245
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
246
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
247
+#ifdef CONFIG_DARWIN
248
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
249
+#else
250
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
251
+#endif
252
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
253
+
254
/* We're going to re-use TCGType in setting of the SF bit, which controls
255
the size of the operation performed. If we know the values match, it
256
makes things much cleaner. */
257
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
258
index XXXXXXX..XXXXXXX 100644
259
--- a/tcg/arm/tcg-target.c.inc
260
+++ b/tcg/arm/tcg-target.c.inc
261
@@ -XXX,XX +XXX,XX @@ bool use_idiv_instructions;
262
bool use_neon_instructions;
22
#endif
263
#endif
23
264
24
-#define TCG_TARGET_HAS_qemu_ldst_i128 0
265
+/* Used for function call generation. */
25
+#define TCG_TARGET_HAS_qemu_ldst_i128 \
266
+#define TCG_TARGET_STACK_ALIGN 8
26
+ (TCG_TARGET_REG_BITS == 64 && (cpuinfo & CPUINFO_ATOMIC_VMOVDQA))
267
+#define TCG_TARGET_CALL_STACK_OFFSET 0
27
268
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
28
/* We do not support older SSE systems, only beginning with AVX1. */
269
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
29
#define TCG_TARGET_HAS_v64 have_avx1
270
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
271
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
272
+
273
#ifdef CONFIG_DEBUG_TCG
274
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
275
"%r0", "%r1", "%r2", "%r3", "%r4", "%r5", "%r6", "%r7",
30
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
276
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
31
index XXXXXXX..XXXXXXX 100644
277
index XXXXXXX..XXXXXXX 100644
32
--- a/tcg/i386/tcg-target.c.inc
278
--- a/tcg/i386/tcg-target.c.inc
33
+++ b/tcg/i386/tcg-target.c.inc
279
+++ b/tcg/i386/tcg-target.c.inc
34
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_reg_alloc_order[] = {
280
@@ -XXX,XX +XXX,XX @@
35
#endif
281
#include "../tcg-ldst.c.inc"
36
};
282
#include "../tcg-pool.c.inc"
37
283
38
+#define TCG_TMP_VEC TCG_REG_XMM5
284
+/* Used for function call generation. */
39
+
285
+#define TCG_TARGET_STACK_ALIGN 16
40
static const int tcg_target_call_iarg_regs[] = {
286
+#if defined(_WIN64)
287
+#define TCG_TARGET_CALL_STACK_OFFSET 32
288
+#else
289
+#define TCG_TARGET_CALL_STACK_OFFSET 0
290
+#endif
291
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
292
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
293
+#if defined(_WIN64)
294
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_BY_REF
295
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_VEC
296
+#elif TCG_TARGET_REG_BITS == 64
297
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
298
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
299
+#else
300
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
301
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
302
+#endif
303
+
304
#ifdef CONFIG_DEBUG_TCG
305
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
41
#if TCG_TARGET_REG_BITS == 64
306
#if TCG_TARGET_REG_BITS == 64
42
#if defined(_WIN64)
307
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
43
@@ -XXX,XX +XXX,XX @@ static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
308
index XXXXXXX..XXXXXXX 100644
44
#define OPC_PCMPGTW (0x65 | P_EXT | P_DATA16)
309
--- a/tcg/loongarch64/tcg-target.c.inc
45
#define OPC_PCMPGTD (0x66 | P_EXT | P_DATA16)
310
+++ b/tcg/loongarch64/tcg-target.c.inc
46
#define OPC_PCMPGTQ (0x37 | P_EXT38 | P_DATA16)
311
@@ -XXX,XX +XXX,XX @@
47
+#define OPC_PEXTRD (0x16 | P_EXT3A | P_DATA16)
312
#include "../tcg-ldst.c.inc"
48
+#define OPC_PINSRD (0x22 | P_EXT3A | P_DATA16)
313
#include <asm/hwcap.h>
49
#define OPC_PMAXSB (0x3c | P_EXT38 | P_DATA16)
314
50
#define OPC_PMAXSW (0xee | P_EXT | P_DATA16)
315
+/* used for function call generation */
51
#define OPC_PMAXSD (0x3d | P_EXT38 | P_DATA16)
316
+#define TCG_REG_CALL_STACK TCG_REG_SP
52
@@ -XXX,XX +XXX,XX @@ typedef struct {
317
+#define TCG_TARGET_STACK_ALIGN 16
53
318
+#define TCG_TARGET_CALL_STACK_OFFSET 0
54
bool tcg_target_has_memory_bswap(MemOp memop)
319
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
320
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
321
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
322
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
323
+
324
#ifdef CONFIG_DEBUG_TCG
325
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
326
"zero",
327
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
328
index XXXXXXX..XXXXXXX 100644
329
--- a/tcg/mips/tcg-target.c.inc
330
+++ b/tcg/mips/tcg-target.c.inc
331
@@ -XXX,XX +XXX,XX @@
332
#include "../tcg-ldst.c.inc"
333
#include "../tcg-pool.c.inc"
334
335
+/* used for function call generation */
336
+#define TCG_TARGET_STACK_ALIGN 16
337
+#if _MIPS_SIM == _ABIO32
338
+# define TCG_TARGET_CALL_STACK_OFFSET 16
339
+# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
340
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
341
+#else
342
+# define TCG_TARGET_CALL_STACK_OFFSET 0
343
+# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
344
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
345
+#endif
346
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
347
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
348
+
349
#if TCG_TARGET_REG_BITS == 32
350
# define LO_OFF (HOST_BIG_ENDIAN * 4)
351
# define HI_OFF (4 - LO_OFF)
352
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
353
index XXXXXXX..XXXXXXX 100644
354
--- a/tcg/riscv/tcg-target.c.inc
355
+++ b/tcg/riscv/tcg-target.c.inc
356
@@ -XXX,XX +XXX,XX @@
357
#include "../tcg-ldst.c.inc"
358
#include "../tcg-pool.c.inc"
359
360
+/* Used for function call generation. */
361
+#define TCG_REG_CALL_STACK TCG_REG_SP
362
+#define TCG_TARGET_STACK_ALIGN 16
363
+#define TCG_TARGET_CALL_STACK_OFFSET 0
364
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
365
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
366
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
367
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
368
+
369
#ifdef CONFIG_DEBUG_TCG
370
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
371
"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2",
372
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
373
index XXXXXXX..XXXXXXX 100644
374
--- a/tcg/s390x/tcg-target.c.inc
375
+++ b/tcg/s390x/tcg-target.c.inc
376
@@ -XXX,XX +XXX,XX @@
377
#include "../tcg-pool.c.inc"
378
#include "elf.h"
379
380
+/* Used for function call generation. */
381
+#define TCG_TARGET_STACK_ALIGN 8
382
+#define TCG_TARGET_CALL_STACK_OFFSET 160
383
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
384
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
385
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_BY_REF
386
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
387
+
388
#define TCG_CT_CONST_S16 (1 << 8)
389
#define TCG_CT_CONST_S32 (1 << 9)
390
#define TCG_CT_CONST_U32 (1 << 10)
391
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
392
index XXXXXXX..XXXXXXX 100644
393
--- a/tcg/sparc64/tcg-target.c.inc
394
+++ b/tcg/sparc64/tcg-target.c.inc
395
@@ -XXX,XX +XXX,XX @@
396
#include "../tcg-ldst.c.inc"
397
#include "../tcg-pool.c.inc"
398
399
+/* Used for function call generation. */
400
+#define TCG_REG_CALL_STACK TCG_REG_O6
401
+#define TCG_TARGET_STACK_BIAS 2047
402
+#define TCG_TARGET_STACK_ALIGN 16
403
+#define TCG_TARGET_CALL_STACK_OFFSET (128 + 6 * 8 + TCG_TARGET_STACK_BIAS)
404
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
405
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
406
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
407
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
408
+
409
#ifdef CONFIG_DEBUG_TCG
410
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
411
"%g0",
412
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
413
index XXXXXXX..XXXXXXX 100644
414
--- a/tcg/tci/tcg-target.c.inc
415
+++ b/tcg/tci/tcg-target.c.inc
416
@@ -XXX,XX +XXX,XX @@
417
418
#include "../tcg-pool.c.inc"
419
420
+/* Used for function call generation. */
421
+#define TCG_TARGET_CALL_STACK_OFFSET 0
422
+#define TCG_TARGET_STACK_ALIGN 8
423
+#if TCG_TARGET_REG_BITS == 32
424
+# define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EVEN
425
+# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
426
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
427
+#else
428
+# define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
429
+# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
430
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
431
+#endif
432
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
433
+
434
static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
55
{
435
{
56
- return have_movbe;
436
switch (op) {
57
+ TCGAtomAlign aa;
58
+
59
+ if (!have_movbe) {
60
+ return false;
61
+ }
62
+ if ((memop & MO_SIZE) < MO_128) {
63
+ return true;
64
+ }
65
+
66
+ /*
67
+ * Reject 16-byte memop with 16-byte atomicity, i.e. VMOVDQA,
68
+ * but do allow a pair of 64-bit operations, i.e. MOVBEQ.
69
+ */
70
+ aa = atom_and_align_for_opc(tcg_ctx, memop, MO_ATOM_IFALIGN, true);
71
+ return aa.atom < MO_128;
72
}
73
74
/*
75
@@ -XXX,XX +XXX,XX @@ static const TCGLdstHelperParam ldst_helper_param = {
76
static const TCGLdstHelperParam ldst_helper_param = { };
77
#endif
78
79
+static void tcg_out_vec_to_pair(TCGContext *s, TCGType type,
80
+ TCGReg l, TCGReg h, TCGReg v)
81
+{
82
+ int rexw = type == TCG_TYPE_I32 ? 0 : P_REXW;
83
+
84
+ /* vpmov{d,q} %v, %l */
85
+ tcg_out_vex_modrm(s, OPC_MOVD_EyVy + rexw, v, 0, l);
86
+ /* vpextr{d,q} $1, %v, %h */
87
+ tcg_out_vex_modrm(s, OPC_PEXTRD + rexw, v, 0, h);
88
+ tcg_out8(s, 1);
89
+}
90
+
91
+static void tcg_out_pair_to_vec(TCGContext *s, TCGType type,
92
+ TCGReg v, TCGReg l, TCGReg h)
93
+{
94
+ int rexw = type == TCG_TYPE_I32 ? 0 : P_REXW;
95
+
96
+ /* vmov{d,q} %l, %v */
97
+ tcg_out_vex_modrm(s, OPC_MOVD_VyEy + rexw, v, 0, l);
98
+ /* vpinsr{d,q} $1, %h, %v, %v */
99
+ tcg_out_vex_modrm(s, OPC_PINSRD + rexw, v, v, h);
100
+ tcg_out8(s, 1);
101
+}
102
+
103
/*
104
* Generate code for the slow path for a load at the end of block
105
*/
106
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
107
{
108
TCGLabelQemuLdst *ldst = NULL;
109
MemOp opc = get_memop(oi);
110
+ MemOp s_bits = opc & MO_SIZE;
111
unsigned a_mask;
112
113
#ifdef CONFIG_SOFTMMU
114
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
115
*h = x86_guest_base;
116
#endif
117
h->base = addrlo;
118
- h->aa = atom_and_align_for_opc(s, opc, MO_ATOM_IFALIGN, false);
119
+ h->aa = atom_and_align_for_opc(s, opc, MO_ATOM_IFALIGN, s_bits == MO_128);
120
a_mask = (1 << h->aa.align) - 1;
121
122
#ifdef CONFIG_SOFTMMU
123
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
124
TCGType tlbtype = TCG_TYPE_I32;
125
int trexw = 0, hrexw = 0, tlbrexw = 0;
126
unsigned mem_index = get_mmuidx(oi);
127
- unsigned s_bits = opc & MO_SIZE;
128
unsigned s_mask = (1 << s_bits) - 1;
129
int tlb_mask;
130
131
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg datahi,
132
h.base, h.index, 0, h.ofs + 4);
133
}
134
break;
135
+
136
+ case MO_128:
137
+ tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
138
+
139
+ /*
140
+ * Without 16-byte atomicity, use integer regs.
141
+ * That is where we want the data, and it allows bswaps.
142
+ */
143
+ if (h.aa.atom < MO_128) {
144
+ if (use_movbe) {
145
+ TCGReg t = datalo;
146
+ datalo = datahi;
147
+ datahi = t;
148
+ }
149
+ if (h.base == datalo || h.index == datalo) {
150
+ tcg_out_modrm_sib_offset(s, OPC_LEA + P_REXW, datahi,
151
+ h.base, h.index, 0, h.ofs);
152
+ tcg_out_modrm_offset(s, movop + P_REXW + h.seg,
153
+ datalo, datahi, 0);
154
+ tcg_out_modrm_offset(s, movop + P_REXW + h.seg,
155
+ datahi, datahi, 8);
156
+ } else {
157
+ tcg_out_modrm_sib_offset(s, movop + P_REXW + h.seg, datalo,
158
+ h.base, h.index, 0, h.ofs);
159
+ tcg_out_modrm_sib_offset(s, movop + P_REXW + h.seg, datahi,
160
+ h.base, h.index, 0, h.ofs + 8);
161
+ }
162
+ break;
163
+ }
164
+
165
+ /*
166
+ * With 16-byte atomicity, a vector load is required.
167
+ * If we already have 16-byte alignment, then VMOVDQA always works.
168
+ * Else if VMOVDQU has atomicity with dynamic alignment, use that.
169
+ * Else use we require a runtime test for alignment for VMOVDQA;
170
+ * use VMOVDQU on the unaligned nonatomic path for simplicity.
171
+ */
172
+ if (h.aa.align >= MO_128) {
173
+ tcg_out_vex_modrm_sib_offset(s, OPC_MOVDQA_VxWx + h.seg,
174
+ TCG_TMP_VEC, 0,
175
+ h.base, h.index, 0, h.ofs);
176
+ } else if (cpuinfo & CPUINFO_ATOMIC_VMOVDQU) {
177
+ tcg_out_vex_modrm_sib_offset(s, OPC_MOVDQU_VxWx + h.seg,
178
+ TCG_TMP_VEC, 0,
179
+ h.base, h.index, 0, h.ofs);
180
+ } else {
181
+ TCGLabel *l1 = gen_new_label();
182
+ TCGLabel *l2 = gen_new_label();
183
+
184
+ tcg_out_testi(s, h.base, 15);
185
+ tcg_out_jxx(s, JCC_JNE, l1, true);
186
+
187
+ tcg_out_vex_modrm_sib_offset(s, OPC_MOVDQA_VxWx + h.seg,
188
+ TCG_TMP_VEC, 0,
189
+ h.base, h.index, 0, h.ofs);
190
+ tcg_out_jxx(s, JCC_JMP, l2, true);
191
+
192
+ tcg_out_label(s, l1);
193
+ tcg_out_vex_modrm_sib_offset(s, OPC_MOVDQU_VxWx + h.seg,
194
+ TCG_TMP_VEC, 0,
195
+ h.base, h.index, 0, h.ofs);
196
+ tcg_out_label(s, l2);
197
+ }
198
+ tcg_out_vec_to_pair(s, TCG_TYPE_I64, datalo, datahi, TCG_TMP_VEC);
199
+ break;
200
+
201
default:
202
g_assert_not_reached();
203
}
204
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_st_direct(TCGContext *s, TCGReg datalo, TCGReg datahi,
205
h.base, h.index, 0, h.ofs + 4);
206
}
207
break;
208
+
209
+ case MO_128:
210
+ tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
211
+
212
+ /*
213
+ * Without 16-byte atomicity, use integer regs.
214
+ * That is where we have the data, and it allows bswaps.
215
+ */
216
+ if (h.aa.atom < MO_128) {
217
+ if (use_movbe) {
218
+ TCGReg t = datalo;
219
+ datalo = datahi;
220
+ datahi = t;
221
+ }
222
+ tcg_out_modrm_sib_offset(s, movop + P_REXW + h.seg, datalo,
223
+ h.base, h.index, 0, h.ofs);
224
+ tcg_out_modrm_sib_offset(s, movop + P_REXW + h.seg, datahi,
225
+ h.base, h.index, 0, h.ofs + 8);
226
+ break;
227
+ }
228
+
229
+ /*
230
+ * With 16-byte atomicity, a vector store is required.
231
+ * If we already have 16-byte alignment, then VMOVDQA always works.
232
+ * Else if VMOVDQU has atomicity with dynamic alignment, use that.
233
+ * Else use we require a runtime test for alignment for VMOVDQA;
234
+ * use VMOVDQU on the unaligned nonatomic path for simplicity.
235
+ */
236
+ tcg_out_pair_to_vec(s, TCG_TYPE_I64, TCG_TMP_VEC, datalo, datahi);
237
+ if (h.aa.align >= MO_128) {
238
+ tcg_out_vex_modrm_sib_offset(s, OPC_MOVDQA_WxVx + h.seg,
239
+ TCG_TMP_VEC, 0,
240
+ h.base, h.index, 0, h.ofs);
241
+ } else if (cpuinfo & CPUINFO_ATOMIC_VMOVDQU) {
242
+ tcg_out_vex_modrm_sib_offset(s, OPC_MOVDQU_WxVx + h.seg,
243
+ TCG_TMP_VEC, 0,
244
+ h.base, h.index, 0, h.ofs);
245
+ } else {
246
+ TCGLabel *l1 = gen_new_label();
247
+ TCGLabel *l2 = gen_new_label();
248
+
249
+ tcg_out_testi(s, h.base, 15);
250
+ tcg_out_jxx(s, JCC_JNE, l1, true);
251
+
252
+ tcg_out_vex_modrm_sib_offset(s, OPC_MOVDQA_WxVx + h.seg,
253
+ TCG_TMP_VEC, 0,
254
+ h.base, h.index, 0, h.ofs);
255
+ tcg_out_jxx(s, JCC_JMP, l2, true);
256
+
257
+ tcg_out_label(s, l1);
258
+ tcg_out_vex_modrm_sib_offset(s, OPC_MOVDQU_WxVx + h.seg,
259
+ TCG_TMP_VEC, 0,
260
+ h.base, h.index, 0, h.ofs);
261
+ tcg_out_label(s, l2);
262
+ }
263
+ break;
264
+
265
default:
266
g_assert_not_reached();
267
}
268
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
269
tcg_out_qemu_ld(s, a0, a1, a2, args[3], args[4], TCG_TYPE_I64);
270
}
271
break;
272
+ case INDEX_op_qemu_ld_a32_i128:
273
+ case INDEX_op_qemu_ld_a64_i128:
274
+ tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
275
+ tcg_out_qemu_ld(s, a0, a1, a2, -1, args[3], TCG_TYPE_I128);
276
+ break;
277
278
case INDEX_op_qemu_st_a64_i32:
279
case INDEX_op_qemu_st8_a64_i32:
280
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
281
tcg_out_qemu_st(s, a0, a1, a2, args[3], args[4], TCG_TYPE_I64);
282
}
283
break;
284
+ case INDEX_op_qemu_st_a32_i128:
285
+ case INDEX_op_qemu_st_a64_i128:
286
+ tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
287
+ tcg_out_qemu_st(s, a0, a1, a2, -1, args[3], TCG_TYPE_I128);
288
+ break;
289
290
OP_32_64(mulu2):
291
tcg_out_modrm(s, OPC_GRP3_Ev + rexw, EXT3_MUL, args[3]);
292
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
293
case INDEX_op_qemu_st_a64_i64:
294
return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(L, L) : C_O0_I4(L, L, L, L);
295
296
+ case INDEX_op_qemu_ld_a32_i128:
297
+ case INDEX_op_qemu_ld_a64_i128:
298
+ tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
299
+ return C_O2_I1(r, r, L);
300
+ case INDEX_op_qemu_st_a32_i128:
301
+ case INDEX_op_qemu_st_a64_i128:
302
+ tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
303
+ return C_O0_I3(L, L, L);
304
+
305
case INDEX_op_brcond2_i32:
306
return C_O0_I4(r, r, ri, ri);
307
308
@@ -XXX,XX +XXX,XX @@ static void tcg_target_init(TCGContext *s)
309
310
s->reserved_regs = 0;
311
tcg_regset_set_reg(s->reserved_regs, TCG_REG_CALL_STACK);
312
+ tcg_regset_set_reg(s->reserved_regs, TCG_TMP_VEC);
313
#ifdef _WIN64
314
/* These are call saved, and we don't save them, so don't use them. */
315
tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM6);
316
--
437
--
317
2.34.1
438
2.43.0
439
440
diff view generated by jsdifflib
New patch
1
In the replacement, drop the TCGType - TCG_TYPE_V64 adjustment,
2
except for the call to tcg_out_vec_op. Pass type to tcg_gen_op[1-6],
3
so that all integer opcodes gain the type.
1
4
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
8
include/tcg/tcg.h | 2 +-
9
tcg/tcg-internal.h | 13 ++---
10
tcg/optimize.c | 10 +---
11
tcg/tcg-op-ldst.c | 26 ++++++----
12
tcg/tcg-op-vec.c | 8 +--
13
tcg/tcg-op.c | 113 +++++++++++++++++++++++------------------
14
tcg/tcg.c | 11 ++--
15
docs/devel/tcg-ops.rst | 15 +++---
16
8 files changed, 105 insertions(+), 93 deletions(-)
17
18
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/include/tcg/tcg.h
21
+++ b/include/tcg/tcg.h
22
@@ -XXX,XX +XXX,XX @@ struct TCGOp {
23
#define TCGOP_CALLI(X) (X)->param1
24
#define TCGOP_CALLO(X) (X)->param2
25
26
-#define TCGOP_VECL(X) (X)->param1
27
+#define TCGOP_TYPE(X) (X)->param1
28
#define TCGOP_VECE(X) (X)->param2
29
30
/* Make sure operands fit in the bitfields above. */
31
diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h
32
index XXXXXXX..XXXXXXX 100644
33
--- a/tcg/tcg-internal.h
34
+++ b/tcg/tcg-internal.h
35
@@ -XXX,XX +XXX,XX @@ TCGTemp *tcg_temp_new_internal(TCGType type, TCGTempKind kind);
36
*/
37
TCGTemp *tcg_constant_internal(TCGType type, int64_t val);
38
39
-TCGOp *tcg_gen_op1(TCGOpcode, TCGArg);
40
-TCGOp *tcg_gen_op2(TCGOpcode, TCGArg, TCGArg);
41
-TCGOp *tcg_gen_op3(TCGOpcode, TCGArg, TCGArg, TCGArg);
42
-TCGOp *tcg_gen_op4(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg);
43
-TCGOp *tcg_gen_op5(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg);
44
-TCGOp *tcg_gen_op6(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg);
45
+TCGOp *tcg_gen_op1(TCGOpcode, TCGType, TCGArg);
46
+TCGOp *tcg_gen_op2(TCGOpcode, TCGType, TCGArg, TCGArg);
47
+TCGOp *tcg_gen_op3(TCGOpcode, TCGType, TCGArg, TCGArg, TCGArg);
48
+TCGOp *tcg_gen_op4(TCGOpcode, TCGType, TCGArg, TCGArg, TCGArg, TCGArg);
49
+TCGOp *tcg_gen_op5(TCGOpcode, TCGType, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg);
50
+TCGOp *tcg_gen_op6(TCGOpcode, TCGType, TCGArg, TCGArg,
51
+ TCGArg, TCGArg, TCGArg, TCGArg);
52
53
void vec_gen_2(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg);
54
void vec_gen_3(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg, TCGArg);
55
diff --git a/tcg/optimize.c b/tcg/optimize.c
56
index XXXXXXX..XXXXXXX 100644
57
--- a/tcg/optimize.c
58
+++ b/tcg/optimize.c
59
@@ -XXX,XX +XXX,XX @@ static bool tcg_opt_gen_mov(OptContext *ctx, TCGOp *op, TCGArg dst, TCGArg src)
60
case TCG_TYPE_V64:
61
case TCG_TYPE_V128:
62
case TCG_TYPE_V256:
63
- /* TCGOP_VECL and TCGOP_VECE remain unchanged. */
64
+ /* TCGOP_TYPE and TCGOP_VECE remain unchanged. */
65
new_op = INDEX_op_mov_vec;
66
break;
67
default:
68
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
69
copy_propagate(&ctx, op, def->nb_oargs, def->nb_iargs);
70
71
/* Pre-compute the type of the operation. */
72
- if (def->flags & TCG_OPF_VECTOR) {
73
- ctx.type = TCG_TYPE_V64 + TCGOP_VECL(op);
74
- } else if (def->flags & TCG_OPF_64BIT) {
75
- ctx.type = TCG_TYPE_I64;
76
- } else {
77
- ctx.type = TCG_TYPE_I32;
78
- }
79
+ ctx.type = TCGOP_TYPE(op);
80
81
/*
82
* Process each opcode.
83
diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c
84
index XXXXXXX..XXXXXXX 100644
85
--- a/tcg/tcg-op-ldst.c
86
+++ b/tcg/tcg-op-ldst.c
87
@@ -XXX,XX +XXX,XX @@ static MemOp tcg_canonicalize_memop(MemOp op, bool is64, bool st)
88
return op;
89
}
90
91
-static void gen_ldst(TCGOpcode opc, TCGTemp *vl, TCGTemp *vh,
92
+static void gen_ldst(TCGOpcode opc, TCGType type, TCGTemp *vl, TCGTemp *vh,
93
TCGTemp *addr, MemOpIdx oi)
94
{
95
if (TCG_TARGET_REG_BITS == 64 || tcg_ctx->addr_type == TCG_TYPE_I32) {
96
if (vh) {
97
- tcg_gen_op4(opc, temp_arg(vl), temp_arg(vh), temp_arg(addr), oi);
98
+ tcg_gen_op4(opc, type, temp_arg(vl), temp_arg(vh),
99
+ temp_arg(addr), oi);
100
} else {
101
- tcg_gen_op3(opc, temp_arg(vl), temp_arg(addr), oi);
102
+ tcg_gen_op3(opc, type, temp_arg(vl), temp_arg(addr), oi);
103
}
104
} else {
105
/* See TCGV_LOW/HIGH. */
106
@@ -XXX,XX +XXX,XX @@ static void gen_ldst(TCGOpcode opc, TCGTemp *vl, TCGTemp *vh,
107
TCGTemp *ah = addr + !HOST_BIG_ENDIAN;
108
109
if (vh) {
110
- tcg_gen_op5(opc, temp_arg(vl), temp_arg(vh),
111
+ tcg_gen_op5(opc, type, temp_arg(vl), temp_arg(vh),
112
temp_arg(al), temp_arg(ah), oi);
113
} else {
114
- tcg_gen_op4(opc, temp_arg(vl), temp_arg(al), temp_arg(ah), oi);
115
+ tcg_gen_op4(opc, type, temp_arg(vl),
116
+ temp_arg(al), temp_arg(ah), oi);
117
}
118
}
119
}
120
@@ -XXX,XX +XXX,XX @@ static void gen_ldst_i64(TCGOpcode opc, TCGv_i64 v, TCGTemp *addr, MemOpIdx oi)
121
if (TCG_TARGET_REG_BITS == 32) {
122
TCGTemp *vl = tcgv_i32_temp(TCGV_LOW(v));
123
TCGTemp *vh = tcgv_i32_temp(TCGV_HIGH(v));
124
- gen_ldst(opc, vl, vh, addr, oi);
125
+ gen_ldst(opc, TCG_TYPE_I64, vl, vh, addr, oi);
126
} else {
127
- gen_ldst(opc, tcgv_i64_temp(v), NULL, addr, oi);
128
+ gen_ldst(opc, TCG_TYPE_I64, tcgv_i64_temp(v), NULL, addr, oi);
129
}
130
}
131
132
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i32_int(TCGv_i32 val, TCGTemp *addr,
133
} else {
134
opc = INDEX_op_qemu_ld_a64_i32;
135
}
136
- gen_ldst(opc, tcgv_i32_temp(val), NULL, addr, oi);
137
+ gen_ldst(opc, TCG_TYPE_I32, tcgv_i32_temp(val), NULL, addr, oi);
138
plugin_gen_mem_callbacks_i32(val, copy_addr, addr, orig_oi,
139
QEMU_PLUGIN_MEM_R);
140
141
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i32_int(TCGv_i32 val, TCGTemp *addr,
142
opc = INDEX_op_qemu_st_a64_i32;
143
}
144
}
145
- gen_ldst(opc, tcgv_i32_temp(val), NULL, addr, oi);
146
+ gen_ldst(opc, TCG_TYPE_I32, tcgv_i32_temp(val), NULL, addr, oi);
147
plugin_gen_mem_callbacks_i32(val, NULL, addr, orig_oi, QEMU_PLUGIN_MEM_W);
148
149
if (swap) {
150
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr,
151
} else {
152
opc = INDEX_op_qemu_ld_a64_i128;
153
}
154
- gen_ldst(opc, tcgv_i64_temp(lo), tcgv_i64_temp(hi), addr, oi);
155
+ gen_ldst(opc, TCG_TYPE_I128, tcgv_i64_temp(lo),
156
+ tcgv_i64_temp(hi), addr, oi);
157
158
if (need_bswap) {
159
tcg_gen_bswap64_i64(lo, lo);
160
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr,
161
} else {
162
opc = INDEX_op_qemu_st_a64_i128;
163
}
164
- gen_ldst(opc, tcgv_i64_temp(lo), tcgv_i64_temp(hi), addr, oi);
165
+ gen_ldst(opc, TCG_TYPE_I128, tcgv_i64_temp(lo),
166
+ tcgv_i64_temp(hi), addr, oi);
167
168
if (need_bswap) {
169
tcg_temp_free_i64(lo);
170
diff --git a/tcg/tcg-op-vec.c b/tcg/tcg-op-vec.c
171
index XXXXXXX..XXXXXXX 100644
172
--- a/tcg/tcg-op-vec.c
173
+++ b/tcg/tcg-op-vec.c
174
@@ -XXX,XX +XXX,XX @@ bool tcg_can_emit_vecop_list(const TCGOpcode *list,
175
void vec_gen_2(TCGOpcode opc, TCGType type, unsigned vece, TCGArg r, TCGArg a)
176
{
177
TCGOp *op = tcg_emit_op(opc, 2);
178
- TCGOP_VECL(op) = type - TCG_TYPE_V64;
179
+ TCGOP_TYPE(op) = type;
180
TCGOP_VECE(op) = vece;
181
op->args[0] = r;
182
op->args[1] = a;
183
@@ -XXX,XX +XXX,XX @@ void vec_gen_3(TCGOpcode opc, TCGType type, unsigned vece,
184
TCGArg r, TCGArg a, TCGArg b)
185
{
186
TCGOp *op = tcg_emit_op(opc, 3);
187
- TCGOP_VECL(op) = type - TCG_TYPE_V64;
188
+ TCGOP_TYPE(op) = type;
189
TCGOP_VECE(op) = vece;
190
op->args[0] = r;
191
op->args[1] = a;
192
@@ -XXX,XX +XXX,XX @@ void vec_gen_4(TCGOpcode opc, TCGType type, unsigned vece,
193
TCGArg r, TCGArg a, TCGArg b, TCGArg c)
194
{
195
TCGOp *op = tcg_emit_op(opc, 4);
196
- TCGOP_VECL(op) = type - TCG_TYPE_V64;
197
+ TCGOP_TYPE(op) = type;
198
TCGOP_VECE(op) = vece;
199
op->args[0] = r;
200
op->args[1] = a;
201
@@ -XXX,XX +XXX,XX @@ void vec_gen_6(TCGOpcode opc, TCGType type, unsigned vece, TCGArg r,
202
TCGArg a, TCGArg b, TCGArg c, TCGArg d, TCGArg e)
203
{
204
TCGOp *op = tcg_emit_op(opc, 6);
205
- TCGOP_VECL(op) = type - TCG_TYPE_V64;
206
+ TCGOP_TYPE(op) = type;
207
TCGOP_VECE(op) = vece;
208
op->args[0] = r;
209
op->args[1] = a;
210
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
211
index XXXXXXX..XXXXXXX 100644
212
--- a/tcg/tcg-op.c
213
+++ b/tcg/tcg-op.c
214
@@ -XXX,XX +XXX,XX @@
215
*/
216
#define NI __attribute__((noinline))
217
218
-TCGOp * NI tcg_gen_op1(TCGOpcode opc, TCGArg a1)
219
+TCGOp * NI tcg_gen_op1(TCGOpcode opc, TCGType type, TCGArg a1)
220
{
221
TCGOp *op = tcg_emit_op(opc, 1);
222
+ TCGOP_TYPE(op) = type;
223
op->args[0] = a1;
224
return op;
225
}
226
227
-TCGOp * NI tcg_gen_op2(TCGOpcode opc, TCGArg a1, TCGArg a2)
228
+TCGOp * NI tcg_gen_op2(TCGOpcode opc, TCGType type, TCGArg a1, TCGArg a2)
229
{
230
TCGOp *op = tcg_emit_op(opc, 2);
231
+ TCGOP_TYPE(op) = type;
232
op->args[0] = a1;
233
op->args[1] = a2;
234
return op;
235
}
236
237
-TCGOp * NI tcg_gen_op3(TCGOpcode opc, TCGArg a1, TCGArg a2, TCGArg a3)
238
+TCGOp * NI tcg_gen_op3(TCGOpcode opc, TCGType type, TCGArg a1,
239
+ TCGArg a2, TCGArg a3)
240
{
241
TCGOp *op = tcg_emit_op(opc, 3);
242
+ TCGOP_TYPE(op) = type;
243
op->args[0] = a1;
244
op->args[1] = a2;
245
op->args[2] = a3;
246
return op;
247
}
248
249
-TCGOp * NI tcg_gen_op4(TCGOpcode opc, TCGArg a1, TCGArg a2,
250
+TCGOp * NI tcg_gen_op4(TCGOpcode opc, TCGType type, TCGArg a1, TCGArg a2,
251
TCGArg a3, TCGArg a4)
252
{
253
TCGOp *op = tcg_emit_op(opc, 4);
254
+ TCGOP_TYPE(op) = type;
255
op->args[0] = a1;
256
op->args[1] = a2;
257
op->args[2] = a3;
258
@@ -XXX,XX +XXX,XX @@ TCGOp * NI tcg_gen_op4(TCGOpcode opc, TCGArg a1, TCGArg a2,
259
return op;
260
}
261
262
-TCGOp * NI tcg_gen_op5(TCGOpcode opc, TCGArg a1, TCGArg a2,
263
+TCGOp * NI tcg_gen_op5(TCGOpcode opc, TCGType type, TCGArg a1, TCGArg a2,
264
TCGArg a3, TCGArg a4, TCGArg a5)
265
{
266
TCGOp *op = tcg_emit_op(opc, 5);
267
+ TCGOP_TYPE(op) = type;
268
op->args[0] = a1;
269
op->args[1] = a2;
270
op->args[2] = a3;
271
@@ -XXX,XX +XXX,XX @@ TCGOp * NI tcg_gen_op5(TCGOpcode opc, TCGArg a1, TCGArg a2,
272
return op;
273
}
274
275
-TCGOp * NI tcg_gen_op6(TCGOpcode opc, TCGArg a1, TCGArg a2, TCGArg a3,
276
- TCGArg a4, TCGArg a5, TCGArg a6)
277
+TCGOp * NI tcg_gen_op6(TCGOpcode opc, TCGType type, TCGArg a1, TCGArg a2,
278
+ TCGArg a3, TCGArg a4, TCGArg a5, TCGArg a6)
279
{
280
TCGOp *op = tcg_emit_op(opc, 6);
281
+ TCGOP_TYPE(op) = type;
282
op->args[0] = a1;
283
op->args[1] = a2;
284
op->args[2] = a3;
285
@@ -XXX,XX +XXX,XX @@ TCGOp * NI tcg_gen_op6(TCGOpcode opc, TCGArg a1, TCGArg a2, TCGArg a3,
286
# define DNI
287
#endif
288
289
-static void DNI tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 a1)
290
+static void DNI tcg_gen_op1_i32(TCGOpcode opc, TCGType type, TCGv_i32 a1)
291
{
292
- tcg_gen_op1(opc, tcgv_i32_arg(a1));
293
+ tcg_gen_op1(opc, type, tcgv_i32_arg(a1));
294
}
295
296
-static void DNI tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 a1)
297
+static void DNI tcg_gen_op1_i64(TCGOpcode opc, TCGType type, TCGv_i64 a1)
298
{
299
- tcg_gen_op1(opc, tcgv_i64_arg(a1));
300
+ tcg_gen_op1(opc, type, tcgv_i64_arg(a1));
301
}
302
303
-static TCGOp * DNI tcg_gen_op1i(TCGOpcode opc, TCGArg a1)
304
+static TCGOp * DNI tcg_gen_op1i(TCGOpcode opc, TCGType type, TCGArg a1)
305
{
306
- return tcg_gen_op1(opc, a1);
307
+ return tcg_gen_op1(opc, type, a1);
308
}
309
310
static void DNI tcg_gen_op2_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2)
311
{
312
- tcg_gen_op2(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2));
313
+ tcg_gen_op2(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2));
314
}
315
316
static void DNI tcg_gen_op2_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2)
317
{
318
- tcg_gen_op2(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2));
319
+ tcg_gen_op2(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2));
320
}
321
322
static void DNI tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 a1,
323
TCGv_i32 a2, TCGv_i32 a3)
324
{
325
- tcg_gen_op3(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2), tcgv_i32_arg(a3));
326
+ tcg_gen_op3(opc, TCG_TYPE_I32, tcgv_i32_arg(a1),
327
+ tcgv_i32_arg(a2), tcgv_i32_arg(a3));
328
}
329
330
static void DNI tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 a1,
331
TCGv_i64 a2, TCGv_i64 a3)
332
{
333
- tcg_gen_op3(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2), tcgv_i64_arg(a3));
334
+ tcg_gen_op3(opc, TCG_TYPE_I64, tcgv_i64_arg(a1),
335
+ tcgv_i64_arg(a2), tcgv_i64_arg(a3));
336
}
337
338
static void DNI tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 a1,
339
TCGv_i32 a2, TCGArg a3)
340
{
341
- tcg_gen_op3(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2), a3);
342
+ tcg_gen_op3(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2), a3);
343
}
344
345
static void DNI tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 a1,
346
TCGv_i64 a2, TCGArg a3)
347
{
348
- tcg_gen_op3(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2), a3);
349
+ tcg_gen_op3(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2), a3);
350
}
351
352
static void DNI tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
353
TCGv_ptr base, TCGArg offset)
354
{
355
- tcg_gen_op3(opc, tcgv_i32_arg(val), tcgv_ptr_arg(base), offset);
356
+ tcg_gen_op3(opc, TCG_TYPE_I32, tcgv_i32_arg(val),
357
+ tcgv_ptr_arg(base), offset);
358
}
359
360
static void DNI tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
361
TCGv_ptr base, TCGArg offset)
362
{
363
- tcg_gen_op3(opc, tcgv_i64_arg(val), tcgv_ptr_arg(base), offset);
364
+ tcg_gen_op3(opc, TCG_TYPE_I64, tcgv_i64_arg(val),
365
+ tcgv_ptr_arg(base), offset);
366
}
367
368
static void DNI tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
369
TCGv_i32 a3, TCGv_i32 a4)
370
{
371
- tcg_gen_op4(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
372
+ tcg_gen_op4(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
373
tcgv_i32_arg(a3), tcgv_i32_arg(a4));
374
}
375
376
static void DNI tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
377
TCGv_i64 a3, TCGv_i64 a4)
378
{
379
- tcg_gen_op4(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
380
+ tcg_gen_op4(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
381
tcgv_i64_arg(a3), tcgv_i64_arg(a4));
382
}
383
384
static void DNI tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
385
TCGv_i32 a3, TCGArg a4)
386
{
387
- tcg_gen_op4(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
388
+ tcg_gen_op4(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
389
tcgv_i32_arg(a3), a4);
390
}
391
392
static void DNI tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
393
TCGv_i64 a3, TCGArg a4)
394
{
395
- tcg_gen_op4(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
396
+ tcg_gen_op4(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
397
tcgv_i64_arg(a3), a4);
398
}
399
400
static TCGOp * DNI tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
401
TCGArg a3, TCGArg a4)
402
{
403
- return tcg_gen_op4(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2), a3, a4);
404
+ return tcg_gen_op4(opc, TCG_TYPE_I32,
405
+ tcgv_i32_arg(a1), tcgv_i32_arg(a2), a3, a4);
406
}
407
408
static TCGOp * DNI tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
409
TCGArg a3, TCGArg a4)
410
{
411
- return tcg_gen_op4(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2), a3, a4);
412
+ return tcg_gen_op4(opc, TCG_TYPE_I64,
413
+ tcgv_i64_arg(a1), tcgv_i64_arg(a2), a3, a4);
414
}
415
416
static void DNI tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
417
TCGv_i32 a3, TCGv_i32 a4, TCGv_i32 a5)
418
{
419
- tcg_gen_op5(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
420
+ tcg_gen_op5(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
421
tcgv_i32_arg(a3), tcgv_i32_arg(a4), tcgv_i32_arg(a5));
422
}
423
424
static void DNI tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
425
TCGv_i64 a3, TCGv_i64 a4, TCGv_i64 a5)
426
{
427
- tcg_gen_op5(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
428
+ tcg_gen_op5(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
429
tcgv_i64_arg(a3), tcgv_i64_arg(a4), tcgv_i64_arg(a5));
430
}
431
432
static void DNI tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
433
TCGv_i32 a3, TCGArg a4, TCGArg a5)
434
{
435
- tcg_gen_op5(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
436
+ tcg_gen_op5(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
437
tcgv_i32_arg(a3), a4, a5);
438
}
439
440
static void DNI tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
441
TCGv_i64 a3, TCGArg a4, TCGArg a5)
442
{
443
- tcg_gen_op5(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
444
+ tcg_gen_op5(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
445
tcgv_i64_arg(a3), a4, a5);
446
}
447
448
@@ -XXX,XX +XXX,XX @@ static void DNI tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
449
TCGv_i32 a3, TCGv_i32 a4,
450
TCGv_i32 a5, TCGv_i32 a6)
451
{
452
- tcg_gen_op6(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
453
+ tcg_gen_op6(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
454
tcgv_i32_arg(a3), tcgv_i32_arg(a4), tcgv_i32_arg(a5),
455
tcgv_i32_arg(a6));
456
}
457
@@ -XXX,XX +XXX,XX @@ static void DNI tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
458
TCGv_i64 a3, TCGv_i64 a4,
459
TCGv_i64 a5, TCGv_i64 a6)
460
{
461
- tcg_gen_op6(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
462
+ tcg_gen_op6(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
463
tcgv_i64_arg(a3), tcgv_i64_arg(a4), tcgv_i64_arg(a5),
464
tcgv_i64_arg(a6));
465
}
466
@@ -XXX,XX +XXX,XX @@ static void DNI tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
467
TCGv_i32 a3, TCGv_i32 a4,
468
TCGv_i32 a5, TCGArg a6)
469
{
470
- tcg_gen_op6(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
471
+ tcg_gen_op6(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
472
tcgv_i32_arg(a3), tcgv_i32_arg(a4), tcgv_i32_arg(a5), a6);
473
}
474
475
@@ -XXX,XX +XXX,XX @@ static void DNI tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
476
TCGv_i64 a3, TCGv_i64 a4,
477
TCGv_i64 a5, TCGArg a6)
478
{
479
- tcg_gen_op6(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
480
+ tcg_gen_op6(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
481
tcgv_i64_arg(a3), tcgv_i64_arg(a4), tcgv_i64_arg(a5), a6);
482
}
483
484
@@ -XXX,XX +XXX,XX @@ static TCGOp * DNI tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
485
TCGv_i32 a3, TCGv_i32 a4,
486
TCGArg a5, TCGArg a6)
487
{
488
- return tcg_gen_op6(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
489
+ return tcg_gen_op6(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
490
tcgv_i32_arg(a3), tcgv_i32_arg(a4), a5, a6);
491
}
492
493
@@ -XXX,XX +XXX,XX @@ static TCGOp * DNI tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
494
void gen_set_label(TCGLabel *l)
495
{
496
l->present = 1;
497
- tcg_gen_op1(INDEX_op_set_label, label_arg(l));
498
+ tcg_gen_op1(INDEX_op_set_label, 0, label_arg(l));
499
}
500
501
static void add_as_label_use(TCGLabel *l, TCGOp *op)
502
@@ -XXX,XX +XXX,XX @@ static void add_as_label_use(TCGLabel *l, TCGOp *op)
503
504
void tcg_gen_br(TCGLabel *l)
505
{
506
- add_as_label_use(l, tcg_gen_op1(INDEX_op_br, label_arg(l)));
507
+ add_as_label_use(l, tcg_gen_op1(INDEX_op_br, 0, label_arg(l)));
508
}
509
510
void tcg_gen_mb(TCGBar mb_type)
511
@@ -XXX,XX +XXX,XX @@ void tcg_gen_mb(TCGBar mb_type)
512
#endif
513
514
if (parallel) {
515
- tcg_gen_op1(INDEX_op_mb, mb_type);
516
+ tcg_gen_op1(INDEX_op_mb, 0, mb_type);
517
}
518
}
519
520
void tcg_gen_plugin_cb(unsigned from)
521
{
522
- tcg_gen_op1(INDEX_op_plugin_cb, from);
523
+ tcg_gen_op1(INDEX_op_plugin_cb, 0, from);
524
}
525
526
void tcg_gen_plugin_mem_cb(TCGv_i64 addr, unsigned meminfo)
527
{
528
- tcg_gen_op2(INDEX_op_plugin_mem_cb, tcgv_i64_arg(addr), meminfo);
529
+ tcg_gen_op2(INDEX_op_plugin_mem_cb, 0, tcgv_i64_arg(addr), meminfo);
530
}
531
532
/* 32 bit ops */
533
534
void tcg_gen_discard_i32(TCGv_i32 arg)
535
{
536
- tcg_gen_op1_i32(INDEX_op_discard, arg);
537
+ tcg_gen_op1_i32(INDEX_op_discard, TCG_TYPE_I32, arg);
538
}
539
540
void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
541
@@ -XXX,XX +XXX,XX @@ void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
542
void tcg_gen_discard_i64(TCGv_i64 arg)
543
{
544
if (TCG_TARGET_REG_BITS == 64) {
545
- tcg_gen_op1_i64(INDEX_op_discard, arg);
546
+ tcg_gen_op1_i64(INDEX_op_discard, TCG_TYPE_I64, arg);
547
} else {
548
tcg_gen_discard_i32(TCGV_LOW(arg));
549
tcg_gen_discard_i32(TCGV_HIGH(arg));
550
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extrl_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
551
if (TCG_TARGET_REG_BITS == 32) {
552
tcg_gen_mov_i32(ret, TCGV_LOW(arg));
553
} else if (TCG_TARGET_HAS_extr_i64_i32) {
554
- tcg_gen_op2(INDEX_op_extrl_i64_i32,
555
+ tcg_gen_op2(INDEX_op_extrl_i64_i32, TCG_TYPE_I32,
556
tcgv_i32_arg(ret), tcgv_i64_arg(arg));
557
} else {
558
tcg_gen_mov_i32(ret, (TCGv_i32)arg);
559
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extrh_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
560
if (TCG_TARGET_REG_BITS == 32) {
561
tcg_gen_mov_i32(ret, TCGV_HIGH(arg));
562
} else if (TCG_TARGET_HAS_extr_i64_i32) {
563
- tcg_gen_op2(INDEX_op_extrh_i64_i32,
564
+ tcg_gen_op2(INDEX_op_extrh_i64_i32, TCG_TYPE_I32,
565
tcgv_i32_arg(ret), tcgv_i64_arg(arg));
566
} else {
567
TCGv_i64 t = tcg_temp_ebb_new_i64();
568
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
569
tcg_gen_mov_i32(TCGV_LOW(ret), arg);
570
tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
571
} else {
572
- tcg_gen_op2(INDEX_op_extu_i32_i64,
573
+ tcg_gen_op2(INDEX_op_extu_i32_i64, TCG_TYPE_I64,
574
tcgv_i64_arg(ret), tcgv_i32_arg(arg));
575
}
576
}
577
@@ -XXX,XX +XXX,XX @@ void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
578
tcg_gen_mov_i32(TCGV_LOW(ret), arg);
579
tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
580
} else {
581
- tcg_gen_op2(INDEX_op_ext_i32_i64,
582
+ tcg_gen_op2(INDEX_op_ext_i32_i64, TCG_TYPE_I64,
583
tcgv_i64_arg(ret), tcgv_i32_arg(arg));
584
}
585
}
586
@@ -XXX,XX +XXX,XX @@ void tcg_gen_exit_tb(const TranslationBlock *tb, unsigned idx)
587
tcg_debug_assert(idx == TB_EXIT_REQUESTED);
588
}
589
590
- tcg_gen_op1i(INDEX_op_exit_tb, val);
591
+ tcg_gen_op1i(INDEX_op_exit_tb, 0, val);
592
}
593
594
void tcg_gen_goto_tb(unsigned idx)
595
@@ -XXX,XX +XXX,XX @@ void tcg_gen_goto_tb(unsigned idx)
596
tcg_ctx->goto_tb_issue_mask |= 1 << idx;
597
#endif
598
plugin_gen_disable_mem_helpers();
599
- tcg_gen_op1i(INDEX_op_goto_tb, idx);
600
+ tcg_gen_op1i(INDEX_op_goto_tb, 0, idx);
601
}
602
603
void tcg_gen_lookup_and_goto_ptr(void)
604
@@ -XXX,XX +XXX,XX @@ void tcg_gen_lookup_and_goto_ptr(void)
605
plugin_gen_disable_mem_helpers();
606
ptr = tcg_temp_ebb_new_ptr();
607
gen_helper_lookup_tb_ptr(ptr, tcg_env);
608
- tcg_gen_op1i(INDEX_op_goto_ptr, tcgv_ptr_arg(ptr));
609
+ tcg_gen_op1i(INDEX_op_goto_ptr, TCG_TYPE_PTR, tcgv_ptr_arg(ptr));
610
tcg_temp_free_ptr(ptr);
611
}
612
diff --git a/tcg/tcg.c b/tcg/tcg.c
613
index XXXXXXX..XXXXXXX 100644
614
--- a/tcg/tcg.c
615
+++ b/tcg/tcg.c
616
@@ -XXX,XX +XXX,XX @@ void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
617
nb_cargs = def->nb_cargs;
618
619
if (def->flags & TCG_OPF_VECTOR) {
620
- col += ne_fprintf(f, "v%d,e%d,", 64 << TCGOP_VECL(op),
621
+ col += ne_fprintf(f, "v%d,e%d,",
622
+ 8 * tcg_type_size(TCGOP_TYPE(op)),
623
8 << TCGOP_VECE(op));
624
}
625
626
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
627
628
itype = its->type;
629
vece = TCGOP_VECE(op);
630
- vtype = TCGOP_VECL(op) + TCG_TYPE_V64;
631
+ vtype = TCGOP_TYPE(op);
632
633
if (its->val_type == TEMP_VAL_CONST) {
634
/* Propagate constant via movi -> dupi. */
635
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
636
break;
637
default:
638
if (def->flags & TCG_OPF_VECTOR) {
639
- tcg_out_vec_op(s, op->opc, TCGOP_VECL(op), TCGOP_VECE(op),
640
- new_args, const_args);
641
+ tcg_out_vec_op(s, op->opc, TCGOP_TYPE(op) - TCG_TYPE_V64,
642
+ TCGOP_VECE(op), new_args, const_args);
643
} else {
644
tcg_out_op(s, op->opc, new_args, const_args);
645
}
646
@@ -XXX,XX +XXX,XX @@ static bool tcg_reg_alloc_dup2(TCGContext *s, const TCGOp *op)
647
{
648
const TCGLifeData arg_life = op->life;
649
TCGTemp *ots, *itsl, *itsh;
650
- TCGType vtype = TCGOP_VECL(op) + TCG_TYPE_V64;
651
+ TCGType vtype = TCGOP_TYPE(op);
652
653
/* This opcode is only valid for 32-bit hosts, for 64-bit elements. */
654
tcg_debug_assert(TCG_TARGET_REG_BITS == 32);
655
diff --git a/docs/devel/tcg-ops.rst b/docs/devel/tcg-ops.rst
656
index XXXXXXX..XXXXXXX 100644
657
--- a/docs/devel/tcg-ops.rst
658
+++ b/docs/devel/tcg-ops.rst
659
@@ -XXX,XX +XXX,XX @@ QEMU specific operations
660
Host vector operations
661
----------------------
662
663
-All of the vector ops have two parameters, ``TCGOP_VECL`` & ``TCGOP_VECE``.
664
-The former specifies the length of the vector in log2 64-bit units; the
665
-latter specifies the length of the element (if applicable) in log2 8-bit units.
666
-E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
667
+All of the vector ops have two parameters, ``TCGOP_TYPE`` & ``TCGOP_VECE``.
668
+The former specifies the length of the vector as a TCGType; the latter
669
+specifies the length of the element (if applicable) in log2 8-bit units.
670
671
.. list-table::
672
673
@@ -XXX,XX +XXX,XX @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
674
675
* - dup_vec *v0*, *r1*
676
677
- - | Duplicate the low N bits of *r1* into VECL/VECE copies across *v0*.
678
+ - | Duplicate the low N bits of *r1* into TYPE/VECE copies across *v0*.
679
680
* - dupi_vec *v0*, *c*
681
682
@@ -XXX,XX +XXX,XX @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
683
684
* - dup2_vec *v0*, *r1*, *r2*
685
686
- - | Duplicate *r2*:*r1* into VECL/64 copies across *v0*. This opcode is
687
+ - | Duplicate *r2*:*r1* into TYPE/64 copies across *v0*. This opcode is
688
only present for 32-bit hosts.
689
690
* - add_vec *v0*, *v1*, *v2*
691
@@ -XXX,XX +XXX,XX @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
692
693
.. code-block:: c
694
695
- for (i = 0; i < VECL/VECE; ++i) {
696
+ for (i = 0; i < TYPE/VECE; ++i) {
697
v0[i] = v1[i] << s2;
698
}
699
700
@@ -XXX,XX +XXX,XX @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
701
702
.. code-block:: c
703
704
- for (i = 0; i < VECL/VECE; ++i) {
705
+ for (i = 0; i < TYPE/VECE; ++i) {
706
v0[i] = v1[i] << v2[i];
707
}
708
709
--
710
2.43.0
711
712
diff view generated by jsdifflib
New patch
1
These are not particularly useful outside of optimization passes.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
include/tcg/tcg.h | 4 ----
7
tcg/tcg-internal.h | 5 +++++
8
2 files changed, 5 insertions(+), 4 deletions(-)
9
10
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
11
index XXXXXXX..XXXXXXX 100644
12
--- a/include/tcg/tcg.h
13
+++ b/include/tcg/tcg.h
14
@@ -XXX,XX +XXX,XX @@ void tcg_gen_call7(void *func, TCGHelperInfo *, TCGTemp *ret,
15
16
TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs);
17
void tcg_op_remove(TCGContext *s, TCGOp *op);
18
-TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op,
19
- TCGOpcode opc, unsigned nargs);
20
-TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op,
21
- TCGOpcode opc, unsigned nargs);
22
23
/**
24
* tcg_remove_ops_after:
25
diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h
26
index XXXXXXX..XXXXXXX 100644
27
--- a/tcg/tcg-internal.h
28
+++ b/tcg/tcg-internal.h
29
@@ -XXX,XX +XXX,XX @@ void vec_gen_4(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg, TCGArg, TCGArg);
30
void vec_gen_6(TCGOpcode opc, TCGType type, unsigned vece, TCGArg r,
31
TCGArg a, TCGArg b, TCGArg c, TCGArg d, TCGArg e);
32
33
+TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op,
34
+ TCGOpcode opc, unsigned nargs);
35
+TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op,
36
+ TCGOpcode opc, unsigned nargs);
37
+
38
#endif /* TCG_INTERNAL_H */
39
--
40
2.43.0
41
42
diff view generated by jsdifflib
New patch
1
Simplify use within the optimizers by defaulting the
2
new opcode to the same type as the old opcode.
1
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/tcg.c | 4 ++++
8
1 file changed, 4 insertions(+)
9
10
diff --git a/tcg/tcg.c b/tcg/tcg.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/tcg.c
13
+++ b/tcg/tcg.c
14
@@ -XXX,XX +XXX,XX @@ TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *old_op,
15
TCGOpcode opc, unsigned nargs)
16
{
17
TCGOp *new_op = tcg_op_alloc(opc, nargs);
18
+
19
+ TCGOP_TYPE(new_op) = TCGOP_TYPE(old_op);
20
QTAILQ_INSERT_BEFORE(old_op, new_op, link);
21
return new_op;
22
}
23
@@ -XXX,XX +XXX,XX @@ TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *old_op,
24
TCGOpcode opc, unsigned nargs)
25
{
26
TCGOp *new_op = tcg_op_alloc(opc, nargs);
27
+
28
+ TCGOP_TYPE(new_op) = TCGOP_TYPE(old_op);
29
QTAILQ_INSERT_AFTER(&s->ops, old_op, new_op, link);
30
return new_op;
31
}
32
--
33
2.43.0
34
35
diff view generated by jsdifflib
New patch
1
To be used by some integer operations instead of,
2
or in addition to, a trailing constant argument.
1
3
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
include/tcg/tcg.h | 1 +
7
1 file changed, 1 insertion(+)
8
9
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
10
index XXXXXXX..XXXXXXX 100644
11
--- a/include/tcg/tcg.h
12
+++ b/include/tcg/tcg.h
13
@@ -XXX,XX +XXX,XX @@ struct TCGOp {
14
#define TCGOP_CALLO(X) (X)->param2
15
16
#define TCGOP_TYPE(X) (X)->param1
17
+#define TCGOP_FLAGS(X) (X)->param2
18
#define TCGOP_VECE(X) (X)->param2
19
20
/* Make sure operands fit in the bitfields above. */
21
--
22
2.43.0
diff view generated by jsdifflib
New patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
include/tcg/tcg.h | 7 ++++++-
5
tcg/tcg.c | 11 +++++++----
6
2 files changed, 13 insertions(+), 5 deletions(-)
1
7
8
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/include/tcg/tcg.h
11
+++ b/include/tcg/tcg.h
12
@@ -XXX,XX +XXX,XX @@ typedef struct TCGTargetOpDef {
13
const char *args_ct_str[TCG_MAX_OP_ARGS];
14
} TCGTargetOpDef;
15
16
-bool tcg_op_supported(TCGOpcode op);
17
+/*
18
+ * tcg_op_supported:
19
+ * Query if @op, for @type and @flags, is supported by the host
20
+ * on which we are currently executing.
21
+ */
22
+bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags);
23
24
void tcg_gen_call0(void *func, TCGHelperInfo *, TCGTemp *ret);
25
void tcg_gen_call1(void *func, TCGHelperInfo *, TCGTemp *ret, TCGTemp *);
26
diff --git a/tcg/tcg.c b/tcg/tcg.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/tcg/tcg.c
29
+++ b/tcg/tcg.c
30
@@ -XXX,XX +XXX,XX @@ TCGTemp *tcgv_i32_temp(TCGv_i32 v)
31
}
32
#endif /* CONFIG_DEBUG_TCG */
33
34
-/* Return true if OP may appear in the opcode stream.
35
- Test the runtime variable that controls each opcode. */
36
-bool tcg_op_supported(TCGOpcode op)
37
+/*
38
+ * Return true if OP may appear in the opcode stream with TYPE.
39
+ * Test the runtime variable that controls each opcode.
40
+ */
41
+bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
42
{
43
const bool have_vec
44
= TCG_TARGET_HAS_v64 | TCG_TARGET_HAS_v128 | TCG_TARGET_HAS_v256;
45
@@ -XXX,XX +XXX,XX @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start)
46
/* fall through */
47
default:
48
/* Sanity check that we've not introduced any unhandled opcodes. */
49
- tcg_debug_assert(tcg_op_supported(opc));
50
+ tcg_debug_assert(tcg_op_supported(opc, TCGOP_TYPE(op),
51
+ TCGOP_FLAGS(op)));
52
/* Note: in order to speed up the code, it would be much
53
faster to have specialized register allocator functions for
54
some common argument patterns */
55
--
56
2.43.0
57
58
diff view generated by jsdifflib
New patch
1
Rely on tcg-op-vec.c to expand the opcode if missing.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/arm/tcg/translate-sve.c | 20 ++++----------------
7
1 file changed, 4 insertions(+), 16 deletions(-)
8
9
diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/arm/tcg/translate-sve.c
12
+++ b/target/arm/tcg/translate-sve.c
13
@@ -XXX,XX +XXX,XX @@ static void gen_bsl1n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
14
static void gen_bsl1n_vec(unsigned vece, TCGv_vec d, TCGv_vec n,
15
TCGv_vec m, TCGv_vec k)
16
{
17
- if (TCG_TARGET_HAS_bitsel_vec) {
18
- tcg_gen_not_vec(vece, n, n);
19
- tcg_gen_bitsel_vec(vece, d, k, n, m);
20
- } else {
21
- tcg_gen_andc_vec(vece, n, k, n);
22
- tcg_gen_andc_vec(vece, m, m, k);
23
- tcg_gen_or_vec(vece, d, n, m);
24
- }
25
+ tcg_gen_not_vec(vece, n, n);
26
+ tcg_gen_bitsel_vec(vece, d, k, n, m);
27
}
28
29
static void gen_bsl1n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
30
@@ -XXX,XX +XXX,XX @@ static void gen_bsl2n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
31
static void gen_bsl2n_vec(unsigned vece, TCGv_vec d, TCGv_vec n,
32
TCGv_vec m, TCGv_vec k)
33
{
34
- if (TCG_TARGET_HAS_bitsel_vec) {
35
- tcg_gen_not_vec(vece, m, m);
36
- tcg_gen_bitsel_vec(vece, d, k, n, m);
37
- } else {
38
- tcg_gen_and_vec(vece, n, n, k);
39
- tcg_gen_or_vec(vece, m, m, k);
40
- tcg_gen_orc_vec(vece, d, n, m);
41
- }
42
+ tcg_gen_not_vec(vece, m, m);
43
+ tcg_gen_bitsel_vec(vece, d, k, n, m);
44
}
45
46
static void gen_bsl2n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
47
--
48
2.43.0
49
50
diff view generated by jsdifflib
New patch
1
Do not reference TCG_TARGET_HAS_* directly.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/arm/tcg/translate-a64.c | 10 ++++++----
7
target/arm/tcg/translate-sve.c | 2 +-
8
target/arm/tcg/translate.c | 2 +-
9
3 files changed, 8 insertions(+), 6 deletions(-)
10
11
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/arm/tcg/translate-a64.c
14
+++ b/target/arm/tcg/translate-a64.c
15
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
16
TCGv_i64 tcg_rn, tcg_y;
17
DisasCompare c;
18
unsigned nzcv;
19
+ bool has_andc;
20
21
/* Set T0 = !COND. */
22
arm_test_cc(&c, a->cond);
23
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
24
tcg_gen_subi_i32(tcg_t2, tcg_t0, 1);
25
26
nzcv = a->nzcv;
27
+ has_andc = tcg_op_supported(INDEX_op_andc_i32, TCG_TYPE_I32, 0);
28
if (nzcv & 8) { /* N */
29
tcg_gen_or_i32(cpu_NF, cpu_NF, tcg_t1);
30
} else {
31
- if (TCG_TARGET_HAS_andc_i32) {
32
+ if (has_andc) {
33
tcg_gen_andc_i32(cpu_NF, cpu_NF, tcg_t1);
34
} else {
35
tcg_gen_and_i32(cpu_NF, cpu_NF, tcg_t2);
36
}
37
}
38
if (nzcv & 4) { /* Z */
39
- if (TCG_TARGET_HAS_andc_i32) {
40
+ if (has_andc) {
41
tcg_gen_andc_i32(cpu_ZF, cpu_ZF, tcg_t1);
42
} else {
43
tcg_gen_and_i32(cpu_ZF, cpu_ZF, tcg_t2);
44
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
45
if (nzcv & 2) { /* C */
46
tcg_gen_or_i32(cpu_CF, cpu_CF, tcg_t0);
47
} else {
48
- if (TCG_TARGET_HAS_andc_i32) {
49
+ if (has_andc) {
50
tcg_gen_andc_i32(cpu_CF, cpu_CF, tcg_t1);
51
} else {
52
tcg_gen_and_i32(cpu_CF, cpu_CF, tcg_t2);
53
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
54
if (nzcv & 1) { /* V */
55
tcg_gen_or_i32(cpu_VF, cpu_VF, tcg_t1);
56
} else {
57
- if (TCG_TARGET_HAS_andc_i32) {
58
+ if (has_andc) {
59
tcg_gen_andc_i32(cpu_VF, cpu_VF, tcg_t1);
60
} else {
61
tcg_gen_and_i32(cpu_VF, cpu_VF, tcg_t2);
62
diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c
63
index XXXXXXX..XXXXXXX 100644
64
--- a/target/arm/tcg/translate-sve.c
65
+++ b/target/arm/tcg/translate-sve.c
66
@@ -XXX,XX +XXX,XX @@ static void gen_bsl2n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
67
* = | ~(m | k)
68
*/
69
tcg_gen_and_i64(n, n, k);
70
- if (TCG_TARGET_HAS_orc_i64) {
71
+ if (tcg_op_supported(INDEX_op_orc_i64, TCG_TYPE_I64, 0)) {
72
tcg_gen_or_i64(m, m, k);
73
tcg_gen_orc_i64(d, n, m);
74
} else {
75
diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c
76
index XXXXXXX..XXXXXXX 100644
77
--- a/target/arm/tcg/translate.c
78
+++ b/target/arm/tcg/translate.c
79
@@ -XXX,XX +XXX,XX @@ static void gen_add_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
80
static void gen_adc_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
81
{
82
TCGv_i32 tmp = tcg_temp_new_i32();
83
- if (TCG_TARGET_HAS_add2_i32) {
84
+ if (tcg_op_supported(INDEX_op_add2_i32, TCG_TYPE_I32, 0)) {
85
tcg_gen_movi_i32(tmp, 0);
86
tcg_gen_add2_i32(cpu_NF, cpu_CF, t0, tmp, cpu_CF, tmp);
87
tcg_gen_add2_i32(cpu_NF, cpu_CF, cpu_NF, cpu_CF, t1, tmp);
88
--
89
2.43.0
90
91
diff view generated by jsdifflib
New patch
1
Do not reference TCG_TARGET_HAS_* directly.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/tricore/translate.c | 4 ++--
7
1 file changed, 2 insertions(+), 2 deletions(-)
8
9
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/tricore/translate.c
12
+++ b/target/tricore/translate.c
13
@@ -XXX,XX +XXX,XX @@ static void decode_bit_andacc(DisasContext *ctx)
14
pos1, pos2, &tcg_gen_andc_tl, &tcg_gen_and_tl);
15
break;
16
case OPC2_32_BIT_AND_NOR_T:
17
- if (TCG_TARGET_HAS_andc_i32) {
18
+ if (tcg_op_supported(INDEX_op_andc_i32, TCG_TYPE_I32, 0)) {
19
gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
20
pos1, pos2, &tcg_gen_or_tl, &tcg_gen_andc_tl);
21
} else {
22
@@ -XXX,XX +XXX,XX @@ static void decode_bit_orand(DisasContext *ctx)
23
pos1, pos2, &tcg_gen_andc_tl, &tcg_gen_or_tl);
24
break;
25
case OPC2_32_BIT_OR_NOR_T:
26
- if (TCG_TARGET_HAS_orc_i32) {
27
+ if (tcg_op_supported(INDEX_op_orc_i32, TCG_TYPE_I32, 0)) {
28
gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
29
pos1, pos2, &tcg_gen_or_tl, &tcg_gen_orc_tl);
30
} else {
31
--
32
2.43.0
33
34
diff view generated by jsdifflib
New patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
include/tcg/tcg.h | 6 ++++++
5
tcg/tcg.c | 21 +++++++++++++++++++++
6
2 files changed, 27 insertions(+)
1
7
8
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/include/tcg/tcg.h
11
+++ b/include/tcg/tcg.h
12
@@ -XXX,XX +XXX,XX @@ typedef struct TCGTargetOpDef {
13
* on which we are currently executing.
14
*/
15
bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags);
16
+/*
17
+ * tcg_op_deposit_valid:
18
+ * Query if a deposit into (ofs, len) is supported for @type by
19
+ * the host on which we are currently executing.
20
+ */
21
+bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len);
22
23
void tcg_gen_call0(void *func, TCGHelperInfo *, TCGTemp *ret);
24
void tcg_gen_call1(void *func, TCGHelperInfo *, TCGTemp *ret, TCGTemp *);
25
diff --git a/tcg/tcg.c b/tcg/tcg.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/tcg/tcg.c
28
+++ b/tcg/tcg.c
29
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
30
}
31
}
32
33
+bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len)
34
+{
35
+ tcg_debug_assert(len > 0);
36
+ switch (type) {
37
+ case TCG_TYPE_I32:
38
+ tcg_debug_assert(ofs < 32);
39
+ tcg_debug_assert(len <= 32);
40
+ tcg_debug_assert(ofs + len <= 32);
41
+ return TCG_TARGET_HAS_deposit_i32 &&
42
+ TCG_TARGET_deposit_i32_valid(ofs, len);
43
+ case TCG_TYPE_I64:
44
+ tcg_debug_assert(ofs < 64);
45
+ tcg_debug_assert(len <= 64);
46
+ tcg_debug_assert(ofs + len <= 64);
47
+ return TCG_TARGET_HAS_deposit_i64 &&
48
+ TCG_TARGET_deposit_i64_valid(ofs, len);
49
+ default:
50
+ g_assert_not_reached();
51
+ }
52
+}
53
+
54
static TCGOp *tcg_op_alloc(TCGOpcode opc, unsigned nargs);
55
56
static void tcg_gen_callN(void *func, TCGHelperInfo *info,
57
--
58
2.43.0
59
60
diff view generated by jsdifflib
New patch
1
This macro is unused.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/i386/tcg/emit.c.inc | 2 --
7
1 file changed, 2 deletions(-)
8
9
diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/i386/tcg/emit.c.inc
12
+++ b/target/i386/tcg/emit.c.inc
13
@@ -XXX,XX +XXX,XX @@
14
#ifdef TARGET_X86_64
15
#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i64
16
#define TCG_TARGET_deposit_tl_valid TCG_TARGET_deposit_i64_valid
17
-#define TCG_TARGET_extract_tl_valid TCG_TARGET_extract_i64_valid
18
#else
19
#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i32
20
#define TCG_TARGET_deposit_tl_valid TCG_TARGET_deposit_i32_valid
21
-#define TCG_TARGET_extract_tl_valid TCG_TARGET_extract_i32_valid
22
#endif
23
24
#define MMX_OFFSET(reg) \
25
--
26
2.43.0
27
28
diff view generated by jsdifflib
New patch
1
Avoid direct usage of TCG_TARGET_deposit_*_valid.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/i386/tcg/emit.c.inc | 6 ++----
7
1 file changed, 2 insertions(+), 4 deletions(-)
8
9
diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/i386/tcg/emit.c.inc
12
+++ b/target/i386/tcg/emit.c.inc
13
@@ -XXX,XX +XXX,XX @@
14
*/
15
#ifdef TARGET_X86_64
16
#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i64
17
-#define TCG_TARGET_deposit_tl_valid TCG_TARGET_deposit_i64_valid
18
#else
19
#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i32
20
-#define TCG_TARGET_deposit_tl_valid TCG_TARGET_deposit_i32_valid
21
#endif
22
23
#define MMX_OFFSET(reg) \
24
@@ -XXX,XX +XXX,XX @@ static void gen_RCL(DisasContext *s, X86DecodedInsn *decode)
25
}
26
27
/* Compute high part, including incoming carry. */
28
- if (!have_1bit_cin || TCG_TARGET_deposit_tl_valid(1, TARGET_LONG_BITS - 1)) {
29
+ if (!have_1bit_cin || tcg_op_deposit_valid(TCG_TYPE_TL, 1, TARGET_LONG_BITS - 1)) {
30
/* high = (T0 << 1) | cin */
31
TCGv cin = have_1bit_cin ? decode->cc_dst : decode->cc_src;
32
tcg_gen_deposit_tl(high, cin, s->T0, 1, TARGET_LONG_BITS - 1);
33
@@ -XXX,XX +XXX,XX @@ static void gen_RCR(DisasContext *s, X86DecodedInsn *decode)
34
}
35
36
/* Save incoming carry into high, it will be shifted later. */
37
- if (!have_1bit_cin || TCG_TARGET_deposit_tl_valid(1, TARGET_LONG_BITS - 1)) {
38
+ if (!have_1bit_cin || tcg_op_deposit_valid(TCG_TYPE_TL, 1, TARGET_LONG_BITS - 1)) {
39
TCGv cin = have_1bit_cin ? decode->cc_dst : decode->cc_src;
40
tcg_gen_deposit_tl(high, cin, s->T0, 1, TARGET_LONG_BITS - 1);
41
} else {
42
--
43
2.43.0
44
45
diff view generated by jsdifflib
New patch
1
Do not reference TCG_TARGET_HAS_* directly.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/i386/tcg/emit.c.inc | 6 +++---
7
1 file changed, 3 insertions(+), 3 deletions(-)
8
9
diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/i386/tcg/emit.c.inc
12
+++ b/target/i386/tcg/emit.c.inc
13
@@ -XXX,XX +XXX,XX @@
14
* The exact opcode to check depends on 32- vs. 64-bit.
15
*/
16
#ifdef TARGET_X86_64
17
-#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i64
18
+#define INDEX_op_extract2_tl INDEX_op_extract2_i64
19
#else
20
-#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i32
21
+#define INDEX_op_extract2_tl INDEX_op_extract2_i32
22
#endif
23
24
#define MMX_OFFSET(reg) \
25
@@ -XXX,XX +XXX,XX @@ static void gen_PMOVMSKB(DisasContext *s, X86DecodedInsn *decode)
26
tcg_gen_ld8u_tl(s->T0, tcg_env, offsetof(CPUX86State, xmm_t0.ZMM_B(vec_len - 1)));
27
while (vec_len > 8) {
28
vec_len -= 8;
29
- if (TCG_TARGET_HAS_extract2_tl) {
30
+ if (tcg_op_supported(INDEX_op_extract2_tl, TCG_TYPE_TL, 0)) {
31
/*
32
* Load the next byte of the result into the high byte of T.
33
* TCG does a similar expansion of deposit to shl+extract2; by
34
--
35
2.43.0
36
37
diff view generated by jsdifflib
1
Use LPQ/STPQ when 16-byte atomicity is required.
1
Make these features unconditional, as they're used by most
2
Note that these instructions require 16-byte alignment.
2
tcg backends anyway. Merge tcg-ldst.c.inc and tcg-pool.c.inc
3
into tcg.c and mark some of the functions unused, so that
4
when the features are not used we won't get Werrors.
3
5
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
8
---
7
tcg/s390x/tcg-target-con-set.h | 2 +
9
include/tcg/tcg.h | 4 -
8
tcg/s390x/tcg-target.h | 2 +-
10
tcg/aarch64/tcg-target.h | 2 -
9
tcg/s390x/tcg-target.c.inc | 107 ++++++++++++++++++++++++++++++++-
11
tcg/arm/tcg-target.h | 2 -
10
3 files changed, 107 insertions(+), 4 deletions(-)
12
tcg/i386/tcg-target.h | 2 -
13
tcg/loongarch64/tcg-target.h | 2 -
14
tcg/mips/tcg-target.h | 2 -
15
tcg/ppc/tcg-target.h | 2 -
16
tcg/riscv/tcg-target.h | 3 -
17
tcg/s390x/tcg-target.h | 2 -
18
tcg/sparc64/tcg-target.h | 2 -
19
tcg/tcg.c | 211 +++++++++++++++++++++++++++++--
20
tcg/aarch64/tcg-target.c.inc | 2 -
21
tcg/arm/tcg-target.c.inc | 2 -
22
tcg/i386/tcg-target.c.inc | 3 -
23
tcg/loongarch64/tcg-target.c.inc | 9 +-
24
tcg/mips/tcg-target.c.inc | 3 -
25
tcg/ppc/tcg-target.c.inc | 2 -
26
tcg/riscv/tcg-target.c.inc | 3 -
27
tcg/s390x/tcg-target.c.inc | 2 -
28
tcg/sparc64/tcg-target.c.inc | 3 -
29
tcg/tcg-ldst.c.inc | 65 ----------
30
tcg/tcg-pool.c.inc | 162 ------------------------
31
tcg/tci/tcg-target.c.inc | 12 +-
32
23 files changed, 216 insertions(+), 286 deletions(-)
33
delete mode 100644 tcg/tcg-ldst.c.inc
34
delete mode 100644 tcg/tcg-pool.c.inc
11
35
12
diff --git a/tcg/s390x/tcg-target-con-set.h b/tcg/s390x/tcg-target-con-set.h
36
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
13
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
14
--- a/tcg/s390x/tcg-target-con-set.h
38
--- a/include/tcg/tcg.h
15
+++ b/tcg/s390x/tcg-target-con-set.h
39
+++ b/include/tcg/tcg.h
16
@@ -XXX,XX +XXX,XX @@ C_O0_I2(r, r)
40
@@ -XXX,XX +XXX,XX @@ struct TCGContext {
17
C_O0_I2(r, ri)
41
CPUState *cpu; /* *_trans */
18
C_O0_I2(r, rA)
42
19
C_O0_I2(v, r)
43
/* These structures are private to tcg-target.c.inc. */
20
+C_O0_I3(o, m, r)
44
-#ifdef TCG_TARGET_NEED_LDST_LABELS
21
C_O1_I1(r, r)
45
QSIMPLEQ_HEAD(, TCGLabelQemuLdst) ldst_labels;
22
C_O1_I1(v, r)
46
-#endif
23
C_O1_I1(v, v)
47
-#ifdef TCG_TARGET_NEED_POOL_LABELS
24
@@ -XXX,XX +XXX,XX @@ C_O1_I2(v, v, v)
48
struct TCGLabelPoolData *pool_labels;
25
C_O1_I3(v, v, v, v)
49
-#endif
26
C_O1_I4(r, r, ri, rI, r)
50
27
C_O1_I4(r, r, rA, rI, r)
51
TCGLabel *exitreq_label;
28
+C_O2_I1(o, m, r)
52
29
C_O2_I2(o, m, 0, r)
53
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
30
C_O2_I2(o, m, r, r)
54
index XXXXXXX..XXXXXXX 100644
31
C_O2_I3(o, m, 0, 1, r)
55
--- a/tcg/aarch64/tcg-target.h
56
+++ b/tcg/aarch64/tcg-target.h
57
@@ -XXX,XX +XXX,XX @@ typedef enum {
58
#define TCG_TARGET_HAS_tst_vec 1
59
60
#define TCG_TARGET_DEFAULT_MO (0)
61
-#define TCG_TARGET_NEED_LDST_LABELS
62
-#define TCG_TARGET_NEED_POOL_LABELS
63
64
#endif /* AARCH64_TCG_TARGET_H */
65
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
66
index XXXXXXX..XXXXXXX 100644
67
--- a/tcg/arm/tcg-target.h
68
+++ b/tcg/arm/tcg-target.h
69
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
70
#define TCG_TARGET_HAS_tst_vec 1
71
72
#define TCG_TARGET_DEFAULT_MO (0)
73
-#define TCG_TARGET_NEED_LDST_LABELS
74
-#define TCG_TARGET_NEED_POOL_LABELS
75
76
#endif
77
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
78
index XXXXXXX..XXXXXXX 100644
79
--- a/tcg/i386/tcg-target.h
80
+++ b/tcg/i386/tcg-target.h
81
@@ -XXX,XX +XXX,XX @@ typedef enum {
82
#include "tcg/tcg-mo.h"
83
84
#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
85
-#define TCG_TARGET_NEED_LDST_LABELS
86
-#define TCG_TARGET_NEED_POOL_LABELS
87
88
#endif
89
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
90
index XXXXXXX..XXXXXXX 100644
91
--- a/tcg/loongarch64/tcg-target.h
92
+++ b/tcg/loongarch64/tcg-target.h
93
@@ -XXX,XX +XXX,XX @@ typedef enum {
94
95
#define TCG_TARGET_DEFAULT_MO (0)
96
97
-#define TCG_TARGET_NEED_LDST_LABELS
98
-
99
#endif /* LOONGARCH_TCG_TARGET_H */
100
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
101
index XXXXXXX..XXXXXXX 100644
102
--- a/tcg/mips/tcg-target.h
103
+++ b/tcg/mips/tcg-target.h
104
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
105
#define TCG_TARGET_HAS_tst 0
106
107
#define TCG_TARGET_DEFAULT_MO 0
108
-#define TCG_TARGET_NEED_LDST_LABELS
109
-#define TCG_TARGET_NEED_POOL_LABELS
110
111
#endif
112
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
113
index XXXXXXX..XXXXXXX 100644
114
--- a/tcg/ppc/tcg-target.h
115
+++ b/tcg/ppc/tcg-target.h
116
@@ -XXX,XX +XXX,XX @@ typedef enum {
117
#define TCG_TARGET_HAS_tst_vec 0
118
119
#define TCG_TARGET_DEFAULT_MO (0)
120
-#define TCG_TARGET_NEED_LDST_LABELS
121
-#define TCG_TARGET_NEED_POOL_LABELS
122
123
#endif
124
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
125
index XXXXXXX..XXXXXXX 100644
126
--- a/tcg/riscv/tcg-target.h
127
+++ b/tcg/riscv/tcg-target.h
128
@@ -XXX,XX +XXX,XX @@ typedef enum {
129
130
#define TCG_TARGET_DEFAULT_MO (0)
131
132
-#define TCG_TARGET_NEED_LDST_LABELS
133
-#define TCG_TARGET_NEED_POOL_LABELS
134
-
135
#endif
32
diff --git a/tcg/s390x/tcg-target.h b/tcg/s390x/tcg-target.h
136
diff --git a/tcg/s390x/tcg-target.h b/tcg/s390x/tcg-target.h
33
index XXXXXXX..XXXXXXX 100644
137
index XXXXXXX..XXXXXXX 100644
34
--- a/tcg/s390x/tcg-target.h
138
--- a/tcg/s390x/tcg-target.h
35
+++ b/tcg/s390x/tcg-target.h
139
+++ b/tcg/s390x/tcg-target.h
36
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
140
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
37
#define TCG_TARGET_HAS_muluh_i64 0
141
#define TCG_TARGET_HAS_tst_vec 0
38
#define TCG_TARGET_HAS_mulsh_i64 0
142
39
143
#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
40
-#define TCG_TARGET_HAS_qemu_ldst_i128 0
144
-#define TCG_TARGET_NEED_LDST_LABELS
41
+#define TCG_TARGET_HAS_qemu_ldst_i128 1
145
-#define TCG_TARGET_NEED_POOL_LABELS
42
146
43
#define TCG_TARGET_HAS_v64 HAVE_FACILITY(VECTOR)
147
#endif
44
#define TCG_TARGET_HAS_v128 HAVE_FACILITY(VECTOR)
148
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
149
index XXXXXXX..XXXXXXX 100644
150
--- a/tcg/sparc64/tcg-target.h
151
+++ b/tcg/sparc64/tcg-target.h
152
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
153
#define TCG_AREG0 TCG_REG_I0
154
155
#define TCG_TARGET_DEFAULT_MO (0)
156
-#define TCG_TARGET_NEED_LDST_LABELS
157
-#define TCG_TARGET_NEED_POOL_LABELS
158
159
#endif
160
diff --git a/tcg/tcg.c b/tcg/tcg.c
161
index XXXXXXX..XXXXXXX 100644
162
--- a/tcg/tcg.c
163
+++ b/tcg/tcg.c
164
@@ -XXX,XX +XXX,XX @@ static void tcg_target_init(TCGContext *s);
165
static void tcg_target_qemu_prologue(TCGContext *s);
166
static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
167
intptr_t value, intptr_t addend);
168
+static void tcg_out_nop_fill(tcg_insn_unit *p, int count);
169
+
170
+typedef struct TCGLabelQemuLdst TCGLabelQemuLdst;
171
+static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
172
+static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
173
174
/* The CIE and FDE header definitions will be common to all hosts. */
175
typedef struct {
176
@@ -XXX,XX +XXX,XX @@ typedef struct QEMU_PACKED {
177
DebugFrameFDEHeader fde;
178
} DebugFrameHeader;
179
180
-typedef struct TCGLabelQemuLdst {
181
+struct TCGLabelQemuLdst {
182
bool is_ld; /* qemu_ld: true, qemu_st: false */
183
MemOpIdx oi;
184
TCGType type; /* result type of a load */
185
@@ -XXX,XX +XXX,XX @@ typedef struct TCGLabelQemuLdst {
186
const tcg_insn_unit *raddr; /* addr of the next IR of qemu_ld/st IR */
187
tcg_insn_unit *label_ptr[2]; /* label pointers to be updated */
188
QSIMPLEQ_ENTRY(TCGLabelQemuLdst) next;
189
-} TCGLabelQemuLdst;
190
+};
191
192
static void tcg_register_jit_int(const void *buf, size_t size,
193
const void *debug_frame,
194
@@ -XXX,XX +XXX,XX @@ static void tcg_out_call(TCGContext *s, const tcg_insn_unit *target,
195
static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot);
196
static bool tcg_target_const_match(int64_t val, int ct,
197
TCGType type, TCGCond cond, int vece);
198
-#ifdef TCG_TARGET_NEED_LDST_LABELS
199
-static int tcg_out_ldst_finalize(TCGContext *s);
200
-#endif
201
202
#ifndef CONFIG_USER_ONLY
203
#define guest_base ({ qemu_build_not_reached(); (uintptr_t)0; })
204
@@ -XXX,XX +XXX,XX @@ static void tcg_out_movext3(TCGContext *s, const TCGMovExtend *i1,
205
}
206
}
207
208
+/*
209
+ * Allocate a new TCGLabelQemuLdst entry.
210
+ */
211
+
212
+__attribute__((unused))
213
+static TCGLabelQemuLdst *new_ldst_label(TCGContext *s)
214
+{
215
+ TCGLabelQemuLdst *l = tcg_malloc(sizeof(*l));
216
+
217
+ memset(l, 0, sizeof(*l));
218
+ QSIMPLEQ_INSERT_TAIL(&s->ldst_labels, l, next);
219
+
220
+ return l;
221
+}
222
+
223
+/*
224
+ * Allocate new constant pool entries.
225
+ */
226
+
227
+typedef struct TCGLabelPoolData {
228
+ struct TCGLabelPoolData *next;
229
+ tcg_insn_unit *label;
230
+ intptr_t addend;
231
+ int rtype;
232
+ unsigned nlong;
233
+ tcg_target_ulong data[];
234
+} TCGLabelPoolData;
235
+
236
+static TCGLabelPoolData *new_pool_alloc(TCGContext *s, int nlong, int rtype,
237
+ tcg_insn_unit *label, intptr_t addend)
238
+{
239
+ TCGLabelPoolData *n = tcg_malloc(sizeof(TCGLabelPoolData)
240
+ + sizeof(tcg_target_ulong) * nlong);
241
+
242
+ n->label = label;
243
+ n->addend = addend;
244
+ n->rtype = rtype;
245
+ n->nlong = nlong;
246
+ return n;
247
+}
248
+
249
+static void new_pool_insert(TCGContext *s, TCGLabelPoolData *n)
250
+{
251
+ TCGLabelPoolData *i, **pp;
252
+ int nlong = n->nlong;
253
+
254
+ /* Insertion sort on the pool. */
255
+ for (pp = &s->pool_labels; (i = *pp) != NULL; pp = &i->next) {
256
+ if (nlong > i->nlong) {
257
+ break;
258
+ }
259
+ if (nlong < i->nlong) {
260
+ continue;
261
+ }
262
+ if (memcmp(n->data, i->data, sizeof(tcg_target_ulong) * nlong) >= 0) {
263
+ break;
264
+ }
265
+ }
266
+ n->next = *pp;
267
+ *pp = n;
268
+}
269
+
270
+/* The "usual" for generic integer code. */
271
+__attribute__((unused))
272
+static void new_pool_label(TCGContext *s, tcg_target_ulong d, int rtype,
273
+ tcg_insn_unit *label, intptr_t addend)
274
+{
275
+ TCGLabelPoolData *n = new_pool_alloc(s, 1, rtype, label, addend);
276
+ n->data[0] = d;
277
+ new_pool_insert(s, n);
278
+}
279
+
280
+/* For v64 or v128, depending on the host. */
281
+__attribute__((unused))
282
+static void new_pool_l2(TCGContext *s, int rtype, tcg_insn_unit *label,
283
+ intptr_t addend, tcg_target_ulong d0,
284
+ tcg_target_ulong d1)
285
+{
286
+ TCGLabelPoolData *n = new_pool_alloc(s, 2, rtype, label, addend);
287
+ n->data[0] = d0;
288
+ n->data[1] = d1;
289
+ new_pool_insert(s, n);
290
+}
291
+
292
+/* For v128 or v256, depending on the host. */
293
+__attribute__((unused))
294
+static void new_pool_l4(TCGContext *s, int rtype, tcg_insn_unit *label,
295
+ intptr_t addend, tcg_target_ulong d0,
296
+ tcg_target_ulong d1, tcg_target_ulong d2,
297
+ tcg_target_ulong d3)
298
+{
299
+ TCGLabelPoolData *n = new_pool_alloc(s, 4, rtype, label, addend);
300
+ n->data[0] = d0;
301
+ n->data[1] = d1;
302
+ n->data[2] = d2;
303
+ n->data[3] = d3;
304
+ new_pool_insert(s, n);
305
+}
306
+
307
+/* For v256, for 32-bit host. */
308
+__attribute__((unused))
309
+static void new_pool_l8(TCGContext *s, int rtype, tcg_insn_unit *label,
310
+ intptr_t addend, tcg_target_ulong d0,
311
+ tcg_target_ulong d1, tcg_target_ulong d2,
312
+ tcg_target_ulong d3, tcg_target_ulong d4,
313
+ tcg_target_ulong d5, tcg_target_ulong d6,
314
+ tcg_target_ulong d7)
315
+{
316
+ TCGLabelPoolData *n = new_pool_alloc(s, 8, rtype, label, addend);
317
+ n->data[0] = d0;
318
+ n->data[1] = d1;
319
+ n->data[2] = d2;
320
+ n->data[3] = d3;
321
+ n->data[4] = d4;
322
+ n->data[5] = d5;
323
+ n->data[6] = d6;
324
+ n->data[7] = d7;
325
+ new_pool_insert(s, n);
326
+}
327
+
328
+/*
329
+ * Generate TB finalization at the end of block
330
+ */
331
+
332
+static int tcg_out_ldst_finalize(TCGContext *s)
333
+{
334
+ TCGLabelQemuLdst *lb;
335
+
336
+ /* qemu_ld/st slow paths */
337
+ QSIMPLEQ_FOREACH(lb, &s->ldst_labels, next) {
338
+ if (lb->is_ld
339
+ ? !tcg_out_qemu_ld_slow_path(s, lb)
340
+ : !tcg_out_qemu_st_slow_path(s, lb)) {
341
+ return -2;
342
+ }
343
+
344
+ /*
345
+ * Test for (pending) buffer overflow. The assumption is that any
346
+ * one operation beginning below the high water mark cannot overrun
347
+ * the buffer completely. Thus we can test for overflow after
348
+ * generating code without having to check during generation.
349
+ */
350
+ if (unlikely((void *)s->code_ptr > s->code_gen_highwater)) {
351
+ return -1;
352
+ }
353
+ }
354
+ return 0;
355
+}
356
+
357
+static int tcg_out_pool_finalize(TCGContext *s)
358
+{
359
+ TCGLabelPoolData *p = s->pool_labels;
360
+ TCGLabelPoolData *l = NULL;
361
+ void *a;
362
+
363
+ if (p == NULL) {
364
+ return 0;
365
+ }
366
+
367
+ /*
368
+ * ??? Round up to qemu_icache_linesize, but then do not round
369
+ * again when allocating the next TranslationBlock structure.
370
+ */
371
+ a = (void *)ROUND_UP((uintptr_t)s->code_ptr,
372
+ sizeof(tcg_target_ulong) * p->nlong);
373
+ tcg_out_nop_fill(s->code_ptr, (tcg_insn_unit *)a - s->code_ptr);
374
+ s->data_gen_ptr = a;
375
+
376
+ for (; p != NULL; p = p->next) {
377
+ size_t size = sizeof(tcg_target_ulong) * p->nlong;
378
+ uintptr_t value;
379
+
380
+ if (!l || l->nlong != p->nlong || memcmp(l->data, p->data, size)) {
381
+ if (unlikely(a > s->code_gen_highwater)) {
382
+ return -1;
383
+ }
384
+ memcpy(a, p->data, size);
385
+ a += size;
386
+ l = p;
387
+ }
388
+
389
+ value = (uintptr_t)tcg_splitwx_to_rx(a) - size;
390
+ if (!patch_reloc(p->label, p->rtype, value, p->addend)) {
391
+ return -2;
392
+ }
393
+ }
394
+
395
+ s->code_ptr = a;
396
+ return 0;
397
+}
398
+
399
#define C_PFX1(P, A) P##A
400
#define C_PFX2(P, A, B) P##A##_##B
401
#define C_PFX3(P, A, B, C) P##A##_##B##_##C
402
@@ -XXX,XX +XXX,XX @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start)
403
s->code_ptr = s->code_buf;
404
s->data_gen_ptr = NULL;
405
406
-#ifdef TCG_TARGET_NEED_LDST_LABELS
407
QSIMPLEQ_INIT(&s->ldst_labels);
408
-#endif
409
-#ifdef TCG_TARGET_NEED_POOL_LABELS
410
s->pool_labels = NULL;
411
-#endif
412
413
start_words = s->insn_start_words;
414
s->gen_insn_data =
415
@@ -XXX,XX +XXX,XX @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start)
416
s->gen_insn_end_off[num_insns] = tcg_current_code_size(s);
417
418
/* Generate TB finalization at the end of block */
419
-#ifdef TCG_TARGET_NEED_LDST_LABELS
420
i = tcg_out_ldst_finalize(s);
421
if (i < 0) {
422
return i;
423
}
424
-#endif
425
-#ifdef TCG_TARGET_NEED_POOL_LABELS
426
i = tcg_out_pool_finalize(s);
427
if (i < 0) {
428
return i;
429
}
430
-#endif
431
if (!tcg_resolve_relocs(s)) {
432
return -2;
433
}
434
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
435
index XXXXXXX..XXXXXXX 100644
436
--- a/tcg/aarch64/tcg-target.c.inc
437
+++ b/tcg/aarch64/tcg-target.c.inc
438
@@ -XXX,XX +XXX,XX @@
439
* See the COPYING file in the top-level directory for details.
440
*/
441
442
-#include "../tcg-ldst.c.inc"
443
-#include "../tcg-pool.c.inc"
444
#include "qemu/bitops.h"
445
446
/* Used for function call generation. */
447
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
448
index XXXXXXX..XXXXXXX 100644
449
--- a/tcg/arm/tcg-target.c.inc
450
+++ b/tcg/arm/tcg-target.c.inc
451
@@ -XXX,XX +XXX,XX @@
452
*/
453
454
#include "elf.h"
455
-#include "../tcg-ldst.c.inc"
456
-#include "../tcg-pool.c.inc"
457
458
int arm_arch = __ARM_ARCH;
459
460
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
461
index XXXXXXX..XXXXXXX 100644
462
--- a/tcg/i386/tcg-target.c.inc
463
+++ b/tcg/i386/tcg-target.c.inc
464
@@ -XXX,XX +XXX,XX @@
465
* THE SOFTWARE.
466
*/
467
468
-#include "../tcg-ldst.c.inc"
469
-#include "../tcg-pool.c.inc"
470
-
471
/* Used for function call generation. */
472
#define TCG_TARGET_STACK_ALIGN 16
473
#if defined(_WIN64)
474
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
475
index XXXXXXX..XXXXXXX 100644
476
--- a/tcg/loongarch64/tcg-target.c.inc
477
+++ b/tcg/loongarch64/tcg-target.c.inc
478
@@ -XXX,XX +XXX,XX @@
479
* THE SOFTWARE.
480
*/
481
482
-#include "../tcg-ldst.c.inc"
483
#include <asm/hwcap.h>
484
485
/* used for function call generation */
486
@@ -XXX,XX +XXX,XX @@ static void tcg_out_tb_start(TCGContext *s)
487
/* nothing to do */
488
}
489
490
+static void tcg_out_nop_fill(tcg_insn_unit *p, int count)
491
+{
492
+ for (int i = 0; i < count; ++i) {
493
+ /* Canonical nop is andi r0,r0,0 */
494
+ p[i] = OPC_ANDI;
495
+ }
496
+}
497
+
498
static void tcg_target_init(TCGContext *s)
499
{
500
unsigned long hwcap = qemu_getauxval(AT_HWCAP);
501
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
502
index XXXXXXX..XXXXXXX 100644
503
--- a/tcg/mips/tcg-target.c.inc
504
+++ b/tcg/mips/tcg-target.c.inc
505
@@ -XXX,XX +XXX,XX @@
506
* THE SOFTWARE.
507
*/
508
509
-#include "../tcg-ldst.c.inc"
510
-#include "../tcg-pool.c.inc"
511
-
512
/* used for function call generation */
513
#define TCG_TARGET_STACK_ALIGN 16
514
#if _MIPS_SIM == _ABIO32
515
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
516
index XXXXXXX..XXXXXXX 100644
517
--- a/tcg/ppc/tcg-target.c.inc
518
+++ b/tcg/ppc/tcg-target.c.inc
519
@@ -XXX,XX +XXX,XX @@
520
*/
521
522
#include "elf.h"
523
-#include "../tcg-pool.c.inc"
524
-#include "../tcg-ldst.c.inc"
525
526
/*
527
* Standardize on the _CALL_FOO symbols used by GCC:
528
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
529
index XXXXXXX..XXXXXXX 100644
530
--- a/tcg/riscv/tcg-target.c.inc
531
+++ b/tcg/riscv/tcg-target.c.inc
532
@@ -XXX,XX +XXX,XX @@
533
* THE SOFTWARE.
534
*/
535
536
-#include "../tcg-ldst.c.inc"
537
-#include "../tcg-pool.c.inc"
538
-
539
/* Used for function call generation. */
540
#define TCG_REG_CALL_STACK TCG_REG_SP
541
#define TCG_TARGET_STACK_ALIGN 16
45
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
542
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
46
index XXXXXXX..XXXXXXX 100644
543
index XXXXXXX..XXXXXXX 100644
47
--- a/tcg/s390x/tcg-target.c.inc
544
--- a/tcg/s390x/tcg-target.c.inc
48
+++ b/tcg/s390x/tcg-target.c.inc
545
+++ b/tcg/s390x/tcg-target.c.inc
49
@@ -XXX,XX +XXX,XX @@ typedef enum S390Opcode {
546
@@ -XXX,XX +XXX,XX @@
50
RXY_LLGF = 0xe316,
547
* THE SOFTWARE.
51
RXY_LLGH = 0xe391,
548
*/
52
RXY_LMG = 0xeb04,
549
53
+ RXY_LPQ = 0xe38f,
550
-#include "../tcg-ldst.c.inc"
54
RXY_LRV = 0xe31e,
551
-#include "../tcg-pool.c.inc"
55
RXY_LRVG = 0xe30f,
552
#include "elf.h"
56
RXY_LRVH = 0xe31f,
553
57
@@ -XXX,XX +XXX,XX @@ typedef enum S390Opcode {
554
/* Used for function call generation. */
58
RXY_STG = 0xe324,
555
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
59
RXY_STHY = 0xe370,
556
index XXXXXXX..XXXXXXX 100644
60
RXY_STMG = 0xeb24,
557
--- a/tcg/sparc64/tcg-target.c.inc
61
+ RXY_STPQ = 0xe38e,
558
+++ b/tcg/sparc64/tcg-target.c.inc
62
RXY_STRV = 0xe33e,
559
@@ -XXX,XX +XXX,XX @@
63
RXY_STRVG = 0xe32f,
560
#error "unsupported code generation mode"
64
RXY_STRVH = 0xe33f,
561
#endif
65
@@ -XXX,XX +XXX,XX @@ typedef struct {
562
66
563
-#include "../tcg-ldst.c.inc"
67
bool tcg_target_has_memory_bswap(MemOp memop)
564
-#include "../tcg-pool.c.inc"
565
-
566
/* Used for function call generation. */
567
#define TCG_REG_CALL_STACK TCG_REG_O6
568
#define TCG_TARGET_STACK_BIAS 2047
569
diff --git a/tcg/tcg-ldst.c.inc b/tcg/tcg-ldst.c.inc
570
deleted file mode 100644
571
index XXXXXXX..XXXXXXX
572
--- a/tcg/tcg-ldst.c.inc
573
+++ /dev/null
574
@@ -XXX,XX +XXX,XX @@
575
-/*
576
- * TCG Backend Data: load-store optimization only.
577
- *
578
- * Permission is hereby granted, free of charge, to any person obtaining a copy
579
- * of this software and associated documentation files (the "Software"), to deal
580
- * in the Software without restriction, including without limitation the rights
581
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
582
- * copies of the Software, and to permit persons to whom the Software is
583
- * furnished to do so, subject to the following conditions:
584
- *
585
- * The above copyright notice and this permission notice shall be included in
586
- * all copies or substantial portions of the Software.
587
- *
588
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
589
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
590
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
591
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
592
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
593
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
594
- * THE SOFTWARE.
595
- */
596
-
597
-/*
598
- * Generate TB finalization at the end of block
599
- */
600
-
601
-static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
602
-static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
603
-
604
-static int tcg_out_ldst_finalize(TCGContext *s)
605
-{
606
- TCGLabelQemuLdst *lb;
607
-
608
- /* qemu_ld/st slow paths */
609
- QSIMPLEQ_FOREACH(lb, &s->ldst_labels, next) {
610
- if (lb->is_ld
611
- ? !tcg_out_qemu_ld_slow_path(s, lb)
612
- : !tcg_out_qemu_st_slow_path(s, lb)) {
613
- return -2;
614
- }
615
-
616
- /* Test for (pending) buffer overflow. The assumption is that any
617
- one operation beginning below the high water mark cannot overrun
618
- the buffer completely. Thus we can test for overflow after
619
- generating code without having to check during generation. */
620
- if (unlikely((void *)s->code_ptr > s->code_gen_highwater)) {
621
- return -1;
622
- }
623
- }
624
- return 0;
625
-}
626
-
627
-/*
628
- * Allocate a new TCGLabelQemuLdst entry.
629
- */
630
-
631
-static inline TCGLabelQemuLdst *new_ldst_label(TCGContext *s)
632
-{
633
- TCGLabelQemuLdst *l = tcg_malloc(sizeof(*l));
634
-
635
- memset(l, 0, sizeof(*l));
636
- QSIMPLEQ_INSERT_TAIL(&s->ldst_labels, l, next);
637
-
638
- return l;
639
-}
640
diff --git a/tcg/tcg-pool.c.inc b/tcg/tcg-pool.c.inc
641
deleted file mode 100644
642
index XXXXXXX..XXXXXXX
643
--- a/tcg/tcg-pool.c.inc
644
+++ /dev/null
645
@@ -XXX,XX +XXX,XX @@
646
-/*
647
- * TCG Backend Data: constant pool.
648
- *
649
- * Permission is hereby granted, free of charge, to any person obtaining a copy
650
- * of this software and associated documentation files (the "Software"), to deal
651
- * in the Software without restriction, including without limitation the rights
652
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
653
- * copies of the Software, and to permit persons to whom the Software is
654
- * furnished to do so, subject to the following conditions:
655
- *
656
- * The above copyright notice and this permission notice shall be included in
657
- * all copies or substantial portions of the Software.
658
- *
659
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
660
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
661
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
662
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
663
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
664
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
665
- * THE SOFTWARE.
666
- */
667
-
668
-typedef struct TCGLabelPoolData {
669
- struct TCGLabelPoolData *next;
670
- tcg_insn_unit *label;
671
- intptr_t addend;
672
- int rtype;
673
- unsigned nlong;
674
- tcg_target_ulong data[];
675
-} TCGLabelPoolData;
676
-
677
-
678
-static TCGLabelPoolData *new_pool_alloc(TCGContext *s, int nlong, int rtype,
679
- tcg_insn_unit *label, intptr_t addend)
680
-{
681
- TCGLabelPoolData *n = tcg_malloc(sizeof(TCGLabelPoolData)
682
- + sizeof(tcg_target_ulong) * nlong);
683
-
684
- n->label = label;
685
- n->addend = addend;
686
- n->rtype = rtype;
687
- n->nlong = nlong;
688
- return n;
689
-}
690
-
691
-static void new_pool_insert(TCGContext *s, TCGLabelPoolData *n)
692
-{
693
- TCGLabelPoolData *i, **pp;
694
- int nlong = n->nlong;
695
-
696
- /* Insertion sort on the pool. */
697
- for (pp = &s->pool_labels; (i = *pp) != NULL; pp = &i->next) {
698
- if (nlong > i->nlong) {
699
- break;
700
- }
701
- if (nlong < i->nlong) {
702
- continue;
703
- }
704
- if (memcmp(n->data, i->data, sizeof(tcg_target_ulong) * nlong) >= 0) {
705
- break;
706
- }
707
- }
708
- n->next = *pp;
709
- *pp = n;
710
-}
711
-
712
-/* The "usual" for generic integer code. */
713
-static inline void new_pool_label(TCGContext *s, tcg_target_ulong d, int rtype,
714
- tcg_insn_unit *label, intptr_t addend)
715
-{
716
- TCGLabelPoolData *n = new_pool_alloc(s, 1, rtype, label, addend);
717
- n->data[0] = d;
718
- new_pool_insert(s, n);
719
-}
720
-
721
-/* For v64 or v128, depending on the host. */
722
-static inline void new_pool_l2(TCGContext *s, int rtype, tcg_insn_unit *label,
723
- intptr_t addend, tcg_target_ulong d0,
724
- tcg_target_ulong d1)
725
-{
726
- TCGLabelPoolData *n = new_pool_alloc(s, 2, rtype, label, addend);
727
- n->data[0] = d0;
728
- n->data[1] = d1;
729
- new_pool_insert(s, n);
730
-}
731
-
732
-/* For v128 or v256, depending on the host. */
733
-static inline void new_pool_l4(TCGContext *s, int rtype, tcg_insn_unit *label,
734
- intptr_t addend, tcg_target_ulong d0,
735
- tcg_target_ulong d1, tcg_target_ulong d2,
736
- tcg_target_ulong d3)
737
-{
738
- TCGLabelPoolData *n = new_pool_alloc(s, 4, rtype, label, addend);
739
- n->data[0] = d0;
740
- n->data[1] = d1;
741
- n->data[2] = d2;
742
- n->data[3] = d3;
743
- new_pool_insert(s, n);
744
-}
745
-
746
-/* For v256, for 32-bit host. */
747
-static inline void new_pool_l8(TCGContext *s, int rtype, tcg_insn_unit *label,
748
- intptr_t addend, tcg_target_ulong d0,
749
- tcg_target_ulong d1, tcg_target_ulong d2,
750
- tcg_target_ulong d3, tcg_target_ulong d4,
751
- tcg_target_ulong d5, tcg_target_ulong d6,
752
- tcg_target_ulong d7)
753
-{
754
- TCGLabelPoolData *n = new_pool_alloc(s, 8, rtype, label, addend);
755
- n->data[0] = d0;
756
- n->data[1] = d1;
757
- n->data[2] = d2;
758
- n->data[3] = d3;
759
- n->data[4] = d4;
760
- n->data[5] = d5;
761
- n->data[6] = d6;
762
- n->data[7] = d7;
763
- new_pool_insert(s, n);
764
-}
765
-
766
-/* To be provided by cpu/tcg-target.c.inc. */
767
-static void tcg_out_nop_fill(tcg_insn_unit *p, int count);
768
-
769
-static int tcg_out_pool_finalize(TCGContext *s)
770
-{
771
- TCGLabelPoolData *p = s->pool_labels;
772
- TCGLabelPoolData *l = NULL;
773
- void *a;
774
-
775
- if (p == NULL) {
776
- return 0;
777
- }
778
-
779
- /* ??? Round up to qemu_icache_linesize, but then do not round
780
- again when allocating the next TranslationBlock structure. */
781
- a = (void *)ROUND_UP((uintptr_t)s->code_ptr,
782
- sizeof(tcg_target_ulong) * p->nlong);
783
- tcg_out_nop_fill(s->code_ptr, (tcg_insn_unit *)a - s->code_ptr);
784
- s->data_gen_ptr = a;
785
-
786
- for (; p != NULL; p = p->next) {
787
- size_t size = sizeof(tcg_target_ulong) * p->nlong;
788
- uintptr_t value;
789
-
790
- if (!l || l->nlong != p->nlong || memcmp(l->data, p->data, size)) {
791
- if (unlikely(a > s->code_gen_highwater)) {
792
- return -1;
793
- }
794
- memcpy(a, p->data, size);
795
- a += size;
796
- l = p;
797
- }
798
-
799
- value = (uintptr_t)tcg_splitwx_to_rx(a) - size;
800
- if (!patch_reloc(p->label, p->rtype, value, p->addend)) {
801
- return -2;
802
- }
803
- }
804
-
805
- s->code_ptr = a;
806
- return 0;
807
-}
808
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
809
index XXXXXXX..XXXXXXX 100644
810
--- a/tcg/tci/tcg-target.c.inc
811
+++ b/tcg/tci/tcg-target.c.inc
812
@@ -XXX,XX +XXX,XX @@
813
* THE SOFTWARE.
814
*/
815
816
-#include "../tcg-pool.c.inc"
817
-
818
/* Used for function call generation. */
819
#define TCG_TARGET_CALL_STACK_OFFSET 0
820
#define TCG_TARGET_STACK_ALIGN 8
821
@@ -XXX,XX +XXX,XX @@ bool tcg_target_has_memory_bswap(MemOp memop)
68
{
822
{
69
- return true;
823
return true;
70
+ TCGAtomAlign aa;
71
+
72
+ if ((memop & MO_SIZE) <= MO_64) {
73
+ return true;
74
+ }
75
+
76
+ /*
77
+ * Reject 16-byte memop with 16-byte atomicity,
78
+ * but do allow a pair of 64-bit operations.
79
+ */
80
+ aa = atom_and_align_for_opc(tcg_ctx, memop, MO_ATOM_IFALIGN, true);
81
+ return aa.atom <= MO_64;
82
}
824
}
83
825
+
84
static void tcg_out_qemu_ld_direct(TCGContext *s, MemOp opc, TCGReg data,
826
+static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
85
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
827
+{
86
{
828
+ g_assert_not_reached();
87
TCGLabelQemuLdst *ldst = NULL;
829
+}
88
MemOp opc = get_memop(oi);
830
+
89
+ MemOp s_bits = opc & MO_SIZE;
831
+static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
90
unsigned a_mask;
832
+{
91
833
+ g_assert_not_reached();
92
- h->aa = atom_and_align_for_opc(s, opc, MO_ATOM_IFALIGN, false);
834
+}
93
+ h->aa = atom_and_align_for_opc(s, opc, MO_ATOM_IFALIGN, s_bits == MO_128);
94
a_mask = (1 << h->aa.align) - 1;
95
96
#ifdef CONFIG_SOFTMMU
97
- unsigned s_bits = opc & MO_SIZE;
98
unsigned s_mask = (1 << s_bits) - 1;
99
int mem_index = get_mmuidx(oi);
100
int fast_off = TLB_MASK_TABLE_OFS(mem_index);
101
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_st(TCGContext* s, TCGReg data_reg, TCGReg addr_reg,
102
}
103
}
104
105
+static void tcg_out_qemu_ldst_i128(TCGContext *s, TCGReg datalo, TCGReg datahi,
106
+ TCGReg addr_reg, MemOpIdx oi, bool is_ld)
107
+{
108
+ TCGLabel *l1 = NULL, *l2 = NULL;
109
+ TCGLabelQemuLdst *ldst;
110
+ HostAddress h;
111
+ bool need_bswap;
112
+ bool use_pair;
113
+ S390Opcode insn;
114
+
115
+ ldst = prepare_host_addr(s, &h, addr_reg, oi, is_ld);
116
+
117
+ use_pair = h.aa.atom < MO_128;
118
+ need_bswap = get_memop(oi) & MO_BSWAP;
119
+
120
+ if (!use_pair) {
121
+ /*
122
+ * Atomicity requires we use LPQ. If we've already checked for
123
+ * 16-byte alignment, that's all we need. If we arrive with
124
+ * lesser alignment, we have determined that less than 16-byte
125
+ * alignment can be satisfied with two 8-byte loads.
126
+ */
127
+ if (h.aa.align < MO_128) {
128
+ use_pair = true;
129
+ l1 = gen_new_label();
130
+ l2 = gen_new_label();
131
+
132
+ tcg_out_insn(s, RI, TMLL, addr_reg, 15);
133
+ tgen_branch(s, 7, l1); /* CC in {1,2,3} */
134
+ }
135
+
136
+ tcg_debug_assert(!need_bswap);
137
+ tcg_debug_assert(datalo & 1);
138
+ tcg_debug_assert(datahi == datalo - 1);
139
+ insn = is_ld ? RXY_LPQ : RXY_STPQ;
140
+ tcg_out_insn_RXY(s, insn, datahi, h.base, h.index, h.disp);
141
+
142
+ if (use_pair) {
143
+ tgen_branch(s, S390_CC_ALWAYS, l2);
144
+ tcg_out_label(s, l1);
145
+ }
146
+ }
147
+ if (use_pair) {
148
+ TCGReg d1, d2;
149
+
150
+ if (need_bswap) {
151
+ d1 = datalo, d2 = datahi;
152
+ insn = is_ld ? RXY_LRVG : RXY_STRVG;
153
+ } else {
154
+ d1 = datahi, d2 = datalo;
155
+ insn = is_ld ? RXY_LG : RXY_STG;
156
+ }
157
+
158
+ if (h.base == d1 || h.index == d1) {
159
+ tcg_out_insn(s, RXY, LAY, TCG_TMP0, h.base, h.index, h.disp);
160
+ h.base = TCG_TMP0;
161
+ h.index = TCG_REG_NONE;
162
+ h.disp = 0;
163
+ }
164
+ tcg_out_insn_RXY(s, insn, d1, h.base, h.index, h.disp);
165
+ tcg_out_insn_RXY(s, insn, d2, h.base, h.index, h.disp + 8);
166
+ }
167
+ if (l2) {
168
+ tcg_out_label(s, l2);
169
+ }
170
+
171
+ if (ldst) {
172
+ ldst->type = TCG_TYPE_I128;
173
+ ldst->datalo_reg = datalo;
174
+ ldst->datahi_reg = datahi;
175
+ ldst->raddr = tcg_splitwx_to_rx(s->code_ptr);
176
+ }
177
+}
178
+
179
static void tcg_out_exit_tb(TCGContext *s, uintptr_t a0)
180
{
181
/* Reuse the zeroing that exists for goto_ptr. */
182
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
183
case INDEX_op_qemu_st_a64_i64:
184
tcg_out_qemu_st(s, args[0], args[1], args[2], TCG_TYPE_I64);
185
break;
186
+ case INDEX_op_qemu_ld_a32_i128:
187
+ case INDEX_op_qemu_ld_a64_i128:
188
+ tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], true);
189
+ break;
190
+ case INDEX_op_qemu_st_a32_i128:
191
+ case INDEX_op_qemu_st_a64_i128:
192
+ tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], false);
193
+ break;
194
195
case INDEX_op_ld16s_i64:
196
tcg_out_mem(s, 0, RXY_LGH, args[0], args[1], TCG_REG_NONE, args[2]);
197
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
198
case INDEX_op_qemu_st_a32_i32:
199
case INDEX_op_qemu_st_a64_i32:
200
return C_O0_I2(r, r);
201
+ case INDEX_op_qemu_ld_a32_i128:
202
+ case INDEX_op_qemu_ld_a64_i128:
203
+ return C_O2_I1(o, m, r);
204
+ case INDEX_op_qemu_st_a32_i128:
205
+ case INDEX_op_qemu_st_a64_i128:
206
+ return C_O0_I3(o, m, r);
207
208
case INDEX_op_deposit_i32:
209
case INDEX_op_deposit_i64:
210
--
835
--
211
2.34.1
836
2.43.0
837
838
diff view generated by jsdifflib
1
From: Peter Maydell <peter.maydell@linaro.org>
1
In addition, add empty files for mips, sparc64 and tci.
2
Make the include unconditional within tcg-opc.h.
2
3
3
Add some tests for various cases of named-field use, both ones that
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
should work and ones that should be diagnosed as errors.
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
include/tcg/tcg-opc.h | 4 +---
8
tcg/aarch64/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
9
tcg/arm/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
10
tcg/i386/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
11
tcg/loongarch64/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
12
tcg/mips/tcg-target-opc.h.inc | 1 +
13
tcg/ppc/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
14
tcg/riscv/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
15
tcg/s390x/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
16
tcg/sparc64/tcg-target-opc.h.inc | 1 +
17
tcg/tci/tcg-target-opc.h.inc | 1 +
18
11 files changed, 4 insertions(+), 3 deletions(-)
19
rename tcg/aarch64/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
20
rename tcg/arm/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
21
rename tcg/i386/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
22
rename tcg/loongarch64/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
23
create mode 100644 tcg/mips/tcg-target-opc.h.inc
24
rename tcg/ppc/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
25
rename tcg/riscv/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
26
rename tcg/s390x/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
27
create mode 100644 tcg/sparc64/tcg-target-opc.h.inc
28
create mode 100644 tcg/tci/tcg-target-opc.h.inc
5
29
6
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
30
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
31
index XXXXXXX..XXXXXXX 100644
8
Message-Id: <20230523120447.728365-7-peter.maydell@linaro.org>
32
--- a/include/tcg/tcg-opc.h
9
---
33
+++ b/include/tcg/tcg-opc.h
10
tests/decode/err_field10.decode | 7 +++++++
34
@@ -XXX,XX +XXX,XX @@ DEF(cmpsel_vec, 1, 4, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_cmpsel_vec))
11
tests/decode/err_field7.decode | 7 +++++++
35
12
tests/decode/err_field8.decode | 8 ++++++++
36
DEF(last_generic, 0, 0, 0, TCG_OPF_NOT_PRESENT)
13
tests/decode/err_field9.decode | 14 ++++++++++++++
37
14
tests/decode/succ_named_field.decode | 19 +++++++++++++++++++
38
-#if TCG_TARGET_MAYBE_vec
15
tests/decode/meson.build | 5 +++++
39
-#include "tcg-target.opc.h"
16
6 files changed, 60 insertions(+)
40
-#endif
17
create mode 100644 tests/decode/err_field10.decode
41
+#include "tcg-target-opc.h.inc"
18
create mode 100644 tests/decode/err_field7.decode
42
19
create mode 100644 tests/decode/err_field8.decode
43
#ifdef TCG_TARGET_INTERPRETER
20
create mode 100644 tests/decode/err_field9.decode
44
/* These opcodes are only for use between the tci generator and interpreter. */
21
create mode 100644 tests/decode/succ_named_field.decode
45
diff --git a/tcg/aarch64/tcg-target.opc.h b/tcg/aarch64/tcg-target-opc.h.inc
22
46
similarity index 100%
23
diff --git a/tests/decode/err_field10.decode b/tests/decode/err_field10.decode
47
rename from tcg/aarch64/tcg-target.opc.h
48
rename to tcg/aarch64/tcg-target-opc.h.inc
49
diff --git a/tcg/arm/tcg-target.opc.h b/tcg/arm/tcg-target-opc.h.inc
50
similarity index 100%
51
rename from tcg/arm/tcg-target.opc.h
52
rename to tcg/arm/tcg-target-opc.h.inc
53
diff --git a/tcg/i386/tcg-target.opc.h b/tcg/i386/tcg-target-opc.h.inc
54
similarity index 100%
55
rename from tcg/i386/tcg-target.opc.h
56
rename to tcg/i386/tcg-target-opc.h.inc
57
diff --git a/tcg/loongarch64/tcg-target.opc.h b/tcg/loongarch64/tcg-target-opc.h.inc
58
similarity index 100%
59
rename from tcg/loongarch64/tcg-target.opc.h
60
rename to tcg/loongarch64/tcg-target-opc.h.inc
61
diff --git a/tcg/mips/tcg-target-opc.h.inc b/tcg/mips/tcg-target-opc.h.inc
24
new file mode 100644
62
new file mode 100644
25
index XXXXXXX..XXXXXXX
63
index XXXXXXX..XXXXXXX
26
--- /dev/null
64
--- /dev/null
27
+++ b/tests/decode/err_field10.decode
65
+++ b/tcg/mips/tcg-target-opc.h.inc
28
@@ -XXX,XX +XXX,XX @@
66
@@ -0,0 +1 @@
29
+# This work is licensed under the terms of the GNU LGPL, version 2 or later.
67
+/* No target specific opcodes. */
30
+# See the COPYING.LIB file in the top-level directory.
68
diff --git a/tcg/ppc/tcg-target.opc.h b/tcg/ppc/tcg-target-opc.h.inc
31
+
69
similarity index 100%
32
+# Diagnose formats which refer to undefined fields
70
rename from tcg/ppc/tcg-target.opc.h
33
+%field1 field2:3
71
rename to tcg/ppc/tcg-target-opc.h.inc
34
+@fmt ........ ........ ........ ........ %field1
72
diff --git a/tcg/riscv/tcg-target.opc.h b/tcg/riscv/tcg-target-opc.h.inc
35
+insn 00000000 00000000 00000000 00000000 @fmt
73
similarity index 100%
36
diff --git a/tests/decode/err_field7.decode b/tests/decode/err_field7.decode
74
rename from tcg/riscv/tcg-target.opc.h
75
rename to tcg/riscv/tcg-target-opc.h.inc
76
diff --git a/tcg/s390x/tcg-target.opc.h b/tcg/s390x/tcg-target-opc.h.inc
77
similarity index 100%
78
rename from tcg/s390x/tcg-target.opc.h
79
rename to tcg/s390x/tcg-target-opc.h.inc
80
diff --git a/tcg/sparc64/tcg-target-opc.h.inc b/tcg/sparc64/tcg-target-opc.h.inc
37
new file mode 100644
81
new file mode 100644
38
index XXXXXXX..XXXXXXX
82
index XXXXXXX..XXXXXXX
39
--- /dev/null
83
--- /dev/null
40
+++ b/tests/decode/err_field7.decode
84
+++ b/tcg/sparc64/tcg-target-opc.h.inc
41
@@ -XXX,XX +XXX,XX @@
85
@@ -0,0 +1 @@
42
+# This work is licensed under the terms of the GNU LGPL, version 2 or later.
86
+/* No target specific opcodes. */
43
+# See the COPYING.LIB file in the top-level directory.
87
diff --git a/tcg/tci/tcg-target-opc.h.inc b/tcg/tci/tcg-target-opc.h.inc
44
+
45
+# Diagnose fields whose definitions form a loop
46
+%field1 field2:3
47
+%field2 field1:4
48
+insn 00000000 00000000 00000000 00000000 %field1 %field2
49
diff --git a/tests/decode/err_field8.decode b/tests/decode/err_field8.decode
50
new file mode 100644
88
new file mode 100644
51
index XXXXXXX..XXXXXXX
89
index XXXXXXX..XXXXXXX
52
--- /dev/null
90
--- /dev/null
53
+++ b/tests/decode/err_field8.decode
91
+++ b/tcg/tci/tcg-target-opc.h.inc
54
@@ -XXX,XX +XXX,XX @@
92
@@ -0,0 +1 @@
55
+# This work is licensed under the terms of the GNU LGPL, version 2 or later.
93
+/* No target specific opcodes. */
56
+# See the COPYING.LIB file in the top-level directory.
57
+
58
+# Diagnose patterns which refer to undefined fields
59
+&f1 f1 a
60
+%field1 field2:3
61
+@fmt ........ ........ ........ .... a:4 &f1
62
+insn 00000000 00000000 00000000 0000 .... @fmt f1=%field1
63
diff --git a/tests/decode/err_field9.decode b/tests/decode/err_field9.decode
64
new file mode 100644
65
index XXXXXXX..XXXXXXX
66
--- /dev/null
67
+++ b/tests/decode/err_field9.decode
68
@@ -XXX,XX +XXX,XX @@
69
+# This work is licensed under the terms of the GNU LGPL, version 2 or later.
70
+# See the COPYING.LIB file in the top-level directory.
71
+
72
+# Diagnose fields where the format refers to a field defined in the
73
+# pattern and the pattern refers to a field defined in the format.
74
+# This is theoretically not impossible to implement, but is not
75
+# supported by the script at this time.
76
+&abcd a b c d
77
+%refa a:3
78
+%refc c:4
79
+# Format defines 'c' and sets 'b' to an indirect ref to 'a'
80
+@fmt ........ ........ ........ c:8 &abcd b=%refa
81
+# Pattern defines 'a' and sets 'd' to an indirect ref to 'c'
82
+insn 00000000 00000000 00000000 ........ @fmt d=%refc a=6
83
diff --git a/tests/decode/succ_named_field.decode b/tests/decode/succ_named_field.decode
84
new file mode 100644
85
index XXXXXXX..XXXXXXX
86
--- /dev/null
87
+++ b/tests/decode/succ_named_field.decode
88
@@ -XXX,XX +XXX,XX @@
89
+# This work is licensed under the terms of the GNU LGPL, version 2 or later.
90
+# See the COPYING.LIB file in the top-level directory.
91
+
92
+# field using a named_field
93
+%imm_sz    8:8 sz:3
94
+insn 00000000 00000000 ........ 00000000 imm_sz=%imm_sz sz=1
95
+
96
+# Ditto, via a format. Here a field in the format
97
+# references a named field defined in the insn pattern:
98
+&imm_a imm alpha
99
+%foo 0:16 alpha:4
100
+@foo 00000001 ........ ........ ........ &imm_a imm=%foo
101
+i1 ........ 00000000 ........ ........ @foo alpha=1
102
+i2 ........ 00000001 ........ ........ @foo alpha=2
103
+
104
+# Here the named field is defined in the format and referenced
105
+# from the insn pattern:
106
+@bar 00000010 ........ ........ ........ &imm_a alpha=4
107
+i3 ........ 00000000 ........ ........ @bar imm=%foo
108
diff --git a/tests/decode/meson.build b/tests/decode/meson.build
109
index XXXXXXX..XXXXXXX 100644
110
--- a/tests/decode/meson.build
111
+++ b/tests/decode/meson.build
112
@@ -XXX,XX +XXX,XX @@ err_tests = [
113
'err_field4.decode',
114
'err_field5.decode',
115
'err_field6.decode',
116
+ 'err_field7.decode',
117
+ 'err_field8.decode',
118
+ 'err_field9.decode',
119
+ 'err_field10.decode',
120
'err_init1.decode',
121
'err_init2.decode',
122
'err_init3.decode',
123
@@ -XXX,XX +XXX,XX @@ succ_tests = [
124
'succ_argset_type1.decode',
125
'succ_function.decode',
126
'succ_ident1.decode',
127
+ 'succ_named_field.decode',
128
'succ_pattern_group_nest1.decode',
129
'succ_pattern_group_nest2.decode',
130
'succ_pattern_group_nest3.decode',
131
--
94
--
132
2.34.1
95
2.43.0
96
97
diff view generated by jsdifflib
New patch
1
Now that tcg-target-opc.h.inc is unconditional,
2
we can move these out of the generic header.
1
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
include/tcg/tcg-opc.h | 6 ------
8
tcg/tci/tcg-target-opc.h.inc | 5 ++++-
9
2 files changed, 4 insertions(+), 7 deletions(-)
10
11
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/include/tcg/tcg-opc.h
14
+++ b/include/tcg/tcg-opc.h
15
@@ -XXX,XX +XXX,XX @@ DEF(last_generic, 0, 0, 0, TCG_OPF_NOT_PRESENT)
16
17
#include "tcg-target-opc.h.inc"
18
19
-#ifdef TCG_TARGET_INTERPRETER
20
-/* These opcodes are only for use between the tci generator and interpreter. */
21
-DEF(tci_movi, 1, 0, 1, TCG_OPF_NOT_PRESENT)
22
-DEF(tci_movl, 1, 0, 1, TCG_OPF_NOT_PRESENT)
23
-#endif
24
-
25
#undef DATA64_ARGS
26
#undef IMPL
27
#undef IMPL64
28
diff --git a/tcg/tci/tcg-target-opc.h.inc b/tcg/tci/tcg-target-opc.h.inc
29
index XXXXXXX..XXXXXXX 100644
30
--- a/tcg/tci/tcg-target-opc.h.inc
31
+++ b/tcg/tci/tcg-target-opc.h.inc
32
@@ -1 +1,4 @@
33
-/* No target specific opcodes. */
34
+/* SPDX-License-Identifier: MIT */
35
+/* These opcodes for use between the tci generator and interpreter. */
36
+DEF(tci_movi, 1, 0, 1, TCG_OPF_NOT_PRESENT)
37
+DEF(tci_movl, 1, 0, 1, TCG_OPF_NOT_PRESENT)
38
--
39
2.43.0
40
41
diff view generated by jsdifflib
New patch
1
Don't reference TCG_TARGET_MAYBE_vec in a public header.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
include/tcg/tcg.h | 7 -------
7
tcg/tcg.c | 4 ++++
8
2 files changed, 4 insertions(+), 7 deletions(-)
9
10
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
11
index XXXXXXX..XXXXXXX 100644
12
--- a/include/tcg/tcg.h
13
+++ b/include/tcg/tcg.h
14
@@ -XXX,XX +XXX,XX @@ extern tcg_prologue_fn *tcg_qemu_tb_exec;
15
16
void tcg_register_jit(const void *buf, size_t buf_size);
17
18
-#if TCG_TARGET_MAYBE_vec
19
/* Return zero if the tuple (opc, type, vece) is unsupportable;
20
return > 0 if it is directly supportable;
21
return < 0 if we must call tcg_expand_vec_op. */
22
int tcg_can_emit_vec_op(TCGOpcode, TCGType, unsigned);
23
-#else
24
-static inline int tcg_can_emit_vec_op(TCGOpcode o, TCGType t, unsigned ve)
25
-{
26
- return 0;
27
-}
28
-#endif
29
30
/* Expand the tuple (opc, type, vece) on the given arguments. */
31
void tcg_expand_vec_op(TCGOpcode, TCGType, unsigned, TCGArg, ...);
32
diff --git a/tcg/tcg.c b/tcg/tcg.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/tcg/tcg.c
35
+++ b/tcg/tcg.c
36
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
37
{
38
g_assert_not_reached();
39
}
40
+int tcg_can_emit_vec_op(TCGOpcode o, TCGType t, unsigned ve)
41
+{
42
+ return 0;
43
+}
44
#endif
45
static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, TCGReg arg1,
46
intptr_t arg2);
47
--
48
2.43.0
49
50
diff view generated by jsdifflib
New patch
1
Left-over from commit 623d7e3551a ("util: Add cpuinfo-ppc.c").
1
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Message-ID: <20250108215156.8731-2-philmd@linaro.org>
6
---
7
tcg/ppc/tcg-target.h | 8 --------
8
1 file changed, 8 deletions(-)
9
10
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/ppc/tcg-target.h
13
+++ b/tcg/ppc/tcg-target.h
14
@@ -XXX,XX +XXX,XX @@ typedef enum {
15
TCG_AREG0 = TCG_REG_R27
16
} TCGReg;
17
18
-typedef enum {
19
- tcg_isa_base,
20
- tcg_isa_2_06,
21
- tcg_isa_2_07,
22
- tcg_isa_3_00,
23
- tcg_isa_3_10,
24
-} TCGPowerISA;
25
-
26
#define have_isa_2_06 (cpuinfo & CPUINFO_V2_06)
27
#define have_isa_2_07 (cpuinfo & CPUINFO_V2_07)
28
#define have_isa_3_00 (cpuinfo & CPUINFO_V3_0)
29
--
30
2.43.0
31
32
diff view generated by jsdifflib
New patch
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-3-philmd@linaro.org>
4
---
5
include/tcg/tcg.h | 105 +-----------------------------------------
6
tcg/tcg-has.h | 115 ++++++++++++++++++++++++++++++++++++++++++++++
7
2 files changed, 116 insertions(+), 104 deletions(-)
8
create mode 100644 tcg/tcg-has.h
1
9
10
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
11
index XXXXXXX..XXXXXXX 100644
12
--- a/include/tcg/tcg.h
13
+++ b/include/tcg/tcg.h
14
@@ -XXX,XX +XXX,XX @@ typedef uint64_t TCGRegSet;
15
#error unsupported
16
#endif
17
18
-#if TCG_TARGET_REG_BITS == 32
19
-/* Turn some undef macros into false macros. */
20
-#define TCG_TARGET_HAS_extr_i64_i32 0
21
-#define TCG_TARGET_HAS_div_i64 0
22
-#define TCG_TARGET_HAS_rem_i64 0
23
-#define TCG_TARGET_HAS_div2_i64 0
24
-#define TCG_TARGET_HAS_rot_i64 0
25
-#define TCG_TARGET_HAS_ext8s_i64 0
26
-#define TCG_TARGET_HAS_ext16s_i64 0
27
-#define TCG_TARGET_HAS_ext32s_i64 0
28
-#define TCG_TARGET_HAS_ext8u_i64 0
29
-#define TCG_TARGET_HAS_ext16u_i64 0
30
-#define TCG_TARGET_HAS_ext32u_i64 0
31
-#define TCG_TARGET_HAS_bswap16_i64 0
32
-#define TCG_TARGET_HAS_bswap32_i64 0
33
-#define TCG_TARGET_HAS_bswap64_i64 0
34
-#define TCG_TARGET_HAS_not_i64 0
35
-#define TCG_TARGET_HAS_andc_i64 0
36
-#define TCG_TARGET_HAS_orc_i64 0
37
-#define TCG_TARGET_HAS_eqv_i64 0
38
-#define TCG_TARGET_HAS_nand_i64 0
39
-#define TCG_TARGET_HAS_nor_i64 0
40
-#define TCG_TARGET_HAS_clz_i64 0
41
-#define TCG_TARGET_HAS_ctz_i64 0
42
-#define TCG_TARGET_HAS_ctpop_i64 0
43
-#define TCG_TARGET_HAS_deposit_i64 0
44
-#define TCG_TARGET_HAS_extract_i64 0
45
-#define TCG_TARGET_HAS_sextract_i64 0
46
-#define TCG_TARGET_HAS_extract2_i64 0
47
-#define TCG_TARGET_HAS_negsetcond_i64 0
48
-#define TCG_TARGET_HAS_add2_i64 0
49
-#define TCG_TARGET_HAS_sub2_i64 0
50
-#define TCG_TARGET_HAS_mulu2_i64 0
51
-#define TCG_TARGET_HAS_muls2_i64 0
52
-#define TCG_TARGET_HAS_muluh_i64 0
53
-#define TCG_TARGET_HAS_mulsh_i64 0
54
-/* Turn some undef macros into true macros. */
55
-#define TCG_TARGET_HAS_add2_i32 1
56
-#define TCG_TARGET_HAS_sub2_i32 1
57
-#endif
58
-
59
-#ifndef TCG_TARGET_deposit_i32_valid
60
-#define TCG_TARGET_deposit_i32_valid(ofs, len) 1
61
-#endif
62
-#ifndef TCG_TARGET_deposit_i64_valid
63
-#define TCG_TARGET_deposit_i64_valid(ofs, len) 1
64
-#endif
65
-#ifndef TCG_TARGET_extract_i32_valid
66
-#define TCG_TARGET_extract_i32_valid(ofs, len) 1
67
-#endif
68
-#ifndef TCG_TARGET_extract_i64_valid
69
-#define TCG_TARGET_extract_i64_valid(ofs, len) 1
70
-#endif
71
-
72
-/* Only one of DIV or DIV2 should be defined. */
73
-#if defined(TCG_TARGET_HAS_div_i32)
74
-#define TCG_TARGET_HAS_div2_i32 0
75
-#elif defined(TCG_TARGET_HAS_div2_i32)
76
-#define TCG_TARGET_HAS_div_i32 0
77
-#define TCG_TARGET_HAS_rem_i32 0
78
-#endif
79
-#if defined(TCG_TARGET_HAS_div_i64)
80
-#define TCG_TARGET_HAS_div2_i64 0
81
-#elif defined(TCG_TARGET_HAS_div2_i64)
82
-#define TCG_TARGET_HAS_div_i64 0
83
-#define TCG_TARGET_HAS_rem_i64 0
84
-#endif
85
-
86
-#if !defined(TCG_TARGET_HAS_v64) \
87
- && !defined(TCG_TARGET_HAS_v128) \
88
- && !defined(TCG_TARGET_HAS_v256)
89
-#define TCG_TARGET_MAYBE_vec 0
90
-#define TCG_TARGET_HAS_abs_vec 0
91
-#define TCG_TARGET_HAS_neg_vec 0
92
-#define TCG_TARGET_HAS_not_vec 0
93
-#define TCG_TARGET_HAS_andc_vec 0
94
-#define TCG_TARGET_HAS_orc_vec 0
95
-#define TCG_TARGET_HAS_nand_vec 0
96
-#define TCG_TARGET_HAS_nor_vec 0
97
-#define TCG_TARGET_HAS_eqv_vec 0
98
-#define TCG_TARGET_HAS_roti_vec 0
99
-#define TCG_TARGET_HAS_rots_vec 0
100
-#define TCG_TARGET_HAS_rotv_vec 0
101
-#define TCG_TARGET_HAS_shi_vec 0
102
-#define TCG_TARGET_HAS_shs_vec 0
103
-#define TCG_TARGET_HAS_shv_vec 0
104
-#define TCG_TARGET_HAS_mul_vec 0
105
-#define TCG_TARGET_HAS_sat_vec 0
106
-#define TCG_TARGET_HAS_minmax_vec 0
107
-#define TCG_TARGET_HAS_bitsel_vec 0
108
-#define TCG_TARGET_HAS_cmpsel_vec 0
109
-#define TCG_TARGET_HAS_tst_vec 0
110
-#else
111
-#define TCG_TARGET_MAYBE_vec 1
112
-#endif
113
-#ifndef TCG_TARGET_HAS_v64
114
-#define TCG_TARGET_HAS_v64 0
115
-#endif
116
-#ifndef TCG_TARGET_HAS_v128
117
-#define TCG_TARGET_HAS_v128 0
118
-#endif
119
-#ifndef TCG_TARGET_HAS_v256
120
-#define TCG_TARGET_HAS_v256 0
121
-#endif
122
+#include "tcg/tcg-has.h"
123
124
typedef enum TCGOpcode {
125
#define DEF(name, oargs, iargs, cargs, flags) INDEX_op_ ## name,
126
diff --git a/tcg/tcg-has.h b/tcg/tcg-has.h
127
new file mode 100644
128
index XXXXXXX..XXXXXXX
129
--- /dev/null
130
+++ b/tcg/tcg-has.h
131
@@ -XXX,XX +XXX,XX @@
132
+/* SPDX-License-Identifier: MIT */
133
+/*
134
+ * Define target-specific opcode support
135
+ * Copyright (c) 2024 Linaro, Ltd.
136
+ */
137
+
138
+#ifndef TCG_HAS_H
139
+#define TCG_HAS_H
140
+
141
+#if TCG_TARGET_REG_BITS == 32
142
+/* Turn some undef macros into false macros. */
143
+#define TCG_TARGET_HAS_extr_i64_i32 0
144
+#define TCG_TARGET_HAS_div_i64 0
145
+#define TCG_TARGET_HAS_rem_i64 0
146
+#define TCG_TARGET_HAS_div2_i64 0
147
+#define TCG_TARGET_HAS_rot_i64 0
148
+#define TCG_TARGET_HAS_ext8s_i64 0
149
+#define TCG_TARGET_HAS_ext16s_i64 0
150
+#define TCG_TARGET_HAS_ext32s_i64 0
151
+#define TCG_TARGET_HAS_ext8u_i64 0
152
+#define TCG_TARGET_HAS_ext16u_i64 0
153
+#define TCG_TARGET_HAS_ext32u_i64 0
154
+#define TCG_TARGET_HAS_bswap16_i64 0
155
+#define TCG_TARGET_HAS_bswap32_i64 0
156
+#define TCG_TARGET_HAS_bswap64_i64 0
157
+#define TCG_TARGET_HAS_not_i64 0
158
+#define TCG_TARGET_HAS_andc_i64 0
159
+#define TCG_TARGET_HAS_orc_i64 0
160
+#define TCG_TARGET_HAS_eqv_i64 0
161
+#define TCG_TARGET_HAS_nand_i64 0
162
+#define TCG_TARGET_HAS_nor_i64 0
163
+#define TCG_TARGET_HAS_clz_i64 0
164
+#define TCG_TARGET_HAS_ctz_i64 0
165
+#define TCG_TARGET_HAS_ctpop_i64 0
166
+#define TCG_TARGET_HAS_deposit_i64 0
167
+#define TCG_TARGET_HAS_extract_i64 0
168
+#define TCG_TARGET_HAS_sextract_i64 0
169
+#define TCG_TARGET_HAS_extract2_i64 0
170
+#define TCG_TARGET_HAS_negsetcond_i64 0
171
+#define TCG_TARGET_HAS_add2_i64 0
172
+#define TCG_TARGET_HAS_sub2_i64 0
173
+#define TCG_TARGET_HAS_mulu2_i64 0
174
+#define TCG_TARGET_HAS_muls2_i64 0
175
+#define TCG_TARGET_HAS_muluh_i64 0
176
+#define TCG_TARGET_HAS_mulsh_i64 0
177
+/* Turn some undef macros into true macros. */
178
+#define TCG_TARGET_HAS_add2_i32 1
179
+#define TCG_TARGET_HAS_sub2_i32 1
180
+#endif
181
+
182
+#ifndef TCG_TARGET_deposit_i32_valid
183
+#define TCG_TARGET_deposit_i32_valid(ofs, len) 1
184
+#endif
185
+#ifndef TCG_TARGET_deposit_i64_valid
186
+#define TCG_TARGET_deposit_i64_valid(ofs, len) 1
187
+#endif
188
+#ifndef TCG_TARGET_extract_i32_valid
189
+#define TCG_TARGET_extract_i32_valid(ofs, len) 1
190
+#endif
191
+#ifndef TCG_TARGET_extract_i64_valid
192
+#define TCG_TARGET_extract_i64_valid(ofs, len) 1
193
+#endif
194
+
195
+/* Only one of DIV or DIV2 should be defined. */
196
+#if defined(TCG_TARGET_HAS_div_i32)
197
+#define TCG_TARGET_HAS_div2_i32 0
198
+#elif defined(TCG_TARGET_HAS_div2_i32)
199
+#define TCG_TARGET_HAS_div_i32 0
200
+#define TCG_TARGET_HAS_rem_i32 0
201
+#endif
202
+#if defined(TCG_TARGET_HAS_div_i64)
203
+#define TCG_TARGET_HAS_div2_i64 0
204
+#elif defined(TCG_TARGET_HAS_div2_i64)
205
+#define TCG_TARGET_HAS_div_i64 0
206
+#define TCG_TARGET_HAS_rem_i64 0
207
+#endif
208
+
209
+#if !defined(TCG_TARGET_HAS_v64) \
210
+ && !defined(TCG_TARGET_HAS_v128) \
211
+ && !defined(TCG_TARGET_HAS_v256)
212
+#define TCG_TARGET_MAYBE_vec 0
213
+#define TCG_TARGET_HAS_abs_vec 0
214
+#define TCG_TARGET_HAS_neg_vec 0
215
+#define TCG_TARGET_HAS_not_vec 0
216
+#define TCG_TARGET_HAS_andc_vec 0
217
+#define TCG_TARGET_HAS_orc_vec 0
218
+#define TCG_TARGET_HAS_nand_vec 0
219
+#define TCG_TARGET_HAS_nor_vec 0
220
+#define TCG_TARGET_HAS_eqv_vec 0
221
+#define TCG_TARGET_HAS_roti_vec 0
222
+#define TCG_TARGET_HAS_rots_vec 0
223
+#define TCG_TARGET_HAS_rotv_vec 0
224
+#define TCG_TARGET_HAS_shi_vec 0
225
+#define TCG_TARGET_HAS_shs_vec 0
226
+#define TCG_TARGET_HAS_shv_vec 0
227
+#define TCG_TARGET_HAS_mul_vec 0
228
+#define TCG_TARGET_HAS_sat_vec 0
229
+#define TCG_TARGET_HAS_minmax_vec 0
230
+#define TCG_TARGET_HAS_bitsel_vec 0
231
+#define TCG_TARGET_HAS_cmpsel_vec 0
232
+#define TCG_TARGET_HAS_tst_vec 0
233
+#else
234
+#define TCG_TARGET_MAYBE_vec 1
235
+#endif
236
+#ifndef TCG_TARGET_HAS_v64
237
+#define TCG_TARGET_HAS_v64 0
238
+#endif
239
+#ifndef TCG_TARGET_HAS_v128
240
+#define TCG_TARGET_HAS_v128 0
241
+#endif
242
+#ifndef TCG_TARGET_HAS_v256
243
+#define TCG_TARGET_HAS_v256 0
244
+#endif
245
+
246
+#endif
247
--
248
2.43.0
249
250
diff view generated by jsdifflib
1
With FEAT_LSE2, LDP/STP suffices. Without FEAT_LSE2, use LDXP+STXP
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
16-byte atomicity is required and LDP/STP otherwise.
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-4-philmd@linaro.org>
4
---
5
tcg/aarch64/tcg-target-has.h | 119 +++++++++++++++++++++++++++++++++++
6
tcg/aarch64/tcg-target.h | 109 +-------------------------------
7
2 files changed, 120 insertions(+), 108 deletions(-)
8
create mode 100644 tcg/aarch64/tcg-target-has.h
3
9
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
10
diff --git a/tcg/aarch64/tcg-target-has.h b/tcg/aarch64/tcg-target-has.h
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
new file mode 100644
6
---
12
index XXXXXXX..XXXXXXX
7
tcg/aarch64/tcg-target-con-set.h | 2 +
13
--- /dev/null
8
tcg/aarch64/tcg-target.h | 11 ++-
14
+++ b/tcg/aarch64/tcg-target-has.h
9
tcg/aarch64/tcg-target.c.inc | 141 ++++++++++++++++++++++++++++++-
15
@@ -XXX,XX +XXX,XX @@
10
3 files changed, 151 insertions(+), 3 deletions(-)
16
+/* SPDX-License-Identifier: GPL-2.0-or-later */
11
17
+/*
12
diff --git a/tcg/aarch64/tcg-target-con-set.h b/tcg/aarch64/tcg-target-con-set.h
18
+ * Define target-specific opcode support
13
index XXXXXXX..XXXXXXX 100644
19
+ * Copyright (c) 2013 Huawei Technologies Duesseldorf GmbH
14
--- a/tcg/aarch64/tcg-target-con-set.h
20
+ */
15
+++ b/tcg/aarch64/tcg-target-con-set.h
21
+
16
@@ -XXX,XX +XXX,XX @@ C_O0_I1(r)
22
+#ifndef TCG_TARGET_HAS_H
17
C_O0_I2(r, rA)
23
+#define TCG_TARGET_HAS_H
18
C_O0_I2(rZ, r)
24
+
19
C_O0_I2(w, r)
25
+#include "host/cpuinfo.h"
20
+C_O0_I3(rZ, rZ, r)
26
+
21
C_O1_I1(r, r)
27
+#define have_lse (cpuinfo & CPUINFO_LSE)
22
C_O1_I1(w, r)
28
+#define have_lse2 (cpuinfo & CPUINFO_LSE2)
23
C_O1_I1(w, w)
29
+
24
@@ -XXX,XX +XXX,XX @@ C_O1_I2(w, w, wO)
30
+/* optional instructions */
25
C_O1_I2(w, w, wZ)
31
+#define TCG_TARGET_HAS_div_i32 1
26
C_O1_I3(w, w, w, w)
32
+#define TCG_TARGET_HAS_rem_i32 1
27
C_O1_I4(r, r, rA, rZ, rZ)
33
+#define TCG_TARGET_HAS_ext8s_i32 1
28
+C_O2_I1(r, r, r)
34
+#define TCG_TARGET_HAS_ext16s_i32 1
29
C_O2_I4(r, r, rZ, rZ, rA, rMZ)
35
+#define TCG_TARGET_HAS_ext8u_i32 1
30
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
36
+#define TCG_TARGET_HAS_ext16u_i32 1
31
index XXXXXXX..XXXXXXX 100644
37
+#define TCG_TARGET_HAS_bswap16_i32 1
32
--- a/tcg/aarch64/tcg-target.h
38
+#define TCG_TARGET_HAS_bswap32_i32 1
33
+++ b/tcg/aarch64/tcg-target.h
39
+#define TCG_TARGET_HAS_not_i32 1
34
@@ -XXX,XX +XXX,XX @@ typedef enum {
40
+#define TCG_TARGET_HAS_rot_i32 1
35
#define TCG_TARGET_HAS_muluh_i64 1
41
+#define TCG_TARGET_HAS_andc_i32 1
36
#define TCG_TARGET_HAS_mulsh_i64 1
42
+#define TCG_TARGET_HAS_orc_i32 1
37
43
+#define TCG_TARGET_HAS_eqv_i32 1
38
-#define TCG_TARGET_HAS_qemu_ldst_i128 0
44
+#define TCG_TARGET_HAS_nand_i32 0
45
+#define TCG_TARGET_HAS_nor_i32 0
46
+#define TCG_TARGET_HAS_clz_i32 1
47
+#define TCG_TARGET_HAS_ctz_i32 1
48
+#define TCG_TARGET_HAS_ctpop_i32 0
49
+#define TCG_TARGET_HAS_deposit_i32 1
50
+#define TCG_TARGET_HAS_extract_i32 1
51
+#define TCG_TARGET_HAS_sextract_i32 1
52
+#define TCG_TARGET_HAS_extract2_i32 1
53
+#define TCG_TARGET_HAS_negsetcond_i32 1
54
+#define TCG_TARGET_HAS_add2_i32 1
55
+#define TCG_TARGET_HAS_sub2_i32 1
56
+#define TCG_TARGET_HAS_mulu2_i32 0
57
+#define TCG_TARGET_HAS_muls2_i32 0
58
+#define TCG_TARGET_HAS_muluh_i32 0
59
+#define TCG_TARGET_HAS_mulsh_i32 0
60
+#define TCG_TARGET_HAS_extr_i64_i32 0
61
+#define TCG_TARGET_HAS_qemu_st8_i32 0
62
+
63
+#define TCG_TARGET_HAS_div_i64 1
64
+#define TCG_TARGET_HAS_rem_i64 1
65
+#define TCG_TARGET_HAS_ext8s_i64 1
66
+#define TCG_TARGET_HAS_ext16s_i64 1
67
+#define TCG_TARGET_HAS_ext32s_i64 1
68
+#define TCG_TARGET_HAS_ext8u_i64 1
69
+#define TCG_TARGET_HAS_ext16u_i64 1
70
+#define TCG_TARGET_HAS_ext32u_i64 1
71
+#define TCG_TARGET_HAS_bswap16_i64 1
72
+#define TCG_TARGET_HAS_bswap32_i64 1
73
+#define TCG_TARGET_HAS_bswap64_i64 1
74
+#define TCG_TARGET_HAS_not_i64 1
75
+#define TCG_TARGET_HAS_rot_i64 1
76
+#define TCG_TARGET_HAS_andc_i64 1
77
+#define TCG_TARGET_HAS_orc_i64 1
78
+#define TCG_TARGET_HAS_eqv_i64 1
79
+#define TCG_TARGET_HAS_nand_i64 0
80
+#define TCG_TARGET_HAS_nor_i64 0
81
+#define TCG_TARGET_HAS_clz_i64 1
82
+#define TCG_TARGET_HAS_ctz_i64 1
83
+#define TCG_TARGET_HAS_ctpop_i64 0
84
+#define TCG_TARGET_HAS_deposit_i64 1
85
+#define TCG_TARGET_HAS_extract_i64 1
86
+#define TCG_TARGET_HAS_sextract_i64 1
87
+#define TCG_TARGET_HAS_extract2_i64 1
88
+#define TCG_TARGET_HAS_negsetcond_i64 1
89
+#define TCG_TARGET_HAS_add2_i64 1
90
+#define TCG_TARGET_HAS_sub2_i64 1
91
+#define TCG_TARGET_HAS_mulu2_i64 0
92
+#define TCG_TARGET_HAS_muls2_i64 0
93
+#define TCG_TARGET_HAS_muluh_i64 1
94
+#define TCG_TARGET_HAS_mulsh_i64 1
95
+
39
+/*
96
+/*
40
+ * Without FEAT_LSE2, we must use LDXP+STXP to implement atomic 128-bit load,
97
+ * Without FEAT_LSE2, we must use LDXP+STXP to implement atomic 128-bit load,
41
+ * which requires writable pages. We must defer to the helper for user-only,
98
+ * which requires writable pages. We must defer to the helper for user-only,
42
+ * but in system mode all ram is writable for the host.
99
+ * but in system mode all ram is writable for the host.
43
+ */
100
+ */
44
+#ifdef CONFIG_USER_ONLY
101
+#ifdef CONFIG_USER_ONLY
45
+#define TCG_TARGET_HAS_qemu_ldst_i128 have_lse2
102
+#define TCG_TARGET_HAS_qemu_ldst_i128 have_lse2
46
+#else
103
+#else
47
+#define TCG_TARGET_HAS_qemu_ldst_i128 1
104
+#define TCG_TARGET_HAS_qemu_ldst_i128 1
48
+#endif
105
+#endif
49
106
+
50
#define TCG_TARGET_HAS_v64 1
107
+#define TCG_TARGET_HAS_tst 1
51
#define TCG_TARGET_HAS_v128 1
108
+
52
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
109
+#define TCG_TARGET_HAS_v64 1
110
+#define TCG_TARGET_HAS_v128 1
111
+#define TCG_TARGET_HAS_v256 0
112
+
113
+#define TCG_TARGET_HAS_andc_vec 1
114
+#define TCG_TARGET_HAS_orc_vec 1
115
+#define TCG_TARGET_HAS_nand_vec 0
116
+#define TCG_TARGET_HAS_nor_vec 0
117
+#define TCG_TARGET_HAS_eqv_vec 0
118
+#define TCG_TARGET_HAS_not_vec 1
119
+#define TCG_TARGET_HAS_neg_vec 1
120
+#define TCG_TARGET_HAS_abs_vec 1
121
+#define TCG_TARGET_HAS_roti_vec 0
122
+#define TCG_TARGET_HAS_rots_vec 0
123
+#define TCG_TARGET_HAS_rotv_vec 0
124
+#define TCG_TARGET_HAS_shi_vec 1
125
+#define TCG_TARGET_HAS_shs_vec 0
126
+#define TCG_TARGET_HAS_shv_vec 1
127
+#define TCG_TARGET_HAS_mul_vec 1
128
+#define TCG_TARGET_HAS_sat_vec 1
129
+#define TCG_TARGET_HAS_minmax_vec 1
130
+#define TCG_TARGET_HAS_bitsel_vec 1
131
+#define TCG_TARGET_HAS_cmpsel_vec 0
132
+#define TCG_TARGET_HAS_tst_vec 1
133
+
134
+#endif
135
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
53
index XXXXXXX..XXXXXXX 100644
136
index XXXXXXX..XXXXXXX 100644
54
--- a/tcg/aarch64/tcg-target.c.inc
137
--- a/tcg/aarch64/tcg-target.h
55
+++ b/tcg/aarch64/tcg-target.c.inc
138
+++ b/tcg/aarch64/tcg-target.h
139
@@ -XXX,XX +XXX,XX @@
140
#ifndef AARCH64_TCG_TARGET_H
141
#define AARCH64_TCG_TARGET_H
142
143
-#include "host/cpuinfo.h"
144
-
145
#define TCG_TARGET_INSN_UNIT_SIZE 4
146
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
147
56
@@ -XXX,XX +XXX,XX @@ typedef enum {
148
@@ -XXX,XX +XXX,XX @@ typedef enum {
57
I3305_LDR_v64 = 0x5c000000,
149
58
I3305_LDR_v128 = 0x9c000000,
150
#define TCG_TARGET_NB_REGS 64
59
151
60
+ /* Load/store exclusive. */
152
-#define have_lse (cpuinfo & CPUINFO_LSE)
61
+ I3306_LDXP = 0xc8600000,
153
-#define have_lse2 (cpuinfo & CPUINFO_LSE2)
62
+ I3306_STXP = 0xc8200000,
154
-
63
+
155
-/* optional instructions */
64
/* Load/store register. Described here as 3.3.12, but the helper
156
-#define TCG_TARGET_HAS_div_i32 1
65
that emits them can transform to 3.3.10 or 3.3.13. */
157
-#define TCG_TARGET_HAS_rem_i32 1
66
I3312_STRB = 0x38000000 | LDST_ST << 22 | MO_8 << 30,
158
-#define TCG_TARGET_HAS_ext8s_i32 1
67
@@ -XXX,XX +XXX,XX @@ typedef enum {
159
-#define TCG_TARGET_HAS_ext16s_i32 1
68
I3406_ADR = 0x10000000,
160
-#define TCG_TARGET_HAS_ext8u_i32 1
69
I3406_ADRP = 0x90000000,
161
-#define TCG_TARGET_HAS_ext16u_i32 1
70
162
-#define TCG_TARGET_HAS_bswap16_i32 1
71
+ /* Add/subtract extended register instructions. */
163
-#define TCG_TARGET_HAS_bswap32_i32 1
72
+ I3501_ADD = 0x0b200000,
164
-#define TCG_TARGET_HAS_not_i32 1
73
+
165
-#define TCG_TARGET_HAS_rot_i32 1
74
/* Add/subtract shifted register instructions (without a shift). */
166
-#define TCG_TARGET_HAS_andc_i32 1
75
I3502_ADD = 0x0b000000,
167
-#define TCG_TARGET_HAS_orc_i32 1
76
I3502_ADDS = 0x2b000000,
168
-#define TCG_TARGET_HAS_eqv_i32 1
77
@@ -XXX,XX +XXX,XX @@ static void tcg_out_insn_3305(TCGContext *s, AArch64Insn insn,
169
-#define TCG_TARGET_HAS_nand_i32 0
78
tcg_out32(s, insn | (imm19 & 0x7ffff) << 5 | rt);
170
-#define TCG_TARGET_HAS_nor_i32 0
79
}
171
-#define TCG_TARGET_HAS_clz_i32 1
80
172
-#define TCG_TARGET_HAS_ctz_i32 1
81
+static void tcg_out_insn_3306(TCGContext *s, AArch64Insn insn, TCGReg rs,
173
-#define TCG_TARGET_HAS_ctpop_i32 0
82
+ TCGReg rt, TCGReg rt2, TCGReg rn)
174
-#define TCG_TARGET_HAS_deposit_i32 1
83
+{
175
-#define TCG_TARGET_HAS_extract_i32 1
84
+ tcg_out32(s, insn | rs << 16 | rt2 << 10 | rn << 5 | rt);
176
-#define TCG_TARGET_HAS_sextract_i32 1
85
+}
177
-#define TCG_TARGET_HAS_extract2_i32 1
86
+
178
-#define TCG_TARGET_HAS_negsetcond_i32 1
87
static void tcg_out_insn_3201(TCGContext *s, AArch64Insn insn, TCGType ext,
179
-#define TCG_TARGET_HAS_add2_i32 1
88
TCGReg rt, int imm19)
180
-#define TCG_TARGET_HAS_sub2_i32 1
89
{
181
-#define TCG_TARGET_HAS_mulu2_i32 0
90
@@ -XXX,XX +XXX,XX @@ static void tcg_out_insn_3406(TCGContext *s, AArch64Insn insn,
182
-#define TCG_TARGET_HAS_muls2_i32 0
91
tcg_out32(s, insn | (disp & 3) << 29 | (disp & 0x1ffffc) << (5 - 2) | rd);
183
-#define TCG_TARGET_HAS_muluh_i32 0
92
}
184
-#define TCG_TARGET_HAS_mulsh_i32 0
93
185
-#define TCG_TARGET_HAS_extr_i64_i32 0
94
+static inline void tcg_out_insn_3501(TCGContext *s, AArch64Insn insn,
186
-#define TCG_TARGET_HAS_qemu_st8_i32 0
95
+ TCGType sf, TCGReg rd, TCGReg rn,
187
-
96
+ TCGReg rm, int opt, int imm3)
188
-#define TCG_TARGET_HAS_div_i64 1
97
+{
189
-#define TCG_TARGET_HAS_rem_i64 1
98
+ tcg_out32(s, insn | sf << 31 | rm << 16 | opt << 13 |
190
-#define TCG_TARGET_HAS_ext8s_i64 1
99
+ imm3 << 10 | rn << 5 | rd);
191
-#define TCG_TARGET_HAS_ext16s_i64 1
100
+}
192
-#define TCG_TARGET_HAS_ext32s_i64 1
101
+
193
-#define TCG_TARGET_HAS_ext8u_i64 1
102
/* This function is for both 3.5.2 (Add/Subtract shifted register), for
194
-#define TCG_TARGET_HAS_ext16u_i64 1
103
the rare occasion when we actually want to supply a shift amount. */
195
-#define TCG_TARGET_HAS_ext32u_i64 1
104
static inline void tcg_out_insn_3502S(TCGContext *s, AArch64Insn insn,
196
-#define TCG_TARGET_HAS_bswap16_i64 1
105
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
197
-#define TCG_TARGET_HAS_bswap32_i64 1
106
TCGType addr_type = s->addr_type;
198
-#define TCG_TARGET_HAS_bswap64_i64 1
107
TCGLabelQemuLdst *ldst = NULL;
199
-#define TCG_TARGET_HAS_not_i64 1
108
MemOp opc = get_memop(oi);
200
-#define TCG_TARGET_HAS_rot_i64 1
109
+ MemOp s_bits = opc & MO_SIZE;
201
-#define TCG_TARGET_HAS_andc_i64 1
110
unsigned a_mask;
202
-#define TCG_TARGET_HAS_orc_i64 1
111
203
-#define TCG_TARGET_HAS_eqv_i64 1
112
h->aa = atom_and_align_for_opc(s, opc,
204
-#define TCG_TARGET_HAS_nand_i64 0
113
have_lse2 ? MO_ATOM_WITHIN16
205
-#define TCG_TARGET_HAS_nor_i64 0
114
: MO_ATOM_IFALIGN,
206
-#define TCG_TARGET_HAS_clz_i64 1
115
- false);
207
-#define TCG_TARGET_HAS_ctz_i64 1
116
+ s_bits == MO_128);
208
-#define TCG_TARGET_HAS_ctpop_i64 0
117
a_mask = (1 << h->aa.align) - 1;
209
-#define TCG_TARGET_HAS_deposit_i64 1
118
210
-#define TCG_TARGET_HAS_extract_i64 1
119
#ifdef CONFIG_SOFTMMU
211
-#define TCG_TARGET_HAS_sextract_i64 1
120
- unsigned s_bits = opc & MO_SIZE;
212
-#define TCG_TARGET_HAS_extract2_i64 1
121
unsigned s_mask = (1u << s_bits) - 1;
213
-#define TCG_TARGET_HAS_negsetcond_i64 1
122
unsigned mem_index = get_mmuidx(oi);
214
-#define TCG_TARGET_HAS_add2_i64 1
123
TCGReg addr_adj;
215
-#define TCG_TARGET_HAS_sub2_i64 1
124
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_st(TCGContext *s, TCGReg data_reg, TCGReg addr_reg,
216
-#define TCG_TARGET_HAS_mulu2_i64 0
125
}
217
-#define TCG_TARGET_HAS_muls2_i64 0
126
}
218
-#define TCG_TARGET_HAS_muluh_i64 1
127
219
-#define TCG_TARGET_HAS_mulsh_i64 1
128
+static void tcg_out_qemu_ldst_i128(TCGContext *s, TCGReg datalo, TCGReg datahi,
220
-
129
+ TCGReg addr_reg, MemOpIdx oi, bool is_ld)
221
-/*
130
+{
222
- * Without FEAT_LSE2, we must use LDXP+STXP to implement atomic 128-bit load,
131
+ TCGLabelQemuLdst *ldst;
223
- * which requires writable pages. We must defer to the helper for user-only,
132
+ HostAddress h;
224
- * but in system mode all ram is writable for the host.
133
+ TCGReg base;
225
- */
134
+ bool use_pair;
226
-#ifdef CONFIG_USER_ONLY
135
+
227
-#define TCG_TARGET_HAS_qemu_ldst_i128 have_lse2
136
+ ldst = prepare_host_addr(s, &h, addr_reg, oi, is_ld);
228
-#else
137
+
229
-#define TCG_TARGET_HAS_qemu_ldst_i128 1
138
+ /* Compose the final address, as LDP/STP have no indexing. */
230
-#endif
139
+ if (h.index == TCG_REG_XZR) {
231
-
140
+ base = h.base;
232
-#define TCG_TARGET_HAS_tst 1
141
+ } else {
233
-
142
+ base = TCG_REG_TMP2;
234
-#define TCG_TARGET_HAS_v64 1
143
+ if (h.index_ext == TCG_TYPE_I32) {
235
-#define TCG_TARGET_HAS_v128 1
144
+ /* add base, base, index, uxtw */
236
-#define TCG_TARGET_HAS_v256 0
145
+ tcg_out_insn(s, 3501, ADD, TCG_TYPE_I64, base,
237
-
146
+ h.base, h.index, MO_32, 0);
238
-#define TCG_TARGET_HAS_andc_vec 1
147
+ } else {
239
-#define TCG_TARGET_HAS_orc_vec 1
148
+ /* add base, base, index */
240
-#define TCG_TARGET_HAS_nand_vec 0
149
+ tcg_out_insn(s, 3502, ADD, 1, base, h.base, h.index);
241
-#define TCG_TARGET_HAS_nor_vec 0
150
+ }
242
-#define TCG_TARGET_HAS_eqv_vec 0
151
+ }
243
-#define TCG_TARGET_HAS_not_vec 1
152
+
244
-#define TCG_TARGET_HAS_neg_vec 1
153
+ use_pair = h.aa.atom < MO_128 || have_lse2;
245
-#define TCG_TARGET_HAS_abs_vec 1
154
+
246
-#define TCG_TARGET_HAS_roti_vec 0
155
+ if (!use_pair) {
247
-#define TCG_TARGET_HAS_rots_vec 0
156
+ tcg_insn_unit *branch = NULL;
248
-#define TCG_TARGET_HAS_rotv_vec 0
157
+ TCGReg ll, lh, sl, sh;
249
-#define TCG_TARGET_HAS_shi_vec 1
158
+
250
-#define TCG_TARGET_HAS_shs_vec 0
159
+ /*
251
-#define TCG_TARGET_HAS_shv_vec 1
160
+ * If we have already checked for 16-byte alignment, that's all
252
-#define TCG_TARGET_HAS_mul_vec 1
161
+ * we need. Otherwise we have determined that misaligned atomicity
253
-#define TCG_TARGET_HAS_sat_vec 1
162
+ * may be handled with two 8-byte loads.
254
-#define TCG_TARGET_HAS_minmax_vec 1
163
+ */
255
-#define TCG_TARGET_HAS_bitsel_vec 1
164
+ if (h.aa.align < MO_128) {
256
-#define TCG_TARGET_HAS_cmpsel_vec 0
165
+ /*
257
-#define TCG_TARGET_HAS_tst_vec 1
166
+ * TODO: align should be MO_64, so we only need test bit 3,
258
+#include "tcg-target-has.h"
167
+ * which means we could use TBNZ instead of ANDS+B_C.
259
168
+ */
260
#define TCG_TARGET_DEFAULT_MO (0)
169
+ tcg_out_logicali(s, I3404_ANDSI, 0, TCG_REG_XZR, addr_reg, 15);
261
170
+ branch = s->code_ptr;
171
+ tcg_out_insn(s, 3202, B_C, TCG_COND_NE, 0);
172
+ use_pair = true;
173
+ }
174
+
175
+ if (is_ld) {
176
+ /*
177
+ * 16-byte atomicity without LSE2 requires LDXP+STXP loop:
178
+ * ldxp lo, hi, [base]
179
+ * stxp t0, lo, hi, [base]
180
+ * cbnz t0, .-8
181
+ * Require no overlap between data{lo,hi} and base.
182
+ */
183
+ if (datalo == base || datahi == base) {
184
+ tcg_out_mov(s, TCG_TYPE_REG, TCG_REG_TMP2, base);
185
+ base = TCG_REG_TMP2;
186
+ }
187
+ ll = sl = datalo;
188
+ lh = sh = datahi;
189
+ } else {
190
+ /*
191
+ * 16-byte atomicity without LSE2 requires LDXP+STXP loop:
192
+ * 1: ldxp t0, t1, [base]
193
+ * stxp t0, lo, hi, [base]
194
+ * cbnz t0, 1b
195
+ */
196
+ tcg_debug_assert(base != TCG_REG_TMP0 && base != TCG_REG_TMP1);
197
+ ll = TCG_REG_TMP0;
198
+ lh = TCG_REG_TMP1;
199
+ sl = datalo;
200
+ sh = datahi;
201
+ }
202
+
203
+ tcg_out_insn(s, 3306, LDXP, TCG_REG_XZR, ll, lh, base);
204
+ tcg_out_insn(s, 3306, STXP, TCG_REG_TMP0, sl, sh, base);
205
+ tcg_out_insn(s, 3201, CBNZ, 0, TCG_REG_TMP0, -2);
206
+
207
+ if (use_pair) {
208
+ /* "b .+8", branching across the one insn of use_pair. */
209
+ tcg_out_insn(s, 3206, B, 2);
210
+ reloc_pc19(branch, tcg_splitwx_to_rx(s->code_ptr));
211
+ }
212
+ }
213
+
214
+ if (use_pair) {
215
+ if (is_ld) {
216
+ tcg_out_insn(s, 3314, LDP, datalo, datahi, base, 0, 1, 0);
217
+ } else {
218
+ tcg_out_insn(s, 3314, STP, datalo, datahi, base, 0, 1, 0);
219
+ }
220
+ }
221
+
222
+ if (ldst) {
223
+ ldst->type = TCG_TYPE_I128;
224
+ ldst->datalo_reg = datalo;
225
+ ldst->datahi_reg = datahi;
226
+ ldst->raddr = tcg_splitwx_to_rx(s->code_ptr);
227
+ }
228
+}
229
+
230
static const tcg_insn_unit *tb_ret_addr;
231
232
static void tcg_out_exit_tb(TCGContext *s, uintptr_t a0)
233
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
234
case INDEX_op_qemu_st_a64_i64:
235
tcg_out_qemu_st(s, REG0(0), a1, a2, ext);
236
break;
237
+ case INDEX_op_qemu_ld_a32_i128:
238
+ case INDEX_op_qemu_ld_a64_i128:
239
+ tcg_out_qemu_ldst_i128(s, a0, a1, a2, args[3], true);
240
+ break;
241
+ case INDEX_op_qemu_st_a32_i128:
242
+ case INDEX_op_qemu_st_a64_i128:
243
+ tcg_out_qemu_ldst_i128(s, REG0(0), REG0(1), a2, args[3], false);
244
+ break;
245
246
case INDEX_op_bswap64_i64:
247
tcg_out_rev(s, TCG_TYPE_I64, MO_64, a0, a1);
248
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
249
case INDEX_op_qemu_ld_a32_i64:
250
case INDEX_op_qemu_ld_a64_i64:
251
return C_O1_I1(r, r);
252
+ case INDEX_op_qemu_ld_a32_i128:
253
+ case INDEX_op_qemu_ld_a64_i128:
254
+ return C_O2_I1(r, r, r);
255
case INDEX_op_qemu_st_a32_i32:
256
case INDEX_op_qemu_st_a64_i32:
257
case INDEX_op_qemu_st_a32_i64:
258
case INDEX_op_qemu_st_a64_i64:
259
return C_O0_I2(rZ, r);
260
+ case INDEX_op_qemu_st_a32_i128:
261
+ case INDEX_op_qemu_st_a64_i128:
262
+ return C_O0_I3(rZ, rZ, r);
263
264
case INDEX_op_deposit_i32:
265
case INDEX_op_deposit_i64:
266
--
262
--
267
2.34.1
263
2.43.0
264
265
diff view generated by jsdifflib
New patch
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-5-philmd@linaro.org>
4
---
5
tcg/arm/tcg-target-has.h | 85 ++++++++++++++++++++++++++++++++++++++++
6
tcg/arm/tcg-target.h | 74 +---------------------------------
7
2 files changed, 86 insertions(+), 73 deletions(-)
8
create mode 100644 tcg/arm/tcg-target-has.h
1
9
10
diff --git a/tcg/arm/tcg-target-has.h b/tcg/arm/tcg-target-has.h
11
new file mode 100644
12
index XXXXXXX..XXXXXXX
13
--- /dev/null
14
+++ b/tcg/arm/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: MIT */
17
+/*
18
+ * Define target-specific opcode support
19
+ * Copyright (c) 2008 Fabrice Bellard
20
+ * Copyright (c) 2008 Andrzej Zaborowski
21
+ */
22
+
23
+#ifndef TCG_TARGET_HAS_H
24
+#define TCG_TARGET_HAS_H
25
+
26
+extern int arm_arch;
27
+
28
+#define use_armv7_instructions (__ARM_ARCH >= 7 || arm_arch >= 7)
29
+
30
+#ifdef __ARM_ARCH_EXT_IDIV__
31
+#define use_idiv_instructions 1
32
+#else
33
+extern bool use_idiv_instructions;
34
+#endif
35
+#ifdef __ARM_NEON__
36
+#define use_neon_instructions 1
37
+#else
38
+extern bool use_neon_instructions;
39
+#endif
40
+
41
+/* optional instructions */
42
+#define TCG_TARGET_HAS_ext8s_i32 1
43
+#define TCG_TARGET_HAS_ext16s_i32 1
44
+#define TCG_TARGET_HAS_ext8u_i32 0 /* and r0, r1, #0xff */
45
+#define TCG_TARGET_HAS_ext16u_i32 1
46
+#define TCG_TARGET_HAS_bswap16_i32 1
47
+#define TCG_TARGET_HAS_bswap32_i32 1
48
+#define TCG_TARGET_HAS_not_i32 1
49
+#define TCG_TARGET_HAS_rot_i32 1
50
+#define TCG_TARGET_HAS_andc_i32 1
51
+#define TCG_TARGET_HAS_orc_i32 0
52
+#define TCG_TARGET_HAS_eqv_i32 0
53
+#define TCG_TARGET_HAS_nand_i32 0
54
+#define TCG_TARGET_HAS_nor_i32 0
55
+#define TCG_TARGET_HAS_clz_i32 1
56
+#define TCG_TARGET_HAS_ctz_i32 use_armv7_instructions
57
+#define TCG_TARGET_HAS_ctpop_i32 0
58
+#define TCG_TARGET_HAS_deposit_i32 use_armv7_instructions
59
+#define TCG_TARGET_HAS_extract_i32 use_armv7_instructions
60
+#define TCG_TARGET_HAS_sextract_i32 use_armv7_instructions
61
+#define TCG_TARGET_HAS_extract2_i32 1
62
+#define TCG_TARGET_HAS_negsetcond_i32 1
63
+#define TCG_TARGET_HAS_mulu2_i32 1
64
+#define TCG_TARGET_HAS_muls2_i32 1
65
+#define TCG_TARGET_HAS_muluh_i32 0
66
+#define TCG_TARGET_HAS_mulsh_i32 0
67
+#define TCG_TARGET_HAS_div_i32 use_idiv_instructions
68
+#define TCG_TARGET_HAS_rem_i32 0
69
+#define TCG_TARGET_HAS_qemu_st8_i32 0
70
+
71
+#define TCG_TARGET_HAS_qemu_ldst_i128 0
72
+
73
+#define TCG_TARGET_HAS_tst 1
74
+
75
+#define TCG_TARGET_HAS_v64 use_neon_instructions
76
+#define TCG_TARGET_HAS_v128 use_neon_instructions
77
+#define TCG_TARGET_HAS_v256 0
78
+
79
+#define TCG_TARGET_HAS_andc_vec 1
80
+#define TCG_TARGET_HAS_orc_vec 1
81
+#define TCG_TARGET_HAS_nand_vec 0
82
+#define TCG_TARGET_HAS_nor_vec 0
83
+#define TCG_TARGET_HAS_eqv_vec 0
84
+#define TCG_TARGET_HAS_not_vec 1
85
+#define TCG_TARGET_HAS_neg_vec 1
86
+#define TCG_TARGET_HAS_abs_vec 1
87
+#define TCG_TARGET_HAS_roti_vec 0
88
+#define TCG_TARGET_HAS_rots_vec 0
89
+#define TCG_TARGET_HAS_rotv_vec 0
90
+#define TCG_TARGET_HAS_shi_vec 1
91
+#define TCG_TARGET_HAS_shs_vec 0
92
+#define TCG_TARGET_HAS_shv_vec 0
93
+#define TCG_TARGET_HAS_mul_vec 1
94
+#define TCG_TARGET_HAS_sat_vec 1
95
+#define TCG_TARGET_HAS_minmax_vec 1
96
+#define TCG_TARGET_HAS_bitsel_vec 1
97
+#define TCG_TARGET_HAS_cmpsel_vec 0
98
+#define TCG_TARGET_HAS_tst_vec 1
99
+
100
+#endif
101
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
102
index XXXXXXX..XXXXXXX 100644
103
--- a/tcg/arm/tcg-target.h
104
+++ b/tcg/arm/tcg-target.h
105
@@ -XXX,XX +XXX,XX @@
106
#ifndef ARM_TCG_TARGET_H
107
#define ARM_TCG_TARGET_H
108
109
-extern int arm_arch;
110
-
111
-#define use_armv7_instructions (__ARM_ARCH >= 7 || arm_arch >= 7)
112
-
113
#define TCG_TARGET_INSN_UNIT_SIZE 4
114
#define MAX_CODE_GEN_BUFFER_SIZE UINT32_MAX
115
116
@@ -XXX,XX +XXX,XX @@ typedef enum {
117
118
#define TCG_TARGET_NB_REGS 32
119
120
-#ifdef __ARM_ARCH_EXT_IDIV__
121
-#define use_idiv_instructions 1
122
-#else
123
-extern bool use_idiv_instructions;
124
-#endif
125
-#ifdef __ARM_NEON__
126
-#define use_neon_instructions 1
127
-#else
128
-extern bool use_neon_instructions;
129
-#endif
130
-
131
-/* optional instructions */
132
-#define TCG_TARGET_HAS_ext8s_i32 1
133
-#define TCG_TARGET_HAS_ext16s_i32 1
134
-#define TCG_TARGET_HAS_ext8u_i32 0 /* and r0, r1, #0xff */
135
-#define TCG_TARGET_HAS_ext16u_i32 1
136
-#define TCG_TARGET_HAS_bswap16_i32 1
137
-#define TCG_TARGET_HAS_bswap32_i32 1
138
-#define TCG_TARGET_HAS_not_i32 1
139
-#define TCG_TARGET_HAS_rot_i32 1
140
-#define TCG_TARGET_HAS_andc_i32 1
141
-#define TCG_TARGET_HAS_orc_i32 0
142
-#define TCG_TARGET_HAS_eqv_i32 0
143
-#define TCG_TARGET_HAS_nand_i32 0
144
-#define TCG_TARGET_HAS_nor_i32 0
145
-#define TCG_TARGET_HAS_clz_i32 1
146
-#define TCG_TARGET_HAS_ctz_i32 use_armv7_instructions
147
-#define TCG_TARGET_HAS_ctpop_i32 0
148
-#define TCG_TARGET_HAS_deposit_i32 use_armv7_instructions
149
-#define TCG_TARGET_HAS_extract_i32 use_armv7_instructions
150
-#define TCG_TARGET_HAS_sextract_i32 use_armv7_instructions
151
-#define TCG_TARGET_HAS_extract2_i32 1
152
-#define TCG_TARGET_HAS_negsetcond_i32 1
153
-#define TCG_TARGET_HAS_mulu2_i32 1
154
-#define TCG_TARGET_HAS_muls2_i32 1
155
-#define TCG_TARGET_HAS_muluh_i32 0
156
-#define TCG_TARGET_HAS_mulsh_i32 0
157
-#define TCG_TARGET_HAS_div_i32 use_idiv_instructions
158
-#define TCG_TARGET_HAS_rem_i32 0
159
-#define TCG_TARGET_HAS_qemu_st8_i32 0
160
-
161
-#define TCG_TARGET_HAS_qemu_ldst_i128 0
162
-
163
-#define TCG_TARGET_HAS_tst 1
164
-
165
-#define TCG_TARGET_HAS_v64 use_neon_instructions
166
-#define TCG_TARGET_HAS_v128 use_neon_instructions
167
-#define TCG_TARGET_HAS_v256 0
168
-
169
-#define TCG_TARGET_HAS_andc_vec 1
170
-#define TCG_TARGET_HAS_orc_vec 1
171
-#define TCG_TARGET_HAS_nand_vec 0
172
-#define TCG_TARGET_HAS_nor_vec 0
173
-#define TCG_TARGET_HAS_eqv_vec 0
174
-#define TCG_TARGET_HAS_not_vec 1
175
-#define TCG_TARGET_HAS_neg_vec 1
176
-#define TCG_TARGET_HAS_abs_vec 1
177
-#define TCG_TARGET_HAS_roti_vec 0
178
-#define TCG_TARGET_HAS_rots_vec 0
179
-#define TCG_TARGET_HAS_rotv_vec 0
180
-#define TCG_TARGET_HAS_shi_vec 1
181
-#define TCG_TARGET_HAS_shs_vec 0
182
-#define TCG_TARGET_HAS_shv_vec 0
183
-#define TCG_TARGET_HAS_mul_vec 1
184
-#define TCG_TARGET_HAS_sat_vec 1
185
-#define TCG_TARGET_HAS_minmax_vec 1
186
-#define TCG_TARGET_HAS_bitsel_vec 1
187
-#define TCG_TARGET_HAS_cmpsel_vec 0
188
-#define TCG_TARGET_HAS_tst_vec 1
189
+#include "tcg-target-has.h"
190
191
#define TCG_TARGET_DEFAULT_MO (0)
192
193
--
194
2.43.0
195
196
diff view generated by jsdifflib
1
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-6-philmd@linaro.org>
3
---
4
---
4
.../x86_64/host/load-extract-al16-al8.h | 50 +++++++++++++++++++
5
tcg/i386/tcg-target-has.h | 139 ++++++++++++++++++++++++++++++++++++++
5
1 file changed, 50 insertions(+)
6
tcg/i386/tcg-target.h | 129 +----------------------------------
6
create mode 100644 host/include/x86_64/host/load-extract-al16-al8.h
7
2 files changed, 140 insertions(+), 128 deletions(-)
8
create mode 100644 tcg/i386/tcg-target-has.h
7
9
8
diff --git a/host/include/x86_64/host/load-extract-al16-al8.h b/host/include/x86_64/host/load-extract-al16-al8.h
10
diff --git a/tcg/i386/tcg-target-has.h b/tcg/i386/tcg-target-has.h
9
new file mode 100644
11
new file mode 100644
10
index XXXXXXX..XXXXXXX
12
index XXXXXXX..XXXXXXX
11
--- /dev/null
13
--- /dev/null
12
+++ b/host/include/x86_64/host/load-extract-al16-al8.h
14
+++ b/tcg/i386/tcg-target-has.h
13
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: MIT */
14
+/*
17
+/*
15
+ * SPDX-License-Identifier: GPL-2.0-or-later
18
+ * Define target-specific opcode support
16
+ * Atomic extract 64 from 128-bit, x86_64 version.
19
+ * Copyright (c) 2008 Fabrice Bellard
17
+ *
18
+ * Copyright (C) 2023 Linaro, Ltd.
19
+ */
20
+ */
20
+
21
+
21
+#ifndef X86_64_LOAD_EXTRACT_AL16_AL8_H
22
+#ifndef TCG_TARGET_HAS_H
22
+#define X86_64_LOAD_EXTRACT_AL16_AL8_H
23
+#define TCG_TARGET_HAS_H
23
+
24
+
24
+#ifdef CONFIG_INT128_TYPE
25
+#include "host/cpuinfo.h"
25
+#include "host/cpuinfo.h"
26
+
26
+
27
+/**
27
+#define have_bmi1 (cpuinfo & CPUINFO_BMI1)
28
+ * load_atom_extract_al16_or_al8:
28
+#define have_popcnt (cpuinfo & CPUINFO_POPCNT)
29
+ * @pv: host address
29
+#define have_avx1 (cpuinfo & CPUINFO_AVX1)
30
+ * @s: object size in bytes, @s <= 8.
30
+#define have_avx2 (cpuinfo & CPUINFO_AVX2)
31
+ *
31
+#define have_movbe (cpuinfo & CPUINFO_MOVBE)
32
+ * Load @s bytes from @pv, when pv % s != 0. If [p, p+s-1] does not
32
+
33
+ * cross an 16-byte boundary then the access must be 16-byte atomic,
33
+/*
34
+ * otherwise the access must be 8-byte atomic.
34
+ * There are interesting instructions in AVX512, so long as we have AVX512VL,
35
+ * which indicates support for EVEX on sizes smaller than 512 bits.
35
+ */
36
+ */
36
+static inline uint64_t ATTRIBUTE_ATOMIC128_OPT
37
+#define have_avx512vl ((cpuinfo & CPUINFO_AVX512VL) && \
37
+load_atom_extract_al16_or_al8(void *pv, int s)
38
+ (cpuinfo & CPUINFO_AVX512F))
38
+{
39
+#define have_avx512bw ((cpuinfo & CPUINFO_AVX512BW) && have_avx512vl)
39
+ uintptr_t pi = (uintptr_t)pv;
40
+#define have_avx512dq ((cpuinfo & CPUINFO_AVX512DQ) && have_avx512vl)
40
+ __int128_t *ptr_align = (__int128_t *)(pi & ~7);
41
+#define have_avx512vbmi2 ((cpuinfo & CPUINFO_AVX512VBMI2) && have_avx512vl)
41
+ int shr = (pi & 7) * 8;
42
+
42
+ Int128Alias r;
43
+/* optional instructions */
43
+
44
+#define TCG_TARGET_HAS_div2_i32 1
44
+ /*
45
+#define TCG_TARGET_HAS_rot_i32 1
45
+ * ptr_align % 16 is now only 0 or 8.
46
+#define TCG_TARGET_HAS_ext8s_i32 1
46
+ * If the host supports atomic loads with VMOVDQU, then always use that,
47
+#define TCG_TARGET_HAS_ext16s_i32 1
47
+ * making the branch highly predictable. Otherwise we must use VMOVDQA
48
+#define TCG_TARGET_HAS_ext8u_i32 1
48
+ * when ptr_align % 16 == 0 for 16-byte atomicity.
49
+#define TCG_TARGET_HAS_ext16u_i32 1
49
+ */
50
+#define TCG_TARGET_HAS_bswap16_i32 1
50
+ if ((cpuinfo & CPUINFO_ATOMIC_VMOVDQU) || (pi & 8)) {
51
+#define TCG_TARGET_HAS_bswap32_i32 1
51
+ asm("vmovdqu %1, %0" : "=x" (r.i) : "m" (*ptr_align));
52
+#define TCG_TARGET_HAS_not_i32 1
52
+ } else {
53
+#define TCG_TARGET_HAS_andc_i32 have_bmi1
53
+ asm("vmovdqa %1, %0" : "=x" (r.i) : "m" (*ptr_align));
54
+#define TCG_TARGET_HAS_orc_i32 0
54
+ }
55
+#define TCG_TARGET_HAS_eqv_i32 0
55
+ return int128_getlo(int128_urshift(r.s, shr));
56
+#define TCG_TARGET_HAS_nand_i32 0
56
+}
57
+#define TCG_TARGET_HAS_nor_i32 0
58
+#define TCG_TARGET_HAS_clz_i32 1
59
+#define TCG_TARGET_HAS_ctz_i32 1
60
+#define TCG_TARGET_HAS_ctpop_i32 have_popcnt
61
+#define TCG_TARGET_HAS_deposit_i32 1
62
+#define TCG_TARGET_HAS_extract_i32 1
63
+#define TCG_TARGET_HAS_sextract_i32 1
64
+#define TCG_TARGET_HAS_extract2_i32 1
65
+#define TCG_TARGET_HAS_negsetcond_i32 1
66
+#define TCG_TARGET_HAS_add2_i32 1
67
+#define TCG_TARGET_HAS_sub2_i32 1
68
+#define TCG_TARGET_HAS_mulu2_i32 1
69
+#define TCG_TARGET_HAS_muls2_i32 1
70
+#define TCG_TARGET_HAS_muluh_i32 0
71
+#define TCG_TARGET_HAS_mulsh_i32 0
72
+
73
+#if TCG_TARGET_REG_BITS == 64
74
+/* Keep 32-bit values zero-extended in a register. */
75
+#define TCG_TARGET_HAS_extr_i64_i32 1
76
+#define TCG_TARGET_HAS_div2_i64 1
77
+#define TCG_TARGET_HAS_rot_i64 1
78
+#define TCG_TARGET_HAS_ext8s_i64 1
79
+#define TCG_TARGET_HAS_ext16s_i64 1
80
+#define TCG_TARGET_HAS_ext32s_i64 1
81
+#define TCG_TARGET_HAS_ext8u_i64 1
82
+#define TCG_TARGET_HAS_ext16u_i64 1
83
+#define TCG_TARGET_HAS_ext32u_i64 1
84
+#define TCG_TARGET_HAS_bswap16_i64 1
85
+#define TCG_TARGET_HAS_bswap32_i64 1
86
+#define TCG_TARGET_HAS_bswap64_i64 1
87
+#define TCG_TARGET_HAS_not_i64 1
88
+#define TCG_TARGET_HAS_andc_i64 have_bmi1
89
+#define TCG_TARGET_HAS_orc_i64 0
90
+#define TCG_TARGET_HAS_eqv_i64 0
91
+#define TCG_TARGET_HAS_nand_i64 0
92
+#define TCG_TARGET_HAS_nor_i64 0
93
+#define TCG_TARGET_HAS_clz_i64 1
94
+#define TCG_TARGET_HAS_ctz_i64 1
95
+#define TCG_TARGET_HAS_ctpop_i64 have_popcnt
96
+#define TCG_TARGET_HAS_deposit_i64 1
97
+#define TCG_TARGET_HAS_extract_i64 1
98
+#define TCG_TARGET_HAS_sextract_i64 0
99
+#define TCG_TARGET_HAS_extract2_i64 1
100
+#define TCG_TARGET_HAS_negsetcond_i64 1
101
+#define TCG_TARGET_HAS_add2_i64 1
102
+#define TCG_TARGET_HAS_sub2_i64 1
103
+#define TCG_TARGET_HAS_mulu2_i64 1
104
+#define TCG_TARGET_HAS_muls2_i64 1
105
+#define TCG_TARGET_HAS_muluh_i64 0
106
+#define TCG_TARGET_HAS_mulsh_i64 0
107
+#define TCG_TARGET_HAS_qemu_st8_i32 0
57
+#else
108
+#else
58
+/* Fallback definition that must be optimized away, or error. */
109
+#define TCG_TARGET_HAS_qemu_st8_i32 1
59
+uint64_t QEMU_ERROR("unsupported atomic")
60
+ load_atom_extract_al16_or_al8(void *pv, int s);
61
+#endif
110
+#endif
62
+
111
+
63
+#endif /* X86_64_LOAD_EXTRACT_AL16_AL8_H */
112
+#define TCG_TARGET_HAS_qemu_ldst_i128 \
113
+ (TCG_TARGET_REG_BITS == 64 && (cpuinfo & CPUINFO_ATOMIC_VMOVDQA))
114
+
115
+#define TCG_TARGET_HAS_tst 1
116
+
117
+/* We do not support older SSE systems, only beginning with AVX1. */
118
+#define TCG_TARGET_HAS_v64 have_avx1
119
+#define TCG_TARGET_HAS_v128 have_avx1
120
+#define TCG_TARGET_HAS_v256 have_avx2
121
+
122
+#define TCG_TARGET_HAS_andc_vec 1
123
+#define TCG_TARGET_HAS_orc_vec have_avx512vl
124
+#define TCG_TARGET_HAS_nand_vec have_avx512vl
125
+#define TCG_TARGET_HAS_nor_vec have_avx512vl
126
+#define TCG_TARGET_HAS_eqv_vec have_avx512vl
127
+#define TCG_TARGET_HAS_not_vec have_avx512vl
128
+#define TCG_TARGET_HAS_neg_vec 0
129
+#define TCG_TARGET_HAS_abs_vec 1
130
+#define TCG_TARGET_HAS_roti_vec have_avx512vl
131
+#define TCG_TARGET_HAS_rots_vec 0
132
+#define TCG_TARGET_HAS_rotv_vec have_avx512vl
133
+#define TCG_TARGET_HAS_shi_vec 1
134
+#define TCG_TARGET_HAS_shs_vec 1
135
+#define TCG_TARGET_HAS_shv_vec have_avx2
136
+#define TCG_TARGET_HAS_mul_vec 1
137
+#define TCG_TARGET_HAS_sat_vec 1
138
+#define TCG_TARGET_HAS_minmax_vec 1
139
+#define TCG_TARGET_HAS_bitsel_vec have_avx512vl
140
+#define TCG_TARGET_HAS_cmpsel_vec 1
141
+#define TCG_TARGET_HAS_tst_vec have_avx512bw
142
+
143
+#define TCG_TARGET_deposit_i32_valid(ofs, len) \
144
+ (((ofs) == 0 && ((len) == 8 || (len) == 16)) || \
145
+ (TCG_TARGET_REG_BITS == 32 && (ofs) == 8 && (len) == 8))
146
+#define TCG_TARGET_deposit_i64_valid TCG_TARGET_deposit_i32_valid
147
+
148
+/* Check for the possibility of high-byte extraction and, for 64-bit,
149
+ zero-extending 32-bit right-shift. */
150
+#define TCG_TARGET_extract_i32_valid(ofs, len) ((ofs) == 8 && (len) == 8)
151
+#define TCG_TARGET_extract_i64_valid(ofs, len) \
152
+ (((ofs) == 8 && (len) == 8) || ((ofs) + (len)) == 32)
153
+
154
+#endif
155
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
156
index XXXXXXX..XXXXXXX 100644
157
--- a/tcg/i386/tcg-target.h
158
+++ b/tcg/i386/tcg-target.h
159
@@ -XXX,XX +XXX,XX @@
160
#ifndef I386_TCG_TARGET_H
161
#define I386_TCG_TARGET_H
162
163
-#include "host/cpuinfo.h"
164
-
165
#define TCG_TARGET_INSN_UNIT_SIZE 1
166
167
#ifdef __x86_64__
168
@@ -XXX,XX +XXX,XX @@ typedef enum {
169
TCG_REG_CALL_STACK = TCG_REG_ESP
170
} TCGReg;
171
172
-#define have_bmi1 (cpuinfo & CPUINFO_BMI1)
173
-#define have_popcnt (cpuinfo & CPUINFO_POPCNT)
174
-#define have_avx1 (cpuinfo & CPUINFO_AVX1)
175
-#define have_avx2 (cpuinfo & CPUINFO_AVX2)
176
-#define have_movbe (cpuinfo & CPUINFO_MOVBE)
177
-
178
-/*
179
- * There are interesting instructions in AVX512, so long as we have AVX512VL,
180
- * which indicates support for EVEX on sizes smaller than 512 bits.
181
- */
182
-#define have_avx512vl ((cpuinfo & CPUINFO_AVX512VL) && \
183
- (cpuinfo & CPUINFO_AVX512F))
184
-#define have_avx512bw ((cpuinfo & CPUINFO_AVX512BW) && have_avx512vl)
185
-#define have_avx512dq ((cpuinfo & CPUINFO_AVX512DQ) && have_avx512vl)
186
-#define have_avx512vbmi2 ((cpuinfo & CPUINFO_AVX512VBMI2) && have_avx512vl)
187
-
188
-/* optional instructions */
189
-#define TCG_TARGET_HAS_div2_i32 1
190
-#define TCG_TARGET_HAS_rot_i32 1
191
-#define TCG_TARGET_HAS_ext8s_i32 1
192
-#define TCG_TARGET_HAS_ext16s_i32 1
193
-#define TCG_TARGET_HAS_ext8u_i32 1
194
-#define TCG_TARGET_HAS_ext16u_i32 1
195
-#define TCG_TARGET_HAS_bswap16_i32 1
196
-#define TCG_TARGET_HAS_bswap32_i32 1
197
-#define TCG_TARGET_HAS_not_i32 1
198
-#define TCG_TARGET_HAS_andc_i32 have_bmi1
199
-#define TCG_TARGET_HAS_orc_i32 0
200
-#define TCG_TARGET_HAS_eqv_i32 0
201
-#define TCG_TARGET_HAS_nand_i32 0
202
-#define TCG_TARGET_HAS_nor_i32 0
203
-#define TCG_TARGET_HAS_clz_i32 1
204
-#define TCG_TARGET_HAS_ctz_i32 1
205
-#define TCG_TARGET_HAS_ctpop_i32 have_popcnt
206
-#define TCG_TARGET_HAS_deposit_i32 1
207
-#define TCG_TARGET_HAS_extract_i32 1
208
-#define TCG_TARGET_HAS_sextract_i32 1
209
-#define TCG_TARGET_HAS_extract2_i32 1
210
-#define TCG_TARGET_HAS_negsetcond_i32 1
211
-#define TCG_TARGET_HAS_add2_i32 1
212
-#define TCG_TARGET_HAS_sub2_i32 1
213
-#define TCG_TARGET_HAS_mulu2_i32 1
214
-#define TCG_TARGET_HAS_muls2_i32 1
215
-#define TCG_TARGET_HAS_muluh_i32 0
216
-#define TCG_TARGET_HAS_mulsh_i32 0
217
-
218
-#if TCG_TARGET_REG_BITS == 64
219
-/* Keep 32-bit values zero-extended in a register. */
220
-#define TCG_TARGET_HAS_extr_i64_i32 1
221
-#define TCG_TARGET_HAS_div2_i64 1
222
-#define TCG_TARGET_HAS_rot_i64 1
223
-#define TCG_TARGET_HAS_ext8s_i64 1
224
-#define TCG_TARGET_HAS_ext16s_i64 1
225
-#define TCG_TARGET_HAS_ext32s_i64 1
226
-#define TCG_TARGET_HAS_ext8u_i64 1
227
-#define TCG_TARGET_HAS_ext16u_i64 1
228
-#define TCG_TARGET_HAS_ext32u_i64 1
229
-#define TCG_TARGET_HAS_bswap16_i64 1
230
-#define TCG_TARGET_HAS_bswap32_i64 1
231
-#define TCG_TARGET_HAS_bswap64_i64 1
232
-#define TCG_TARGET_HAS_not_i64 1
233
-#define TCG_TARGET_HAS_andc_i64 have_bmi1
234
-#define TCG_TARGET_HAS_orc_i64 0
235
-#define TCG_TARGET_HAS_eqv_i64 0
236
-#define TCG_TARGET_HAS_nand_i64 0
237
-#define TCG_TARGET_HAS_nor_i64 0
238
-#define TCG_TARGET_HAS_clz_i64 1
239
-#define TCG_TARGET_HAS_ctz_i64 1
240
-#define TCG_TARGET_HAS_ctpop_i64 have_popcnt
241
-#define TCG_TARGET_HAS_deposit_i64 1
242
-#define TCG_TARGET_HAS_extract_i64 1
243
-#define TCG_TARGET_HAS_sextract_i64 0
244
-#define TCG_TARGET_HAS_extract2_i64 1
245
-#define TCG_TARGET_HAS_negsetcond_i64 1
246
-#define TCG_TARGET_HAS_add2_i64 1
247
-#define TCG_TARGET_HAS_sub2_i64 1
248
-#define TCG_TARGET_HAS_mulu2_i64 1
249
-#define TCG_TARGET_HAS_muls2_i64 1
250
-#define TCG_TARGET_HAS_muluh_i64 0
251
-#define TCG_TARGET_HAS_mulsh_i64 0
252
-#define TCG_TARGET_HAS_qemu_st8_i32 0
253
-#else
254
-#define TCG_TARGET_HAS_qemu_st8_i32 1
255
-#endif
256
-
257
-#define TCG_TARGET_HAS_qemu_ldst_i128 \
258
- (TCG_TARGET_REG_BITS == 64 && (cpuinfo & CPUINFO_ATOMIC_VMOVDQA))
259
-
260
-#define TCG_TARGET_HAS_tst 1
261
-
262
-/* We do not support older SSE systems, only beginning with AVX1. */
263
-#define TCG_TARGET_HAS_v64 have_avx1
264
-#define TCG_TARGET_HAS_v128 have_avx1
265
-#define TCG_TARGET_HAS_v256 have_avx2
266
-
267
-#define TCG_TARGET_HAS_andc_vec 1
268
-#define TCG_TARGET_HAS_orc_vec have_avx512vl
269
-#define TCG_TARGET_HAS_nand_vec have_avx512vl
270
-#define TCG_TARGET_HAS_nor_vec have_avx512vl
271
-#define TCG_TARGET_HAS_eqv_vec have_avx512vl
272
-#define TCG_TARGET_HAS_not_vec have_avx512vl
273
-#define TCG_TARGET_HAS_neg_vec 0
274
-#define TCG_TARGET_HAS_abs_vec 1
275
-#define TCG_TARGET_HAS_roti_vec have_avx512vl
276
-#define TCG_TARGET_HAS_rots_vec 0
277
-#define TCG_TARGET_HAS_rotv_vec have_avx512vl
278
-#define TCG_TARGET_HAS_shi_vec 1
279
-#define TCG_TARGET_HAS_shs_vec 1
280
-#define TCG_TARGET_HAS_shv_vec have_avx2
281
-#define TCG_TARGET_HAS_mul_vec 1
282
-#define TCG_TARGET_HAS_sat_vec 1
283
-#define TCG_TARGET_HAS_minmax_vec 1
284
-#define TCG_TARGET_HAS_bitsel_vec have_avx512vl
285
-#define TCG_TARGET_HAS_cmpsel_vec 1
286
-#define TCG_TARGET_HAS_tst_vec have_avx512bw
287
-
288
-#define TCG_TARGET_deposit_i32_valid(ofs, len) \
289
- (((ofs) == 0 && ((len) == 8 || (len) == 16)) || \
290
- (TCG_TARGET_REG_BITS == 32 && (ofs) == 8 && (len) == 8))
291
-#define TCG_TARGET_deposit_i64_valid TCG_TARGET_deposit_i32_valid
292
-
293
-/* Check for the possibility of high-byte extraction and, for 64-bit,
294
- zero-extending 32-bit right-shift. */
295
-#define TCG_TARGET_extract_i32_valid(ofs, len) ((ofs) == 8 && (len) == 8)
296
-#define TCG_TARGET_extract_i64_valid(ofs, len) \
297
- (((ofs) == 8 && (len) == 8) || ((ofs) + (len)) == 32)
298
+#include "tcg-target-has.h"
299
300
/* This defines the natural memory order supported by this
301
* architecture before guarantees made by various barrier
64
--
302
--
65
2.34.1
303
2.43.0
304
305
diff view generated by jsdifflib
New patch
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-7-philmd@linaro.org>
4
---
5
tcg/loongarch64/tcg-target-has.h | 113 +++++++++++++++++++++++++++++++
6
tcg/loongarch64/tcg-target.h | 102 +---------------------------
7
2 files changed, 114 insertions(+), 101 deletions(-)
8
create mode 100644 tcg/loongarch64/tcg-target-has.h
1
9
10
diff --git a/tcg/loongarch64/tcg-target-has.h b/tcg/loongarch64/tcg-target-has.h
11
new file mode 100644
12
index XXXXXXX..XXXXXXX
13
--- /dev/null
14
+++ b/tcg/loongarch64/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: MIT */
17
+/*
18
+ * Define target-specific opcode support
19
+ * Copyright (c) 2021 WANG Xuerui <git@xen0n.name>
20
+ */
21
+
22
+#ifndef TCG_TARGET_HAS_H
23
+#define TCG_TARGET_HAS_H
24
+
25
+#include "host/cpuinfo.h"
26
+
27
+/* optional instructions */
28
+#define TCG_TARGET_HAS_negsetcond_i32 0
29
+#define TCG_TARGET_HAS_div_i32 1
30
+#define TCG_TARGET_HAS_rem_i32 1
31
+#define TCG_TARGET_HAS_div2_i32 0
32
+#define TCG_TARGET_HAS_rot_i32 1
33
+#define TCG_TARGET_HAS_deposit_i32 1
34
+#define TCG_TARGET_HAS_extract_i32 1
35
+#define TCG_TARGET_HAS_sextract_i32 0
36
+#define TCG_TARGET_HAS_extract2_i32 0
37
+#define TCG_TARGET_HAS_add2_i32 0
38
+#define TCG_TARGET_HAS_sub2_i32 0
39
+#define TCG_TARGET_HAS_mulu2_i32 0
40
+#define TCG_TARGET_HAS_muls2_i32 0
41
+#define TCG_TARGET_HAS_muluh_i32 1
42
+#define TCG_TARGET_HAS_mulsh_i32 1
43
+#define TCG_TARGET_HAS_ext8s_i32 1
44
+#define TCG_TARGET_HAS_ext16s_i32 1
45
+#define TCG_TARGET_HAS_ext8u_i32 1
46
+#define TCG_TARGET_HAS_ext16u_i32 1
47
+#define TCG_TARGET_HAS_bswap16_i32 1
48
+#define TCG_TARGET_HAS_bswap32_i32 1
49
+#define TCG_TARGET_HAS_not_i32 1
50
+#define TCG_TARGET_HAS_andc_i32 1
51
+#define TCG_TARGET_HAS_orc_i32 1
52
+#define TCG_TARGET_HAS_eqv_i32 0
53
+#define TCG_TARGET_HAS_nand_i32 0
54
+#define TCG_TARGET_HAS_nor_i32 1
55
+#define TCG_TARGET_HAS_clz_i32 1
56
+#define TCG_TARGET_HAS_ctz_i32 1
57
+#define TCG_TARGET_HAS_ctpop_i32 0
58
+#define TCG_TARGET_HAS_brcond2 0
59
+#define TCG_TARGET_HAS_setcond2 0
60
+#define TCG_TARGET_HAS_qemu_st8_i32 0
61
+
62
+/* 64-bit operations */
63
+#define TCG_TARGET_HAS_negsetcond_i64 0
64
+#define TCG_TARGET_HAS_div_i64 1
65
+#define TCG_TARGET_HAS_rem_i64 1
66
+#define TCG_TARGET_HAS_div2_i64 0
67
+#define TCG_TARGET_HAS_rot_i64 1
68
+#define TCG_TARGET_HAS_deposit_i64 1
69
+#define TCG_TARGET_HAS_extract_i64 1
70
+#define TCG_TARGET_HAS_sextract_i64 0
71
+#define TCG_TARGET_HAS_extract2_i64 0
72
+#define TCG_TARGET_HAS_extr_i64_i32 1
73
+#define TCG_TARGET_HAS_ext8s_i64 1
74
+#define TCG_TARGET_HAS_ext16s_i64 1
75
+#define TCG_TARGET_HAS_ext32s_i64 1
76
+#define TCG_TARGET_HAS_ext8u_i64 1
77
+#define TCG_TARGET_HAS_ext16u_i64 1
78
+#define TCG_TARGET_HAS_ext32u_i64 1
79
+#define TCG_TARGET_HAS_bswap16_i64 1
80
+#define TCG_TARGET_HAS_bswap32_i64 1
81
+#define TCG_TARGET_HAS_bswap64_i64 1
82
+#define TCG_TARGET_HAS_not_i64 1
83
+#define TCG_TARGET_HAS_andc_i64 1
84
+#define TCG_TARGET_HAS_orc_i64 1
85
+#define TCG_TARGET_HAS_eqv_i64 0
86
+#define TCG_TARGET_HAS_nand_i64 0
87
+#define TCG_TARGET_HAS_nor_i64 1
88
+#define TCG_TARGET_HAS_clz_i64 1
89
+#define TCG_TARGET_HAS_ctz_i64 1
90
+#define TCG_TARGET_HAS_ctpop_i64 0
91
+#define TCG_TARGET_HAS_add2_i64 0
92
+#define TCG_TARGET_HAS_sub2_i64 0
93
+#define TCG_TARGET_HAS_mulu2_i64 0
94
+#define TCG_TARGET_HAS_muls2_i64 0
95
+#define TCG_TARGET_HAS_muluh_i64 1
96
+#define TCG_TARGET_HAS_mulsh_i64 1
97
+
98
+#define TCG_TARGET_HAS_qemu_ldst_i128 (cpuinfo & CPUINFO_LSX)
99
+
100
+#define TCG_TARGET_HAS_tst 0
101
+
102
+#define TCG_TARGET_HAS_v64 (cpuinfo & CPUINFO_LSX)
103
+#define TCG_TARGET_HAS_v128 (cpuinfo & CPUINFO_LSX)
104
+#define TCG_TARGET_HAS_v256 (cpuinfo & CPUINFO_LASX)
105
+
106
+#define TCG_TARGET_HAS_not_vec 1
107
+#define TCG_TARGET_HAS_neg_vec 1
108
+#define TCG_TARGET_HAS_abs_vec 0
109
+#define TCG_TARGET_HAS_andc_vec 1
110
+#define TCG_TARGET_HAS_orc_vec 1
111
+#define TCG_TARGET_HAS_nand_vec 0
112
+#define TCG_TARGET_HAS_nor_vec 1
113
+#define TCG_TARGET_HAS_eqv_vec 0
114
+#define TCG_TARGET_HAS_mul_vec 1
115
+#define TCG_TARGET_HAS_shi_vec 1
116
+#define TCG_TARGET_HAS_shs_vec 0
117
+#define TCG_TARGET_HAS_shv_vec 1
118
+#define TCG_TARGET_HAS_roti_vec 1
119
+#define TCG_TARGET_HAS_rots_vec 0
120
+#define TCG_TARGET_HAS_rotv_vec 1
121
+#define TCG_TARGET_HAS_sat_vec 1
122
+#define TCG_TARGET_HAS_minmax_vec 1
123
+#define TCG_TARGET_HAS_bitsel_vec 1
124
+#define TCG_TARGET_HAS_cmpsel_vec 0
125
+#define TCG_TARGET_HAS_tst_vec 0
126
+
127
+
128
+#endif
129
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
130
index XXXXXXX..XXXXXXX 100644
131
--- a/tcg/loongarch64/tcg-target.h
132
+++ b/tcg/loongarch64/tcg-target.h
133
@@ -XXX,XX +XXX,XX @@
134
#ifndef LOONGARCH_TCG_TARGET_H
135
#define LOONGARCH_TCG_TARGET_H
136
137
-#include "host/cpuinfo.h"
138
-
139
#define TCG_TARGET_INSN_UNIT_SIZE 4
140
#define TCG_TARGET_NB_REGS 64
141
142
@@ -XXX,XX +XXX,XX @@ typedef enum {
143
TCG_VEC_TMP0 = TCG_REG_V23,
144
} TCGReg;
145
146
-/* optional instructions */
147
-#define TCG_TARGET_HAS_negsetcond_i32 0
148
-#define TCG_TARGET_HAS_div_i32 1
149
-#define TCG_TARGET_HAS_rem_i32 1
150
-#define TCG_TARGET_HAS_div2_i32 0
151
-#define TCG_TARGET_HAS_rot_i32 1
152
-#define TCG_TARGET_HAS_deposit_i32 1
153
-#define TCG_TARGET_HAS_extract_i32 1
154
-#define TCG_TARGET_HAS_sextract_i32 0
155
-#define TCG_TARGET_HAS_extract2_i32 0
156
-#define TCG_TARGET_HAS_add2_i32 0
157
-#define TCG_TARGET_HAS_sub2_i32 0
158
-#define TCG_TARGET_HAS_mulu2_i32 0
159
-#define TCG_TARGET_HAS_muls2_i32 0
160
-#define TCG_TARGET_HAS_muluh_i32 1
161
-#define TCG_TARGET_HAS_mulsh_i32 1
162
-#define TCG_TARGET_HAS_ext8s_i32 1
163
-#define TCG_TARGET_HAS_ext16s_i32 1
164
-#define TCG_TARGET_HAS_ext8u_i32 1
165
-#define TCG_TARGET_HAS_ext16u_i32 1
166
-#define TCG_TARGET_HAS_bswap16_i32 1
167
-#define TCG_TARGET_HAS_bswap32_i32 1
168
-#define TCG_TARGET_HAS_not_i32 1
169
-#define TCG_TARGET_HAS_andc_i32 1
170
-#define TCG_TARGET_HAS_orc_i32 1
171
-#define TCG_TARGET_HAS_eqv_i32 0
172
-#define TCG_TARGET_HAS_nand_i32 0
173
-#define TCG_TARGET_HAS_nor_i32 1
174
-#define TCG_TARGET_HAS_clz_i32 1
175
-#define TCG_TARGET_HAS_ctz_i32 1
176
-#define TCG_TARGET_HAS_ctpop_i32 0
177
-#define TCG_TARGET_HAS_brcond2 0
178
-#define TCG_TARGET_HAS_setcond2 0
179
-#define TCG_TARGET_HAS_qemu_st8_i32 0
180
-
181
-/* 64-bit operations */
182
-#define TCG_TARGET_HAS_negsetcond_i64 0
183
-#define TCG_TARGET_HAS_div_i64 1
184
-#define TCG_TARGET_HAS_rem_i64 1
185
-#define TCG_TARGET_HAS_div2_i64 0
186
-#define TCG_TARGET_HAS_rot_i64 1
187
-#define TCG_TARGET_HAS_deposit_i64 1
188
-#define TCG_TARGET_HAS_extract_i64 1
189
-#define TCG_TARGET_HAS_sextract_i64 0
190
-#define TCG_TARGET_HAS_extract2_i64 0
191
-#define TCG_TARGET_HAS_extr_i64_i32 1
192
-#define TCG_TARGET_HAS_ext8s_i64 1
193
-#define TCG_TARGET_HAS_ext16s_i64 1
194
-#define TCG_TARGET_HAS_ext32s_i64 1
195
-#define TCG_TARGET_HAS_ext8u_i64 1
196
-#define TCG_TARGET_HAS_ext16u_i64 1
197
-#define TCG_TARGET_HAS_ext32u_i64 1
198
-#define TCG_TARGET_HAS_bswap16_i64 1
199
-#define TCG_TARGET_HAS_bswap32_i64 1
200
-#define TCG_TARGET_HAS_bswap64_i64 1
201
-#define TCG_TARGET_HAS_not_i64 1
202
-#define TCG_TARGET_HAS_andc_i64 1
203
-#define TCG_TARGET_HAS_orc_i64 1
204
-#define TCG_TARGET_HAS_eqv_i64 0
205
-#define TCG_TARGET_HAS_nand_i64 0
206
-#define TCG_TARGET_HAS_nor_i64 1
207
-#define TCG_TARGET_HAS_clz_i64 1
208
-#define TCG_TARGET_HAS_ctz_i64 1
209
-#define TCG_TARGET_HAS_ctpop_i64 0
210
-#define TCG_TARGET_HAS_add2_i64 0
211
-#define TCG_TARGET_HAS_sub2_i64 0
212
-#define TCG_TARGET_HAS_mulu2_i64 0
213
-#define TCG_TARGET_HAS_muls2_i64 0
214
-#define TCG_TARGET_HAS_muluh_i64 1
215
-#define TCG_TARGET_HAS_mulsh_i64 1
216
-
217
-#define TCG_TARGET_HAS_qemu_ldst_i128 (cpuinfo & CPUINFO_LSX)
218
-
219
-#define TCG_TARGET_HAS_tst 0
220
-
221
-#define TCG_TARGET_HAS_v64 (cpuinfo & CPUINFO_LSX)
222
-#define TCG_TARGET_HAS_v128 (cpuinfo & CPUINFO_LSX)
223
-#define TCG_TARGET_HAS_v256 (cpuinfo & CPUINFO_LASX)
224
-
225
-#define TCG_TARGET_HAS_not_vec 1
226
-#define TCG_TARGET_HAS_neg_vec 1
227
-#define TCG_TARGET_HAS_abs_vec 0
228
-#define TCG_TARGET_HAS_andc_vec 1
229
-#define TCG_TARGET_HAS_orc_vec 1
230
-#define TCG_TARGET_HAS_nand_vec 0
231
-#define TCG_TARGET_HAS_nor_vec 1
232
-#define TCG_TARGET_HAS_eqv_vec 0
233
-#define TCG_TARGET_HAS_mul_vec 1
234
-#define TCG_TARGET_HAS_shi_vec 1
235
-#define TCG_TARGET_HAS_shs_vec 0
236
-#define TCG_TARGET_HAS_shv_vec 1
237
-#define TCG_TARGET_HAS_roti_vec 1
238
-#define TCG_TARGET_HAS_rots_vec 0
239
-#define TCG_TARGET_HAS_rotv_vec 1
240
-#define TCG_TARGET_HAS_sat_vec 1
241
-#define TCG_TARGET_HAS_minmax_vec 1
242
-#define TCG_TARGET_HAS_bitsel_vec 1
243
-#define TCG_TARGET_HAS_cmpsel_vec 0
244
-#define TCG_TARGET_HAS_tst_vec 0
245
+#include "tcg-target-has.h"
246
247
#define TCG_TARGET_DEFAULT_MO (0)
248
249
--
250
2.43.0
251
252
diff view generated by jsdifflib
New patch
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-8-philmd@linaro.org>
4
---
5
tcg/mips/tcg-target-has.h | 122 ++++++++++++++++++++++++++++++++++++++
6
tcg/mips/tcg-target.h | 112 +---------------------------------
7
2 files changed, 123 insertions(+), 111 deletions(-)
8
create mode 100644 tcg/mips/tcg-target-has.h
1
9
10
diff --git a/tcg/mips/tcg-target-has.h b/tcg/mips/tcg-target-has.h
11
new file mode 100644
12
index XXXXXXX..XXXXXXX
13
--- /dev/null
14
+++ b/tcg/mips/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: MIT */
17
+/*
18
+ * Define target-specific opcode support
19
+ * Copyright (c) 2008-2009 Arnaud Patard <arnaud.patard@rtp-net.org>
20
+ * Copyright (c) 2009 Aurelien Jarno <aurelien@aurel32.net>
21
+ */
22
+
23
+#ifndef TCG_TARGET_HAS_H
24
+#define TCG_TARGET_HAS_H
25
+
26
+/* MOVN/MOVZ instructions detection */
27
+#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
28
+ defined(_MIPS_ARCH_LOONGSON2E) || defined(_MIPS_ARCH_LOONGSON2F) || \
29
+ defined(_MIPS_ARCH_MIPS4)
30
+#define use_movnz_instructions 1
31
+#else
32
+extern bool use_movnz_instructions;
33
+#endif
34
+
35
+/* MIPS32 instruction set detection */
36
+#if defined(__mips_isa_rev) && (__mips_isa_rev >= 1)
37
+#define use_mips32_instructions 1
38
+#else
39
+extern bool use_mips32_instructions;
40
+#endif
41
+
42
+/* MIPS32R2 instruction set detection */
43
+#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
44
+#define use_mips32r2_instructions 1
45
+#else
46
+extern bool use_mips32r2_instructions;
47
+#endif
48
+
49
+/* MIPS32R6 instruction set detection */
50
+#if defined(__mips_isa_rev) && (__mips_isa_rev >= 6)
51
+#define use_mips32r6_instructions 1
52
+#else
53
+#define use_mips32r6_instructions 0
54
+#endif
55
+
56
+/* optional instructions */
57
+#define TCG_TARGET_HAS_div_i32 1
58
+#define TCG_TARGET_HAS_rem_i32 1
59
+#define TCG_TARGET_HAS_not_i32 1
60
+#define TCG_TARGET_HAS_nor_i32 1
61
+#define TCG_TARGET_HAS_andc_i32 0
62
+#define TCG_TARGET_HAS_orc_i32 0
63
+#define TCG_TARGET_HAS_eqv_i32 0
64
+#define TCG_TARGET_HAS_nand_i32 0
65
+#define TCG_TARGET_HAS_mulu2_i32 (!use_mips32r6_instructions)
66
+#define TCG_TARGET_HAS_muls2_i32 (!use_mips32r6_instructions)
67
+#define TCG_TARGET_HAS_muluh_i32 1
68
+#define TCG_TARGET_HAS_mulsh_i32 1
69
+#define TCG_TARGET_HAS_bswap32_i32 1
70
+#define TCG_TARGET_HAS_negsetcond_i32 0
71
+
72
+#if TCG_TARGET_REG_BITS == 64
73
+#define TCG_TARGET_HAS_add2_i32 0
74
+#define TCG_TARGET_HAS_sub2_i32 0
75
+#define TCG_TARGET_HAS_extr_i64_i32 1
76
+#define TCG_TARGET_HAS_div_i64 1
77
+#define TCG_TARGET_HAS_rem_i64 1
78
+#define TCG_TARGET_HAS_not_i64 1
79
+#define TCG_TARGET_HAS_nor_i64 1
80
+#define TCG_TARGET_HAS_andc_i64 0
81
+#define TCG_TARGET_HAS_orc_i64 0
82
+#define TCG_TARGET_HAS_eqv_i64 0
83
+#define TCG_TARGET_HAS_nand_i64 0
84
+#define TCG_TARGET_HAS_add2_i64 0
85
+#define TCG_TARGET_HAS_sub2_i64 0
86
+#define TCG_TARGET_HAS_mulu2_i64 (!use_mips32r6_instructions)
87
+#define TCG_TARGET_HAS_muls2_i64 (!use_mips32r6_instructions)
88
+#define TCG_TARGET_HAS_muluh_i64 1
89
+#define TCG_TARGET_HAS_mulsh_i64 1
90
+#define TCG_TARGET_HAS_ext32s_i64 1
91
+#define TCG_TARGET_HAS_ext32u_i64 1
92
+#define TCG_TARGET_HAS_negsetcond_i64 0
93
+#endif
94
+
95
+/* optional instructions detected at runtime */
96
+#define TCG_TARGET_HAS_bswap16_i32 use_mips32r2_instructions
97
+#define TCG_TARGET_HAS_deposit_i32 use_mips32r2_instructions
98
+#define TCG_TARGET_HAS_extract_i32 use_mips32r2_instructions
99
+#define TCG_TARGET_HAS_sextract_i32 0
100
+#define TCG_TARGET_HAS_extract2_i32 0
101
+#define TCG_TARGET_HAS_ext8s_i32 use_mips32r2_instructions
102
+#define TCG_TARGET_HAS_ext16s_i32 use_mips32r2_instructions
103
+#define TCG_TARGET_HAS_rot_i32 use_mips32r2_instructions
104
+#define TCG_TARGET_HAS_clz_i32 use_mips32r2_instructions
105
+#define TCG_TARGET_HAS_ctz_i32 0
106
+#define TCG_TARGET_HAS_ctpop_i32 0
107
+#define TCG_TARGET_HAS_qemu_st8_i32 0
108
+
109
+#if TCG_TARGET_REG_BITS == 64
110
+#define TCG_TARGET_HAS_bswap16_i64 use_mips32r2_instructions
111
+#define TCG_TARGET_HAS_bswap32_i64 use_mips32r2_instructions
112
+#define TCG_TARGET_HAS_bswap64_i64 use_mips32r2_instructions
113
+#define TCG_TARGET_HAS_deposit_i64 use_mips32r2_instructions
114
+#define TCG_TARGET_HAS_extract_i64 use_mips32r2_instructions
115
+#define TCG_TARGET_HAS_sextract_i64 0
116
+#define TCG_TARGET_HAS_extract2_i64 0
117
+#define TCG_TARGET_HAS_ext8s_i64 use_mips32r2_instructions
118
+#define TCG_TARGET_HAS_ext16s_i64 use_mips32r2_instructions
119
+#define TCG_TARGET_HAS_rot_i64 use_mips32r2_instructions
120
+#define TCG_TARGET_HAS_clz_i64 use_mips32r2_instructions
121
+#define TCG_TARGET_HAS_ctz_i64 0
122
+#define TCG_TARGET_HAS_ctpop_i64 0
123
+#endif
124
+
125
+/* optional instructions automatically implemented */
126
+#define TCG_TARGET_HAS_ext8u_i32 0 /* andi rt, rs, 0xff */
127
+#define TCG_TARGET_HAS_ext16u_i32 0 /* andi rt, rs, 0xffff */
128
+
129
+#if TCG_TARGET_REG_BITS == 64
130
+#define TCG_TARGET_HAS_ext8u_i64 0 /* andi rt, rs, 0xff */
131
+#define TCG_TARGET_HAS_ext16u_i64 0 /* andi rt, rs, 0xffff */
132
+#endif
133
+
134
+#define TCG_TARGET_HAS_qemu_ldst_i128 0
135
+#define TCG_TARGET_HAS_tst 0
136
+
137
+#endif
138
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
139
index XXXXXXX..XXXXXXX 100644
140
--- a/tcg/mips/tcg-target.h
141
+++ b/tcg/mips/tcg-target.h
142
@@ -XXX,XX +XXX,XX @@ typedef enum {
143
TCG_AREG0 = TCG_REG_S8,
144
} TCGReg;
145
146
-/* MOVN/MOVZ instructions detection */
147
-#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
148
- defined(_MIPS_ARCH_LOONGSON2E) || defined(_MIPS_ARCH_LOONGSON2F) || \
149
- defined(_MIPS_ARCH_MIPS4)
150
-#define use_movnz_instructions 1
151
-#else
152
-extern bool use_movnz_instructions;
153
-#endif
154
-
155
-/* MIPS32 instruction set detection */
156
-#if defined(__mips_isa_rev) && (__mips_isa_rev >= 1)
157
-#define use_mips32_instructions 1
158
-#else
159
-extern bool use_mips32_instructions;
160
-#endif
161
-
162
-/* MIPS32R2 instruction set detection */
163
-#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
164
-#define use_mips32r2_instructions 1
165
-#else
166
-extern bool use_mips32r2_instructions;
167
-#endif
168
-
169
-/* MIPS32R6 instruction set detection */
170
-#if defined(__mips_isa_rev) && (__mips_isa_rev >= 6)
171
-#define use_mips32r6_instructions 1
172
-#else
173
-#define use_mips32r6_instructions 0
174
-#endif
175
-
176
-/* optional instructions */
177
-#define TCG_TARGET_HAS_div_i32 1
178
-#define TCG_TARGET_HAS_rem_i32 1
179
-#define TCG_TARGET_HAS_not_i32 1
180
-#define TCG_TARGET_HAS_nor_i32 1
181
-#define TCG_TARGET_HAS_andc_i32 0
182
-#define TCG_TARGET_HAS_orc_i32 0
183
-#define TCG_TARGET_HAS_eqv_i32 0
184
-#define TCG_TARGET_HAS_nand_i32 0
185
-#define TCG_TARGET_HAS_mulu2_i32 (!use_mips32r6_instructions)
186
-#define TCG_TARGET_HAS_muls2_i32 (!use_mips32r6_instructions)
187
-#define TCG_TARGET_HAS_muluh_i32 1
188
-#define TCG_TARGET_HAS_mulsh_i32 1
189
-#define TCG_TARGET_HAS_bswap32_i32 1
190
-#define TCG_TARGET_HAS_negsetcond_i32 0
191
-
192
-#if TCG_TARGET_REG_BITS == 64
193
-#define TCG_TARGET_HAS_add2_i32 0
194
-#define TCG_TARGET_HAS_sub2_i32 0
195
-#define TCG_TARGET_HAS_extr_i64_i32 1
196
-#define TCG_TARGET_HAS_div_i64 1
197
-#define TCG_TARGET_HAS_rem_i64 1
198
-#define TCG_TARGET_HAS_not_i64 1
199
-#define TCG_TARGET_HAS_nor_i64 1
200
-#define TCG_TARGET_HAS_andc_i64 0
201
-#define TCG_TARGET_HAS_orc_i64 0
202
-#define TCG_TARGET_HAS_eqv_i64 0
203
-#define TCG_TARGET_HAS_nand_i64 0
204
-#define TCG_TARGET_HAS_add2_i64 0
205
-#define TCG_TARGET_HAS_sub2_i64 0
206
-#define TCG_TARGET_HAS_mulu2_i64 (!use_mips32r6_instructions)
207
-#define TCG_TARGET_HAS_muls2_i64 (!use_mips32r6_instructions)
208
-#define TCG_TARGET_HAS_muluh_i64 1
209
-#define TCG_TARGET_HAS_mulsh_i64 1
210
-#define TCG_TARGET_HAS_ext32s_i64 1
211
-#define TCG_TARGET_HAS_ext32u_i64 1
212
-#define TCG_TARGET_HAS_negsetcond_i64 0
213
-#endif
214
-
215
-/* optional instructions detected at runtime */
216
-#define TCG_TARGET_HAS_bswap16_i32 use_mips32r2_instructions
217
-#define TCG_TARGET_HAS_deposit_i32 use_mips32r2_instructions
218
-#define TCG_TARGET_HAS_extract_i32 use_mips32r2_instructions
219
-#define TCG_TARGET_HAS_sextract_i32 0
220
-#define TCG_TARGET_HAS_extract2_i32 0
221
-#define TCG_TARGET_HAS_ext8s_i32 use_mips32r2_instructions
222
-#define TCG_TARGET_HAS_ext16s_i32 use_mips32r2_instructions
223
-#define TCG_TARGET_HAS_rot_i32 use_mips32r2_instructions
224
-#define TCG_TARGET_HAS_clz_i32 use_mips32r2_instructions
225
-#define TCG_TARGET_HAS_ctz_i32 0
226
-#define TCG_TARGET_HAS_ctpop_i32 0
227
-#define TCG_TARGET_HAS_qemu_st8_i32 0
228
-
229
-#if TCG_TARGET_REG_BITS == 64
230
-#define TCG_TARGET_HAS_bswap16_i64 use_mips32r2_instructions
231
-#define TCG_TARGET_HAS_bswap32_i64 use_mips32r2_instructions
232
-#define TCG_TARGET_HAS_bswap64_i64 use_mips32r2_instructions
233
-#define TCG_TARGET_HAS_deposit_i64 use_mips32r2_instructions
234
-#define TCG_TARGET_HAS_extract_i64 use_mips32r2_instructions
235
-#define TCG_TARGET_HAS_sextract_i64 0
236
-#define TCG_TARGET_HAS_extract2_i64 0
237
-#define TCG_TARGET_HAS_ext8s_i64 use_mips32r2_instructions
238
-#define TCG_TARGET_HAS_ext16s_i64 use_mips32r2_instructions
239
-#define TCG_TARGET_HAS_rot_i64 use_mips32r2_instructions
240
-#define TCG_TARGET_HAS_clz_i64 use_mips32r2_instructions
241
-#define TCG_TARGET_HAS_ctz_i64 0
242
-#define TCG_TARGET_HAS_ctpop_i64 0
243
-#endif
244
-
245
-/* optional instructions automatically implemented */
246
-#define TCG_TARGET_HAS_ext8u_i32 0 /* andi rt, rs, 0xff */
247
-#define TCG_TARGET_HAS_ext16u_i32 0 /* andi rt, rs, 0xffff */
248
-
249
-#if TCG_TARGET_REG_BITS == 64
250
-#define TCG_TARGET_HAS_ext8u_i64 0 /* andi rt, rs, 0xff */
251
-#define TCG_TARGET_HAS_ext16u_i64 0 /* andi rt, rs, 0xffff */
252
-#endif
253
-
254
-#define TCG_TARGET_HAS_qemu_ldst_i128 0
255
-
256
-#define TCG_TARGET_HAS_tst 0
257
+#include "tcg-target-has.h"
258
259
#define TCG_TARGET_DEFAULT_MO 0
260
261
--
262
2.43.0
263
264
diff view generated by jsdifflib
1
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-9-philmd@linaro.org>
3
---
4
---
4
host/include/aarch64/host/store-insert-al16.h | 47 +++++++++++++++++++
5
tcg/ppc/tcg-target-has.h | 124 +++++++++++++++++++++++++++++++++++++++
5
1 file changed, 47 insertions(+)
6
tcg/ppc/tcg-target.h | 114 +----------------------------------
6
create mode 100644 host/include/aarch64/host/store-insert-al16.h
7
2 files changed, 125 insertions(+), 113 deletions(-)
8
create mode 100644 tcg/ppc/tcg-target-has.h
7
9
8
diff --git a/host/include/aarch64/host/store-insert-al16.h b/host/include/aarch64/host/store-insert-al16.h
10
diff --git a/tcg/ppc/tcg-target-has.h b/tcg/ppc/tcg-target-has.h
9
new file mode 100644
11
new file mode 100644
10
index XXXXXXX..XXXXXXX
12
index XXXXXXX..XXXXXXX
11
--- /dev/null
13
--- /dev/null
12
+++ b/host/include/aarch64/host/store-insert-al16.h
14
+++ b/tcg/ppc/tcg-target-has.h
13
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: MIT */
14
+/*
17
+/*
15
+ * SPDX-License-Identifier: GPL-2.0-or-later
18
+ * Define target-specific opcode support
16
+ * Atomic store insert into 128-bit, AArch64 version.
19
+ * Copyright (c) 2008 Fabrice Bellard
17
+ *
18
+ * Copyright (C) 2023 Linaro, Ltd.
19
+ */
20
+ */
20
+
21
+
21
+#ifndef AARCH64_STORE_INSERT_AL16_H
22
+#ifndef TCG_TARGET_HAS_H
22
+#define AARCH64_STORE_INSERT_AL16_H
23
+#define TCG_TARGET_HAS_H
23
+
24
+
24
+/**
25
+#include "host/cpuinfo.h"
25
+ * store_atom_insert_al16:
26
+
26
+ * @p: host address
27
+#define have_isa_2_06 (cpuinfo & CPUINFO_V2_06)
27
+ * @val: shifted value to store
28
+#define have_isa_2_07 (cpuinfo & CPUINFO_V2_07)
28
+ * @msk: mask for value to store
29
+#define have_isa_3_00 (cpuinfo & CPUINFO_V3_0)
29
+ *
30
+#define have_isa_3_10 (cpuinfo & CPUINFO_V3_1)
30
+ * Atomically store @val to @p masked by @msk.
31
+#define have_altivec (cpuinfo & CPUINFO_ALTIVEC)
32
+#define have_vsx (cpuinfo & CPUINFO_VSX)
33
+
34
+/* optional instructions automatically implemented */
35
+#define TCG_TARGET_HAS_ext8u_i32 0 /* andi */
36
+#define TCG_TARGET_HAS_ext16u_i32 0
37
+
38
+/* optional instructions */
39
+#define TCG_TARGET_HAS_div_i32 1
40
+#define TCG_TARGET_HAS_rem_i32 have_isa_3_00
41
+#define TCG_TARGET_HAS_rot_i32 1
42
+#define TCG_TARGET_HAS_ext8s_i32 1
43
+#define TCG_TARGET_HAS_ext16s_i32 1
44
+#define TCG_TARGET_HAS_bswap16_i32 1
45
+#define TCG_TARGET_HAS_bswap32_i32 1
46
+#define TCG_TARGET_HAS_not_i32 1
47
+#define TCG_TARGET_HAS_andc_i32 1
48
+#define TCG_TARGET_HAS_orc_i32 1
49
+#define TCG_TARGET_HAS_eqv_i32 1
50
+#define TCG_TARGET_HAS_nand_i32 1
51
+#define TCG_TARGET_HAS_nor_i32 1
52
+#define TCG_TARGET_HAS_clz_i32 1
53
+#define TCG_TARGET_HAS_ctz_i32 have_isa_3_00
54
+#define TCG_TARGET_HAS_ctpop_i32 have_isa_2_06
55
+#define TCG_TARGET_HAS_deposit_i32 1
56
+#define TCG_TARGET_HAS_extract_i32 1
57
+#define TCG_TARGET_HAS_sextract_i32 0
58
+#define TCG_TARGET_HAS_extract2_i32 0
59
+#define TCG_TARGET_HAS_negsetcond_i32 1
60
+#define TCG_TARGET_HAS_mulu2_i32 0
61
+#define TCG_TARGET_HAS_muls2_i32 0
62
+#define TCG_TARGET_HAS_muluh_i32 1
63
+#define TCG_TARGET_HAS_mulsh_i32 1
64
+#define TCG_TARGET_HAS_qemu_st8_i32 0
65
+
66
+#if TCG_TARGET_REG_BITS == 64
67
+#define TCG_TARGET_HAS_add2_i32 0
68
+#define TCG_TARGET_HAS_sub2_i32 0
69
+#define TCG_TARGET_HAS_extr_i64_i32 0
70
+#define TCG_TARGET_HAS_div_i64 1
71
+#define TCG_TARGET_HAS_rem_i64 have_isa_3_00
72
+#define TCG_TARGET_HAS_rot_i64 1
73
+#define TCG_TARGET_HAS_ext8s_i64 1
74
+#define TCG_TARGET_HAS_ext16s_i64 1
75
+#define TCG_TARGET_HAS_ext32s_i64 1
76
+#define TCG_TARGET_HAS_ext8u_i64 0
77
+#define TCG_TARGET_HAS_ext16u_i64 0
78
+#define TCG_TARGET_HAS_ext32u_i64 0
79
+#define TCG_TARGET_HAS_bswap16_i64 1
80
+#define TCG_TARGET_HAS_bswap32_i64 1
81
+#define TCG_TARGET_HAS_bswap64_i64 1
82
+#define TCG_TARGET_HAS_not_i64 1
83
+#define TCG_TARGET_HAS_andc_i64 1
84
+#define TCG_TARGET_HAS_orc_i64 1
85
+#define TCG_TARGET_HAS_eqv_i64 1
86
+#define TCG_TARGET_HAS_nand_i64 1
87
+#define TCG_TARGET_HAS_nor_i64 1
88
+#define TCG_TARGET_HAS_clz_i64 1
89
+#define TCG_TARGET_HAS_ctz_i64 have_isa_3_00
90
+#define TCG_TARGET_HAS_ctpop_i64 have_isa_2_06
91
+#define TCG_TARGET_HAS_deposit_i64 1
92
+#define TCG_TARGET_HAS_extract_i64 1
93
+#define TCG_TARGET_HAS_sextract_i64 0
94
+#define TCG_TARGET_HAS_extract2_i64 0
95
+#define TCG_TARGET_HAS_negsetcond_i64 1
96
+#define TCG_TARGET_HAS_add2_i64 1
97
+#define TCG_TARGET_HAS_sub2_i64 1
98
+#define TCG_TARGET_HAS_mulu2_i64 0
99
+#define TCG_TARGET_HAS_muls2_i64 0
100
+#define TCG_TARGET_HAS_muluh_i64 1
101
+#define TCG_TARGET_HAS_mulsh_i64 1
102
+#endif
103
+
104
+#define TCG_TARGET_HAS_qemu_ldst_i128 \
105
+ (TCG_TARGET_REG_BITS == 64 && have_isa_2_07)
106
+
107
+#define TCG_TARGET_HAS_tst 1
108
+
109
+/*
110
+ * While technically Altivec could support V64, it has no 64-bit store
111
+ * instruction and substituting two 32-bit stores makes the generated
112
+ * code quite large.
31
+ */
113
+ */
32
+static inline void ATTRIBUTE_ATOMIC128_OPT
114
+#define TCG_TARGET_HAS_v64 have_vsx
33
+store_atom_insert_al16(Int128 *ps, Int128 val, Int128 msk)
115
+#define TCG_TARGET_HAS_v128 have_altivec
34
+{
116
+#define TCG_TARGET_HAS_v256 0
35
+ /*
117
+
36
+ * GCC only implements __sync* primitives for int128 on aarch64.
118
+#define TCG_TARGET_HAS_andc_vec 1
37
+ * We can do better without the barriers, and integrating the
119
+#define TCG_TARGET_HAS_orc_vec have_isa_2_07
38
+ * arithmetic into the load-exclusive/store-conditional pair.
120
+#define TCG_TARGET_HAS_nand_vec have_isa_2_07
39
+ */
121
+#define TCG_TARGET_HAS_nor_vec 1
40
+ uint64_t tl, th, vl, vh, ml, mh;
122
+#define TCG_TARGET_HAS_eqv_vec have_isa_2_07
41
+ uint32_t fail;
123
+#define TCG_TARGET_HAS_not_vec 1
42
+
124
+#define TCG_TARGET_HAS_neg_vec have_isa_3_00
43
+ qemu_build_assert(!HOST_BIG_ENDIAN);
125
+#define TCG_TARGET_HAS_abs_vec 0
44
+ vl = int128_getlo(val);
126
+#define TCG_TARGET_HAS_roti_vec 0
45
+ vh = int128_gethi(val);
127
+#define TCG_TARGET_HAS_rots_vec 0
46
+ ml = int128_getlo(msk);
128
+#define TCG_TARGET_HAS_rotv_vec 1
47
+ mh = int128_gethi(msk);
129
+#define TCG_TARGET_HAS_shi_vec 0
48
+
130
+#define TCG_TARGET_HAS_shs_vec 0
49
+ asm("0: ldxp %[l], %[h], %[mem]\n\t"
131
+#define TCG_TARGET_HAS_shv_vec 1
50
+ "bic %[l], %[l], %[ml]\n\t"
132
+#define TCG_TARGET_HAS_mul_vec 1
51
+ "bic %[h], %[h], %[mh]\n\t"
133
+#define TCG_TARGET_HAS_sat_vec 1
52
+ "orr %[l], %[l], %[vl]\n\t"
134
+#define TCG_TARGET_HAS_minmax_vec 1
53
+ "orr %[h], %[h], %[vh]\n\t"
135
+#define TCG_TARGET_HAS_bitsel_vec have_vsx
54
+ "stxp %w[f], %[l], %[h], %[mem]\n\t"
136
+#define TCG_TARGET_HAS_cmpsel_vec 1
55
+ "cbnz %w[f], 0b\n"
137
+#define TCG_TARGET_HAS_tst_vec 0
56
+ : [mem] "+Q"(*ps), [f] "=&r"(fail), [l] "=&r"(tl), [h] "=&r"(th)
138
+
57
+ : [vl] "r"(vl), [vh] "r"(vh), [ml] "r"(ml), [mh] "r"(mh));
139
+#endif
58
+}
140
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
59
+
141
index XXXXXXX..XXXXXXX 100644
60
+#endif /* AARCH64_STORE_INSERT_AL16_H */
142
--- a/tcg/ppc/tcg-target.h
143
+++ b/tcg/ppc/tcg-target.h
144
@@ -XXX,XX +XXX,XX @@
145
#ifndef PPC_TCG_TARGET_H
146
#define PPC_TCG_TARGET_H
147
148
-#include "host/cpuinfo.h"
149
-
150
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
151
152
#define TCG_TARGET_NB_REGS 64
153
@@ -XXX,XX +XXX,XX @@ typedef enum {
154
TCG_AREG0 = TCG_REG_R27
155
} TCGReg;
156
157
-#define have_isa_2_06 (cpuinfo & CPUINFO_V2_06)
158
-#define have_isa_2_07 (cpuinfo & CPUINFO_V2_07)
159
-#define have_isa_3_00 (cpuinfo & CPUINFO_V3_0)
160
-#define have_isa_3_10 (cpuinfo & CPUINFO_V3_1)
161
-#define have_altivec (cpuinfo & CPUINFO_ALTIVEC)
162
-#define have_vsx (cpuinfo & CPUINFO_VSX)
163
-
164
-/* optional instructions automatically implemented */
165
-#define TCG_TARGET_HAS_ext8u_i32 0 /* andi */
166
-#define TCG_TARGET_HAS_ext16u_i32 0
167
-
168
-/* optional instructions */
169
-#define TCG_TARGET_HAS_div_i32 1
170
-#define TCG_TARGET_HAS_rem_i32 have_isa_3_00
171
-#define TCG_TARGET_HAS_rot_i32 1
172
-#define TCG_TARGET_HAS_ext8s_i32 1
173
-#define TCG_TARGET_HAS_ext16s_i32 1
174
-#define TCG_TARGET_HAS_bswap16_i32 1
175
-#define TCG_TARGET_HAS_bswap32_i32 1
176
-#define TCG_TARGET_HAS_not_i32 1
177
-#define TCG_TARGET_HAS_andc_i32 1
178
-#define TCG_TARGET_HAS_orc_i32 1
179
-#define TCG_TARGET_HAS_eqv_i32 1
180
-#define TCG_TARGET_HAS_nand_i32 1
181
-#define TCG_TARGET_HAS_nor_i32 1
182
-#define TCG_TARGET_HAS_clz_i32 1
183
-#define TCG_TARGET_HAS_ctz_i32 have_isa_3_00
184
-#define TCG_TARGET_HAS_ctpop_i32 have_isa_2_06
185
-#define TCG_TARGET_HAS_deposit_i32 1
186
-#define TCG_TARGET_HAS_extract_i32 1
187
-#define TCG_TARGET_HAS_sextract_i32 0
188
-#define TCG_TARGET_HAS_extract2_i32 0
189
-#define TCG_TARGET_HAS_negsetcond_i32 1
190
-#define TCG_TARGET_HAS_mulu2_i32 0
191
-#define TCG_TARGET_HAS_muls2_i32 0
192
-#define TCG_TARGET_HAS_muluh_i32 1
193
-#define TCG_TARGET_HAS_mulsh_i32 1
194
-#define TCG_TARGET_HAS_qemu_st8_i32 0
195
-
196
-#if TCG_TARGET_REG_BITS == 64
197
-#define TCG_TARGET_HAS_add2_i32 0
198
-#define TCG_TARGET_HAS_sub2_i32 0
199
-#define TCG_TARGET_HAS_extr_i64_i32 0
200
-#define TCG_TARGET_HAS_div_i64 1
201
-#define TCG_TARGET_HAS_rem_i64 have_isa_3_00
202
-#define TCG_TARGET_HAS_rot_i64 1
203
-#define TCG_TARGET_HAS_ext8s_i64 1
204
-#define TCG_TARGET_HAS_ext16s_i64 1
205
-#define TCG_TARGET_HAS_ext32s_i64 1
206
-#define TCG_TARGET_HAS_ext8u_i64 0
207
-#define TCG_TARGET_HAS_ext16u_i64 0
208
-#define TCG_TARGET_HAS_ext32u_i64 0
209
-#define TCG_TARGET_HAS_bswap16_i64 1
210
-#define TCG_TARGET_HAS_bswap32_i64 1
211
-#define TCG_TARGET_HAS_bswap64_i64 1
212
-#define TCG_TARGET_HAS_not_i64 1
213
-#define TCG_TARGET_HAS_andc_i64 1
214
-#define TCG_TARGET_HAS_orc_i64 1
215
-#define TCG_TARGET_HAS_eqv_i64 1
216
-#define TCG_TARGET_HAS_nand_i64 1
217
-#define TCG_TARGET_HAS_nor_i64 1
218
-#define TCG_TARGET_HAS_clz_i64 1
219
-#define TCG_TARGET_HAS_ctz_i64 have_isa_3_00
220
-#define TCG_TARGET_HAS_ctpop_i64 have_isa_2_06
221
-#define TCG_TARGET_HAS_deposit_i64 1
222
-#define TCG_TARGET_HAS_extract_i64 1
223
-#define TCG_TARGET_HAS_sextract_i64 0
224
-#define TCG_TARGET_HAS_extract2_i64 0
225
-#define TCG_TARGET_HAS_negsetcond_i64 1
226
-#define TCG_TARGET_HAS_add2_i64 1
227
-#define TCG_TARGET_HAS_sub2_i64 1
228
-#define TCG_TARGET_HAS_mulu2_i64 0
229
-#define TCG_TARGET_HAS_muls2_i64 0
230
-#define TCG_TARGET_HAS_muluh_i64 1
231
-#define TCG_TARGET_HAS_mulsh_i64 1
232
-#endif
233
-
234
-#define TCG_TARGET_HAS_qemu_ldst_i128 \
235
- (TCG_TARGET_REG_BITS == 64 && have_isa_2_07)
236
-
237
-#define TCG_TARGET_HAS_tst 1
238
-
239
-/*
240
- * While technically Altivec could support V64, it has no 64-bit store
241
- * instruction and substituting two 32-bit stores makes the generated
242
- * code quite large.
243
- */
244
-#define TCG_TARGET_HAS_v64 have_vsx
245
-#define TCG_TARGET_HAS_v128 have_altivec
246
-#define TCG_TARGET_HAS_v256 0
247
-
248
-#define TCG_TARGET_HAS_andc_vec 1
249
-#define TCG_TARGET_HAS_orc_vec have_isa_2_07
250
-#define TCG_TARGET_HAS_nand_vec have_isa_2_07
251
-#define TCG_TARGET_HAS_nor_vec 1
252
-#define TCG_TARGET_HAS_eqv_vec have_isa_2_07
253
-#define TCG_TARGET_HAS_not_vec 1
254
-#define TCG_TARGET_HAS_neg_vec have_isa_3_00
255
-#define TCG_TARGET_HAS_abs_vec 0
256
-#define TCG_TARGET_HAS_roti_vec 0
257
-#define TCG_TARGET_HAS_rots_vec 0
258
-#define TCG_TARGET_HAS_rotv_vec 1
259
-#define TCG_TARGET_HAS_shi_vec 0
260
-#define TCG_TARGET_HAS_shs_vec 0
261
-#define TCG_TARGET_HAS_shv_vec 1
262
-#define TCG_TARGET_HAS_mul_vec 1
263
-#define TCG_TARGET_HAS_sat_vec 1
264
-#define TCG_TARGET_HAS_minmax_vec 1
265
-#define TCG_TARGET_HAS_bitsel_vec have_vsx
266
-#define TCG_TARGET_HAS_cmpsel_vec 1
267
-#define TCG_TARGET_HAS_tst_vec 0
268
+#include "tcg-target-has.h"
269
270
#define TCG_TARGET_DEFAULT_MO (0)
271
61
--
272
--
62
2.34.1
273
2.43.0
274
275
diff view generated by jsdifflib
1
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-10-philmd@linaro.org>
3
---
4
---
4
.../aarch64/host/load-extract-al16-al8.h | 40 +++++++++++++++++++
5
tcg/riscv/tcg-target-has.h | 112 +++++++++++++++++++++++++++++++++++++
5
1 file changed, 40 insertions(+)
6
tcg/riscv/tcg-target.h | 102 +--------------------------------
6
create mode 100644 host/include/aarch64/host/load-extract-al16-al8.h
7
2 files changed, 113 insertions(+), 101 deletions(-)
8
create mode 100644 tcg/riscv/tcg-target-has.h
7
9
8
diff --git a/host/include/aarch64/host/load-extract-al16-al8.h b/host/include/aarch64/host/load-extract-al16-al8.h
10
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
9
new file mode 100644
11
new file mode 100644
10
index XXXXXXX..XXXXXXX
12
index XXXXXXX..XXXXXXX
11
--- /dev/null
13
--- /dev/null
12
+++ b/host/include/aarch64/host/load-extract-al16-al8.h
14
+++ b/tcg/riscv/tcg-target-has.h
13
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: MIT */
14
+/*
17
+/*
15
+ * SPDX-License-Identifier: GPL-2.0-or-later
18
+ * Define target-specific opcode support
16
+ * Atomic extract 64 from 128-bit, AArch64 version.
19
+ * Copyright (c) 2018 SiFive, Inc
17
+ *
18
+ * Copyright (C) 2023 Linaro, Ltd.
19
+ */
20
+ */
20
+
21
+
21
+#ifndef AARCH64_LOAD_EXTRACT_AL16_AL8_H
22
+#ifndef TCG_TARGET_HAS_H
22
+#define AARCH64_LOAD_EXTRACT_AL16_AL8_H
23
+#define TCG_TARGET_HAS_H
23
+
24
+
24
+#include "host/cpuinfo.h"
25
+#include "host/cpuinfo.h"
25
+#include "tcg/debug-assert.h"
26
+
26
+
27
+/* optional instructions */
27
+/**
28
+#define TCG_TARGET_HAS_negsetcond_i32 1
28
+ * load_atom_extract_al16_or_al8:
29
+#define TCG_TARGET_HAS_div_i32 1
29
+ * @pv: host address
30
+#define TCG_TARGET_HAS_rem_i32 1
30
+ * @s: object size in bytes, @s <= 8.
31
+#define TCG_TARGET_HAS_div2_i32 0
31
+ *
32
+#define TCG_TARGET_HAS_rot_i32 (cpuinfo & CPUINFO_ZBB)
32
+ * Load @s bytes from @pv, when pv % s != 0. If [p, p+s-1] does not
33
+#define TCG_TARGET_HAS_deposit_i32 0
33
+ * cross an 16-byte boundary then the access must be 16-byte atomic,
34
+#define TCG_TARGET_HAS_extract_i32 0
34
+ * otherwise the access must be 8-byte atomic.
35
+#define TCG_TARGET_HAS_sextract_i32 0
35
+ */
36
+#define TCG_TARGET_HAS_extract2_i32 0
36
+static inline uint64_t load_atom_extract_al16_or_al8(void *pv, int s)
37
+#define TCG_TARGET_HAS_add2_i32 1
37
+{
38
+#define TCG_TARGET_HAS_sub2_i32 1
38
+ uintptr_t pi = (uintptr_t)pv;
39
+#define TCG_TARGET_HAS_mulu2_i32 0
39
+ __int128_t *ptr_align = (__int128_t *)(pi & ~7);
40
+#define TCG_TARGET_HAS_muls2_i32 0
40
+ int shr = (pi & 7) * 8;
41
+#define TCG_TARGET_HAS_muluh_i32 0
41
+ uint64_t l, h;
42
+#define TCG_TARGET_HAS_mulsh_i32 0
42
+
43
+#define TCG_TARGET_HAS_ext8s_i32 1
43
+ /*
44
+#define TCG_TARGET_HAS_ext16s_i32 1
44
+ * With FEAT_LSE2, LDP is single-copy atomic if 16-byte aligned
45
+#define TCG_TARGET_HAS_ext8u_i32 1
45
+ * and single-copy atomic on the parts if 8-byte aligned.
46
+#define TCG_TARGET_HAS_ext16u_i32 1
46
+ * All we need do is align the pointer mod 8.
47
+#define TCG_TARGET_HAS_bswap16_i32 (cpuinfo & CPUINFO_ZBB)
47
+ */
48
+#define TCG_TARGET_HAS_bswap32_i32 (cpuinfo & CPUINFO_ZBB)
48
+ tcg_debug_assert(HAVE_ATOMIC128_RO);
49
+#define TCG_TARGET_HAS_not_i32 1
49
+ asm("ldp %0, %1, %2" : "=r"(l), "=r"(h) : "m"(*ptr_align));
50
+#define TCG_TARGET_HAS_andc_i32 (cpuinfo & CPUINFO_ZBB)
50
+ return (l >> shr) | (h << (-shr & 63));
51
+#define TCG_TARGET_HAS_orc_i32 (cpuinfo & CPUINFO_ZBB)
51
+}
52
+#define TCG_TARGET_HAS_eqv_i32 (cpuinfo & CPUINFO_ZBB)
52
+
53
+#define TCG_TARGET_HAS_nand_i32 0
53
+#endif /* AARCH64_LOAD_EXTRACT_AL16_AL8_H */
54
+#define TCG_TARGET_HAS_nor_i32 0
55
+#define TCG_TARGET_HAS_clz_i32 (cpuinfo & CPUINFO_ZBB)
56
+#define TCG_TARGET_HAS_ctz_i32 (cpuinfo & CPUINFO_ZBB)
57
+#define TCG_TARGET_HAS_ctpop_i32 (cpuinfo & CPUINFO_ZBB)
58
+#define TCG_TARGET_HAS_brcond2 1
59
+#define TCG_TARGET_HAS_setcond2 1
60
+#define TCG_TARGET_HAS_qemu_st8_i32 0
61
+
62
+#define TCG_TARGET_HAS_negsetcond_i64 1
63
+#define TCG_TARGET_HAS_div_i64 1
64
+#define TCG_TARGET_HAS_rem_i64 1
65
+#define TCG_TARGET_HAS_div2_i64 0
66
+#define TCG_TARGET_HAS_rot_i64 (cpuinfo & CPUINFO_ZBB)
67
+#define TCG_TARGET_HAS_deposit_i64 0
68
+#define TCG_TARGET_HAS_extract_i64 0
69
+#define TCG_TARGET_HAS_sextract_i64 0
70
+#define TCG_TARGET_HAS_extract2_i64 0
71
+#define TCG_TARGET_HAS_extr_i64_i32 1
72
+#define TCG_TARGET_HAS_ext8s_i64 1
73
+#define TCG_TARGET_HAS_ext16s_i64 1
74
+#define TCG_TARGET_HAS_ext32s_i64 1
75
+#define TCG_TARGET_HAS_ext8u_i64 1
76
+#define TCG_TARGET_HAS_ext16u_i64 1
77
+#define TCG_TARGET_HAS_ext32u_i64 1
78
+#define TCG_TARGET_HAS_bswap16_i64 (cpuinfo & CPUINFO_ZBB)
79
+#define TCG_TARGET_HAS_bswap32_i64 (cpuinfo & CPUINFO_ZBB)
80
+#define TCG_TARGET_HAS_bswap64_i64 (cpuinfo & CPUINFO_ZBB)
81
+#define TCG_TARGET_HAS_not_i64 1
82
+#define TCG_TARGET_HAS_andc_i64 (cpuinfo & CPUINFO_ZBB)
83
+#define TCG_TARGET_HAS_orc_i64 (cpuinfo & CPUINFO_ZBB)
84
+#define TCG_TARGET_HAS_eqv_i64 (cpuinfo & CPUINFO_ZBB)
85
+#define TCG_TARGET_HAS_nand_i64 0
86
+#define TCG_TARGET_HAS_nor_i64 0
87
+#define TCG_TARGET_HAS_clz_i64 (cpuinfo & CPUINFO_ZBB)
88
+#define TCG_TARGET_HAS_ctz_i64 (cpuinfo & CPUINFO_ZBB)
89
+#define TCG_TARGET_HAS_ctpop_i64 (cpuinfo & CPUINFO_ZBB)
90
+#define TCG_TARGET_HAS_add2_i64 1
91
+#define TCG_TARGET_HAS_sub2_i64 1
92
+#define TCG_TARGET_HAS_mulu2_i64 0
93
+#define TCG_TARGET_HAS_muls2_i64 0
94
+#define TCG_TARGET_HAS_muluh_i64 1
95
+#define TCG_TARGET_HAS_mulsh_i64 1
96
+
97
+#define TCG_TARGET_HAS_qemu_ldst_i128 0
98
+
99
+#define TCG_TARGET_HAS_tst 0
100
+
101
+/* vector instructions */
102
+#define TCG_TARGET_HAS_v64 (cpuinfo & CPUINFO_ZVE64X)
103
+#define TCG_TARGET_HAS_v128 (cpuinfo & CPUINFO_ZVE64X)
104
+#define TCG_TARGET_HAS_v256 (cpuinfo & CPUINFO_ZVE64X)
105
+#define TCG_TARGET_HAS_andc_vec 0
106
+#define TCG_TARGET_HAS_orc_vec 0
107
+#define TCG_TARGET_HAS_nand_vec 0
108
+#define TCG_TARGET_HAS_nor_vec 0
109
+#define TCG_TARGET_HAS_eqv_vec 0
110
+#define TCG_TARGET_HAS_not_vec 1
111
+#define TCG_TARGET_HAS_neg_vec 1
112
+#define TCG_TARGET_HAS_abs_vec 0
113
+#define TCG_TARGET_HAS_roti_vec 1
114
+#define TCG_TARGET_HAS_rots_vec 1
115
+#define TCG_TARGET_HAS_rotv_vec 1
116
+#define TCG_TARGET_HAS_shi_vec 1
117
+#define TCG_TARGET_HAS_shs_vec 1
118
+#define TCG_TARGET_HAS_shv_vec 1
119
+#define TCG_TARGET_HAS_mul_vec 1
120
+#define TCG_TARGET_HAS_sat_vec 1
121
+#define TCG_TARGET_HAS_minmax_vec 1
122
+#define TCG_TARGET_HAS_bitsel_vec 0
123
+#define TCG_TARGET_HAS_cmpsel_vec 1
124
+
125
+#define TCG_TARGET_HAS_tst_vec 0
126
+
127
+#endif
128
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
129
index XXXXXXX..XXXXXXX 100644
130
--- a/tcg/riscv/tcg-target.h
131
+++ b/tcg/riscv/tcg-target.h
132
@@ -XXX,XX +XXX,XX @@
133
#ifndef RISCV_TCG_TARGET_H
134
#define RISCV_TCG_TARGET_H
135
136
-#include "host/cpuinfo.h"
137
-
138
#define TCG_TARGET_INSN_UNIT_SIZE 4
139
#define TCG_TARGET_NB_REGS 64
140
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
141
@@ -XXX,XX +XXX,XX @@ typedef enum {
142
TCG_REG_TMP2 = TCG_REG_T4,
143
} TCGReg;
144
145
-/* optional instructions */
146
-#define TCG_TARGET_HAS_negsetcond_i32 1
147
-#define TCG_TARGET_HAS_div_i32 1
148
-#define TCG_TARGET_HAS_rem_i32 1
149
-#define TCG_TARGET_HAS_div2_i32 0
150
-#define TCG_TARGET_HAS_rot_i32 (cpuinfo & CPUINFO_ZBB)
151
-#define TCG_TARGET_HAS_deposit_i32 0
152
-#define TCG_TARGET_HAS_extract_i32 0
153
-#define TCG_TARGET_HAS_sextract_i32 0
154
-#define TCG_TARGET_HAS_extract2_i32 0
155
-#define TCG_TARGET_HAS_add2_i32 1
156
-#define TCG_TARGET_HAS_sub2_i32 1
157
-#define TCG_TARGET_HAS_mulu2_i32 0
158
-#define TCG_TARGET_HAS_muls2_i32 0
159
-#define TCG_TARGET_HAS_muluh_i32 0
160
-#define TCG_TARGET_HAS_mulsh_i32 0
161
-#define TCG_TARGET_HAS_ext8s_i32 1
162
-#define TCG_TARGET_HAS_ext16s_i32 1
163
-#define TCG_TARGET_HAS_ext8u_i32 1
164
-#define TCG_TARGET_HAS_ext16u_i32 1
165
-#define TCG_TARGET_HAS_bswap16_i32 (cpuinfo & CPUINFO_ZBB)
166
-#define TCG_TARGET_HAS_bswap32_i32 (cpuinfo & CPUINFO_ZBB)
167
-#define TCG_TARGET_HAS_not_i32 1
168
-#define TCG_TARGET_HAS_andc_i32 (cpuinfo & CPUINFO_ZBB)
169
-#define TCG_TARGET_HAS_orc_i32 (cpuinfo & CPUINFO_ZBB)
170
-#define TCG_TARGET_HAS_eqv_i32 (cpuinfo & CPUINFO_ZBB)
171
-#define TCG_TARGET_HAS_nand_i32 0
172
-#define TCG_TARGET_HAS_nor_i32 0
173
-#define TCG_TARGET_HAS_clz_i32 (cpuinfo & CPUINFO_ZBB)
174
-#define TCG_TARGET_HAS_ctz_i32 (cpuinfo & CPUINFO_ZBB)
175
-#define TCG_TARGET_HAS_ctpop_i32 (cpuinfo & CPUINFO_ZBB)
176
-#define TCG_TARGET_HAS_brcond2 1
177
-#define TCG_TARGET_HAS_setcond2 1
178
-#define TCG_TARGET_HAS_qemu_st8_i32 0
179
-
180
-#define TCG_TARGET_HAS_negsetcond_i64 1
181
-#define TCG_TARGET_HAS_div_i64 1
182
-#define TCG_TARGET_HAS_rem_i64 1
183
-#define TCG_TARGET_HAS_div2_i64 0
184
-#define TCG_TARGET_HAS_rot_i64 (cpuinfo & CPUINFO_ZBB)
185
-#define TCG_TARGET_HAS_deposit_i64 0
186
-#define TCG_TARGET_HAS_extract_i64 0
187
-#define TCG_TARGET_HAS_sextract_i64 0
188
-#define TCG_TARGET_HAS_extract2_i64 0
189
-#define TCG_TARGET_HAS_extr_i64_i32 1
190
-#define TCG_TARGET_HAS_ext8s_i64 1
191
-#define TCG_TARGET_HAS_ext16s_i64 1
192
-#define TCG_TARGET_HAS_ext32s_i64 1
193
-#define TCG_TARGET_HAS_ext8u_i64 1
194
-#define TCG_TARGET_HAS_ext16u_i64 1
195
-#define TCG_TARGET_HAS_ext32u_i64 1
196
-#define TCG_TARGET_HAS_bswap16_i64 (cpuinfo & CPUINFO_ZBB)
197
-#define TCG_TARGET_HAS_bswap32_i64 (cpuinfo & CPUINFO_ZBB)
198
-#define TCG_TARGET_HAS_bswap64_i64 (cpuinfo & CPUINFO_ZBB)
199
-#define TCG_TARGET_HAS_not_i64 1
200
-#define TCG_TARGET_HAS_andc_i64 (cpuinfo & CPUINFO_ZBB)
201
-#define TCG_TARGET_HAS_orc_i64 (cpuinfo & CPUINFO_ZBB)
202
-#define TCG_TARGET_HAS_eqv_i64 (cpuinfo & CPUINFO_ZBB)
203
-#define TCG_TARGET_HAS_nand_i64 0
204
-#define TCG_TARGET_HAS_nor_i64 0
205
-#define TCG_TARGET_HAS_clz_i64 (cpuinfo & CPUINFO_ZBB)
206
-#define TCG_TARGET_HAS_ctz_i64 (cpuinfo & CPUINFO_ZBB)
207
-#define TCG_TARGET_HAS_ctpop_i64 (cpuinfo & CPUINFO_ZBB)
208
-#define TCG_TARGET_HAS_add2_i64 1
209
-#define TCG_TARGET_HAS_sub2_i64 1
210
-#define TCG_TARGET_HAS_mulu2_i64 0
211
-#define TCG_TARGET_HAS_muls2_i64 0
212
-#define TCG_TARGET_HAS_muluh_i64 1
213
-#define TCG_TARGET_HAS_mulsh_i64 1
214
-
215
-#define TCG_TARGET_HAS_qemu_ldst_i128 0
216
-
217
-#define TCG_TARGET_HAS_tst 0
218
-
219
-/* vector instructions */
220
-#define TCG_TARGET_HAS_v64 (cpuinfo & CPUINFO_ZVE64X)
221
-#define TCG_TARGET_HAS_v128 (cpuinfo & CPUINFO_ZVE64X)
222
-#define TCG_TARGET_HAS_v256 (cpuinfo & CPUINFO_ZVE64X)
223
-#define TCG_TARGET_HAS_andc_vec 0
224
-#define TCG_TARGET_HAS_orc_vec 0
225
-#define TCG_TARGET_HAS_nand_vec 0
226
-#define TCG_TARGET_HAS_nor_vec 0
227
-#define TCG_TARGET_HAS_eqv_vec 0
228
-#define TCG_TARGET_HAS_not_vec 1
229
-#define TCG_TARGET_HAS_neg_vec 1
230
-#define TCG_TARGET_HAS_abs_vec 0
231
-#define TCG_TARGET_HAS_roti_vec 1
232
-#define TCG_TARGET_HAS_rots_vec 1
233
-#define TCG_TARGET_HAS_rotv_vec 1
234
-#define TCG_TARGET_HAS_shi_vec 1
235
-#define TCG_TARGET_HAS_shs_vec 1
236
-#define TCG_TARGET_HAS_shv_vec 1
237
-#define TCG_TARGET_HAS_mul_vec 1
238
-#define TCG_TARGET_HAS_sat_vec 1
239
-#define TCG_TARGET_HAS_minmax_vec 1
240
-#define TCG_TARGET_HAS_bitsel_vec 0
241
-#define TCG_TARGET_HAS_cmpsel_vec 1
242
-
243
-#define TCG_TARGET_HAS_tst_vec 0
244
+#include "tcg-target-has.h"
245
246
#define TCG_TARGET_DEFAULT_MO (0)
247
54
--
248
--
55
2.34.1
249
2.43.0
250
251
diff view generated by jsdifflib
1
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-11-philmd@linaro.org>
3
---
4
---
4
.../generic/host/load-extract-al16-al8.h | 45 +++++++++++++++++++
5
tcg/s390x/tcg-target-has.h | 124 +++++++++++++++++++++++++++++++++++++
5
accel/tcg/ldst_atomicity.c.inc | 36 +--------------
6
tcg/s390x/tcg-target.h | 114 +---------------------------------
6
2 files changed, 47 insertions(+), 34 deletions(-)
7
2 files changed, 125 insertions(+), 113 deletions(-)
7
create mode 100644 host/include/generic/host/load-extract-al16-al8.h
8
create mode 100644 tcg/s390x/tcg-target-has.h
8
9
9
diff --git a/host/include/generic/host/load-extract-al16-al8.h b/host/include/generic/host/load-extract-al16-al8.h
10
diff --git a/tcg/s390x/tcg-target-has.h b/tcg/s390x/tcg-target-has.h
10
new file mode 100644
11
new file mode 100644
11
index XXXXXXX..XXXXXXX
12
index XXXXXXX..XXXXXXX
12
--- /dev/null
13
--- /dev/null
13
+++ b/host/include/generic/host/load-extract-al16-al8.h
14
+++ b/tcg/s390x/tcg-target-has.h
14
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: MIT */
15
+/*
17
+/*
16
+ * SPDX-License-Identifier: GPL-2.0-or-later
18
+ * Define target-specific opcode support
17
+ * Atomic extract 64 from 128-bit, generic version.
19
+ * Copyright (c) 2009 Ulrich Hecht <uli@suse.de>
18
+ *
19
+ * Copyright (C) 2023 Linaro, Ltd.
20
+ */
20
+ */
21
+
21
+
22
+#ifndef HOST_LOAD_EXTRACT_AL16_AL8_H
22
+#ifndef TCG_TARGET_HAS_H
23
+#define HOST_LOAD_EXTRACT_AL16_AL8_H
23
+#define TCG_TARGET_HAS_H
24
+
24
+
25
+/**
25
+/* Facilities required for proper operation; checked at startup. */
26
+ * load_atom_extract_al16_or_al8:
26
+
27
+ * @pv: host address
27
+#define FACILITY_ZARCH_ACTIVE 2
28
+ * @s: object size in bytes, @s <= 8.
28
+#define FACILITY_LONG_DISP 18
29
+ *
29
+#define FACILITY_EXT_IMM 21
30
+ * Load @s bytes from @pv, when pv % s != 0. If [p, p+s-1] does not
30
+#define FACILITY_GEN_INST_EXT 34
31
+ * cross an 16-byte boundary then the access must be 16-byte atomic,
31
+#define FACILITY_45 45
32
+ * otherwise the access must be 8-byte atomic.
32
+
33
+ */
33
+/* Facilities that are checked at runtime. */
34
+static inline uint64_t ATTRIBUTE_ATOMIC128_OPT
34
+
35
+load_atom_extract_al16_or_al8(void *pv, int s)
35
+#define FACILITY_LOAD_ON_COND2 53
36
+{
36
+#define FACILITY_MISC_INSN_EXT2 58
37
+ uintptr_t pi = (uintptr_t)pv;
37
+#define FACILITY_MISC_INSN_EXT3 61
38
+ int o = pi & 7;
38
+#define FACILITY_VECTOR 129
39
+ int shr = (HOST_BIG_ENDIAN ? 16 - s - o : o) * 8;
39
+#define FACILITY_VECTOR_ENH1 135
40
+ Int128 r;
40
+
41
+
41
+extern uint64_t s390_facilities[3];
42
+ pv = (void *)(pi & ~7);
42
+
43
+ if (pi & 8) {
43
+#define HAVE_FACILITY(X) \
44
+ uint64_t *p8 = __builtin_assume_aligned(pv, 16, 8);
44
+ ((s390_facilities[FACILITY_##X / 64] >> (63 - FACILITY_##X % 64)) & 1)
45
+ uint64_t a = qatomic_read__nocheck(p8);
45
+
46
+ uint64_t b = qatomic_read__nocheck(p8 + 1);
46
+/* optional instructions */
47
+
47
+#define TCG_TARGET_HAS_div2_i32 1
48
+ if (HOST_BIG_ENDIAN) {
48
+#define TCG_TARGET_HAS_rot_i32 1
49
+ r = int128_make128(b, a);
49
+#define TCG_TARGET_HAS_ext8s_i32 1
50
+ } else {
50
+#define TCG_TARGET_HAS_ext16s_i32 1
51
+ r = int128_make128(a, b);
51
+#define TCG_TARGET_HAS_ext8u_i32 1
52
+ }
52
+#define TCG_TARGET_HAS_ext16u_i32 1
53
+ } else {
53
+#define TCG_TARGET_HAS_bswap16_i32 1
54
+ r = atomic16_read_ro(pv);
54
+#define TCG_TARGET_HAS_bswap32_i32 1
55
+ }
55
+#define TCG_TARGET_HAS_not_i32 HAVE_FACILITY(MISC_INSN_EXT3)
56
+ return int128_getlo(int128_urshift(r, shr));
56
+#define TCG_TARGET_HAS_andc_i32 HAVE_FACILITY(MISC_INSN_EXT3)
57
+}
57
+#define TCG_TARGET_HAS_orc_i32 HAVE_FACILITY(MISC_INSN_EXT3)
58
+
58
+#define TCG_TARGET_HAS_eqv_i32 HAVE_FACILITY(MISC_INSN_EXT3)
59
+#endif /* HOST_LOAD_EXTRACT_AL16_AL8_H */
59
+#define TCG_TARGET_HAS_nand_i32 HAVE_FACILITY(MISC_INSN_EXT3)
60
diff --git a/accel/tcg/ldst_atomicity.c.inc b/accel/tcg/ldst_atomicity.c.inc
60
+#define TCG_TARGET_HAS_nor_i32 HAVE_FACILITY(MISC_INSN_EXT3)
61
+#define TCG_TARGET_HAS_clz_i32 0
62
+#define TCG_TARGET_HAS_ctz_i32 0
63
+#define TCG_TARGET_HAS_ctpop_i32 1
64
+#define TCG_TARGET_HAS_deposit_i32 1
65
+#define TCG_TARGET_HAS_extract_i32 1
66
+#define TCG_TARGET_HAS_sextract_i32 0
67
+#define TCG_TARGET_HAS_extract2_i32 0
68
+#define TCG_TARGET_HAS_negsetcond_i32 1
69
+#define TCG_TARGET_HAS_add2_i32 1
70
+#define TCG_TARGET_HAS_sub2_i32 1
71
+#define TCG_TARGET_HAS_mulu2_i32 0
72
+#define TCG_TARGET_HAS_muls2_i32 0
73
+#define TCG_TARGET_HAS_muluh_i32 0
74
+#define TCG_TARGET_HAS_mulsh_i32 0
75
+#define TCG_TARGET_HAS_extr_i64_i32 0
76
+#define TCG_TARGET_HAS_qemu_st8_i32 0
77
+
78
+#define TCG_TARGET_HAS_div2_i64 1
79
+#define TCG_TARGET_HAS_rot_i64 1
80
+#define TCG_TARGET_HAS_ext8s_i64 1
81
+#define TCG_TARGET_HAS_ext16s_i64 1
82
+#define TCG_TARGET_HAS_ext32s_i64 1
83
+#define TCG_TARGET_HAS_ext8u_i64 1
84
+#define TCG_TARGET_HAS_ext16u_i64 1
85
+#define TCG_TARGET_HAS_ext32u_i64 1
86
+#define TCG_TARGET_HAS_bswap16_i64 1
87
+#define TCG_TARGET_HAS_bswap32_i64 1
88
+#define TCG_TARGET_HAS_bswap64_i64 1
89
+#define TCG_TARGET_HAS_not_i64 HAVE_FACILITY(MISC_INSN_EXT3)
90
+#define TCG_TARGET_HAS_andc_i64 HAVE_FACILITY(MISC_INSN_EXT3)
91
+#define TCG_TARGET_HAS_orc_i64 HAVE_FACILITY(MISC_INSN_EXT3)
92
+#define TCG_TARGET_HAS_eqv_i64 HAVE_FACILITY(MISC_INSN_EXT3)
93
+#define TCG_TARGET_HAS_nand_i64 HAVE_FACILITY(MISC_INSN_EXT3)
94
+#define TCG_TARGET_HAS_nor_i64 HAVE_FACILITY(MISC_INSN_EXT3)
95
+#define TCG_TARGET_HAS_clz_i64 1
96
+#define TCG_TARGET_HAS_ctz_i64 0
97
+#define TCG_TARGET_HAS_ctpop_i64 1
98
+#define TCG_TARGET_HAS_deposit_i64 1
99
+#define TCG_TARGET_HAS_extract_i64 1
100
+#define TCG_TARGET_HAS_sextract_i64 0
101
+#define TCG_TARGET_HAS_extract2_i64 0
102
+#define TCG_TARGET_HAS_negsetcond_i64 1
103
+#define TCG_TARGET_HAS_add2_i64 1
104
+#define TCG_TARGET_HAS_sub2_i64 1
105
+#define TCG_TARGET_HAS_mulu2_i64 1
106
+#define TCG_TARGET_HAS_muls2_i64 HAVE_FACILITY(MISC_INSN_EXT2)
107
+#define TCG_TARGET_HAS_muluh_i64 0
108
+#define TCG_TARGET_HAS_mulsh_i64 0
109
+
110
+#define TCG_TARGET_HAS_qemu_ldst_i128 1
111
+
112
+#define TCG_TARGET_HAS_tst 1
113
+
114
+#define TCG_TARGET_HAS_v64 HAVE_FACILITY(VECTOR)
115
+#define TCG_TARGET_HAS_v128 HAVE_FACILITY(VECTOR)
116
+#define TCG_TARGET_HAS_v256 0
117
+
118
+#define TCG_TARGET_HAS_andc_vec 1
119
+#define TCG_TARGET_HAS_orc_vec HAVE_FACILITY(VECTOR_ENH1)
120
+#define TCG_TARGET_HAS_nand_vec HAVE_FACILITY(VECTOR_ENH1)
121
+#define TCG_TARGET_HAS_nor_vec 1
122
+#define TCG_TARGET_HAS_eqv_vec HAVE_FACILITY(VECTOR_ENH1)
123
+#define TCG_TARGET_HAS_not_vec 1
124
+#define TCG_TARGET_HAS_neg_vec 1
125
+#define TCG_TARGET_HAS_abs_vec 1
126
+#define TCG_TARGET_HAS_roti_vec 1
127
+#define TCG_TARGET_HAS_rots_vec 1
128
+#define TCG_TARGET_HAS_rotv_vec 1
129
+#define TCG_TARGET_HAS_shi_vec 1
130
+#define TCG_TARGET_HAS_shs_vec 1
131
+#define TCG_TARGET_HAS_shv_vec 1
132
+#define TCG_TARGET_HAS_mul_vec 1
133
+#define TCG_TARGET_HAS_sat_vec 0
134
+#define TCG_TARGET_HAS_minmax_vec 1
135
+#define TCG_TARGET_HAS_bitsel_vec 1
136
+#define TCG_TARGET_HAS_cmpsel_vec 1
137
+#define TCG_TARGET_HAS_tst_vec 0
138
+
139
+#endif
140
diff --git a/tcg/s390x/tcg-target.h b/tcg/s390x/tcg-target.h
61
index XXXXXXX..XXXXXXX 100644
141
index XXXXXXX..XXXXXXX 100644
62
--- a/accel/tcg/ldst_atomicity.c.inc
142
--- a/tcg/s390x/tcg-target.h
63
+++ b/accel/tcg/ldst_atomicity.c.inc
143
+++ b/tcg/s390x/tcg-target.h
64
@@ -XXX,XX +XXX,XX @@
144
@@ -XXX,XX +XXX,XX @@ typedef enum TCGReg {
65
* See the COPYING file in the top-level directory.
145
66
*/
146
#define TCG_TARGET_NB_REGS 64
67
147
68
+#include "host/load-extract-al16-al8.h"
148
-/* Facilities required for proper operation; checked at startup. */
69
+
149
-
70
#ifdef CONFIG_ATOMIC64
150
-#define FACILITY_ZARCH_ACTIVE 2
71
# define HAVE_al8 true
151
-#define FACILITY_LONG_DISP 18
72
#else
152
-#define FACILITY_EXT_IMM 21
73
@@ -XXX,XX +XXX,XX @@ static uint64_t load_atom_extract_al16_or_exit(CPUArchState *env, uintptr_t ra,
153
-#define FACILITY_GEN_INST_EXT 34
74
return int128_getlo(r);
154
-#define FACILITY_45 45
75
}
155
-
76
156
-/* Facilities that are checked at runtime. */
77
-/**
157
-
78
- * load_atom_extract_al16_or_al8:
158
-#define FACILITY_LOAD_ON_COND2 53
79
- * @p: host address
159
-#define FACILITY_MISC_INSN_EXT2 58
80
- * @s: object size in bytes, @s <= 8.
160
-#define FACILITY_MISC_INSN_EXT3 61
81
- *
161
-#define FACILITY_VECTOR 129
82
- * Load @s bytes from @p, when p % s != 0. If [p, p+s-1] does not
162
-#define FACILITY_VECTOR_ENH1 135
83
- * cross an 16-byte boundary then the access must be 16-byte atomic,
163
-
84
- * otherwise the access must be 8-byte atomic.
164
-extern uint64_t s390_facilities[3];
85
- */
165
-
86
-static inline uint64_t ATTRIBUTE_ATOMIC128_OPT
166
-#define HAVE_FACILITY(X) \
87
-load_atom_extract_al16_or_al8(void *pv, int s)
167
- ((s390_facilities[FACILITY_##X / 64] >> (63 - FACILITY_##X % 64)) & 1)
88
-{
168
-
89
- uintptr_t pi = (uintptr_t)pv;
169
-/* optional instructions */
90
- int o = pi & 7;
170
-#define TCG_TARGET_HAS_div2_i32 1
91
- int shr = (HOST_BIG_ENDIAN ? 16 - s - o : o) * 8;
171
-#define TCG_TARGET_HAS_rot_i32 1
92
- Int128 r;
172
-#define TCG_TARGET_HAS_ext8s_i32 1
93
-
173
-#define TCG_TARGET_HAS_ext16s_i32 1
94
- pv = (void *)(pi & ~7);
174
-#define TCG_TARGET_HAS_ext8u_i32 1
95
- if (pi & 8) {
175
-#define TCG_TARGET_HAS_ext16u_i32 1
96
- uint64_t *p8 = __builtin_assume_aligned(pv, 16, 8);
176
-#define TCG_TARGET_HAS_bswap16_i32 1
97
- uint64_t a = qatomic_read__nocheck(p8);
177
-#define TCG_TARGET_HAS_bswap32_i32 1
98
- uint64_t b = qatomic_read__nocheck(p8 + 1);
178
-#define TCG_TARGET_HAS_not_i32 HAVE_FACILITY(MISC_INSN_EXT3)
99
-
179
-#define TCG_TARGET_HAS_andc_i32 HAVE_FACILITY(MISC_INSN_EXT3)
100
- if (HOST_BIG_ENDIAN) {
180
-#define TCG_TARGET_HAS_orc_i32 HAVE_FACILITY(MISC_INSN_EXT3)
101
- r = int128_make128(b, a);
181
-#define TCG_TARGET_HAS_eqv_i32 HAVE_FACILITY(MISC_INSN_EXT3)
102
- } else {
182
-#define TCG_TARGET_HAS_nand_i32 HAVE_FACILITY(MISC_INSN_EXT3)
103
- r = int128_make128(a, b);
183
-#define TCG_TARGET_HAS_nor_i32 HAVE_FACILITY(MISC_INSN_EXT3)
104
- }
184
-#define TCG_TARGET_HAS_clz_i32 0
105
- } else {
185
-#define TCG_TARGET_HAS_ctz_i32 0
106
- r = atomic16_read_ro(pv);
186
-#define TCG_TARGET_HAS_ctpop_i32 1
107
- }
187
-#define TCG_TARGET_HAS_deposit_i32 1
108
- return int128_getlo(int128_urshift(r, shr));
188
-#define TCG_TARGET_HAS_extract_i32 1
109
-}
189
-#define TCG_TARGET_HAS_sextract_i32 0
110
-
190
-#define TCG_TARGET_HAS_extract2_i32 0
111
/**
191
-#define TCG_TARGET_HAS_negsetcond_i32 1
112
* load_atom_4_by_2:
192
-#define TCG_TARGET_HAS_add2_i32 1
113
* @pv: host address
193
-#define TCG_TARGET_HAS_sub2_i32 1
194
-#define TCG_TARGET_HAS_mulu2_i32 0
195
-#define TCG_TARGET_HAS_muls2_i32 0
196
-#define TCG_TARGET_HAS_muluh_i32 0
197
-#define TCG_TARGET_HAS_mulsh_i32 0
198
-#define TCG_TARGET_HAS_extr_i64_i32 0
199
-#define TCG_TARGET_HAS_qemu_st8_i32 0
200
-
201
-#define TCG_TARGET_HAS_div2_i64 1
202
-#define TCG_TARGET_HAS_rot_i64 1
203
-#define TCG_TARGET_HAS_ext8s_i64 1
204
-#define TCG_TARGET_HAS_ext16s_i64 1
205
-#define TCG_TARGET_HAS_ext32s_i64 1
206
-#define TCG_TARGET_HAS_ext8u_i64 1
207
-#define TCG_TARGET_HAS_ext16u_i64 1
208
-#define TCG_TARGET_HAS_ext32u_i64 1
209
-#define TCG_TARGET_HAS_bswap16_i64 1
210
-#define TCG_TARGET_HAS_bswap32_i64 1
211
-#define TCG_TARGET_HAS_bswap64_i64 1
212
-#define TCG_TARGET_HAS_not_i64 HAVE_FACILITY(MISC_INSN_EXT3)
213
-#define TCG_TARGET_HAS_andc_i64 HAVE_FACILITY(MISC_INSN_EXT3)
214
-#define TCG_TARGET_HAS_orc_i64 HAVE_FACILITY(MISC_INSN_EXT3)
215
-#define TCG_TARGET_HAS_eqv_i64 HAVE_FACILITY(MISC_INSN_EXT3)
216
-#define TCG_TARGET_HAS_nand_i64 HAVE_FACILITY(MISC_INSN_EXT3)
217
-#define TCG_TARGET_HAS_nor_i64 HAVE_FACILITY(MISC_INSN_EXT3)
218
-#define TCG_TARGET_HAS_clz_i64 1
219
-#define TCG_TARGET_HAS_ctz_i64 0
220
-#define TCG_TARGET_HAS_ctpop_i64 1
221
-#define TCG_TARGET_HAS_deposit_i64 1
222
-#define TCG_TARGET_HAS_extract_i64 1
223
-#define TCG_TARGET_HAS_sextract_i64 0
224
-#define TCG_TARGET_HAS_extract2_i64 0
225
-#define TCG_TARGET_HAS_negsetcond_i64 1
226
-#define TCG_TARGET_HAS_add2_i64 1
227
-#define TCG_TARGET_HAS_sub2_i64 1
228
-#define TCG_TARGET_HAS_mulu2_i64 1
229
-#define TCG_TARGET_HAS_muls2_i64 HAVE_FACILITY(MISC_INSN_EXT2)
230
-#define TCG_TARGET_HAS_muluh_i64 0
231
-#define TCG_TARGET_HAS_mulsh_i64 0
232
-
233
-#define TCG_TARGET_HAS_qemu_ldst_i128 1
234
-
235
-#define TCG_TARGET_HAS_tst 1
236
-
237
-#define TCG_TARGET_HAS_v64 HAVE_FACILITY(VECTOR)
238
-#define TCG_TARGET_HAS_v128 HAVE_FACILITY(VECTOR)
239
-#define TCG_TARGET_HAS_v256 0
240
-
241
-#define TCG_TARGET_HAS_andc_vec 1
242
-#define TCG_TARGET_HAS_orc_vec HAVE_FACILITY(VECTOR_ENH1)
243
-#define TCG_TARGET_HAS_nand_vec HAVE_FACILITY(VECTOR_ENH1)
244
-#define TCG_TARGET_HAS_nor_vec 1
245
-#define TCG_TARGET_HAS_eqv_vec HAVE_FACILITY(VECTOR_ENH1)
246
-#define TCG_TARGET_HAS_not_vec 1
247
-#define TCG_TARGET_HAS_neg_vec 1
248
-#define TCG_TARGET_HAS_abs_vec 1
249
-#define TCG_TARGET_HAS_roti_vec 1
250
-#define TCG_TARGET_HAS_rots_vec 1
251
-#define TCG_TARGET_HAS_rotv_vec 1
252
-#define TCG_TARGET_HAS_shi_vec 1
253
-#define TCG_TARGET_HAS_shs_vec 1
254
-#define TCG_TARGET_HAS_shv_vec 1
255
-#define TCG_TARGET_HAS_mul_vec 1
256
-#define TCG_TARGET_HAS_sat_vec 0
257
-#define TCG_TARGET_HAS_minmax_vec 1
258
-#define TCG_TARGET_HAS_bitsel_vec 1
259
-#define TCG_TARGET_HAS_cmpsel_vec 1
260
-#define TCG_TARGET_HAS_tst_vec 0
261
+#include "tcg-target-has.h"
262
263
#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
264
114
--
265
--
115
2.34.1
266
2.43.0
267
268
diff view generated by jsdifflib
1
With CPUINFO_ATOMIC_VMOVDQA, we can perform proper atomic
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
load/store without cmpxchg16b.
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-12-philmd@linaro.org>
4
---
5
tcg/sparc64/tcg-target-has.h | 86 ++++++++++++++++++++++++++++++++++++
6
tcg/sparc64/tcg-target.h | 78 +-------------------------------
7
2 files changed, 88 insertions(+), 76 deletions(-)
8
create mode 100644 tcg/sparc64/tcg-target-has.h
3
9
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
diff --git a/tcg/sparc64/tcg-target-has.h b/tcg/sparc64/tcg-target-has.h
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
host/include/x86_64/host/atomic128-ldst.h | 68 +++++++++++++++++++++++
8
1 file changed, 68 insertions(+)
9
create mode 100644 host/include/x86_64/host/atomic128-ldst.h
10
11
diff --git a/host/include/x86_64/host/atomic128-ldst.h b/host/include/x86_64/host/atomic128-ldst.h
12
new file mode 100644
11
new file mode 100644
13
index XXXXXXX..XXXXXXX
12
index XXXXXXX..XXXXXXX
14
--- /dev/null
13
--- /dev/null
15
+++ b/host/include/x86_64/host/atomic128-ldst.h
14
+++ b/tcg/sparc64/tcg-target-has.h
16
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: MIT */
17
+/*
17
+/*
18
+ * SPDX-License-Identifier: GPL-2.0-or-later
18
+ * Define target-specific opcode support
19
+ * Load/store for 128-bit atomic operations, x86_64 version.
19
+ * Copyright (c) 2008 Fabrice Bellard
20
+ *
21
+ * Copyright (C) 2023 Linaro, Ltd.
22
+ *
23
+ * See docs/devel/atomics.rst for discussion about the guarantees each
24
+ * atomic primitive is meant to provide.
25
+ */
20
+ */
26
+
21
+
27
+#ifndef AARCH64_ATOMIC128_LDST_H
22
+#ifndef TCG_TARGET_HAS_H
28
+#define AARCH64_ATOMIC128_LDST_H
23
+#define TCG_TARGET_HAS_H
29
+
24
+
30
+#ifdef CONFIG_INT128_TYPE
25
+#if defined(__VIS__) && __VIS__ >= 0x300
31
+#include "host/cpuinfo.h"
26
+#define use_vis3_instructions 1
32
+#include "tcg/debug-assert.h"
33
+
34
+/*
35
+ * Through clang 16, with -mcx16, __atomic_load_n is incorrectly
36
+ * expanded to a read-write operation: lock cmpxchg16b.
37
+ */
38
+
39
+#define HAVE_ATOMIC128_RO likely(cpuinfo & CPUINFO_ATOMIC_VMOVDQA)
40
+#define HAVE_ATOMIC128_RW 1
41
+
42
+static inline Int128 atomic16_read_ro(const Int128 *ptr)
43
+{
44
+ Int128Alias r;
45
+
46
+ tcg_debug_assert(HAVE_ATOMIC128_RO);
47
+ asm("vmovdqa %1, %0" : "=x" (r.i) : "m" (*ptr));
48
+
49
+ return r.s;
50
+}
51
+
52
+static inline Int128 atomic16_read_rw(Int128 *ptr)
53
+{
54
+ __int128_t *ptr_align = __builtin_assume_aligned(ptr, 16);
55
+ Int128Alias r;
56
+
57
+ if (HAVE_ATOMIC128_RO) {
58
+ asm("vmovdqa %1, %0" : "=x" (r.i) : "m" (*ptr_align));
59
+ } else {
60
+ r.i = __sync_val_compare_and_swap_16(ptr_align, 0, 0);
61
+ }
62
+ return r.s;
63
+}
64
+
65
+static inline void atomic16_set(Int128 *ptr, Int128 val)
66
+{
67
+ __int128_t *ptr_align = __builtin_assume_aligned(ptr, 16);
68
+ Int128Alias new = { .s = val };
69
+
70
+ if (HAVE_ATOMIC128_RO) {
71
+ asm("vmovdqa %1, %0" : "=m"(*ptr_align) : "x" (new.i));
72
+ } else {
73
+ __int128_t old;
74
+ do {
75
+ old = *ptr_align;
76
+ } while (!__sync_bool_compare_and_swap_16(ptr_align, old, new.i));
77
+ }
78
+}
79
+#else
27
+#else
80
+/* Provide QEMU_ERROR stubs. */
28
+extern bool use_vis3_instructions;
81
+#include "host/include/generic/host/atomic128-ldst.h"
82
+#endif
29
+#endif
83
+
30
+
84
+#endif /* AARCH64_ATOMIC128_LDST_H */
31
+/* optional instructions */
32
+#define TCG_TARGET_HAS_div_i32        1
33
+#define TCG_TARGET_HAS_rem_i32        0
34
+#define TCG_TARGET_HAS_rot_i32 0
35
+#define TCG_TARGET_HAS_ext8s_i32 0
36
+#define TCG_TARGET_HAS_ext16s_i32 0
37
+#define TCG_TARGET_HAS_ext8u_i32 0
38
+#define TCG_TARGET_HAS_ext16u_i32 0
39
+#define TCG_TARGET_HAS_bswap16_i32 0
40
+#define TCG_TARGET_HAS_bswap32_i32 0
41
+#define TCG_TARGET_HAS_not_i32 1
42
+#define TCG_TARGET_HAS_andc_i32 1
43
+#define TCG_TARGET_HAS_orc_i32 1
44
+#define TCG_TARGET_HAS_eqv_i32 0
45
+#define TCG_TARGET_HAS_nand_i32 0
46
+#define TCG_TARGET_HAS_nor_i32 0
47
+#define TCG_TARGET_HAS_clz_i32 0
48
+#define TCG_TARGET_HAS_ctz_i32 0
49
+#define TCG_TARGET_HAS_ctpop_i32 0
50
+#define TCG_TARGET_HAS_deposit_i32 0
51
+#define TCG_TARGET_HAS_extract_i32 0
52
+#define TCG_TARGET_HAS_sextract_i32 0
53
+#define TCG_TARGET_HAS_extract2_i32 0
54
+#define TCG_TARGET_HAS_negsetcond_i32 1
55
+#define TCG_TARGET_HAS_add2_i32 1
56
+#define TCG_TARGET_HAS_sub2_i32 1
57
+#define TCG_TARGET_HAS_mulu2_i32 1
58
+#define TCG_TARGET_HAS_muls2_i32 1
59
+#define TCG_TARGET_HAS_muluh_i32 0
60
+#define TCG_TARGET_HAS_mulsh_i32 0
61
+#define TCG_TARGET_HAS_qemu_st8_i32 0
62
+
63
+#define TCG_TARGET_HAS_extr_i64_i32 0
64
+#define TCG_TARGET_HAS_div_i64 1
65
+#define TCG_TARGET_HAS_rem_i64 0
66
+#define TCG_TARGET_HAS_rot_i64 0
67
+#define TCG_TARGET_HAS_ext8s_i64 0
68
+#define TCG_TARGET_HAS_ext16s_i64 0
69
+#define TCG_TARGET_HAS_ext32s_i64 1
70
+#define TCG_TARGET_HAS_ext8u_i64 0
71
+#define TCG_TARGET_HAS_ext16u_i64 0
72
+#define TCG_TARGET_HAS_ext32u_i64 1
73
+#define TCG_TARGET_HAS_bswap16_i64 0
74
+#define TCG_TARGET_HAS_bswap32_i64 0
75
+#define TCG_TARGET_HAS_bswap64_i64 0
76
+#define TCG_TARGET_HAS_not_i64 1
77
+#define TCG_TARGET_HAS_andc_i64 1
78
+#define TCG_TARGET_HAS_orc_i64 1
79
+#define TCG_TARGET_HAS_eqv_i64 0
80
+#define TCG_TARGET_HAS_nand_i64 0
81
+#define TCG_TARGET_HAS_nor_i64 0
82
+#define TCG_TARGET_HAS_clz_i64 0
83
+#define TCG_TARGET_HAS_ctz_i64 0
84
+#define TCG_TARGET_HAS_ctpop_i64 0
85
+#define TCG_TARGET_HAS_deposit_i64 0
86
+#define TCG_TARGET_HAS_extract_i64 0
87
+#define TCG_TARGET_HAS_sextract_i64 0
88
+#define TCG_TARGET_HAS_extract2_i64 0
89
+#define TCG_TARGET_HAS_negsetcond_i64 1
90
+#define TCG_TARGET_HAS_add2_i64 1
91
+#define TCG_TARGET_HAS_sub2_i64 1
92
+#define TCG_TARGET_HAS_mulu2_i64 0
93
+#define TCG_TARGET_HAS_muls2_i64 0
94
+#define TCG_TARGET_HAS_muluh_i64 use_vis3_instructions
95
+#define TCG_TARGET_HAS_mulsh_i64 0
96
+
97
+#define TCG_TARGET_HAS_qemu_ldst_i128 0
98
+
99
+#define TCG_TARGET_HAS_tst 1
100
+
101
+#endif
102
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
103
index XXXXXXX..XXXXXXX 100644
104
--- a/tcg/sparc64/tcg-target.h
105
+++ b/tcg/sparc64/tcg-target.h
106
@@ -XXX,XX +XXX,XX @@ typedef enum {
107
TCG_REG_I7,
108
} TCGReg;
109
110
-#if defined(__VIS__) && __VIS__ >= 0x300
111
-#define use_vis3_instructions 1
112
-#else
113
-extern bool use_vis3_instructions;
114
-#endif
115
-
116
-/* optional instructions */
117
-#define TCG_TARGET_HAS_div_i32        1
118
-#define TCG_TARGET_HAS_rem_i32        0
119
-#define TCG_TARGET_HAS_rot_i32 0
120
-#define TCG_TARGET_HAS_ext8s_i32 0
121
-#define TCG_TARGET_HAS_ext16s_i32 0
122
-#define TCG_TARGET_HAS_ext8u_i32 0
123
-#define TCG_TARGET_HAS_ext16u_i32 0
124
-#define TCG_TARGET_HAS_bswap16_i32 0
125
-#define TCG_TARGET_HAS_bswap32_i32 0
126
-#define TCG_TARGET_HAS_not_i32 1
127
-#define TCG_TARGET_HAS_andc_i32 1
128
-#define TCG_TARGET_HAS_orc_i32 1
129
-#define TCG_TARGET_HAS_eqv_i32 0
130
-#define TCG_TARGET_HAS_nand_i32 0
131
-#define TCG_TARGET_HAS_nor_i32 0
132
-#define TCG_TARGET_HAS_clz_i32 0
133
-#define TCG_TARGET_HAS_ctz_i32 0
134
-#define TCG_TARGET_HAS_ctpop_i32 0
135
-#define TCG_TARGET_HAS_deposit_i32 0
136
-#define TCG_TARGET_HAS_extract_i32 0
137
-#define TCG_TARGET_HAS_sextract_i32 0
138
-#define TCG_TARGET_HAS_extract2_i32 0
139
-#define TCG_TARGET_HAS_negsetcond_i32 1
140
-#define TCG_TARGET_HAS_add2_i32 1
141
-#define TCG_TARGET_HAS_sub2_i32 1
142
-#define TCG_TARGET_HAS_mulu2_i32 1
143
-#define TCG_TARGET_HAS_muls2_i32 1
144
-#define TCG_TARGET_HAS_muluh_i32 0
145
-#define TCG_TARGET_HAS_mulsh_i32 0
146
-#define TCG_TARGET_HAS_qemu_st8_i32 0
147
-
148
-#define TCG_TARGET_HAS_extr_i64_i32 0
149
-#define TCG_TARGET_HAS_div_i64 1
150
-#define TCG_TARGET_HAS_rem_i64 0
151
-#define TCG_TARGET_HAS_rot_i64 0
152
-#define TCG_TARGET_HAS_ext8s_i64 0
153
-#define TCG_TARGET_HAS_ext16s_i64 0
154
-#define TCG_TARGET_HAS_ext32s_i64 1
155
-#define TCG_TARGET_HAS_ext8u_i64 0
156
-#define TCG_TARGET_HAS_ext16u_i64 0
157
-#define TCG_TARGET_HAS_ext32u_i64 1
158
-#define TCG_TARGET_HAS_bswap16_i64 0
159
-#define TCG_TARGET_HAS_bswap32_i64 0
160
-#define TCG_TARGET_HAS_bswap64_i64 0
161
-#define TCG_TARGET_HAS_not_i64 1
162
-#define TCG_TARGET_HAS_andc_i64 1
163
-#define TCG_TARGET_HAS_orc_i64 1
164
-#define TCG_TARGET_HAS_eqv_i64 0
165
-#define TCG_TARGET_HAS_nand_i64 0
166
-#define TCG_TARGET_HAS_nor_i64 0
167
-#define TCG_TARGET_HAS_clz_i64 0
168
-#define TCG_TARGET_HAS_ctz_i64 0
169
-#define TCG_TARGET_HAS_ctpop_i64 0
170
-#define TCG_TARGET_HAS_deposit_i64 0
171
-#define TCG_TARGET_HAS_extract_i64 0
172
-#define TCG_TARGET_HAS_sextract_i64 0
173
-#define TCG_TARGET_HAS_extract2_i64 0
174
-#define TCG_TARGET_HAS_negsetcond_i64 1
175
-#define TCG_TARGET_HAS_add2_i64 1
176
-#define TCG_TARGET_HAS_sub2_i64 1
177
-#define TCG_TARGET_HAS_mulu2_i64 0
178
-#define TCG_TARGET_HAS_muls2_i64 0
179
-#define TCG_TARGET_HAS_muluh_i64 use_vis3_instructions
180
-#define TCG_TARGET_HAS_mulsh_i64 0
181
-
182
-#define TCG_TARGET_HAS_qemu_ldst_i128 0
183
-
184
-#define TCG_TARGET_HAS_tst 1
185
-
186
#define TCG_AREG0 TCG_REG_I0
187
188
+#include "tcg-target-has.h"
189
+
190
#define TCG_TARGET_DEFAULT_MO (0)
191
192
#endif
85
--
193
--
86
2.34.1
194
2.43.0
87
195
88
196
diff view generated by jsdifflib
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-13-philmd@linaro.org>
2
---
4
---
3
tests/decode/check.sh | 24 ----------------
5
tcg/tci/tcg-target-has.h | 83 ++++++++++++++++++++++++++++++++++++++++
4
tests/decode/meson.build | 59 ++++++++++++++++++++++++++++++++++++++++
6
tcg/tci/tcg-target.h | 75 +-----------------------------------
5
tests/meson.build | 5 +---
7
2 files changed, 84 insertions(+), 74 deletions(-)
6
3 files changed, 60 insertions(+), 28 deletions(-)
8
create mode 100644 tcg/tci/tcg-target-has.h
7
delete mode 100755 tests/decode/check.sh
8
create mode 100644 tests/decode/meson.build
9
9
10
diff --git a/tests/decode/check.sh b/tests/decode/check.sh
10
diff --git a/tcg/tci/tcg-target-has.h b/tcg/tci/tcg-target-has.h
11
deleted file mode 100755
12
index XXXXXXX..XXXXXXX
13
--- a/tests/decode/check.sh
14
+++ /dev/null
15
@@ -XXX,XX +XXX,XX @@
16
-#!/bin/sh
17
-# This work is licensed under the terms of the GNU LGPL, version 2 or later.
18
-# See the COPYING.LIB file in the top-level directory.
19
-
20
-PYTHON=$1
21
-DECODETREE=$2
22
-E=0
23
-
24
-# All of these tests should produce errors
25
-for i in err_*.decode; do
26
- if $PYTHON $DECODETREE $i > /dev/null 2> /dev/null; then
27
- # Pass, aka failed to fail.
28
- echo FAIL: $i 1>&2
29
- E=1
30
- fi
31
-done
32
-
33
-for i in succ_*.decode; do
34
- if ! $PYTHON $DECODETREE $i > /dev/null 2> /dev/null; then
35
- echo FAIL:$i 1>&2
36
- fi
37
-done
38
-
39
-exit $E
40
diff --git a/tests/decode/meson.build b/tests/decode/meson.build
41
new file mode 100644
11
new file mode 100644
42
index XXXXXXX..XXXXXXX
12
index XXXXXXX..XXXXXXX
43
--- /dev/null
13
--- /dev/null
44
+++ b/tests/decode/meson.build
14
+++ b/tcg/tci/tcg-target-has.h
45
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@
46
+err_tests = [
16
+/* SPDX-License-Identifier: MIT */
47
+ 'err_argset1.decode',
17
+/*
48
+ 'err_argset2.decode',
18
+ * Define target-specific opcode support
49
+ 'err_field1.decode',
19
+ * Copyright (c) 2009, 2011 Stefan Weil
50
+ 'err_field2.decode',
20
+ */
51
+ 'err_field3.decode',
52
+ 'err_field4.decode',
53
+ 'err_field5.decode',
54
+ 'err_field6.decode',
55
+ 'err_init1.decode',
56
+ 'err_init2.decode',
57
+ 'err_init3.decode',
58
+ 'err_init4.decode',
59
+ 'err_overlap1.decode',
60
+ 'err_overlap2.decode',
61
+ 'err_overlap3.decode',
62
+ 'err_overlap4.decode',
63
+ 'err_overlap5.decode',
64
+ 'err_overlap6.decode',
65
+ 'err_overlap7.decode',
66
+ 'err_overlap8.decode',
67
+ 'err_overlap9.decode',
68
+ 'err_pattern_group_empty.decode',
69
+ 'err_pattern_group_ident1.decode',
70
+ 'err_pattern_group_ident2.decode',
71
+ 'err_pattern_group_nest1.decode',
72
+ 'err_pattern_group_nest2.decode',
73
+ 'err_pattern_group_nest3.decode',
74
+ 'err_pattern_group_overlap1.decode',
75
+ 'err_width1.decode',
76
+ 'err_width2.decode',
77
+ 'err_width3.decode',
78
+ 'err_width4.decode',
79
+]
80
+
21
+
81
+succ_tests = [
22
+#ifndef TCG_TARGET_HAS_H
82
+ 'succ_argset_type1.decode',
23
+#define TCG_TARGET_HAS_H
83
+ 'succ_function.decode',
84
+ 'succ_ident1.decode',
85
+ 'succ_pattern_group_nest1.decode',
86
+ 'succ_pattern_group_nest2.decode',
87
+ 'succ_pattern_group_nest3.decode',
88
+ 'succ_pattern_group_nest4.decode',
89
+]
90
+
24
+
91
+suite = 'decodetree'
25
+#define TCG_TARGET_HAS_bswap16_i32 1
92
+decodetree = find_program(meson.project_source_root() / 'scripts/decodetree.py')
26
+#define TCG_TARGET_HAS_bswap32_i32 1
27
+#define TCG_TARGET_HAS_div_i32 1
28
+#define TCG_TARGET_HAS_rem_i32 1
29
+#define TCG_TARGET_HAS_ext8s_i32 1
30
+#define TCG_TARGET_HAS_ext16s_i32 1
31
+#define TCG_TARGET_HAS_ext8u_i32 1
32
+#define TCG_TARGET_HAS_ext16u_i32 1
33
+#define TCG_TARGET_HAS_andc_i32 1
34
+#define TCG_TARGET_HAS_deposit_i32 1
35
+#define TCG_TARGET_HAS_extract_i32 1
36
+#define TCG_TARGET_HAS_sextract_i32 1
37
+#define TCG_TARGET_HAS_extract2_i32 0
38
+#define TCG_TARGET_HAS_eqv_i32 1
39
+#define TCG_TARGET_HAS_nand_i32 1
40
+#define TCG_TARGET_HAS_nor_i32 1
41
+#define TCG_TARGET_HAS_clz_i32 1
42
+#define TCG_TARGET_HAS_ctz_i32 1
43
+#define TCG_TARGET_HAS_ctpop_i32 1
44
+#define TCG_TARGET_HAS_not_i32 1
45
+#define TCG_TARGET_HAS_orc_i32 1
46
+#define TCG_TARGET_HAS_rot_i32 1
47
+#define TCG_TARGET_HAS_negsetcond_i32 0
48
+#define TCG_TARGET_HAS_muls2_i32 1
49
+#define TCG_TARGET_HAS_muluh_i32 0
50
+#define TCG_TARGET_HAS_mulsh_i32 0
51
+#define TCG_TARGET_HAS_qemu_st8_i32 0
93
+
52
+
94
+foreach t: err_tests
53
+#if TCG_TARGET_REG_BITS == 64
95
+ test(fs.replace_suffix(t, ''),
54
+#define TCG_TARGET_HAS_extr_i64_i32 0
96
+ decodetree, args: ['-o', '/dev/null', '--test-for-error', files(t)],
55
+#define TCG_TARGET_HAS_bswap16_i64 1
97
+ suite: suite)
56
+#define TCG_TARGET_HAS_bswap32_i64 1
98
+endforeach
57
+#define TCG_TARGET_HAS_bswap64_i64 1
58
+#define TCG_TARGET_HAS_deposit_i64 1
59
+#define TCG_TARGET_HAS_extract_i64 1
60
+#define TCG_TARGET_HAS_sextract_i64 1
61
+#define TCG_TARGET_HAS_extract2_i64 0
62
+#define TCG_TARGET_HAS_div_i64 1
63
+#define TCG_TARGET_HAS_rem_i64 1
64
+#define TCG_TARGET_HAS_ext8s_i64 1
65
+#define TCG_TARGET_HAS_ext16s_i64 1
66
+#define TCG_TARGET_HAS_ext32s_i64 1
67
+#define TCG_TARGET_HAS_ext8u_i64 1
68
+#define TCG_TARGET_HAS_ext16u_i64 1
69
+#define TCG_TARGET_HAS_ext32u_i64 1
70
+#define TCG_TARGET_HAS_andc_i64 1
71
+#define TCG_TARGET_HAS_eqv_i64 1
72
+#define TCG_TARGET_HAS_nand_i64 1
73
+#define TCG_TARGET_HAS_nor_i64 1
74
+#define TCG_TARGET_HAS_clz_i64 1
75
+#define TCG_TARGET_HAS_ctz_i64 1
76
+#define TCG_TARGET_HAS_ctpop_i64 1
77
+#define TCG_TARGET_HAS_not_i64 1
78
+#define TCG_TARGET_HAS_orc_i64 1
79
+#define TCG_TARGET_HAS_rot_i64 1
80
+#define TCG_TARGET_HAS_negsetcond_i64 0
81
+#define TCG_TARGET_HAS_muls2_i64 1
82
+#define TCG_TARGET_HAS_add2_i32 1
83
+#define TCG_TARGET_HAS_sub2_i32 1
84
+#define TCG_TARGET_HAS_mulu2_i32 1
85
+#define TCG_TARGET_HAS_add2_i64 1
86
+#define TCG_TARGET_HAS_sub2_i64 1
87
+#define TCG_TARGET_HAS_mulu2_i64 1
88
+#define TCG_TARGET_HAS_muluh_i64 0
89
+#define TCG_TARGET_HAS_mulsh_i64 0
90
+#else
91
+#define TCG_TARGET_HAS_mulu2_i32 1
92
+#endif /* TCG_TARGET_REG_BITS == 64 */
99
+
93
+
100
+foreach t: succ_tests
94
+#define TCG_TARGET_HAS_qemu_ldst_i128 0
101
+ test(fs.replace_suffix(t, ''),
95
+
102
+ decodetree, args: ['-o', '/dev/null', files(t)],
96
+#define TCG_TARGET_HAS_tst 1
103
+ suite: suite)
97
+
104
+endforeach
98
+#endif
105
diff --git a/tests/meson.build b/tests/meson.build
99
diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h
106
index XXXXXXX..XXXXXXX 100644
100
index XXXXXXX..XXXXXXX 100644
107
--- a/tests/meson.build
101
--- a/tcg/tci/tcg-target.h
108
+++ b/tests/meson.build
102
+++ b/tcg/tci/tcg-target.h
109
@@ -XXX,XX +XXX,XX @@ if have_tools and have_vhost_user and 'CONFIG_LINUX' in config_host
103
@@ -XXX,XX +XXX,XX @@
110
dependencies: [qemuutil, vhost_user])
104
#define TCG_TARGET_INSN_UNIT_SIZE 4
111
endif
105
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
112
106
113
-test('decodetree', sh,
107
-/* Optional instructions. */
114
- args: [ files('decode/check.sh'), config_host['PYTHON'], files('../scripts/decodetree.py') ],
108
-
115
- workdir: meson.current_source_dir() / 'decode',
109
-#define TCG_TARGET_HAS_bswap16_i32 1
116
- suite: 'decodetree')
110
-#define TCG_TARGET_HAS_bswap32_i32 1
117
+subdir('decode')
111
-#define TCG_TARGET_HAS_div_i32 1
118
112
-#define TCG_TARGET_HAS_rem_i32 1
119
if 'CONFIG_TCG' in config_all
113
-#define TCG_TARGET_HAS_ext8s_i32 1
120
subdir('fp')
114
-#define TCG_TARGET_HAS_ext16s_i32 1
115
-#define TCG_TARGET_HAS_ext8u_i32 1
116
-#define TCG_TARGET_HAS_ext16u_i32 1
117
-#define TCG_TARGET_HAS_andc_i32 1
118
-#define TCG_TARGET_HAS_deposit_i32 1
119
-#define TCG_TARGET_HAS_extract_i32 1
120
-#define TCG_TARGET_HAS_sextract_i32 1
121
-#define TCG_TARGET_HAS_extract2_i32 0
122
-#define TCG_TARGET_HAS_eqv_i32 1
123
-#define TCG_TARGET_HAS_nand_i32 1
124
-#define TCG_TARGET_HAS_nor_i32 1
125
-#define TCG_TARGET_HAS_clz_i32 1
126
-#define TCG_TARGET_HAS_ctz_i32 1
127
-#define TCG_TARGET_HAS_ctpop_i32 1
128
-#define TCG_TARGET_HAS_not_i32 1
129
-#define TCG_TARGET_HAS_orc_i32 1
130
-#define TCG_TARGET_HAS_rot_i32 1
131
-#define TCG_TARGET_HAS_negsetcond_i32 0
132
-#define TCG_TARGET_HAS_muls2_i32 1
133
-#define TCG_TARGET_HAS_muluh_i32 0
134
-#define TCG_TARGET_HAS_mulsh_i32 0
135
-#define TCG_TARGET_HAS_qemu_st8_i32 0
136
-
137
-#if TCG_TARGET_REG_BITS == 64
138
-#define TCG_TARGET_HAS_extr_i64_i32 0
139
-#define TCG_TARGET_HAS_bswap16_i64 1
140
-#define TCG_TARGET_HAS_bswap32_i64 1
141
-#define TCG_TARGET_HAS_bswap64_i64 1
142
-#define TCG_TARGET_HAS_deposit_i64 1
143
-#define TCG_TARGET_HAS_extract_i64 1
144
-#define TCG_TARGET_HAS_sextract_i64 1
145
-#define TCG_TARGET_HAS_extract2_i64 0
146
-#define TCG_TARGET_HAS_div_i64 1
147
-#define TCG_TARGET_HAS_rem_i64 1
148
-#define TCG_TARGET_HAS_ext8s_i64 1
149
-#define TCG_TARGET_HAS_ext16s_i64 1
150
-#define TCG_TARGET_HAS_ext32s_i64 1
151
-#define TCG_TARGET_HAS_ext8u_i64 1
152
-#define TCG_TARGET_HAS_ext16u_i64 1
153
-#define TCG_TARGET_HAS_ext32u_i64 1
154
-#define TCG_TARGET_HAS_andc_i64 1
155
-#define TCG_TARGET_HAS_eqv_i64 1
156
-#define TCG_TARGET_HAS_nand_i64 1
157
-#define TCG_TARGET_HAS_nor_i64 1
158
-#define TCG_TARGET_HAS_clz_i64 1
159
-#define TCG_TARGET_HAS_ctz_i64 1
160
-#define TCG_TARGET_HAS_ctpop_i64 1
161
-#define TCG_TARGET_HAS_not_i64 1
162
-#define TCG_TARGET_HAS_orc_i64 1
163
-#define TCG_TARGET_HAS_rot_i64 1
164
-#define TCG_TARGET_HAS_negsetcond_i64 0
165
-#define TCG_TARGET_HAS_muls2_i64 1
166
-#define TCG_TARGET_HAS_add2_i32 1
167
-#define TCG_TARGET_HAS_sub2_i32 1
168
-#define TCG_TARGET_HAS_mulu2_i32 1
169
-#define TCG_TARGET_HAS_add2_i64 1
170
-#define TCG_TARGET_HAS_sub2_i64 1
171
-#define TCG_TARGET_HAS_mulu2_i64 1
172
-#define TCG_TARGET_HAS_muluh_i64 0
173
-#define TCG_TARGET_HAS_mulsh_i64 0
174
-#else
175
-#define TCG_TARGET_HAS_mulu2_i32 1
176
-#endif /* TCG_TARGET_REG_BITS == 64 */
177
-
178
-#define TCG_TARGET_HAS_qemu_ldst_i128 0
179
-
180
-#define TCG_TARGET_HAS_tst 1
181
+#include "tcg-target-has.h"
182
183
/* Number of registers available. */
184
#define TCG_TARGET_NB_REGS 16
121
--
185
--
122
2.34.1
186
2.43.0
187
188
diff view generated by jsdifflib
1
The last use was removed by e77c89fb086a.
2
3
Fixes: e77c89fb086a ("cputlb: Remove static tlb sizing")
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-14-philmd@linaro.org>
6
---
4
---
7
tcg/aarch64/tcg-target.h | 1 -
5
tcg/aarch64/tcg-target.h | 2 --
8
tcg/arm/tcg-target.h | 1 -
6
tcg/arm/tcg-target.h | 2 --
9
tcg/i386/tcg-target.h | 1 -
7
tcg/i386/tcg-target.h | 2 --
10
tcg/mips/tcg-target.h | 1 -
8
tcg/loongarch64/tcg-target.h | 2 --
11
tcg/ppc/tcg-target.h | 1 -
9
tcg/mips/tcg-target.h | 2 --
12
tcg/riscv/tcg-target.h | 1 -
10
tcg/ppc/tcg-target.h | 2 --
13
tcg/s390x/tcg-target.h | 1 -
11
tcg/riscv/tcg-target.h | 2 --
14
tcg/sparc64/tcg-target.h | 1 -
12
tcg/s390x/tcg-target.h | 2 --
15
tcg/tci/tcg-target.h | 1 -
13
tcg/sparc64/tcg-target.h | 2 --
16
9 files changed, 9 deletions(-)
14
tcg/tcg-has.h | 2 ++
15
tcg/tci/tcg-target.h | 2 --
16
11 files changed, 2 insertions(+), 20 deletions(-)
17
17
18
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
18
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
19
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
20
--- a/tcg/aarch64/tcg-target.h
20
--- a/tcg/aarch64/tcg-target.h
21
+++ b/tcg/aarch64/tcg-target.h
21
+++ b/tcg/aarch64/tcg-target.h
22
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ typedef enum {
23
#include "host/cpuinfo.h"
23
24
24
#define TCG_TARGET_NB_REGS 64
25
#define TCG_TARGET_INSN_UNIT_SIZE 4
25
26
-#define TCG_TARGET_TLB_DISPLACEMENT_BITS 24
26
-#include "tcg-target-has.h"
27
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
27
-
28
28
#define TCG_TARGET_DEFAULT_MO (0)
29
typedef enum {
29
30
#endif /* AARCH64_TCG_TARGET_H */
30
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
31
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
31
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
32
--- a/tcg/arm/tcg-target.h
33
--- a/tcg/arm/tcg-target.h
33
+++ b/tcg/arm/tcg-target.h
34
+++ b/tcg/arm/tcg-target.h
34
@@ -XXX,XX +XXX,XX @@ extern int arm_arch;
35
@@ -XXX,XX +XXX,XX @@ typedef enum {
35
#define use_armv7_instructions (__ARM_ARCH >= 7 || arm_arch >= 7)
36
36
37
#define TCG_TARGET_NB_REGS 32
37
#define TCG_TARGET_INSN_UNIT_SIZE 4
38
38
-#define TCG_TARGET_TLB_DISPLACEMENT_BITS 16
39
-#include "tcg-target-has.h"
39
#define MAX_CODE_GEN_BUFFER_SIZE UINT32_MAX
40
-
40
41
#define TCG_TARGET_DEFAULT_MO (0)
41
typedef enum {
42
43
#endif
42
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
44
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
43
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
44
--- a/tcg/i386/tcg-target.h
46
--- a/tcg/i386/tcg-target.h
45
+++ b/tcg/i386/tcg-target.h
47
+++ b/tcg/i386/tcg-target.h
46
@@ -XXX,XX +XXX,XX @@
48
@@ -XXX,XX +XXX,XX @@ typedef enum {
47
#include "host/cpuinfo.h"
49
TCG_REG_CALL_STACK = TCG_REG_ESP
48
50
} TCGReg;
49
#define TCG_TARGET_INSN_UNIT_SIZE 1
51
50
-#define TCG_TARGET_TLB_DISPLACEMENT_BITS 31
52
-#include "tcg-target-has.h"
51
53
-
52
#ifdef __x86_64__
54
/* This defines the natural memory order supported by this
53
# define TCG_TARGET_REG_BITS 64
55
* architecture before guarantees made by various barrier
56
* instructions.
57
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
58
index XXXXXXX..XXXXXXX 100644
59
--- a/tcg/loongarch64/tcg-target.h
60
+++ b/tcg/loongarch64/tcg-target.h
61
@@ -XXX,XX +XXX,XX @@ typedef enum {
62
TCG_VEC_TMP0 = TCG_REG_V23,
63
} TCGReg;
64
65
-#include "tcg-target-has.h"
66
-
67
#define TCG_TARGET_DEFAULT_MO (0)
68
69
#endif /* LOONGARCH_TCG_TARGET_H */
54
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
70
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
55
index XXXXXXX..XXXXXXX 100644
71
index XXXXXXX..XXXXXXX 100644
56
--- a/tcg/mips/tcg-target.h
72
--- a/tcg/mips/tcg-target.h
57
+++ b/tcg/mips/tcg-target.h
73
+++ b/tcg/mips/tcg-target.h
58
@@ -XXX,XX +XXX,XX @@
74
@@ -XXX,XX +XXX,XX @@ typedef enum {
75
TCG_AREG0 = TCG_REG_S8,
76
} TCGReg;
77
78
-#include "tcg-target-has.h"
79
-
80
#define TCG_TARGET_DEFAULT_MO 0
81
59
#endif
82
#endif
60
61
#define TCG_TARGET_INSN_UNIT_SIZE 4
62
-#define TCG_TARGET_TLB_DISPLACEMENT_BITS 16
63
#define TCG_TARGET_NB_REGS 32
64
65
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
66
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
83
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
67
index XXXXXXX..XXXXXXX 100644
84
index XXXXXXX..XXXXXXX 100644
68
--- a/tcg/ppc/tcg-target.h
85
--- a/tcg/ppc/tcg-target.h
69
+++ b/tcg/ppc/tcg-target.h
86
+++ b/tcg/ppc/tcg-target.h
70
@@ -XXX,XX +XXX,XX @@
87
@@ -XXX,XX +XXX,XX @@ typedef enum {
71
88
TCG_AREG0 = TCG_REG_R27
72
#define TCG_TARGET_NB_REGS 64
89
} TCGReg;
73
#define TCG_TARGET_INSN_UNIT_SIZE 4
90
74
-#define TCG_TARGET_TLB_DISPLACEMENT_BITS 16
91
-#include "tcg-target-has.h"
75
92
-
76
typedef enum {
93
#define TCG_TARGET_DEFAULT_MO (0)
77
TCG_REG_R0, TCG_REG_R1, TCG_REG_R2, TCG_REG_R3,
94
95
#endif
78
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
96
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
79
index XXXXXXX..XXXXXXX 100644
97
index XXXXXXX..XXXXXXX 100644
80
--- a/tcg/riscv/tcg-target.h
98
--- a/tcg/riscv/tcg-target.h
81
+++ b/tcg/riscv/tcg-target.h
99
+++ b/tcg/riscv/tcg-target.h
82
@@ -XXX,XX +XXX,XX @@
100
@@ -XXX,XX +XXX,XX @@ typedef enum {
83
#define TCG_TARGET_REG_BITS 64
101
TCG_REG_TMP2 = TCG_REG_T4,
84
102
} TCGReg;
85
#define TCG_TARGET_INSN_UNIT_SIZE 4
103
86
-#define TCG_TARGET_TLB_DISPLACEMENT_BITS 20
104
-#include "tcg-target-has.h"
87
#define TCG_TARGET_NB_REGS 32
105
-
88
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
106
#define TCG_TARGET_DEFAULT_MO (0)
89
107
108
#endif
90
diff --git a/tcg/s390x/tcg-target.h b/tcg/s390x/tcg-target.h
109
diff --git a/tcg/s390x/tcg-target.h b/tcg/s390x/tcg-target.h
91
index XXXXXXX..XXXXXXX 100644
110
index XXXXXXX..XXXXXXX 100644
92
--- a/tcg/s390x/tcg-target.h
111
--- a/tcg/s390x/tcg-target.h
93
+++ b/tcg/s390x/tcg-target.h
112
+++ b/tcg/s390x/tcg-target.h
94
@@ -XXX,XX +XXX,XX @@
113
@@ -XXX,XX +XXX,XX @@ typedef enum TCGReg {
95
#define S390_TCG_TARGET_H
114
96
115
#define TCG_TARGET_NB_REGS 64
97
#define TCG_TARGET_INSN_UNIT_SIZE 2
116
98
-#define TCG_TARGET_TLB_DISPLACEMENT_BITS 19
117
-#include "tcg-target-has.h"
99
118
-
100
/* We have a +- 4GB range on the branches; leave some slop. */
119
#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
101
#define MAX_CODE_GEN_BUFFER_SIZE (3 * GiB)
120
121
#endif
102
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
122
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
103
index XXXXXXX..XXXXXXX 100644
123
index XXXXXXX..XXXXXXX 100644
104
--- a/tcg/sparc64/tcg-target.h
124
--- a/tcg/sparc64/tcg-target.h
105
+++ b/tcg/sparc64/tcg-target.h
125
+++ b/tcg/sparc64/tcg-target.h
126
@@ -XXX,XX +XXX,XX @@ typedef enum {
127
128
#define TCG_AREG0 TCG_REG_I0
129
130
-#include "tcg-target-has.h"
131
-
132
#define TCG_TARGET_DEFAULT_MO (0)
133
134
#endif
135
diff --git a/tcg/tcg-has.h b/tcg/tcg-has.h
136
index XXXXXXX..XXXXXXX 100644
137
--- a/tcg/tcg-has.h
138
+++ b/tcg/tcg-has.h
106
@@ -XXX,XX +XXX,XX @@
139
@@ -XXX,XX +XXX,XX @@
107
#define SPARC_TCG_TARGET_H
140
#ifndef TCG_HAS_H
108
141
#define TCG_HAS_H
109
#define TCG_TARGET_INSN_UNIT_SIZE 4
142
110
-#define TCG_TARGET_TLB_DISPLACEMENT_BITS 32
143
+#include "tcg-target-has.h"
111
#define TCG_TARGET_NB_REGS 32
144
+
112
#define MAX_CODE_GEN_BUFFER_SIZE (2 * GiB)
145
#if TCG_TARGET_REG_BITS == 32
113
146
/* Turn some undef macros into false macros. */
147
#define TCG_TARGET_HAS_extr_i64_i32 0
114
diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h
148
diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h
115
index XXXXXXX..XXXXXXX 100644
149
index XXXXXXX..XXXXXXX 100644
116
--- a/tcg/tci/tcg-target.h
150
--- a/tcg/tci/tcg-target.h
117
+++ b/tcg/tci/tcg-target.h
151
+++ b/tcg/tci/tcg-target.h
118
@@ -XXX,XX +XXX,XX @@
152
@@ -XXX,XX +XXX,XX @@
119
120
#define TCG_TARGET_INTERPRETER 1
121
#define TCG_TARGET_INSN_UNIT_SIZE 4
153
#define TCG_TARGET_INSN_UNIT_SIZE 4
122
-#define TCG_TARGET_TLB_DISPLACEMENT_BITS 32
123
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
154
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
124
155
125
#if UINTPTR_MAX == UINT32_MAX
156
-#include "tcg-target-has.h"
157
-
158
/* Number of registers available. */
159
#define TCG_TARGET_NB_REGS 16
160
126
--
161
--
127
2.34.1
162
2.43.0
128
163
129
164
diff view generated by jsdifflib
1
Test err_pattern_group_empty.decode failed with exception:
1
TCG_TARGET_HAS_* definitions don't need to be exposed
2
2
by "tcg/tcg.h". Only include 'tcg-has.h' when necessary.
3
Traceback (most recent call last):
4
File "./scripts/decodetree.py", line 1424, in <module> main()
5
File "./scripts/decodetree.py", line 1342, in main toppat.build_tree()
6
File "./scripts/decodetree.py", line 627, in build_tree
7
self.tree = self.__build_tree(self.pats, self.fixedbits,
8
File "./scripts/decodetree.py", line 607, in __build_tree
9
fb = i.fixedbits & innermask
10
TypeError: unsupported operand type(s) for &: 'NoneType' and 'int'
11
3
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Message-ID: <20250108215156.8731-15-philmd@linaro.org>
13
---
7
---
14
scripts/decodetree.py | 6 ++++++
8
include/tcg/tcg.h | 2 --
15
1 file changed, 6 insertions(+)
9
tcg/optimize.c | 1 +
10
tcg/tcg-common.c | 1 +
11
tcg/tcg-op-gvec.c | 1 +
12
tcg/tcg-op-ldst.c | 2 +-
13
tcg/tcg-op-vec.c | 1 +
14
tcg/tcg-op.c | 2 +-
15
tcg/tcg.c | 1 +
16
tcg/tci.c | 1 +
17
9 files changed, 8 insertions(+), 4 deletions(-)
16
18
17
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
19
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
18
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
19
--- a/scripts/decodetree.py
21
--- a/include/tcg/tcg.h
20
+++ b/scripts/decodetree.py
22
+++ b/include/tcg/tcg.h
21
@@ -XXX,XX +XXX,XX @@ def output_code(self, i, extracted, outerbits, outermask):
23
@@ -XXX,XX +XXX,XX @@ typedef uint64_t TCGRegSet;
22
output(ind, '}\n')
24
#error unsupported
23
else:
25
#endif
24
p.output_code(i, extracted, p.fixedbits, p.fixedmask)
26
25
+
27
-#include "tcg/tcg-has.h"
26
+ def build_tree(self):
28
-
27
+ if not self.pats:
29
typedef enum TCGOpcode {
28
+ error_with_file(self.file, self.lineno, 'empty pattern group')
30
#define DEF(name, oargs, iargs, cargs, flags) INDEX_op_ ## name,
29
+ super().build_tree()
31
#include "tcg/tcg-opc.h"
30
+
32
diff --git a/tcg/optimize.c b/tcg/optimize.c
31
#end IncMultiPattern
33
index XXXXXXX..XXXXXXX 100644
34
--- a/tcg/optimize.c
35
+++ b/tcg/optimize.c
36
@@ -XXX,XX +XXX,XX @@
37
#include "qemu/interval-tree.h"
38
#include "tcg/tcg-op-common.h"
39
#include "tcg-internal.h"
40
+#include "tcg-has.h"
41
42
#define CASE_OP_32_64(x) \
43
glue(glue(case INDEX_op_, x), _i32): \
44
diff --git a/tcg/tcg-common.c b/tcg/tcg-common.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/tcg/tcg-common.c
47
+++ b/tcg/tcg-common.c
48
@@ -XXX,XX +XXX,XX @@
49
50
#include "qemu/osdep.h"
51
#include "tcg/tcg.h"
52
+#include "tcg-has.h"
53
54
TCGOpDef tcg_op_defs[] = {
55
#define DEF(s, oargs, iargs, cargs, flags) \
56
diff --git a/tcg/tcg-op-gvec.c b/tcg/tcg-op-gvec.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/tcg/tcg-op-gvec.c
59
+++ b/tcg/tcg-op-gvec.c
60
@@ -XXX,XX +XXX,XX @@
61
#include "tcg/tcg-op-common.h"
62
#include "tcg/tcg-op-gvec-common.h"
63
#include "tcg/tcg-gvec-desc.h"
64
+#include "tcg-has.h"
65
66
#define MAX_UNROLL 4
67
68
diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/tcg/tcg-op-ldst.c
71
+++ b/tcg/tcg-op-ldst.c
72
@@ -XXX,XX +XXX,XX @@
73
#include "exec/translation-block.h"
74
#include "exec/plugin-gen.h"
75
#include "tcg-internal.h"
76
-
77
+#include "tcg-has.h"
78
79
static void check_max_alignment(unsigned a_bits)
80
{
81
diff --git a/tcg/tcg-op-vec.c b/tcg/tcg-op-vec.c
82
index XXXXXXX..XXXXXXX 100644
83
--- a/tcg/tcg-op-vec.c
84
+++ b/tcg/tcg-op-vec.c
85
@@ -XXX,XX +XXX,XX @@
86
#include "tcg/tcg-op-common.h"
87
#include "tcg/tcg-mo.h"
88
#include "tcg-internal.h"
89
+#include "tcg-has.h"
90
91
/*
92
* Vector optional opcode tracking.
93
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/tcg/tcg-op.c
96
+++ b/tcg/tcg-op.c
97
@@ -XXX,XX +XXX,XX @@
98
#include "exec/translation-block.h"
99
#include "exec/plugin-gen.h"
100
#include "tcg-internal.h"
101
-
102
+#include "tcg-has.h"
103
104
/*
105
* Encourage the compiler to tail-call to a function, rather than inlining.
106
diff --git a/tcg/tcg.c b/tcg/tcg.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/tcg/tcg.c
109
+++ b/tcg/tcg.c
110
@@ -XXX,XX +XXX,XX @@
111
#include "tcg/tcg-temp-internal.h"
112
#include "tcg-internal.h"
113
#include "tcg/perf.h"
114
+#include "tcg-has.h"
115
#ifdef CONFIG_USER_ONLY
116
#include "user/guest-base.h"
117
#endif
118
diff --git a/tcg/tci.c b/tcg/tci.c
119
index XXXXXXX..XXXXXXX 100644
120
--- a/tcg/tci.c
121
+++ b/tcg/tci.c
122
@@ -XXX,XX +XXX,XX @@
123
#include "tcg/helper-info.h"
124
#include "tcg/tcg-ldst.h"
125
#include "disas/dis-asm.h"
126
+#include "tcg-has.h"
127
#include <ffi.h>
32
128
33
129
34
--
130
--
35
2.34.1
131
2.43.0
132
133
diff view generated by jsdifflib
New patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
accel/tcg/internal-target.h | 1 +
5
tcg/aarch64/tcg-target-mo.h | 12 ++++++++++++
6
tcg/aarch64/tcg-target.h | 2 --
7
tcg/arm/tcg-target-mo.h | 13 +++++++++++++
8
tcg/arm/tcg-target.h | 2 --
9
tcg/i386/tcg-target-mo.h | 19 +++++++++++++++++++
10
tcg/i386/tcg-target.h | 11 -----------
11
tcg/loongarch64/tcg-target-mo.h | 12 ++++++++++++
12
tcg/loongarch64/tcg-target.h | 2 --
13
tcg/mips/tcg-target-mo.h | 13 +++++++++++++
14
tcg/mips/tcg-target.h | 2 --
15
tcg/ppc/tcg-target-mo.h | 12 ++++++++++++
16
tcg/ppc/tcg-target.h | 2 --
17
tcg/riscv/tcg-target-mo.h | 12 ++++++++++++
18
tcg/riscv/tcg-target.h | 2 --
19
tcg/s390x/tcg-target-mo.h | 12 ++++++++++++
20
tcg/s390x/tcg-target.h | 2 --
21
tcg/sparc64/tcg-target-mo.h | 12 ++++++++++++
22
tcg/sparc64/tcg-target.h | 2 --
23
tcg/tci/tcg-target-mo.h | 17 +++++++++++++++++
24
tcg/tci/tcg-target.h | 5 -----
25
tcg/tcg-op-ldst.c | 1 +
26
22 files changed, 136 insertions(+), 32 deletions(-)
27
create mode 100644 tcg/aarch64/tcg-target-mo.h
28
create mode 100644 tcg/arm/tcg-target-mo.h
29
create mode 100644 tcg/i386/tcg-target-mo.h
30
create mode 100644 tcg/loongarch64/tcg-target-mo.h
31
create mode 100644 tcg/mips/tcg-target-mo.h
32
create mode 100644 tcg/ppc/tcg-target-mo.h
33
create mode 100644 tcg/riscv/tcg-target-mo.h
34
create mode 100644 tcg/s390x/tcg-target-mo.h
35
create mode 100644 tcg/sparc64/tcg-target-mo.h
36
create mode 100644 tcg/tci/tcg-target-mo.h
1
37
38
diff --git a/accel/tcg/internal-target.h b/accel/tcg/internal-target.h
39
index XXXXXXX..XXXXXXX 100644
40
--- a/accel/tcg/internal-target.h
41
+++ b/accel/tcg/internal-target.h
42
@@ -XXX,XX +XXX,XX @@
43
#include "exec/exec-all.h"
44
#include "exec/translation-block.h"
45
#include "tb-internal.h"
46
+#include "tcg-target-mo.h"
47
48
/*
49
* Access to the various translations structures need to be serialised
50
diff --git a/tcg/aarch64/tcg-target-mo.h b/tcg/aarch64/tcg-target-mo.h
51
new file mode 100644
52
index XXXXXXX..XXXXXXX
53
--- /dev/null
54
+++ b/tcg/aarch64/tcg-target-mo.h
55
@@ -XXX,XX +XXX,XX @@
56
+/* SPDX-License-Identifier: GPL-2.0-or-later */
57
+/*
58
+ * Define target-specific memory model
59
+ * Copyright (c) 2013 Huawei Technologies Duesseldorf GmbH
60
+ */
61
+
62
+#ifndef TCG_TARGET_MO_H
63
+#define TCG_TARGET_MO_H
64
+
65
+#define TCG_TARGET_DEFAULT_MO 0
66
+
67
+#endif
68
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
69
index XXXXXXX..XXXXXXX 100644
70
--- a/tcg/aarch64/tcg-target.h
71
+++ b/tcg/aarch64/tcg-target.h
72
@@ -XXX,XX +XXX,XX @@ typedef enum {
73
74
#define TCG_TARGET_NB_REGS 64
75
76
-#define TCG_TARGET_DEFAULT_MO (0)
77
-
78
#endif /* AARCH64_TCG_TARGET_H */
79
diff --git a/tcg/arm/tcg-target-mo.h b/tcg/arm/tcg-target-mo.h
80
new file mode 100644
81
index XXXXXXX..XXXXXXX
82
--- /dev/null
83
+++ b/tcg/arm/tcg-target-mo.h
84
@@ -XXX,XX +XXX,XX @@
85
+/* SPDX-License-Identifier: MIT */
86
+/*
87
+ * Define target-specific memory model
88
+ * Copyright (c) 2008 Fabrice Bellard
89
+ * Copyright (c) 2008 Andrzej Zaborowski
90
+ */
91
+
92
+#ifndef TCG_TARGET_MO_H
93
+#define TCG_TARGET_MO_H
94
+
95
+#define TCG_TARGET_DEFAULT_MO 0
96
+
97
+#endif
98
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
99
index XXXXXXX..XXXXXXX 100644
100
--- a/tcg/arm/tcg-target.h
101
+++ b/tcg/arm/tcg-target.h
102
@@ -XXX,XX +XXX,XX @@ typedef enum {
103
104
#define TCG_TARGET_NB_REGS 32
105
106
-#define TCG_TARGET_DEFAULT_MO (0)
107
-
108
#endif
109
diff --git a/tcg/i386/tcg-target-mo.h b/tcg/i386/tcg-target-mo.h
110
new file mode 100644
111
index XXXXXXX..XXXXXXX
112
--- /dev/null
113
+++ b/tcg/i386/tcg-target-mo.h
114
@@ -XXX,XX +XXX,XX @@
115
+/* SPDX-License-Identifier: MIT */
116
+/*
117
+ * Define target-specific memory model
118
+ * Copyright (c) 2008 Fabrice Bellard
119
+ */
120
+
121
+#ifndef TCG_TARGET_MO_H
122
+#define TCG_TARGET_MO_H
123
+
124
+/*
125
+ * This defines the natural memory order supported by this architecture
126
+ * before guarantees made by various barrier instructions.
127
+ *
128
+ * The x86 has a pretty strong memory ordering which only really
129
+ * allows for some stores to be re-ordered after loads.
130
+ */
131
+#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
132
+
133
+#endif
134
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
135
index XXXXXXX..XXXXXXX 100644
136
--- a/tcg/i386/tcg-target.h
137
+++ b/tcg/i386/tcg-target.h
138
@@ -XXX,XX +XXX,XX @@ typedef enum {
139
TCG_REG_CALL_STACK = TCG_REG_ESP
140
} TCGReg;
141
142
-/* This defines the natural memory order supported by this
143
- * architecture before guarantees made by various barrier
144
- * instructions.
145
- *
146
- * The x86 has a pretty strong memory ordering which only really
147
- * allows for some stores to be re-ordered after loads.
148
- */
149
-#include "tcg/tcg-mo.h"
150
-
151
-#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
152
-
153
#endif
154
diff --git a/tcg/loongarch64/tcg-target-mo.h b/tcg/loongarch64/tcg-target-mo.h
155
new file mode 100644
156
index XXXXXXX..XXXXXXX
157
--- /dev/null
158
+++ b/tcg/loongarch64/tcg-target-mo.h
159
@@ -XXX,XX +XXX,XX @@
160
+/* SPDX-License-Identifier: MIT */
161
+/*
162
+ * Define target-specific memory model
163
+ * Copyright (c) 2021 WANG Xuerui <git@xen0n.name>
164
+ */
165
+
166
+#ifndef TCG_TARGET_MO_H
167
+#define TCG_TARGET_MO_H
168
+
169
+#define TCG_TARGET_DEFAULT_MO 0
170
+
171
+#endif
172
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
173
index XXXXXXX..XXXXXXX 100644
174
--- a/tcg/loongarch64/tcg-target.h
175
+++ b/tcg/loongarch64/tcg-target.h
176
@@ -XXX,XX +XXX,XX @@ typedef enum {
177
TCG_VEC_TMP0 = TCG_REG_V23,
178
} TCGReg;
179
180
-#define TCG_TARGET_DEFAULT_MO (0)
181
-
182
#endif /* LOONGARCH_TCG_TARGET_H */
183
diff --git a/tcg/mips/tcg-target-mo.h b/tcg/mips/tcg-target-mo.h
184
new file mode 100644
185
index XXXXXXX..XXXXXXX
186
--- /dev/null
187
+++ b/tcg/mips/tcg-target-mo.h
188
@@ -XXX,XX +XXX,XX @@
189
+/* SPDX-License-Identifier: MIT */
190
+/*
191
+ * Define target-specific memory model
192
+ * Copyright (c) 2008-2009 Arnaud Patard <arnaud.patard@rtp-net.org>
193
+ * Copyright (c) 2009 Aurelien Jarno <aurelien@aurel32.net>
194
+ */
195
+
196
+#ifndef TCG_TARGET_MO_H
197
+#define TCG_TARGET_MO_H
198
+
199
+#define TCG_TARGET_DEFAULT_MO 0
200
+
201
+#endif
202
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
203
index XXXXXXX..XXXXXXX 100644
204
--- a/tcg/mips/tcg-target.h
205
+++ b/tcg/mips/tcg-target.h
206
@@ -XXX,XX +XXX,XX @@ typedef enum {
207
TCG_AREG0 = TCG_REG_S8,
208
} TCGReg;
209
210
-#define TCG_TARGET_DEFAULT_MO 0
211
-
212
#endif
213
diff --git a/tcg/ppc/tcg-target-mo.h b/tcg/ppc/tcg-target-mo.h
214
new file mode 100644
215
index XXXXXXX..XXXXXXX
216
--- /dev/null
217
+++ b/tcg/ppc/tcg-target-mo.h
218
@@ -XXX,XX +XXX,XX @@
219
+/* SPDX-License-Identifier: MIT */
220
+/*
221
+ * Define target-specific memory model
222
+ * Copyright (c) 2008 Fabrice Bellard
223
+ */
224
+
225
+#ifndef TCG_TARGET_MO_H
226
+#define TCG_TARGET_MO_H
227
+
228
+#define TCG_TARGET_DEFAULT_MO 0
229
+
230
+#endif
231
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
232
index XXXXXXX..XXXXXXX 100644
233
--- a/tcg/ppc/tcg-target.h
234
+++ b/tcg/ppc/tcg-target.h
235
@@ -XXX,XX +XXX,XX @@ typedef enum {
236
TCG_AREG0 = TCG_REG_R27
237
} TCGReg;
238
239
-#define TCG_TARGET_DEFAULT_MO (0)
240
-
241
#endif
242
diff --git a/tcg/riscv/tcg-target-mo.h b/tcg/riscv/tcg-target-mo.h
243
new file mode 100644
244
index XXXXXXX..XXXXXXX
245
--- /dev/null
246
+++ b/tcg/riscv/tcg-target-mo.h
247
@@ -XXX,XX +XXX,XX @@
248
+/* SPDX-License-Identifier: MIT */
249
+/*
250
+ * Define target-specific memory model
251
+ * Copyright (c) 2018 SiFive, Inc
252
+ */
253
+
254
+#ifndef TCG_TARGET_MO_H
255
+#define TCG_TARGET_MO_H
256
+
257
+#define TCG_TARGET_DEFAULT_MO 0
258
+
259
+#endif
260
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
261
index XXXXXXX..XXXXXXX 100644
262
--- a/tcg/riscv/tcg-target.h
263
+++ b/tcg/riscv/tcg-target.h
264
@@ -XXX,XX +XXX,XX @@ typedef enum {
265
TCG_REG_TMP2 = TCG_REG_T4,
266
} TCGReg;
267
268
-#define TCG_TARGET_DEFAULT_MO (0)
269
-
270
#endif
271
diff --git a/tcg/s390x/tcg-target-mo.h b/tcg/s390x/tcg-target-mo.h
272
new file mode 100644
273
index XXXXXXX..XXXXXXX
274
--- /dev/null
275
+++ b/tcg/s390x/tcg-target-mo.h
276
@@ -XXX,XX +XXX,XX @@
277
+/* SPDX-License-Identifier: MIT */
278
+/*
279
+ * Define target-specific memory model
280
+ * Copyright (c) 2009 Ulrich Hecht <uli@suse.de>
281
+ */
282
+
283
+#ifndef TCG_TARGET_MO_H
284
+#define TCG_TARGET_MO_H
285
+
286
+#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
287
+
288
+#endif
289
diff --git a/tcg/s390x/tcg-target.h b/tcg/s390x/tcg-target.h
290
index XXXXXXX..XXXXXXX 100644
291
--- a/tcg/s390x/tcg-target.h
292
+++ b/tcg/s390x/tcg-target.h
293
@@ -XXX,XX +XXX,XX @@ typedef enum TCGReg {
294
295
#define TCG_TARGET_NB_REGS 64
296
297
-#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
298
-
299
#endif
300
diff --git a/tcg/sparc64/tcg-target-mo.h b/tcg/sparc64/tcg-target-mo.h
301
new file mode 100644
302
index XXXXXXX..XXXXXXX
303
--- /dev/null
304
+++ b/tcg/sparc64/tcg-target-mo.h
305
@@ -XXX,XX +XXX,XX @@
306
+/* SPDX-License-Identifier: MIT */
307
+/*
308
+ * Define target-specific memory model
309
+ * Copyright (c) 2008 Fabrice Bellard
310
+ */
311
+
312
+#ifndef TCG_TARGET_MO_H
313
+#define TCG_TARGET_MO_H
314
+
315
+#define TCG_TARGET_DEFAULT_MO 0
316
+
317
+#endif
318
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
319
index XXXXXXX..XXXXXXX 100644
320
--- a/tcg/sparc64/tcg-target.h
321
+++ b/tcg/sparc64/tcg-target.h
322
@@ -XXX,XX +XXX,XX @@ typedef enum {
323
324
#define TCG_AREG0 TCG_REG_I0
325
326
-#define TCG_TARGET_DEFAULT_MO (0)
327
-
328
#endif
329
diff --git a/tcg/tci/tcg-target-mo.h b/tcg/tci/tcg-target-mo.h
330
new file mode 100644
331
index XXXXXXX..XXXXXXX
332
--- /dev/null
333
+++ b/tcg/tci/tcg-target-mo.h
334
@@ -XXX,XX +XXX,XX @@
335
+/* SPDX-License-Identifier: MIT */
336
+/*
337
+ * Define target-specific memory model
338
+ * Copyright (c) 2009, 2011 Stefan Weil
339
+ */
340
+
341
+#ifndef TCG_TARGET_MO_H
342
+#define TCG_TARGET_MO_H
343
+
344
+/*
345
+ * We could notice __i386__ or __s390x__ and reduce the barriers depending
346
+ * on the host. But if you want performance, you use the normal backend.
347
+ * We prefer consistency across hosts on this.
348
+ */
349
+#define TCG_TARGET_DEFAULT_MO 0
350
+
351
+#endif
352
diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h
353
index XXXXXXX..XXXXXXX 100644
354
--- a/tcg/tci/tcg-target.h
355
+++ b/tcg/tci/tcg-target.h
356
@@ -XXX,XX +XXX,XX @@ typedef enum {
357
#define HAVE_TCG_QEMU_TB_EXEC
358
#define TCG_TARGET_NEED_POOL_LABELS
359
360
-/* We could notice __i386__ or __s390x__ and reduce the barriers depending
361
- on the host. But if you want performance, you use the normal backend.
362
- We prefer consistency across hosts on this. */
363
-#define TCG_TARGET_DEFAULT_MO (0)
364
-
365
#endif /* TCG_TARGET_H */
366
diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c
367
index XXXXXXX..XXXXXXX 100644
368
--- a/tcg/tcg-op-ldst.c
369
+++ b/tcg/tcg-op-ldst.c
370
@@ -XXX,XX +XXX,XX @@
371
#include "exec/plugin-gen.h"
372
#include "tcg-internal.h"
373
#include "tcg-has.h"
374
+#include "tcg-target-mo.h"
375
376
static void check_max_alignment(unsigned a_bits)
377
{
378
--
379
2.43.0
380
381
diff view generated by jsdifflib
1
Use LQ/STQ with ISA v2.07, and 16-byte atomicity is required.
1
Return C_NotImplemented instead of asserting for opcodes
2
Note that these instructions do not require 16-byte alignment.
2
not implemented by the backend. For now, the assertion
3
moves to process_op_defs.
3
4
4
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
---
7
tcg/ppc/tcg-target-con-set.h | 2 +
8
tcg/tcg.c | 10 ++++++----
8
tcg/ppc/tcg-target-con-str.h | 1 +
9
tcg/aarch64/tcg-target.c.inc | 2 +-
9
tcg/ppc/tcg-target.h | 3 +-
10
tcg/arm/tcg-target.c.inc | 2 +-
10
tcg/ppc/tcg-target.c.inc | 108 +++++++++++++++++++++++++++++++----
11
tcg/i386/tcg-target.c.inc | 2 +-
11
4 files changed, 101 insertions(+), 13 deletions(-)
12
tcg/loongarch64/tcg-target.c.inc | 2 +-
13
tcg/mips/tcg-target.c.inc | 2 +-
14
tcg/ppc/tcg-target.c.inc | 2 +-
15
tcg/riscv/tcg-target.c.inc | 2 +-
16
tcg/s390x/tcg-target.c.inc | 2 +-
17
tcg/sparc64/tcg-target.c.inc | 2 +-
18
tcg/tci/tcg-target.c.inc | 2 +-
19
11 files changed, 16 insertions(+), 14 deletions(-)
12
20
13
diff --git a/tcg/ppc/tcg-target-con-set.h b/tcg/ppc/tcg-target-con-set.h
21
diff --git a/tcg/tcg.c b/tcg/tcg.c
14
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
15
--- a/tcg/ppc/tcg-target-con-set.h
23
--- a/tcg/tcg.c
16
+++ b/tcg/ppc/tcg-target-con-set.h
24
+++ b/tcg/tcg.c
17
@@ -XXX,XX +XXX,XX @@ C_O0_I2(r, r)
25
@@ -XXX,XX +XXX,XX @@ static int tcg_out_pool_finalize(TCGContext *s)
18
C_O0_I2(r, ri)
26
#define C_N1_O1_I4(O1, O2, I1, I2, I3, I4) C_PFX6(c_n1_o1_i4_, O1, O2, I1, I2, I3, I4),
19
C_O0_I2(v, r)
27
20
C_O0_I3(r, r, r)
28
typedef enum {
21
+C_O0_I3(o, m, r)
29
+ C_NotImplemented = -1,
22
C_O0_I4(r, r, ri, ri)
30
#include "tcg-target-con-set.h"
23
C_O0_I4(r, r, r, r)
31
} TCGConstraintSetIndex;
24
C_O1_I1(r, r)
32
25
@@ -XXX,XX +XXX,XX @@ C_O1_I3(v, v, v, v)
33
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
26
C_O1_I4(r, r, ri, rZ, rZ)
34
const TCGTargetOpDef *tdefs;
27
C_O1_I4(r, r, r, ri, ri)
35
bool saw_alias_pair = false;
28
C_O2_I1(r, r, r)
36
int i, o, i2, o2, nb_args;
29
+C_O2_I1(o, m, r)
37
+ TCGConstraintSetIndex con_set;
30
C_O2_I2(r, r, r, r)
38
31
C_O2_I4(r, r, rI, rZM, r, r)
39
if (def->flags & TCG_OPF_NOT_PRESENT) {
32
C_O2_I4(r, r, r, r, rI, rZM)
40
continue;
33
diff --git a/tcg/ppc/tcg-target-con-str.h b/tcg/ppc/tcg-target-con-str.h
41
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
42
43
/*
44
* Macro magic should make it impossible, but double-check that
45
- * the array index is in range. Since the signness of an enum
46
- * is implementation defined, force the result to unsigned.
47
+ * the array index is in range. At the same time, double-check
48
+ * that the opcode is implemented, i.e. not C_NotImplemented.
49
*/
50
- unsigned con_set = tcg_target_op_def(op);
51
- tcg_debug_assert(con_set < ARRAY_SIZE(constraint_sets));
52
+ con_set = tcg_target_op_def(op);
53
+ tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
54
tdefs = &constraint_sets[con_set];
55
56
for (i = 0; i < nb_args; i++) {
57
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
34
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
35
--- a/tcg/ppc/tcg-target-con-str.h
59
--- a/tcg/aarch64/tcg-target.c.inc
36
+++ b/tcg/ppc/tcg-target-con-str.h
60
+++ b/tcg/aarch64/tcg-target.c.inc
37
@@ -XXX,XX +XXX,XX @@
61
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
38
* REGS(letter, register_mask)
62
return C_O1_I2(w, 0, w);
39
*/
63
40
REGS('r', ALL_GENERAL_REGS)
64
default:
41
+REGS('o', ALL_GENERAL_REGS & 0xAAAAAAAAu) /* odd registers */
65
- g_assert_not_reached();
42
REGS('v', ALL_VECTOR_REGS)
66
+ return C_NotImplemented;
43
67
}
44
/*
68
}
45
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
69
70
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
46
index XXXXXXX..XXXXXXX 100644
71
index XXXXXXX..XXXXXXX 100644
47
--- a/tcg/ppc/tcg-target.h
72
--- a/tcg/arm/tcg-target.c.inc
48
+++ b/tcg/ppc/tcg-target.h
73
+++ b/tcg/arm/tcg-target.c.inc
49
@@ -XXX,XX +XXX,XX @@ extern bool have_vsx;
74
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
50
#define TCG_TARGET_HAS_mulsh_i64 1
75
case INDEX_op_bitsel_vec:
51
#endif
76
return C_O1_I3(w, w, w, w);
52
77
default:
53
-#define TCG_TARGET_HAS_qemu_ldst_i128 0
78
- g_assert_not_reached();
54
+#define TCG_TARGET_HAS_qemu_ldst_i128 \
79
+ return C_NotImplemented;
55
+ (TCG_TARGET_REG_BITS == 64 && have_isa_2_07)
80
}
56
81
}
57
/*
82
58
* While technically Altivec could support V64, it has no 64-bit store
83
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
84
index XXXXXXX..XXXXXXX 100644
85
--- a/tcg/i386/tcg-target.c.inc
86
+++ b/tcg/i386/tcg-target.c.inc
87
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
88
return C_O1_I4(x, x, x, xO, x);
89
90
default:
91
- g_assert_not_reached();
92
+ return C_NotImplemented;
93
}
94
}
95
96
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
97
index XXXXXXX..XXXXXXX 100644
98
--- a/tcg/loongarch64/tcg-target.c.inc
99
+++ b/tcg/loongarch64/tcg-target.c.inc
100
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
101
return C_O1_I3(w, w, w, w);
102
103
default:
104
- g_assert_not_reached();
105
+ return C_NotImplemented;
106
}
107
}
108
109
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
110
index XXXXXXX..XXXXXXX 100644
111
--- a/tcg/mips/tcg-target.c.inc
112
+++ b/tcg/mips/tcg-target.c.inc
113
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
114
: C_O0_I4(rZ, rZ, r, r));
115
116
default:
117
- g_assert_not_reached();
118
+ return C_NotImplemented;
119
}
120
}
121
59
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
122
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
60
index XXXXXXX..XXXXXXX 100644
123
index XXXXXXX..XXXXXXX 100644
61
--- a/tcg/ppc/tcg-target.c.inc
124
--- a/tcg/ppc/tcg-target.c.inc
62
+++ b/tcg/ppc/tcg-target.c.inc
125
+++ b/tcg/ppc/tcg-target.c.inc
63
@@ -XXX,XX +XXX,XX @@ static bool tcg_target_const_match(int64_t val, TCGType type, int ct)
126
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
64
127
return C_O1_I4(v, v, v, vZM, v);
65
#define B OPCD( 18)
128
66
#define BC OPCD( 16)
129
default:
67
+
130
- g_assert_not_reached();
68
#define LBZ OPCD( 34)
131
+ return C_NotImplemented;
69
#define LHZ OPCD( 40)
70
#define LHA OPCD( 42)
71
#define LWZ OPCD( 32)
72
#define LWZUX XO31( 55)
73
-#define STB OPCD( 38)
74
-#define STH OPCD( 44)
75
-#define STW OPCD( 36)
76
-
77
-#define STD XO62( 0)
78
-#define STDU XO62( 1)
79
-#define STDX XO31(149)
80
-
81
#define LD XO58( 0)
82
#define LDX XO31( 21)
83
#define LDU XO58( 1)
84
#define LDUX XO31( 53)
85
#define LWA XO58( 2)
86
#define LWAX XO31(341)
87
+#define LQ OPCD( 56)
88
+
89
+#define STB OPCD( 38)
90
+#define STH OPCD( 44)
91
+#define STW OPCD( 36)
92
+#define STD XO62( 0)
93
+#define STDU XO62( 1)
94
+#define STDX XO31(149)
95
+#define STQ XO62( 2)
96
97
#define ADDIC OPCD( 12)
98
#define ADDI OPCD( 14)
99
@@ -XXX,XX +XXX,XX @@ typedef struct {
100
101
bool tcg_target_has_memory_bswap(MemOp memop)
102
{
103
- return true;
104
+ TCGAtomAlign aa;
105
+
106
+ if ((memop & MO_SIZE) <= MO_64) {
107
+ return true;
108
+ }
109
+
110
+ /*
111
+ * Reject 16-byte memop with 16-byte atomicity,
112
+ * but do allow a pair of 64-bit operations.
113
+ */
114
+ aa = atom_and_align_for_opc(tcg_ctx, memop, MO_ATOM_IFALIGN, true);
115
+ return aa.atom <= MO_64;
116
}
117
118
/*
119
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
120
{
121
TCGLabelQemuLdst *ldst = NULL;
122
MemOp opc = get_memop(oi);
123
- MemOp a_bits;
124
+ MemOp a_bits, s_bits;
125
126
/*
127
* Book II, Section 1.4, Single-Copy Atomicity, specifies:
128
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
129
* As of 3.0, "the non-atomic access is performed as described in
130
* the corresponding list", which matches MO_ATOM_SUBALIGN.
131
*/
132
+ s_bits = opc & MO_SIZE;
133
h->aa = atom_and_align_for_opc(s, opc,
134
have_isa_3_00 ? MO_ATOM_SUBALIGN
135
: MO_ATOM_IFALIGN,
136
- false);
137
+ s_bits == MO_128);
138
a_bits = h->aa.align;
139
140
#ifdef CONFIG_SOFTMMU
141
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
142
int fast_off = TLB_MASK_TABLE_OFS(mem_index);
143
int mask_off = fast_off + offsetof(CPUTLBDescFast, mask);
144
int table_off = fast_off + offsetof(CPUTLBDescFast, table);
145
- unsigned s_bits = opc & MO_SIZE;
146
147
ldst = new_ldst_label(s);
148
ldst->is_ld = is_ld;
149
@@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_st(TCGContext *s, TCGReg datalo, TCGReg datahi,
150
}
132
}
151
}
133
}
152
134
153
+static void tcg_out_qemu_ldst_i128(TCGContext *s, TCGReg datalo, TCGReg datahi,
135
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
154
+ TCGReg addr_reg, MemOpIdx oi, bool is_ld)
136
index XXXXXXX..XXXXXXX 100644
155
+{
137
--- a/tcg/riscv/tcg-target.c.inc
156
+ TCGLabelQemuLdst *ldst;
138
+++ b/tcg/riscv/tcg-target.c.inc
157
+ HostAddress h;
158
+ bool need_bswap;
159
+ uint32_t insn;
160
+ TCGReg index;
161
+
162
+ ldst = prepare_host_addr(s, &h, addr_reg, -1, oi, is_ld);
163
+
164
+ /* Compose the final address, as LQ/STQ have no indexing. */
165
+ index = h.index;
166
+ if (h.base != 0) {
167
+ index = TCG_REG_TMP1;
168
+ tcg_out32(s, ADD | TAB(index, h.base, h.index));
169
+ }
170
+ need_bswap = get_memop(oi) & MO_BSWAP;
171
+
172
+ if (h.aa.atom == MO_128) {
173
+ tcg_debug_assert(!need_bswap);
174
+ tcg_debug_assert(datalo & 1);
175
+ tcg_debug_assert(datahi == datalo - 1);
176
+ insn = is_ld ? LQ : STQ;
177
+ tcg_out32(s, insn | TAI(datahi, index, 0));
178
+ } else {
179
+ TCGReg d1, d2;
180
+
181
+ if (HOST_BIG_ENDIAN ^ need_bswap) {
182
+ d1 = datahi, d2 = datalo;
183
+ } else {
184
+ d1 = datalo, d2 = datahi;
185
+ }
186
+
187
+ if (need_bswap) {
188
+ tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_R0, 8);
189
+ insn = is_ld ? LDBRX : STDBRX;
190
+ tcg_out32(s, insn | TAB(d1, 0, index));
191
+ tcg_out32(s, insn | TAB(d2, index, TCG_REG_R0));
192
+ } else {
193
+ insn = is_ld ? LD : STD;
194
+ tcg_out32(s, insn | TAI(d1, index, 0));
195
+ tcg_out32(s, insn | TAI(d2, index, 8));
196
+ }
197
+ }
198
+
199
+ if (ldst) {
200
+ ldst->type = TCG_TYPE_I128;
201
+ ldst->datalo_reg = datalo;
202
+ ldst->datahi_reg = datahi;
203
+ ldst->raddr = tcg_splitwx_to_rx(s->code_ptr);
204
+ }
205
+}
206
+
207
static void tcg_out_nop_fill(tcg_insn_unit *p, int count)
208
{
209
int i;
210
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
211
args[4], TCG_TYPE_I64);
212
}
213
break;
214
+ case INDEX_op_qemu_ld_a32_i128:
215
+ case INDEX_op_qemu_ld_a64_i128:
216
+ tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
217
+ tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], true);
218
+ break;
219
220
case INDEX_op_qemu_st_a64_i32:
221
if (TCG_TARGET_REG_BITS == 32) {
222
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
223
args[4], TCG_TYPE_I64);
224
}
225
break;
226
+ case INDEX_op_qemu_st_a32_i128:
227
+ case INDEX_op_qemu_st_a64_i128:
228
+ tcg_debug_assert(TCG_TARGET_REG_BITS == 64);
229
+ tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], false);
230
+ break;
231
232
case INDEX_op_setcond_i32:
233
tcg_out_setcond(s, TCG_TYPE_I32, args[3], args[0], args[1], args[2],
234
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
139
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
235
case INDEX_op_qemu_st_a64_i64:
140
case INDEX_op_cmpsel_vec:
141
return C_O1_I4(v, v, vL, vK, vK);
142
default:
143
- g_assert_not_reached();
144
+ return C_NotImplemented;
145
}
146
}
147
148
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
149
index XXXXXXX..XXXXXXX 100644
150
--- a/tcg/s390x/tcg-target.c.inc
151
+++ b/tcg/s390x/tcg-target.c.inc
152
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
153
: C_O1_I4(v, v, v, vZ, v));
154
155
default:
156
- g_assert_not_reached();
157
+ return C_NotImplemented;
158
}
159
}
160
161
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
162
index XXXXXXX..XXXXXXX 100644
163
--- a/tcg/sparc64/tcg-target.c.inc
164
+++ b/tcg/sparc64/tcg-target.c.inc
165
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
166
return C_O1_I2(r, r, r);
167
168
default:
169
- g_assert_not_reached();
170
+ return C_NotImplemented;
171
}
172
}
173
174
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
175
index XXXXXXX..XXXXXXX 100644
176
--- a/tcg/tci/tcg-target.c.inc
177
+++ b/tcg/tci/tcg-target.c.inc
178
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
236
return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I4(r, r, r, r);
179
return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I4(r, r, r, r);
237
180
238
+ case INDEX_op_qemu_ld_a32_i128:
181
default:
239
+ case INDEX_op_qemu_ld_a64_i128:
182
- g_assert_not_reached();
240
+ return C_O2_I1(o, m, r);
183
+ return C_NotImplemented;
241
+ case INDEX_op_qemu_st_a32_i128:
184
}
242
+ case INDEX_op_qemu_st_a64_i128:
185
}
243
+ return C_O0_I3(o, m, r);
186
244
+
245
case INDEX_op_add_vec:
246
case INDEX_op_sub_vec:
247
case INDEX_op_mul_vec:
248
--
187
--
249
2.34.1
188
2.43.0
189
190
diff view generated by jsdifflib
New patch
1
Test each vector type, not just lumping them all together.
2
Add tests for I32 (always true) and I64 (64-bit hosts).
1
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/tcg.c | 66 ++++++++++++++++++++++++++++++++++++-------------------
8
1 file changed, 43 insertions(+), 23 deletions(-)
9
10
diff --git a/tcg/tcg.c b/tcg/tcg.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/tcg.c
13
+++ b/tcg/tcg.c
14
@@ -XXX,XX +XXX,XX @@ TCGTemp *tcgv_i32_temp(TCGv_i32 v)
15
*/
16
bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
17
{
18
- const bool have_vec
19
- = TCG_TARGET_HAS_v64 | TCG_TARGET_HAS_v128 | TCG_TARGET_HAS_v256;
20
+ bool has_type;
21
+
22
+ switch (type) {
23
+ case TCG_TYPE_I32:
24
+ has_type = true;
25
+ break;
26
+ case TCG_TYPE_I64:
27
+ has_type = TCG_TARGET_REG_BITS == 64;
28
+ break;
29
+ case TCG_TYPE_V64:
30
+ has_type = TCG_TARGET_HAS_v64;
31
+ break;
32
+ case TCG_TYPE_V128:
33
+ has_type = TCG_TARGET_HAS_v128;
34
+ break;
35
+ case TCG_TYPE_V256:
36
+ has_type = TCG_TARGET_HAS_v256;
37
+ break;
38
+ default:
39
+ has_type = false;
40
+ break;
41
+ }
42
43
switch (op) {
44
case INDEX_op_discard:
45
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
46
case INDEX_op_or_vec:
47
case INDEX_op_xor_vec:
48
case INDEX_op_cmp_vec:
49
- return have_vec;
50
+ return has_type;
51
case INDEX_op_dup2_vec:
52
- return have_vec && TCG_TARGET_REG_BITS == 32;
53
+ return has_type && TCG_TARGET_REG_BITS == 32;
54
case INDEX_op_not_vec:
55
- return have_vec && TCG_TARGET_HAS_not_vec;
56
+ return has_type && TCG_TARGET_HAS_not_vec;
57
case INDEX_op_neg_vec:
58
- return have_vec && TCG_TARGET_HAS_neg_vec;
59
+ return has_type && TCG_TARGET_HAS_neg_vec;
60
case INDEX_op_abs_vec:
61
- return have_vec && TCG_TARGET_HAS_abs_vec;
62
+ return has_type && TCG_TARGET_HAS_abs_vec;
63
case INDEX_op_andc_vec:
64
- return have_vec && TCG_TARGET_HAS_andc_vec;
65
+ return has_type && TCG_TARGET_HAS_andc_vec;
66
case INDEX_op_orc_vec:
67
- return have_vec && TCG_TARGET_HAS_orc_vec;
68
+ return has_type && TCG_TARGET_HAS_orc_vec;
69
case INDEX_op_nand_vec:
70
- return have_vec && TCG_TARGET_HAS_nand_vec;
71
+ return has_type && TCG_TARGET_HAS_nand_vec;
72
case INDEX_op_nor_vec:
73
- return have_vec && TCG_TARGET_HAS_nor_vec;
74
+ return has_type && TCG_TARGET_HAS_nor_vec;
75
case INDEX_op_eqv_vec:
76
- return have_vec && TCG_TARGET_HAS_eqv_vec;
77
+ return has_type && TCG_TARGET_HAS_eqv_vec;
78
case INDEX_op_mul_vec:
79
- return have_vec && TCG_TARGET_HAS_mul_vec;
80
+ return has_type && TCG_TARGET_HAS_mul_vec;
81
case INDEX_op_shli_vec:
82
case INDEX_op_shri_vec:
83
case INDEX_op_sari_vec:
84
- return have_vec && TCG_TARGET_HAS_shi_vec;
85
+ return has_type && TCG_TARGET_HAS_shi_vec;
86
case INDEX_op_shls_vec:
87
case INDEX_op_shrs_vec:
88
case INDEX_op_sars_vec:
89
- return have_vec && TCG_TARGET_HAS_shs_vec;
90
+ return has_type && TCG_TARGET_HAS_shs_vec;
91
case INDEX_op_shlv_vec:
92
case INDEX_op_shrv_vec:
93
case INDEX_op_sarv_vec:
94
- return have_vec && TCG_TARGET_HAS_shv_vec;
95
+ return has_type && TCG_TARGET_HAS_shv_vec;
96
case INDEX_op_rotli_vec:
97
- return have_vec && TCG_TARGET_HAS_roti_vec;
98
+ return has_type && TCG_TARGET_HAS_roti_vec;
99
case INDEX_op_rotls_vec:
100
- return have_vec && TCG_TARGET_HAS_rots_vec;
101
+ return has_type && TCG_TARGET_HAS_rots_vec;
102
case INDEX_op_rotlv_vec:
103
case INDEX_op_rotrv_vec:
104
- return have_vec && TCG_TARGET_HAS_rotv_vec;
105
+ return has_type && TCG_TARGET_HAS_rotv_vec;
106
case INDEX_op_ssadd_vec:
107
case INDEX_op_usadd_vec:
108
case INDEX_op_sssub_vec:
109
case INDEX_op_ussub_vec:
110
- return have_vec && TCG_TARGET_HAS_sat_vec;
111
+ return has_type && TCG_TARGET_HAS_sat_vec;
112
case INDEX_op_smin_vec:
113
case INDEX_op_umin_vec:
114
case INDEX_op_smax_vec:
115
case INDEX_op_umax_vec:
116
- return have_vec && TCG_TARGET_HAS_minmax_vec;
117
+ return has_type && TCG_TARGET_HAS_minmax_vec;
118
case INDEX_op_bitsel_vec:
119
- return have_vec && TCG_TARGET_HAS_bitsel_vec;
120
+ return has_type && TCG_TARGET_HAS_bitsel_vec;
121
case INDEX_op_cmpsel_vec:
122
- return have_vec && TCG_TARGET_HAS_cmpsel_vec;
123
+ return has_type && TCG_TARGET_HAS_cmpsel_vec;
124
125
default:
126
tcg_debug_assert(op > INDEX_op_last_generic && op < NB_OPS);
127
--
128
2.43.0
129
130
diff view generated by jsdifflib
1
Nor report any PermissionError on remove.
1
Process each TCGConstraintSetIndex first. Allocate TCGArgConstraint
2
The primary purpose is testing with -o /dev/null.
2
arrays based on those. Only afterward process the TCGOpcodes and
3
share those TCGArgConstraint arrays.
3
4
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
7
---
6
scripts/decodetree.py | 7 ++++++-
8
include/tcg/tcg.h | 7 +-
7
1 file changed, 6 insertions(+), 1 deletion(-)
9
tcg/tcg.c | 272 +++++++++++++++++++++++-----------------------
10
2 files changed, 136 insertions(+), 143 deletions(-)
8
11
9
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
12
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
10
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
11
--- a/scripts/decodetree.py
14
--- a/include/tcg/tcg.h
12
+++ b/scripts/decodetree.py
15
+++ b/include/tcg/tcg.h
13
@@ -XXX,XX +XXX,XX @@ def error_with_file(file, lineno, *args):
16
@@ -XXX,XX +XXX,XX @@ typedef struct TCGOpDef {
14
17
const char *name;
15
if output_file and output_fd:
18
uint8_t nb_oargs, nb_iargs, nb_cargs, nb_args;
16
output_fd.close()
19
uint8_t flags;
17
- os.remove(output_file)
20
- TCGArgConstraint *args_ct;
18
+ # Do not try to remove e.g. -o /dev/null
21
+ const TCGArgConstraint *args_ct;
19
+ if not output_file.startswith("/dev"):
22
} TCGOpDef;
20
+ try:
23
21
+ os.remove(output_file)
24
extern TCGOpDef tcg_op_defs[];
22
+ except PermissionError:
25
extern const size_t tcg_op_defs_max;
23
+ pass
26
24
exit(0 if testforerror else 1)
27
-typedef struct TCGTargetOpDef {
25
# end error_with_file
28
- TCGOpcode op;
29
- const char *args_ct_str[TCG_MAX_OP_ARGS];
30
-} TCGTargetOpDef;
31
-
32
/*
33
* tcg_op_supported:
34
* Query if @op, for @type and @flags, is supported by the host
35
diff --git a/tcg/tcg.c b/tcg/tcg.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/tcg/tcg.c
38
+++ b/tcg/tcg.c
39
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode);
40
41
/* Put all of the constraint sets into an array, indexed by the enum. */
42
43
-#define C_O0_I1(I1) { .args_ct_str = { #I1 } },
44
-#define C_O0_I2(I1, I2) { .args_ct_str = { #I1, #I2 } },
45
-#define C_O0_I3(I1, I2, I3) { .args_ct_str = { #I1, #I2, #I3 } },
46
-#define C_O0_I4(I1, I2, I3, I4) { .args_ct_str = { #I1, #I2, #I3, #I4 } },
47
+typedef struct TCGConstraintSet {
48
+ uint8_t nb_oargs, nb_iargs;
49
+ const char *args_ct_str[TCG_MAX_OP_ARGS];
50
+} TCGConstraintSet;
51
52
-#define C_O1_I1(O1, I1) { .args_ct_str = { #O1, #I1 } },
53
-#define C_O1_I2(O1, I1, I2) { .args_ct_str = { #O1, #I1, #I2 } },
54
-#define C_O1_I3(O1, I1, I2, I3) { .args_ct_str = { #O1, #I1, #I2, #I3 } },
55
-#define C_O1_I4(O1, I1, I2, I3, I4) { .args_ct_str = { #O1, #I1, #I2, #I3, #I4 } },
56
+#define C_O0_I1(I1) { 0, 1, { #I1 } },
57
+#define C_O0_I2(I1, I2) { 0, 2, { #I1, #I2 } },
58
+#define C_O0_I3(I1, I2, I3) { 0, 3, { #I1, #I2, #I3 } },
59
+#define C_O0_I4(I1, I2, I3, I4) { 0, 4, { #I1, #I2, #I3, #I4 } },
60
61
-#define C_N1_I2(O1, I1, I2) { .args_ct_str = { "&" #O1, #I1, #I2 } },
62
-#define C_N1O1_I1(O1, O2, I1) { .args_ct_str = { "&" #O1, #O2, #I1 } },
63
-#define C_N2_I1(O1, O2, I1) { .args_ct_str = { "&" #O1, "&" #O2, #I1 } },
64
+#define C_O1_I1(O1, I1) { 1, 1, { #O1, #I1 } },
65
+#define C_O1_I2(O1, I1, I2) { 1, 2, { #O1, #I1, #I2 } },
66
+#define C_O1_I3(O1, I1, I2, I3) { 1, 3, { #O1, #I1, #I2, #I3 } },
67
+#define C_O1_I4(O1, I1, I2, I3, I4) { 1, 4, { #O1, #I1, #I2, #I3, #I4 } },
68
69
-#define C_O2_I1(O1, O2, I1) { .args_ct_str = { #O1, #O2, #I1 } },
70
-#define C_O2_I2(O1, O2, I1, I2) { .args_ct_str = { #O1, #O2, #I1, #I2 } },
71
-#define C_O2_I3(O1, O2, I1, I2, I3) { .args_ct_str = { #O1, #O2, #I1, #I2, #I3 } },
72
-#define C_O2_I4(O1, O2, I1, I2, I3, I4) { .args_ct_str = { #O1, #O2, #I1, #I2, #I3, #I4 } },
73
-#define C_N1_O1_I4(O1, O2, I1, I2, I3, I4) { .args_ct_str = { "&" #O1, #O2, #I1, #I2, #I3, #I4 } },
74
+#define C_N1_I2(O1, I1, I2) { 1, 2, { "&" #O1, #I1, #I2 } },
75
+#define C_N1O1_I1(O1, O2, I1) { 2, 1, { "&" #O1, #O2, #I1 } },
76
+#define C_N2_I1(O1, O2, I1) { 2, 1, { "&" #O1, "&" #O2, #I1 } },
77
78
-static const TCGTargetOpDef constraint_sets[] = {
79
+#define C_O2_I1(O1, O2, I1) { 2, 1, { #O1, #O2, #I1 } },
80
+#define C_O2_I2(O1, O2, I1, I2) { 2, 2, { #O1, #O2, #I1, #I2 } },
81
+#define C_O2_I3(O1, O2, I1, I2, I3) { 2, 3, { #O1, #O2, #I1, #I2, #I3 } },
82
+#define C_O2_I4(O1, O2, I1, I2, I3, I4) { 2, 4, { #O1, #O2, #I1, #I2, #I3, #I4 } },
83
+#define C_N1_O1_I4(O1, O2, I1, I2, I3, I4) { 2, 4, { "&" #O1, #O2, #I1, #I2, #I3, #I4 } },
84
+
85
+static const TCGConstraintSet constraint_sets[] = {
86
#include "tcg-target-con-set.h"
87
};
88
89
-
90
#undef C_O0_I1
91
#undef C_O0_I2
92
#undef C_O0_I3
93
@@ -XXX,XX +XXX,XX @@ static TCGTemp *tcg_global_reg_new_internal(TCGContext *s, TCGType type,
94
static void tcg_context_init(unsigned max_cpus)
95
{
96
TCGContext *s = &tcg_init_ctx;
97
- int op, total_args, n, i;
98
- TCGOpDef *def;
99
- TCGArgConstraint *args_ct;
100
+ int n, i;
101
TCGTemp *ts;
102
103
memset(s, 0, sizeof(*s));
104
s->nb_globals = 0;
105
106
- /* Count total number of arguments and allocate the corresponding
107
- space */
108
- total_args = 0;
109
- for(op = 0; op < NB_OPS; op++) {
110
- def = &tcg_op_defs[op];
111
- n = def->nb_iargs + def->nb_oargs;
112
- total_args += n;
113
- }
114
-
115
- args_ct = g_new0(TCGArgConstraint, total_args);
116
-
117
- for(op = 0; op < NB_OPS; op++) {
118
- def = &tcg_op_defs[op];
119
- def->args_ct = args_ct;
120
- n = def->nb_iargs + def->nb_oargs;
121
- args_ct += n;
122
- }
123
-
124
init_call_layout(&info_helper_ld32_mmu);
125
init_call_layout(&info_helper_ld64_mmu);
126
init_call_layout(&info_helper_ld128_mmu);
127
@@ -XXX,XX +XXX,XX @@ void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
128
}
129
130
/* we give more priority to constraints with less registers */
131
-static int get_constraint_priority(const TCGOpDef *def, int k)
132
+static int get_constraint_priority(const TCGArgConstraint *arg_ct, int k)
133
{
134
- const TCGArgConstraint *arg_ct = &def->args_ct[k];
135
- int n = ctpop64(arg_ct->regs);
136
+ int n;
137
+
138
+ arg_ct += k;
139
+ n = ctpop64(arg_ct->regs);
140
141
/*
142
* Sort constraints of a single register first, which includes output
143
@@ -XXX,XX +XXX,XX @@ static int get_constraint_priority(const TCGOpDef *def, int k)
144
}
145
146
/* sort from highest priority to lowest */
147
-static void sort_constraints(TCGOpDef *def, int start, int n)
148
+static void sort_constraints(TCGArgConstraint *a, int start, int n)
149
{
150
int i, j;
151
- TCGArgConstraint *a = def->args_ct;
152
153
for (i = 0; i < n; i++) {
154
a[start + i].sort_index = start + i;
155
@@ -XXX,XX +XXX,XX @@ static void sort_constraints(TCGOpDef *def, int start, int n)
156
}
157
for (i = 0; i < n - 1; i++) {
158
for (j = i + 1; j < n; j++) {
159
- int p1 = get_constraint_priority(def, a[start + i].sort_index);
160
- int p2 = get_constraint_priority(def, a[start + j].sort_index);
161
+ int p1 = get_constraint_priority(a, a[start + i].sort_index);
162
+ int p2 = get_constraint_priority(a, a[start + j].sort_index);
163
if (p1 < p2) {
164
int tmp = a[start + i].sort_index;
165
a[start + i].sort_index = a[start + j].sort_index;
166
@@ -XXX,XX +XXX,XX @@ static void sort_constraints(TCGOpDef *def, int start, int n)
167
}
168
}
169
170
+static const TCGArgConstraint empty_cts[TCG_MAX_OP_ARGS];
171
+static TCGArgConstraint all_cts[ARRAY_SIZE(constraint_sets)][TCG_MAX_OP_ARGS];
172
+
173
static void process_op_defs(TCGContext *s)
174
{
175
- TCGOpcode op;
176
-
177
- for (op = 0; op < NB_OPS; op++) {
178
- TCGOpDef *def = &tcg_op_defs[op];
179
- const TCGTargetOpDef *tdefs;
180
+ for (size_t c = 0; c < ARRAY_SIZE(constraint_sets); ++c) {
181
+ const TCGConstraintSet *tdefs = &constraint_sets[c];
182
+ TCGArgConstraint *args_ct = all_cts[c];
183
+ int nb_oargs = tdefs->nb_oargs;
184
+ int nb_iargs = tdefs->nb_iargs;
185
+ int nb_args = nb_oargs + nb_iargs;
186
bool saw_alias_pair = false;
187
- int i, o, i2, o2, nb_args;
188
- TCGConstraintSetIndex con_set;
189
190
- if (def->flags & TCG_OPF_NOT_PRESENT) {
191
- continue;
192
- }
193
-
194
- nb_args = def->nb_iargs + def->nb_oargs;
195
- if (nb_args == 0) {
196
- continue;
197
- }
198
-
199
- /*
200
- * Macro magic should make it impossible, but double-check that
201
- * the array index is in range. At the same time, double-check
202
- * that the opcode is implemented, i.e. not C_NotImplemented.
203
- */
204
- con_set = tcg_target_op_def(op);
205
- tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
206
- tdefs = &constraint_sets[con_set];
207
-
208
- for (i = 0; i < nb_args; i++) {
209
+ for (int i = 0; i < nb_args; i++) {
210
const char *ct_str = tdefs->args_ct_str[i];
211
- bool input_p = i >= def->nb_oargs;
212
-
213
- /* Incomplete TCGTargetOpDef entry. */
214
- tcg_debug_assert(ct_str != NULL);
215
+ bool input_p = i >= nb_oargs;
216
+ int o;
217
218
switch (*ct_str) {
219
case '0' ... '9':
220
o = *ct_str - '0';
221
tcg_debug_assert(input_p);
222
- tcg_debug_assert(o < def->nb_oargs);
223
- tcg_debug_assert(def->args_ct[o].regs != 0);
224
- tcg_debug_assert(!def->args_ct[o].oalias);
225
- def->args_ct[i] = def->args_ct[o];
226
+ tcg_debug_assert(o < nb_oargs);
227
+ tcg_debug_assert(args_ct[o].regs != 0);
228
+ tcg_debug_assert(!args_ct[o].oalias);
229
+ args_ct[i] = args_ct[o];
230
/* The output sets oalias. */
231
- def->args_ct[o].oalias = 1;
232
- def->args_ct[o].alias_index = i;
233
+ args_ct[o].oalias = 1;
234
+ args_ct[o].alias_index = i;
235
/* The input sets ialias. */
236
- def->args_ct[i].ialias = 1;
237
- def->args_ct[i].alias_index = o;
238
- if (def->args_ct[i].pair) {
239
+ args_ct[i].ialias = 1;
240
+ args_ct[i].alias_index = o;
241
+ if (args_ct[i].pair) {
242
saw_alias_pair = true;
243
}
244
tcg_debug_assert(ct_str[1] == '\0');
245
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
246
247
case '&':
248
tcg_debug_assert(!input_p);
249
- def->args_ct[i].newreg = true;
250
+ args_ct[i].newreg = true;
251
ct_str++;
252
break;
253
254
case 'p': /* plus */
255
/* Allocate to the register after the previous. */
256
- tcg_debug_assert(i > (input_p ? def->nb_oargs : 0));
257
+ tcg_debug_assert(i > (input_p ? nb_oargs : 0));
258
o = i - 1;
259
- tcg_debug_assert(!def->args_ct[o].pair);
260
- tcg_debug_assert(!def->args_ct[o].ct);
261
- def->args_ct[i] = (TCGArgConstraint){
262
+ tcg_debug_assert(!args_ct[o].pair);
263
+ tcg_debug_assert(!args_ct[o].ct);
264
+ args_ct[i] = (TCGArgConstraint){
265
.pair = 2,
266
.pair_index = o,
267
- .regs = def->args_ct[o].regs << 1,
268
- .newreg = def->args_ct[o].newreg,
269
+ .regs = args_ct[o].regs << 1,
270
+ .newreg = args_ct[o].newreg,
271
};
272
- def->args_ct[o].pair = 1;
273
- def->args_ct[o].pair_index = i;
274
+ args_ct[o].pair = 1;
275
+ args_ct[o].pair_index = i;
276
tcg_debug_assert(ct_str[1] == '\0');
277
continue;
278
279
case 'm': /* minus */
280
/* Allocate to the register before the previous. */
281
- tcg_debug_assert(i > (input_p ? def->nb_oargs : 0));
282
+ tcg_debug_assert(i > (input_p ? nb_oargs : 0));
283
o = i - 1;
284
- tcg_debug_assert(!def->args_ct[o].pair);
285
- tcg_debug_assert(!def->args_ct[o].ct);
286
- def->args_ct[i] = (TCGArgConstraint){
287
+ tcg_debug_assert(!args_ct[o].pair);
288
+ tcg_debug_assert(!args_ct[o].ct);
289
+ args_ct[i] = (TCGArgConstraint){
290
.pair = 1,
291
.pair_index = o,
292
- .regs = def->args_ct[o].regs >> 1,
293
- .newreg = def->args_ct[o].newreg,
294
+ .regs = args_ct[o].regs >> 1,
295
+ .newreg = args_ct[o].newreg,
296
};
297
- def->args_ct[o].pair = 2;
298
- def->args_ct[o].pair_index = i;
299
+ args_ct[o].pair = 2;
300
+ args_ct[o].pair_index = i;
301
tcg_debug_assert(ct_str[1] == '\0');
302
continue;
303
}
304
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
305
do {
306
switch (*ct_str) {
307
case 'i':
308
- def->args_ct[i].ct |= TCG_CT_CONST;
309
+ args_ct[i].ct |= TCG_CT_CONST;
310
break;
311
312
/* Include all of the target-specific constraints. */
313
314
#undef CONST
315
#define CONST(CASE, MASK) \
316
- case CASE: def->args_ct[i].ct |= MASK; break;
317
+ case CASE: args_ct[i].ct |= MASK; break;
318
#define REGS(CASE, MASK) \
319
- case CASE: def->args_ct[i].regs |= MASK; break;
320
+ case CASE: args_ct[i].regs |= MASK; break;
321
322
#include "tcg-target-con-str.h"
323
324
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
325
case '&':
326
case 'p':
327
case 'm':
328
- /* Typo in TCGTargetOpDef constraint. */
329
+ /* Typo in TCGConstraintSet constraint. */
330
g_assert_not_reached();
331
}
332
} while (*++ct_str != '\0');
333
}
334
335
- /* TCGTargetOpDef entry with too much information? */
336
- tcg_debug_assert(i == TCG_MAX_OP_ARGS || tdefs->args_ct_str[i] == NULL);
337
-
338
/*
339
* Fix up output pairs that are aliased with inputs.
340
* When we created the alias, we copied pair from the output.
341
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
342
* first output to pair=3, and the pair_index'es to match.
343
*/
344
if (saw_alias_pair) {
345
- for (i = def->nb_oargs; i < nb_args; i++) {
346
+ for (int i = nb_oargs; i < nb_args; i++) {
347
+ int o, o2, i2;
348
+
349
/*
350
* Since [0-9pm] must be alone in the constraint string,
351
* the only way they can both be set is if the pair comes
352
* from the output alias.
353
*/
354
- if (!def->args_ct[i].ialias) {
355
+ if (!args_ct[i].ialias) {
356
continue;
357
}
358
- switch (def->args_ct[i].pair) {
359
+ switch (args_ct[i].pair) {
360
case 0:
361
break;
362
case 1:
363
- o = def->args_ct[i].alias_index;
364
- o2 = def->args_ct[o].pair_index;
365
- tcg_debug_assert(def->args_ct[o].pair == 1);
366
- tcg_debug_assert(def->args_ct[o2].pair == 2);
367
- if (def->args_ct[o2].oalias) {
368
+ o = args_ct[i].alias_index;
369
+ o2 = args_ct[o].pair_index;
370
+ tcg_debug_assert(args_ct[o].pair == 1);
371
+ tcg_debug_assert(args_ct[o2].pair == 2);
372
+ if (args_ct[o2].oalias) {
373
/* Case 1a */
374
- i2 = def->args_ct[o2].alias_index;
375
- tcg_debug_assert(def->args_ct[i2].pair == 2);
376
- def->args_ct[i2].pair_index = i;
377
- def->args_ct[i].pair_index = i2;
378
+ i2 = args_ct[o2].alias_index;
379
+ tcg_debug_assert(args_ct[i2].pair == 2);
380
+ args_ct[i2].pair_index = i;
381
+ args_ct[i].pair_index = i2;
382
} else {
383
/* Case 1b */
384
- def->args_ct[i].pair_index = i;
385
+ args_ct[i].pair_index = i;
386
}
387
break;
388
case 2:
389
- o = def->args_ct[i].alias_index;
390
- o2 = def->args_ct[o].pair_index;
391
- tcg_debug_assert(def->args_ct[o].pair == 2);
392
- tcg_debug_assert(def->args_ct[o2].pair == 1);
393
- if (def->args_ct[o2].oalias) {
394
+ o = args_ct[i].alias_index;
395
+ o2 = args_ct[o].pair_index;
396
+ tcg_debug_assert(args_ct[o].pair == 2);
397
+ tcg_debug_assert(args_ct[o2].pair == 1);
398
+ if (args_ct[o2].oalias) {
399
/* Case 1a */
400
- i2 = def->args_ct[o2].alias_index;
401
- tcg_debug_assert(def->args_ct[i2].pair == 1);
402
- def->args_ct[i2].pair_index = i;
403
- def->args_ct[i].pair_index = i2;
404
+ i2 = args_ct[o2].alias_index;
405
+ tcg_debug_assert(args_ct[i2].pair == 1);
406
+ args_ct[i2].pair_index = i;
407
+ args_ct[i].pair_index = i2;
408
} else {
409
/* Case 2 */
410
- def->args_ct[i].pair = 3;
411
- def->args_ct[o2].pair = 3;
412
- def->args_ct[i].pair_index = o2;
413
- def->args_ct[o2].pair_index = i;
414
+ args_ct[i].pair = 3;
415
+ args_ct[o2].pair = 3;
416
+ args_ct[i].pair_index = o2;
417
+ args_ct[o2].pair_index = i;
418
}
419
break;
420
default:
421
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
422
}
423
424
/* sort the constraints (XXX: this is just an heuristic) */
425
- sort_constraints(def, 0, def->nb_oargs);
426
- sort_constraints(def, def->nb_oargs, def->nb_iargs);
427
+ sort_constraints(args_ct, 0, nb_oargs);
428
+ sort_constraints(args_ct, nb_oargs, nb_iargs);
429
+ }
430
+
431
+ for (TCGOpcode op = 0; op < NB_OPS; op++) {
432
+ TCGOpDef *def = &tcg_op_defs[op];
433
+ const TCGConstraintSet *tdefs;
434
+ TCGConstraintSetIndex con_set;
435
+ int nb_args;
436
+
437
+ nb_args = def->nb_iargs + def->nb_oargs;
438
+ if (nb_args == 0) {
439
+ continue;
440
+ }
441
+
442
+ if (def->flags & TCG_OPF_NOT_PRESENT) {
443
+ def->args_ct = empty_cts;
444
+ continue;
445
+ }
446
+
447
+ /*
448
+ * Macro magic should make it impossible, but double-check that
449
+ * the array index is in range. At the same time, double-check
450
+ * that the opcode is implemented, i.e. not C_NotImplemented.
451
+ */
452
+ con_set = tcg_target_op_def(op);
453
+ tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
454
+
455
+ /* The constraint arguments must match TCGOpcode arguments. */
456
+ tdefs = &constraint_sets[con_set];
457
+ tcg_debug_assert(tdefs->nb_oargs == def->nb_oargs);
458
+ tcg_debug_assert(tdefs->nb_iargs == def->nb_iargs);
459
+
460
+ def->args_ct = all_cts[con_set];
461
}
462
}
26
463
27
--
464
--
28
2.34.1
465
2.43.0
466
467
diff view generated by jsdifflib
New patch
1
1
Introduce a new function, opcode_args_ct, to look up the argument
2
set for an opcode. We lose the ability to assert the correctness
3
of the map from TCGOpcode to constraint sets at startup, but we can
4
still validate at runtime upon lookup.
5
6
Rename process_op_defs to process_constraint_sets, as it now does
7
nothing to TCGOpDef.
8
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
---
12
include/tcg/tcg.h | 1 -
13
tcg/tcg-common.c | 2 +-
14
tcg/tcg.c | 82 ++++++++++++++++++++++-------------------------
15
3 files changed, 40 insertions(+), 45 deletions(-)
16
17
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/tcg/tcg.h
20
+++ b/include/tcg/tcg.h
21
@@ -XXX,XX +XXX,XX @@ typedef struct TCGOpDef {
22
const char *name;
23
uint8_t nb_oargs, nb_iargs, nb_cargs, nb_args;
24
uint8_t flags;
25
- const TCGArgConstraint *args_ct;
26
} TCGOpDef;
27
28
extern TCGOpDef tcg_op_defs[];
29
diff --git a/tcg/tcg-common.c b/tcg/tcg-common.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/tcg/tcg-common.c
32
+++ b/tcg/tcg-common.c
33
@@ -XXX,XX +XXX,XX @@
34
35
TCGOpDef tcg_op_defs[] = {
36
#define DEF(s, oargs, iargs, cargs, flags) \
37
- { #s, oargs, iargs, cargs, iargs + oargs + cargs, flags, NULL },
38
+ { #s, oargs, iargs, cargs, iargs + oargs + cargs, flags },
39
#include "tcg/tcg-opc.h"
40
#undef DEF
41
};
42
diff --git a/tcg/tcg.c b/tcg/tcg.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/tcg/tcg.c
45
+++ b/tcg/tcg.c
46
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
47
}
48
49
static int indirect_reg_alloc_order[ARRAY_SIZE(tcg_target_reg_alloc_order)];
50
-static void process_op_defs(TCGContext *s);
51
+static void process_constraint_sets(void);
52
static TCGTemp *tcg_global_reg_new_internal(TCGContext *s, TCGType type,
53
TCGReg reg, const char *name);
54
55
@@ -XXX,XX +XXX,XX @@ static void tcg_context_init(unsigned max_cpus)
56
init_call_layout(&info_helper_st128_mmu);
57
58
tcg_target_init(s);
59
- process_op_defs(s);
60
+ process_constraint_sets();
61
62
/* Reverse the order of the saved registers, assuming they're all at
63
the start of tcg_target_reg_alloc_order. */
64
@@ -XXX,XX +XXX,XX @@ static void sort_constraints(TCGArgConstraint *a, int start, int n)
65
static const TCGArgConstraint empty_cts[TCG_MAX_OP_ARGS];
66
static TCGArgConstraint all_cts[ARRAY_SIZE(constraint_sets)][TCG_MAX_OP_ARGS];
67
68
-static void process_op_defs(TCGContext *s)
69
+static void process_constraint_sets(void)
70
{
71
for (size_t c = 0; c < ARRAY_SIZE(constraint_sets); ++c) {
72
const TCGConstraintSet *tdefs = &constraint_sets[c];
73
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
74
sort_constraints(args_ct, 0, nb_oargs);
75
sort_constraints(args_ct, nb_oargs, nb_iargs);
76
}
77
+}
78
79
- for (TCGOpcode op = 0; op < NB_OPS; op++) {
80
- TCGOpDef *def = &tcg_op_defs[op];
81
- const TCGConstraintSet *tdefs;
82
- TCGConstraintSetIndex con_set;
83
- int nb_args;
84
+static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
85
+{
86
+ TCGOpDef *def = &tcg_op_defs[op->opc];
87
+ TCGConstraintSetIndex con_set;
88
89
- nb_args = def->nb_iargs + def->nb_oargs;
90
- if (nb_args == 0) {
91
- continue;
92
- }
93
-
94
- if (def->flags & TCG_OPF_NOT_PRESENT) {
95
- def->args_ct = empty_cts;
96
- continue;
97
- }
98
-
99
- /*
100
- * Macro magic should make it impossible, but double-check that
101
- * the array index is in range. At the same time, double-check
102
- * that the opcode is implemented, i.e. not C_NotImplemented.
103
- */
104
- con_set = tcg_target_op_def(op);
105
- tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
106
-
107
- /* The constraint arguments must match TCGOpcode arguments. */
108
- tdefs = &constraint_sets[con_set];
109
- tcg_debug_assert(tdefs->nb_oargs == def->nb_oargs);
110
- tcg_debug_assert(tdefs->nb_iargs == def->nb_iargs);
111
-
112
- def->args_ct = all_cts[con_set];
113
+ if (def->nb_iargs + def->nb_oargs == 0) {
114
+ return NULL;
115
}
116
+ if (def->flags & TCG_OPF_NOT_PRESENT) {
117
+ return empty_cts;
118
+ }
119
+
120
+ con_set = tcg_target_op_def(op->opc);
121
+ tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
122
+
123
+ /* The constraint arguments must match TCGOpcode arguments. */
124
+ tcg_debug_assert(constraint_sets[con_set].nb_oargs == def->nb_oargs);
125
+ tcg_debug_assert(constraint_sets[con_set].nb_iargs == def->nb_iargs);
126
+
127
+ return all_cts[con_set];
128
}
129
130
static void remove_label_use(TCGOp *op, int idx)
131
@@ -XXX,XX +XXX,XX @@ liveness_pass_1(TCGContext *s)
132
TCGTemp *ts;
133
TCGOpcode opc = op->opc;
134
const TCGOpDef *def = &tcg_op_defs[opc];
135
+ const TCGArgConstraint *args_ct;
136
137
switch (opc) {
138
case INDEX_op_call:
139
@@ -XXX,XX +XXX,XX @@ liveness_pass_1(TCGContext *s)
140
break;
141
142
default:
143
+ args_ct = opcode_args_ct(op);
144
for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
145
- const TCGArgConstraint *ct = &def->args_ct[i];
146
+ const TCGArgConstraint *ct = &args_ct[i];
147
TCGRegSet set, *pset;
148
149
ts = arg_temp(op->args[i]);
150
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
151
{
152
const TCGLifeData arg_life = op->life;
153
TCGRegSet dup_out_regs, dup_in_regs;
154
+ const TCGArgConstraint *dup_args_ct;
155
TCGTemp *its, *ots;
156
TCGType itype, vtype;
157
unsigned vece;
158
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
159
return;
160
}
161
162
- dup_out_regs = tcg_op_defs[INDEX_op_dup_vec].args_ct[0].regs;
163
- dup_in_regs = tcg_op_defs[INDEX_op_dup_vec].args_ct[1].regs;
164
+ dup_args_ct = opcode_args_ct(op);
165
+ dup_out_regs = dup_args_ct[0].regs;
166
+ dup_in_regs = dup_args_ct[1].regs;
167
168
/* Allocate the output register now. */
169
if (ots->val_type != TEMP_VAL_REG) {
170
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
171
int i, k, nb_iargs, nb_oargs;
172
TCGReg reg;
173
TCGArg arg;
174
+ const TCGArgConstraint *args_ct;
175
const TCGArgConstraint *arg_ct;
176
TCGTemp *ts;
177
TCGArg new_args[TCG_MAX_OP_ARGS];
178
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
179
break;
180
}
181
182
+ args_ct = opcode_args_ct(op);
183
+
184
/* satisfy input constraints */
185
for (k = 0; k < nb_iargs; k++) {
186
TCGRegSet i_preferred_regs, i_required_regs;
187
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
188
TCGTemp *ts2;
189
int i1, i2;
190
191
- i = def->args_ct[nb_oargs + k].sort_index;
192
+ i = args_ct[nb_oargs + k].sort_index;
193
arg = op->args[i];
194
- arg_ct = &def->args_ct[i];
195
+ arg_ct = &args_ct[i];
196
ts = arg_temp(arg);
197
198
if (ts->val_type == TEMP_VAL_CONST
199
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
200
* register and move it.
201
*/
202
if (temp_readonly(ts) || !IS_DEAD_ARG(i)
203
- || def->args_ct[arg_ct->alias_index].newreg) {
204
+ || args_ct[arg_ct->alias_index].newreg) {
205
allocate_new_reg = true;
206
} else if (ts->val_type == TEMP_VAL_REG) {
207
/*
208
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
209
}
210
211
/* satisfy the output constraints */
212
- for(k = 0; k < nb_oargs; k++) {
213
- i = def->args_ct[k].sort_index;
214
+ for (k = 0; k < nb_oargs; k++) {
215
+ i = args_ct[k].sort_index;
216
arg = op->args[i];
217
- arg_ct = &def->args_ct[i];
218
+ arg_ct = &args_ct[i];
219
ts = arg_temp(arg);
220
221
/* ENV should not be modified. */
222
@@ -XXX,XX +XXX,XX @@ static bool tcg_reg_alloc_dup2(TCGContext *s, const TCGOp *op)
223
/* Allocate the output register now. */
224
if (ots->val_type != TEMP_VAL_REG) {
225
TCGRegSet allocated_regs = s->reserved_regs;
226
- TCGRegSet dup_out_regs =
227
- tcg_op_defs[INDEX_op_dup_vec].args_ct[0].regs;
228
+ TCGRegSet dup_out_regs = opcode_args_ct(op)[0].regs;
229
TCGReg oreg;
230
231
/* Make sure to not spill the input registers. */
232
--
233
2.43.0
234
235
diff view generated by jsdifflib
New patch
1
Now that we're no longer assigning to TCGOpDef.args_ct,
2
we can make the array constant.
1
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
include/tcg/tcg.h | 2 +-
8
tcg/tcg-common.c | 2 +-
9
tcg/tcg.c | 2 +-
10
3 files changed, 3 insertions(+), 3 deletions(-)
11
12
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
13
index XXXXXXX..XXXXXXX 100644
14
--- a/include/tcg/tcg.h
15
+++ b/include/tcg/tcg.h
16
@@ -XXX,XX +XXX,XX @@ typedef struct TCGOpDef {
17
uint8_t flags;
18
} TCGOpDef;
19
20
-extern TCGOpDef tcg_op_defs[];
21
+extern const TCGOpDef tcg_op_defs[];
22
extern const size_t tcg_op_defs_max;
23
24
/*
25
diff --git a/tcg/tcg-common.c b/tcg/tcg-common.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/tcg/tcg-common.c
28
+++ b/tcg/tcg-common.c
29
@@ -XXX,XX +XXX,XX @@
30
#include "tcg/tcg.h"
31
#include "tcg-has.h"
32
33
-TCGOpDef tcg_op_defs[] = {
34
+const TCGOpDef tcg_op_defs[] = {
35
#define DEF(s, oargs, iargs, cargs, flags) \
36
{ #s, oargs, iargs, cargs, iargs + oargs + cargs, flags },
37
#include "tcg/tcg-opc.h"
38
diff --git a/tcg/tcg.c b/tcg/tcg.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/tcg/tcg.c
41
+++ b/tcg/tcg.c
42
@@ -XXX,XX +XXX,XX @@ static void process_constraint_sets(void)
43
44
static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
45
{
46
- TCGOpDef *def = &tcg_op_defs[op->opc];
47
+ const TCGOpDef *def = &tcg_op_defs[op->opc];
48
TCGConstraintSetIndex con_set;
49
50
if (def->nb_iargs + def->nb_oargs == 0) {
51
--
52
2.43.0
53
54
diff view generated by jsdifflib
1
The first move was incorrectly using TCG_TYPE_I32 while the second
1
We should have checked that the op is supported before
2
move was correctly using TCG_TYPE_REG. This prevents a 64-bit host
2
emitting it. The backend cannot be expected to have a
3
from moving all 128-bits of the return value.
3
constraint set for unsupported ops.
4
4
5
Fixes: ebebea53ef8 ("tcg: Support TCG_TYPE_I128 in tcg_out_{ld,st}_helper_{args,ret}")
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
8
---
7
---
9
tcg/tcg.c | 4 ++--
8
tcg/tcg.c | 4 ++++
10
1 file changed, 2 insertions(+), 2 deletions(-)
9
1 file changed, 4 insertions(+)
11
10
12
diff --git a/tcg/tcg.c b/tcg/tcg.c
11
diff --git a/tcg/tcg.c b/tcg/tcg.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/tcg/tcg.c
13
--- a/tcg/tcg.c
15
+++ b/tcg/tcg.c
14
+++ b/tcg/tcg.c
16
@@ -XXX,XX +XXX,XX @@ static void tcg_out_ld_helper_ret(TCGContext *s, const TCGLabelQemuLdst *ldst,
15
@@ -XXX,XX +XXX,XX @@ static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
17
mov[0].dst = ldst->datalo_reg;
16
const TCGOpDef *def = &tcg_op_defs[op->opc];
18
mov[0].src =
17
TCGConstraintSetIndex con_set;
19
tcg_target_call_oarg_reg(TCG_CALL_RET_NORMAL, HOST_BIG_ENDIAN);
18
20
- mov[0].dst_type = TCG_TYPE_I32;
19
+#ifdef CONFIG_DEBUG_TCG
21
- mov[0].src_type = TCG_TYPE_I32;
20
+ assert(tcg_op_supported(op->opc, TCGOP_TYPE(op), TCGOP_FLAGS(op)));
22
+ mov[0].dst_type = TCG_TYPE_REG;
21
+#endif
23
+ mov[0].src_type = TCG_TYPE_REG;
22
+
24
mov[0].src_ext = TCG_TARGET_REG_BITS == 32 ? MO_32 : MO_64;
23
if (def->nb_iargs + def->nb_oargs == 0) {
25
24
return NULL;
26
mov[1].dst = ldst->datahi_reg;
25
}
27
--
26
--
28
2.34.1
27
2.43.0
28
29
diff view generated by jsdifflib
New patch
1
The br, mb, goto_tb and exit_tb opcodes do not have
2
register operands, only constants, flags, or labels.
3
Remove the special case in opcode_args_ct by including
4
TCG_OPF_NOT_PRESENT in the flags for these opcodes.
1
5
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
9
include/tcg/tcg-opc.h | 8 ++++----
10
tcg/tcg.c | 3 ---
11
2 files changed, 4 insertions(+), 7 deletions(-)
12
13
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/include/tcg/tcg-opc.h
16
+++ b/include/tcg/tcg-opc.h
17
@@ -XXX,XX +XXX,XX @@ DEF(set_label, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
18
/* variable number of parameters */
19
DEF(call, 0, 0, 3, TCG_OPF_CALL_CLOBBER | TCG_OPF_NOT_PRESENT)
20
21
-DEF(br, 0, 0, 1, TCG_OPF_BB_END)
22
+DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
23
24
#define IMPL(X) (__builtin_constant_p(X) && (X) <= 0 ? TCG_OPF_NOT_PRESENT : 0)
25
#if TCG_TARGET_REG_BITS == 32
26
@@ -XXX,XX +XXX,XX @@ DEF(br, 0, 0, 1, TCG_OPF_BB_END)
27
# define IMPL64 TCG_OPF_64BIT
28
#endif
29
30
-DEF(mb, 0, 0, 1, 0)
31
+DEF(mb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
32
33
DEF(mov_i32, 1, 1, 0, TCG_OPF_NOT_PRESENT)
34
DEF(setcond_i32, 1, 2, 1, 0)
35
@@ -XXX,XX +XXX,XX @@ DEF(mulsh_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_mulsh_i64))
36
/* There are tcg_ctx->insn_start_words here, not just one. */
37
DEF(insn_start, 0, 0, DATA64_ARGS, TCG_OPF_NOT_PRESENT)
38
39
-DEF(exit_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
40
-DEF(goto_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
41
+DEF(exit_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
42
+DEF(goto_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
43
DEF(goto_ptr, 0, 1, 0, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
44
45
DEF(plugin_cb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
46
diff --git a/tcg/tcg.c b/tcg/tcg.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/tcg/tcg.c
49
+++ b/tcg/tcg.c
50
@@ -XXX,XX +XXX,XX @@ static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
51
assert(tcg_op_supported(op->opc, TCGOP_TYPE(op), TCGOP_FLAGS(op)));
52
#endif
53
54
- if (def->nb_iargs + def->nb_oargs == 0) {
55
- return NULL;
56
- }
57
if (def->flags & TCG_OPF_NOT_PRESENT) {
58
return empty_cts;
59
}
60
--
61
2.43.0
62
63
diff view generated by jsdifflib
1
We will need to allocate a second general-purpose temporary.
1
Allow the backend to make constraint choices based on more parameters.
2
Rename the existing temps to add a distinguishing number.
3
2
4
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
5
---
7
tcg/aarch64/tcg-target.c.inc | 50 ++++++++++++++++++------------------
6
tcg/tcg.c | 4 ++--
8
1 file changed, 25 insertions(+), 25 deletions(-)
7
tcg/aarch64/tcg-target.c.inc | 3 ++-
8
tcg/arm/tcg-target.c.inc | 3 ++-
9
tcg/i386/tcg-target.c.inc | 3 ++-
10
tcg/loongarch64/tcg-target.c.inc | 3 ++-
11
tcg/mips/tcg-target.c.inc | 3 ++-
12
tcg/ppc/tcg-target.c.inc | 3 ++-
13
tcg/riscv/tcg-target.c.inc | 3 ++-
14
tcg/s390x/tcg-target.c.inc | 3 ++-
15
tcg/sparc64/tcg-target.c.inc | 3 ++-
16
tcg/tci/tcg-target.c.inc | 3 ++-
17
11 files changed, 22 insertions(+), 12 deletions(-)
9
18
19
diff --git a/tcg/tcg.c b/tcg/tcg.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/tcg/tcg.c
22
+++ b/tcg/tcg.c
23
@@ -XXX,XX +XXX,XX @@ typedef enum {
24
#include "tcg-target-con-set.h"
25
} TCGConstraintSetIndex;
26
27
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode);
28
+static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode, TCGType, unsigned);
29
30
#undef C_O0_I1
31
#undef C_O0_I2
32
@@ -XXX,XX +XXX,XX @@ static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
33
return empty_cts;
34
}
35
36
- con_set = tcg_target_op_def(op->opc);
37
+ con_set = tcg_target_op_def(op->opc, TCGOP_TYPE(op), TCGOP_FLAGS(op));
38
tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
39
40
/* The constraint arguments must match TCGOpcode arguments. */
10
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
41
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
11
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/aarch64/tcg-target.c.inc
43
--- a/tcg/aarch64/tcg-target.c.inc
13
+++ b/tcg/aarch64/tcg-target.c.inc
44
+++ b/tcg/aarch64/tcg-target.c.inc
14
@@ -XXX,XX +XXX,XX @@ static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
45
@@ -XXX,XX +XXX,XX @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
15
return TCG_REG_X0 + slot;
16
}
17
18
-#define TCG_REG_TMP TCG_REG_X30
19
-#define TCG_VEC_TMP TCG_REG_V31
20
+#define TCG_REG_TMP0 TCG_REG_X30
21
+#define TCG_VEC_TMP0 TCG_REG_V31
22
23
#ifndef CONFIG_SOFTMMU
24
#define TCG_REG_GUEST_BASE TCG_REG_X28
25
@@ -XXX,XX +XXX,XX @@ static bool tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece,
26
static bool tcg_out_dupm_vec(TCGContext *s, TCGType type, unsigned vece,
27
TCGReg r, TCGReg base, intptr_t offset)
28
{
29
- TCGReg temp = TCG_REG_TMP;
30
+ TCGReg temp = TCG_REG_TMP0;
31
32
if (offset < -0xffffff || offset > 0xffffff) {
33
tcg_out_movi(s, TCG_TYPE_PTR, temp, offset);
34
@@ -XXX,XX +XXX,XX @@ static void tcg_out_ldst(TCGContext *s, AArch64Insn insn, TCGReg rd,
35
}
36
37
/* Worst-case scenario, move offset to temp register, use reg offset. */
38
- tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP, offset);
39
- tcg_out_ldst_r(s, insn, rd, rn, TCG_TYPE_I64, TCG_REG_TMP);
40
+ tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP0, offset);
41
+ tcg_out_ldst_r(s, insn, rd, rn, TCG_TYPE_I64, TCG_REG_TMP0);
42
}
43
44
static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg)
45
@@ -XXX,XX +XXX,XX @@ static void tcg_out_call_int(TCGContext *s, const tcg_insn_unit *target)
46
if (offset == sextract64(offset, 0, 26)) {
47
tcg_out_insn(s, 3206, BL, offset);
48
} else {
49
- tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP, (intptr_t)target);
50
- tcg_out_insn(s, 3207, BLR, TCG_REG_TMP);
51
+ tcg_out_movi(s, TCG_TYPE_I64, TCG_REG_TMP0, (intptr_t)target);
52
+ tcg_out_insn(s, 3207, BLR, TCG_REG_TMP0);
53
}
46
}
54
}
47
}
55
48
56
@@ -XXX,XX +XXX,XX @@ static void tcg_out_addsub2(TCGContext *s, TCGType ext, TCGReg rl,
49
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
57
AArch64Insn insn;
50
+static TCGConstraintSetIndex
58
51
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
59
if (rl == ah || (!const_bh && rl == bh)) {
60
- rl = TCG_REG_TMP;
61
+ rl = TCG_REG_TMP0;
62
}
63
64
if (const_bl) {
65
@@ -XXX,XX +XXX,XX @@ static void tcg_out_addsub2(TCGContext *s, TCGType ext, TCGReg rl,
66
possibility of adding 0+const in the low part, and the
67
immediate add instructions encode XSP not XZR. Don't try
68
anything more elaborate here than loading another zero. */
69
- al = TCG_REG_TMP;
70
+ al = TCG_REG_TMP0;
71
tcg_out_movi(s, ext, al, 0);
72
}
73
tcg_out_insn_3401(s, insn, ext, rl, al, bl);
74
@@ -XXX,XX +XXX,XX @@ static void tcg_out_cltz(TCGContext *s, TCGType ext, TCGReg d,
75
{
52
{
76
TCGReg a1 = a0;
53
switch (op) {
77
if (is_ctz) {
54
case INDEX_op_goto_ptr:
78
- a1 = TCG_REG_TMP;
55
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
79
+ a1 = TCG_REG_TMP0;
56
index XXXXXXX..XXXXXXX 100644
80
tcg_out_insn(s, 3507, RBIT, ext, a1, a0);
57
--- a/tcg/arm/tcg-target.c.inc
81
}
58
+++ b/tcg/arm/tcg-target.c.inc
82
if (const_b && b == (ext ? 64 : 32)) {
59
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
83
@@ -XXX,XX +XXX,XX @@ static void tcg_out_cltz(TCGContext *s, TCGType ext, TCGReg d,
84
AArch64Insn sel = I3506_CSEL;
85
86
tcg_out_cmp(s, ext, a0, 0, 1);
87
- tcg_out_insn(s, 3507, CLZ, ext, TCG_REG_TMP, a1);
88
+ tcg_out_insn(s, 3507, CLZ, ext, TCG_REG_TMP0, a1);
89
90
if (const_b) {
91
if (b == -1) {
92
@@ -XXX,XX +XXX,XX @@ static void tcg_out_cltz(TCGContext *s, TCGType ext, TCGReg d,
93
b = d;
94
}
95
}
96
- tcg_out_insn_3506(s, sel, ext, d, TCG_REG_TMP, b, TCG_COND_NE);
97
+ tcg_out_insn_3506(s, sel, ext, d, TCG_REG_TMP0, b, TCG_COND_NE);
98
}
60
}
99
}
61
}
100
62
101
@@ -XXX,XX +XXX,XX @@ bool tcg_target_has_memory_bswap(MemOp memop)
63
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
64
+static TCGConstraintSetIndex
65
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
66
{
67
switch (op) {
68
case INDEX_op_goto_ptr:
69
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
70
index XXXXXXX..XXXXXXX 100644
71
--- a/tcg/i386/tcg-target.c.inc
72
+++ b/tcg/i386/tcg-target.c.inc
73
@@ -XXX,XX +XXX,XX @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
74
}
102
}
75
}
103
76
104
static const TCGLdstHelperParam ldst_helper_param = {
77
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
105
- .ntmp = 1, .tmp = { TCG_REG_TMP }
78
+static TCGConstraintSetIndex
106
+ .ntmp = 1, .tmp = { TCG_REG_TMP0 }
79
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
107
};
80
{
108
81
switch (op) {
109
static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *lb)
82
case INDEX_op_goto_ptr:
110
@@ -XXX,XX +XXX,XX @@ static void tcg_out_goto_tb(TCGContext *s, int which)
83
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
111
84
index XXXXXXX..XXXXXXX 100644
112
set_jmp_insn_offset(s, which);
85
--- a/tcg/loongarch64/tcg-target.c.inc
113
tcg_out32(s, I3206_B);
86
+++ b/tcg/loongarch64/tcg-target.c.inc
114
- tcg_out_insn(s, 3207, BR, TCG_REG_TMP);
87
@@ -XXX,XX +XXX,XX @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
115
+ tcg_out_insn(s, 3207, BR, TCG_REG_TMP0);
88
g_assert_not_reached();
116
set_jmp_reset_offset(s, which);
117
}
89
}
118
90
119
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
91
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
120
ptrdiff_t i_offset = i_addr - jmp_rx;
92
+static TCGConstraintSetIndex
121
93
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
122
/* Note that we asserted this in range in tcg_out_goto_tb. */
94
{
123
- insn = deposit32(I3305_LDR | TCG_REG_TMP, 5, 19, i_offset >> 2);
95
switch (op) {
124
+ insn = deposit32(I3305_LDR | TCG_REG_TMP0, 5, 19, i_offset >> 2);
96
case INDEX_op_goto_ptr:
97
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
98
index XXXXXXX..XXXXXXX 100644
99
--- a/tcg/mips/tcg-target.c.inc
100
+++ b/tcg/mips/tcg-target.c.inc
101
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
125
}
102
}
126
qatomic_set((uint32_t *)jmp_rw, insn);
103
}
127
flush_idcache_range(jmp_rx, jmp_rw, 4);
104
105
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
106
+static TCGConstraintSetIndex
107
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
108
{
109
switch (op) {
110
case INDEX_op_goto_ptr:
111
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
112
index XXXXXXX..XXXXXXX 100644
113
--- a/tcg/ppc/tcg-target.c.inc
114
+++ b/tcg/ppc/tcg-target.c.inc
115
@@ -XXX,XX +XXX,XX @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
116
va_end(va);
117
}
118
119
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
120
+static TCGConstraintSetIndex
121
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
122
{
123
switch (op) {
124
case INDEX_op_goto_ptr:
125
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
126
index XXXXXXX..XXXXXXX 100644
127
--- a/tcg/riscv/tcg-target.c.inc
128
+++ b/tcg/riscv/tcg-target.c.inc
129
@@ -XXX,XX +XXX,XX @@ int tcg_can_emit_vec_op(TCGOpcode opc, TCGType type, unsigned vece)
130
}
131
}
132
133
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
134
+static TCGConstraintSetIndex
135
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
136
{
137
switch (op) {
138
case INDEX_op_goto_ptr:
139
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
140
index XXXXXXX..XXXXXXX 100644
141
--- a/tcg/s390x/tcg-target.c.inc
142
+++ b/tcg/s390x/tcg-target.c.inc
143
@@ -XXX,XX +XXX,XX @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
144
va_end(va);
145
}
146
147
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
148
+static TCGConstraintSetIndex
149
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
150
{
151
switch (op) {
152
case INDEX_op_goto_ptr:
153
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
154
index XXXXXXX..XXXXXXX 100644
155
--- a/tcg/sparc64/tcg-target.c.inc
156
+++ b/tcg/sparc64/tcg-target.c.inc
128
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
157
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
129
158
}
130
case INDEX_op_rem_i64:
131
case INDEX_op_rem_i32:
132
- tcg_out_insn(s, 3508, SDIV, ext, TCG_REG_TMP, a1, a2);
133
- tcg_out_insn(s, 3509, MSUB, ext, a0, TCG_REG_TMP, a2, a1);
134
+ tcg_out_insn(s, 3508, SDIV, ext, TCG_REG_TMP0, a1, a2);
135
+ tcg_out_insn(s, 3509, MSUB, ext, a0, TCG_REG_TMP0, a2, a1);
136
break;
137
case INDEX_op_remu_i64:
138
case INDEX_op_remu_i32:
139
- tcg_out_insn(s, 3508, UDIV, ext, TCG_REG_TMP, a1, a2);
140
- tcg_out_insn(s, 3509, MSUB, ext, a0, TCG_REG_TMP, a2, a1);
141
+ tcg_out_insn(s, 3508, UDIV, ext, TCG_REG_TMP0, a1, a2);
142
+ tcg_out_insn(s, 3509, MSUB, ext, a0, TCG_REG_TMP0, a2, a1);
143
break;
144
145
case INDEX_op_shl_i64:
146
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
147
if (c2) {
148
tcg_out_rotl(s, ext, a0, a1, a2);
149
} else {
150
- tcg_out_insn(s, 3502, SUB, 0, TCG_REG_TMP, TCG_REG_XZR, a2);
151
- tcg_out_insn(s, 3508, RORV, ext, a0, a1, TCG_REG_TMP);
152
+ tcg_out_insn(s, 3502, SUB, 0, TCG_REG_TMP0, TCG_REG_XZR, a2);
153
+ tcg_out_insn(s, 3508, RORV, ext, a0, a1, TCG_REG_TMP0);
154
}
155
break;
156
157
@@ -XXX,XX +XXX,XX @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
158
break;
159
}
160
}
161
- tcg_out_dupi_vec(s, type, MO_8, TCG_VEC_TMP, 0);
162
- a2 = TCG_VEC_TMP;
163
+ tcg_out_dupi_vec(s, type, MO_8, TCG_VEC_TMP0, 0);
164
+ a2 = TCG_VEC_TMP0;
165
}
166
if (is_scalar) {
167
insn = cmp_scalar_insn[cond];
168
@@ -XXX,XX +XXX,XX @@ static void tcg_target_init(TCGContext *s)
169
s->reserved_regs = 0;
170
tcg_regset_set_reg(s->reserved_regs, TCG_REG_SP);
171
tcg_regset_set_reg(s->reserved_regs, TCG_REG_FP);
172
- tcg_regset_set_reg(s->reserved_regs, TCG_REG_TMP);
173
tcg_regset_set_reg(s->reserved_regs, TCG_REG_X18); /* platform register */
174
- tcg_regset_set_reg(s->reserved_regs, TCG_VEC_TMP);
175
+ tcg_regset_set_reg(s->reserved_regs, TCG_REG_TMP0);
176
+ tcg_regset_set_reg(s->reserved_regs, TCG_VEC_TMP0);
177
}
159
}
178
160
179
/* Saving pairs: (X19, X20) .. (X27, X28), (X29(fp), X30(lr)). */
161
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
162
+static TCGConstraintSetIndex
163
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
164
{
165
switch (op) {
166
case INDEX_op_goto_ptr:
167
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
168
index XXXXXXX..XXXXXXX 100644
169
--- a/tcg/tci/tcg-target.c.inc
170
+++ b/tcg/tci/tcg-target.c.inc
171
@@ -XXX,XX +XXX,XX @@
172
#endif
173
#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
174
175
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
176
+static TCGConstraintSetIndex
177
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
178
{
179
switch (op) {
180
case INDEX_op_goto_ptr:
180
--
181
--
181
2.34.1
182
2.43.0
183
184
diff view generated by jsdifflib
1
Adjust the softmmu tlb to use TMP[0-2], not any of the normally available
1
Pass TCGOp.type to the output function.
2
registers. Since we handle overlap betwen inputs and helper arguments,
2
For aarch64 and tci, use this instead of testing TCG_OPF_64BIT.
3
we can allow any allocatable reg.
3
For s390x, use this instead of testing INDEX_op_deposit_i64.
4
4
For i386, use this to initialize rexw.
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
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
---
8
---
8
tcg/aarch64/tcg-target-con-set.h | 2 --
9
tcg/tcg.c | 4 ++--
9
tcg/aarch64/tcg-target-con-str.h | 1 -
10
tcg/aarch64/tcg-target.c.inc | 6 +-----
10
tcg/aarch64/tcg-target.c.inc | 45 ++++++++++++++------------------
11
tcg/arm/tcg-target.c.inc | 2 +-
11
3 files changed, 19 insertions(+), 29 deletions(-)
12
tcg/i386/tcg-target.c.inc | 10 +++++-----
12
13
tcg/loongarch64/tcg-target.c.inc | 2 +-
13
diff --git a/tcg/aarch64/tcg-target-con-set.h b/tcg/aarch64/tcg-target-con-set.h
14
tcg/mips/tcg-target.c.inc | 2 +-
14
index XXXXXXX..XXXXXXX 100644
15
tcg/ppc/tcg-target.c.inc | 2 +-
15
--- a/tcg/aarch64/tcg-target-con-set.h
16
tcg/riscv/tcg-target.c.inc | 2 +-
16
+++ b/tcg/aarch64/tcg-target-con-set.h
17
tcg/s390x/tcg-target.c.inc | 7 +++----
17
@@ -XXX,XX +XXX,XX @@
18
tcg/sparc64/tcg-target.c.inc | 2 +-
18
* tcg-target-con-str.h; the constraint combination is inclusive or.
19
tcg/tci/tcg-target.c.inc | 4 ++--
19
*/
20
11 files changed, 19 insertions(+), 24 deletions(-)
20
C_O0_I1(r)
21
21
-C_O0_I2(lZ, l)
22
diff --git a/tcg/tcg.c b/tcg/tcg.c
22
C_O0_I2(r, rA)
23
index XXXXXXX..XXXXXXX 100644
23
C_O0_I2(rZ, r)
24
--- a/tcg/tcg.c
24
C_O0_I2(w, r)
25
+++ b/tcg/tcg.c
25
-C_O1_I1(r, l)
26
@@ -XXX,XX +XXX,XX @@ static void tcg_out_addi_ptr(TCGContext *s, TCGReg, TCGReg, tcg_target_long);
26
C_O1_I1(r, r)
27
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2);
27
C_O1_I1(w, r)
28
static void tcg_out_exit_tb(TCGContext *s, uintptr_t arg);
28
C_O1_I1(w, w)
29
static void tcg_out_goto_tb(TCGContext *s, int which);
29
diff --git a/tcg/aarch64/tcg-target-con-str.h b/tcg/aarch64/tcg-target-con-str.h
30
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
30
index XXXXXXX..XXXXXXX 100644
31
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
31
--- a/tcg/aarch64/tcg-target-con-str.h
32
const TCGArg args[TCG_MAX_OP_ARGS],
32
+++ b/tcg/aarch64/tcg-target-con-str.h
33
const int const_args[TCG_MAX_OP_ARGS]);
33
@@ -XXX,XX +XXX,XX @@
34
#if TCG_TARGET_MAYBE_vec
34
* REGS(letter, register_mask)
35
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
35
*/
36
tcg_out_vec_op(s, op->opc, TCGOP_TYPE(op) - TCG_TYPE_V64,
36
REGS('r', ALL_GENERAL_REGS)
37
TCGOP_VECE(op), new_args, const_args);
37
-REGS('l', ALL_QLDST_REGS)
38
} else {
38
REGS('w', ALL_VECTOR_REGS)
39
- tcg_out_op(s, op->opc, new_args, const_args);
39
40
+ tcg_out_op(s, op->opc, TCGOP_TYPE(op), new_args, const_args);
40
/*
41
}
42
break;
43
}
41
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
44
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
42
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
43
--- a/tcg/aarch64/tcg-target.c.inc
46
--- a/tcg/aarch64/tcg-target.c.inc
44
+++ b/tcg/aarch64/tcg-target.c.inc
47
+++ b/tcg/aarch64/tcg-target.c.inc
45
@@ -XXX,XX +XXX,XX @@ static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
48
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
46
#define ALL_GENERAL_REGS 0xffffffffu
49
flush_idcache_range(jmp_rx, jmp_rw, 4);
47
#define ALL_VECTOR_REGS 0xffffffff00000000ull
50
}
48
51
49
-#ifdef CONFIG_SOFTMMU
52
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
50
-#define ALL_QLDST_REGS \
53
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
51
- (ALL_GENERAL_REGS & ~((1 << TCG_REG_X0) | (1 << TCG_REG_X1) | \
54
const TCGArg args[TCG_MAX_OP_ARGS],
52
- (1 << TCG_REG_X2) | (1 << TCG_REG_X3)))
55
const int const_args[TCG_MAX_OP_ARGS])
53
-#else
56
{
54
-#define ALL_QLDST_REGS ALL_GENERAL_REGS
57
- /* 99% of the time, we can signal the use of extension registers
55
-#endif
58
- by looking to see if the opcode handles 64-bit data. */
59
- TCGType ext = (tcg_op_defs[opc].flags & TCG_OPF_64BIT) != 0;
56
-
60
-
57
/* Match a constant valid for addition (12-bit, optionally shifted). */
61
/* Hoist the loads of the most common arguments. */
58
static inline bool is_aimm(uint64_t val)
62
TCGArg a0 = args[0];
59
{
63
TCGArg a1 = args[1];
60
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
64
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
61
unsigned s_bits = opc & MO_SIZE;
65
index XXXXXXX..XXXXXXX 100644
62
unsigned s_mask = (1u << s_bits) - 1;
66
--- a/tcg/arm/tcg-target.c.inc
63
unsigned mem_index = get_mmuidx(oi);
67
+++ b/tcg/arm/tcg-target.c.inc
64
- TCGReg x3;
68
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
65
+ TCGReg addr_adj;
69
flush_idcache_range(jmp_rx, jmp_rw, 4);
66
TCGType mask_type;
70
}
67
uint64_t compare_mask;
71
68
72
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
69
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
73
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
70
mask_type = (s->page_bits + s->tlb_dyn_max_bits > 32
74
const TCGArg args[TCG_MAX_OP_ARGS],
71
? TCG_TYPE_I64 : TCG_TYPE_I32);
75
const int const_args[TCG_MAX_OP_ARGS])
72
76
{
73
- /* Load env_tlb(env)->f[mmu_idx].{mask,table} into {x0,x1}. */
77
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
74
+ /* Load env_tlb(env)->f[mmu_idx].{mask,table} into {tmp0,tmp1}. */
78
index XXXXXXX..XXXXXXX 100644
75
QEMU_BUILD_BUG_ON(TLB_MASK_TABLE_OFS(0) > 0);
79
--- a/tcg/i386/tcg-target.c.inc
76
QEMU_BUILD_BUG_ON(TLB_MASK_TABLE_OFS(0) < -512);
80
+++ b/tcg/i386/tcg-target.c.inc
77
QEMU_BUILD_BUG_ON(offsetof(CPUTLBDescFast, mask) != 0);
81
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
78
QEMU_BUILD_BUG_ON(offsetof(CPUTLBDescFast, table) != 8);
82
/* no need to flush icache explicitly */
79
- tcg_out_insn(s, 3314, LDP, TCG_REG_X0, TCG_REG_X1, TCG_AREG0,
83
}
80
+ tcg_out_insn(s, 3314, LDP, TCG_REG_TMP0, TCG_REG_TMP1, TCG_AREG0,
84
81
TLB_MASK_TABLE_OFS(mem_index), 1, 0);
85
-static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
82
86
- const TCGArg args[TCG_MAX_OP_ARGS],
83
/* Extract the TLB index from the address into X0. */
87
- const int const_args[TCG_MAX_OP_ARGS])
84
tcg_out_insn(s, 3502S, AND_LSR, mask_type == TCG_TYPE_I64,
88
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
85
- TCG_REG_X0, TCG_REG_X0, addr_reg,
89
+ const TCGArg args[TCG_MAX_OP_ARGS],
86
+ TCG_REG_TMP0, TCG_REG_TMP0, addr_reg,
90
+ const int const_args[TCG_MAX_OP_ARGS])
87
s->page_bits - CPU_TLB_ENTRY_BITS);
91
{
88
92
TCGArg a0, a1, a2;
89
- /* Add the tlb_table pointer, creating the CPUTLBEntry address into X1. */
93
- int c, const_a2, vexop, rexw = 0;
90
- tcg_out_insn(s, 3502, ADD, 1, TCG_REG_X1, TCG_REG_X1, TCG_REG_X0);
94
+ int c, const_a2, vexop, rexw;
91
+ /* Add the tlb_table pointer, forming the CPUTLBEntry address in TMP1. */
95
92
+ tcg_out_insn(s, 3502, ADD, 1, TCG_REG_TMP1, TCG_REG_TMP1, TCG_REG_TMP0);
96
#if TCG_TARGET_REG_BITS == 64
93
97
# define OP_32_64(x) \
94
- /* Load the tlb comparator into X0, and the fast path addend into X1. */
98
case glue(glue(INDEX_op_, x), _i64): \
95
- tcg_out_ld(s, addr_type, TCG_REG_X0, TCG_REG_X1,
99
- rexw = P_REXW; /* FALLTHRU */ \
96
+ /* Load the tlb comparator into TMP0, and the fast path addend into TMP1. */
100
case glue(glue(INDEX_op_, x), _i32)
97
+ tcg_out_ld(s, addr_type, TCG_REG_TMP0, TCG_REG_TMP1,
98
is_ld ? offsetof(CPUTLBEntry, addr_read)
99
: offsetof(CPUTLBEntry, addr_write));
100
- tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_X1, TCG_REG_X1,
101
+ tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP1, TCG_REG_TMP1,
102
offsetof(CPUTLBEntry, addend));
103
104
/*
105
@@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h,
106
* cross pages using the address of the last byte of the access.
107
*/
108
if (a_mask >= s_mask) {
109
- x3 = addr_reg;
110
+ addr_adj = addr_reg;
111
} else {
112
+ addr_adj = TCG_REG_TMP2;
113
tcg_out_insn(s, 3401, ADDI, addr_type,
114
- TCG_REG_X3, addr_reg, s_mask - a_mask);
115
- x3 = TCG_REG_X3;
116
+ addr_adj, addr_reg, s_mask - a_mask);
117
}
118
compare_mask = (uint64_t)s->page_mask | a_mask;
119
120
- /* Store the page mask part of the address into X3. */
121
- tcg_out_logicali(s, I3404_ANDI, addr_type, TCG_REG_X3, x3, compare_mask);
122
+ /* Store the page mask part of the address into TMP2. */
123
+ tcg_out_logicali(s, I3404_ANDI, addr_type, TCG_REG_TMP2,
124
+ addr_adj, compare_mask);
125
126
/* Perform the address comparison. */
127
- tcg_out_cmp(s, addr_type, TCG_REG_X0, TCG_REG_X3, 0);
128
+ tcg_out_cmp(s, addr_type, TCG_REG_TMP0, TCG_REG_TMP2, 0);
129
130
/* If not equal, we jump to the slow path. */
131
ldst->label_ptr[0] = s->code_ptr;
132
tcg_out_insn(s, 3202, B_C, TCG_COND_NE, 0);
133
134
- h->base = TCG_REG_X1,
135
+ h->base = TCG_REG_TMP1;
136
h->index = addr_reg;
137
h->index_ext = addr_type;
138
#else
101
#else
139
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
102
# define OP_32_64(x) \
140
case INDEX_op_qemu_ld_a64_i32:
103
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
141
case INDEX_op_qemu_ld_a32_i64:
104
a1 = args[1];
142
case INDEX_op_qemu_ld_a64_i64:
105
a2 = args[2];
143
- return C_O1_I1(r, l);
106
const_a2 = const_args[2];
144
+ return C_O1_I1(r, r);
107
+ rexw = type == TCG_TYPE_I32 ? 0 : P_REXW;
145
case INDEX_op_qemu_st_a32_i32:
108
146
case INDEX_op_qemu_st_a64_i32:
109
switch (opc) {
147
case INDEX_op_qemu_st_a32_i64:
110
case INDEX_op_goto_ptr:
148
case INDEX_op_qemu_st_a64_i64:
111
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
149
- return C_O0_I2(lZ, l);
112
index XXXXXXX..XXXXXXX 100644
150
+ return C_O0_I2(rZ, r);
113
--- a/tcg/loongarch64/tcg-target.c.inc
151
114
+++ b/tcg/loongarch64/tcg-target.c.inc
152
case INDEX_op_deposit_i32:
115
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
153
case INDEX_op_deposit_i64:
116
flush_idcache_range(jmp_rx, jmp_rw, 4);
117
}
118
119
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
120
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
121
const TCGArg args[TCG_MAX_OP_ARGS],
122
const int const_args[TCG_MAX_OP_ARGS])
123
{
124
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
125
index XXXXXXX..XXXXXXX 100644
126
--- a/tcg/mips/tcg-target.c.inc
127
+++ b/tcg/mips/tcg-target.c.inc
128
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
129
/* Always indirect, nothing to do */
130
}
131
132
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
133
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
134
const TCGArg args[TCG_MAX_OP_ARGS],
135
const int const_args[TCG_MAX_OP_ARGS])
136
{
137
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
138
index XXXXXXX..XXXXXXX 100644
139
--- a/tcg/ppc/tcg-target.c.inc
140
+++ b/tcg/ppc/tcg-target.c.inc
141
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
142
flush_idcache_range(jmp_rx, jmp_rw, 4);
143
}
144
145
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
146
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
147
const TCGArg args[TCG_MAX_OP_ARGS],
148
const int const_args[TCG_MAX_OP_ARGS])
149
{
150
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
151
index XXXXXXX..XXXXXXX 100644
152
--- a/tcg/riscv/tcg-target.c.inc
153
+++ b/tcg/riscv/tcg-target.c.inc
154
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
155
flush_idcache_range(jmp_rx, jmp_rw, 4);
156
}
157
158
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
159
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
160
const TCGArg args[TCG_MAX_OP_ARGS],
161
const int const_args[TCG_MAX_OP_ARGS])
162
{
163
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
164
index XXXXXXX..XXXXXXX 100644
165
--- a/tcg/s390x/tcg-target.c.inc
166
+++ b/tcg/s390x/tcg-target.c.inc
167
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
168
case glue(glue(INDEX_op_,x),_i32): \
169
case glue(glue(INDEX_op_,x),_i64)
170
171
-static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
172
- const TCGArg args[TCG_MAX_OP_ARGS],
173
- const int const_args[TCG_MAX_OP_ARGS])
174
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
175
+ const TCGArg args[TCG_MAX_OP_ARGS],
176
+ const int const_args[TCG_MAX_OP_ARGS])
177
{
178
S390Opcode op, op2;
179
TCGArg a0, a1, a2;
180
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
181
/* Since we can't support "0Z" as a constraint, we allow a1 in
182
any register. Fix things up as if a matching constraint. */
183
if (a0 != a1) {
184
- TCGType type = (opc == INDEX_op_deposit_i64);
185
if (a0 == a2) {
186
tcg_out_mov(s, type, TCG_TMP0, a2);
187
a2 = TCG_TMP0;
188
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
189
index XXXXXXX..XXXXXXX 100644
190
--- a/tcg/sparc64/tcg-target.c.inc
191
+++ b/tcg/sparc64/tcg-target.c.inc
192
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
193
{
194
}
195
196
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
197
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
198
const TCGArg args[TCG_MAX_OP_ARGS],
199
const int const_args[TCG_MAX_OP_ARGS])
200
{
201
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
202
index XXXXXXX..XXXXXXX 100644
203
--- a/tcg/tci/tcg-target.c.inc
204
+++ b/tcg/tci/tcg-target.c.inc
205
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
206
/* Always indirect, nothing to do */
207
}
208
209
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
210
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
211
const TCGArg args[TCG_MAX_OP_ARGS],
212
const int const_args[TCG_MAX_OP_ARGS])
213
{
214
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
215
CASE_32_64(sextract) /* Optional (TCG_TARGET_HAS_sextract_*). */
216
{
217
TCGArg pos = args[2], len = args[3];
218
- TCGArg max = tcg_op_defs[opc].flags & TCG_OPF_64BIT ? 64 : 32;
219
+ TCGArg max = type == TCG_TYPE_I32 ? 32 : 64;
220
221
tcg_debug_assert(pos < max);
222
tcg_debug_assert(pos + len <= max);
154
--
223
--
155
2.34.1
224
2.43.0
225
226
diff view generated by jsdifflib
New patch
1
This flag is no longer used.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
include/tcg/tcg-opc.h | 22 +++++++++++-----------
7
include/tcg/tcg.h | 2 --
8
2 files changed, 11 insertions(+), 13 deletions(-)
9
10
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
11
index XXXXXXX..XXXXXXX 100644
12
--- a/include/tcg/tcg-opc.h
13
+++ b/include/tcg/tcg-opc.h
14
@@ -XXX,XX +XXX,XX @@ DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
15
16
#define IMPL(X) (__builtin_constant_p(X) && (X) <= 0 ? TCG_OPF_NOT_PRESENT : 0)
17
#if TCG_TARGET_REG_BITS == 32
18
-# define IMPL64 TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT
19
+# define IMPL64 TCG_OPF_NOT_PRESENT
20
#else
21
-# define IMPL64 TCG_OPF_64BIT
22
+# define IMPL64 0
23
#endif
24
25
DEF(mb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
26
@@ -XXX,XX +XXX,XX @@ DEF(clz_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_clz_i32))
27
DEF(ctz_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_ctz_i32))
28
DEF(ctpop_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ctpop_i32))
29
30
-DEF(mov_i64, 1, 1, 0, TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT)
31
+DEF(mov_i64, 1, 1, 0, TCG_OPF_NOT_PRESENT)
32
DEF(setcond_i64, 1, 2, 1, IMPL64)
33
DEF(negsetcond_i64, 1, 2, 1, IMPL64 | IMPL(TCG_TARGET_HAS_negsetcond_i64))
34
DEF(movcond_i64, 1, 4, 1, IMPL64)
35
@@ -XXX,XX +XXX,XX @@ DEF(qemu_ld_a32_i32, 1, 1, 1,
36
DEF(qemu_st_a32_i32, 0, 1 + 1, 1,
37
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
38
DEF(qemu_ld_a32_i64, DATA64_ARGS, 1, 1,
39
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
40
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
41
DEF(qemu_st_a32_i64, 0, DATA64_ARGS + 1, 1,
42
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
43
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
44
45
DEF(qemu_ld_a64_i32, 1, DATA64_ARGS, 1,
46
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
47
DEF(qemu_st_a64_i32, 0, 1 + DATA64_ARGS, 1,
48
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
49
DEF(qemu_ld_a64_i64, DATA64_ARGS, DATA64_ARGS, 1,
50
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
51
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
52
DEF(qemu_st_a64_i64, 0, DATA64_ARGS + DATA64_ARGS, 1,
53
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
54
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
55
56
/* Only used by i386 to cope with stupid register constraints. */
57
DEF(qemu_st8_a32_i32, 0, 1 + 1, 1,
58
@@ -XXX,XX +XXX,XX @@ DEF(qemu_st8_a64_i32, 0, 1 + DATA64_ARGS, 1,
59
60
/* Only for 64-bit hosts at the moment. */
61
DEF(qemu_ld_a32_i128, 2, 1, 1,
62
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
63
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
64
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
65
DEF(qemu_ld_a64_i128, 2, 1, 1,
66
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
67
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
68
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
69
DEF(qemu_st_a32_i128, 0, 3, 1,
70
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
71
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
72
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
73
DEF(qemu_st_a64_i128, 0, 3, 1,
74
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
75
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
76
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
77
78
/* Host vector support. */
79
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
80
index XXXXXXX..XXXXXXX 100644
81
--- a/include/tcg/tcg.h
82
+++ b/include/tcg/tcg.h
83
@@ -XXX,XX +XXX,XX @@ enum {
84
/* Instruction has side effects: it cannot be removed if its outputs
85
are not used, and might trigger exceptions. */
86
TCG_OPF_SIDE_EFFECTS = 0x08,
87
- /* Instruction operands are 64-bits (otherwise 32-bits). */
88
- TCG_OPF_64BIT = 0x10,
89
/* Instruction is optional and not implemented by the host, or insn
90
is generic and should not be implemented by the host. */
91
TCG_OPF_NOT_PRESENT = 0x20,
92
--
93
2.43.0
94
95
diff view generated by jsdifflib
New patch
1
Now that we use a functional interface to query whether the opcode
2
is supported, we can drop the TCG_OPF_NOT_PRESENT bit mapping from
3
TCG_TARGET_HAS_foo in tcg-opc.h
1
4
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
8
include/tcg/tcg-opc.h | 306 +++++++++++++++++++-----------------------
9
1 file changed, 141 insertions(+), 165 deletions(-)
10
11
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/include/tcg/tcg-opc.h
14
+++ b/include/tcg/tcg-opc.h
15
@@ -XXX,XX +XXX,XX @@ DEF(call, 0, 0, 3, TCG_OPF_CALL_CLOBBER | TCG_OPF_NOT_PRESENT)
16
17
DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
18
19
-#define IMPL(X) (__builtin_constant_p(X) && (X) <= 0 ? TCG_OPF_NOT_PRESENT : 0)
20
-#if TCG_TARGET_REG_BITS == 32
21
-# define IMPL64 TCG_OPF_NOT_PRESENT
22
-#else
23
-# define IMPL64 0
24
-#endif
25
-
26
DEF(mb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
27
28
DEF(mov_i32, 1, 1, 0, TCG_OPF_NOT_PRESENT)
29
DEF(setcond_i32, 1, 2, 1, 0)
30
-DEF(negsetcond_i32, 1, 2, 1, IMPL(TCG_TARGET_HAS_negsetcond_i32))
31
+DEF(negsetcond_i32, 1, 2, 1, 0)
32
DEF(movcond_i32, 1, 4, 1, 0)
33
/* load/store */
34
DEF(ld8u_i32, 1, 1, 1, 0)
35
@@ -XXX,XX +XXX,XX @@ DEF(st_i32, 0, 2, 1, 0)
36
DEF(add_i32, 1, 2, 0, 0)
37
DEF(sub_i32, 1, 2, 0, 0)
38
DEF(mul_i32, 1, 2, 0, 0)
39
-DEF(div_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_div_i32))
40
-DEF(divu_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_div_i32))
41
-DEF(rem_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rem_i32))
42
-DEF(remu_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rem_i32))
43
-DEF(div2_i32, 2, 3, 0, IMPL(TCG_TARGET_HAS_div2_i32))
44
-DEF(divu2_i32, 2, 3, 0, IMPL(TCG_TARGET_HAS_div2_i32))
45
+DEF(div_i32, 1, 2, 0, 0)
46
+DEF(divu_i32, 1, 2, 0, 0)
47
+DEF(rem_i32, 1, 2, 0, 0)
48
+DEF(remu_i32, 1, 2, 0, 0)
49
+DEF(div2_i32, 2, 3, 0, 0)
50
+DEF(divu2_i32, 2, 3, 0, 0)
51
DEF(and_i32, 1, 2, 0, 0)
52
DEF(or_i32, 1, 2, 0, 0)
53
DEF(xor_i32, 1, 2, 0, 0)
54
@@ -XXX,XX +XXX,XX @@ DEF(xor_i32, 1, 2, 0, 0)
55
DEF(shl_i32, 1, 2, 0, 0)
56
DEF(shr_i32, 1, 2, 0, 0)
57
DEF(sar_i32, 1, 2, 0, 0)
58
-DEF(rotl_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rot_i32))
59
-DEF(rotr_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_rot_i32))
60
-DEF(deposit_i32, 1, 2, 2, IMPL(TCG_TARGET_HAS_deposit_i32))
61
-DEF(extract_i32, 1, 1, 2, IMPL(TCG_TARGET_HAS_extract_i32))
62
-DEF(sextract_i32, 1, 1, 2, IMPL(TCG_TARGET_HAS_sextract_i32))
63
-DEF(extract2_i32, 1, 2, 1, IMPL(TCG_TARGET_HAS_extract2_i32))
64
+DEF(rotl_i32, 1, 2, 0, 0)
65
+DEF(rotr_i32, 1, 2, 0, 0)
66
+DEF(deposit_i32, 1, 2, 2, 0)
67
+DEF(extract_i32, 1, 1, 2, 0)
68
+DEF(sextract_i32, 1, 1, 2, 0)
69
+DEF(extract2_i32, 1, 2, 1, 0)
70
71
DEF(brcond_i32, 0, 2, 2, TCG_OPF_BB_END | TCG_OPF_COND_BRANCH)
72
73
-DEF(add2_i32, 2, 4, 0, IMPL(TCG_TARGET_HAS_add2_i32))
74
-DEF(sub2_i32, 2, 4, 0, IMPL(TCG_TARGET_HAS_sub2_i32))
75
-DEF(mulu2_i32, 2, 2, 0, IMPL(TCG_TARGET_HAS_mulu2_i32))
76
-DEF(muls2_i32, 2, 2, 0, IMPL(TCG_TARGET_HAS_muls2_i32))
77
-DEF(muluh_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_muluh_i32))
78
-DEF(mulsh_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_mulsh_i32))
79
-DEF(brcond2_i32, 0, 4, 2,
80
- TCG_OPF_BB_END | TCG_OPF_COND_BRANCH | IMPL(TCG_TARGET_REG_BITS == 32))
81
-DEF(setcond2_i32, 1, 4, 1, IMPL(TCG_TARGET_REG_BITS == 32))
82
+DEF(add2_i32, 2, 4, 0, 0)
83
+DEF(sub2_i32, 2, 4, 0, 0)
84
+DEF(mulu2_i32, 2, 2, 0, 0)
85
+DEF(muls2_i32, 2, 2, 0, 0)
86
+DEF(muluh_i32, 1, 2, 0, 0)
87
+DEF(mulsh_i32, 1, 2, 0, 0)
88
+DEF(brcond2_i32, 0, 4, 2, TCG_OPF_BB_END | TCG_OPF_COND_BRANCH)
89
+DEF(setcond2_i32, 1, 4, 1, 0)
90
91
-DEF(ext8s_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext8s_i32))
92
-DEF(ext16s_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext16s_i32))
93
-DEF(ext8u_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext8u_i32))
94
-DEF(ext16u_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ext16u_i32))
95
-DEF(bswap16_i32, 1, 1, 1, IMPL(TCG_TARGET_HAS_bswap16_i32))
96
-DEF(bswap32_i32, 1, 1, 1, IMPL(TCG_TARGET_HAS_bswap32_i32))
97
-DEF(not_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_not_i32))
98
+DEF(ext8s_i32, 1, 1, 0, 0)
99
+DEF(ext16s_i32, 1, 1, 0, 0)
100
+DEF(ext8u_i32, 1, 1, 0, 0)
101
+DEF(ext16u_i32, 1, 1, 0, 0)
102
+DEF(bswap16_i32, 1, 1, 1, 0)
103
+DEF(bswap32_i32, 1, 1, 1, 0)
104
+DEF(not_i32, 1, 1, 0, 0)
105
DEF(neg_i32, 1, 1, 0, 0)
106
-DEF(andc_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_andc_i32))
107
-DEF(orc_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_orc_i32))
108
-DEF(eqv_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_eqv_i32))
109
-DEF(nand_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_nand_i32))
110
-DEF(nor_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_nor_i32))
111
-DEF(clz_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_clz_i32))
112
-DEF(ctz_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_ctz_i32))
113
-DEF(ctpop_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ctpop_i32))
114
+DEF(andc_i32, 1, 2, 0, 0)
115
+DEF(orc_i32, 1, 2, 0, 0)
116
+DEF(eqv_i32, 1, 2, 0, 0)
117
+DEF(nand_i32, 1, 2, 0, 0)
118
+DEF(nor_i32, 1, 2, 0, 0)
119
+DEF(clz_i32, 1, 2, 0, 0)
120
+DEF(ctz_i32, 1, 2, 0, 0)
121
+DEF(ctpop_i32, 1, 1, 0, 0)
122
123
DEF(mov_i64, 1, 1, 0, TCG_OPF_NOT_PRESENT)
124
-DEF(setcond_i64, 1, 2, 1, IMPL64)
125
-DEF(negsetcond_i64, 1, 2, 1, IMPL64 | IMPL(TCG_TARGET_HAS_negsetcond_i64))
126
-DEF(movcond_i64, 1, 4, 1, IMPL64)
127
+DEF(setcond_i64, 1, 2, 1, 0)
128
+DEF(negsetcond_i64, 1, 2, 1, 0)
129
+DEF(movcond_i64, 1, 4, 1, 0)
130
/* load/store */
131
-DEF(ld8u_i64, 1, 1, 1, IMPL64)
132
-DEF(ld8s_i64, 1, 1, 1, IMPL64)
133
-DEF(ld16u_i64, 1, 1, 1, IMPL64)
134
-DEF(ld16s_i64, 1, 1, 1, IMPL64)
135
-DEF(ld32u_i64, 1, 1, 1, IMPL64)
136
-DEF(ld32s_i64, 1, 1, 1, IMPL64)
137
-DEF(ld_i64, 1, 1, 1, IMPL64)
138
-DEF(st8_i64, 0, 2, 1, IMPL64)
139
-DEF(st16_i64, 0, 2, 1, IMPL64)
140
-DEF(st32_i64, 0, 2, 1, IMPL64)
141
-DEF(st_i64, 0, 2, 1, IMPL64)
142
+DEF(ld8u_i64, 1, 1, 1, 0)
143
+DEF(ld8s_i64, 1, 1, 1, 0)
144
+DEF(ld16u_i64, 1, 1, 1, 0)
145
+DEF(ld16s_i64, 1, 1, 1, 0)
146
+DEF(ld32u_i64, 1, 1, 1, 0)
147
+DEF(ld32s_i64, 1, 1, 1, 0)
148
+DEF(ld_i64, 1, 1, 1, 0)
149
+DEF(st8_i64, 0, 2, 1, 0)
150
+DEF(st16_i64, 0, 2, 1, 0)
151
+DEF(st32_i64, 0, 2, 1, 0)
152
+DEF(st_i64, 0, 2, 1, 0)
153
/* arith */
154
-DEF(add_i64, 1, 2, 0, IMPL64)
155
-DEF(sub_i64, 1, 2, 0, IMPL64)
156
-DEF(mul_i64, 1, 2, 0, IMPL64)
157
-DEF(div_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div_i64))
158
-DEF(divu_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div_i64))
159
-DEF(rem_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rem_i64))
160
-DEF(remu_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rem_i64))
161
-DEF(div2_i64, 2, 3, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div2_i64))
162
-DEF(divu2_i64, 2, 3, 0, IMPL64 | IMPL(TCG_TARGET_HAS_div2_i64))
163
-DEF(and_i64, 1, 2, 0, IMPL64)
164
-DEF(or_i64, 1, 2, 0, IMPL64)
165
-DEF(xor_i64, 1, 2, 0, IMPL64)
166
+DEF(add_i64, 1, 2, 0, 0)
167
+DEF(sub_i64, 1, 2, 0, 0)
168
+DEF(mul_i64, 1, 2, 0, 0)
169
+DEF(div_i64, 1, 2, 0, 0)
170
+DEF(divu_i64, 1, 2, 0, 0)
171
+DEF(rem_i64, 1, 2, 0, 0)
172
+DEF(remu_i64, 1, 2, 0, 0)
173
+DEF(div2_i64, 2, 3, 0, 0)
174
+DEF(divu2_i64, 2, 3, 0, 0)
175
+DEF(and_i64, 1, 2, 0, 0)
176
+DEF(or_i64, 1, 2, 0, 0)
177
+DEF(xor_i64, 1, 2, 0, 0)
178
/* shifts/rotates */
179
-DEF(shl_i64, 1, 2, 0, IMPL64)
180
-DEF(shr_i64, 1, 2, 0, IMPL64)
181
-DEF(sar_i64, 1, 2, 0, IMPL64)
182
-DEF(rotl_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rot_i64))
183
-DEF(rotr_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_rot_i64))
184
-DEF(deposit_i64, 1, 2, 2, IMPL64 | IMPL(TCG_TARGET_HAS_deposit_i64))
185
-DEF(extract_i64, 1, 1, 2, IMPL64 | IMPL(TCG_TARGET_HAS_extract_i64))
186
-DEF(sextract_i64, 1, 1, 2, IMPL64 | IMPL(TCG_TARGET_HAS_sextract_i64))
187
-DEF(extract2_i64, 1, 2, 1, IMPL64 | IMPL(TCG_TARGET_HAS_extract2_i64))
188
+DEF(shl_i64, 1, 2, 0, 0)
189
+DEF(shr_i64, 1, 2, 0, 0)
190
+DEF(sar_i64, 1, 2, 0, 0)
191
+DEF(rotl_i64, 1, 2, 0, 0)
192
+DEF(rotr_i64, 1, 2, 0, 0)
193
+DEF(deposit_i64, 1, 2, 2, 0)
194
+DEF(extract_i64, 1, 1, 2, 0)
195
+DEF(sextract_i64, 1, 1, 2, 0)
196
+DEF(extract2_i64, 1, 2, 1, 0)
197
198
/* size changing ops */
199
-DEF(ext_i32_i64, 1, 1, 0, IMPL64)
200
-DEF(extu_i32_i64, 1, 1, 0, IMPL64)
201
-DEF(extrl_i64_i32, 1, 1, 0,
202
- IMPL(TCG_TARGET_HAS_extr_i64_i32)
203
- | (TCG_TARGET_REG_BITS == 32 ? TCG_OPF_NOT_PRESENT : 0))
204
-DEF(extrh_i64_i32, 1, 1, 0,
205
- IMPL(TCG_TARGET_HAS_extr_i64_i32)
206
- | (TCG_TARGET_REG_BITS == 32 ? TCG_OPF_NOT_PRESENT : 0))
207
+DEF(ext_i32_i64, 1, 1, 0, 0)
208
+DEF(extu_i32_i64, 1, 1, 0, 0)
209
+DEF(extrl_i64_i32, 1, 1, 0, 0)
210
+DEF(extrh_i64_i32, 1, 1, 0, 0)
211
212
-DEF(brcond_i64, 0, 2, 2, TCG_OPF_BB_END | TCG_OPF_COND_BRANCH | IMPL64)
213
-DEF(ext8s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext8s_i64))
214
-DEF(ext16s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext16s_i64))
215
-DEF(ext32s_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext32s_i64))
216
-DEF(ext8u_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext8u_i64))
217
-DEF(ext16u_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext16u_i64))
218
-DEF(ext32u_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ext32u_i64))
219
-DEF(bswap16_i64, 1, 1, 1, IMPL64 | IMPL(TCG_TARGET_HAS_bswap16_i64))
220
-DEF(bswap32_i64, 1, 1, 1, IMPL64 | IMPL(TCG_TARGET_HAS_bswap32_i64))
221
-DEF(bswap64_i64, 1, 1, 1, IMPL64 | IMPL(TCG_TARGET_HAS_bswap64_i64))
222
-DEF(not_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_not_i64))
223
-DEF(neg_i64, 1, 1, 0, IMPL64)
224
-DEF(andc_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_andc_i64))
225
-DEF(orc_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_orc_i64))
226
-DEF(eqv_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_eqv_i64))
227
-DEF(nand_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_nand_i64))
228
-DEF(nor_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_nor_i64))
229
-DEF(clz_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_clz_i64))
230
-DEF(ctz_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ctz_i64))
231
-DEF(ctpop_i64, 1, 1, 0, IMPL64 | IMPL(TCG_TARGET_HAS_ctpop_i64))
232
+DEF(brcond_i64, 0, 2, 2, TCG_OPF_BB_END | TCG_OPF_COND_BRANCH)
233
+DEF(ext8s_i64, 1, 1, 0, 0)
234
+DEF(ext16s_i64, 1, 1, 0, 0)
235
+DEF(ext32s_i64, 1, 1, 0, 0)
236
+DEF(ext8u_i64, 1, 1, 0, 0)
237
+DEF(ext16u_i64, 1, 1, 0, 0)
238
+DEF(ext32u_i64, 1, 1, 0, 0)
239
+DEF(bswap16_i64, 1, 1, 1, 0)
240
+DEF(bswap32_i64, 1, 1, 1, 0)
241
+DEF(bswap64_i64, 1, 1, 1, 0)
242
+DEF(not_i64, 1, 1, 0, 0)
243
+DEF(neg_i64, 1, 1, 0, 0)
244
+DEF(andc_i64, 1, 2, 0, 0)
245
+DEF(orc_i64, 1, 2, 0, 0)
246
+DEF(eqv_i64, 1, 2, 0, 0)
247
+DEF(nand_i64, 1, 2, 0, 0)
248
+DEF(nor_i64, 1, 2, 0, 0)
249
+DEF(clz_i64, 1, 2, 0, 0)
250
+DEF(ctz_i64, 1, 2, 0, 0)
251
+DEF(ctpop_i64, 1, 1, 0, 0)
252
253
-DEF(add2_i64, 2, 4, 0, IMPL64 | IMPL(TCG_TARGET_HAS_add2_i64))
254
-DEF(sub2_i64, 2, 4, 0, IMPL64 | IMPL(TCG_TARGET_HAS_sub2_i64))
255
-DEF(mulu2_i64, 2, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_mulu2_i64))
256
-DEF(muls2_i64, 2, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_muls2_i64))
257
-DEF(muluh_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_muluh_i64))
258
-DEF(mulsh_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_mulsh_i64))
259
+DEF(add2_i64, 2, 4, 0, 0)
260
+DEF(sub2_i64, 2, 4, 0, 0)
261
+DEF(mulu2_i64, 2, 2, 0, 0)
262
+DEF(muls2_i64, 2, 2, 0, 0)
263
+DEF(muluh_i64, 1, 2, 0, 0)
264
+DEF(mulsh_i64, 1, 2, 0, 0)
265
266
#define DATA64_ARGS (TCG_TARGET_REG_BITS == 64 ? 1 : 2)
267
268
@@ -XXX,XX +XXX,XX @@ DEF(qemu_st_a64_i64, 0, DATA64_ARGS + DATA64_ARGS, 1,
269
270
/* Only used by i386 to cope with stupid register constraints. */
271
DEF(qemu_st8_a32_i32, 0, 1 + 1, 1,
272
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
273
- IMPL(TCG_TARGET_HAS_qemu_st8_i32))
274
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
275
DEF(qemu_st8_a64_i32, 0, 1 + DATA64_ARGS, 1,
276
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
277
- IMPL(TCG_TARGET_HAS_qemu_st8_i32))
278
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
279
280
/* Only for 64-bit hosts at the moment. */
281
-DEF(qemu_ld_a32_i128, 2, 1, 1,
282
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
283
- IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
284
-DEF(qemu_ld_a64_i128, 2, 1, 1,
285
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
286
- IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
287
-DEF(qemu_st_a32_i128, 0, 3, 1,
288
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
289
- IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
290
-DEF(qemu_st_a64_i128, 0, 3, 1,
291
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
292
- IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
293
+DEF(qemu_ld_a32_i128, 2, 1, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
294
+DEF(qemu_ld_a64_i128, 2, 1, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
295
+DEF(qemu_st_a32_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
296
+DEF(qemu_st_a64_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
297
298
/* Host vector support. */
299
300
-#define IMPLVEC TCG_OPF_VECTOR | IMPL(TCG_TARGET_MAYBE_vec)
301
+#define IMPLVEC TCG_OPF_VECTOR
302
303
DEF(mov_vec, 1, 1, 0, TCG_OPF_VECTOR | TCG_OPF_NOT_PRESENT)
304
305
DEF(dup_vec, 1, 1, 0, IMPLVEC)
306
-DEF(dup2_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_REG_BITS == 32))
307
+DEF(dup2_vec, 1, 2, 0, IMPLVEC)
308
309
DEF(ld_vec, 1, 1, 1, IMPLVEC)
310
DEF(st_vec, 0, 2, 1, IMPLVEC)
311
@@ -XXX,XX +XXX,XX @@ DEF(dupm_vec, 1, 1, 1, IMPLVEC)
312
313
DEF(add_vec, 1, 2, 0, IMPLVEC)
314
DEF(sub_vec, 1, 2, 0, IMPLVEC)
315
-DEF(mul_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_mul_vec))
316
-DEF(neg_vec, 1, 1, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_neg_vec))
317
-DEF(abs_vec, 1, 1, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_abs_vec))
318
-DEF(ssadd_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_sat_vec))
319
-DEF(usadd_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_sat_vec))
320
-DEF(sssub_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_sat_vec))
321
-DEF(ussub_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_sat_vec))
322
-DEF(smin_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_minmax_vec))
323
-DEF(umin_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_minmax_vec))
324
-DEF(smax_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_minmax_vec))
325
-DEF(umax_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_minmax_vec))
326
+DEF(mul_vec, 1, 2, 0, IMPLVEC)
327
+DEF(neg_vec, 1, 1, 0, IMPLVEC)
328
+DEF(abs_vec, 1, 1, 0, IMPLVEC)
329
+DEF(ssadd_vec, 1, 2, 0, IMPLVEC)
330
+DEF(usadd_vec, 1, 2, 0, IMPLVEC)
331
+DEF(sssub_vec, 1, 2, 0, IMPLVEC)
332
+DEF(ussub_vec, 1, 2, 0, IMPLVEC)
333
+DEF(smin_vec, 1, 2, 0, IMPLVEC)
334
+DEF(umin_vec, 1, 2, 0, IMPLVEC)
335
+DEF(smax_vec, 1, 2, 0, IMPLVEC)
336
+DEF(umax_vec, 1, 2, 0, IMPLVEC)
337
338
DEF(and_vec, 1, 2, 0, IMPLVEC)
339
DEF(or_vec, 1, 2, 0, IMPLVEC)
340
DEF(xor_vec, 1, 2, 0, IMPLVEC)
341
-DEF(andc_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_andc_vec))
342
-DEF(orc_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_orc_vec))
343
-DEF(nand_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_nand_vec))
344
-DEF(nor_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_nor_vec))
345
-DEF(eqv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_eqv_vec))
346
-DEF(not_vec, 1, 1, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_not_vec))
347
+DEF(andc_vec, 1, 2, 0, IMPLVEC)
348
+DEF(orc_vec, 1, 2, 0, IMPLVEC)
349
+DEF(nand_vec, 1, 2, 0, IMPLVEC)
350
+DEF(nor_vec, 1, 2, 0, IMPLVEC)
351
+DEF(eqv_vec, 1, 2, 0, IMPLVEC)
352
+DEF(not_vec, 1, 1, 0, IMPLVEC)
353
354
-DEF(shli_vec, 1, 1, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_shi_vec))
355
-DEF(shri_vec, 1, 1, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_shi_vec))
356
-DEF(sari_vec, 1, 1, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_shi_vec))
357
-DEF(rotli_vec, 1, 1, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_roti_vec))
358
+DEF(shli_vec, 1, 1, 1, IMPLVEC)
359
+DEF(shri_vec, 1, 1, 1, IMPLVEC)
360
+DEF(sari_vec, 1, 1, 1, IMPLVEC)
361
+DEF(rotli_vec, 1, 1, 1, IMPLVEC)
362
363
-DEF(shls_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shs_vec))
364
-DEF(shrs_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shs_vec))
365
-DEF(sars_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shs_vec))
366
-DEF(rotls_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_rots_vec))
367
+DEF(shls_vec, 1, 2, 0, IMPLVEC)
368
+DEF(shrs_vec, 1, 2, 0, IMPLVEC)
369
+DEF(sars_vec, 1, 2, 0, IMPLVEC)
370
+DEF(rotls_vec, 1, 2, 0, IMPLVEC)
371
372
-DEF(shlv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shv_vec))
373
-DEF(shrv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shv_vec))
374
-DEF(sarv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_shv_vec))
375
-DEF(rotlv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_rotv_vec))
376
-DEF(rotrv_vec, 1, 2, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_rotv_vec))
377
+DEF(shlv_vec, 1, 2, 0, IMPLVEC)
378
+DEF(shrv_vec, 1, 2, 0, IMPLVEC)
379
+DEF(sarv_vec, 1, 2, 0, IMPLVEC)
380
+DEF(rotlv_vec, 1, 2, 0, IMPLVEC)
381
+DEF(rotrv_vec, 1, 2, 0, IMPLVEC)
382
383
DEF(cmp_vec, 1, 2, 1, IMPLVEC)
384
385
-DEF(bitsel_vec, 1, 3, 0, IMPLVEC | IMPL(TCG_TARGET_HAS_bitsel_vec))
386
-DEF(cmpsel_vec, 1, 4, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_cmpsel_vec))
387
+DEF(bitsel_vec, 1, 3, 0, IMPLVEC)
388
+DEF(cmpsel_vec, 1, 4, 1, IMPLVEC)
389
390
DEF(last_generic, 0, 0, 0, TCG_OPF_NOT_PRESENT)
391
392
#include "tcg-target-opc.h.inc"
393
394
#undef DATA64_ARGS
395
-#undef IMPL
396
-#undef IMPL64
397
#undef IMPLVEC
398
#undef DEF
399
--
400
2.43.0
401
402
diff view generated by jsdifflib
New patch
1
1
This is now a direct replacement.
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
include/tcg/tcg-opc.h | 89 +++++++++++++++-----------------
7
tcg/aarch64/tcg-target-opc.h.inc | 4 +-
8
tcg/arm/tcg-target-opc.h.inc | 6 +--
9
tcg/i386/tcg-target-opc.h.inc | 22 ++++----
10
tcg/ppc/tcg-target-opc.h.inc | 12 ++---
11
tcg/s390x/tcg-target-opc.h.inc | 6 +--
12
6 files changed, 68 insertions(+), 71 deletions(-)
13
14
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/include/tcg/tcg-opc.h
17
+++ b/include/tcg/tcg-opc.h
18
@@ -XXX,XX +XXX,XX @@ DEF(qemu_st_a64_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
19
20
/* Host vector support. */
21
22
-#define IMPLVEC TCG_OPF_VECTOR
23
-
24
DEF(mov_vec, 1, 1, 0, TCG_OPF_VECTOR | TCG_OPF_NOT_PRESENT)
25
26
-DEF(dup_vec, 1, 1, 0, IMPLVEC)
27
-DEF(dup2_vec, 1, 2, 0, IMPLVEC)
28
+DEF(dup_vec, 1, 1, 0, TCG_OPF_VECTOR)
29
+DEF(dup2_vec, 1, 2, 0, TCG_OPF_VECTOR)
30
31
-DEF(ld_vec, 1, 1, 1, IMPLVEC)
32
-DEF(st_vec, 0, 2, 1, IMPLVEC)
33
-DEF(dupm_vec, 1, 1, 1, IMPLVEC)
34
+DEF(ld_vec, 1, 1, 1, TCG_OPF_VECTOR)
35
+DEF(st_vec, 0, 2, 1, TCG_OPF_VECTOR)
36
+DEF(dupm_vec, 1, 1, 1, TCG_OPF_VECTOR)
37
38
-DEF(add_vec, 1, 2, 0, IMPLVEC)
39
-DEF(sub_vec, 1, 2, 0, IMPLVEC)
40
-DEF(mul_vec, 1, 2, 0, IMPLVEC)
41
-DEF(neg_vec, 1, 1, 0, IMPLVEC)
42
-DEF(abs_vec, 1, 1, 0, IMPLVEC)
43
-DEF(ssadd_vec, 1, 2, 0, IMPLVEC)
44
-DEF(usadd_vec, 1, 2, 0, IMPLVEC)
45
-DEF(sssub_vec, 1, 2, 0, IMPLVEC)
46
-DEF(ussub_vec, 1, 2, 0, IMPLVEC)
47
-DEF(smin_vec, 1, 2, 0, IMPLVEC)
48
-DEF(umin_vec, 1, 2, 0, IMPLVEC)
49
-DEF(smax_vec, 1, 2, 0, IMPLVEC)
50
-DEF(umax_vec, 1, 2, 0, IMPLVEC)
51
+DEF(add_vec, 1, 2, 0, TCG_OPF_VECTOR)
52
+DEF(sub_vec, 1, 2, 0, TCG_OPF_VECTOR)
53
+DEF(mul_vec, 1, 2, 0, TCG_OPF_VECTOR)
54
+DEF(neg_vec, 1, 1, 0, TCG_OPF_VECTOR)
55
+DEF(abs_vec, 1, 1, 0, TCG_OPF_VECTOR)
56
+DEF(ssadd_vec, 1, 2, 0, TCG_OPF_VECTOR)
57
+DEF(usadd_vec, 1, 2, 0, TCG_OPF_VECTOR)
58
+DEF(sssub_vec, 1, 2, 0, TCG_OPF_VECTOR)
59
+DEF(ussub_vec, 1, 2, 0, TCG_OPF_VECTOR)
60
+DEF(smin_vec, 1, 2, 0, TCG_OPF_VECTOR)
61
+DEF(umin_vec, 1, 2, 0, TCG_OPF_VECTOR)
62
+DEF(smax_vec, 1, 2, 0, TCG_OPF_VECTOR)
63
+DEF(umax_vec, 1, 2, 0, TCG_OPF_VECTOR)
64
65
-DEF(and_vec, 1, 2, 0, IMPLVEC)
66
-DEF(or_vec, 1, 2, 0, IMPLVEC)
67
-DEF(xor_vec, 1, 2, 0, IMPLVEC)
68
-DEF(andc_vec, 1, 2, 0, IMPLVEC)
69
-DEF(orc_vec, 1, 2, 0, IMPLVEC)
70
-DEF(nand_vec, 1, 2, 0, IMPLVEC)
71
-DEF(nor_vec, 1, 2, 0, IMPLVEC)
72
-DEF(eqv_vec, 1, 2, 0, IMPLVEC)
73
-DEF(not_vec, 1, 1, 0, IMPLVEC)
74
+DEF(and_vec, 1, 2, 0, TCG_OPF_VECTOR)
75
+DEF(or_vec, 1, 2, 0, TCG_OPF_VECTOR)
76
+DEF(xor_vec, 1, 2, 0, TCG_OPF_VECTOR)
77
+DEF(andc_vec, 1, 2, 0, TCG_OPF_VECTOR)
78
+DEF(orc_vec, 1, 2, 0, TCG_OPF_VECTOR)
79
+DEF(nand_vec, 1, 2, 0, TCG_OPF_VECTOR)
80
+DEF(nor_vec, 1, 2, 0, TCG_OPF_VECTOR)
81
+DEF(eqv_vec, 1, 2, 0, TCG_OPF_VECTOR)
82
+DEF(not_vec, 1, 1, 0, TCG_OPF_VECTOR)
83
84
-DEF(shli_vec, 1, 1, 1, IMPLVEC)
85
-DEF(shri_vec, 1, 1, 1, IMPLVEC)
86
-DEF(sari_vec, 1, 1, 1, IMPLVEC)
87
-DEF(rotli_vec, 1, 1, 1, IMPLVEC)
88
+DEF(shli_vec, 1, 1, 1, TCG_OPF_VECTOR)
89
+DEF(shri_vec, 1, 1, 1, TCG_OPF_VECTOR)
90
+DEF(sari_vec, 1, 1, 1, TCG_OPF_VECTOR)
91
+DEF(rotli_vec, 1, 1, 1, TCG_OPF_VECTOR)
92
93
-DEF(shls_vec, 1, 2, 0, IMPLVEC)
94
-DEF(shrs_vec, 1, 2, 0, IMPLVEC)
95
-DEF(sars_vec, 1, 2, 0, IMPLVEC)
96
-DEF(rotls_vec, 1, 2, 0, IMPLVEC)
97
+DEF(shls_vec, 1, 2, 0, TCG_OPF_VECTOR)
98
+DEF(shrs_vec, 1, 2, 0, TCG_OPF_VECTOR)
99
+DEF(sars_vec, 1, 2, 0, TCG_OPF_VECTOR)
100
+DEF(rotls_vec, 1, 2, 0, TCG_OPF_VECTOR)
101
102
-DEF(shlv_vec, 1, 2, 0, IMPLVEC)
103
-DEF(shrv_vec, 1, 2, 0, IMPLVEC)
104
-DEF(sarv_vec, 1, 2, 0, IMPLVEC)
105
-DEF(rotlv_vec, 1, 2, 0, IMPLVEC)
106
-DEF(rotrv_vec, 1, 2, 0, IMPLVEC)
107
+DEF(shlv_vec, 1, 2, 0, TCG_OPF_VECTOR)
108
+DEF(shrv_vec, 1, 2, 0, TCG_OPF_VECTOR)
109
+DEF(sarv_vec, 1, 2, 0, TCG_OPF_VECTOR)
110
+DEF(rotlv_vec, 1, 2, 0, TCG_OPF_VECTOR)
111
+DEF(rotrv_vec, 1, 2, 0, TCG_OPF_VECTOR)
112
113
-DEF(cmp_vec, 1, 2, 1, IMPLVEC)
114
+DEF(cmp_vec, 1, 2, 1, TCG_OPF_VECTOR)
115
116
-DEF(bitsel_vec, 1, 3, 0, IMPLVEC)
117
-DEF(cmpsel_vec, 1, 4, 1, IMPLVEC)
118
+DEF(bitsel_vec, 1, 3, 0, TCG_OPF_VECTOR)
119
+DEF(cmpsel_vec, 1, 4, 1, TCG_OPF_VECTOR)
120
121
DEF(last_generic, 0, 0, 0, TCG_OPF_NOT_PRESENT)
122
123
#include "tcg-target-opc.h.inc"
124
125
#undef DATA64_ARGS
126
-#undef IMPLVEC
127
#undef DEF
128
diff --git a/tcg/aarch64/tcg-target-opc.h.inc b/tcg/aarch64/tcg-target-opc.h.inc
129
index XXXXXXX..XXXXXXX 100644
130
--- a/tcg/aarch64/tcg-target-opc.h.inc
131
+++ b/tcg/aarch64/tcg-target-opc.h.inc
132
@@ -XXX,XX +XXX,XX @@
133
* consider these to be UNSPEC with names.
134
*/
135
136
-DEF(aa64_sshl_vec, 1, 2, 0, IMPLVEC)
137
-DEF(aa64_sli_vec, 1, 2, 1, IMPLVEC)
138
+DEF(aa64_sshl_vec, 1, 2, 0, TCG_OPF_VECTOR)
139
+DEF(aa64_sli_vec, 1, 2, 1, TCG_OPF_VECTOR)
140
diff --git a/tcg/arm/tcg-target-opc.h.inc b/tcg/arm/tcg-target-opc.h.inc
141
index XXXXXXX..XXXXXXX 100644
142
--- a/tcg/arm/tcg-target-opc.h.inc
143
+++ b/tcg/arm/tcg-target-opc.h.inc
144
@@ -XXX,XX +XXX,XX @@
145
* consider these to be UNSPEC with names.
146
*/
147
148
-DEF(arm_sli_vec, 1, 2, 1, IMPLVEC)
149
-DEF(arm_sshl_vec, 1, 2, 0, IMPLVEC)
150
-DEF(arm_ushl_vec, 1, 2, 0, IMPLVEC)
151
+DEF(arm_sli_vec, 1, 2, 1, TCG_OPF_VECTOR)
152
+DEF(arm_sshl_vec, 1, 2, 0, TCG_OPF_VECTOR)
153
+DEF(arm_ushl_vec, 1, 2, 0, TCG_OPF_VECTOR)
154
diff --git a/tcg/i386/tcg-target-opc.h.inc b/tcg/i386/tcg-target-opc.h.inc
155
index XXXXXXX..XXXXXXX 100644
156
--- a/tcg/i386/tcg-target-opc.h.inc
157
+++ b/tcg/i386/tcg-target-opc.h.inc
158
@@ -XXX,XX +XXX,XX @@
159
* consider these to be UNSPEC with names.
160
*/
161
162
-DEF(x86_shufps_vec, 1, 2, 1, IMPLVEC)
163
-DEF(x86_blend_vec, 1, 2, 1, IMPLVEC)
164
-DEF(x86_packss_vec, 1, 2, 0, IMPLVEC)
165
-DEF(x86_packus_vec, 1, 2, 0, IMPLVEC)
166
-DEF(x86_psrldq_vec, 1, 1, 1, IMPLVEC)
167
-DEF(x86_vperm2i128_vec, 1, 2, 1, IMPLVEC)
168
-DEF(x86_punpckl_vec, 1, 2, 0, IMPLVEC)
169
-DEF(x86_punpckh_vec, 1, 2, 0, IMPLVEC)
170
-DEF(x86_vpshldi_vec, 1, 2, 1, IMPLVEC)
171
-DEF(x86_vpshldv_vec, 1, 3, 0, IMPLVEC)
172
-DEF(x86_vpshrdv_vec, 1, 3, 0, IMPLVEC)
173
+DEF(x86_shufps_vec, 1, 2, 1, TCG_OPF_VECTOR)
174
+DEF(x86_blend_vec, 1, 2, 1, TCG_OPF_VECTOR)
175
+DEF(x86_packss_vec, 1, 2, 0, TCG_OPF_VECTOR)
176
+DEF(x86_packus_vec, 1, 2, 0, TCG_OPF_VECTOR)
177
+DEF(x86_psrldq_vec, 1, 1, 1, TCG_OPF_VECTOR)
178
+DEF(x86_vperm2i128_vec, 1, 2, 1, TCG_OPF_VECTOR)
179
+DEF(x86_punpckl_vec, 1, 2, 0, TCG_OPF_VECTOR)
180
+DEF(x86_punpckh_vec, 1, 2, 0, TCG_OPF_VECTOR)
181
+DEF(x86_vpshldi_vec, 1, 2, 1, TCG_OPF_VECTOR)
182
+DEF(x86_vpshldv_vec, 1, 3, 0, TCG_OPF_VECTOR)
183
+DEF(x86_vpshrdv_vec, 1, 3, 0, TCG_OPF_VECTOR)
184
diff --git a/tcg/ppc/tcg-target-opc.h.inc b/tcg/ppc/tcg-target-opc.h.inc
185
index XXXXXXX..XXXXXXX 100644
186
--- a/tcg/ppc/tcg-target-opc.h.inc
187
+++ b/tcg/ppc/tcg-target-opc.h.inc
188
@@ -XXX,XX +XXX,XX @@
189
* consider these to be UNSPEC with names.
190
*/
191
192
-DEF(ppc_mrgh_vec, 1, 2, 0, IMPLVEC)
193
-DEF(ppc_mrgl_vec, 1, 2, 0, IMPLVEC)
194
-DEF(ppc_msum_vec, 1, 3, 0, IMPLVEC)
195
-DEF(ppc_muleu_vec, 1, 2, 0, IMPLVEC)
196
-DEF(ppc_mulou_vec, 1, 2, 0, IMPLVEC)
197
-DEF(ppc_pkum_vec, 1, 2, 0, IMPLVEC)
198
+DEF(ppc_mrgh_vec, 1, 2, 0, TCG_OPF_VECTOR)
199
+DEF(ppc_mrgl_vec, 1, 2, 0, TCG_OPF_VECTOR)
200
+DEF(ppc_msum_vec, 1, 3, 0, TCG_OPF_VECTOR)
201
+DEF(ppc_muleu_vec, 1, 2, 0, TCG_OPF_VECTOR)
202
+DEF(ppc_mulou_vec, 1, 2, 0, TCG_OPF_VECTOR)
203
+DEF(ppc_pkum_vec, 1, 2, 0, TCG_OPF_VECTOR)
204
diff --git a/tcg/s390x/tcg-target-opc.h.inc b/tcg/s390x/tcg-target-opc.h.inc
205
index XXXXXXX..XXXXXXX 100644
206
--- a/tcg/s390x/tcg-target-opc.h.inc
207
+++ b/tcg/s390x/tcg-target-opc.h.inc
208
@@ -XXX,XX +XXX,XX @@
209
* emitted by tcg_expand_vec_op. For those familiar with GCC internals,
210
* consider these to be UNSPEC with names.
211
*/
212
-DEF(s390_vuph_vec, 1, 1, 0, IMPLVEC)
213
-DEF(s390_vupl_vec, 1, 1, 0, IMPLVEC)
214
-DEF(s390_vpks_vec, 1, 2, 0, IMPLVEC)
215
+DEF(s390_vuph_vec, 1, 1, 0, TCG_OPF_VECTOR)
216
+DEF(s390_vupl_vec, 1, 1, 0, TCG_OPF_VECTOR)
217
+DEF(s390_vpks_vec, 1, 2, 0, TCG_OPF_VECTOR)
218
--
219
2.43.0
220
221
diff view generated by jsdifflib
New patch
1
We always provide bswap subroutines, whether they are optimized
2
using mips32r2 when available or not.
1
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/mips/tcg-target-has.h | 8 ++++----
8
1 file changed, 4 insertions(+), 4 deletions(-)
9
10
diff --git a/tcg/mips/tcg-target-has.h b/tcg/mips/tcg-target-has.h
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/mips/tcg-target-has.h
13
+++ b/tcg/mips/tcg-target-has.h
14
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
15
#define TCG_TARGET_HAS_muls2_i32 (!use_mips32r6_instructions)
16
#define TCG_TARGET_HAS_muluh_i32 1
17
#define TCG_TARGET_HAS_mulsh_i32 1
18
+#define TCG_TARGET_HAS_bswap16_i32 1
19
#define TCG_TARGET_HAS_bswap32_i32 1
20
#define TCG_TARGET_HAS_negsetcond_i32 0
21
22
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
23
#endif
24
25
/* optional instructions detected at runtime */
26
-#define TCG_TARGET_HAS_bswap16_i32 use_mips32r2_instructions
27
#define TCG_TARGET_HAS_deposit_i32 use_mips32r2_instructions
28
#define TCG_TARGET_HAS_extract_i32 use_mips32r2_instructions
29
#define TCG_TARGET_HAS_sextract_i32 0
30
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
31
#define TCG_TARGET_HAS_qemu_st8_i32 0
32
33
#if TCG_TARGET_REG_BITS == 64
34
-#define TCG_TARGET_HAS_bswap16_i64 use_mips32r2_instructions
35
-#define TCG_TARGET_HAS_bswap32_i64 use_mips32r2_instructions
36
-#define TCG_TARGET_HAS_bswap64_i64 use_mips32r2_instructions
37
+#define TCG_TARGET_HAS_bswap16_i64 1
38
+#define TCG_TARGET_HAS_bswap32_i64 1
39
+#define TCG_TARGET_HAS_bswap64_i64 1
40
#define TCG_TARGET_HAS_deposit_i64 use_mips32r2_instructions
41
#define TCG_TARGET_HAS_extract_i64 use_mips32r2_instructions
42
#define TCG_TARGET_HAS_sextract_i64 0
43
--
44
2.43.0
45
46
diff view generated by jsdifflib
1
Two copy-paste errors walking the parse tree.
1
When we generalize {s}extract_i32, we'll lose the
2
specific register constraints on ext8u and ext8s.
3
It's just as easy to emit a couple of insns instead.
2
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
---
7
---
5
scripts/decodetree.py | 4 ++--
8
tcg/i386/tcg-target.c.inc | 23 +++++++++++++++++++----
6
1 file changed, 2 insertions(+), 2 deletions(-)
9
1 file changed, 19 insertions(+), 4 deletions(-)
7
10
8
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
11
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
9
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
10
--- a/scripts/decodetree.py
13
--- a/tcg/i386/tcg-target.c.inc
11
+++ b/scripts/decodetree.py
14
+++ b/tcg/i386/tcg-target.c.inc
12
@@ -XXX,XX +XXX,XX @@ def build_tree(self):
15
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_rolw_8(TCGContext *s, int reg)
13
16
14
def prop_format(self):
17
static void tcg_out_ext8u(TCGContext *s, TCGReg dest, TCGReg src)
15
for p in self.pats:
18
{
16
- p.build_tree()
19
- /* movzbl */
17
+ p.prop_format()
20
- tcg_debug_assert(src < 4 || TCG_TARGET_REG_BITS == 64);
18
21
+ if (TCG_TARGET_REG_BITS == 32 && src >= 4) {
19
def prop_width(self):
22
+ tcg_out_mov(s, TCG_TYPE_I32, dest, src);
20
width = None
23
+ if (dest >= 4) {
21
@@ -XXX,XX +XXX,XX @@ def __build_tree(pats, outerbits, outermask):
24
+ tcg_out_modrm(s, OPC_ARITH_EvIz, ARITH_AND, dest);
22
return t
25
+ tcg_out32(s, 0xff);
23
26
+ return;
24
def build_tree(self):
27
+ }
25
- super().prop_format()
28
+ src = dest;
26
+ super().build_tree()
29
+ }
27
self.tree = self.__build_tree(self.pats, self.fixedbits,
30
tcg_out_modrm(s, OPC_MOVZBL + P_REXB_RM, dest, src);
28
self.fixedmask)
31
}
32
33
static void tcg_out_ext8s(TCGContext *s, TCGType type, TCGReg dest, TCGReg src)
34
{
35
int rexw = type == TCG_TYPE_I32 ? 0 : P_REXW;
36
- /* movsbl */
37
- tcg_debug_assert(src < 4 || TCG_TARGET_REG_BITS == 64);
38
+
39
+ if (TCG_TARGET_REG_BITS == 32 && src >= 4) {
40
+ tcg_out_mov(s, TCG_TYPE_I32, dest, src);
41
+ if (dest >= 4) {
42
+ tcg_out_shifti(s, SHIFT_SHL, dest, 24);
43
+ tcg_out_shifti(s, SHIFT_SAR, dest, 24);
44
+ return;
45
+ }
46
+ src = dest;
47
+ }
48
tcg_out_modrm(s, OPC_MOVSBL + P_REXB_RM + rexw, dest, src);
49
}
29
50
30
--
51
--
31
2.34.1
52
2.43.0
53
54
diff view generated by jsdifflib
New patch
1
1
Accept byte and word extensions with the extract opcodes.
2
This is preparatory to removing the specialized extracts.
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/i386/tcg-target-has.h | 49 +++++++++++++++++++++++++++----
8
tcg/tcg-has.h | 12 +++++---
9
tcg/optimize.c | 8 +++--
10
tcg/tcg-op.c | 12 +++-----
11
tcg/i386/tcg-target.c.inc | 62 +++++++++++++++++++++++++++++----------
12
5 files changed, 107 insertions(+), 36 deletions(-)
13
14
diff --git a/tcg/i386/tcg-target-has.h b/tcg/i386/tcg-target-has.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/tcg/i386/tcg-target-has.h
17
+++ b/tcg/i386/tcg-target-has.h
18
@@ -XXX,XX +XXX,XX @@
19
#define TCG_TARGET_HAS_ctpop_i64 have_popcnt
20
#define TCG_TARGET_HAS_deposit_i64 1
21
#define TCG_TARGET_HAS_extract_i64 1
22
-#define TCG_TARGET_HAS_sextract_i64 0
23
+#define TCG_TARGET_HAS_sextract_i64 1
24
#define TCG_TARGET_HAS_extract2_i64 1
25
#define TCG_TARGET_HAS_negsetcond_i64 1
26
#define TCG_TARGET_HAS_add2_i64 1
27
@@ -XXX,XX +XXX,XX @@
28
(TCG_TARGET_REG_BITS == 32 && (ofs) == 8 && (len) == 8))
29
#define TCG_TARGET_deposit_i64_valid TCG_TARGET_deposit_i32_valid
30
31
-/* Check for the possibility of high-byte extraction and, for 64-bit,
32
- zero-extending 32-bit right-shift. */
33
-#define TCG_TARGET_extract_i32_valid(ofs, len) ((ofs) == 8 && (len) == 8)
34
-#define TCG_TARGET_extract_i64_valid(ofs, len) \
35
- (((ofs) == 8 && (len) == 8) || ((ofs) + (len)) == 32)
36
+/*
37
+ * Check for the possibility of low byte/word extraction, high-byte extraction
38
+ * and zero-extending 32-bit right-shift.
39
+ *
40
+ * We cannot sign-extend from high byte to 64-bits without using the
41
+ * REX prefix that explicitly excludes access to the high-byte registers.
42
+ */
43
+static inline bool
44
+tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
45
+{
46
+ switch (ofs) {
47
+ case 0:
48
+ switch (len) {
49
+ case 8:
50
+ case 16:
51
+ return true;
52
+ case 32:
53
+ return type == TCG_TYPE_I64;
54
+ }
55
+ return false;
56
+ case 8:
57
+ return len == 8 && type == TCG_TYPE_I32;
58
+ }
59
+ return false;
60
+}
61
+#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
62
+
63
+static inline bool
64
+tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
65
+{
66
+ if (type == TCG_TYPE_I64 && ofs + len == 32) {
67
+ return true;
68
+ }
69
+ switch (ofs) {
70
+ case 0:
71
+ return len == 8 || len == 16;
72
+ case 8:
73
+ return len == 8;
74
+ }
75
+ return false;
76
+}
77
+#define TCG_TARGET_extract_valid tcg_target_extract_valid
78
79
#endif
80
diff --git a/tcg/tcg-has.h b/tcg/tcg-has.h
81
index XXXXXXX..XXXXXXX 100644
82
--- a/tcg/tcg-has.h
83
+++ b/tcg/tcg-has.h
84
@@ -XXX,XX +XXX,XX @@
85
#ifndef TCG_TARGET_deposit_i64_valid
86
#define TCG_TARGET_deposit_i64_valid(ofs, len) 1
87
#endif
88
-#ifndef TCG_TARGET_extract_i32_valid
89
-#define TCG_TARGET_extract_i32_valid(ofs, len) 1
90
+#ifndef TCG_TARGET_extract_valid
91
+#define TCG_TARGET_extract_valid(type, ofs, len) \
92
+ ((type) == TCG_TYPE_I32 ? TCG_TARGET_HAS_extract_i32 \
93
+ : TCG_TARGET_HAS_extract_i64)
94
#endif
95
-#ifndef TCG_TARGET_extract_i64_valid
96
-#define TCG_TARGET_extract_i64_valid(ofs, len) 1
97
+#ifndef TCG_TARGET_sextract_valid
98
+#define TCG_TARGET_sextract_valid(type, ofs, len) \
99
+ ((type) == TCG_TYPE_I32 ? TCG_TARGET_HAS_sextract_i32 \
100
+ : TCG_TARGET_HAS_sextract_i64)
101
#endif
102
103
/* Only one of DIV or DIV2 should be defined. */
104
diff --git a/tcg/optimize.c b/tcg/optimize.c
105
index XXXXXXX..XXXXXXX 100644
106
--- a/tcg/optimize.c
107
+++ b/tcg/optimize.c
108
@@ -XXX,XX +XXX,XX @@ static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
109
xor_opc = INDEX_op_xor_i32;
110
shr_opc = INDEX_op_shr_i32;
111
neg_opc = INDEX_op_neg_i32;
112
- if (TCG_TARGET_extract_i32_valid(sh, 1)) {
113
+ if (TCG_TARGET_extract_valid(TCG_TYPE_I32, sh, 1)) {
114
uext_opc = TCG_TARGET_HAS_extract_i32 ? INDEX_op_extract_i32 : 0;
115
+ }
116
+ if (TCG_TARGET_sextract_valid(TCG_TYPE_I32, sh, 1)) {
117
sext_opc = TCG_TARGET_HAS_sextract_i32 ? INDEX_op_sextract_i32 : 0;
118
}
119
break;
120
@@ -XXX,XX +XXX,XX @@ static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
121
xor_opc = INDEX_op_xor_i64;
122
shr_opc = INDEX_op_shr_i64;
123
neg_opc = INDEX_op_neg_i64;
124
- if (TCG_TARGET_extract_i64_valid(sh, 1)) {
125
+ if (TCG_TARGET_extract_valid(TCG_TYPE_I64, sh, 1)) {
126
uext_opc = TCG_TARGET_HAS_extract_i64 ? INDEX_op_extract_i64 : 0;
127
+ }
128
+ if (TCG_TARGET_sextract_valid(TCG_TYPE_I64, sh, 1)) {
129
sext_opc = TCG_TARGET_HAS_sextract_i64 ? INDEX_op_sextract_i64 : 0;
130
}
131
break;
132
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
133
index XXXXXXX..XXXXXXX 100644
134
--- a/tcg/tcg-op.c
135
+++ b/tcg/tcg-op.c
136
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extract_i32(TCGv_i32 ret, TCGv_i32 arg,
137
return;
138
}
139
140
- if (TCG_TARGET_HAS_extract_i32
141
- && TCG_TARGET_extract_i32_valid(ofs, len)) {
142
+ if (TCG_TARGET_extract_valid(TCG_TYPE_I32, ofs, len)) {
143
tcg_gen_op4ii_i32(INDEX_op_extract_i32, ret, arg, ofs, len);
144
return;
145
}
146
@@ -XXX,XX +XXX,XX @@ void tcg_gen_sextract_i32(TCGv_i32 ret, TCGv_i32 arg,
147
}
148
}
149
150
- if (TCG_TARGET_HAS_sextract_i32
151
- && TCG_TARGET_extract_i32_valid(ofs, len)) {
152
+ if (TCG_TARGET_sextract_valid(TCG_TYPE_I32, ofs, len)) {
153
tcg_gen_op4ii_i32(INDEX_op_sextract_i32, ret, arg, ofs, len);
154
return;
155
}
156
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extract_i64(TCGv_i64 ret, TCGv_i64 arg,
157
goto do_shift_and;
158
}
159
160
- if (TCG_TARGET_HAS_extract_i64
161
- && TCG_TARGET_extract_i64_valid(ofs, len)) {
162
+ if (TCG_TARGET_extract_valid(TCG_TYPE_I64, ofs, len)) {
163
tcg_gen_op4ii_i64(INDEX_op_extract_i64, ret, arg, ofs, len);
164
return;
165
}
166
@@ -XXX,XX +XXX,XX @@ void tcg_gen_sextract_i64(TCGv_i64 ret, TCGv_i64 arg,
167
return;
168
}
169
170
- if (TCG_TARGET_HAS_sextract_i64
171
- && TCG_TARGET_extract_i64_valid(ofs, len)) {
172
+ if (TCG_TARGET_sextract_valid(TCG_TYPE_I64, ofs, len)) {
173
tcg_gen_op4ii_i64(INDEX_op_sextract_i64, ret, arg, ofs, len);
174
return;
175
}
176
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
177
index XXXXXXX..XXXXXXX 100644
178
--- a/tcg/i386/tcg-target.c.inc
179
+++ b/tcg/i386/tcg-target.c.inc
180
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
181
182
case INDEX_op_extract_i64:
183
if (a2 + args[3] == 32) {
184
+ if (a2 == 0) {
185
+ tcg_out_ext32u(s, a0, a1);
186
+ break;
187
+ }
188
/* This is a 32-bit zero-extending right shift. */
189
tcg_out_mov(s, TCG_TYPE_I32, a0, a1);
190
tcg_out_shifti(s, SHIFT_SHR, a0, a2);
191
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
192
}
193
/* FALLTHRU */
194
case INDEX_op_extract_i32:
195
- /* On the off-chance that we can use the high-byte registers.
196
- Otherwise we emit the same ext16 + shift pattern that we
197
- would have gotten from the normal tcg-op.c expansion. */
198
- tcg_debug_assert(a2 == 8 && args[3] == 8);
199
- if (a1 < 4 && a0 < 8) {
200
- tcg_out_modrm(s, OPC_MOVZBL, a0, a1 + 4);
201
- } else {
202
+ if (a2 == 0 && args[3] == 8) {
203
+ tcg_out_ext8u(s, a0, a1);
204
+ } else if (a2 == 0 && args[3] == 16) {
205
tcg_out_ext16u(s, a0, a1);
206
- tcg_out_shifti(s, SHIFT_SHR, a0, 8);
207
+ } else if (a2 == 8 && args[3] == 8) {
208
+ /*
209
+ * On the off-chance that we can use the high-byte registers.
210
+ * Otherwise we emit the same ext16 + shift pattern that we
211
+ * would have gotten from the normal tcg-op.c expansion.
212
+ */
213
+ if (a1 < 4 && a0 < 8) {
214
+ tcg_out_modrm(s, OPC_MOVZBL, a0, a1 + 4);
215
+ } else {
216
+ tcg_out_ext16u(s, a0, a1);
217
+ tcg_out_shifti(s, SHIFT_SHR, a0, 8);
218
+ }
219
+ } else {
220
+ g_assert_not_reached();
221
+ }
222
+ break;
223
+
224
+ case INDEX_op_sextract_i64:
225
+ if (a2 == 0 && args[3] == 8) {
226
+ tcg_out_ext8s(s, TCG_TYPE_I64, a0, a1);
227
+ } else if (a2 == 0 && args[3] == 16) {
228
+ tcg_out_ext16s(s, TCG_TYPE_I64, a0, a1);
229
+ } else if (a2 == 0 && args[3] == 32) {
230
+ tcg_out_ext32s(s, a0, a1);
231
+ } else {
232
+ g_assert_not_reached();
233
}
234
break;
235
236
case INDEX_op_sextract_i32:
237
- /* We don't implement sextract_i64, as we cannot sign-extend to
238
- 64-bits without using the REX prefix that explicitly excludes
239
- access to the high-byte registers. */
240
- tcg_debug_assert(a2 == 8 && args[3] == 8);
241
- if (a1 < 4 && a0 < 8) {
242
- tcg_out_modrm(s, OPC_MOVSBL, a0, a1 + 4);
243
- } else {
244
+ if (a2 == 0 && args[3] == 8) {
245
+ tcg_out_ext8s(s, TCG_TYPE_I32, a0, a1);
246
+ } else if (a2 == 0 && args[3] == 16) {
247
tcg_out_ext16s(s, TCG_TYPE_I32, a0, a1);
248
- tcg_out_shifti(s, SHIFT_SAR, a0, 8);
249
+ } else if (a2 == 8 && args[3] == 8) {
250
+ if (a1 < 4 && a0 < 8) {
251
+ tcg_out_modrm(s, OPC_MOVSBL, a0, a1 + 4);
252
+ } else {
253
+ tcg_out_ext16s(s, TCG_TYPE_I32, a0, a1);
254
+ tcg_out_shifti(s, SHIFT_SAR, a0, 8);
255
+ }
256
+ } else {
257
+ g_assert_not_reached();
258
}
259
break;
260
261
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
262
case INDEX_op_extract_i32:
263
case INDEX_op_extract_i64:
264
case INDEX_op_sextract_i32:
265
+ case INDEX_op_sextract_i64:
266
case INDEX_op_ctpop_i32:
267
case INDEX_op_ctpop_i64:
268
return C_O1_I1(r, r);
269
--
270
2.43.0
271
272
diff view generated by jsdifflib
New patch
1
Trivially mirrors TCG_TARGET_HAS_{s}extract_*.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
tcg/aarch64/tcg-target-has.h | 3 +++
7
1 file changed, 3 insertions(+)
8
9
diff --git a/tcg/aarch64/tcg-target-has.h b/tcg/aarch64/tcg-target-has.h
10
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/aarch64/tcg-target-has.h
12
+++ b/tcg/aarch64/tcg-target-has.h
13
@@ -XXX,XX +XXX,XX @@
14
#define TCG_TARGET_HAS_cmpsel_vec 0
15
#define TCG_TARGET_HAS_tst_vec 1
16
17
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
18
+#define TCG_TARGET_sextract_valid(type, ofs, len) 1
19
+
20
#endif
21
--
22
2.43.0
23
24
diff view generated by jsdifflib
1
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
1
We're about to change canonicalization of masks as extract
2
instead of and. Retain the andi expansion here.
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
6
---
4
tcg/aarch64/tcg-target.c.inc | 9 +++++++--
7
tcg/aarch64/tcg-target.c.inc | 7 ++++++-
5
1 file changed, 7 insertions(+), 2 deletions(-)
8
1 file changed, 6 insertions(+), 1 deletion(-)
6
9
7
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
10
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
8
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/aarch64/tcg-target.c.inc
12
--- a/tcg/aarch64/tcg-target.c.inc
10
+++ b/tcg/aarch64/tcg-target.c.inc
13
+++ b/tcg/aarch64/tcg-target.c.inc
11
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_reg_alloc_order[] = {
14
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
12
15
13
TCG_REG_X8, TCG_REG_X9, TCG_REG_X10, TCG_REG_X11,
16
case INDEX_op_extract_i64:
14
TCG_REG_X12, TCG_REG_X13, TCG_REG_X14, TCG_REG_X15,
17
case INDEX_op_extract_i32:
15
- TCG_REG_X16, TCG_REG_X17,
18
- tcg_out_ubfm(s, ext, a0, a1, a2, a2 + args[3] - 1);
16
19
+ if (a2 == 0) {
17
TCG_REG_X0, TCG_REG_X1, TCG_REG_X2, TCG_REG_X3,
20
+ uint64_t mask = MAKE_64BIT_MASK(0, args[3]);
18
TCG_REG_X4, TCG_REG_X5, TCG_REG_X6, TCG_REG_X7,
21
+ tcg_out_logicali(s, I3404_ANDI, ext, a0, a1, mask);
19
22
+ } else {
20
+ /* X16 reserved as temporary */
23
+ tcg_out_ubfm(s, ext, a0, a1, a2, a2 + args[3] - 1);
21
+ /* X17 reserved as temporary */
24
+ }
22
/* X18 reserved by system */
25
break;
23
/* X19 reserved for AREG0 */
26
24
/* X29 reserved as fp */
27
case INDEX_op_sextract_i64:
25
@@ -XXX,XX +XXX,XX @@ static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
26
return TCG_REG_X0 + slot;
27
}
28
29
-#define TCG_REG_TMP0 TCG_REG_X30
30
+#define TCG_REG_TMP0 TCG_REG_X16
31
+#define TCG_REG_TMP1 TCG_REG_X17
32
+#define TCG_REG_TMP2 TCG_REG_X30
33
#define TCG_VEC_TMP0 TCG_REG_V31
34
35
#ifndef CONFIG_SOFTMMU
36
@@ -XXX,XX +XXX,XX @@ static void tcg_target_init(TCGContext *s)
37
tcg_regset_set_reg(s->reserved_regs, TCG_REG_FP);
38
tcg_regset_set_reg(s->reserved_regs, TCG_REG_X18); /* platform register */
39
tcg_regset_set_reg(s->reserved_regs, TCG_REG_TMP0);
40
+ tcg_regset_set_reg(s->reserved_regs, TCG_REG_TMP1);
41
+ tcg_regset_set_reg(s->reserved_regs, TCG_REG_TMP2);
42
tcg_regset_set_reg(s->reserved_regs, TCG_VEC_TMP0);
43
}
44
45
--
28
--
46
2.34.1
29
2.43.0
30
31
diff view generated by jsdifflib
1
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
1
The armv6 uxt and sxt opcodes have a 2-bit rotate field
2
which supports extractions from ofs = {0,8,16,24}.
3
Special case ofs = 0, len <= 8 as AND.
4
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
7
---
4
host/include/generic/host/store-insert-al16.h | 50 +++++++++++++++++++
8
tcg/arm/tcg-target-has.h | 21 ++++++++++++++--
5
accel/tcg/ldst_atomicity.c.inc | 40 +--------------
9
tcg/arm/tcg-target.c.inc | 54 +++++++++++++++++++++++++++++++++++-----
6
2 files changed, 51 insertions(+), 39 deletions(-)
10
2 files changed, 67 insertions(+), 8 deletions(-)
7
create mode 100644 host/include/generic/host/store-insert-al16.h
8
11
9
diff --git a/host/include/generic/host/store-insert-al16.h b/host/include/generic/host/store-insert-al16.h
12
diff --git a/tcg/arm/tcg-target-has.h b/tcg/arm/tcg-target-has.h
10
new file mode 100644
13
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX
14
--- a/tcg/arm/tcg-target-has.h
12
--- /dev/null
15
+++ b/tcg/arm/tcg-target-has.h
13
+++ b/host/include/generic/host/store-insert-al16.h
16
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
14
@@ -XXX,XX +XXX,XX @@
17
#define TCG_TARGET_HAS_ctz_i32 use_armv7_instructions
15
+/*
18
#define TCG_TARGET_HAS_ctpop_i32 0
16
+ * SPDX-License-Identifier: GPL-2.0-or-later
19
#define TCG_TARGET_HAS_deposit_i32 use_armv7_instructions
17
+ * Atomic store insert into 128-bit, generic version.
20
-#define TCG_TARGET_HAS_extract_i32 use_armv7_instructions
18
+ *
21
-#define TCG_TARGET_HAS_sextract_i32 use_armv7_instructions
19
+ * Copyright (C) 2023 Linaro, Ltd.
22
+#define TCG_TARGET_HAS_extract_i32 1
20
+ */
23
+#define TCG_TARGET_HAS_sextract_i32 1
21
+
24
#define TCG_TARGET_HAS_extract2_i32 1
22
+#ifndef HOST_STORE_INSERT_AL16_H
25
#define TCG_TARGET_HAS_negsetcond_i32 1
23
+#define HOST_STORE_INSERT_AL16_H
26
#define TCG_TARGET_HAS_mulu2_i32 1
24
+
27
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
25
+/**
28
#define TCG_TARGET_HAS_cmpsel_vec 0
26
+ * store_atom_insert_al16:
29
#define TCG_TARGET_HAS_tst_vec 1
27
+ * @p: host address
30
28
+ * @val: shifted value to store
31
+static inline bool
29
+ * @msk: mask for value to store
32
+tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
30
+ *
31
+ * Atomically store @val to @p masked by @msk.
32
+ */
33
+static inline void ATTRIBUTE_ATOMIC128_OPT
34
+store_atom_insert_al16(Int128 *ps, Int128 val, Int128 msk)
35
+{
33
+{
36
+#if defined(CONFIG_ATOMIC128)
34
+ if (use_armv7_instructions) {
37
+ __uint128_t *pu;
35
+ return true; /* SBFX or UBFX */
38
+ Int128Alias old, new;
36
+ }
39
+
37
+ switch (len) {
40
+ /* With CONFIG_ATOMIC128, we can avoid the memory barriers. */
38
+ case 8: /* SXTB or UXTB */
41
+ pu = __builtin_assume_aligned(ps, 16);
39
+ case 16: /* SXTH or UXTH */
42
+ old.u = *pu;
40
+ return (ofs % 8) == 0;
43
+ msk = int128_not(msk);
41
+ }
44
+ do {
42
+ return false;
45
+ new.s = int128_and(old.s, msk);
46
+ new.s = int128_or(new.s, val);
47
+ } while (!__atomic_compare_exchange_n(pu, &old.u, new.u, true,
48
+ __ATOMIC_RELAXED, __ATOMIC_RELAXED));
49
+#else
50
+ Int128 old, new, cmp;
51
+
52
+ ps = __builtin_assume_aligned(ps, 16);
53
+ old = *ps;
54
+ msk = int128_not(msk);
55
+ do {
56
+ cmp = old;
57
+ new = int128_and(old, msk);
58
+ new = int128_or(new, val);
59
+ old = atomic16_cmpxchg(ps, cmp, new);
60
+ } while (int128_ne(cmp, old));
61
+#endif
62
+}
43
+}
63
+
44
+
64
+#endif /* HOST_STORE_INSERT_AL16_H */
45
+#define TCG_TARGET_extract_valid tcg_target_extract_valid
65
diff --git a/accel/tcg/ldst_atomicity.c.inc b/accel/tcg/ldst_atomicity.c.inc
46
+#define TCG_TARGET_sextract_valid tcg_target_extract_valid
47
+
48
#endif
49
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
66
index XXXXXXX..XXXXXXX 100644
50
index XXXXXXX..XXXXXXX 100644
67
--- a/accel/tcg/ldst_atomicity.c.inc
51
--- a/tcg/arm/tcg-target.c.inc
68
+++ b/accel/tcg/ldst_atomicity.c.inc
52
+++ b/tcg/arm/tcg-target.c.inc
69
@@ -XXX,XX +XXX,XX @@
53
@@ -XXX,XX +XXX,XX @@ static void tcg_out_deposit(TCGContext *s, ARMCond cond, TCGReg rd,
70
*/
54
static void tcg_out_extract(TCGContext *s, ARMCond cond, TCGReg rd,
71
55
TCGReg rn, int ofs, int len)
72
#include "host/load-extract-al16-al8.h"
56
{
73
+#include "host/store-insert-al16.h"
57
- /* ubfx */
74
58
- tcg_out32(s, 0x07e00050 | (cond << 28) | (rd << 12) | rn
75
#ifdef CONFIG_ATOMIC64
59
- | (ofs << 7) | ((len - 1) << 16));
76
# define HAVE_al8 true
60
+ /* According to gcc, AND can be faster. */
77
@@ -XXX,XX +XXX,XX @@ static void store_atom_insert_al8(uint64_t *p, uint64_t val, uint64_t msk)
61
+ if (ofs == 0 && len <= 8) {
78
__ATOMIC_RELAXED, __ATOMIC_RELAXED));
62
+ tcg_out_dat_imm(s, cond, ARITH_AND, rd, rn,
63
+ encode_imm_nofail((1 << len) - 1));
64
+ return;
65
+ }
66
+
67
+ if (use_armv7_instructions) {
68
+ /* ubfx */
69
+ tcg_out32(s, 0x07e00050 | (cond << 28) | (rd << 12) | rn
70
+ | (ofs << 7) | ((len - 1) << 16));
71
+ return;
72
+ }
73
+
74
+ assert(ofs % 8 == 0);
75
+ switch (len) {
76
+ case 8:
77
+ /* uxtb */
78
+ tcg_out32(s, 0x06ef0070 | (cond << 28) | (rd << 12) | (ofs << 7) | rn);
79
+ break;
80
+ case 16:
81
+ /* uxth */
82
+ tcg_out32(s, 0x06ff0070 | (cond << 28) | (rd << 12) | (ofs << 7) | rn);
83
+ break;
84
+ default:
85
+ g_assert_not_reached();
86
+ }
79
}
87
}
80
88
81
-/**
89
static void tcg_out_sextract(TCGContext *s, ARMCond cond, TCGReg rd,
82
- * store_atom_insert_al16:
90
TCGReg rn, int ofs, int len)
83
- * @p: host address
91
{
84
- * @val: shifted value to store
92
- /* sbfx */
85
- * @msk: mask for value to store
93
- tcg_out32(s, 0x07a00050 | (cond << 28) | (rd << 12) | rn
86
- *
94
- | (ofs << 7) | ((len - 1) << 16));
87
- * Atomically store @val to @p masked by @msk.
95
+ if (use_armv7_instructions) {
88
- */
96
+ /* sbfx */
89
-static void ATTRIBUTE_ATOMIC128_OPT
97
+ tcg_out32(s, 0x07a00050 | (cond << 28) | (rd << 12) | rn
90
-store_atom_insert_al16(Int128 *ps, Int128Alias val, Int128Alias msk)
98
+ | (ofs << 7) | ((len - 1) << 16));
91
-{
99
+ return;
92
-#if defined(CONFIG_ATOMIC128)
100
+ }
93
- __uint128_t *pu, old, new;
101
+
94
-
102
+ assert(ofs % 8 == 0);
95
- /* With CONFIG_ATOMIC128, we can avoid the memory barriers. */
103
+ switch (len) {
96
- pu = __builtin_assume_aligned(ps, 16);
104
+ case 8:
97
- old = *pu;
105
+ /* sxtb */
98
- do {
106
+ tcg_out32(s, 0x06af0070 | (cond << 28) | (rd << 12) | (ofs << 7) | rn);
99
- new = (old & ~msk.u) | val.u;
107
+ break;
100
- } while (!__atomic_compare_exchange_n(pu, &old, new, true,
108
+ case 16:
101
- __ATOMIC_RELAXED, __ATOMIC_RELAXED));
109
+ /* sxth */
102
-#elif defined(CONFIG_CMPXCHG128)
110
+ tcg_out32(s, 0x06bf0070 | (cond << 28) | (rd << 12) | (ofs << 7) | rn);
103
- __uint128_t *pu, old, new;
111
+ break;
104
-
112
+ default:
105
- /*
113
+ g_assert_not_reached();
106
- * Without CONFIG_ATOMIC128, __atomic_compare_exchange_n will always
114
+ }
107
- * defer to libatomic, so we must use __sync_*_compare_and_swap_16
115
}
108
- * and accept the sequential consistency that comes with it.
116
109
- */
117
+
110
- pu = __builtin_assume_aligned(ps, 16);
118
static void tcg_out_ld32u(TCGContext *s, ARMCond cond,
111
- do {
119
TCGReg rd, TCGReg rn, int32_t offset)
112
- old = *pu;
120
{
113
- new = (old & ~msk.u) | val.u;
114
- } while (!__sync_bool_compare_and_swap_16(pu, old, new));
115
-#else
116
- qemu_build_not_reached();
117
-#endif
118
-}
119
-
120
/**
121
* store_bytes_leN:
122
* @pv: host address
123
--
121
--
124
2.34.1
122
2.43.0
123
124
diff view generated by jsdifflib
New patch
1
Accept byte and word extensions with the extract opcodes.
2
This is preparatory to removing the specialized extracts.
1
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/loongarch64/tcg-target-has.h | 15 ++++++++++++--
8
tcg/loongarch64/tcg-target.c.inc | 34 ++++++++++++++++++++++++++++++--
9
2 files changed, 45 insertions(+), 4 deletions(-)
10
11
diff --git a/tcg/loongarch64/tcg-target-has.h b/tcg/loongarch64/tcg-target-has.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/loongarch64/tcg-target-has.h
14
+++ b/tcg/loongarch64/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@
16
#define TCG_TARGET_HAS_rot_i32 1
17
#define TCG_TARGET_HAS_deposit_i32 1
18
#define TCG_TARGET_HAS_extract_i32 1
19
-#define TCG_TARGET_HAS_sextract_i32 0
20
+#define TCG_TARGET_HAS_sextract_i32 1
21
#define TCG_TARGET_HAS_extract2_i32 0
22
#define TCG_TARGET_HAS_add2_i32 0
23
#define TCG_TARGET_HAS_sub2_i32 0
24
@@ -XXX,XX +XXX,XX @@
25
#define TCG_TARGET_HAS_rot_i64 1
26
#define TCG_TARGET_HAS_deposit_i64 1
27
#define TCG_TARGET_HAS_extract_i64 1
28
-#define TCG_TARGET_HAS_sextract_i64 0
29
+#define TCG_TARGET_HAS_sextract_i64 1
30
#define TCG_TARGET_HAS_extract2_i64 0
31
#define TCG_TARGET_HAS_extr_i64_i32 1
32
#define TCG_TARGET_HAS_ext8s_i64 1
33
@@ -XXX,XX +XXX,XX @@
34
#define TCG_TARGET_HAS_cmpsel_vec 0
35
#define TCG_TARGET_HAS_tst_vec 0
36
37
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
38
+
39
+static inline bool
40
+tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
41
+{
42
+ if (type == TCG_TYPE_I64 && ofs + len == 32) {
43
+ return true;
44
+ }
45
+ return ofs == 0 && (len == 8 || len == 16);
46
+}
47
+#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
48
49
#endif
50
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
51
index XXXXXXX..XXXXXXX 100644
52
--- a/tcg/loongarch64/tcg-target.c.inc
53
+++ b/tcg/loongarch64/tcg-target.c.inc
54
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
55
break;
56
57
case INDEX_op_extract_i32:
58
- tcg_out_opc_bstrpick_w(s, a0, a1, a2, a2 + args[3] - 1);
59
+ if (a2 == 0 && args[3] <= 12) {
60
+ tcg_out_opc_andi(s, a0, a1, (1 << args[3]) - 1);
61
+ } else {
62
+ tcg_out_opc_bstrpick_w(s, a0, a1, a2, a2 + args[3] - 1);
63
+ }
64
break;
65
case INDEX_op_extract_i64:
66
- tcg_out_opc_bstrpick_d(s, a0, a1, a2, a2 + args[3] - 1);
67
+ if (a2 == 0 && args[3] <= 12) {
68
+ tcg_out_opc_andi(s, a0, a1, (1 << args[3]) - 1);
69
+ } else {
70
+ tcg_out_opc_bstrpick_d(s, a0, a1, a2, a2 + args[3] - 1);
71
+ }
72
+ break;
73
+
74
+ case INDEX_op_sextract_i64:
75
+ if (a2 + args[3] == 32) {
76
+ if (a2 == 0) {
77
+ tcg_out_ext32s(s, a0, a1);
78
+ } else {
79
+ tcg_out_opc_srai_w(s, a0, a1, a2);
80
+ }
81
+ break;
82
+ }
83
+ /* FALLTHRU */
84
+ case INDEX_op_sextract_i32:
85
+ if (a2 == 0 && args[3] == 8) {
86
+ tcg_out_ext8s(s, TCG_TYPE_REG, a0, a1);
87
+ } else if (a2 == 0 && args[3] == 16) {
88
+ tcg_out_ext16s(s, TCG_TYPE_REG, a0, a1);
89
+ } else {
90
+ g_assert_not_reached();
91
+ }
92
break;
93
94
case INDEX_op_deposit_i32:
95
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
96
case INDEX_op_not_i64:
97
case INDEX_op_extract_i32:
98
case INDEX_op_extract_i64:
99
+ case INDEX_op_sextract_i32:
100
+ case INDEX_op_sextract_i64:
101
case INDEX_op_bswap16_i32:
102
case INDEX_op_bswap16_i64:
103
case INDEX_op_bswap32_i32:
104
--
105
2.43.0
106
107
diff view generated by jsdifflib
New patch
1
Accept AND, ext32u, ext32s extensions with the extract opcodes.
2
This is preparatory to removing the specialized extracts.
1
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/mips/tcg-target-has.h | 26 ++++++++++++++++++++++----
8
tcg/mips/tcg-target.c.inc | 33 ++++++++++++++++++++++++++++++---
9
2 files changed, 52 insertions(+), 7 deletions(-)
10
11
diff --git a/tcg/mips/tcg-target-has.h b/tcg/mips/tcg-target-has.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/mips/tcg-target-has.h
14
+++ b/tcg/mips/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
16
17
/* optional instructions detected at runtime */
18
#define TCG_TARGET_HAS_deposit_i32 use_mips32r2_instructions
19
-#define TCG_TARGET_HAS_extract_i32 use_mips32r2_instructions
20
-#define TCG_TARGET_HAS_sextract_i32 0
21
+#define TCG_TARGET_HAS_extract_i32 1
22
+#define TCG_TARGET_HAS_sextract_i32 1
23
#define TCG_TARGET_HAS_extract2_i32 0
24
#define TCG_TARGET_HAS_ext8s_i32 use_mips32r2_instructions
25
#define TCG_TARGET_HAS_ext16s_i32 use_mips32r2_instructions
26
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
27
#define TCG_TARGET_HAS_bswap32_i64 1
28
#define TCG_TARGET_HAS_bswap64_i64 1
29
#define TCG_TARGET_HAS_deposit_i64 use_mips32r2_instructions
30
-#define TCG_TARGET_HAS_extract_i64 use_mips32r2_instructions
31
-#define TCG_TARGET_HAS_sextract_i64 0
32
+#define TCG_TARGET_HAS_extract_i64 1
33
+#define TCG_TARGET_HAS_sextract_i64 1
34
#define TCG_TARGET_HAS_extract2_i64 0
35
#define TCG_TARGET_HAS_ext8s_i64 use_mips32r2_instructions
36
#define TCG_TARGET_HAS_ext16s_i64 use_mips32r2_instructions
37
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
38
#define TCG_TARGET_HAS_qemu_ldst_i128 0
39
#define TCG_TARGET_HAS_tst 0
40
41
+#define TCG_TARGET_extract_valid(type, ofs, len) use_mips32r2_instructions
42
+
43
+static inline bool
44
+tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
45
+{
46
+ if (ofs == 0) {
47
+ switch (len) {
48
+ case 8:
49
+ case 16:
50
+ return use_mips32r2_instructions;
51
+ case 32:
52
+ return type == TCG_TYPE_I64;
53
+ }
54
+ }
55
+ return false;
56
+}
57
+#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
58
+
59
#endif
60
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
61
index XXXXXXX..XXXXXXX 100644
62
--- a/tcg/mips/tcg-target.c.inc
63
+++ b/tcg/mips/tcg-target.c.inc
64
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
65
tcg_out_opc_bf64(s, OPC_DINS, OPC_DINSM, OPC_DINSU, a0, a2,
66
args[3] + args[4] - 1, args[3]);
67
break;
68
+
69
case INDEX_op_extract_i32:
70
- tcg_out_opc_bf(s, OPC_EXT, a0, a1, args[3] - 1, a2);
71
+ if (a2 == 0 && args[3] <= 16) {
72
+ tcg_out_opc_imm(s, OPC_ANDI, a0, a1, (1 << args[3]) - 1);
73
+ } else {
74
+ tcg_out_opc_bf(s, OPC_EXT, a0, a1, args[3] - 1, a2);
75
+ }
76
break;
77
case INDEX_op_extract_i64:
78
- tcg_out_opc_bf64(s, OPC_DEXT, OPC_DEXTM, OPC_DEXTU, a0, a1,
79
- args[3] - 1, a2);
80
+ if (a2 == 0 && args[3] <= 16) {
81
+ tcg_out_opc_imm(s, OPC_ANDI, a0, a1, (1 << args[3]) - 1);
82
+ } else {
83
+ tcg_out_opc_bf64(s, OPC_DEXT, OPC_DEXTM, OPC_DEXTU,
84
+ a0, a1, args[3] - 1, a2);
85
+ }
86
+ break;
87
+
88
+ case INDEX_op_sextract_i64:
89
+ if (a2 == 0 && args[3] == 32) {
90
+ tcg_out_ext32s(s, a0, a1);
91
+ break;
92
+ }
93
+ /* FALLTHRU */
94
+ case INDEX_op_sextract_i32:
95
+ if (a2 == 0 && args[3] == 8) {
96
+ tcg_out_ext8s(s, TCG_TYPE_REG, a0, a1);
97
+ } else if (a2 == 0 && args[3] == 16) {
98
+ tcg_out_ext16s(s, TCG_TYPE_REG, a0, a1);
99
+ } else {
100
+ g_assert_not_reached();
101
+ }
102
break;
103
104
case INDEX_op_brcond_i32:
105
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
106
case INDEX_op_ext8s_i32:
107
case INDEX_op_ext16s_i32:
108
case INDEX_op_extract_i32:
109
+ case INDEX_op_sextract_i32:
110
case INDEX_op_ld8u_i64:
111
case INDEX_op_ld8s_i64:
112
case INDEX_op_ld16u_i64:
113
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
114
case INDEX_op_extrl_i64_i32:
115
case INDEX_op_extrh_i64_i32:
116
case INDEX_op_extract_i64:
117
+ case INDEX_op_sextract_i64:
118
return C_O1_I1(r, r);
119
120
case INDEX_op_st8_i32:
121
--
122
2.43.0
123
124
diff view generated by jsdifflib
New patch
1
Accept byte and word extensions with the extract opcodes.
2
This is preparatory to removing the specialized extracts.
1
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/ppc/tcg-target-has.h | 16 ++++++++++++++--
8
tcg/ppc/tcg-target.c.inc | 30 ++++++++++++++++++++++++++++++
9
2 files changed, 44 insertions(+), 2 deletions(-)
10
11
diff --git a/tcg/ppc/tcg-target-has.h b/tcg/ppc/tcg-target-has.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/ppc/tcg-target-has.h
14
+++ b/tcg/ppc/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@
16
#define TCG_TARGET_HAS_ctpop_i32 have_isa_2_06
17
#define TCG_TARGET_HAS_deposit_i32 1
18
#define TCG_TARGET_HAS_extract_i32 1
19
-#define TCG_TARGET_HAS_sextract_i32 0
20
+#define TCG_TARGET_HAS_sextract_i32 1
21
#define TCG_TARGET_HAS_extract2_i32 0
22
#define TCG_TARGET_HAS_negsetcond_i32 1
23
#define TCG_TARGET_HAS_mulu2_i32 0
24
@@ -XXX,XX +XXX,XX @@
25
#define TCG_TARGET_HAS_ctpop_i64 have_isa_2_06
26
#define TCG_TARGET_HAS_deposit_i64 1
27
#define TCG_TARGET_HAS_extract_i64 1
28
-#define TCG_TARGET_HAS_sextract_i64 0
29
+#define TCG_TARGET_HAS_sextract_i64 1
30
#define TCG_TARGET_HAS_extract2_i64 0
31
#define TCG_TARGET_HAS_negsetcond_i64 1
32
#define TCG_TARGET_HAS_add2_i64 1
33
@@ -XXX,XX +XXX,XX @@
34
#define TCG_TARGET_HAS_cmpsel_vec 1
35
#define TCG_TARGET_HAS_tst_vec 0
36
37
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
38
+
39
+static inline bool
40
+tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
41
+{
42
+ if (type == TCG_TYPE_I64 && ofs + len == 32) {
43
+ return true;
44
+ }
45
+ return ofs == 0 && (len == 8 || len == 16);
46
+}
47
+#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
48
+
49
#endif
50
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
51
index XXXXXXX..XXXXXXX 100644
52
--- a/tcg/ppc/tcg-target.c.inc
53
+++ b/tcg/ppc/tcg-target.c.inc
54
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
55
break;
56
57
case INDEX_op_extract_i32:
58
+ if (args[2] == 0 && args[3] <= 16) {
59
+ tcg_out32(s, ANDI | SAI(args[1], args[0], (1 << args[3]) - 1));
60
+ break;
61
+ }
62
tcg_out_rlw(s, RLWINM, args[0], args[1],
63
32 - args[2], 32 - args[3], 31);
64
break;
65
case INDEX_op_extract_i64:
66
+ if (args[2] == 0 && args[3] <= 16) {
67
+ tcg_out32(s, ANDI | SAI(args[1], args[0], (1 << args[3]) - 1));
68
+ break;
69
+ }
70
tcg_out_rld(s, RLDICL, args[0], args[1], 64 - args[2], 64 - args[3]);
71
break;
72
73
+ case INDEX_op_sextract_i64:
74
+ if (args[2] + args[3] == 32) {
75
+ if (args[2] == 0) {
76
+ tcg_out_ext32s(s, args[0], args[1]);
77
+ } else {
78
+ tcg_out_sari32(s, args[0], args[1], args[2]);
79
+ }
80
+ break;
81
+ }
82
+ /* FALLTHRU */
83
+ case INDEX_op_sextract_i32:
84
+ if (args[2] == 0 && args[3] == 8) {
85
+ tcg_out_ext8s(s, TCG_TYPE_I32, args[0], args[1]);
86
+ } else if (args[2] == 0 && args[3] == 16) {
87
+ tcg_out_ext16s(s, TCG_TYPE_I32, args[0], args[1]);
88
+ } else {
89
+ g_assert_not_reached();
90
+ }
91
+ break;
92
+
93
case INDEX_op_movcond_i32:
94
tcg_out_movcond(s, TCG_TYPE_I32, args[5], args[0], args[1], args[2],
95
args[3], args[4], const_args[2]);
96
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
97
case INDEX_op_bswap16_i32:
98
case INDEX_op_bswap32_i32:
99
case INDEX_op_extract_i32:
100
+ case INDEX_op_sextract_i32:
101
case INDEX_op_ld8u_i64:
102
case INDEX_op_ld8s_i64:
103
case INDEX_op_ld16u_i64:
104
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
105
case INDEX_op_bswap32_i64:
106
case INDEX_op_bswap64_i64:
107
case INDEX_op_extract_i64:
108
+ case INDEX_op_sextract_i64:
109
return C_O1_I1(r, r);
110
111
case INDEX_op_st8_i32:
112
--
113
2.43.0
114
115
diff view generated by jsdifflib
New patch
1
Accept byte and word extensions with the extract opcodes.
2
This is preparatory to removing the specialized extracts.
1
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/riscv/tcg-target-has.h | 39 ++++++++++++++++++++++++++++++++++----
8
tcg/riscv/tcg-target.c.inc | 34 +++++++++++++++++++++++++++++++++
9
2 files changed, 69 insertions(+), 4 deletions(-)
10
11
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/riscv/tcg-target-has.h
14
+++ b/tcg/riscv/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@
16
#define TCG_TARGET_HAS_div2_i32 0
17
#define TCG_TARGET_HAS_rot_i32 (cpuinfo & CPUINFO_ZBB)
18
#define TCG_TARGET_HAS_deposit_i32 0
19
-#define TCG_TARGET_HAS_extract_i32 0
20
-#define TCG_TARGET_HAS_sextract_i32 0
21
+#define TCG_TARGET_HAS_extract_i32 1
22
+#define TCG_TARGET_HAS_sextract_i32 1
23
#define TCG_TARGET_HAS_extract2_i32 0
24
#define TCG_TARGET_HAS_add2_i32 1
25
#define TCG_TARGET_HAS_sub2_i32 1
26
@@ -XXX,XX +XXX,XX @@
27
#define TCG_TARGET_HAS_div2_i64 0
28
#define TCG_TARGET_HAS_rot_i64 (cpuinfo & CPUINFO_ZBB)
29
#define TCG_TARGET_HAS_deposit_i64 0
30
-#define TCG_TARGET_HAS_extract_i64 0
31
-#define TCG_TARGET_HAS_sextract_i64 0
32
+#define TCG_TARGET_HAS_extract_i64 1
33
+#define TCG_TARGET_HAS_sextract_i64 1
34
#define TCG_TARGET_HAS_extract2_i64 0
35
#define TCG_TARGET_HAS_extr_i64_i32 1
36
#define TCG_TARGET_HAS_ext8s_i64 1
37
@@ -XXX,XX +XXX,XX @@
38
39
#define TCG_TARGET_HAS_tst_vec 0
40
41
+static inline bool
42
+tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
43
+{
44
+ if (ofs == 0) {
45
+ switch (len) {
46
+ case 16:
47
+ return cpuinfo & CPUINFO_ZBB;
48
+ case 32:
49
+ return (cpuinfo & CPUINFO_ZBA) && type == TCG_TYPE_I64;
50
+ }
51
+ }
52
+ return false;
53
+}
54
+#define TCG_TARGET_extract_valid tcg_target_extract_valid
55
+
56
+static inline bool
57
+tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
58
+{
59
+ if (ofs == 0) {
60
+ switch (len) {
61
+ case 8:
62
+ case 16:
63
+ return cpuinfo & CPUINFO_ZBB;
64
+ case 32:
65
+ return type == TCG_TYPE_I64;
66
+ }
67
+ }
68
+ return false;
69
+}
70
+#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
71
+
72
#endif
73
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
74
index XXXXXXX..XXXXXXX 100644
75
--- a/tcg/riscv/tcg-target.c.inc
76
+++ b/tcg/riscv/tcg-target.c.inc
77
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
78
tcg_out_mb(s, a0);
79
break;
80
81
+ case INDEX_op_extract_i64:
82
+ if (a2 == 0 && args[3] == 32) {
83
+ tcg_out_ext32u(s, a0, a1);
84
+ break;
85
+ }
86
+ /* FALLTHRU */
87
+ case INDEX_op_extract_i32:
88
+ if (a2 == 0 && args[3] == 16) {
89
+ tcg_out_ext16u(s, a0, a1);
90
+ } else {
91
+ g_assert_not_reached();
92
+ }
93
+ break;
94
+
95
+ case INDEX_op_sextract_i64:
96
+ if (a2 == 0 && args[3] == 32) {
97
+ tcg_out_ext32s(s, a0, a1);
98
+ break;
99
+ }
100
+ /* FALLTHRU */
101
+ case INDEX_op_sextract_i32:
102
+ if (a2 == 0 && args[3] == 8) {
103
+ tcg_out_ext8s(s, TCG_TYPE_REG, a0, a1);
104
+ } else if (a2 == 0 && args[3] == 16) {
105
+ tcg_out_ext16s(s, TCG_TYPE_REG, a0, a1);
106
+ } else {
107
+ g_assert_not_reached();
108
+ }
109
+ break;
110
+
111
case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */
112
case INDEX_op_mov_i64:
113
case INDEX_op_call: /* Always emitted via tcg_out_call. */
114
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
115
case INDEX_op_extrl_i64_i32:
116
case INDEX_op_extrh_i64_i32:
117
case INDEX_op_ext_i32_i64:
118
+ case INDEX_op_extract_i32:
119
+ case INDEX_op_extract_i64:
120
+ case INDEX_op_sextract_i32:
121
+ case INDEX_op_sextract_i64:
122
case INDEX_op_bswap16_i32:
123
case INDEX_op_bswap32_i32:
124
case INDEX_op_bswap16_i64:
125
--
126
2.43.0
127
128
diff view generated by jsdifflib
New patch
1
Extracts which abut bit 32 may use 32-bit shifts.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
tcg/riscv/tcg-target-has.h | 24 +++++++-----------------
7
tcg/riscv/tcg-target.c.inc | 16 ++++++++++++----
8
2 files changed, 19 insertions(+), 21 deletions(-)
9
10
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/riscv/tcg-target-has.h
13
+++ b/tcg/riscv/tcg-target-has.h
14
@@ -XXX,XX +XXX,XX @@
15
static inline bool
16
tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
17
{
18
- if (ofs == 0) {
19
- switch (len) {
20
- case 16:
21
- return cpuinfo & CPUINFO_ZBB;
22
- case 32:
23
- return (cpuinfo & CPUINFO_ZBA) && type == TCG_TYPE_I64;
24
- }
25
+ if (type == TCG_TYPE_I64 && ofs + len == 32) {
26
+ /* ofs > 0 uses SRLIW; ofs == 0 uses add.uw. */
27
+ return ofs || (cpuinfo & CPUINFO_ZBA);
28
}
29
- return false;
30
+ return (cpuinfo & CPUINFO_ZBB) && ofs == 0 && len == 16;
31
}
32
#define TCG_TARGET_extract_valid tcg_target_extract_valid
33
34
static inline bool
35
tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
36
{
37
- if (ofs == 0) {
38
- switch (len) {
39
- case 8:
40
- case 16:
41
- return cpuinfo & CPUINFO_ZBB;
42
- case 32:
43
- return type == TCG_TYPE_I64;
44
- }
45
+ if (type == TCG_TYPE_I64 && ofs + len == 32) {
46
+ return true;
47
}
48
- return false;
49
+ return (cpuinfo & CPUINFO_ZBB) && ofs == 0 && (len == 8 || len == 16);
50
}
51
#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
52
53
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
54
index XXXXXXX..XXXXXXX 100644
55
--- a/tcg/riscv/tcg-target.c.inc
56
+++ b/tcg/riscv/tcg-target.c.inc
57
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
58
break;
59
60
case INDEX_op_extract_i64:
61
- if (a2 == 0 && args[3] == 32) {
62
- tcg_out_ext32u(s, a0, a1);
63
+ if (a2 + args[3] == 32) {
64
+ if (a2 == 0) {
65
+ tcg_out_ext32u(s, a0, a1);
66
+ } else {
67
+ tcg_out_opc_imm(s, OPC_SRLIW, a0, a1, a2);
68
+ }
69
break;
70
}
71
/* FALLTHRU */
72
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
73
break;
74
75
case INDEX_op_sextract_i64:
76
- if (a2 == 0 && args[3] == 32) {
77
- tcg_out_ext32s(s, a0, a1);
78
+ if (a2 + args[3] == 32) {
79
+ if (a2 == 0) {
80
+ tcg_out_ext32s(s, a0, a1);
81
+ } else {
82
+ tcg_out_opc_imm(s, OPC_SRAIW, a0, a1, a2);
83
+ }
84
break;
85
}
86
/* FALLTHRU */
87
--
88
2.43.0
89
90
diff view generated by jsdifflib
New patch
1
Accept byte and word extensions with the extract opcodes.
2
This is preparatory to removing the specialized extracts.
1
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/s390x/tcg-target-has.h | 22 ++++++++++++++++++++--
8
tcg/s390x/tcg-target.c.inc | 37 +++++++++++++++++++++++++++++++++++++
9
2 files changed, 57 insertions(+), 2 deletions(-)
10
11
diff --git a/tcg/s390x/tcg-target-has.h b/tcg/s390x/tcg-target-has.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/s390x/tcg-target-has.h
14
+++ b/tcg/s390x/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
16
#define TCG_TARGET_HAS_ctpop_i32 1
17
#define TCG_TARGET_HAS_deposit_i32 1
18
#define TCG_TARGET_HAS_extract_i32 1
19
-#define TCG_TARGET_HAS_sextract_i32 0
20
+#define TCG_TARGET_HAS_sextract_i32 1
21
#define TCG_TARGET_HAS_extract2_i32 0
22
#define TCG_TARGET_HAS_negsetcond_i32 1
23
#define TCG_TARGET_HAS_add2_i32 1
24
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
25
#define TCG_TARGET_HAS_ctpop_i64 1
26
#define TCG_TARGET_HAS_deposit_i64 1
27
#define TCG_TARGET_HAS_extract_i64 1
28
-#define TCG_TARGET_HAS_sextract_i64 0
29
+#define TCG_TARGET_HAS_sextract_i64 1
30
#define TCG_TARGET_HAS_extract2_i64 0
31
#define TCG_TARGET_HAS_negsetcond_i64 1
32
#define TCG_TARGET_HAS_add2_i64 1
33
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
34
#define TCG_TARGET_HAS_cmpsel_vec 1
35
#define TCG_TARGET_HAS_tst_vec 0
36
37
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
38
+
39
+static inline bool
40
+tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
41
+{
42
+ if (ofs == 0) {
43
+ switch (len) {
44
+ case 8:
45
+ case 16:
46
+ return true;
47
+ case 32:
48
+ return type == TCG_TYPE_I64;
49
+ }
50
+ }
51
+ return false;
52
+}
53
+#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
54
+
55
#endif
56
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
57
index XXXXXXX..XXXXXXX 100644
58
--- a/tcg/s390x/tcg-target.c.inc
59
+++ b/tcg/s390x/tcg-target.c.inc
60
@@ -XXX,XX +XXX,XX @@ static void tgen_deposit(TCGContext *s, TCGReg dest, TCGReg src,
61
static void tgen_extract(TCGContext *s, TCGReg dest, TCGReg src,
62
int ofs, int len)
63
{
64
+ if (ofs == 0) {
65
+ switch (len) {
66
+ case 8:
67
+ tcg_out_ext8u(s, dest, src);
68
+ return;
69
+ case 16:
70
+ tcg_out_ext16u(s, dest, src);
71
+ return;
72
+ case 32:
73
+ tcg_out_ext32u(s, dest, src);
74
+ return;
75
+ }
76
+ }
77
tcg_out_risbg(s, dest, src, 64 - len, 63, 64 - ofs, 1);
78
}
79
80
+static void tgen_sextract(TCGContext *s, TCGReg dest, TCGReg src,
81
+ int ofs, int len)
82
+{
83
+ if (ofs == 0) {
84
+ switch (len) {
85
+ case 8:
86
+ tcg_out_ext8s(s, TCG_TYPE_REG, dest, src);
87
+ return;
88
+ case 16:
89
+ tcg_out_ext16s(s, TCG_TYPE_REG, dest, src);
90
+ return;
91
+ case 32:
92
+ tcg_out_ext32s(s, dest, src);
93
+ return;
94
+ }
95
+ }
96
+ g_assert_not_reached();
97
+}
98
+
99
static void tgen_gotoi(TCGContext *s, int cc, const tcg_insn_unit *dest)
100
{
101
ptrdiff_t off = tcg_pcrel_diff(s, dest) >> 1;
102
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
103
OP_32_64(extract):
104
tgen_extract(s, args[0], args[1], args[2], args[3]);
105
break;
106
+ OP_32_64(sextract):
107
+ tgen_sextract(s, args[0], args[1], args[2], args[3]);
108
+ break;
109
110
case INDEX_op_clz_i64:
111
tgen_clz(s, args[0], args[1], args[2], const_args[2]);
112
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
113
case INDEX_op_extu_i32_i64:
114
case INDEX_op_extract_i32:
115
case INDEX_op_extract_i64:
116
+ case INDEX_op_sextract_i32:
117
+ case INDEX_op_sextract_i64:
118
case INDEX_op_ctpop_i32:
119
case INDEX_op_ctpop_i64:
120
return C_O1_I1(r, r);
121
--
122
2.43.0
123
124
diff view generated by jsdifflib
New patch
1
Extracts which abut bit 32 may use 32-bit shifts.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
tcg/sparc64/tcg-target-has.h | 13 +++++++++----
7
tcg/sparc64/tcg-target.c.inc | 11 +++++++++++
8
2 files changed, 20 insertions(+), 4 deletions(-)
9
10
diff --git a/tcg/sparc64/tcg-target-has.h b/tcg/sparc64/tcg-target-has.h
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/sparc64/tcg-target-has.h
13
+++ b/tcg/sparc64/tcg-target-has.h
14
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
15
#define TCG_TARGET_HAS_ctz_i32 0
16
#define TCG_TARGET_HAS_ctpop_i32 0
17
#define TCG_TARGET_HAS_deposit_i32 0
18
-#define TCG_TARGET_HAS_extract_i32 0
19
-#define TCG_TARGET_HAS_sextract_i32 0
20
+#define TCG_TARGET_HAS_extract_i32 1
21
+#define TCG_TARGET_HAS_sextract_i32 1
22
#define TCG_TARGET_HAS_extract2_i32 0
23
#define TCG_TARGET_HAS_negsetcond_i32 1
24
#define TCG_TARGET_HAS_add2_i32 1
25
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
26
#define TCG_TARGET_HAS_ctz_i64 0
27
#define TCG_TARGET_HAS_ctpop_i64 0
28
#define TCG_TARGET_HAS_deposit_i64 0
29
-#define TCG_TARGET_HAS_extract_i64 0
30
-#define TCG_TARGET_HAS_sextract_i64 0
31
+#define TCG_TARGET_HAS_extract_i64 1
32
+#define TCG_TARGET_HAS_sextract_i64 1
33
#define TCG_TARGET_HAS_extract2_i64 0
34
#define TCG_TARGET_HAS_negsetcond_i64 1
35
#define TCG_TARGET_HAS_add2_i64 1
36
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
37
38
#define TCG_TARGET_HAS_tst 1
39
40
+#define TCG_TARGET_extract_valid(type, ofs, len) \
41
+ ((type) == TCG_TYPE_I64 && (ofs) + (len) == 32)
42
+
43
+#define TCG_TARGET_sextract_valid TCG_TARGET_extract_valid
44
+
45
#endif
46
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
47
index XXXXXXX..XXXXXXX 100644
48
--- a/tcg/sparc64/tcg-target.c.inc
49
+++ b/tcg/sparc64/tcg-target.c.inc
50
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
51
tcg_out_mb(s, a0);
52
break;
53
54
+ case INDEX_op_extract_i64:
55
+ tcg_debug_assert(a2 + args[3] == 32);
56
+ tcg_out_arithi(s, a0, a1, a2, SHIFT_SRL);
57
+ break;
58
+ case INDEX_op_sextract_i64:
59
+ tcg_debug_assert(a2 + args[3] == 32);
60
+ tcg_out_arithi(s, a0, a1, a2, SHIFT_SRA);
61
+ break;
62
+
63
case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */
64
case INDEX_op_mov_i64:
65
case INDEX_op_call: /* Always emitted via tcg_out_call. */
66
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
67
case INDEX_op_ext32u_i64:
68
case INDEX_op_ext_i32_i64:
69
case INDEX_op_extu_i32_i64:
70
+ case INDEX_op_extract_i64:
71
+ case INDEX_op_sextract_i64:
72
case INDEX_op_qemu_ld_a32_i32:
73
case INDEX_op_qemu_ld_a64_i32:
74
case INDEX_op_qemu_ld_a32_i64:
75
--
76
2.43.0
77
78
diff view generated by jsdifflib
1
PAGE_WRITE is current writability, as modified by TB protection;
1
Trivially mirrors TCG_TARGET_HAS_{s}extract_*.
2
PAGE_WRITE_ORG is the original page writability.
3
2
4
Fixes: cdfac37be0d ("accel/tcg: Honor atomicity of loads")
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
5
---
8
accel/tcg/ldst_atomicity.c.inc | 4 ++--
6
tcg/tci/tcg-target-has.h | 3 +++
9
1 file changed, 2 insertions(+), 2 deletions(-)
7
1 file changed, 3 insertions(+)
10
8
11
diff --git a/accel/tcg/ldst_atomicity.c.inc b/accel/tcg/ldst_atomicity.c.inc
9
diff --git a/tcg/tci/tcg-target-has.h b/tcg/tci/tcg-target-has.h
12
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
13
--- a/accel/tcg/ldst_atomicity.c.inc
11
--- a/tcg/tci/tcg-target-has.h
14
+++ b/accel/tcg/ldst_atomicity.c.inc
12
+++ b/tcg/tci/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@ static uint64_t load_atomic8_or_exit(CPUArchState *env, uintptr_t ra, void *pv)
13
@@ -XXX,XX +XXX,XX @@
16
* another process, because the fallback start_exclusive solution
14
17
* provides no protection across processes.
15
#define TCG_TARGET_HAS_tst 1
18
*/
16
19
- if (!page_check_range(h2g(pv), 8, PAGE_WRITE)) {
17
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
20
+ if (!page_check_range(h2g(pv), 8, PAGE_WRITE_ORG)) {
18
+#define TCG_TARGET_sextract_valid(type, ofs, len) 1
21
uint64_t *p = __builtin_assume_aligned(pv, 8);
19
+
22
return *p;
23
}
24
@@ -XXX,XX +XXX,XX @@ static Int128 load_atomic16_or_exit(CPUArchState *env, uintptr_t ra, void *pv)
25
* another process, because the fallback start_exclusive solution
26
* provides no protection across processes.
27
*/
28
- if (!page_check_range(h2g(p), 16, PAGE_WRITE)) {
29
+ if (!page_check_range(h2g(p), 16, PAGE_WRITE_ORG)) {
30
return *p;
31
}
32
#endif
20
#endif
33
--
21
--
34
2.34.1
22
2.43.0
23
24
diff view generated by jsdifflib
New patch
1
We already have these assertions during opcode creation.
1
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
tcg/tci/tcg-target.c.inc | 20 ++------------------
7
1 file changed, 2 insertions(+), 18 deletions(-)
8
9
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
10
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/tci/tcg-target.c.inc
12
+++ b/tcg/tci/tcg-target.c.inc
13
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
14
break;
15
16
CASE_32_64(deposit) /* Optional (TCG_TARGET_HAS_deposit_*). */
17
- {
18
- TCGArg pos = args[3], len = args[4];
19
- TCGArg max = opc == INDEX_op_deposit_i32 ? 32 : 64;
20
-
21
- tcg_debug_assert(pos < max);
22
- tcg_debug_assert(pos + len <= max);
23
-
24
- tcg_out_op_rrrbb(s, opc, args[0], args[1], args[2], pos, len);
25
- }
26
+ tcg_out_op_rrrbb(s, opc, args[0], args[1], args[2], args[3], args[4]);
27
break;
28
29
CASE_32_64(extract) /* Optional (TCG_TARGET_HAS_extract_*). */
30
CASE_32_64(sextract) /* Optional (TCG_TARGET_HAS_sextract_*). */
31
- {
32
- TCGArg pos = args[2], len = args[3];
33
- TCGArg max = type == TCG_TYPE_I32 ? 32 : 64;
34
-
35
- tcg_debug_assert(pos < max);
36
- tcg_debug_assert(pos + len <= max);
37
-
38
- tcg_out_op_rrbb(s, opc, args[0], args[1], pos, len);
39
- }
40
+ tcg_out_op_rrbb(s, opc, args[0], args[1], args[2], args[3]);
41
break;
42
43
CASE_32_64(brcond)
44
--
45
2.43.0
46
47
diff view generated by jsdifflib
1
Older versions of clang have missing runtime functions for arithmetic
1
Make extract and sextract "unconditional" in the sense
2
with -fsanitize=undefined (see 464e3671f9d5c), so we cannot use
2
that the opcodes are always present. Rely instead on
3
__int128_t for implementing Int128. But __int128_t is present,
3
TCG_TARGET_HAS_{s}extract_valid, now always defined.
4
data movement works, and it can be used for atomic128.
5
4
6
Probe for both CONFIG_INT128_TYPE and CONFIG_INT128, adjust
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
qemu/int128.h to define Int128Alias if CONFIG_INT128_TYPE,
8
and adjust the meson probe for atomics to use has_int128_type.
9
10
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
---
7
---
13
meson.build | 15 ++++++++++-----
8
tcg/aarch64/tcg-target-has.h | 4 ----
14
include/qemu/int128.h | 4 ++--
9
tcg/arm/tcg-target-has.h | 2 --
15
2 files changed, 12 insertions(+), 7 deletions(-)
10
tcg/i386/tcg-target-has.h | 4 ----
11
tcg/loongarch64/tcg-target-has.h | 4 ----
12
tcg/mips/tcg-target-has.h | 4 ----
13
tcg/ppc/tcg-target-has.h | 4 ----
14
tcg/riscv/tcg-target-has.h | 4 ----
15
tcg/s390x/tcg-target-has.h | 4 ----
16
tcg/sparc64/tcg-target-has.h | 4 ----
17
tcg/tcg-has.h | 12 ------------
18
tcg/tci/tcg-target-has.h | 4 ----
19
tcg/optimize.c | 8 ++++----
20
tcg/tcg.c | 12 ++++--------
21
tcg/tci.c | 8 --------
22
14 files changed, 8 insertions(+), 70 deletions(-)
16
23
17
diff --git a/meson.build b/meson.build
24
diff --git a/tcg/aarch64/tcg-target-has.h b/tcg/aarch64/tcg-target-has.h
18
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
19
--- a/meson.build
26
--- a/tcg/aarch64/tcg-target-has.h
20
+++ b/meson.build
27
+++ b/tcg/aarch64/tcg-target-has.h
21
@@ -XXX,XX +XXX,XX @@ config_host_data.set('CONFIG_ATOMIC64', cc.links('''
28
@@ -XXX,XX +XXX,XX @@
22
return 0;
29
#define TCG_TARGET_HAS_ctz_i32 1
23
}'''))
30
#define TCG_TARGET_HAS_ctpop_i32 0
24
31
#define TCG_TARGET_HAS_deposit_i32 1
25
-has_int128 = cc.links('''
32
-#define TCG_TARGET_HAS_extract_i32 1
26
+has_int128_type = cc.compiles('''
33
-#define TCG_TARGET_HAS_sextract_i32 1
27
+ __int128_t a;
34
#define TCG_TARGET_HAS_extract2_i32 1
28
+ __uint128_t b;
35
#define TCG_TARGET_HAS_negsetcond_i32 1
29
+ int main(void) { b = a; }''')
36
#define TCG_TARGET_HAS_add2_i32 1
30
+config_host_data.set('CONFIG_INT128_TYPE', has_int128_type)
37
@@ -XXX,XX +XXX,XX @@
31
+
38
#define TCG_TARGET_HAS_ctz_i64 1
32
+has_int128 = has_int128_type and cc.links('''
39
#define TCG_TARGET_HAS_ctpop_i64 0
33
__int128_t a;
40
#define TCG_TARGET_HAS_deposit_i64 1
34
__uint128_t b;
41
-#define TCG_TARGET_HAS_extract_i64 1
35
int main (void) {
42
-#define TCG_TARGET_HAS_sextract_i64 1
36
@@ -XXX,XX +XXX,XX @@ has_int128 = cc.links('''
43
#define TCG_TARGET_HAS_extract2_i64 1
37
a = a * a;
44
#define TCG_TARGET_HAS_negsetcond_i64 1
38
return 0;
45
#define TCG_TARGET_HAS_add2_i64 1
39
}''')
46
diff --git a/tcg/arm/tcg-target-has.h b/tcg/arm/tcg-target-has.h
40
-
47
index XXXXXXX..XXXXXXX 100644
41
config_host_data.set('CONFIG_INT128', has_int128)
48
--- a/tcg/arm/tcg-target-has.h
42
49
+++ b/tcg/arm/tcg-target-has.h
43
-if has_int128
50
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
44
+if has_int128_type
51
#define TCG_TARGET_HAS_ctz_i32 use_armv7_instructions
45
# "do we have 128-bit atomics which are handled inline and specifically not
52
#define TCG_TARGET_HAS_ctpop_i32 0
46
# via libatomic". The reason we can't use libatomic is documented in the
53
#define TCG_TARGET_HAS_deposit_i32 use_armv7_instructions
47
# comment starting "GCC is a house divided" in include/qemu/atomic128.h.
54
-#define TCG_TARGET_HAS_extract_i32 1
48
@@ -XXX,XX +XXX,XX @@ if has_int128
55
-#define TCG_TARGET_HAS_sextract_i32 1
49
# __alignof(unsigned __int128) for the host.
56
#define TCG_TARGET_HAS_extract2_i32 1
50
atomic_test_128 = '''
57
#define TCG_TARGET_HAS_negsetcond_i32 1
51
int main(int ac, char **av) {
58
#define TCG_TARGET_HAS_mulu2_i32 1
52
- unsigned __int128 *p = __builtin_assume_aligned(av[ac - 1], 16);
59
diff --git a/tcg/i386/tcg-target-has.h b/tcg/i386/tcg-target-has.h
53
+ __uint128_t *p = __builtin_assume_aligned(av[ac - 1], 16);
60
index XXXXXXX..XXXXXXX 100644
54
p[1] = __atomic_load_n(&p[0], __ATOMIC_RELAXED);
61
--- a/tcg/i386/tcg-target-has.h
55
__atomic_store_n(&p[2], p[3], __ATOMIC_RELAXED);
62
+++ b/tcg/i386/tcg-target-has.h
56
__atomic_compare_exchange_n(&p[4], &p[5], p[6], 0, __ATOMIC_RELAXED, __ATOMIC_RELAXED);
63
@@ -XXX,XX +XXX,XX @@
57
@@ -XXX,XX +XXX,XX @@ if has_int128
64
#define TCG_TARGET_HAS_ctz_i32 1
58
config_host_data.set('CONFIG_CMPXCHG128', cc.links('''
65
#define TCG_TARGET_HAS_ctpop_i32 have_popcnt
59
int main(void)
66
#define TCG_TARGET_HAS_deposit_i32 1
60
{
67
-#define TCG_TARGET_HAS_extract_i32 1
61
- unsigned __int128 x = 0, y = 0;
68
-#define TCG_TARGET_HAS_sextract_i32 1
62
+ __uint128_t x = 0, y = 0;
69
#define TCG_TARGET_HAS_extract2_i32 1
63
__sync_val_compare_and_swap_16(&x, y, x);
70
#define TCG_TARGET_HAS_negsetcond_i32 1
64
return 0;
71
#define TCG_TARGET_HAS_add2_i32 1
72
@@ -XXX,XX +XXX,XX @@
73
#define TCG_TARGET_HAS_ctz_i64 1
74
#define TCG_TARGET_HAS_ctpop_i64 have_popcnt
75
#define TCG_TARGET_HAS_deposit_i64 1
76
-#define TCG_TARGET_HAS_extract_i64 1
77
-#define TCG_TARGET_HAS_sextract_i64 1
78
#define TCG_TARGET_HAS_extract2_i64 1
79
#define TCG_TARGET_HAS_negsetcond_i64 1
80
#define TCG_TARGET_HAS_add2_i64 1
81
diff --git a/tcg/loongarch64/tcg-target-has.h b/tcg/loongarch64/tcg-target-has.h
82
index XXXXXXX..XXXXXXX 100644
83
--- a/tcg/loongarch64/tcg-target-has.h
84
+++ b/tcg/loongarch64/tcg-target-has.h
85
@@ -XXX,XX +XXX,XX @@
86
#define TCG_TARGET_HAS_div2_i32 0
87
#define TCG_TARGET_HAS_rot_i32 1
88
#define TCG_TARGET_HAS_deposit_i32 1
89
-#define TCG_TARGET_HAS_extract_i32 1
90
-#define TCG_TARGET_HAS_sextract_i32 1
91
#define TCG_TARGET_HAS_extract2_i32 0
92
#define TCG_TARGET_HAS_add2_i32 0
93
#define TCG_TARGET_HAS_sub2_i32 0
94
@@ -XXX,XX +XXX,XX @@
95
#define TCG_TARGET_HAS_div2_i64 0
96
#define TCG_TARGET_HAS_rot_i64 1
97
#define TCG_TARGET_HAS_deposit_i64 1
98
-#define TCG_TARGET_HAS_extract_i64 1
99
-#define TCG_TARGET_HAS_sextract_i64 1
100
#define TCG_TARGET_HAS_extract2_i64 0
101
#define TCG_TARGET_HAS_extr_i64_i32 1
102
#define TCG_TARGET_HAS_ext8s_i64 1
103
diff --git a/tcg/mips/tcg-target-has.h b/tcg/mips/tcg-target-has.h
104
index XXXXXXX..XXXXXXX 100644
105
--- a/tcg/mips/tcg-target-has.h
106
+++ b/tcg/mips/tcg-target-has.h
107
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
108
109
/* optional instructions detected at runtime */
110
#define TCG_TARGET_HAS_deposit_i32 use_mips32r2_instructions
111
-#define TCG_TARGET_HAS_extract_i32 1
112
-#define TCG_TARGET_HAS_sextract_i32 1
113
#define TCG_TARGET_HAS_extract2_i32 0
114
#define TCG_TARGET_HAS_ext8s_i32 use_mips32r2_instructions
115
#define TCG_TARGET_HAS_ext16s_i32 use_mips32r2_instructions
116
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
117
#define TCG_TARGET_HAS_bswap32_i64 1
118
#define TCG_TARGET_HAS_bswap64_i64 1
119
#define TCG_TARGET_HAS_deposit_i64 use_mips32r2_instructions
120
-#define TCG_TARGET_HAS_extract_i64 1
121
-#define TCG_TARGET_HAS_sextract_i64 1
122
#define TCG_TARGET_HAS_extract2_i64 0
123
#define TCG_TARGET_HAS_ext8s_i64 use_mips32r2_instructions
124
#define TCG_TARGET_HAS_ext16s_i64 use_mips32r2_instructions
125
diff --git a/tcg/ppc/tcg-target-has.h b/tcg/ppc/tcg-target-has.h
126
index XXXXXXX..XXXXXXX 100644
127
--- a/tcg/ppc/tcg-target-has.h
128
+++ b/tcg/ppc/tcg-target-has.h
129
@@ -XXX,XX +XXX,XX @@
130
#define TCG_TARGET_HAS_ctz_i32 have_isa_3_00
131
#define TCG_TARGET_HAS_ctpop_i32 have_isa_2_06
132
#define TCG_TARGET_HAS_deposit_i32 1
133
-#define TCG_TARGET_HAS_extract_i32 1
134
-#define TCG_TARGET_HAS_sextract_i32 1
135
#define TCG_TARGET_HAS_extract2_i32 0
136
#define TCG_TARGET_HAS_negsetcond_i32 1
137
#define TCG_TARGET_HAS_mulu2_i32 0
138
@@ -XXX,XX +XXX,XX @@
139
#define TCG_TARGET_HAS_ctz_i64 have_isa_3_00
140
#define TCG_TARGET_HAS_ctpop_i64 have_isa_2_06
141
#define TCG_TARGET_HAS_deposit_i64 1
142
-#define TCG_TARGET_HAS_extract_i64 1
143
-#define TCG_TARGET_HAS_sextract_i64 1
144
#define TCG_TARGET_HAS_extract2_i64 0
145
#define TCG_TARGET_HAS_negsetcond_i64 1
146
#define TCG_TARGET_HAS_add2_i64 1
147
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
148
index XXXXXXX..XXXXXXX 100644
149
--- a/tcg/riscv/tcg-target-has.h
150
+++ b/tcg/riscv/tcg-target-has.h
151
@@ -XXX,XX +XXX,XX @@
152
#define TCG_TARGET_HAS_div2_i32 0
153
#define TCG_TARGET_HAS_rot_i32 (cpuinfo & CPUINFO_ZBB)
154
#define TCG_TARGET_HAS_deposit_i32 0
155
-#define TCG_TARGET_HAS_extract_i32 1
156
-#define TCG_TARGET_HAS_sextract_i32 1
157
#define TCG_TARGET_HAS_extract2_i32 0
158
#define TCG_TARGET_HAS_add2_i32 1
159
#define TCG_TARGET_HAS_sub2_i32 1
160
@@ -XXX,XX +XXX,XX @@
161
#define TCG_TARGET_HAS_div2_i64 0
162
#define TCG_TARGET_HAS_rot_i64 (cpuinfo & CPUINFO_ZBB)
163
#define TCG_TARGET_HAS_deposit_i64 0
164
-#define TCG_TARGET_HAS_extract_i64 1
165
-#define TCG_TARGET_HAS_sextract_i64 1
166
#define TCG_TARGET_HAS_extract2_i64 0
167
#define TCG_TARGET_HAS_extr_i64_i32 1
168
#define TCG_TARGET_HAS_ext8s_i64 1
169
diff --git a/tcg/s390x/tcg-target-has.h b/tcg/s390x/tcg-target-has.h
170
index XXXXXXX..XXXXXXX 100644
171
--- a/tcg/s390x/tcg-target-has.h
172
+++ b/tcg/s390x/tcg-target-has.h
173
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
174
#define TCG_TARGET_HAS_ctz_i32 0
175
#define TCG_TARGET_HAS_ctpop_i32 1
176
#define TCG_TARGET_HAS_deposit_i32 1
177
-#define TCG_TARGET_HAS_extract_i32 1
178
-#define TCG_TARGET_HAS_sextract_i32 1
179
#define TCG_TARGET_HAS_extract2_i32 0
180
#define TCG_TARGET_HAS_negsetcond_i32 1
181
#define TCG_TARGET_HAS_add2_i32 1
182
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
183
#define TCG_TARGET_HAS_ctz_i64 0
184
#define TCG_TARGET_HAS_ctpop_i64 1
185
#define TCG_TARGET_HAS_deposit_i64 1
186
-#define TCG_TARGET_HAS_extract_i64 1
187
-#define TCG_TARGET_HAS_sextract_i64 1
188
#define TCG_TARGET_HAS_extract2_i64 0
189
#define TCG_TARGET_HAS_negsetcond_i64 1
190
#define TCG_TARGET_HAS_add2_i64 1
191
diff --git a/tcg/sparc64/tcg-target-has.h b/tcg/sparc64/tcg-target-has.h
192
index XXXXXXX..XXXXXXX 100644
193
--- a/tcg/sparc64/tcg-target-has.h
194
+++ b/tcg/sparc64/tcg-target-has.h
195
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
196
#define TCG_TARGET_HAS_ctz_i32 0
197
#define TCG_TARGET_HAS_ctpop_i32 0
198
#define TCG_TARGET_HAS_deposit_i32 0
199
-#define TCG_TARGET_HAS_extract_i32 1
200
-#define TCG_TARGET_HAS_sextract_i32 1
201
#define TCG_TARGET_HAS_extract2_i32 0
202
#define TCG_TARGET_HAS_negsetcond_i32 1
203
#define TCG_TARGET_HAS_add2_i32 1
204
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
205
#define TCG_TARGET_HAS_ctz_i64 0
206
#define TCG_TARGET_HAS_ctpop_i64 0
207
#define TCG_TARGET_HAS_deposit_i64 0
208
-#define TCG_TARGET_HAS_extract_i64 1
209
-#define TCG_TARGET_HAS_sextract_i64 1
210
#define TCG_TARGET_HAS_extract2_i64 0
211
#define TCG_TARGET_HAS_negsetcond_i64 1
212
#define TCG_TARGET_HAS_add2_i64 1
213
diff --git a/tcg/tcg-has.h b/tcg/tcg-has.h
214
index XXXXXXX..XXXXXXX 100644
215
--- a/tcg/tcg-has.h
216
+++ b/tcg/tcg-has.h
217
@@ -XXX,XX +XXX,XX @@
218
#define TCG_TARGET_HAS_ctz_i64 0
219
#define TCG_TARGET_HAS_ctpop_i64 0
220
#define TCG_TARGET_HAS_deposit_i64 0
221
-#define TCG_TARGET_HAS_extract_i64 0
222
-#define TCG_TARGET_HAS_sextract_i64 0
223
#define TCG_TARGET_HAS_extract2_i64 0
224
#define TCG_TARGET_HAS_negsetcond_i64 0
225
#define TCG_TARGET_HAS_add2_i64 0
226
@@ -XXX,XX +XXX,XX @@
227
#ifndef TCG_TARGET_deposit_i64_valid
228
#define TCG_TARGET_deposit_i64_valid(ofs, len) 1
229
#endif
230
-#ifndef TCG_TARGET_extract_valid
231
-#define TCG_TARGET_extract_valid(type, ofs, len) \
232
- ((type) == TCG_TYPE_I32 ? TCG_TARGET_HAS_extract_i32 \
233
- : TCG_TARGET_HAS_extract_i64)
234
-#endif
235
-#ifndef TCG_TARGET_sextract_valid
236
-#define TCG_TARGET_sextract_valid(type, ofs, len) \
237
- ((type) == TCG_TYPE_I32 ? TCG_TARGET_HAS_sextract_i32 \
238
- : TCG_TARGET_HAS_sextract_i64)
239
-#endif
240
241
/* Only one of DIV or DIV2 should be defined. */
242
#if defined(TCG_TARGET_HAS_div_i32)
243
diff --git a/tcg/tci/tcg-target-has.h b/tcg/tci/tcg-target-has.h
244
index XXXXXXX..XXXXXXX 100644
245
--- a/tcg/tci/tcg-target-has.h
246
+++ b/tcg/tci/tcg-target-has.h
247
@@ -XXX,XX +XXX,XX @@
248
#define TCG_TARGET_HAS_ext16u_i32 1
249
#define TCG_TARGET_HAS_andc_i32 1
250
#define TCG_TARGET_HAS_deposit_i32 1
251
-#define TCG_TARGET_HAS_extract_i32 1
252
-#define TCG_TARGET_HAS_sextract_i32 1
253
#define TCG_TARGET_HAS_extract2_i32 0
254
#define TCG_TARGET_HAS_eqv_i32 1
255
#define TCG_TARGET_HAS_nand_i32 1
256
@@ -XXX,XX +XXX,XX @@
257
#define TCG_TARGET_HAS_bswap32_i64 1
258
#define TCG_TARGET_HAS_bswap64_i64 1
259
#define TCG_TARGET_HAS_deposit_i64 1
260
-#define TCG_TARGET_HAS_extract_i64 1
261
-#define TCG_TARGET_HAS_sextract_i64 1
262
#define TCG_TARGET_HAS_extract2_i64 0
263
#define TCG_TARGET_HAS_div_i64 1
264
#define TCG_TARGET_HAS_rem_i64 1
265
diff --git a/tcg/optimize.c b/tcg/optimize.c
266
index XXXXXXX..XXXXXXX 100644
267
--- a/tcg/optimize.c
268
+++ b/tcg/optimize.c
269
@@ -XXX,XX +XXX,XX @@ static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
270
shr_opc = INDEX_op_shr_i32;
271
neg_opc = INDEX_op_neg_i32;
272
if (TCG_TARGET_extract_valid(TCG_TYPE_I32, sh, 1)) {
273
- uext_opc = TCG_TARGET_HAS_extract_i32 ? INDEX_op_extract_i32 : 0;
274
+ uext_opc = INDEX_op_extract_i32;
65
}
275
}
66
diff --git a/include/qemu/int128.h b/include/qemu/int128.h
276
if (TCG_TARGET_sextract_valid(TCG_TYPE_I32, sh, 1)) {
67
index XXXXXXX..XXXXXXX 100644
277
- sext_opc = TCG_TARGET_HAS_sextract_i32 ? INDEX_op_sextract_i32 : 0;
68
--- a/include/qemu/int128.h
278
+ sext_opc = INDEX_op_sextract_i32;
69
+++ b/include/qemu/int128.h
279
}
70
@@ -XXX,XX +XXX,XX @@ static inline void bswap128s(Int128 *s)
280
break;
71
* a possible structure and the native types. Ease parameter passing
281
case TCG_TYPE_I64:
72
* via use of the transparent union extension.
282
@@ -XXX,XX +XXX,XX @@ static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
73
*/
283
shr_opc = INDEX_op_shr_i64;
74
-#ifdef CONFIG_INT128
284
neg_opc = INDEX_op_neg_i64;
75
+#ifdef CONFIG_INT128_TYPE
285
if (TCG_TARGET_extract_valid(TCG_TYPE_I64, sh, 1)) {
76
typedef union {
286
- uext_opc = TCG_TARGET_HAS_extract_i64 ? INDEX_op_extract_i64 : 0;
77
__uint128_t u;
287
+ uext_opc = INDEX_op_extract_i64;
78
__int128_t i;
288
}
79
@@ -XXX,XX +XXX,XX @@ typedef union {
289
if (TCG_TARGET_sextract_valid(TCG_TYPE_I64, sh, 1)) {
80
} Int128Alias __attribute__((transparent_union));
290
- sext_opc = TCG_TARGET_HAS_sextract_i64 ? INDEX_op_sextract_i64 : 0;
81
#else
291
+ sext_opc = INDEX_op_sextract_i64;
82
typedef Int128 Int128Alias;
292
}
83
-#endif /* CONFIG_INT128 */
293
break;
84
+#endif /* CONFIG_INT128_TYPE */
294
default:
85
295
diff --git a/tcg/tcg.c b/tcg/tcg.c
86
#endif /* INT128_H */
296
index XXXXXXX..XXXXXXX 100644
297
--- a/tcg/tcg.c
298
+++ b/tcg/tcg.c
299
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
300
case INDEX_op_shl_i32:
301
case INDEX_op_shr_i32:
302
case INDEX_op_sar_i32:
303
+ case INDEX_op_extract_i32:
304
+ case INDEX_op_sextract_i32:
305
return true;
306
307
case INDEX_op_negsetcond_i32:
308
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
309
return TCG_TARGET_HAS_rot_i32;
310
case INDEX_op_deposit_i32:
311
return TCG_TARGET_HAS_deposit_i32;
312
- case INDEX_op_extract_i32:
313
- return TCG_TARGET_HAS_extract_i32;
314
- case INDEX_op_sextract_i32:
315
- return TCG_TARGET_HAS_sextract_i32;
316
case INDEX_op_extract2_i32:
317
return TCG_TARGET_HAS_extract2_i32;
318
case INDEX_op_add2_i32:
319
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
320
case INDEX_op_sar_i64:
321
case INDEX_op_ext_i32_i64:
322
case INDEX_op_extu_i32_i64:
323
+ case INDEX_op_extract_i64:
324
+ case INDEX_op_sextract_i64:
325
return TCG_TARGET_REG_BITS == 64;
326
327
case INDEX_op_negsetcond_i64:
328
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
329
return TCG_TARGET_HAS_rot_i64;
330
case INDEX_op_deposit_i64:
331
return TCG_TARGET_HAS_deposit_i64;
332
- case INDEX_op_extract_i64:
333
- return TCG_TARGET_HAS_extract_i64;
334
- case INDEX_op_sextract_i64:
335
- return TCG_TARGET_HAS_sextract_i64;
336
case INDEX_op_extract2_i64:
337
return TCG_TARGET_HAS_extract2_i64;
338
case INDEX_op_extrl_i64_i32:
339
diff --git a/tcg/tci.c b/tcg/tci.c
340
index XXXXXXX..XXXXXXX 100644
341
--- a/tcg/tci.c
342
+++ b/tcg/tci.c
343
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
344
regs[r0] = deposit32(regs[r1], pos, len, regs[r2]);
345
break;
346
#endif
347
-#if TCG_TARGET_HAS_extract_i32
348
case INDEX_op_extract_i32:
349
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
350
regs[r0] = extract32(regs[r1], pos, len);
351
break;
352
-#endif
353
-#if TCG_TARGET_HAS_sextract_i32
354
case INDEX_op_sextract_i32:
355
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
356
regs[r0] = sextract32(regs[r1], pos, len);
357
break;
358
-#endif
359
case INDEX_op_brcond_i32:
360
tci_args_rl(insn, tb_ptr, &r0, &ptr);
361
if ((uint32_t)regs[r0]) {
362
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
363
regs[r0] = deposit64(regs[r1], pos, len, regs[r2]);
364
break;
365
#endif
366
-#if TCG_TARGET_HAS_extract_i64
367
case INDEX_op_extract_i64:
368
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
369
regs[r0] = extract64(regs[r1], pos, len);
370
break;
371
-#endif
372
-#if TCG_TARGET_HAS_sextract_i64
373
case INDEX_op_sextract_i64:
374
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
375
regs[r0] = sextract64(regs[r1], pos, len);
376
break;
377
-#endif
378
case INDEX_op_brcond_i64:
379
tci_args_rl(insn, tb_ptr, &r0, &ptr);
380
if (regs[r0]) {
87
--
381
--
88
2.34.1
382
2.43.0
383
384
diff view generated by jsdifflib
1
Invert the exit code, for use with the testsuite.
1
Make deposit "unconditional" in the sense that the opcode is
2
always present. Rely instead on TCG_TARGET_deposit_valid,
3
now always defined.
2
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
---
7
---
5
scripts/decodetree.py | 9 +++++++--
8
tcg/aarch64/tcg-target-has.h | 3 +--
6
1 file changed, 7 insertions(+), 2 deletions(-)
9
tcg/arm/tcg-target-has.h | 2 +-
10
tcg/i386/tcg-target-has.h | 5 +----
11
tcg/loongarch64/tcg-target-has.h | 3 +--
12
tcg/mips/tcg-target-has.h | 3 +--
13
tcg/ppc/tcg-target-has.h | 3 +--
14
tcg/riscv/tcg-target-has.h | 4 ++--
15
tcg/s390x/tcg-target-has.h | 3 +--
16
tcg/sparc64/tcg-target-has.h | 4 ++--
17
tcg/tcg-has.h | 8 --------
18
tcg/tci/tcg-target-has.h | 3 +--
19
tcg/tcg-op.c | 22 +++++++++++-----------
20
tcg/tcg.c | 31 +++++++++++--------------------
21
tcg/tci.c | 4 ----
22
tcg/tci/tcg-target.c.inc | 2 +-
23
15 files changed, 35 insertions(+), 65 deletions(-)
7
24
8
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
25
diff --git a/tcg/aarch64/tcg-target-has.h b/tcg/aarch64/tcg-target-has.h
9
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
10
--- a/scripts/decodetree.py
27
--- a/tcg/aarch64/tcg-target-has.h
11
+++ b/scripts/decodetree.py
28
+++ b/tcg/aarch64/tcg-target-has.h
12
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@
13
formats = {}
30
#define TCG_TARGET_HAS_clz_i32 1
14
allpatterns = []
31
#define TCG_TARGET_HAS_ctz_i32 1
15
anyextern = False
32
#define TCG_TARGET_HAS_ctpop_i32 0
16
+testforerror = False
33
-#define TCG_TARGET_HAS_deposit_i32 1
17
34
#define TCG_TARGET_HAS_extract2_i32 1
18
translate_prefix = 'trans'
35
#define TCG_TARGET_HAS_negsetcond_i32 1
19
translate_scope = 'static '
36
#define TCG_TARGET_HAS_add2_i32 1
20
@@ -XXX,XX +XXX,XX @@ def error_with_file(file, lineno, *args):
37
@@ -XXX,XX +XXX,XX @@
21
if output_file and output_fd:
38
#define TCG_TARGET_HAS_clz_i64 1
22
output_fd.close()
39
#define TCG_TARGET_HAS_ctz_i64 1
23
os.remove(output_file)
40
#define TCG_TARGET_HAS_ctpop_i64 0
24
- exit(1)
41
-#define TCG_TARGET_HAS_deposit_i64 1
25
+ exit(0 if testforerror else 1)
42
#define TCG_TARGET_HAS_extract2_i64 1
26
# end error_with_file
43
#define TCG_TARGET_HAS_negsetcond_i64 1
27
44
#define TCG_TARGET_HAS_add2_i64 1
28
45
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@ def main():
46
30
global bitop_width
47
#define TCG_TARGET_extract_valid(type, ofs, len) 1
31
global variablewidth
48
#define TCG_TARGET_sextract_valid(type, ofs, len) 1
32
global anyextern
49
+#define TCG_TARGET_deposit_valid(type, ofs, len) 1
33
+ global testforerror
50
34
51
#endif
35
decode_scope = 'static '
52
diff --git a/tcg/arm/tcg-target-has.h b/tcg/arm/tcg-target-has.h
36
53
index XXXXXXX..XXXXXXX 100644
37
long_opts = ['decode=', 'translate=', 'output=', 'insnwidth=',
54
--- a/tcg/arm/tcg-target-has.h
38
- 'static-decode=', 'varinsnwidth=']
55
+++ b/tcg/arm/tcg-target-has.h
39
+ 'static-decode=', 'varinsnwidth=', 'test-for-error']
56
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
40
try:
57
#define TCG_TARGET_HAS_clz_i32 1
41
(opts, args) = getopt.gnu_getopt(sys.argv[1:], 'o:vw:', long_opts)
58
#define TCG_TARGET_HAS_ctz_i32 use_armv7_instructions
42
except getopt.GetoptError as err:
59
#define TCG_TARGET_HAS_ctpop_i32 0
43
@@ -XXX,XX +XXX,XX @@ def main():
60
-#define TCG_TARGET_HAS_deposit_i32 use_armv7_instructions
44
bitop_width = 64
61
#define TCG_TARGET_HAS_extract2_i32 1
45
elif insnwidth != 32:
62
#define TCG_TARGET_HAS_negsetcond_i32 1
46
error(0, 'cannot handle insns of width', insnwidth)
63
#define TCG_TARGET_HAS_mulu2_i32 1
47
+ elif o == '--test-for-error':
64
@@ -XXX,XX +XXX,XX @@ tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
48
+ testforerror = True
65
49
else:
66
#define TCG_TARGET_extract_valid tcg_target_extract_valid
50
assert False, 'unhandled option'
67
#define TCG_TARGET_sextract_valid tcg_target_extract_valid
51
68
+#define TCG_TARGET_deposit_valid(type, ofs, len) use_armv7_instructions
52
@@ -XXX,XX +XXX,XX @@ def main():
69
53
70
#endif
54
if output_file:
71
diff --git a/tcg/i386/tcg-target-has.h b/tcg/i386/tcg-target-has.h
55
output_fd.close()
72
index XXXXXXX..XXXXXXX 100644
56
+ exit(1 if testforerror else 0)
73
--- a/tcg/i386/tcg-target-has.h
57
# end main
74
+++ b/tcg/i386/tcg-target-has.h
58
75
@@ -XXX,XX +XXX,XX @@
76
#define TCG_TARGET_HAS_clz_i32 1
77
#define TCG_TARGET_HAS_ctz_i32 1
78
#define TCG_TARGET_HAS_ctpop_i32 have_popcnt
79
-#define TCG_TARGET_HAS_deposit_i32 1
80
#define TCG_TARGET_HAS_extract2_i32 1
81
#define TCG_TARGET_HAS_negsetcond_i32 1
82
#define TCG_TARGET_HAS_add2_i32 1
83
@@ -XXX,XX +XXX,XX @@
84
#define TCG_TARGET_HAS_clz_i64 1
85
#define TCG_TARGET_HAS_ctz_i64 1
86
#define TCG_TARGET_HAS_ctpop_i64 have_popcnt
87
-#define TCG_TARGET_HAS_deposit_i64 1
88
#define TCG_TARGET_HAS_extract2_i64 1
89
#define TCG_TARGET_HAS_negsetcond_i64 1
90
#define TCG_TARGET_HAS_add2_i64 1
91
@@ -XXX,XX +XXX,XX @@
92
#define TCG_TARGET_HAS_cmpsel_vec 1
93
#define TCG_TARGET_HAS_tst_vec have_avx512bw
94
95
-#define TCG_TARGET_deposit_i32_valid(ofs, len) \
96
+#define TCG_TARGET_deposit_valid(type, ofs, len) \
97
(((ofs) == 0 && ((len) == 8 || (len) == 16)) || \
98
(TCG_TARGET_REG_BITS == 32 && (ofs) == 8 && (len) == 8))
99
-#define TCG_TARGET_deposit_i64_valid TCG_TARGET_deposit_i32_valid
100
101
/*
102
* Check for the possibility of low byte/word extraction, high-byte extraction
103
diff --git a/tcg/loongarch64/tcg-target-has.h b/tcg/loongarch64/tcg-target-has.h
104
index XXXXXXX..XXXXXXX 100644
105
--- a/tcg/loongarch64/tcg-target-has.h
106
+++ b/tcg/loongarch64/tcg-target-has.h
107
@@ -XXX,XX +XXX,XX @@
108
#define TCG_TARGET_HAS_rem_i32 1
109
#define TCG_TARGET_HAS_div2_i32 0
110
#define TCG_TARGET_HAS_rot_i32 1
111
-#define TCG_TARGET_HAS_deposit_i32 1
112
#define TCG_TARGET_HAS_extract2_i32 0
113
#define TCG_TARGET_HAS_add2_i32 0
114
#define TCG_TARGET_HAS_sub2_i32 0
115
@@ -XXX,XX +XXX,XX @@
116
#define TCG_TARGET_HAS_rem_i64 1
117
#define TCG_TARGET_HAS_div2_i64 0
118
#define TCG_TARGET_HAS_rot_i64 1
119
-#define TCG_TARGET_HAS_deposit_i64 1
120
#define TCG_TARGET_HAS_extract2_i64 0
121
#define TCG_TARGET_HAS_extr_i64_i32 1
122
#define TCG_TARGET_HAS_ext8s_i64 1
123
@@ -XXX,XX +XXX,XX @@
124
#define TCG_TARGET_HAS_tst_vec 0
125
126
#define TCG_TARGET_extract_valid(type, ofs, len) 1
127
+#define TCG_TARGET_deposit_valid(type, ofs, len) 1
128
129
static inline bool
130
tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
131
diff --git a/tcg/mips/tcg-target-has.h b/tcg/mips/tcg-target-has.h
132
index XXXXXXX..XXXXXXX 100644
133
--- a/tcg/mips/tcg-target-has.h
134
+++ b/tcg/mips/tcg-target-has.h
135
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
136
#endif
137
138
/* optional instructions detected at runtime */
139
-#define TCG_TARGET_HAS_deposit_i32 use_mips32r2_instructions
140
#define TCG_TARGET_HAS_extract2_i32 0
141
#define TCG_TARGET_HAS_ext8s_i32 use_mips32r2_instructions
142
#define TCG_TARGET_HAS_ext16s_i32 use_mips32r2_instructions
143
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
144
#define TCG_TARGET_HAS_bswap16_i64 1
145
#define TCG_TARGET_HAS_bswap32_i64 1
146
#define TCG_TARGET_HAS_bswap64_i64 1
147
-#define TCG_TARGET_HAS_deposit_i64 use_mips32r2_instructions
148
#define TCG_TARGET_HAS_extract2_i64 0
149
#define TCG_TARGET_HAS_ext8s_i64 use_mips32r2_instructions
150
#define TCG_TARGET_HAS_ext16s_i64 use_mips32r2_instructions
151
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
152
#define TCG_TARGET_HAS_tst 0
153
154
#define TCG_TARGET_extract_valid(type, ofs, len) use_mips32r2_instructions
155
+#define TCG_TARGET_deposit_valid(type, ofs, len) use_mips32r2_instructions
156
157
static inline bool
158
tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
159
diff --git a/tcg/ppc/tcg-target-has.h b/tcg/ppc/tcg-target-has.h
160
index XXXXXXX..XXXXXXX 100644
161
--- a/tcg/ppc/tcg-target-has.h
162
+++ b/tcg/ppc/tcg-target-has.h
163
@@ -XXX,XX +XXX,XX @@
164
#define TCG_TARGET_HAS_clz_i32 1
165
#define TCG_TARGET_HAS_ctz_i32 have_isa_3_00
166
#define TCG_TARGET_HAS_ctpop_i32 have_isa_2_06
167
-#define TCG_TARGET_HAS_deposit_i32 1
168
#define TCG_TARGET_HAS_extract2_i32 0
169
#define TCG_TARGET_HAS_negsetcond_i32 1
170
#define TCG_TARGET_HAS_mulu2_i32 0
171
@@ -XXX,XX +XXX,XX @@
172
#define TCG_TARGET_HAS_clz_i64 1
173
#define TCG_TARGET_HAS_ctz_i64 have_isa_3_00
174
#define TCG_TARGET_HAS_ctpop_i64 have_isa_2_06
175
-#define TCG_TARGET_HAS_deposit_i64 1
176
#define TCG_TARGET_HAS_extract2_i64 0
177
#define TCG_TARGET_HAS_negsetcond_i64 1
178
#define TCG_TARGET_HAS_add2_i64 1
179
@@ -XXX,XX +XXX,XX @@
180
#define TCG_TARGET_HAS_tst_vec 0
181
182
#define TCG_TARGET_extract_valid(type, ofs, len) 1
183
+#define TCG_TARGET_deposit_valid(type, ofs, len) 1
184
185
static inline bool
186
tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
187
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
188
index XXXXXXX..XXXXXXX 100644
189
--- a/tcg/riscv/tcg-target-has.h
190
+++ b/tcg/riscv/tcg-target-has.h
191
@@ -XXX,XX +XXX,XX @@
192
#define TCG_TARGET_HAS_rem_i32 1
193
#define TCG_TARGET_HAS_div2_i32 0
194
#define TCG_TARGET_HAS_rot_i32 (cpuinfo & CPUINFO_ZBB)
195
-#define TCG_TARGET_HAS_deposit_i32 0
196
#define TCG_TARGET_HAS_extract2_i32 0
197
#define TCG_TARGET_HAS_add2_i32 1
198
#define TCG_TARGET_HAS_sub2_i32 1
199
@@ -XXX,XX +XXX,XX @@
200
#define TCG_TARGET_HAS_rem_i64 1
201
#define TCG_TARGET_HAS_div2_i64 0
202
#define TCG_TARGET_HAS_rot_i64 (cpuinfo & CPUINFO_ZBB)
203
-#define TCG_TARGET_HAS_deposit_i64 0
204
#define TCG_TARGET_HAS_extract2_i64 0
205
#define TCG_TARGET_HAS_extr_i64_i32 1
206
#define TCG_TARGET_HAS_ext8s_i64 1
207
@@ -XXX,XX +XXX,XX @@ tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
208
}
209
#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
210
211
+#define TCG_TARGET_deposit_valid(type, ofs, len) 0
212
+
213
#endif
214
diff --git a/tcg/s390x/tcg-target-has.h b/tcg/s390x/tcg-target-has.h
215
index XXXXXXX..XXXXXXX 100644
216
--- a/tcg/s390x/tcg-target-has.h
217
+++ b/tcg/s390x/tcg-target-has.h
218
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
219
#define TCG_TARGET_HAS_clz_i32 0
220
#define TCG_TARGET_HAS_ctz_i32 0
221
#define TCG_TARGET_HAS_ctpop_i32 1
222
-#define TCG_TARGET_HAS_deposit_i32 1
223
#define TCG_TARGET_HAS_extract2_i32 0
224
#define TCG_TARGET_HAS_negsetcond_i32 1
225
#define TCG_TARGET_HAS_add2_i32 1
226
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
227
#define TCG_TARGET_HAS_clz_i64 1
228
#define TCG_TARGET_HAS_ctz_i64 0
229
#define TCG_TARGET_HAS_ctpop_i64 1
230
-#define TCG_TARGET_HAS_deposit_i64 1
231
#define TCG_TARGET_HAS_extract2_i64 0
232
#define TCG_TARGET_HAS_negsetcond_i64 1
233
#define TCG_TARGET_HAS_add2_i64 1
234
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
235
#define TCG_TARGET_HAS_tst_vec 0
236
237
#define TCG_TARGET_extract_valid(type, ofs, len) 1
238
+#define TCG_TARGET_deposit_valid(type, ofs, len) 1
239
240
static inline bool
241
tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
242
diff --git a/tcg/sparc64/tcg-target-has.h b/tcg/sparc64/tcg-target-has.h
243
index XXXXXXX..XXXXXXX 100644
244
--- a/tcg/sparc64/tcg-target-has.h
245
+++ b/tcg/sparc64/tcg-target-has.h
246
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
247
#define TCG_TARGET_HAS_clz_i32 0
248
#define TCG_TARGET_HAS_ctz_i32 0
249
#define TCG_TARGET_HAS_ctpop_i32 0
250
-#define TCG_TARGET_HAS_deposit_i32 0
251
#define TCG_TARGET_HAS_extract2_i32 0
252
#define TCG_TARGET_HAS_negsetcond_i32 1
253
#define TCG_TARGET_HAS_add2_i32 1
254
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
255
#define TCG_TARGET_HAS_clz_i64 0
256
#define TCG_TARGET_HAS_ctz_i64 0
257
#define TCG_TARGET_HAS_ctpop_i64 0
258
-#define TCG_TARGET_HAS_deposit_i64 0
259
#define TCG_TARGET_HAS_extract2_i64 0
260
#define TCG_TARGET_HAS_negsetcond_i64 1
261
#define TCG_TARGET_HAS_add2_i64 1
262
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
263
264
#define TCG_TARGET_sextract_valid TCG_TARGET_extract_valid
265
266
+#define TCG_TARGET_deposit_valid(type, ofs, len) 0
267
+
268
#endif
269
diff --git a/tcg/tcg-has.h b/tcg/tcg-has.h
270
index XXXXXXX..XXXXXXX 100644
271
--- a/tcg/tcg-has.h
272
+++ b/tcg/tcg-has.h
273
@@ -XXX,XX +XXX,XX @@
274
#define TCG_TARGET_HAS_clz_i64 0
275
#define TCG_TARGET_HAS_ctz_i64 0
276
#define TCG_TARGET_HAS_ctpop_i64 0
277
-#define TCG_TARGET_HAS_deposit_i64 0
278
#define TCG_TARGET_HAS_extract2_i64 0
279
#define TCG_TARGET_HAS_negsetcond_i64 0
280
#define TCG_TARGET_HAS_add2_i64 0
281
@@ -XXX,XX +XXX,XX @@
282
#define TCG_TARGET_HAS_sub2_i32 1
283
#endif
284
285
-#ifndef TCG_TARGET_deposit_i32_valid
286
-#define TCG_TARGET_deposit_i32_valid(ofs, len) 1
287
-#endif
288
-#ifndef TCG_TARGET_deposit_i64_valid
289
-#define TCG_TARGET_deposit_i64_valid(ofs, len) 1
290
-#endif
291
-
292
/* Only one of DIV or DIV2 should be defined. */
293
#if defined(TCG_TARGET_HAS_div_i32)
294
#define TCG_TARGET_HAS_div2_i32 0
295
diff --git a/tcg/tci/tcg-target-has.h b/tcg/tci/tcg-target-has.h
296
index XXXXXXX..XXXXXXX 100644
297
--- a/tcg/tci/tcg-target-has.h
298
+++ b/tcg/tci/tcg-target-has.h
299
@@ -XXX,XX +XXX,XX @@
300
#define TCG_TARGET_HAS_ext8u_i32 1
301
#define TCG_TARGET_HAS_ext16u_i32 1
302
#define TCG_TARGET_HAS_andc_i32 1
303
-#define TCG_TARGET_HAS_deposit_i32 1
304
#define TCG_TARGET_HAS_extract2_i32 0
305
#define TCG_TARGET_HAS_eqv_i32 1
306
#define TCG_TARGET_HAS_nand_i32 1
307
@@ -XXX,XX +XXX,XX @@
308
#define TCG_TARGET_HAS_bswap16_i64 1
309
#define TCG_TARGET_HAS_bswap32_i64 1
310
#define TCG_TARGET_HAS_bswap64_i64 1
311
-#define TCG_TARGET_HAS_deposit_i64 1
312
#define TCG_TARGET_HAS_extract2_i64 0
313
#define TCG_TARGET_HAS_div_i64 1
314
#define TCG_TARGET_HAS_rem_i64 1
315
@@ -XXX,XX +XXX,XX @@
316
317
#define TCG_TARGET_extract_valid(type, ofs, len) 1
318
#define TCG_TARGET_sextract_valid(type, ofs, len) 1
319
+#define TCG_TARGET_deposit_valid(type, ofs, len) 1
320
321
#endif
322
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
323
index XXXXXXX..XXXXXXX 100644
324
--- a/tcg/tcg-op.c
325
+++ b/tcg/tcg-op.c
326
@@ -XXX,XX +XXX,XX @@ void tcg_gen_deposit_i32(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2,
327
tcg_gen_mov_i32(ret, arg2);
328
return;
329
}
330
- if (TCG_TARGET_HAS_deposit_i32 && TCG_TARGET_deposit_i32_valid(ofs, len)) {
331
+ if (TCG_TARGET_deposit_valid(TCG_TYPE_I32, ofs, len)) {
332
tcg_gen_op5ii_i32(INDEX_op_deposit_i32, ret, arg1, arg2, ofs, len);
333
return;
334
}
335
@@ -XXX,XX +XXX,XX @@ void tcg_gen_deposit_z_i32(TCGv_i32 ret, TCGv_i32 arg,
336
tcg_gen_shli_i32(ret, arg, ofs);
337
} else if (ofs == 0) {
338
tcg_gen_andi_i32(ret, arg, (1u << len) - 1);
339
- } else if (TCG_TARGET_HAS_deposit_i32
340
- && TCG_TARGET_deposit_i32_valid(ofs, len)) {
341
+ } else if (TCG_TARGET_deposit_valid(TCG_TYPE_I32, ofs, len)) {
342
TCGv_i32 zero = tcg_constant_i32(0);
343
tcg_gen_op5ii_i32(INDEX_op_deposit_i32, ret, zero, arg, ofs, len);
344
} else {
345
@@ -XXX,XX +XXX,XX @@ void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1, TCGv_i64 arg2,
346
tcg_gen_mov_i64(ret, arg2);
347
return;
348
}
349
- if (TCG_TARGET_HAS_deposit_i64 && TCG_TARGET_deposit_i64_valid(ofs, len)) {
350
- tcg_gen_op5ii_i64(INDEX_op_deposit_i64, ret, arg1, arg2, ofs, len);
351
- return;
352
- }
353
354
- if (TCG_TARGET_REG_BITS == 32) {
355
+ if (TCG_TARGET_REG_BITS == 64) {
356
+ if (TCG_TARGET_deposit_valid(TCG_TYPE_I64, ofs, len)) {
357
+ tcg_gen_op5ii_i64(INDEX_op_deposit_i64, ret, arg1, arg2, ofs, len);
358
+ return;
359
+ }
360
+ } else {
361
if (ofs >= 32) {
362
tcg_gen_deposit_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1),
363
TCGV_LOW(arg2), ofs - 32, len);
364
@@ -XXX,XX +XXX,XX @@ void tcg_gen_deposit_z_i64(TCGv_i64 ret, TCGv_i64 arg,
365
tcg_gen_shli_i64(ret, arg, ofs);
366
} else if (ofs == 0) {
367
tcg_gen_andi_i64(ret, arg, (1ull << len) - 1);
368
- } else if (TCG_TARGET_HAS_deposit_i64
369
- && TCG_TARGET_deposit_i64_valid(ofs, len)) {
370
+ } else if (TCG_TARGET_REG_BITS == 64 &&
371
+ TCG_TARGET_deposit_valid(TCG_TYPE_I64, ofs, len)) {
372
TCGv_i64 zero = tcg_constant_i64(0);
373
tcg_gen_op5ii_i64(INDEX_op_deposit_i64, ret, zero, arg, ofs, len);
374
} else {
375
@@ -XXX,XX +XXX,XX @@ void tcg_gen_concat_i32_i64(TCGv_i64 dest, TCGv_i32 low, TCGv_i32 high)
376
tcg_gen_extu_i32_i64(dest, low);
377
/* If deposit is available, use it. Otherwise use the extra
378
knowledge that we have of the zero-extensions above. */
379
- if (TCG_TARGET_HAS_deposit_i64 && TCG_TARGET_deposit_i64_valid(32, 32)) {
380
+ if (TCG_TARGET_deposit_valid(TCG_TYPE_I64, 32, 32)) {
381
tcg_gen_deposit_i64(dest, dest, tmp, 32, 32);
382
} else {
383
tcg_gen_shli_i64(tmp, tmp, 32);
384
diff --git a/tcg/tcg.c b/tcg/tcg.c
385
index XXXXXXX..XXXXXXX 100644
386
--- a/tcg/tcg.c
387
+++ b/tcg/tcg.c
388
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
389
case INDEX_op_sar_i32:
390
case INDEX_op_extract_i32:
391
case INDEX_op_sextract_i32:
392
+ case INDEX_op_deposit_i32:
393
return true;
394
395
case INDEX_op_negsetcond_i32:
396
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
397
case INDEX_op_rotl_i32:
398
case INDEX_op_rotr_i32:
399
return TCG_TARGET_HAS_rot_i32;
400
- case INDEX_op_deposit_i32:
401
- return TCG_TARGET_HAS_deposit_i32;
402
case INDEX_op_extract2_i32:
403
return TCG_TARGET_HAS_extract2_i32;
404
case INDEX_op_add2_i32:
405
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
406
case INDEX_op_extu_i32_i64:
407
case INDEX_op_extract_i64:
408
case INDEX_op_sextract_i64:
409
+ case INDEX_op_deposit_i64:
410
return TCG_TARGET_REG_BITS == 64;
411
412
case INDEX_op_negsetcond_i64:
413
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
414
case INDEX_op_rotl_i64:
415
case INDEX_op_rotr_i64:
416
return TCG_TARGET_HAS_rot_i64;
417
- case INDEX_op_deposit_i64:
418
- return TCG_TARGET_HAS_deposit_i64;
419
case INDEX_op_extract2_i64:
420
return TCG_TARGET_HAS_extract2_i64;
421
case INDEX_op_extrl_i64_i32:
422
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
423
424
bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len)
425
{
426
+ unsigned width;
427
+
428
+ tcg_debug_assert(type == TCG_TYPE_I32 || type == TCG_TYPE_I64);
429
+ width = (type == TCG_TYPE_I32 ? 32 : 64);
430
+
431
+ tcg_debug_assert(ofs < width);
432
tcg_debug_assert(len > 0);
433
- switch (type) {
434
- case TCG_TYPE_I32:
435
- tcg_debug_assert(ofs < 32);
436
- tcg_debug_assert(len <= 32);
437
- tcg_debug_assert(ofs + len <= 32);
438
- return TCG_TARGET_HAS_deposit_i32 &&
439
- TCG_TARGET_deposit_i32_valid(ofs, len);
440
- case TCG_TYPE_I64:
441
- tcg_debug_assert(ofs < 64);
442
- tcg_debug_assert(len <= 64);
443
- tcg_debug_assert(ofs + len <= 64);
444
- return TCG_TARGET_HAS_deposit_i64 &&
445
- TCG_TARGET_deposit_i64_valid(ofs, len);
446
- default:
447
- g_assert_not_reached();
448
- }
449
+ tcg_debug_assert(len <= width - ofs);
450
+
451
+ return TCG_TARGET_deposit_valid(type, ofs, len);
452
}
453
454
static TCGOp *tcg_op_alloc(TCGOpcode opc, unsigned nargs);
455
diff --git a/tcg/tci.c b/tcg/tci.c
456
index XXXXXXX..XXXXXXX 100644
457
--- a/tcg/tci.c
458
+++ b/tcg/tci.c
459
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
460
regs[r0] = ror32(regs[r1], regs[r2] & 31);
461
break;
462
#endif
463
-#if TCG_TARGET_HAS_deposit_i32
464
case INDEX_op_deposit_i32:
465
tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len);
466
regs[r0] = deposit32(regs[r1], pos, len, regs[r2]);
467
break;
468
-#endif
469
case INDEX_op_extract_i32:
470
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
471
regs[r0] = extract32(regs[r1], pos, len);
472
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
473
regs[r0] = ror64(regs[r1], regs[r2] & 63);
474
break;
475
#endif
476
-#if TCG_TARGET_HAS_deposit_i64
477
case INDEX_op_deposit_i64:
478
tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len);
479
regs[r0] = deposit64(regs[r1], pos, len, regs[r2]);
480
break;
481
-#endif
482
case INDEX_op_extract_i64:
483
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
484
regs[r0] = extract64(regs[r1], pos, len);
485
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
486
index XXXXXXX..XXXXXXX 100644
487
--- a/tcg/tci/tcg-target.c.inc
488
+++ b/tcg/tci/tcg-target.c.inc
489
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
490
tcg_out_op_rrr(s, opc, args[0], args[1], args[2]);
491
break;
492
493
- CASE_32_64(deposit) /* Optional (TCG_TARGET_HAS_deposit_*). */
494
+ CASE_32_64(deposit)
495
tcg_out_op_rrrbb(s, opc, args[0], args[1], args[2], args[3], args[4]);
496
break;
59
497
60
--
498
--
61
2.34.1
499
2.43.0
500
501
diff view generated by jsdifflib
New patch
1
Acked-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Message-ID: <20250102181601.1421059-2-richard.henderson@linaro.org>
5
---
6
host/include/riscv/host/cpuinfo.h | 5 +++--
7
util/cpuinfo-riscv.c | 18 ++++++++++++++++--
8
2 files changed, 19 insertions(+), 4 deletions(-)
1
9
10
diff --git a/host/include/riscv/host/cpuinfo.h b/host/include/riscv/host/cpuinfo.h
11
index XXXXXXX..XXXXXXX 100644
12
--- a/host/include/riscv/host/cpuinfo.h
13
+++ b/host/include/riscv/host/cpuinfo.h
14
@@ -XXX,XX +XXX,XX @@
15
#define CPUINFO_ALWAYS (1u << 0) /* so cpuinfo is nonzero */
16
#define CPUINFO_ZBA (1u << 1)
17
#define CPUINFO_ZBB (1u << 2)
18
-#define CPUINFO_ZICOND (1u << 3)
19
-#define CPUINFO_ZVE64X (1u << 4)
20
+#define CPUINFO_ZBS (1u << 3)
21
+#define CPUINFO_ZICOND (1u << 4)
22
+#define CPUINFO_ZVE64X (1u << 5)
23
24
/* Initialized with a constructor. */
25
extern unsigned cpuinfo;
26
diff --git a/util/cpuinfo-riscv.c b/util/cpuinfo-riscv.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/util/cpuinfo-riscv.c
29
+++ b/util/cpuinfo-riscv.c
30
@@ -XXX,XX +XXX,XX @@ static void sigill_handler(int signo, siginfo_t *si, void *data)
31
/* Called both as constructor and (possibly) via other constructors. */
32
unsigned __attribute__((constructor)) cpuinfo_init(void)
33
{
34
- unsigned left = CPUINFO_ZBA | CPUINFO_ZBB | CPUINFO_ZICOND | CPUINFO_ZVE64X;
35
+ unsigned left = CPUINFO_ZBA | CPUINFO_ZBB | CPUINFO_ZBS
36
+ | CPUINFO_ZICOND | CPUINFO_ZVE64X;
37
unsigned info = cpuinfo;
38
39
if (info) {
40
@@ -XXX,XX +XXX,XX @@ unsigned __attribute__((constructor)) cpuinfo_init(void)
41
#if defined(__riscv_arch_test) && defined(__riscv_zbb)
42
info |= CPUINFO_ZBB;
43
#endif
44
+#if defined(__riscv_arch_test) && defined(__riscv_zbs)
45
+ info |= CPUINFO_ZBS;
46
+#endif
47
#if defined(__riscv_arch_test) && defined(__riscv_zicond)
48
info |= CPUINFO_ZICOND;
49
#endif
50
@@ -XXX,XX +XXX,XX @@ unsigned __attribute__((constructor)) cpuinfo_init(void)
51
&& pair.key >= 0) {
52
info |= pair.value & RISCV_HWPROBE_EXT_ZBA ? CPUINFO_ZBA : 0;
53
info |= pair.value & RISCV_HWPROBE_EXT_ZBB ? CPUINFO_ZBB : 0;
54
- left &= ~(CPUINFO_ZBA | CPUINFO_ZBB);
55
+ info |= pair.value & RISCV_HWPROBE_EXT_ZBS ? CPUINFO_ZBS : 0;
56
+ left &= ~(CPUINFO_ZBA | CPUINFO_ZBB | CPUINFO_ZBS);
57
#ifdef RISCV_HWPROBE_EXT_ZICOND
58
info |= pair.value & RISCV_HWPROBE_EXT_ZICOND ? CPUINFO_ZICOND : 0;
59
left &= ~CPUINFO_ZICOND;
60
@@ -XXX,XX +XXX,XX @@ unsigned __attribute__((constructor)) cpuinfo_init(void)
61
left &= ~CPUINFO_ZBB;
62
}
63
64
+ if (left & CPUINFO_ZBS) {
65
+ /* Probe for Zbs: bext zero,zero,zero. */
66
+ got_sigill = 0;
67
+ asm volatile(".insn r 0x33, 5, 0x24, zero, zero, zero"
68
+ : : : "memory");
69
+ info |= got_sigill ? 0 : CPUINFO_ZBS;
70
+ left &= ~CPUINFO_ZBS;
71
+ }
72
+
73
if (left & CPUINFO_ZICOND) {
74
/* Probe for Zicond: czero.eqz zero,zero,zero. */
75
got_sigill = 0;
76
--
77
2.43.0
78
79
diff view generated by jsdifflib
New patch
1
Acked-by: Alistair Francis <alistair.francis@wdc.com>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Message-ID: <20250102181601.1421059-3-richard.henderson@linaro.org>
4
---
5
tcg/riscv/tcg-target-has.h | 8 +++++++-
6
tcg/riscv/tcg-target.c.inc | 11 +++++++++--
7
2 files changed, 16 insertions(+), 3 deletions(-)
1
8
9
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
10
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/riscv/tcg-target-has.h
12
+++ b/tcg/riscv/tcg-target-has.h
13
@@ -XXX,XX +XXX,XX @@ tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
14
/* ofs > 0 uses SRLIW; ofs == 0 uses add.uw. */
15
return ofs || (cpuinfo & CPUINFO_ZBA);
16
}
17
- return (cpuinfo & CPUINFO_ZBB) && ofs == 0 && len == 16;
18
+ switch (len) {
19
+ case 1:
20
+ return (cpuinfo & CPUINFO_ZBS) && ofs != 0;
21
+ case 16:
22
+ return (cpuinfo & CPUINFO_ZBB) && ofs == 0;
23
+ }
24
+ return false;
25
}
26
#define TCG_TARGET_extract_valid tcg_target_extract_valid
27
28
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
29
index XXXXXXX..XXXXXXX 100644
30
--- a/tcg/riscv/tcg-target.c.inc
31
+++ b/tcg/riscv/tcg-target.c.inc
32
@@ -XXX,XX +XXX,XX @@ typedef enum {
33
OPC_ANDI = 0x7013,
34
OPC_AUIPC = 0x17,
35
OPC_BEQ = 0x63,
36
+ OPC_BEXTI = 0x48005013,
37
OPC_BGE = 0x5063,
38
OPC_BGEU = 0x7063,
39
OPC_BLT = 0x4063,
40
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
41
}
42
/* FALLTHRU */
43
case INDEX_op_extract_i32:
44
- if (a2 == 0 && args[3] == 16) {
45
+ switch (args[3]) {
46
+ case 1:
47
+ tcg_out_opc_imm(s, OPC_BEXTI, a0, a1, a2);
48
+ break;
49
+ case 16:
50
+ tcg_debug_assert(a2 == 0);
51
tcg_out_ext16u(s, a0, a1);
52
- } else {
53
+ break;
54
+ default:
55
g_assert_not_reached();
56
}
57
break;
58
--
59
2.43.0
diff view generated by jsdifflib
1
From: Peter Maydell <peter.maydell@linaro.org>
1
From: Helge Deller <deller@kernel.org>
2
2
3
Implement support for named fields, i.e. where one field is defined
3
Add some missing fields which may be parsed by userspace applications.
4
in terms of another, rather than directly in terms of bits extracted
5
from the instruction.
6
4
7
The new method referenced_fields() on all the Field classes returns a
5
Signed-off-by: Helge Deller <deller@gmx.de>
8
list of fields that this field references. This just passes through,
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
except for the new NamedField class.
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-ID: <Z39B1wzNNpndmOxZ@p100>
9
---
10
linux-user/sparc/target_proc.h | 20 +++++++++++++++++++-
11
1 file changed, 19 insertions(+), 1 deletion(-)
10
12
11
We can then use referenced_fields() to:
13
diff --git a/linux-user/sparc/target_proc.h b/linux-user/sparc/target_proc.h
12
* construct a list of 'dangling references' for a format or
13
pattern, which is the fields that the format/pattern uses but
14
doesn't define itself
15
* do a topological sort, so that we output "field = value"
16
assignments in an order that means that we assign a field before
17
we reference it in a subsequent assignment
18
* check when we output the code for a pattern whether we need to
19
fill in the format fields before or after the pattern fields, and
20
do other error checking
21
22
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
23
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
24
Message-Id: <20230523120447.728365-6-peter.maydell@linaro.org>
25
---
26
scripts/decodetree.py | 145 ++++++++++++++++++++++++++++++++++++++++--
27
1 file changed, 139 insertions(+), 6 deletions(-)
28
29
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
30
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
31
--- a/scripts/decodetree.py
15
--- a/linux-user/sparc/target_proc.h
32
+++ b/scripts/decodetree.py
16
+++ b/linux-user/sparc/target_proc.h
33
@@ -XXX,XX +XXX,XX @@ def str_extract(self, lvalue_formatter):
17
@@ -XXX,XX +XXX,XX @@
34
s = 's' if self.sign else ''
18
35
return f'{s}extract{bitop_width}(insn, {self.pos}, {self.len})'
19
static int open_cpuinfo(CPUArchState *cpu_env, int fd)
36
20
{
37
+ def referenced_fields(self):
21
- dprintf(fd, "type\t\t: sun4u\n");
38
+ return []
22
+ int i, num_cpus;
23
+ const char *cpu_type;
39
+
24
+
40
def __eq__(self, other):
25
+ num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
41
return self.sign == other.sign and self.mask == other.mask
26
+ if (cpu_env->def.features & CPU_FEATURE_HYPV) {
42
27
+ cpu_type = "sun4v";
43
@@ -XXX,XX +XXX,XX @@ def str_extract(self, lvalue_formatter):
28
+ } else {
44
pos += f.len
29
+ cpu_type = "sun4u";
45
return ret
30
+ }
46
47
+ def referenced_fields(self):
48
+ l = []
49
+ for f in self.subs:
50
+ l.extend(f.referenced_fields())
51
+ return l
52
+
31
+
53
def __ne__(self, other):
32
+ dprintf(fd, "cpu\t\t: %s (QEMU)\n", cpu_env->def.name);
54
if len(self.subs) != len(other.subs):
33
+ dprintf(fd, "type\t\t: %s\n", cpu_type);
55
return True
34
+ dprintf(fd, "ncpus probed\t: %d\n", num_cpus);
56
@@ -XXX,XX +XXX,XX @@ def __str__(self):
35
+ dprintf(fd, "ncpus active\t: %d\n", num_cpus);
57
def str_extract(self, lvalue_formatter):
36
+ dprintf(fd, "State:\n");
58
return str(self.value)
37
+ for (i = 0; i < num_cpus; i++) {
59
38
+ dprintf(fd, "CPU%d:\t\t: online\n", i);
60
+ def referenced_fields(self):
39
+ }
61
+ return []
62
+
40
+
63
def __cmp__(self, other):
41
return 0;
64
return self.value - other.value
42
}
65
# end ConstField
43
#define HAVE_ARCH_PROC_CPUINFO
66
@@ -XXX,XX +XXX,XX @@ def str_extract(self, lvalue_formatter):
67
return (self.func + '(ctx, '
68
+ self.base.str_extract(lvalue_formatter) + ')')
69
70
+ def referenced_fields(self):
71
+ return self.base.referenced_fields()
72
+
73
def __eq__(self, other):
74
return self.func == other.func and self.base == other.base
75
76
@@ -XXX,XX +XXX,XX @@ def __str__(self):
77
def str_extract(self, lvalue_formatter):
78
return self.func + '(ctx)'
79
80
+ def referenced_fields(self):
81
+ return []
82
+
83
def __eq__(self, other):
84
return self.func == other.func
85
86
@@ -XXX,XX +XXX,XX @@ def __ne__(self, other):
87
return not self.__eq__(other)
88
# end ParameterField
89
90
+class NamedField:
91
+ """Class representing a field already named in the pattern"""
92
+ def __init__(self, name, sign, len):
93
+ self.mask = 0
94
+ self.sign = sign
95
+ self.len = len
96
+ self.name = name
97
+
98
+ def __str__(self):
99
+ return self.name
100
+
101
+ def str_extract(self, lvalue_formatter):
102
+ global bitop_width
103
+ s = 's' if self.sign else ''
104
+ lvalue = lvalue_formatter(self.name)
105
+ return f'{s}extract{bitop_width}({lvalue}, 0, {self.len})'
106
+
107
+ def referenced_fields(self):
108
+ return [self.name]
109
+
110
+ def __eq__(self, other):
111
+ return self.name == other.name
112
+
113
+ def __ne__(self, other):
114
+ return not self.__eq__(other)
115
+# end NamedField
116
117
class Arguments:
118
"""Class representing the extracted fields of a format"""
119
@@ -XXX,XX +XXX,XX @@ def output_def(self):
120
output('} ', self.struct_name(), ';\n\n')
121
# end Arguments
122
123
-
124
class General:
125
"""Common code between instruction formats and instruction patterns"""
126
def __init__(self, name, lineno, base, fixb, fixm, udfm, fldm, flds, w):
127
@@ -XXX,XX +XXX,XX @@ def __init__(self, name, lineno, base, fixb, fixm, udfm, fldm, flds, w):
128
self.fieldmask = fldm
129
self.fields = flds
130
self.width = w
131
+ self.dangling = None
132
133
def __str__(self):
134
return self.name + ' ' + str_match_bits(self.fixedbits, self.fixedmask)
135
@@ -XXX,XX +XXX,XX @@ def __str__(self):
136
def str1(self, i):
137
return str_indent(i) + self.__str__()
138
139
+ def dangling_references(self):
140
+ # Return a list of all named references which aren't satisfied
141
+ # directly by this format/pattern. This will be either:
142
+ # * a format referring to a field which is specified by the
143
+ # pattern(s) using it
144
+ # * a pattern referring to a field which is specified by the
145
+ # format it uses
146
+ # * a user error (referring to a field that doesn't exist at all)
147
+ if self.dangling is None:
148
+ # Compute this once and cache the answer
149
+ dangling = []
150
+ for n, f in self.fields.items():
151
+ for r in f.referenced_fields():
152
+ if r not in self.fields:
153
+ dangling.append(r)
154
+ self.dangling = dangling
155
+ return self.dangling
156
+
157
def output_fields(self, indent, lvalue_formatter):
158
+ # We use a topological sort to ensure that any use of NamedField
159
+ # comes after the initialization of the field it is referencing.
160
+ graph = {}
161
for n, f in self.fields.items():
162
- output(indent, lvalue_formatter(n), ' = ',
163
- f.str_extract(lvalue_formatter), ';\n')
164
+ refs = f.referenced_fields()
165
+ graph[n] = refs
166
+
167
+ try:
168
+ ts = TopologicalSorter(graph)
169
+ for n in ts.static_order():
170
+ # We only want to emit assignments for the keys
171
+ # in our fields list, not for anything that ends up
172
+ # in the tsort graph only because it was referenced as
173
+ # a NamedField.
174
+ try:
175
+ f = self.fields[n]
176
+ output(indent, lvalue_formatter(n), ' = ',
177
+ f.str_extract(lvalue_formatter), ';\n')
178
+ except KeyError:
179
+ pass
180
+ except CycleError as e:
181
+ # The second element of args is a list of nodes which form
182
+ # a cycle (there might be others too, but only one is reported).
183
+ # Pretty-print it to tell the user.
184
+ cycle = ' => '.join(e.args[1])
185
+ error(self.lineno, 'field definitions form a cycle: ' + cycle)
186
# end General
187
188
189
@@ -XXX,XX +XXX,XX @@ def output_code(self, i, extracted, outerbits, outermask):
190
ind = str_indent(i)
191
arg = self.base.base.name
192
output(ind, '/* ', self.file, ':', str(self.lineno), ' */\n')
193
+ # We might have named references in the format that refer to fields
194
+ # in the pattern, or named references in the pattern that refer
195
+ # to fields in the format. This affects whether we extract the fields
196
+ # for the format before or after the ones for the pattern.
197
+ # For simplicity we don't allow cross references in both directions.
198
+ # This is also where we catch the syntax error of referring to
199
+ # a nonexistent field.
200
+ fmt_refs = self.base.dangling_references()
201
+ for r in fmt_refs:
202
+ if r not in self.fields:
203
+ error(self.lineno, f'format refers to undefined field {r}')
204
+ pat_refs = self.dangling_references()
205
+ for r in pat_refs:
206
+ if r not in self.base.fields:
207
+ error(self.lineno, f'pattern refers to undefined field {r}')
208
+ if pat_refs and fmt_refs:
209
+ error(self.lineno, ('pattern that uses fields defined in format '
210
+ 'cannot use format that uses fields defined '
211
+ 'in pattern'))
212
+ if fmt_refs:
213
+ # pattern fields first
214
+ self.output_fields(ind, lambda n: 'u.f_' + arg + '.' + n)
215
+ assert not extracted, "dangling fmt refs but it was already extracted"
216
if not extracted:
217
output(ind, self.base.extract_name(),
218
'(ctx, &u.f_', arg, ', insn);\n')
219
- self.output_fields(ind, lambda n: 'u.f_' + arg + '.' + n)
220
+ if not fmt_refs:
221
+ # pattern fields last
222
+ self.output_fields(ind, lambda n: 'u.f_' + arg + '.' + n)
223
+
224
output(ind, 'if (', translate_prefix, '_', self.name,
225
'(ctx, &u.f_', arg, ')) return true;\n')
226
227
@@ -XXX,XX +XXX,XX @@ def output_code(self, i, extracted, outerbits, outermask):
228
ind = str_indent(i)
229
230
# If we identified all nodes below have the same format,
231
- # extract the fields now.
232
- if not extracted and self.base:
233
+ # extract the fields now. But don't do it if the format relies
234
+ # on named fields from the insn pattern, as those won't have
235
+ # been initialised at this point.
236
+ if not extracted and self.base and not self.base.dangling_references():
237
output(ind, self.base.extract_name(),
238
'(ctx, &u.f_', self.base.base.name, ', insn);\n')
239
extracted = True
240
@@ -XXX,XX +XXX,XX @@ def parse_field(lineno, name, toks):
241
"""Parse one instruction field from TOKS at LINENO"""
242
global fields
243
global insnwidth
244
+ global re_C_ident
245
246
# A "simple" field will have only one entry;
247
# a "multifield" will have several.
248
@@ -XXX,XX +XXX,XX @@ def parse_field(lineno, name, toks):
249
func = func[1]
250
continue
251
252
+ if re.fullmatch(re_C_ident + ':s[0-9]+', t):
253
+ # Signed named field
254
+ subtoks = t.split(':')
255
+ n = subtoks[0]
256
+ le = int(subtoks[1])
257
+ f = NamedField(n, True, le)
258
+ subs.append(f)
259
+ width += le
260
+ continue
261
+ if re.fullmatch(re_C_ident + ':[0-9]+', t):
262
+ # Unsigned named field
263
+ subtoks = t.split(':')
264
+ n = subtoks[0]
265
+ le = int(subtoks[1])
266
+ f = NamedField(n, False, le)
267
+ subs.append(f)
268
+ width += le
269
+ continue
270
+
271
if re.fullmatch('[0-9]+:s[0-9]+', t):
272
# Signed field extract
273
subtoks = t.split(':s')
274
--
44
--
275
2.34.1
45
2.43.0
diff view generated by jsdifflib
1
From: Peter Maydell <peter.maydell@linaro.org>
1
From: Ilya Leoshkevich <iii@linux.ibm.com>
2
2
3
To support named fields, we will need to be able to do a topological
3
These similarly named functions serve different purposes; add
4
sort (so that we ensure that we output the assignment to field A
4
docstrings to highlight them.
5
before the assignment to field B if field B refers to field A by
6
name). The good news is that there is a tsort in the python standard
7
library; the bad news is that it was only added in Python 3.9.
8
5
9
To bridge the gap between our current minimum supported Python
6
Suggested-by: Alex Bennée <alex.bennee@linaro.org>
10
version and 3.9, provide a local implementation that has the
7
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
11
same API as the stdlib version for the parts we care about.
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
12
In future when QEMU's minimum Python version requirement reaches
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
13
3.9 we can delete this code and replace it with an 'import' line.
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-ID: <20250116213214.5695-1-iii@linux.ibm.com>
12
---
13
include/tcg/tcg.h | 41 +++++++++++++++++++++++++++++++++++++++++
14
accel/tcg/cpu-exec.c | 15 ++++++++++++++-
15
2 files changed, 55 insertions(+), 1 deletion(-)
14
16
15
The core of this implementation is based on
17
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
16
https://code.activestate.com/recipes/578272-topological-sort/
18
index XXXXXXX..XXXXXXX 100644
17
which is MIT-licensed.
19
--- a/include/tcg/tcg.h
20
+++ b/include/tcg/tcg.h
21
@@ -XXX,XX +XXX,XX @@ void tcg_region_reset_all(void);
22
size_t tcg_code_size(void);
23
size_t tcg_code_capacity(void);
24
25
+/**
26
+ * tcg_tb_insert:
27
+ * @tb: translation block to insert
28
+ *
29
+ * Insert @tb into the region trees.
30
+ */
31
void tcg_tb_insert(TranslationBlock *tb);
32
+
33
+/**
34
+ * tcg_tb_remove:
35
+ * @tb: translation block to remove
36
+ *
37
+ * Remove @tb from the region trees.
38
+ */
39
void tcg_tb_remove(TranslationBlock *tb);
40
+
41
+/**
42
+ * tcg_tb_lookup:
43
+ * @tc_ptr: host PC to look up
44
+ *
45
+ * Look up a translation block inside the region trees by @tc_ptr. This is
46
+ * useful for exception handling, but must not be used for the purposes of
47
+ * executing the returned translation block. See struct tb_tc for more
48
+ * information.
49
+ *
50
+ * Returns: a translation block previously inserted into the region trees,
51
+ * such that @tc_ptr points anywhere inside the code generated for it, or
52
+ * NULL.
53
+ */
54
TranslationBlock *tcg_tb_lookup(uintptr_t tc_ptr);
55
+
56
+/**
57
+ * tcg_tb_foreach:
58
+ * @func: callback
59
+ * @user_data: opaque value to pass to @callback
60
+ *
61
+ * Call @func for each translation block inserted into the region trees.
62
+ */
63
void tcg_tb_foreach(GTraverseFunc func, gpointer user_data);
64
+
65
+/**
66
+ * tcg_nb_tbs:
67
+ *
68
+ * Returns: the number of translation blocks inserted into the region trees.
69
+ */
70
size_t tcg_nb_tbs(void);
71
72
/* user-mode: Called with mmap_lock held. */
73
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
74
index XXXXXXX..XXXXXXX 100644
75
--- a/accel/tcg/cpu-exec.c
76
+++ b/accel/tcg/cpu-exec.c
77
@@ -XXX,XX +XXX,XX @@ static TranslationBlock *tb_htable_lookup(CPUState *cpu, vaddr pc,
78
return qht_lookup_custom(&tb_ctx.htable, &desc, h, tb_lookup_cmp);
79
}
80
81
-/* Might cause an exception, so have a longjmp destination ready */
82
+/**
83
+ * tb_lookup:
84
+ * @cpu: CPU that will execute the returned translation block
85
+ * @pc: guest PC
86
+ * @cs_base: arch-specific value associated with translation block
87
+ * @flags: arch-specific translation block flags
88
+ * @cflags: CF_* flags
89
+ *
90
+ * Look up a translation block inside the QHT using @pc, @cs_base, @flags and
91
+ * @cflags. Uses @cpu's tb_jmp_cache. Might cause an exception, so have a
92
+ * longjmp destination ready.
93
+ *
94
+ * Returns: an existing translation block or NULL.
95
+ */
96
static inline TranslationBlock *tb_lookup(CPUState *cpu, vaddr pc,
97
uint64_t cs_base, uint32_t flags,
98
uint32_t cflags)
99
--
100
2.43.0
18
101
19
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
20
Acked-by: Richard Henderson <richard.henderson@linaro.org>
21
Message-Id: <20230523120447.728365-5-peter.maydell@linaro.org>
22
---
23
scripts/decodetree.py | 74 +++++++++++++++++++++++++++++++++++++++++++
24
1 file changed, 74 insertions(+)
25
102
26
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
27
index XXXXXXX..XXXXXXX 100644
28
--- a/scripts/decodetree.py
29
+++ b/scripts/decodetree.py
30
@@ -XXX,XX +XXX,XX @@
31
re_fmt_ident = '@[a-zA-Z0-9_]*'
32
re_pat_ident = '[a-zA-Z0-9_]*'
33
34
+# Local implementation of a topological sort. We use the same API that
35
+# the Python graphlib does, so that when QEMU moves forward to a
36
+# baseline of Python 3.9 or newer this code can all be dropped and
37
+# replaced with:
38
+# from graphlib import TopologicalSorter, CycleError
39
+#
40
+# https://docs.python.org/3.9/library/graphlib.html#graphlib.TopologicalSorter
41
+#
42
+# We only implement the parts of TopologicalSorter we care about:
43
+# ts = TopologicalSorter(graph=None)
44
+# create the sorter. graph is a dictionary whose keys are
45
+# nodes and whose values are lists of the predecessors of that node.
46
+# (That is, if graph contains "A" -> ["B", "C"] then we must output
47
+# B and C before A.)
48
+# ts.static_order()
49
+# returns a list of all the nodes in sorted order, or raises CycleError
50
+# CycleError
51
+# exception raised if there are cycles in the graph. The second
52
+# element in the args attribute is a list of nodes which form a
53
+# cycle; the first and last element are the same, eg [a, b, c, a]
54
+# (Our implementation doesn't give the order correctly.)
55
+#
56
+# For our purposes we can assume that the data set is always small
57
+# (typically 10 nodes or less, actual links in the graph very rare),
58
+# so we don't need to worry about efficiency of implementation.
59
+#
60
+# The core of this implementation is from
61
+# https://code.activestate.com/recipes/578272-topological-sort/
62
+# (but updated to Python 3), and is under the MIT license.
63
+
64
+class CycleError(ValueError):
65
+ """Subclass of ValueError raised if cycles exist in the graph"""
66
+ pass
67
+
68
+class TopologicalSorter:
69
+ """Topologically sort a graph"""
70
+ def __init__(self, graph=None):
71
+ self.graph = graph
72
+
73
+ def static_order(self):
74
+ # We do the sort right here, unlike the stdlib version
75
+ from functools import reduce
76
+ data = {}
77
+ r = []
78
+
79
+ if not self.graph:
80
+ return []
81
+
82
+ # This code wants the values in the dict to be specifically sets
83
+ for k, v in self.graph.items():
84
+ data[k] = set(v)
85
+
86
+ # Find all items that don't depend on anything.
87
+ extra_items_in_deps = (reduce(set.union, data.values())
88
+ - set(data.keys()))
89
+ # Add empty dependencies where needed
90
+ data.update({item:{} for item in extra_items_in_deps})
91
+ while True:
92
+ ordered = set(item for item, dep in data.items() if not dep)
93
+ if not ordered:
94
+ break
95
+ r.extend(ordered)
96
+ data = {item: (dep - ordered)
97
+ for item, dep in data.items()
98
+ if item not in ordered}
99
+ if data:
100
+ # This doesn't give as nice results as the stdlib, which
101
+ # gives you the cycle by listing the nodes in order. Here
102
+ # we only know the nodes in the cycle but not their order.
103
+ raise CycleError(f'nodes are in a cycle', list(data.keys()))
104
+
105
+ return r
106
+# end TopologicalSorter
107
+
108
def error_with_file(file, lineno, *args):
109
"""Print an error message from file:line and args and exit."""
110
global output_file
111
--
112
2.34.1
diff view generated by jsdifflib
1
From: Peter Maydell <peter.maydell@linaro.org>
1
From: Ilya Leoshkevich <iii@linux.ibm.com>
2
2
3
To support referring to other named fields in field definitions, we
3
Currently one-insn TBs created from I/O memory are not added to
4
need to pass the str_extract() method a function which tells it how
4
region_trees. Therefore, when they generate exceptions, they are not
5
to emit the code for a previously initialized named field. (In
5
handled by cpu_restore_state_from_tb().
6
Pattern::output_code() the other field will be "u.f_foo.field", and
7
in Format::output_extract() it is "a->field".)
8
6
9
Refactor the two callsites that currently do "output code to
7
For x86 this is not a problem, because x86_restore_state_to_opc() only
10
initialize each field", and have them pass a lambda that defines how
8
restores pc and cc, which already have the correct values if the first
11
to format the lvalue in each case. This is then used both in
9
TB instruction causes an exception. However, on several other
12
emitting the LHS of the assignment and also passed down to
10
architectures, restore_state_to_opc() is not stricly limited to state
13
str_extract() as a new argument (unused at the moment, but will be
11
restoration and affects some exception-related registers, where guests
14
used in the following patch).
12
can notice incorrect values, for example:
15
13
16
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
14
- arm's exception.syndrome;
15
- hppa's unwind_breg;
16
- riscv's excp_uw2;
17
- s390x's int_pgm_ilen.
18
19
Fix by always calling tcg_tb_insert(). This may increase the size of
20
region_trees, but tcg_region_reset_all() clears it once code_gen_buffer
21
fills up, so it will not grow uncontrollably.
22
23
Do not call tb_link_page(), which would add such TBs to the QHT, to
24
prevent tb_lookup() from finding them. These TBs are single-use, since
25
subsequent reads from I/O memory may return different values; they are
26
not removed from code_gen_buffer only in order to keep things simple.
27
28
Co-developed-by: Nina Schoetterl-Glausch <nsg@linux.ibm.com>
17
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
18
Message-Id: <20230523120447.728365-4-peter.maydell@linaro.org>
30
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
31
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
32
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
33
Message-ID: <20250116213214.5695-2-iii@linux.ibm.com>
19
---
34
---
20
scripts/decodetree.py | 26 +++++++++++++++-----------
35
accel/tcg/translate-all.c | 29 +++++++++++++++++++----------
21
1 file changed, 15 insertions(+), 11 deletions(-)
36
1 file changed, 19 insertions(+), 10 deletions(-)
22
37
23
diff --git a/scripts/decodetree.py b/scripts/decodetree.py
38
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
24
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
25
--- a/scripts/decodetree.py
40
--- a/accel/tcg/translate-all.c
26
+++ b/scripts/decodetree.py
41
+++ b/accel/tcg/translate-all.c
27
@@ -XXX,XX +XXX,XX @@ def __str__(self):
42
@@ -XXX,XX +XXX,XX @@ TranslationBlock *tb_gen_code(CPUState *cpu,
28
s = ''
43
tb_reset_jump(tb, 1);
29
return str(self.pos) + ':' + s + str(self.len)
44
}
30
45
31
- def str_extract(self):
46
- /*
32
+ def str_extract(self, lvalue_formatter):
47
- * If the TB is not associated with a physical RAM page then it must be
33
global bitop_width
48
- * a temporary one-insn TB, and we have nothing left to do. Return early
34
s = 's' if self.sign else ''
49
- * before attempting to link to other TBs or add to the lookup table.
35
return f'{s}extract{bitop_width}(insn, {self.pos}, {self.len})'
50
- */
36
@@ -XXX,XX +XXX,XX @@ def __init__(self, subs, mask):
51
- if (tb_page_addr0(tb) == -1) {
37
def __str__(self):
52
- assert_no_pages_locked();
38
return str(self.subs)
53
- return tb;
39
54
- }
40
- def str_extract(self):
55
-
41
+ def str_extract(self, lvalue_formatter):
56
/*
42
global bitop_width
57
* Insert TB into the corresponding region tree before publishing it
43
ret = '0'
58
* through QHT. Otherwise rewinding happened in the TB might fail to
44
pos = 0
59
@@ -XXX,XX +XXX,XX @@ TranslationBlock *tb_gen_code(CPUState *cpu,
45
for f in reversed(self.subs):
60
*/
46
- ext = f.str_extract()
61
tcg_tb_insert(tb);
47
+ ext = f.str_extract(lvalue_formatter)
62
48
if pos == 0:
63
+ /*
49
ret = ext
64
+ * If the TB is not associated with a physical RAM page then it must be
50
else:
65
+ * a temporary one-insn TB.
51
@@ -XXX,XX +XXX,XX @@ def __init__(self, value):
66
+ *
52
def __str__(self):
67
+ * Such TBs must be added to region trees in order to make sure that
53
return str(self.value)
68
+ * restore_state_to_opc() - which on some architectures is not limited to
54
69
+ * rewinding, but also affects exception handling! - is called when such a
55
- def str_extract(self):
70
+ * TB causes an exception.
56
+ def str_extract(self, lvalue_formatter):
71
+ *
57
return str(self.value)
72
+ * At the same time, temporary one-insn TBs must be executed at most once,
58
73
+ * because subsequent reads from, e.g., I/O memory may return different
59
def __cmp__(self, other):
74
+ * values. So return early before attempting to link to other TBs or add
60
@@ -XXX,XX +XXX,XX @@ def __init__(self, func, base):
75
+ * to the QHT.
61
def __str__(self):
76
+ */
62
return self.func + '(' + str(self.base) + ')'
77
+ if (tb_page_addr0(tb) == -1) {
63
78
+ assert_no_pages_locked();
64
- def str_extract(self):
79
+ return tb;
65
- return self.func + '(ctx, ' + self.base.str_extract() + ')'
80
+ }
66
+ def str_extract(self, lvalue_formatter):
67
+ return (self.func + '(ctx, '
68
+ + self.base.str_extract(lvalue_formatter) + ')')
69
70
def __eq__(self, other):
71
return self.func == other.func and self.base == other.base
72
@@ -XXX,XX +XXX,XX @@ def __init__(self, func):
73
def __str__(self):
74
return self.func
75
76
- def str_extract(self):
77
+ def str_extract(self, lvalue_formatter):
78
return self.func + '(ctx)'
79
80
def __eq__(self, other):
81
@@ -XXX,XX +XXX,XX @@ def __str__(self):
82
83
def str1(self, i):
84
return str_indent(i) + self.__str__()
85
+
81
+
86
+ def output_fields(self, indent, lvalue_formatter):
82
/*
87
+ for n, f in self.fields.items():
83
* No explicit memory barrier is required -- tb_link_page() makes the
88
+ output(indent, lvalue_formatter(n), ' = ',
84
* TB visible in a consistent state.
89
+ f.str_extract(lvalue_formatter), ';\n')
90
# end General
91
92
93
@@ -XXX,XX +XXX,XX @@ def extract_name(self):
94
def output_extract(self):
95
output('static void ', self.extract_name(), '(DisasContext *ctx, ',
96
self.base.struct_name(), ' *a, ', insntype, ' insn)\n{\n')
97
- for n, f in self.fields.items():
98
- output(' a->', n, ' = ', f.str_extract(), ';\n')
99
+ self.output_fields(str_indent(4), lambda n: 'a->' + n)
100
output('}\n\n')
101
# end Format
102
103
@@ -XXX,XX +XXX,XX @@ def output_code(self, i, extracted, outerbits, outermask):
104
if not extracted:
105
output(ind, self.base.extract_name(),
106
'(ctx, &u.f_', arg, ', insn);\n')
107
- for n, f in self.fields.items():
108
- output(ind, 'u.f_', arg, '.', n, ' = ', f.str_extract(), ';\n')
109
+ self.output_fields(ind, lambda n: 'u.f_' + arg + '.' + n)
110
output(ind, 'if (', translate_prefix, '_', self.name,
111
'(ctx, &u.f_', arg, ')) return true;\n')
112
113
--
85
--
114
2.34.1
86
2.43.0
87
88
diff view generated by jsdifflib
1
From: Peter Maydell <peter.maydell@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Document the named field syntax that we want to implement for the
3
These helpers don't alter float_status. Make it const.
4
decodetree script. This allows a field to be defined in terms of
5
some other field that the instruction pattern has already set, for
6
example:
7
4
8
%sz_imm 10:3 sz:3 !function=expand_sz_imm
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-ID: <20250116214359.67295-1-philmd@linaro.org>
9
---
10
include/fpu/softfloat-helpers.h | 25 ++++++++++++++-----------
11
1 file changed, 14 insertions(+), 11 deletions(-)
9
12
10
to allow a function to be passed both an immediate field from the
13
diff --git a/include/fpu/softfloat-helpers.h b/include/fpu/softfloat-helpers.h
11
instruction and also a sz value which might have been specified by
14
index XXXXXXX..XXXXXXX 100644
12
the instruction pattern directly (sz=1, etc) rather than being a
15
--- a/include/fpu/softfloat-helpers.h
13
simple field within the instruction.
16
+++ b/include/fpu/softfloat-helpers.h
17
@@ -XXX,XX +XXX,XX @@ static inline void set_no_signaling_nans(bool val, float_status *status)
18
status->no_signaling_nans = val;
19
}
20
21
-static inline bool get_float_detect_tininess(float_status *status)
22
+static inline bool get_float_detect_tininess(const float_status *status)
23
{
24
return status->tininess_before_rounding;
25
}
26
27
-static inline FloatRoundMode get_float_rounding_mode(float_status *status)
28
+static inline FloatRoundMode get_float_rounding_mode(const float_status *status)
29
{
30
return status->float_rounding_mode;
31
}
32
33
-static inline int get_float_exception_flags(float_status *status)
34
+static inline int get_float_exception_flags(const float_status *status)
35
{
36
return status->float_exception_flags;
37
}
38
39
static inline FloatX80RoundPrec
40
-get_floatx80_rounding_precision(float_status *status)
41
+get_floatx80_rounding_precision(const float_status *status)
42
{
43
return status->floatx80_rounding_precision;
44
}
45
46
-static inline Float2NaNPropRule get_float_2nan_prop_rule(float_status *status)
47
+static inline Float2NaNPropRule
48
+get_float_2nan_prop_rule(const float_status *status)
49
{
50
return status->float_2nan_prop_rule;
51
}
52
53
-static inline Float3NaNPropRule get_float_3nan_prop_rule(float_status *status)
54
+static inline Float3NaNPropRule
55
+get_float_3nan_prop_rule(const float_status *status)
56
{
57
return status->float_3nan_prop_rule;
58
}
59
60
-static inline FloatInfZeroNaNRule get_float_infzeronan_rule(float_status *status)
61
+static inline FloatInfZeroNaNRule
62
+get_float_infzeronan_rule(const float_status *status)
63
{
64
return status->float_infzeronan_rule;
65
}
66
67
-static inline uint8_t get_float_default_nan_pattern(float_status *status)
68
+static inline uint8_t get_float_default_nan_pattern(const float_status *status)
69
{
70
return status->default_nan_pattern;
71
}
72
73
-static inline bool get_flush_to_zero(float_status *status)
74
+static inline bool get_flush_to_zero(const float_status *status)
75
{
76
return status->flush_to_zero;
77
}
78
79
-static inline bool get_flush_inputs_to_zero(float_status *status)
80
+static inline bool get_flush_inputs_to_zero(const float_status *status)
81
{
82
return status->flush_inputs_to_zero;
83
}
84
85
-static inline bool get_default_nan_mode(float_status *status)
86
+static inline bool get_default_nan_mode(const float_status *status)
87
{
88
return status->default_nan_mode;
89
}
90
--
91
2.43.0
14
92
15
Note that the restriction on not having the format referring to the
16
pattern and the pattern referring to the format simultaneously is a
17
restriction of the decoder generator rather than inherently being a
18
silly thing to do.
19
93
20
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
21
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
22
Message-Id: <20230523120447.728365-3-peter.maydell@linaro.org>
23
---
24
docs/devel/decodetree.rst | 33 ++++++++++++++++++++++++++++-----
25
1 file changed, 28 insertions(+), 5 deletions(-)
26
27
diff --git a/docs/devel/decodetree.rst b/docs/devel/decodetree.rst
28
index XXXXXXX..XXXXXXX 100644
29
--- a/docs/devel/decodetree.rst
30
+++ b/docs/devel/decodetree.rst
31
@@ -XXX,XX +XXX,XX @@ Fields
32
33
Syntax::
34
35
- field_def := '%' identifier ( unnamed_field )* ( !function=identifier )?
36
+ field_def := '%' identifier ( field )* ( !function=identifier )?
37
+ field := unnamed_field | named_field
38
unnamed_field := number ':' ( 's' ) number
39
+ named_field := identifier ':' ( 's' ) number
40
41
For *unnamed_field*, the first number is the least-significant bit position
42
of the field and the second number is the length of the field. If the 's' is
43
-present, the field is considered signed. If multiple ``unnamed_fields`` are
44
-present, they are concatenated. In this way one can define disjoint fields.
45
+present, the field is considered signed.
46
+
47
+A *named_field* refers to some other field in the instruction pattern
48
+or format. Regardless of the length of the other field where it is
49
+defined, it will be inserted into this field with the specified
50
+signedness and bit width.
51
+
52
+Field definitions that involve loops (i.e. where a field is defined
53
+directly or indirectly in terms of itself) are errors.
54
+
55
+A format can include fields that refer to named fields that are
56
+defined in the instruction pattern(s) that use the format.
57
+Conversely, an instruction pattern can include fields that refer to
58
+named fields that are defined in the format it uses. However you
59
+cannot currently do both at once (i.e. pattern P uses format F; F has
60
+a field A that refers to a named field B that is defined in P, and P
61
+has a field C that refers to a named field D that is defined in F).
62
+
63
+If multiple ``fields`` are present, they are concatenated.
64
+In this way one can define disjoint fields.
65
66
If ``!function`` is specified, the concatenated result is passed through the
67
named function, taking and returning an integral value.
68
69
-One may use ``!function`` with zero ``unnamed_fields``. This case is called
70
+One may use ``!function`` with zero ``fields``. This case is called
71
a *parameter*, and the named function is only passed the ``DisasContext``
72
and returns an integral value extracted from there.
73
74
-A field with no ``unnamed_fields`` and no ``!function`` is in error.
75
+A field with no ``fields`` and no ``!function`` is in error.
76
77
Field examples:
78
79
@@ -XXX,XX +XXX,XX @@ Field examples:
80
| %shimm8 5:s8 13:1 | expand_shimm8(sextract(i, 5, 8) << 1 | |
81
| !function=expand_shimm8 | extract(i, 13, 1)) |
82
+---------------------------+---------------------------------------------+
83
+| %sz_imm 10:2 sz:3 | expand_sz_imm(extract(i, 10, 2) << 3 | |
84
+| !function=expand_sz_imm | extract(a->sz, 0, 3)) |
85
++---------------------------+---------------------------------------------+
86
87
Argument Sets
88
=============
89
--
90
2.34.1
diff view generated by jsdifflib