1
The following changes since commit 579510e196a544b42bd8bca9cc61688d4d1211ac:
1
Note that I have refreshed the expiry of my public key.
2
2
and pushed to keys.openpgp.org.
3
Merge tag 'pull-monitor-2023-02-03-v2' of https://repo.or.cz/qemu/armbru into staging (2023-02-04 10:19:55 +0000)
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-20230204
14
https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20250117
8
15
9
for you to fetch changes up to a2495ede07498ee36b18b03e7038ba30c9871bb2:
16
for you to fetch changes up to db1649823d4f27b924a5aa5f9e0111457accb798:
10
17
11
tcg/aarch64: Fix patching of LDR in tb_target_set_jmp_target (2023-02-04 06:19:43 -1000)
18
softfloat: Constify helpers returning float_status field (2025-01-17 08:29:25 -0800)
12
19
13
----------------------------------------------------------------
20
----------------------------------------------------------------
14
tcg: Add support for TCGv_i128 in parameters and returns.
21
tcg:
15
tcg: Add support for TCGv_i128 in cmpxchg.
22
- Add TCGOP_TYPE, TCGOP_FLAGS.
16
tcg: Test CPUJumpCache in tb_jmp_cache_clear_page
23
- Pass type and flags to tcg_op_supported, tcg_target_op_def.
17
tcg: Split out tcg_gen_nonatomic_cmpxchg_i{32,64}
24
- Split out tcg-target-has.h and unexport from tcg.h.
18
tcg/aarch64: Fix patching of LDR in tb_target_set_jmp_target
25
- Reorg constraint processing; constify TCGOpDef.
19
target/arm: Use tcg_gen_atomic_cmpxchg_i128
26
- Make extract, sextract, deposit opcodes mandatory.
20
target/i386: Use tcg_gen_atomic_cmpxchg_i128
27
- Merge ext{8,16,32}{s,u} opcodes into {s}extract.
21
target/i386: Use tcg_gen_nonatomic_cmpxchg_i{32,64}
28
tcg/mips: Expand bswap unconditionally
22
target/s390x: Use tcg_gen_atomic_cmpxchg_i128
29
tcg/riscv: Use SRAIW, SRLIW for {s}extract_i64
23
target/s390x: Use TCGv_i128 in passing and returning float128
30
tcg/riscv: Use BEXTI for single-bit extractions
24
target/s390x: Implement CC_OP_NZ in gen_op_calc_cc
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
25
37
26
----------------------------------------------------------------
38
----------------------------------------------------------------
27
Eric Auger (1):
39
Helge Deller (1):
28
accel/tcg: Test CPUJumpCache in tb_jmp_cache_clear_page
40
linux-user: Add missing /proc/cpuinfo fields for sparc
29
41
30
Ilya Leoshkevich (3):
42
Ilya Leoshkevich (2):
31
tests/tcg/s390x: Add div.c
43
tcg: Document tb_lookup() and tcg_tb_lookup()
32
tests/tcg/s390x: Add clst.c
44
accel/tcg: Call tcg_tb_insert() for one-insn TBs
33
tests/tcg/s390x: Add cdsg.c
45
34
46
LIU Zhiwei (1):
35
Richard Henderson (36):
47
disas/riscv: Guard dec->cfg dereference for host disassemble
36
tcg: Init temp_subindex in liveness_pass_2
48
37
tcg: Define TCG_TYPE_I128 and related helper macros
49
Philippe Mathieu-Daudé (1):
38
tcg: Handle dh_typecode_i128 with TCG_CALL_{RET,ARG}_NORMAL
50
softfloat: Constify helpers returning float_status field
39
tcg: Allocate objects contiguously in temp_allocate_frame
51
40
tcg: Introduce tcg_out_addi_ptr
52
Richard Henderson (63):
41
tcg: Add TCG_CALL_{RET,ARG}_BY_REF
53
tcg: Move call abi parameters from tcg-target.h to tcg-target.c.inc
42
tcg: Introduce tcg_target_call_oarg_reg
54
tcg: Replace TCGOP_VECL with TCGOP_TYPE
43
tcg: Add TCG_CALL_RET_BY_VEC
55
tcg: Move tcg_op_insert_{after,before} decls to tcg-internal.h
44
include/qemu/int128: Use Int128 structure for TCI
56
tcg: Copy TCGOP_TYPE in tcg_op_insert_{after,before}
45
tcg/i386: Add TCG_TARGET_CALL_{RET,ARG}_I128
57
tcg: Add TCGOP_FLAGS
46
tcg/tci: Fix big-endian return register ordering
58
tcg: Add type and flags arguments to tcg_op_supported
47
tcg/tci: Add TCG_TARGET_CALL_{RET,ARG}_I128
59
target/arm: Do not test TCG_TARGET_HAS_bitsel_vec
48
tcg: Add TCG_TARGET_CALL_{RET,ARG}_I128
60
target/arm: Use tcg_op_supported
49
tcg: Add temp allocation for TCGv_i128
61
target/tricore: Use tcg_op_supported
50
tcg: Add basic data movement for TCGv_i128
62
tcg: Add tcg_op_deposit_valid
51
tcg: Add guest load/store primitives for TCGv_i128
63
target/i386: Remove TCG_TARGET_extract_tl_valid
52
tcg: Add tcg_gen_{non}atomic_cmpxchg_i128
64
target/i386: Use tcg_op_deposit_valid
53
tcg: Split out tcg_gen_nonatomic_cmpxchg_i{32,64}
65
target/i386: Use tcg_op_supported
54
target/arm: Use tcg_gen_atomic_cmpxchg_i128 for STXP
66
tcg: Remove TCG_TARGET_NEED_LDST_LABELS and TCG_TARGET_NEED_POOL_LABELS
55
target/arm: Use tcg_gen_atomic_cmpxchg_i128 for CASP
67
tcg: Rename tcg-target.opc.h to tcg-target-opc.h.inc
56
target/ppc: Use tcg_gen_atomic_cmpxchg_i128 for STQCX
68
tcg/tci: Move TCI specific opcodes to tcg-target-opc.h.inc
57
tests/tcg/s390x: Add long-double.c
69
tcg: Move fallback tcg_can_emit_vec_op out of line
58
target/s390x: Use a single return for helper_divs32/u32
70
tcg/ppc: Remove TCGPowerISA enum
59
target/s390x: Use a single return for helper_divs64/u64
71
tcg: Extract default TCG_TARGET_HAS_foo definitions to 'tcg-has.h'
60
target/s390x: Use Int128 for return from CLST
72
tcg/aarch64: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
61
target/s390x: Use Int128 for return from CKSM
73
tcg/arm: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
62
target/s390x: Use Int128 for return from TRE
74
tcg/i386: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
63
target/s390x: Copy wout_x1 to wout_x1_P
75
tcg/loongarch64: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
64
target/s390x: Use Int128 for returning float128
76
tcg/mips: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
65
target/s390x: Use Int128 for passing float128
77
tcg/ppc: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
66
target/s390x: Use tcg_gen_atomic_cmpxchg_i128 for CDSG
78
tcg/riscv: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
67
target/s390x: Implement CC_OP_NZ in gen_op_calc_cc
79
tcg/s390x: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
68
target/i386: Split out gen_cmpxchg8b, gen_cmpxchg16b
80
tcg/sparc64: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
69
target/i386: Inline cmpxchg8b
81
tcg/tci: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
70
target/i386: Inline cmpxchg16b
82
tcg: Include 'tcg-target-has.h' once in 'tcg-has.h'
71
tcg/aarch64: Fix patching of LDR in tb_target_set_jmp_target
83
tcg: Only include 'tcg-has.h' when necessary
72
84
tcg: Split out tcg-target-mo.h
73
accel/tcg/tcg-runtime.h | 11 ++
85
tcg: Use C_NotImplemented in tcg_target_op_def
74
include/exec/cpu_ldst.h | 10 +
86
tcg: Change have_vec to has_type in tcg_op_supported
75
include/exec/helper-head.h | 7 +
87
tcg: Reorg process_op_defs
76
include/qemu/atomic128.h | 29 ++-
88
tcg: Remove args_ct from TCGOpDef
77
include/qemu/int128.h | 25 ++-
89
tcg: Constify tcg_op_defs
78
include/tcg/tcg-op.h | 15 ++
90
tcg: Validate op supported in opcode_args_ct
79
include/tcg/tcg.h | 49 ++++-
91
tcg: Add TCG_OPF_NOT_PRESENT to opcodes without inputs or outputs
80
target/arm/helper-a64.h | 8 -
92
tcg: Pass type and flags to tcg_target_op_def
81
target/i386/helper.h | 6 -
93
tcg: Add TCGType argument to tcg_out_op
82
target/ppc/helper.h | 2 -
94
tcg: Remove TCG_OPF_64BIT
83
target/s390x/helper.h | 54 +++---
95
tcg: Drop implementation checks from tcg-opc.h
84
tcg/aarch64/tcg-target.h | 2 +
96
tcg: Replace IMPLVEC with TCG_OPF_VECTOR
85
tcg/arm/tcg-target.h | 2 +
97
tcg/mips: Expand bswap unconditionally
86
tcg/i386/tcg-target.h | 10 +
98
tcg/i386: Handle all 8-bit extensions for i686
87
tcg/loongarch64/tcg-target.h | 2 +
99
tcg/i386: Fold the ext{8,16,32}[us] cases into {s}extract
88
tcg/mips/tcg-target.h | 2 +
100
tcg/aarch64: Provide TCG_TARGET_{s}extract_valid
89
tcg/riscv/tcg-target.h | 3 +
101
tcg/aarch64: Expand extract with offset 0 with andi
90
tcg/s390x/tcg-target.h | 2 +
102
tcg/arm: Add full [US]XT[BH] into {s}extract
91
tcg/sparc64/tcg-target.h | 2 +
103
tcg/loongarch64: Fold the ext{8,16,32}[us] cases into {s}extract
92
tcg/tcg-internal.h | 17 ++
104
tcg/mips: Fold the ext{8,16,32}[us] cases into {s}extract
93
tcg/tci/tcg-target.h | 3 +
105
tcg/ppc: Fold the ext{8,16,32}[us] cases into {s}extract
94
target/s390x/tcg/insn-data.h.inc | 60 +++---
106
tcg/riscv64: Fold the ext{8,16,32}[us] cases into {s}extract
95
accel/tcg/cputlb.c | 119 +++++++++++-
107
tcg/riscv: Use SRAIW, SRLIW for {s}extract_i64
96
accel/tcg/user-exec.c | 66 +++++++
108
tcg/s390x: Fold the ext{8,16,32}[us] cases into {s}extract
97
target/arm/helper-a64.c | 147 ---------------
109
tcg/sparc64: Use SRA, SRL for {s}extract_i64
98
target/arm/translate-a64.c | 121 ++++++------
110
tcg/tci: Provide TCG_TARGET_{s}extract_valid
99
target/i386/tcg/mem_helper.c | 126 -------------
111
tcg/tci: Remove assertions for deposit and extract
100
target/i386/tcg/translate.c | 126 +++++++++++--
112
tcg: Remove TCG_TARGET_HAS_{s}extract_{i32,i64}
101
target/ppc/mem_helper.c | 44 -----
113
tcg: Remove TCG_TARGET_HAS_deposit_{i32,i64}
102
target/ppc/translate.c | 102 +++++-----
114
util/cpuinfo-riscv: Detect Zbs
103
target/s390x/tcg/fpu_helper.c | 103 +++++-----
115
tcg/riscv: Use BEXTI for single-bit extractions
104
target/s390x/tcg/int_helper.c | 64 +++----
116
105
target/s390x/tcg/mem_helper.c | 77 +-------
117
accel/tcg/internal-target.h | 1 +
106
target/s390x/tcg/translate.c | 212 ++++++++++++++-------
118
host/include/riscv/host/cpuinfo.h | 5 +-
107
tcg/tcg-op.c | 393 +++++++++++++++++++++++++++++++++------
119
include/fpu/softfloat-helpers.h | 25 +-
108
tcg/tcg.c | 308 ++++++++++++++++++++++++++----
120
include/tcg/tcg-opc.h | 355 +++++-------
109
tcg/tci.c | 65 +++----
121
include/tcg/tcg.h | 187 ++----
110
tests/tcg/s390x/cdsg.c | 93 +++++++++
122
linux-user/sparc/target_proc.h | 20 +-
111
tests/tcg/s390x/clst.c | 82 ++++++++
123
tcg/aarch64/tcg-target-has.h | 117 ++++
112
tests/tcg/s390x/div.c | 75 ++++++++
124
tcg/aarch64/tcg-target-mo.h | 12 +
113
tests/tcg/s390x/long-double.c | 24 +++
125
tcg/aarch64/tcg-target.h | 126 ----
114
util/int128.c | 42 +++++
126
tcg/arm/tcg-target-has.h | 100 ++++
115
accel/tcg/atomic_common.c.inc | 45 +++++
127
tcg/arm/tcg-target-mo.h | 13 +
116
tcg/aarch64/tcg-target.c.inc | 19 +-
128
tcg/arm/tcg-target.h | 86 ---
117
tcg/arm/tcg-target.c.inc | 30 ++-
129
tcg/i386/tcg-target-has.h | 169 ++++++
118
tcg/i386/tcg-target.c.inc | 52 +++++-
130
tcg/i386/tcg-target-mo.h | 19 +
119
tcg/loongarch64/tcg-target.c.inc | 17 +-
131
tcg/i386/tcg-target.h | 162 ------
120
tcg/mips/tcg-target.c.inc | 17 +-
132
tcg/loongarch64/tcg-target-has.h | 119 ++++
121
tcg/ppc/tcg-target.c.inc | 20 +-
133
tcg/loongarch64/tcg-target-mo.h | 12 +
122
tcg/riscv/tcg-target.c.inc | 17 +-
134
tcg/loongarch64/tcg-target.h | 115 ----
123
tcg/s390x/tcg-target.c.inc | 16 +-
135
tcg/mips/tcg-target-has.h | 135 +++++
124
tcg/sparc64/tcg-target.c.inc | 19 +-
136
tcg/mips/tcg-target-mo.h | 13 +
125
tcg/tci/tcg-target.c.inc | 27 ++-
137
tcg/mips/tcg-target.h | 130 -----
126
tests/tcg/s390x/Makefile.target | 7 +
138
tcg/ppc/tcg-target-has.h | 131 +++++
127
54 files changed, 2040 insertions(+), 956 deletions(-)
139
tcg/ppc/tcg-target-mo.h | 12 +
128
create mode 100644 tests/tcg/s390x/cdsg.c
140
tcg/ppc/tcg-target.h | 126 ----
129
create mode 100644 tests/tcg/s390x/clst.c
141
tcg/riscv/tcg-target-has.h | 135 +++++
130
create mode 100644 tests/tcg/s390x/div.c
142
tcg/riscv/tcg-target-mo.h | 12 +
131
create mode 100644 tests/tcg/s390x/long-double.c
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
Fill in the parameters for the host ABI for Int128.
1
These defines are not required outside of tcg/tcg.c,
2
Adjust tcg_target_call_oarg_reg for _WIN64, and
2
which includes tcg-target.c.inc before use.
3
tcg_out_call for i386 sysv. Allow TCG_TYPE_V128
3
Reduces the exported symbol set of tcg-target.h.
4
stores without AVX enabled.
5
4
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
7
---
9
tcg/i386/tcg-target.h | 10 ++++++++++
8
tcg/aarch64/tcg-target.h | 13 -------------
10
tcg/i386/tcg-target.c.inc | 30 +++++++++++++++++++++++++++++-
9
tcg/arm/tcg-target.h | 8 --------
11
2 files changed, 39 insertions(+), 1 deletion(-)
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(-)
12
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
13
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
14
index XXXXXXX..XXXXXXX 100644
72
index XXXXXXX..XXXXXXX 100644
15
--- a/tcg/i386/tcg-target.h
73
--- a/tcg/i386/tcg-target.h
16
+++ b/tcg/i386/tcg-target.h
74
+++ b/tcg/i386/tcg-target.h
17
@@ -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)
101
#define have_avx1 (cpuinfo & CPUINFO_AVX1)
102
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
103
index XXXXXXX..XXXXXXX 100644
104
--- a/tcg/loongarch64/tcg-target.h
105
+++ b/tcg/loongarch64/tcg-target.h
106
@@ -XXX,XX +XXX,XX @@ typedef enum {
107
TCG_VEC_TMP0 = TCG_REG_V23,
108
} TCGReg;
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;
18
#endif
263
#endif
19
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
264
20
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
265
+/* Used for function call generation. */
266
+#define TCG_TARGET_STACK_ALIGN 8
267
+#define TCG_TARGET_CALL_STACK_OFFSET 0
268
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
269
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
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",
276
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
277
index XXXXXXX..XXXXXXX 100644
278
--- a/tcg/i386/tcg-target.c.inc
279
+++ b/tcg/i386/tcg-target.c.inc
280
@@ -XXX,XX +XXX,XX @@
281
#include "../tcg-ldst.c.inc"
282
#include "../tcg-pool.c.inc"
283
284
+/* Used for function call generation. */
285
+#define TCG_TARGET_STACK_ALIGN 16
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
21
+#if defined(_WIN64)
293
+#if defined(_WIN64)
22
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_BY_REF
294
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_BY_REF
23
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_VEC
295
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_VEC
24
+#elif TCG_TARGET_REG_BITS == 64
296
+#elif TCG_TARGET_REG_BITS == 64
25
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
297
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
26
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
298
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
27
+#else
299
+#else
28
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
300
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
29
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
301
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
30
+#endif
302
+#endif
31
303
+
32
extern bool have_bmi1;
304
#ifdef CONFIG_DEBUG_TCG
33
extern bool have_popcnt;
305
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
34
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
306
#if TCG_TARGET_REG_BITS == 64
35
index XXXXXXX..XXXXXXX 100644
307
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
36
--- a/tcg/i386/tcg-target.c.inc
308
index XXXXXXX..XXXXXXX 100644
37
+++ b/tcg/i386/tcg-target.c.inc
309
--- a/tcg/loongarch64/tcg-target.c.inc
38
@@ -XXX,XX +XXX,XX @@ static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
310
+++ b/tcg/loongarch64/tcg-target.c.inc
39
case TCG_CALL_RET_NORMAL:
311
@@ -XXX,XX +XXX,XX @@
40
tcg_debug_assert(slot >= 0 && slot <= 1);
312
#include "../tcg-ldst.c.inc"
41
return slot ? TCG_REG_EDX : TCG_REG_EAX;
313
#include <asm/hwcap.h>
42
+#ifdef _WIN64
314
43
+ case TCG_CALL_RET_BY_VEC:
315
+/* used for function call generation */
44
+ tcg_debug_assert(slot == 0);
316
+#define TCG_REG_CALL_STACK TCG_REG_SP
45
+ return TCG_REG_XMM0;
317
+#define TCG_TARGET_STACK_ALIGN 16
318
+#define TCG_TARGET_CALL_STACK_OFFSET 0
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
46
+#endif
345
+#endif
47
default:
346
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
48
g_assert_not_reached();
347
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
49
}
348
+
50
@@ -XXX,XX +XXX,XX @@ static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg,
349
#if TCG_TARGET_REG_BITS == 32
51
* The gvec infrastructure is asserts that v128 vector loads
350
# define LO_OFF (HOST_BIG_ENDIAN * 4)
52
* and stores use a 16-byte aligned offset. Validate that the
351
# define HI_OFF (4 - LO_OFF)
53
* final pointer is aligned by using an insn that will SIGSEGV.
352
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
54
+ *
353
index XXXXXXX..XXXXXXX 100644
55
+ * This specific instance is also used by TCG_CALL_RET_BY_VEC,
354
--- a/tcg/riscv/tcg-target.c.inc
56
+ * for _WIN64, which must have SSE2 but may not have AVX.
355
+++ b/tcg/riscv/tcg-target.c.inc
57
*/
356
@@ -XXX,XX +XXX,XX @@
58
tcg_debug_assert(arg >= 16);
357
#include "../tcg-ldst.c.inc"
59
- tcg_out_vex_modrm_offset(s, OPC_MOVDQA_WxVx, arg, 0, arg1, arg2);
358
#include "../tcg-pool.c.inc"
60
+ if (have_avx1) {
359
61
+ tcg_out_vex_modrm_offset(s, OPC_MOVDQA_WxVx, arg, 0, arg1, arg2);
360
+/* Used for function call generation. */
62
+ } else {
361
+#define TCG_REG_CALL_STACK TCG_REG_SP
63
+ tcg_out_modrm_offset(s, OPC_MOVDQA_WxVx, arg, arg1, arg2);
362
+#define TCG_TARGET_STACK_ALIGN 16
64
+ }
363
+#define TCG_TARGET_CALL_STACK_OFFSET 0
65
break;
364
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
66
case TCG_TYPE_V256:
365
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
67
/*
366
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
68
@@ -XXX,XX +XXX,XX @@ static void tcg_out_call(TCGContext *s, const tcg_insn_unit *dest,
367
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
69
const TCGHelperInfo *info)
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)
70
{
435
{
71
tcg_out_branch(s, 1, dest);
436
switch (op) {
72
+
73
+#ifndef _WIN32
74
+ if (TCG_TARGET_REG_BITS == 32 && info->out_kind == TCG_CALL_RET_BY_REF) {
75
+ /*
76
+ * The sysv i386 abi for struct return places a reference as the
77
+ * first argument of the stack, and pops that argument with the
78
+ * return statement. Since we want to retain the aligned stack
79
+ * pointer for the callee, we do not want to actually push that
80
+ * argument before the call but rely on the normal store to the
81
+ * stack slot. But we do need to compensate for the pop in order
82
+ * to reset our correct stack pointer value.
83
+ * Pushing a garbage value back onto the stack is quickest.
84
+ */
85
+ tcg_out_push(s, TCG_REG_EAX);
86
+ }
87
+#endif
88
}
89
90
static void tcg_out_jmp(TCGContext *s, const tcg_insn_unit *dest)
91
--
437
--
92
2.34.1
438
2.43.0
93
439
94
440
diff view generated by jsdifflib
1
This will allow targets to avoid rolling their own.
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.
2
4
3
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
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
accel/tcg/tcg-runtime.h | 11 +++++
8
include/tcg/tcg.h | 2 +-
8
include/tcg/tcg-op.h | 5 +++
9
tcg/tcg-internal.h | 13 ++---
9
tcg/tcg-op.c | 85 +++++++++++++++++++++++++++++++++++
10
tcg/optimize.c | 10 +---
10
accel/tcg/atomic_common.c.inc | 45 +++++++++++++++++++
11
tcg/tcg-op-ldst.c | 26 ++++++----
11
4 files changed, 146 insertions(+)
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(-)
12
17
13
diff --git a/accel/tcg/tcg-runtime.h b/accel/tcg/tcg-runtime.h
18
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
14
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
15
--- a/accel/tcg/tcg-runtime.h
20
--- a/include/tcg/tcg.h
16
+++ b/accel/tcg/tcg-runtime.h
21
+++ b/include/tcg/tcg.h
17
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(atomic_cmpxchgq_be, TCG_CALL_NO_WG,
22
@@ -XXX,XX +XXX,XX @@ struct TCGOp {
18
DEF_HELPER_FLAGS_5(atomic_cmpxchgq_le, TCG_CALL_NO_WG,
23
#define TCGOP_CALLI(X) (X)->param1
19
i64, env, tl, i64, i64, i32)
24
#define TCGOP_CALLO(X) (X)->param2
20
#endif
25
21
+#ifdef CONFIG_CMPXCHG128
26
-#define TCGOP_VECL(X) (X)->param1
22
+DEF_HELPER_FLAGS_5(atomic_cmpxchgo_be, TCG_CALL_NO_WG,
27
+#define TCGOP_TYPE(X) (X)->param1
23
+ i128, env, tl, i128, i128, i32)
28
#define TCGOP_VECE(X) (X)->param2
24
+DEF_HELPER_FLAGS_5(atomic_cmpxchgo_le, TCG_CALL_NO_WG,
29
25
+ i128, env, tl, i128, i128, i32)
30
/* Make sure operands fit in the bitfields above. */
26
+#endif
31
diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h
27
+
28
+DEF_HELPER_FLAGS_5(nonatomic_cmpxchgo_be, TCG_CALL_NO_WG,
29
+ i128, env, tl, i128, i128, i32)
30
+DEF_HELPER_FLAGS_5(nonatomic_cmpxchgo_le, TCG_CALL_NO_WG,
31
+ i128, env, tl, i128, i128, i32)
32
33
#ifdef CONFIG_ATOMIC64
34
#define GEN_ATOMIC_HELPERS(NAME) \
35
diff --git a/include/tcg/tcg-op.h b/include/tcg/tcg-op.h
36
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
37
--- a/include/tcg/tcg-op.h
33
--- a/tcg/tcg-internal.h
38
+++ b/include/tcg/tcg-op.h
34
+++ b/tcg/tcg-internal.h
39
@@ -XXX,XX +XXX,XX @@ void tcg_gen_atomic_cmpxchg_i32(TCGv_i32, TCGv, TCGv_i32, TCGv_i32,
35
@@ -XXX,XX +XXX,XX @@ TCGTemp *tcg_temp_new_internal(TCGType type, TCGTempKind kind);
40
TCGArg, MemOp);
36
*/
41
void tcg_gen_atomic_cmpxchg_i64(TCGv_i64, TCGv, TCGv_i64, TCGv_i64,
37
TCGTemp *tcg_constant_internal(TCGType type, int64_t val);
42
TCGArg, MemOp);
38
43
+void tcg_gen_atomic_cmpxchg_i128(TCGv_i128, TCGv, TCGv_i128, TCGv_i128,
39
-TCGOp *tcg_gen_op1(TCGOpcode, TCGArg);
44
+ TCGArg, MemOp);
40
-TCGOp *tcg_gen_op2(TCGOpcode, TCGArg, TCGArg);
45
+
41
-TCGOp *tcg_gen_op3(TCGOpcode, TCGArg, TCGArg, TCGArg);
46
+void tcg_gen_nonatomic_cmpxchg_i128(TCGv_i128, TCGv, TCGv_i128, TCGv_i128,
42
-TCGOp *tcg_gen_op4(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg);
47
+ TCGArg, MemOp);
43
-TCGOp *tcg_gen_op5(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg);
48
44
-TCGOp *tcg_gen_op6(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg);
49
void tcg_gen_atomic_xchg_i32(TCGv_i32, TCGv, TCGv_i32, TCGArg, MemOp);
45
+TCGOp *tcg_gen_op1(TCGOpcode, TCGType, TCGArg);
50
void tcg_gen_atomic_xchg_i64(TCGv_i64, TCGv, TCGv_i64, TCGArg, MemOp);
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;
51
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
210
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
52
index XXXXXXX..XXXXXXX 100644
211
index XXXXXXX..XXXXXXX 100644
53
--- a/tcg/tcg-op.c
212
--- a/tcg/tcg-op.c
54
+++ b/tcg/tcg-op.c
213
+++ b/tcg/tcg-op.c
55
@@ -XXX,XX +XXX,XX @@ typedef void (*gen_atomic_cx_i32)(TCGv_i32, TCGv_env, TCGv,
214
@@ -XXX,XX +XXX,XX @@
56
TCGv_i32, TCGv_i32, TCGv_i32);
215
*/
57
typedef void (*gen_atomic_cx_i64)(TCGv_i64, TCGv_env, TCGv,
216
#define NI __attribute__((noinline))
58
TCGv_i64, TCGv_i64, TCGv_i32);
217
59
+typedef void (*gen_atomic_cx_i128)(TCGv_i128, TCGv_env, TCGv,
218
-TCGOp * NI tcg_gen_op1(TCGOpcode opc, TCGArg a1)
60
+ TCGv_i128, TCGv_i128, TCGv_i32);
219
+TCGOp * NI tcg_gen_op1(TCGOpcode opc, TCGType type, TCGArg a1)
61
typedef void (*gen_atomic_op_i32)(TCGv_i32, TCGv_env, TCGv,
220
{
62
TCGv_i32, TCGv_i32);
221
TCGOp *op = tcg_emit_op(opc, 1);
63
typedef void (*gen_atomic_op_i64)(TCGv_i64, TCGv_env, TCGv,
222
+ TCGOP_TYPE(op) = type;
64
@@ -XXX,XX +XXX,XX @@ typedef void (*gen_atomic_op_i64)(TCGv_i64, TCGv_env, TCGv,
223
op->args[0] = a1;
65
#else
224
return op;
66
# define WITH_ATOMIC64(X)
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
67
#endif
287
#endif
68
+#ifdef CONFIG_CMPXCHG128
288
69
+# define WITH_ATOMIC128(X) X,
289
-static void DNI tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 a1)
70
+#else
290
+static void DNI tcg_gen_op1_i32(TCGOpcode opc, TCGType type, TCGv_i32 a1)
71
+# define WITH_ATOMIC128(X)
291
{
72
+#endif
292
- tcg_gen_op1(opc, tcgv_i32_arg(a1));
73
293
+ tcg_gen_op1(opc, type, tcgv_i32_arg(a1));
74
static void * const table_cmpxchg[(MO_SIZE | MO_BSWAP) + 1] = {
294
}
75
[MO_8] = gen_helper_atomic_cmpxchgb,
295
76
@@ -XXX,XX +XXX,XX @@ static void * const table_cmpxchg[(MO_SIZE | MO_BSWAP) + 1] = {
296
-static void DNI tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 a1)
77
[MO_32 | MO_BE] = gen_helper_atomic_cmpxchgl_be,
297
+static void DNI tcg_gen_op1_i64(TCGOpcode opc, TCGType type, TCGv_i64 a1)
78
WITH_ATOMIC64([MO_64 | MO_LE] = gen_helper_atomic_cmpxchgq_le)
298
{
79
WITH_ATOMIC64([MO_64 | MO_BE] = gen_helper_atomic_cmpxchgq_be)
299
- tcg_gen_op1(opc, tcgv_i64_arg(a1));
80
+ WITH_ATOMIC128([MO_128 | MO_LE] = gen_helper_atomic_cmpxchgo_le)
300
+ tcg_gen_op1(opc, type, tcgv_i64_arg(a1));
81
+ WITH_ATOMIC128([MO_128 | MO_BE] = gen_helper_atomic_cmpxchgo_be)
301
}
82
};
302
83
303
-static TCGOp * DNI tcg_gen_op1i(TCGOpcode opc, TCGArg a1)
84
void tcg_gen_atomic_cmpxchg_i32(TCGv_i32 retv, TCGv addr, TCGv_i32 cmpv,
304
+static TCGOp * DNI tcg_gen_op1i(TCGOpcode opc, TCGType type, TCGArg a1)
85
@@ -XXX,XX +XXX,XX @@ void tcg_gen_atomic_cmpxchg_i64(TCGv_i64 retv, TCGv addr, TCGv_i64 cmpv,
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);
86
}
517
}
87
}
518
}
88
519
89
+void tcg_gen_nonatomic_cmpxchg_i128(TCGv_i128 retv, TCGv addr, TCGv_i128 cmpv,
520
void tcg_gen_plugin_cb(unsigned from)
90
+ TCGv_i128 newv, TCGArg idx, MemOp memop)
521
{
91
+{
522
- tcg_gen_op1(INDEX_op_plugin_cb, from);
92
+ if (TCG_TARGET_REG_BITS == 32) {
523
+ tcg_gen_op1(INDEX_op_plugin_cb, 0, from);
93
+ /* Inline expansion below is simply too large for 32-bit hosts. */
524
}
94
+ gen_atomic_cx_i128 gen = ((memop & MO_BSWAP) == MO_LE
525
95
+ ? gen_helper_nonatomic_cmpxchgo_le
526
void tcg_gen_plugin_mem_cb(TCGv_i64 addr, unsigned meminfo)
96
+ : gen_helper_nonatomic_cmpxchgo_be);
527
{
97
+ MemOpIdx oi = make_memop_idx(memop, idx);
528
- tcg_gen_op2(INDEX_op_plugin_mem_cb, tcgv_i64_arg(addr), meminfo);
98
+
529
+ tcg_gen_op2(INDEX_op_plugin_mem_cb, 0, tcgv_i64_arg(addr), meminfo);
99
+ tcg_debug_assert((memop & MO_SIZE) == MO_128);
530
}
100
+ tcg_debug_assert((memop & MO_SIGN) == 0);
531
101
+
532
/* 32 bit ops */
102
+ gen(retv, cpu_env, addr, cmpv, newv, tcg_constant_i32(oi));
533
103
+ } else {
534
void tcg_gen_discard_i32(TCGv_i32 arg)
104
+ TCGv_i128 oldv = tcg_temp_new_i128();
535
{
105
+ TCGv_i128 tmpv = tcg_temp_new_i128();
536
- tcg_gen_op1_i32(INDEX_op_discard, arg);
106
+ TCGv_i64 t0 = tcg_temp_new_i64();
537
+ tcg_gen_op1_i32(INDEX_op_discard, TCG_TYPE_I32, arg);
107
+ TCGv_i64 t1 = tcg_temp_new_i64();
538
}
108
+ TCGv_i64 z = tcg_constant_i64(0);
539
109
+
540
void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
110
+ tcg_gen_qemu_ld_i128(oldv, addr, idx, memop);
541
@@ -XXX,XX +XXX,XX @@ void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
111
+
542
void tcg_gen_discard_i64(TCGv_i64 arg)
112
+ /* Compare i128 */
543
{
113
+ tcg_gen_xor_i64(t0, TCGV128_LOW(oldv), TCGV128_LOW(cmpv));
544
if (TCG_TARGET_REG_BITS == 64) {
114
+ tcg_gen_xor_i64(t1, TCGV128_HIGH(oldv), TCGV128_HIGH(cmpv));
545
- tcg_gen_op1_i64(INDEX_op_discard, arg);
115
+ tcg_gen_or_i64(t0, t0, t1);
546
+ tcg_gen_op1_i64(INDEX_op_discard, TCG_TYPE_I64, arg);
116
+
547
} else {
117
+ /* tmpv = equal ? newv : oldv */
548
tcg_gen_discard_i32(TCGV_LOW(arg));
118
+ tcg_gen_movcond_i64(TCG_COND_EQ, TCGV128_LOW(tmpv), t0, z,
549
tcg_gen_discard_i32(TCGV_HIGH(arg));
119
+ TCGV128_LOW(newv), TCGV128_LOW(oldv));
550
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extrl_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
120
+ tcg_gen_movcond_i64(TCG_COND_EQ, TCGV128_HIGH(tmpv), t0, z,
551
if (TCG_TARGET_REG_BITS == 32) {
121
+ TCGV128_HIGH(newv), TCGV128_HIGH(oldv));
552
tcg_gen_mov_i32(ret, TCGV_LOW(arg));
122
+
553
} else if (TCG_TARGET_HAS_extr_i64_i32) {
123
+ /* Unconditional writeback. */
554
- tcg_gen_op2(INDEX_op_extrl_i64_i32,
124
+ tcg_gen_qemu_st_i128(tmpv, addr, idx, memop);
555
+ tcg_gen_op2(INDEX_op_extrl_i64_i32, TCG_TYPE_I32,
125
+ tcg_gen_mov_i128(retv, oldv);
556
tcgv_i32_arg(ret), tcgv_i64_arg(arg));
126
+
557
} else {
127
+ tcg_temp_free_i64(t0);
558
tcg_gen_mov_i32(ret, (TCGv_i32)arg);
128
+ tcg_temp_free_i64(t1);
559
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extrh_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
129
+ tcg_temp_free_i128(tmpv);
560
if (TCG_TARGET_REG_BITS == 32) {
130
+ tcg_temp_free_i128(oldv);
561
tcg_gen_mov_i32(ret, TCGV_HIGH(arg));
131
+ }
562
} else if (TCG_TARGET_HAS_extr_i64_i32) {
132
+}
563
- tcg_gen_op2(INDEX_op_extrh_i64_i32,
133
+
564
+ tcg_gen_op2(INDEX_op_extrh_i64_i32, TCG_TYPE_I32,
134
+void tcg_gen_atomic_cmpxchg_i128(TCGv_i128 retv, TCGv addr, TCGv_i128 cmpv,
565
tcgv_i32_arg(ret), tcgv_i64_arg(arg));
135
+ TCGv_i128 newv, TCGArg idx, MemOp memop)
566
} else {
136
+{
567
TCGv_i64 t = tcg_temp_ebb_new_i64();
137
+ gen_atomic_cx_i128 gen;
568
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
138
+
569
tcg_gen_mov_i32(TCGV_LOW(ret), arg);
139
+ if (!(tcg_ctx->gen_tb->cflags & CF_PARALLEL)) {
570
tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
140
+ tcg_gen_nonatomic_cmpxchg_i128(retv, addr, cmpv, newv, idx, memop);
571
} else {
141
+ return;
572
- tcg_gen_op2(INDEX_op_extu_i32_i64,
142
+ }
573
+ tcg_gen_op2(INDEX_op_extu_i32_i64, TCG_TYPE_I64,
143
+
574
tcgv_i64_arg(ret), tcgv_i32_arg(arg));
144
+ tcg_debug_assert((memop & MO_SIZE) == MO_128);
575
}
145
+ tcg_debug_assert((memop & MO_SIGN) == 0);
576
}
146
+ gen = table_cmpxchg[memop & (MO_SIZE | MO_BSWAP)];
577
@@ -XXX,XX +XXX,XX @@ void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
147
+
578
tcg_gen_mov_i32(TCGV_LOW(ret), arg);
148
+ if (gen) {
579
tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
149
+ MemOpIdx oi = make_memop_idx(memop, idx);
580
} else {
150
+ gen(retv, cpu_env, addr, cmpv, newv, tcg_constant_i32(oi));
581
- tcg_gen_op2(INDEX_op_ext_i32_i64,
151
+ return;
582
+ tcg_gen_op2(INDEX_op_ext_i32_i64, TCG_TYPE_I64,
152
+ }
583
tcgv_i64_arg(ret), tcgv_i32_arg(arg));
153
+
584
}
154
+ gen_helper_exit_atomic(cpu_env);
585
}
155
+
586
@@ -XXX,XX +XXX,XX @@ void tcg_gen_exit_tb(const TranslationBlock *tb, unsigned idx)
156
+ /*
587
tcg_debug_assert(idx == TB_EXIT_REQUESTED);
157
+ * Produce a result for a well-formed opcode stream. This satisfies
588
}
158
+ * liveness for set before used, which happens before this dead code
589
159
+ * is removed.
590
- tcg_gen_op1i(INDEX_op_exit_tb, val);
160
+ */
591
+ tcg_gen_op1i(INDEX_op_exit_tb, 0, val);
161
+ tcg_gen_movi_i64(TCGV128_LOW(retv), 0);
592
}
162
+ tcg_gen_movi_i64(TCGV128_HIGH(retv), 0);
593
163
+}
594
void tcg_gen_goto_tb(unsigned idx)
164
+
595
@@ -XXX,XX +XXX,XX @@ void tcg_gen_goto_tb(unsigned idx)
165
static void do_nonatomic_op_i32(TCGv_i32 ret, TCGv addr, TCGv_i32 val,
596
tcg_ctx->goto_tb_issue_mask |= 1 << idx;
166
TCGArg idx, MemOp memop, bool new_val,
597
#endif
167
void (*gen)(TCGv_i32, TCGv_i32, TCGv_i32))
598
plugin_gen_disable_mem_helpers();
168
diff --git a/accel/tcg/atomic_common.c.inc b/accel/tcg/atomic_common.c.inc
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
169
index XXXXXXX..XXXXXXX 100644
613
index XXXXXXX..XXXXXXX 100644
170
--- a/accel/tcg/atomic_common.c.inc
614
--- a/tcg/tcg.c
171
+++ b/accel/tcg/atomic_common.c.inc
615
+++ b/tcg/tcg.c
172
@@ -XXX,XX +XXX,XX @@ CMPXCHG_HELPER(cmpxchgq_be, uint64_t)
616
@@ -XXX,XX +XXX,XX @@ void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
173
CMPXCHG_HELPER(cmpxchgq_le, uint64_t)
617
nb_cargs = def->nb_cargs;
174
#endif
618
175
619
if (def->flags & TCG_OPF_VECTOR) {
176
+#ifdef CONFIG_CMPXCHG128
620
- col += ne_fprintf(f, "v%d,e%d,", 64 << TCGOP_VECL(op),
177
+CMPXCHG_HELPER(cmpxchgo_be, Int128)
621
+ col += ne_fprintf(f, "v%d,e%d,",
178
+CMPXCHG_HELPER(cmpxchgo_le, Int128)
622
+ 8 * tcg_type_size(TCGOP_TYPE(op)),
179
+#endif
623
8 << TCGOP_VECE(op));
180
+
624
}
181
#undef CMPXCHG_HELPER
625
182
626
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
183
+Int128 HELPER(nonatomic_cmpxchgo_be)(CPUArchState *env, target_ulong addr,
627
184
+ Int128 cmpv, Int128 newv, uint32_t oi)
628
itype = its->type;
185
+{
629
vece = TCGOP_VECE(op);
186
+#if TCG_TARGET_REG_BITS == 32
630
- vtype = TCGOP_VECL(op) + TCG_TYPE_V64;
187
+ uintptr_t ra = GETPC();
631
+ vtype = TCGOP_TYPE(op);
188
+ Int128 oldv;
632
189
+
633
if (its->val_type == TEMP_VAL_CONST) {
190
+ oldv = cpu_ld16_be_mmu(env, addr, oi, ra);
634
/* Propagate constant via movi -> dupi. */
191
+ if (int128_eq(oldv, cmpv)) {
635
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
192
+ cpu_st16_be_mmu(env, addr, newv, oi, ra);
636
break;
193
+ } else {
637
default:
194
+ /* Even with comparison failure, still need a write cycle. */
638
if (def->flags & TCG_OPF_VECTOR) {
195
+ probe_write(env, addr, 16, get_mmuidx(oi), ra);
639
- tcg_out_vec_op(s, op->opc, TCGOP_VECL(op), TCGOP_VECE(op),
196
+ }
640
- new_args, const_args);
197
+ return oldv;
641
+ tcg_out_vec_op(s, op->opc, TCGOP_TYPE(op) - TCG_TYPE_V64,
198
+#else
642
+ TCGOP_VECE(op), new_args, const_args);
199
+ g_assert_not_reached();
643
} else {
200
+#endif
644
tcg_out_op(s, op->opc, new_args, const_args);
201
+}
645
}
202
+
646
@@ -XXX,XX +XXX,XX @@ static bool tcg_reg_alloc_dup2(TCGContext *s, const TCGOp *op)
203
+Int128 HELPER(nonatomic_cmpxchgo_le)(CPUArchState *env, target_ulong addr,
647
{
204
+ Int128 cmpv, Int128 newv, uint32_t oi)
648
const TCGLifeData arg_life = op->life;
205
+{
649
TCGTemp *ots, *itsl, *itsh;
206
+#if TCG_TARGET_REG_BITS == 32
650
- TCGType vtype = TCGOP_VECL(op) + TCG_TYPE_V64;
207
+ uintptr_t ra = GETPC();
651
+ TCGType vtype = TCGOP_TYPE(op);
208
+ Int128 oldv;
652
209
+
653
/* This opcode is only valid for 32-bit hosts, for 64-bit elements. */
210
+ oldv = cpu_ld16_le_mmu(env, addr, oi, ra);
654
tcg_debug_assert(TCG_TARGET_REG_BITS == 32);
211
+ if (int128_eq(oldv, cmpv)) {
655
diff --git a/docs/devel/tcg-ops.rst b/docs/devel/tcg-ops.rst
212
+ cpu_st16_le_mmu(env, addr, newv, oi, ra);
656
index XXXXXXX..XXXXXXX 100644
213
+ } else {
657
--- a/docs/devel/tcg-ops.rst
214
+ /* Even with comparison failure, still need a write cycle. */
658
+++ b/docs/devel/tcg-ops.rst
215
+ probe_write(env, addr, 16, get_mmuidx(oi), ra);
659
@@ -XXX,XX +XXX,XX @@ QEMU specific operations
216
+ }
660
Host vector operations
217
+ return oldv;
661
----------------------
218
+#else
662
219
+ g_assert_not_reached();
663
-All of the vector ops have two parameters, ``TCGOP_VECL`` & ``TCGOP_VECE``.
220
+#endif
664
-The former specifies the length of the vector in log2 64-bit units; the
221
+}
665
-latter specifies the length of the element (if applicable) in log2 8-bit units.
222
+
666
-E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
223
#define ATOMIC_HELPER(OP, TYPE) \
667
+All of the vector ops have two parameters, ``TCGOP_TYPE`` & ``TCGOP_VECE``.
224
TYPE HELPER(glue(atomic_,OP))(CPUArchState *env, target_ulong addr, \
668
+The former specifies the length of the vector as a TCGType; the latter
225
TYPE val, uint32_t oi) \
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
226
--
709
--
227
2.34.1
710
2.43.0
228
711
229
712
diff view generated by jsdifflib
1
Add code generation functions for data movement between
1
These are not particularly useful outside of optimization passes.
2
TCGv_i128 (mov) and to/from TCGv_i64 (concat, extract).
3
2
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@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
include/tcg/tcg-op.h | 4 ++++
6
include/tcg/tcg.h | 4 ----
9
tcg/tcg-internal.h | 13 +++++++++++++
7
tcg/tcg-internal.h | 5 +++++
10
tcg/tcg-op.c | 20 ++++++++++++++++++++
8
2 files changed, 5 insertions(+), 4 deletions(-)
11
3 files changed, 37 insertions(+)
12
9
13
diff --git a/include/tcg/tcg-op.h b/include/tcg/tcg-op.h
10
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
14
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
15
--- a/include/tcg/tcg-op.h
12
--- a/include/tcg/tcg.h
16
+++ b/include/tcg/tcg-op.h
13
+++ b/include/tcg/tcg.h
17
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extrh_i64_i32(TCGv_i32 ret, TCGv_i64 arg);
14
@@ -XXX,XX +XXX,XX @@ void tcg_gen_call7(void *func, TCGHelperInfo *, TCGTemp *ret,
18
void tcg_gen_extr_i64_i32(TCGv_i32 lo, TCGv_i32 hi, TCGv_i64 arg);
15
19
void tcg_gen_extr32_i64(TCGv_i64 lo, TCGv_i64 hi, TCGv_i64 arg);
16
TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs);
20
17
void tcg_op_remove(TCGContext *s, TCGOp *op);
21
+void tcg_gen_mov_i128(TCGv_i128 dst, TCGv_i128 src);
18
-TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op,
22
+void tcg_gen_extr_i128_i64(TCGv_i64 lo, TCGv_i64 hi, TCGv_i128 arg);
19
- TCGOpcode opc, unsigned nargs);
23
+void tcg_gen_concat_i64_i128(TCGv_i128 ret, TCGv_i64 lo, TCGv_i64 hi);
20
-TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op,
24
+
21
- TCGOpcode opc, unsigned nargs);
25
static inline void tcg_gen_concat32_i64(TCGv_i64 ret, TCGv_i64 lo, TCGv_i64 hi)
22
26
{
23
/**
27
tcg_gen_deposit_i64(ret, lo, hi, 32, 32);
24
* tcg_remove_ops_after:
28
diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h
25
diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h
29
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
30
--- a/tcg/tcg-internal.h
27
--- a/tcg/tcg-internal.h
31
+++ b/tcg/tcg-internal.h
28
+++ b/tcg/tcg-internal.h
32
@@ -XXX,XX +XXX,XX @@ extern TCGv_i32 TCGV_LOW(TCGv_i64) QEMU_ERROR("32-bit code path is reachable");
29
@@ -XXX,XX +XXX,XX @@ void vec_gen_4(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg, TCGArg, TCGArg);
33
extern TCGv_i32 TCGV_HIGH(TCGv_i64) QEMU_ERROR("32-bit code path is reachable");
30
void vec_gen_6(TCGOpcode opc, TCGType type, unsigned vece, TCGArg r,
34
#endif
31
TCGArg a, TCGArg b, TCGArg c, TCGArg d, TCGArg e);
35
32
36
+static inline TCGv_i64 TCGV128_LOW(TCGv_i128 t)
33
+TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op,
37
+{
34
+ TCGOpcode opc, unsigned nargs);
38
+ /* For 32-bit, offset by 2, which may then have TCGV_{LOW,HIGH} applied. */
35
+TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op,
39
+ int o = HOST_BIG_ENDIAN ? 64 / TCG_TARGET_REG_BITS : 0;
36
+ TCGOpcode opc, unsigned nargs);
40
+ return temp_tcgv_i64(tcgv_i128_temp(t) + o);
41
+}
42
+
43
+static inline TCGv_i64 TCGV128_HIGH(TCGv_i128 t)
44
+{
45
+ int o = HOST_BIG_ENDIAN ? 0 : 64 / TCG_TARGET_REG_BITS;
46
+ return temp_tcgv_i64(tcgv_i128_temp(t) + o);
47
+}
48
+
37
+
49
#endif /* TCG_INTERNAL_H */
38
#endif /* TCG_INTERNAL_H */
50
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/tcg/tcg-op.c
53
+++ b/tcg/tcg-op.c
54
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extr32_i64(TCGv_i64 lo, TCGv_i64 hi, TCGv_i64 arg)
55
tcg_gen_shri_i64(hi, arg, 32);
56
}
57
58
+void tcg_gen_extr_i128_i64(TCGv_i64 lo, TCGv_i64 hi, TCGv_i128 arg)
59
+{
60
+ tcg_gen_mov_i64(lo, TCGV128_LOW(arg));
61
+ tcg_gen_mov_i64(hi, TCGV128_HIGH(arg));
62
+}
63
+
64
+void tcg_gen_concat_i64_i128(TCGv_i128 ret, TCGv_i64 lo, TCGv_i64 hi)
65
+{
66
+ tcg_gen_mov_i64(TCGV128_LOW(ret), lo);
67
+ tcg_gen_mov_i64(TCGV128_HIGH(ret), hi);
68
+}
69
+
70
+void tcg_gen_mov_i128(TCGv_i128 dst, TCGv_i128 src)
71
+{
72
+ if (dst != src) {
73
+ tcg_gen_mov_i64(TCGV128_LOW(dst), TCGV128_LOW(src));
74
+ tcg_gen_mov_i64(TCGV128_HIGH(dst), TCGV128_HIGH(src));
75
+ }
76
+}
77
+
78
/* QEMU specific operations. */
79
80
void tcg_gen_exit_tb(const TranslationBlock *tb, unsigned idx)
81
--
39
--
82
2.34.1
40
2.43.0
83
41
84
42
diff view generated by jsdifflib
1
Many hosts pass and return 128-bit quantities like sequential
1
Simplify use within the optimizers by defaulting the
2
64-bit quantities. Treat this just like we currently break
2
new opcode to the same type as the old opcode.
3
down 64-bit quantities for a 32-bit host.
4
3
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
6
---
8
tcg/tcg.c | 37 +++++++++++++++++++++++++++++++++----
7
tcg/tcg.c | 4 ++++
9
1 file changed, 33 insertions(+), 4 deletions(-)
8
1 file changed, 4 insertions(+)
10
9
11
diff --git a/tcg/tcg.c b/tcg/tcg.c
10
diff --git a/tcg/tcg.c b/tcg/tcg.c
12
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/tcg.c
12
--- a/tcg/tcg.c
14
+++ b/tcg/tcg.c
13
+++ b/tcg/tcg.c
15
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
14
@@ -XXX,XX +XXX,XX @@ TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *old_op,
16
case dh_typecode_s64:
15
TCGOpcode opc, unsigned nargs)
17
info->nr_out = 64 / TCG_TARGET_REG_BITS;
16
{
18
info->out_kind = TCG_CALL_RET_NORMAL;
17
TCGOp *new_op = tcg_op_alloc(opc, nargs);
19
+ assert(info->nr_out <= ARRAY_SIZE(tcg_target_call_oarg_regs));
20
+ break;
21
+ case dh_typecode_i128:
22
+ info->nr_out = 128 / TCG_TARGET_REG_BITS;
23
+ info->out_kind = TCG_CALL_RET_NORMAL; /* TODO */
24
+ switch (/* TODO */ TCG_CALL_RET_NORMAL) {
25
+ case TCG_CALL_RET_NORMAL:
26
+ assert(info->nr_out <= ARRAY_SIZE(tcg_target_call_oarg_regs));
27
+ break;
28
+ default:
29
+ qemu_build_not_reached();
30
+ }
31
break;
32
default:
33
g_assert_not_reached();
34
}
35
- assert(info->nr_out <= ARRAY_SIZE(tcg_target_call_oarg_regs));
36
37
/*
38
* Parse and place function arguments.
39
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
40
case dh_typecode_ptr:
41
type = TCG_TYPE_PTR;
42
break;
43
+ case dh_typecode_i128:
44
+ type = TCG_TYPE_I128;
45
+ break;
46
default:
47
g_assert_not_reached();
48
}
49
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
50
}
51
break;
52
53
+ case TCG_TYPE_I128:
54
+ switch (/* TODO */ TCG_CALL_ARG_NORMAL) {
55
+ case TCG_CALL_ARG_EVEN:
56
+ layout_arg_even(&cum);
57
+ /* fall through */
58
+ case TCG_CALL_ARG_NORMAL:
59
+ layout_arg_normal_n(&cum, info, 128 / TCG_TARGET_REG_BITS);
60
+ break;
61
+ default:
62
+ qemu_build_not_reached();
63
+ }
64
+ break;
65
+
18
+
66
default:
19
+ TCGOP_TYPE(new_op) = TCGOP_TYPE(old_op);
67
g_assert_not_reached();
20
QTAILQ_INSERT_BEFORE(old_op, new_op, link);
68
}
21
return new_op;
69
@@ -XXX,XX +XXX,XX @@ void tcg_gen_callN(void *func, TCGTemp *ret, int nargs, TCGTemp **args)
22
}
70
op->args[pi++] = temp_arg(ret);
23
@@ -XXX,XX +XXX,XX @@ TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *old_op,
71
break;
24
TCGOpcode opc, unsigned nargs)
72
case 2:
25
{
73
+ case 4:
26
TCGOp *new_op = tcg_op_alloc(opc, nargs);
74
tcg_debug_assert(ret != NULL);
27
+
75
- tcg_debug_assert(ret->base_type == ret->type + 1);
28
+ TCGOP_TYPE(new_op) = TCGOP_TYPE(old_op);
76
+ tcg_debug_assert(ret->base_type == ret->type + ctz32(n));
29
QTAILQ_INSERT_AFTER(&s->ops, old_op, new_op, link);
77
tcg_debug_assert(ret->temp_subindex == 0);
30
return new_op;
78
- op->args[pi++] = temp_arg(ret);
31
}
79
- op->args[pi++] = temp_arg(ret + 1);
80
+ for (i = 0; i < n; ++i) {
81
+ op->args[pi++] = temp_arg(ret + i);
82
+ }
83
break;
84
default:
85
g_assert_not_reached();
86
--
32
--
87
2.34.1
33
2.43.0
88
34
89
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
1
This will be used by _WIN64 to return i128. Not yet used,
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
because allocation is not yet enabled.
3
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
3
---
7
tcg/tcg-internal.h | 1 +
4
include/tcg/tcg.h | 7 ++++++-
8
tcg/tcg.c | 19 +++++++++++++++++++
5
tcg/tcg.c | 11 +++++++----
9
2 files changed, 20 insertions(+)
6
2 files changed, 13 insertions(+), 5 deletions(-)
10
7
11
diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h
8
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
12
index XXXXXXX..XXXXXXX 100644
9
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/tcg-internal.h
10
--- a/include/tcg/tcg.h
14
+++ b/tcg/tcg-internal.h
11
+++ b/include/tcg/tcg.h
15
@@ -XXX,XX +XXX,XX @@
12
@@ -XXX,XX +XXX,XX @@ typedef struct TCGTargetOpDef {
16
typedef enum {
13
const char *args_ct_str[TCG_MAX_OP_ARGS];
17
TCG_CALL_RET_NORMAL, /* by registers */
14
} TCGTargetOpDef;
18
TCG_CALL_RET_BY_REF, /* for i128, by reference */
15
19
+ TCG_CALL_RET_BY_VEC, /* for i128, by vector register */
16
-bool tcg_op_supported(TCGOpcode op);
20
} TCGCallReturnKind;
17
+/*
21
18
+ * tcg_op_supported:
22
typedef enum {
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 *);
23
diff --git a/tcg/tcg.c b/tcg/tcg.c
26
diff --git a/tcg/tcg.c b/tcg/tcg.c
24
index XXXXXXX..XXXXXXX 100644
27
index XXXXXXX..XXXXXXX 100644
25
--- a/tcg/tcg.c
28
--- a/tcg/tcg.c
26
+++ b/tcg/tcg.c
29
+++ b/tcg/tcg.c
27
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
30
@@ -XXX,XX +XXX,XX @@ TCGTemp *tcgv_i32_temp(TCGv_i32 v)
28
/* Query the last register now to trigger any assert early. */
31
}
29
tcg_target_call_oarg_reg(info->out_kind, info->nr_out - 1);
32
#endif /* CONFIG_DEBUG_TCG */
30
break;
33
31
+ case TCG_CALL_RET_BY_VEC:
34
-/* Return true if OP may appear in the opcode stream.
32
+ /* Query the single register now to trigger any assert early. */
35
- Test the runtime variable that controls each opcode. */
33
+ tcg_target_call_oarg_reg(TCG_CALL_RET_BY_VEC, 0);
36
-bool tcg_op_supported(TCGOpcode op)
34
+ break;
37
+/*
35
case TCG_CALL_RET_BY_REF:
38
+ * Return true if OP may appear in the opcode stream with TYPE.
36
/*
39
+ * Test the runtime variable that controls each opcode.
37
* Allocate the first argument to the output.
40
+ */
38
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
41
+bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
39
}
42
{
40
break;
43
const bool have_vec
41
44
= TCG_TARGET_HAS_v64 | TCG_TARGET_HAS_v128 | TCG_TARGET_HAS_v256;
42
+ case TCG_CALL_RET_BY_VEC:
45
@@ -XXX,XX +XXX,XX @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start)
43
+ {
46
/* fall through */
44
+ TCGTemp *ts = arg_temp(op->args[0]);
47
default:
45
+
48
/* Sanity check that we've not introduced any unhandled opcodes. */
46
+ tcg_debug_assert(ts->base_type == TCG_TYPE_I128);
49
- tcg_debug_assert(tcg_op_supported(opc));
47
+ tcg_debug_assert(ts->temp_subindex == 0);
50
+ tcg_debug_assert(tcg_op_supported(opc, TCGOP_TYPE(op),
48
+ if (!ts->mem_allocated) {
51
+ TCGOP_FLAGS(op)));
49
+ temp_allocate_frame(s, ts);
52
/* Note: in order to speed up the code, it would be much
50
+ }
53
faster to have specialized register allocator functions for
51
+ tcg_out_st(s, TCG_TYPE_V128,
54
some common argument patterns */
52
+ tcg_target_call_oarg_reg(TCG_CALL_RET_BY_VEC, 0),
53
+ ts->mem_base->reg, ts->mem_offset);
54
+ }
55
+ /* fall through to mark all parts in memory */
56
+
57
case TCG_CALL_RET_BY_REF:
58
/* The callee has performed a write through the reference. */
59
for (i = 0; i < nb_oargs; i++) {
60
--
55
--
61
2.34.1
56
2.43.0
62
57
63
58
diff view generated by jsdifflib
1
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
1
Rely on tcg-op-vec.c to expand the opcode if missing.
2
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
5
---
5
target/s390x/helper.h | 2 +-
6
target/arm/tcg/translate-sve.c | 20 ++++----------------
6
target/s390x/tcg/mem_helper.c | 7 +++----
7
1 file changed, 4 insertions(+), 16 deletions(-)
7
target/s390x/tcg/translate.c | 6 ++++--
8
3 files changed, 8 insertions(+), 7 deletions(-)
9
8
10
diff --git a/target/s390x/helper.h b/target/s390x/helper.h
9
diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c
11
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
12
--- a/target/s390x/helper.h
11
--- a/target/arm/tcg/translate-sve.c
13
+++ b/target/s390x/helper.h
12
+++ b/target/arm/tcg/translate-sve.c
14
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_4(tre, i64, env, i64, i64, i64)
13
@@ -XXX,XX +XXX,XX @@ static void gen_bsl1n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
15
DEF_HELPER_4(trt, i32, env, i32, i64, i64)
14
static void gen_bsl1n_vec(unsigned vece, TCGv_vec d, TCGv_vec n,
16
DEF_HELPER_4(trtr, i32, env, i32, i64, i64)
15
TCGv_vec m, TCGv_vec k)
17
DEF_HELPER_5(trXX, i32, env, i32, i32, i32, i32)
16
{
18
-DEF_HELPER_4(cksm, i64, env, i64, i64, i64)
17
- if (TCG_TARGET_HAS_bitsel_vec) {
19
+DEF_HELPER_4(cksm, i128, env, i64, i64, i64)
18
- tcg_gen_not_vec(vece, n, n);
20
DEF_HELPER_FLAGS_5(calc_cc, TCG_CALL_NO_RWG_SE, i32, env, i32, i64, i64, i64)
19
- tcg_gen_bitsel_vec(vece, d, k, n, m);
21
DEF_HELPER_FLAGS_2(sfpc, TCG_CALL_NO_WG, void, env, i64)
20
- } else {
22
DEF_HELPER_FLAGS_2(sfas, TCG_CALL_NO_WG, void, env, i64)
21
- tcg_gen_andc_vec(vece, n, k, n);
23
diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c
22
- tcg_gen_andc_vec(vece, m, m, k);
24
index XXXXXXX..XXXXXXX 100644
23
- tcg_gen_or_vec(vece, d, n, m);
25
--- a/target/s390x/tcg/mem_helper.c
24
- }
26
+++ b/target/s390x/tcg/mem_helper.c
25
+ tcg_gen_not_vec(vece, n, n);
27
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(clclu)(CPUS390XState *env, uint32_t r1, uint64_t a2,
26
+ tcg_gen_bitsel_vec(vece, d, k, n, m);
28
}
27
}
29
28
30
/* checksum */
29
static void gen_bsl1n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
31
-uint64_t HELPER(cksm)(CPUS390XState *env, uint64_t r1,
30
@@ -XXX,XX +XXX,XX @@ static void gen_bsl2n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
32
- uint64_t src, uint64_t src_len)
31
static void gen_bsl2n_vec(unsigned vece, TCGv_vec d, TCGv_vec n,
33
+Int128 HELPER(cksm)(CPUS390XState *env, uint64_t r1,
32
TCGv_vec m, TCGv_vec k)
34
+ uint64_t src, uint64_t src_len)
35
{
33
{
36
uintptr_t ra = GETPC();
34
- if (TCG_TARGET_HAS_bitsel_vec) {
37
uint64_t max_len, len;
35
- tcg_gen_not_vec(vece, m, m);
38
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(cksm)(CPUS390XState *env, uint64_t r1,
36
- tcg_gen_bitsel_vec(vece, d, k, n, m);
39
env->cc_op = (len == src_len ? 0 : 3);
37
- } else {
40
38
- tcg_gen_and_vec(vece, n, n, k);
41
/* Return both cksm and processed length. */
39
- tcg_gen_or_vec(vece, m, m, k);
42
- env->retxl = cksm;
40
- tcg_gen_orc_vec(vece, d, n, m);
43
- return len;
41
- }
44
+ return int128_make128(cksm, len);
42
+ tcg_gen_not_vec(vece, m, m);
43
+ tcg_gen_bitsel_vec(vece, d, k, n, m);
45
}
44
}
46
45
47
void HELPER(pack)(CPUS390XState *env, uint32_t len, uint64_t dest, uint64_t src)
46
static void gen_bsl2n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
48
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/target/s390x/tcg/translate.c
51
+++ b/target/s390x/tcg/translate.c
52
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_cxlgb(DisasContext *s, DisasOps *o)
53
static DisasJumpType op_cksm(DisasContext *s, DisasOps *o)
54
{
55
int r2 = get_field(s, r2);
56
+ TCGv_i128 pair = tcg_temp_new_i128();
57
TCGv_i64 len = tcg_temp_new_i64();
58
59
- gen_helper_cksm(len, cpu_env, o->in1, o->in2, regs[r2 + 1]);
60
+ gen_helper_cksm(pair, cpu_env, o->in1, o->in2, regs[r2 + 1]);
61
set_cc_static(s);
62
- return_low128(o->out);
63
+ tcg_gen_extr_i128_i64(o->out, len, pair);
64
+ tcg_temp_free_i128(pair);
65
66
tcg_gen_add_i64(regs[r2], regs[r2], len);
67
tcg_gen_sub_i64(regs[r2 + 1], regs[r2 + 1], len);
68
--
47
--
69
2.34.1
48
2.43.0
70
49
71
50
diff view generated by jsdifflib
1
Do not reference TCG_TARGET_HAS_* directly.
2
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
5
---
5
target/s390x/helper.h | 2 +-
6
target/arm/tcg/translate-a64.c | 10 ++++++----
6
target/s390x/tcg/mem_helper.c | 11 ++++-------
7
target/arm/tcg/translate-sve.c | 2 +-
7
target/s390x/tcg/translate.c | 8 ++++++--
8
target/arm/tcg/translate.c | 2 +-
8
3 files changed, 11 insertions(+), 10 deletions(-)
9
3 files changed, 8 insertions(+), 6 deletions(-)
9
10
10
diff --git a/target/s390x/helper.h b/target/s390x/helper.h
11
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
11
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
12
--- a/target/s390x/helper.h
13
--- a/target/arm/tcg/translate-a64.c
13
+++ b/target/s390x/helper.h
14
+++ b/target/arm/tcg/translate-a64.c
14
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(divs64, TCG_CALL_NO_WG, i128, env, s64, s64)
15
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
15
DEF_HELPER_FLAGS_4(divu64, TCG_CALL_NO_WG, i128, env, i64, i64, i64)
16
TCGv_i64 tcg_rn, tcg_y;
16
DEF_HELPER_3(srst, void, env, i32, i32)
17
DisasCompare c;
17
DEF_HELPER_3(srstu, void, env, i32, i32)
18
unsigned nzcv;
18
-DEF_HELPER_4(clst, i64, env, i64, i64, i64)
19
+ bool has_andc;
19
+DEF_HELPER_4(clst, i128, env, i64, i64, i64)
20
20
DEF_HELPER_FLAGS_4(mvn, TCG_CALL_NO_WG, void, env, i32, i64, i64)
21
/* Set T0 = !COND. */
21
DEF_HELPER_FLAGS_4(mvo, TCG_CALL_NO_WG, void, env, i32, i64, i64)
22
arm_test_cc(&c, a->cond);
22
DEF_HELPER_FLAGS_4(mvpg, TCG_CALL_NO_WG, i32, env, i64, i32, i32)
23
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
23
diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c
24
tcg_gen_subi_i32(tcg_t2, tcg_t0, 1);
24
index XXXXXXX..XXXXXXX 100644
25
25
--- a/target/s390x/tcg/mem_helper.c
26
nzcv = a->nzcv;
26
+++ b/target/s390x/tcg/mem_helper.c
27
+ has_andc = tcg_op_supported(INDEX_op_andc_i32, TCG_TYPE_I32, 0);
27
@@ -XXX,XX +XXX,XX @@ void HELPER(srstu)(CPUS390XState *env, uint32_t r1, uint32_t r2)
28
if (nzcv & 8) { /* N */
28
}
29
tcg_gen_or_i32(cpu_NF, cpu_NF, tcg_t1);
29
30
} else {
30
/* unsigned string compare (c is string terminator) */
31
- if (TCG_TARGET_HAS_andc_i32) {
31
-uint64_t HELPER(clst)(CPUS390XState *env, uint64_t c, uint64_t s1, uint64_t s2)
32
+ if (has_andc) {
32
+Int128 HELPER(clst)(CPUS390XState *env, uint64_t c, uint64_t s1, uint64_t s2)
33
tcg_gen_andc_i32(cpu_NF, cpu_NF, tcg_t1);
33
{
34
uintptr_t ra = GETPC();
35
uint32_t len;
36
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(clst)(CPUS390XState *env, uint64_t c, uint64_t s1, uint64_t s2)
37
if (v1 == c) {
38
/* Equal. CC=0, and don't advance the registers. */
39
env->cc_op = 0;
40
- env->retxl = s2;
41
- return s1;
42
+ return int128_make128(s2, s1);
43
}
44
} else {
34
} else {
45
/* Unequal. CC={1,2}, and advance the registers. Note that
35
tcg_gen_and_i32(cpu_NF, cpu_NF, tcg_t2);
46
the terminator need not be zero, but the string that contains
47
the terminator is by definition "low". */
48
env->cc_op = (v1 == c ? 1 : v2 == c ? 2 : v1 < v2 ? 1 : 2);
49
- env->retxl = s2 + len;
50
- return s1 + len;
51
+ return int128_make128(s2 + len, s1 + len);
52
}
36
}
53
}
37
}
54
38
if (nzcv & 4) { /* Z */
55
/* CPU-determined bytes equal; advance the registers. */
39
- if (TCG_TARGET_HAS_andc_i32) {
56
env->cc_op = 3;
40
+ if (has_andc) {
57
- env->retxl = s2 + len;
41
tcg_gen_andc_i32(cpu_ZF, cpu_ZF, tcg_t1);
58
- return s1 + len;
42
} else {
59
+ return int128_make128(s2 + len, s1 + len);
43
tcg_gen_and_i32(cpu_ZF, cpu_ZF, tcg_t2);
60
}
44
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
61
45
if (nzcv & 2) { /* C */
62
/* move page */
46
tcg_gen_or_i32(cpu_CF, cpu_CF, tcg_t0);
63
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
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
64
index XXXXXXX..XXXXXXX 100644
63
index XXXXXXX..XXXXXXX 100644
65
--- a/target/s390x/tcg/translate.c
64
--- a/target/arm/tcg/translate-sve.c
66
+++ b/target/s390x/tcg/translate.c
65
+++ b/target/arm/tcg/translate-sve.c
67
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_clm(DisasContext *s, DisasOps *o)
66
@@ -XXX,XX +XXX,XX @@ static void gen_bsl2n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
68
67
* = | ~(m | k)
69
static DisasJumpType op_clst(DisasContext *s, DisasOps *o)
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)
70
{
81
{
71
- gen_helper_clst(o->in1, cpu_env, regs[0], o->in1, o->in2);
82
TCGv_i32 tmp = tcg_temp_new_i32();
72
+ TCGv_i128 pair = tcg_temp_new_i128();
83
- if (TCG_TARGET_HAS_add2_i32) {
73
+
84
+ if (tcg_op_supported(INDEX_op_add2_i32, TCG_TYPE_I32, 0)) {
74
+ gen_helper_clst(pair, cpu_env, regs[0], o->in1, o->in2);
85
tcg_gen_movi_i32(tmp, 0);
75
+ tcg_gen_extr_i128_i64(o->in2, o->in1, pair);
86
tcg_gen_add2_i32(cpu_NF, cpu_CF, t0, tmp, cpu_CF, tmp);
76
+ tcg_temp_free_i128(pair);
87
tcg_gen_add2_i32(cpu_NF, cpu_CF, cpu_NF, cpu_CF, t1, tmp);
77
+
78
set_cc_static(s);
79
- return_low128(o->in2);
80
return DISAS_NEXT;
81
}
82
83
--
88
--
84
2.34.1
89
2.43.0
85
90
86
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
1
These are not yet considering atomicity of the 16-byte value;
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
this is a direct replacement for the current target code which
3
uses a pair of 8-byte operations.
4
5
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
3
---
8
include/exec/cpu_ldst.h | 10 +++
4
include/tcg/tcg.h | 6 ++++++
9
include/tcg/tcg-op.h | 2 +
5
tcg/tcg.c | 21 +++++++++++++++++++++
10
accel/tcg/cputlb.c | 112 +++++++++++++++++++++++++++++++++
6
2 files changed, 27 insertions(+)
11
accel/tcg/user-exec.c | 66 ++++++++++++++++++++
12
tcg/tcg-op.c | 134 ++++++++++++++++++++++++++++++++++++++++
13
5 files changed, 324 insertions(+)
14
7
15
diff --git a/include/exec/cpu_ldst.h b/include/exec/cpu_ldst.h
8
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
16
index XXXXXXX..XXXXXXX 100644
9
index XXXXXXX..XXXXXXX 100644
17
--- a/include/exec/cpu_ldst.h
10
--- a/include/tcg/tcg.h
18
+++ b/include/exec/cpu_ldst.h
11
+++ b/include/tcg/tcg.h
19
@@ -XXX,XX +XXX,XX @@ uint32_t cpu_ldl_le_mmu(CPUArchState *env, abi_ptr ptr,
12
@@ -XXX,XX +XXX,XX @@ typedef struct TCGTargetOpDef {
20
uint64_t cpu_ldq_le_mmu(CPUArchState *env, abi_ptr ptr,
13
* on which we are currently executing.
21
MemOpIdx oi, uintptr_t ra);
14
*/
22
15
bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags);
23
+Int128 cpu_ld16_be_mmu(CPUArchState *env, abi_ptr addr,
16
+/*
24
+ MemOpIdx oi, uintptr_t ra);
17
+ * tcg_op_deposit_valid:
25
+Int128 cpu_ld16_le_mmu(CPUArchState *env, abi_ptr addr,
18
+ * Query if a deposit into (ofs, len) is supported for @type by
26
+ MemOpIdx oi, uintptr_t ra);
19
+ * the host on which we are currently executing.
27
+
20
+ */
28
void cpu_stb_mmu(CPUArchState *env, abi_ptr ptr, uint8_t val,
21
+bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len);
29
MemOpIdx oi, uintptr_t ra);
22
30
void cpu_stw_be_mmu(CPUArchState *env, abi_ptr ptr, uint16_t val,
23
void tcg_gen_call0(void *func, TCGHelperInfo *, TCGTemp *ret);
31
@@ -XXX,XX +XXX,XX @@ void cpu_stl_le_mmu(CPUArchState *env, abi_ptr ptr, uint32_t val,
24
void tcg_gen_call1(void *func, TCGHelperInfo *, TCGTemp *ret, TCGTemp *);
32
void cpu_stq_le_mmu(CPUArchState *env, abi_ptr ptr, uint64_t val,
25
diff --git a/tcg/tcg.c b/tcg/tcg.c
33
MemOpIdx oi, uintptr_t ra);
34
35
+void cpu_st16_be_mmu(CPUArchState *env, abi_ptr addr, Int128 val,
36
+ MemOpIdx oi, uintptr_t ra);
37
+void cpu_st16_le_mmu(CPUArchState *env, abi_ptr addr, Int128 val,
38
+ MemOpIdx oi, uintptr_t ra);
39
+
40
uint32_t cpu_atomic_cmpxchgb_mmu(CPUArchState *env, target_ulong addr,
41
uint32_t cmpv, uint32_t newv,
42
MemOpIdx oi, uintptr_t retaddr);
43
diff --git a/include/tcg/tcg-op.h b/include/tcg/tcg-op.h
44
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
45
--- a/include/tcg/tcg-op.h
27
--- a/tcg/tcg.c
46
+++ b/include/tcg/tcg-op.h
28
+++ b/tcg/tcg.c
47
@@ -XXX,XX +XXX,XX @@ void tcg_gen_qemu_ld_i32(TCGv_i32, TCGv, TCGArg, MemOp);
29
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
48
void tcg_gen_qemu_st_i32(TCGv_i32, TCGv, TCGArg, MemOp);
49
void tcg_gen_qemu_ld_i64(TCGv_i64, TCGv, TCGArg, MemOp);
50
void tcg_gen_qemu_st_i64(TCGv_i64, TCGv, TCGArg, MemOp);
51
+void tcg_gen_qemu_ld_i128(TCGv_i128, TCGv, TCGArg, MemOp);
52
+void tcg_gen_qemu_st_i128(TCGv_i128, TCGv, TCGArg, MemOp);
53
54
static inline void tcg_gen_qemu_ld8u(TCGv ret, TCGv addr, int mem_index)
55
{
56
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/accel/tcg/cputlb.c
59
+++ b/accel/tcg/cputlb.c
60
@@ -XXX,XX +XXX,XX @@ uint64_t cpu_ldq_le_mmu(CPUArchState *env, abi_ptr addr,
61
return cpu_load_helper(env, addr, oi, ra, helper_le_ldq_mmu);
62
}
63
64
+Int128 cpu_ld16_be_mmu(CPUArchState *env, abi_ptr addr,
65
+ MemOpIdx oi, uintptr_t ra)
66
+{
67
+ MemOp mop = get_memop(oi);
68
+ int mmu_idx = get_mmuidx(oi);
69
+ MemOpIdx new_oi;
70
+ unsigned a_bits;
71
+ uint64_t h, l;
72
+
73
+ tcg_debug_assert((mop & (MO_BSWAP|MO_SSIZE)) == (MO_BE|MO_128));
74
+ a_bits = get_alignment_bits(mop);
75
+
76
+ /* Handle CPU specific unaligned behaviour */
77
+ if (addr & ((1 << a_bits) - 1)) {
78
+ cpu_unaligned_access(env_cpu(env), addr, MMU_DATA_LOAD,
79
+ mmu_idx, ra);
80
+ }
81
+
82
+ /* Construct an unaligned 64-bit replacement MemOpIdx. */
83
+ mop = (mop & ~(MO_SIZE | MO_AMASK)) | MO_64 | MO_UNALN;
84
+ new_oi = make_memop_idx(mop, mmu_idx);
85
+
86
+ h = helper_be_ldq_mmu(env, addr, new_oi, ra);
87
+ l = helper_be_ldq_mmu(env, addr + 8, new_oi, ra);
88
+
89
+ qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_R);
90
+ return int128_make128(l, h);
91
+}
92
+
93
+Int128 cpu_ld16_le_mmu(CPUArchState *env, abi_ptr addr,
94
+ MemOpIdx oi, uintptr_t ra)
95
+{
96
+ MemOp mop = get_memop(oi);
97
+ int mmu_idx = get_mmuidx(oi);
98
+ MemOpIdx new_oi;
99
+ unsigned a_bits;
100
+ uint64_t h, l;
101
+
102
+ tcg_debug_assert((mop & (MO_BSWAP|MO_SSIZE)) == (MO_LE|MO_128));
103
+ a_bits = get_alignment_bits(mop);
104
+
105
+ /* Handle CPU specific unaligned behaviour */
106
+ if (addr & ((1 << a_bits) - 1)) {
107
+ cpu_unaligned_access(env_cpu(env), addr, MMU_DATA_LOAD,
108
+ mmu_idx, ra);
109
+ }
110
+
111
+ /* Construct an unaligned 64-bit replacement MemOpIdx. */
112
+ mop = (mop & ~(MO_SIZE | MO_AMASK)) | MO_64 | MO_UNALN;
113
+ new_oi = make_memop_idx(mop, mmu_idx);
114
+
115
+ l = helper_le_ldq_mmu(env, addr, new_oi, ra);
116
+ h = helper_le_ldq_mmu(env, addr + 8, new_oi, ra);
117
+
118
+ qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_R);
119
+ return int128_make128(l, h);
120
+}
121
+
122
/*
123
* Store Helpers
124
*/
125
@@ -XXX,XX +XXX,XX @@ void cpu_stq_le_mmu(CPUArchState *env, target_ulong addr, uint64_t val,
126
cpu_store_helper(env, addr, val, oi, retaddr, helper_le_stq_mmu);
127
}
128
129
+void cpu_st16_be_mmu(CPUArchState *env, abi_ptr addr, Int128 val,
130
+ MemOpIdx oi, uintptr_t ra)
131
+{
132
+ MemOp mop = get_memop(oi);
133
+ int mmu_idx = get_mmuidx(oi);
134
+ MemOpIdx new_oi;
135
+ unsigned a_bits;
136
+
137
+ tcg_debug_assert((mop & (MO_BSWAP|MO_SSIZE)) == (MO_BE|MO_128));
138
+ a_bits = get_alignment_bits(mop);
139
+
140
+ /* Handle CPU specific unaligned behaviour */
141
+ if (addr & ((1 << a_bits) - 1)) {
142
+ cpu_unaligned_access(env_cpu(env), addr, MMU_DATA_STORE,
143
+ mmu_idx, ra);
144
+ }
145
+
146
+ /* Construct an unaligned 64-bit replacement MemOpIdx. */
147
+ mop = (mop & ~(MO_SIZE | MO_AMASK)) | MO_64 | MO_UNALN;
148
+ new_oi = make_memop_idx(mop, mmu_idx);
149
+
150
+ helper_be_stq_mmu(env, addr, int128_gethi(val), new_oi, ra);
151
+ helper_be_stq_mmu(env, addr + 8, int128_getlo(val), new_oi, ra);
152
+
153
+ qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_W);
154
+}
155
+
156
+void cpu_st16_le_mmu(CPUArchState *env, abi_ptr addr, Int128 val,
157
+ MemOpIdx oi, uintptr_t ra)
158
+{
159
+ MemOp mop = get_memop(oi);
160
+ int mmu_idx = get_mmuidx(oi);
161
+ MemOpIdx new_oi;
162
+ unsigned a_bits;
163
+
164
+ tcg_debug_assert((mop & (MO_BSWAP|MO_SSIZE)) == (MO_LE|MO_128));
165
+ a_bits = get_alignment_bits(mop);
166
+
167
+ /* Handle CPU specific unaligned behaviour */
168
+ if (addr & ((1 << a_bits) - 1)) {
169
+ cpu_unaligned_access(env_cpu(env), addr, MMU_DATA_STORE,
170
+ mmu_idx, ra);
171
+ }
172
+
173
+ /* Construct an unaligned 64-bit replacement MemOpIdx. */
174
+ mop = (mop & ~(MO_SIZE | MO_AMASK)) | MO_64 | MO_UNALN;
175
+ new_oi = make_memop_idx(mop, mmu_idx);
176
+
177
+ helper_le_stq_mmu(env, addr, int128_getlo(val), new_oi, ra);
178
+ helper_le_stq_mmu(env, addr + 8, int128_gethi(val), new_oi, ra);
179
+
180
+ qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_W);
181
+}
182
+
183
#include "ldst_common.c.inc"
184
185
/*
186
diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c
187
index XXXXXXX..XXXXXXX 100644
188
--- a/accel/tcg/user-exec.c
189
+++ b/accel/tcg/user-exec.c
190
@@ -XXX,XX +XXX,XX @@ uint64_t cpu_ldq_le_mmu(CPUArchState *env, abi_ptr addr,
191
return ret;
192
}
193
194
+Int128 cpu_ld16_be_mmu(CPUArchState *env, abi_ptr addr,
195
+ MemOpIdx oi, uintptr_t ra)
196
+{
197
+ void *haddr;
198
+ Int128 ret;
199
+
200
+ validate_memop(oi, MO_128 | MO_BE);
201
+ haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_LOAD);
202
+ memcpy(&ret, haddr, 16);
203
+ clear_helper_retaddr();
204
+ qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_R);
205
+
206
+ if (!HOST_BIG_ENDIAN) {
207
+ ret = bswap128(ret);
208
+ }
209
+ return ret;
210
+}
211
+
212
+Int128 cpu_ld16_le_mmu(CPUArchState *env, abi_ptr addr,
213
+ MemOpIdx oi, uintptr_t ra)
214
+{
215
+ void *haddr;
216
+ Int128 ret;
217
+
218
+ validate_memop(oi, MO_128 | MO_LE);
219
+ haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_LOAD);
220
+ memcpy(&ret, haddr, 16);
221
+ clear_helper_retaddr();
222
+ qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_R);
223
+
224
+ if (HOST_BIG_ENDIAN) {
225
+ ret = bswap128(ret);
226
+ }
227
+ return ret;
228
+}
229
+
230
void cpu_stb_mmu(CPUArchState *env, abi_ptr addr, uint8_t val,
231
MemOpIdx oi, uintptr_t ra)
232
{
233
@@ -XXX,XX +XXX,XX @@ void cpu_stq_le_mmu(CPUArchState *env, abi_ptr addr, uint64_t val,
234
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_W);
235
}
236
237
+void cpu_st16_be_mmu(CPUArchState *env, abi_ptr addr,
238
+ Int128 val, MemOpIdx oi, uintptr_t ra)
239
+{
240
+ void *haddr;
241
+
242
+ validate_memop(oi, MO_128 | MO_BE);
243
+ haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_STORE);
244
+ if (!HOST_BIG_ENDIAN) {
245
+ val = bswap128(val);
246
+ }
247
+ memcpy(haddr, &val, 16);
248
+ clear_helper_retaddr();
249
+ qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_W);
250
+}
251
+
252
+void cpu_st16_le_mmu(CPUArchState *env, abi_ptr addr,
253
+ Int128 val, MemOpIdx oi, uintptr_t ra)
254
+{
255
+ void *haddr;
256
+
257
+ validate_memop(oi, MO_128 | MO_LE);
258
+ haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_STORE);
259
+ if (HOST_BIG_ENDIAN) {
260
+ val = bswap128(val);
261
+ }
262
+ memcpy(haddr, &val, 16);
263
+ clear_helper_retaddr();
264
+ qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_W);
265
+}
266
+
267
uint32_t cpu_ldub_code(CPUArchState *env, abi_ptr ptr)
268
{
269
uint32_t ret;
270
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
271
index XXXXXXX..XXXXXXX 100644
272
--- a/tcg/tcg-op.c
273
+++ b/tcg/tcg-op.c
274
@@ -XXX,XX +XXX,XX @@ void tcg_gen_qemu_st_i64(TCGv_i64 val, TCGv addr, TCGArg idx, MemOp memop)
275
}
30
}
276
}
31
}
277
32
278
+static void canonicalize_memop_i128_as_i64(MemOp ret[2], MemOp orig)
33
+bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len)
279
+{
34
+{
280
+ MemOp mop_1 = orig, mop_2;
35
+ tcg_debug_assert(len > 0);
281
+
36
+ switch (type) {
282
+ tcg_debug_assert((orig & MO_SIZE) == MO_128);
37
+ case TCG_TYPE_I32:
283
+ tcg_debug_assert((orig & MO_SIGN) == 0);
38
+ tcg_debug_assert(ofs < 32);
284
+
39
+ tcg_debug_assert(len <= 32);
285
+ /* Use a memory ordering implemented by the host. */
40
+ tcg_debug_assert(ofs + len <= 32);
286
+ if (!TCG_TARGET_HAS_MEMORY_BSWAP && (orig & MO_BSWAP)) {
41
+ return TCG_TARGET_HAS_deposit_i32 &&
287
+ mop_1 &= ~MO_BSWAP;
42
+ TCG_TARGET_deposit_i32_valid(ofs, len);
288
+ }
43
+ case TCG_TYPE_I64:
289
+
44
+ tcg_debug_assert(ofs < 64);
290
+ /* Reduce the size to 64-bit. */
45
+ tcg_debug_assert(len <= 64);
291
+ mop_1 = (mop_1 & ~MO_SIZE) | MO_64;
46
+ tcg_debug_assert(ofs + len <= 64);
292
+
47
+ return TCG_TARGET_HAS_deposit_i64 &&
293
+ /* Retain the alignment constraints of the original. */
48
+ TCG_TARGET_deposit_i64_valid(ofs, len);
294
+ switch (orig & MO_AMASK) {
295
+ case MO_UNALN:
296
+ case MO_ALIGN_2:
297
+ case MO_ALIGN_4:
298
+ mop_2 = mop_1;
299
+ break;
300
+ case MO_ALIGN_8:
301
+ /* Prefer MO_ALIGN+MO_64 to MO_ALIGN_8+MO_64. */
302
+ mop_1 = (mop_1 & ~MO_AMASK) | MO_ALIGN;
303
+ mop_2 = mop_1;
304
+ break;
305
+ case MO_ALIGN:
306
+ /* Second has 8-byte alignment; first has 16-byte alignment. */
307
+ mop_2 = mop_1;
308
+ mop_1 = (mop_1 & ~MO_AMASK) | MO_ALIGN_16;
309
+ break;
310
+ case MO_ALIGN_16:
311
+ case MO_ALIGN_32:
312
+ case MO_ALIGN_64:
313
+ /* Second has 8-byte alignment; first retains original. */
314
+ mop_2 = (mop_1 & ~MO_AMASK) | MO_ALIGN;
315
+ break;
316
+ default:
49
+ default:
317
+ g_assert_not_reached();
50
+ g_assert_not_reached();
318
+ }
51
+ }
319
+ ret[0] = mop_1;
320
+ ret[1] = mop_2;
321
+}
52
+}
322
+
53
+
323
+void tcg_gen_qemu_ld_i128(TCGv_i128 val, TCGv addr, TCGArg idx, MemOp memop)
54
static TCGOp *tcg_op_alloc(TCGOpcode opc, unsigned nargs);
324
+{
55
325
+ MemOp mop[2];
56
static void tcg_gen_callN(void *func, TCGHelperInfo *info,
326
+ TCGv addr_p8;
327
+ TCGv_i64 x, y;
328
+
329
+ canonicalize_memop_i128_as_i64(mop, memop);
330
+
331
+ tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD);
332
+ addr = plugin_prep_mem_callbacks(addr);
333
+
334
+ /* TODO: respect atomicity of the operation. */
335
+ /* TODO: allow the tcg backend to see the whole operation. */
336
+
337
+ /*
338
+ * Since there are no global TCGv_i128, there is no visible state
339
+ * changed if the second load faults. Load directly into the two
340
+ * subwords.
341
+ */
342
+ if ((memop & MO_BSWAP) == MO_LE) {
343
+ x = TCGV128_LOW(val);
344
+ y = TCGV128_HIGH(val);
345
+ } else {
346
+ x = TCGV128_HIGH(val);
347
+ y = TCGV128_LOW(val);
348
+ }
349
+
350
+ gen_ldst_i64(INDEX_op_qemu_ld_i64, x, addr, mop[0], idx);
351
+
352
+ if ((mop[0] ^ memop) & MO_BSWAP) {
353
+ tcg_gen_bswap64_i64(x, x);
354
+ }
355
+
356
+ addr_p8 = tcg_temp_new();
357
+ tcg_gen_addi_tl(addr_p8, addr, 8);
358
+ gen_ldst_i64(INDEX_op_qemu_ld_i64, y, addr_p8, mop[1], idx);
359
+ tcg_temp_free(addr_p8);
360
+
361
+ if ((mop[0] ^ memop) & MO_BSWAP) {
362
+ tcg_gen_bswap64_i64(y, y);
363
+ }
364
+
365
+ plugin_gen_mem_callbacks(addr, make_memop_idx(memop, idx),
366
+ QEMU_PLUGIN_MEM_R);
367
+}
368
+
369
+void tcg_gen_qemu_st_i128(TCGv_i128 val, TCGv addr, TCGArg idx, MemOp memop)
370
+{
371
+ MemOp mop[2];
372
+ TCGv addr_p8;
373
+ TCGv_i64 x, y;
374
+
375
+ canonicalize_memop_i128_as_i64(mop, memop);
376
+
377
+ tcg_gen_req_mo(TCG_MO_ST_LD | TCG_MO_ST_ST);
378
+ addr = plugin_prep_mem_callbacks(addr);
379
+
380
+ /* TODO: respect atomicity of the operation. */
381
+ /* TODO: allow the tcg backend to see the whole operation. */
382
+
383
+ if ((memop & MO_BSWAP) == MO_LE) {
384
+ x = TCGV128_LOW(val);
385
+ y = TCGV128_HIGH(val);
386
+ } else {
387
+ x = TCGV128_HIGH(val);
388
+ y = TCGV128_LOW(val);
389
+ }
390
+
391
+ addr_p8 = tcg_temp_new();
392
+ if ((mop[0] ^ memop) & MO_BSWAP) {
393
+ TCGv_i64 t = tcg_temp_new_i64();
394
+
395
+ tcg_gen_bswap64_i64(t, x);
396
+ gen_ldst_i64(INDEX_op_qemu_st_i64, t, addr, mop[0], idx);
397
+ tcg_gen_bswap64_i64(t, y);
398
+ tcg_gen_addi_tl(addr_p8, addr, 8);
399
+ gen_ldst_i64(INDEX_op_qemu_st_i64, t, addr_p8, mop[1], idx);
400
+ tcg_temp_free_i64(t);
401
+ } else {
402
+ gen_ldst_i64(INDEX_op_qemu_st_i64, x, addr, mop[0], idx);
403
+ tcg_gen_addi_tl(addr_p8, addr, 8);
404
+ gen_ldst_i64(INDEX_op_qemu_st_i64, y, addr_p8, mop[1], idx);
405
+ }
406
+ tcg_temp_free(addr_p8);
407
+
408
+ plugin_gen_mem_callbacks(addr, make_memop_idx(memop, idx),
409
+ QEMU_PLUGIN_MEM_W);
410
+}
411
+
412
static void tcg_gen_ext_i32(TCGv_i32 ret, TCGv_i32 val, MemOp opc)
413
{
414
switch (opc & MO_SSIZE) {
415
--
57
--
416
2.34.1
58
2.43.0
417
59
418
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
1
Pack the quotient and remainder into a single uint64_t.
1
Avoid direct usage of TCG_TARGET_deposit_*_valid.
2
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: David Hildenbrand <david@redhat.com>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
5
---
7
v2: Fix operand ordering; use tcg_extr32_i64.
6
target/i386/tcg/emit.c.inc | 6 ++----
8
---
7
1 file changed, 2 insertions(+), 4 deletions(-)
9
target/s390x/helper.h | 2 +-
10
target/s390x/tcg/int_helper.c | 26 +++++++++++++-------------
11
target/s390x/tcg/translate.c | 8 ++++----
12
3 files changed, 18 insertions(+), 18 deletions(-)
13
8
14
diff --git a/target/s390x/helper.h b/target/s390x/helper.h
9
diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc
15
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
16
--- a/target/s390x/helper.h
11
--- a/target/i386/tcg/emit.c.inc
17
+++ b/target/s390x/helper.h
12
+++ b/target/i386/tcg/emit.c.inc
18
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(clc, TCG_CALL_NO_WG, i32, env, i32, i64, i64)
19
DEF_HELPER_3(mvcl, i32, env, i32, i32)
20
DEF_HELPER_3(clcl, i32, env, i32, i32)
21
DEF_HELPER_FLAGS_4(clm, TCG_CALL_NO_WG, i32, env, i32, i32, i64)
22
-DEF_HELPER_FLAGS_3(divs32, TCG_CALL_NO_WG, s64, env, s64, s64)
23
+DEF_HELPER_FLAGS_3(divs32, TCG_CALL_NO_WG, i64, env, s64, s64)
24
DEF_HELPER_FLAGS_3(divu32, TCG_CALL_NO_WG, i64, env, i64, i64)
25
DEF_HELPER_FLAGS_3(divs64, TCG_CALL_NO_WG, s64, env, s64, s64)
26
DEF_HELPER_FLAGS_4(divu64, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
27
diff --git a/target/s390x/tcg/int_helper.c b/target/s390x/tcg/int_helper.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/s390x/tcg/int_helper.c
30
+++ b/target/s390x/tcg/int_helper.c
31
@@ -XXX,XX +XXX,XX @@
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
32
#endif
21
#endif
33
22
34
/* 64/32 -> 32 signed division */
23
#define MMX_OFFSET(reg) \
35
-int64_t HELPER(divs32)(CPUS390XState *env, int64_t a, int64_t b64)
24
@@ -XXX,XX +XXX,XX @@ static void gen_RCL(DisasContext *s, X86DecodedInsn *decode)
36
+uint64_t HELPER(divs32)(CPUS390XState *env, int64_t a, int64_t b64)
37
{
38
- int32_t ret, b = b64;
39
- int64_t q;
40
+ int32_t b = b64;
41
+ int64_t q, r;
42
43
if (b == 0) {
44
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
45
}
25
}
46
26
47
- ret = q = a / b;
27
/* Compute high part, including incoming carry. */
48
- env->retxl = a % b;
28
- if (!have_1bit_cin || TCG_TARGET_deposit_tl_valid(1, TARGET_LONG_BITS - 1)) {
49
+ q = a / b;
29
+ if (!have_1bit_cin || tcg_op_deposit_valid(TCG_TYPE_TL, 1, TARGET_LONG_BITS - 1)) {
50
+ r = a % b;
30
/* high = (T0 << 1) | cin */
51
31
TCGv cin = have_1bit_cin ? decode->cc_dst : decode->cc_src;
52
/* Catch non-representable quotient. */
32
tcg_gen_deposit_tl(high, cin, s->T0, 1, TARGET_LONG_BITS - 1);
53
- if (ret != q) {
33
@@ -XXX,XX +XXX,XX @@ static void gen_RCR(DisasContext *s, X86DecodedInsn *decode)
54
+ if (q != (int32_t)q) {
55
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
56
}
34
}
57
35
58
- return ret;
36
/* Save incoming carry into high, it will be shifted later. */
59
+ return deposit64(q, 32, 32, r);
37
- if (!have_1bit_cin || TCG_TARGET_deposit_tl_valid(1, TARGET_LONG_BITS - 1)) {
60
}
38
+ if (!have_1bit_cin || tcg_op_deposit_valid(TCG_TYPE_TL, 1, TARGET_LONG_BITS - 1)) {
61
39
TCGv cin = have_1bit_cin ? decode->cc_dst : decode->cc_src;
62
/* 64/32 -> 32 unsigned division */
40
tcg_gen_deposit_tl(high, cin, s->T0, 1, TARGET_LONG_BITS - 1);
63
uint64_t HELPER(divu32)(CPUS390XState *env, uint64_t a, uint64_t b64)
41
} else {
64
{
65
- uint32_t ret, b = b64;
66
- uint64_t q;
67
+ uint32_t b = b64;
68
+ uint64_t q, r;
69
70
if (b == 0) {
71
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
72
}
73
74
- ret = q = a / b;
75
- env->retxl = a % b;
76
+ q = a / b;
77
+ r = a % b;
78
79
/* Catch non-representable quotient. */
80
- if (ret != q) {
81
+ if (q != (uint32_t)q) {
82
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
83
}
84
85
- return ret;
86
+ return deposit64(q, 32, 32, r);
87
}
88
89
/* 64/64 -> 64 signed division */
90
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
91
index XXXXXXX..XXXXXXX 100644
92
--- a/target/s390x/tcg/translate.c
93
+++ b/target/s390x/tcg/translate.c
94
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_diag(DisasContext *s, DisasOps *o)
95
96
static DisasJumpType op_divs32(DisasContext *s, DisasOps *o)
97
{
98
- gen_helper_divs32(o->out2, cpu_env, o->in1, o->in2);
99
- return_low128(o->out);
100
+ gen_helper_divs32(o->out, cpu_env, o->in1, o->in2);
101
+ tcg_gen_extr32_i64(o->out2, o->out, o->out);
102
return DISAS_NEXT;
103
}
104
105
static DisasJumpType op_divu32(DisasContext *s, DisasOps *o)
106
{
107
- gen_helper_divu32(o->out2, cpu_env, o->in1, o->in2);
108
- return_low128(o->out);
109
+ gen_helper_divu32(o->out, cpu_env, o->in1, o->in2);
110
+ tcg_gen_extr32_i64(o->out2, o->out, o->out);
111
return DISAS_NEXT;
112
}
113
114
--
42
--
115
2.34.1
43
2.43.0
116
44
117
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
Fill in the parameters for the host ABI for Int128 for
1
Make these features unconditional, as they're used by most
2
those backends which require no extra modification.
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: Alex Bennée <alex.bennee@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
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.h | 2 ++
9
include/tcg/tcg.h | 4 -
9
tcg/arm/tcg-target.h | 2 ++
10
tcg/aarch64/tcg-target.h | 2 -
10
tcg/loongarch64/tcg-target.h | 2 ++
11
tcg/arm/tcg-target.h | 2 -
11
tcg/mips/tcg-target.h | 2 ++
12
tcg/i386/tcg-target.h | 2 -
12
tcg/riscv/tcg-target.h | 3 +++
13
tcg/loongarch64/tcg-target.h | 2 -
13
tcg/s390x/tcg-target.h | 2 ++
14
tcg/mips/tcg-target.h | 2 -
14
tcg/sparc64/tcg-target.h | 2 ++
15
tcg/ppc/tcg-target.h | 2 -
15
tcg/tcg.c | 6 +++---
16
tcg/riscv/tcg-target.h | 3 -
16
tcg/ppc/tcg-target.c.inc | 3 +++
17
tcg/s390x/tcg-target.h | 2 -
17
9 files changed, 21 insertions(+), 3 deletions(-)
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
18
35
36
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
37
index XXXXXXX..XXXXXXX 100644
38
--- a/include/tcg/tcg.h
39
+++ b/include/tcg/tcg.h
40
@@ -XXX,XX +XXX,XX @@ struct TCGContext {
41
CPUState *cpu; /* *_trans */
42
43
/* These structures are private to tcg-target.c.inc. */
44
-#ifdef TCG_TARGET_NEED_LDST_LABELS
45
QSIMPLEQ_HEAD(, TCGLabelQemuLdst) ldst_labels;
46
-#endif
47
-#ifdef TCG_TARGET_NEED_POOL_LABELS
48
struct TCGLabelPoolData *pool_labels;
49
-#endif
50
51
TCGLabel *exitreq_label;
52
19
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
53
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
20
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
21
--- a/tcg/aarch64/tcg-target.h
55
--- a/tcg/aarch64/tcg-target.h
22
+++ b/tcg/aarch64/tcg-target.h
56
+++ b/tcg/aarch64/tcg-target.h
23
@@ -XXX,XX +XXX,XX @@ typedef enum {
57
@@ -XXX,XX +XXX,XX @@ typedef enum {
24
#define TCG_TARGET_CALL_STACK_OFFSET 0
58
#define TCG_TARGET_HAS_tst_vec 1
25
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
59
26
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
60
#define TCG_TARGET_DEFAULT_MO (0)
27
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
61
-#define TCG_TARGET_NEED_LDST_LABELS
28
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
62
-#define TCG_TARGET_NEED_POOL_LABELS
29
63
30
/* optional instructions */
64
#endif /* AARCH64_TCG_TARGET_H */
31
#define TCG_TARGET_HAS_div_i32 1
32
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
65
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
33
index XXXXXXX..XXXXXXX 100644
66
index XXXXXXX..XXXXXXX 100644
34
--- a/tcg/arm/tcg-target.h
67
--- a/tcg/arm/tcg-target.h
35
+++ b/tcg/arm/tcg-target.h
68
+++ b/tcg/arm/tcg-target.h
36
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
69
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
37
#define TCG_TARGET_CALL_STACK_OFFSET    0
70
#define TCG_TARGET_HAS_tst_vec 1
38
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
71
39
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
72
#define TCG_TARGET_DEFAULT_MO (0)
40
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
73
-#define TCG_TARGET_NEED_LDST_LABELS
41
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
74
-#define TCG_TARGET_NEED_POOL_LABELS
42
75
43
/* optional instructions */
76
#endif
44
#define TCG_TARGET_HAS_ext8s_i32 1
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
45
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
89
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
46
index XXXXXXX..XXXXXXX 100644
90
index XXXXXXX..XXXXXXX 100644
47
--- a/tcg/loongarch64/tcg-target.h
91
--- a/tcg/loongarch64/tcg-target.h
48
+++ b/tcg/loongarch64/tcg-target.h
92
+++ b/tcg/loongarch64/tcg-target.h
49
@@ -XXX,XX +XXX,XX @@ typedef enum {
93
@@ -XXX,XX +XXX,XX @@ typedef enum {
50
#define TCG_TARGET_CALL_STACK_OFFSET 0
94
51
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
95
#define TCG_TARGET_DEFAULT_MO (0)
52
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
96
53
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
97
-#define TCG_TARGET_NEED_LDST_LABELS
54
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
98
-
55
99
#endif /* LOONGARCH_TCG_TARGET_H */
56
/* optional instructions */
57
#define TCG_TARGET_HAS_movcond_i32 1
58
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
100
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
59
index XXXXXXX..XXXXXXX 100644
101
index XXXXXXX..XXXXXXX 100644
60
--- a/tcg/mips/tcg-target.h
102
--- a/tcg/mips/tcg-target.h
61
+++ b/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
62
@@ -XXX,XX +XXX,XX @@ typedef enum {
116
@@ -XXX,XX +XXX,XX @@ typedef enum {
63
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
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
64
#endif
123
#endif
65
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
66
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
67
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
68
69
/* MOVN/MOVZ instructions detection */
70
#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
71
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
124
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
72
index XXXXXXX..XXXXXXX 100644
125
index XXXXXXX..XXXXXXX 100644
73
--- a/tcg/riscv/tcg-target.h
126
--- a/tcg/riscv/tcg-target.h
74
+++ b/tcg/riscv/tcg-target.h
127
+++ b/tcg/riscv/tcg-target.h
75
@@ -XXX,XX +XXX,XX @@ typedef enum {
128
@@ -XXX,XX +XXX,XX @@ typedef enum {
76
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
129
77
#if TCG_TARGET_REG_BITS == 32
130
#define TCG_TARGET_DEFAULT_MO (0)
78
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
131
79
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
132
-#define TCG_TARGET_NEED_LDST_LABELS
80
#else
133
-#define TCG_TARGET_NEED_POOL_LABELS
81
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
134
-
82
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
83
#endif
135
#endif
84
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
85
86
/* optional instructions */
87
#define TCG_TARGET_HAS_movcond_i32 0
88
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
89
index XXXXXXX..XXXXXXX 100644
137
index XXXXXXX..XXXXXXX 100644
90
--- a/tcg/s390x/tcg-target.h
138
--- a/tcg/s390x/tcg-target.h
91
+++ b/tcg/s390x/tcg-target.h
139
+++ b/tcg/s390x/tcg-target.h
92
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
140
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
93
#define TCG_TARGET_CALL_STACK_OFFSET    160
141
#define TCG_TARGET_HAS_tst_vec 0
94
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
142
95
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
143
#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
96
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_BY_REF
144
-#define TCG_TARGET_NEED_LDST_LABELS
97
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
145
-#define TCG_TARGET_NEED_POOL_LABELS
98
146
99
#define TCG_TARGET_HAS_MEMORY_BSWAP 1
147
#endif
100
101
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
148
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
102
index XXXXXXX..XXXXXXX 100644
149
index XXXXXXX..XXXXXXX 100644
103
--- a/tcg/sparc64/tcg-target.h
150
--- a/tcg/sparc64/tcg-target.h
104
+++ b/tcg/sparc64/tcg-target.h
151
+++ b/tcg/sparc64/tcg-target.h
105
@@ -XXX,XX +XXX,XX @@ typedef enum {
152
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
106
#define TCG_TARGET_CALL_STACK_OFFSET (128 + 6*8 + TCG_TARGET_STACK_BIAS)
153
#define TCG_AREG0 TCG_REG_I0
107
#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
154
108
#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
155
#define TCG_TARGET_DEFAULT_MO (0)
109
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
156
-#define TCG_TARGET_NEED_LDST_LABELS
110
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
157
-#define TCG_TARGET_NEED_POOL_LABELS
111
158
112
#if defined(__VIS__) && __VIS__ >= 0x300
159
#endif
113
#define use_vis3_instructions 1
114
diff --git a/tcg/tcg.c b/tcg/tcg.c
160
diff --git a/tcg/tcg.c b/tcg/tcg.c
115
index XXXXXXX..XXXXXXX 100644
161
index XXXXXXX..XXXXXXX 100644
116
--- a/tcg/tcg.c
162
--- a/tcg/tcg.c
117
+++ b/tcg/tcg.c
163
+++ b/tcg/tcg.c
118
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
164
@@ -XXX,XX +XXX,XX @@ static void tcg_target_init(TCGContext *s);
119
break;
165
static void tcg_target_qemu_prologue(TCGContext *s);
120
case dh_typecode_i128:
166
static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
121
info->nr_out = 128 / TCG_TARGET_REG_BITS;
167
intptr_t value, intptr_t addend);
122
- info->out_kind = TCG_CALL_RET_NORMAL; /* TODO */
168
+static void tcg_out_nop_fill(tcg_insn_unit *p, int count);
123
- switch (/* TODO */ TCG_CALL_RET_NORMAL) {
169
+
124
+ info->out_kind = TCG_TARGET_CALL_RET_I128;
170
+typedef struct TCGLabelQemuLdst TCGLabelQemuLdst;
125
+ switch (TCG_TARGET_CALL_RET_I128) {
171
+static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
126
case TCG_CALL_RET_NORMAL:
172
+static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
127
/* Query the last register now to trigger any assert early. */
173
128
tcg_target_call_oarg_reg(info->out_kind, info->nr_out - 1);
174
/* The CIE and FDE header definitions will be common to all hosts. */
129
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
175
typedef struct {
130
break;
176
@@ -XXX,XX +XXX,XX @@ typedef struct QEMU_PACKED {
131
177
DebugFrameFDEHeader fde;
132
case TCG_TYPE_I128:
178
} DebugFrameHeader;
133
- switch (/* TODO */ TCG_CALL_ARG_NORMAL) {
179
134
+ switch (TCG_TARGET_CALL_ARG_I128) {
180
-typedef struct TCGLabelQemuLdst {
135
case TCG_CALL_ARG_EVEN:
181
+struct TCGLabelQemuLdst {
136
layout_arg_even(&cum);
182
bool is_ld; /* qemu_ld: true, qemu_st: false */
137
/* fall through */
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
138
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
515
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
139
index XXXXXXX..XXXXXXX 100644
516
index XXXXXXX..XXXXXXX 100644
140
--- a/tcg/ppc/tcg-target.c.inc
517
--- a/tcg/ppc/tcg-target.c.inc
141
+++ b/tcg/ppc/tcg-target.c.inc
518
+++ b/tcg/ppc/tcg-target.c.inc
142
@@ -XXX,XX +XXX,XX @@
519
@@ -XXX,XX +XXX,XX @@
143
#else
520
*/
144
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
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
542
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
543
index XXXXXXX..XXXXXXX 100644
544
--- a/tcg/s390x/tcg-target.c.inc
545
+++ b/tcg/s390x/tcg-target.c.inc
546
@@ -XXX,XX +XXX,XX @@
547
* THE SOFTWARE.
548
*/
549
550
-#include "../tcg-ldst.c.inc"
551
-#include "../tcg-pool.c.inc"
552
#include "elf.h"
553
554
/* Used for function call generation. */
555
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
556
index XXXXXXX..XXXXXXX 100644
557
--- a/tcg/sparc64/tcg-target.c.inc
558
+++ b/tcg/sparc64/tcg-target.c.inc
559
@@ -XXX,XX +XXX,XX @@
560
#error "unsupported code generation mode"
145
#endif
561
#endif
146
+/* Note sysv arg alignment applies only to 2-word types, not more. */
562
147
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
563
-#include "../tcg-ldst.c.inc"
148
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
564
-#include "../tcg-pool.c.inc"
149
565
-
150
/* For some memory operations, we need a scratch that isn't R0. For the AIX
566
/* Used for function call generation. */
151
calling convention, we can re-use the TOC register since we'll be reloading
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)
822
{
823
return true;
824
}
825
+
826
+static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
827
+{
828
+ g_assert_not_reached();
829
+}
830
+
831
+static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
832
+{
833
+ g_assert_not_reached();
834
+}
152
--
835
--
153
2.34.1
836
2.43.0
154
837
155
838
diff view generated by jsdifflib
1
From: Ilya Leoshkevich <iii@linux.ibm.com>
1
In addition, add empty files for mips, sparc64 and tci.
2
Make the include unconditional within tcg-opc.h.
2
3
3
Add a basic test to prevent regressions.
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
5
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
6
Message-Id: <20221101111300.2539919-1-iii@linux.ibm.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
6
---
9
tests/tcg/s390x/div.c | 40 +++++++++++++++++++++++++++++++++
7
include/tcg/tcg-opc.h | 4 +---
10
tests/tcg/s390x/Makefile.target | 1 +
8
tcg/aarch64/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
11
2 files changed, 41 insertions(+)
9
tcg/arm/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
12
create mode 100644 tests/tcg/s390x/div.c
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
13
29
14
diff --git a/tests/tcg/s390x/div.c b/tests/tcg/s390x/div.c
30
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
31
index XXXXXXX..XXXXXXX 100644
32
--- a/include/tcg/tcg-opc.h
33
+++ b/include/tcg/tcg-opc.h
34
@@ -XXX,XX +XXX,XX @@ DEF(cmpsel_vec, 1, 4, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_cmpsel_vec))
35
36
DEF(last_generic, 0, 0, 0, TCG_OPF_NOT_PRESENT)
37
38
-#if TCG_TARGET_MAYBE_vec
39
-#include "tcg-target.opc.h"
40
-#endif
41
+#include "tcg-target-opc.h.inc"
42
43
#ifdef TCG_TARGET_INTERPRETER
44
/* These opcodes are only for use between the tci generator and interpreter. */
45
diff --git a/tcg/aarch64/tcg-target.opc.h b/tcg/aarch64/tcg-target-opc.h.inc
46
similarity index 100%
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
15
new file mode 100644
62
new file mode 100644
16
index XXXXXXX..XXXXXXX
63
index XXXXXXX..XXXXXXX
17
--- /dev/null
64
--- /dev/null
18
+++ b/tests/tcg/s390x/div.c
65
+++ b/tcg/mips/tcg-target-opc.h.inc
19
@@ -XXX,XX +XXX,XX @@
66
@@ -0,0 +1 @@
20
+#include <assert.h>
67
+/* No target specific opcodes. */
21
+#include <stdint.h>
68
diff --git a/tcg/ppc/tcg-target.opc.h b/tcg/ppc/tcg-target-opc.h.inc
22
+
69
similarity index 100%
23
+static void test_dr(void)
70
rename from tcg/ppc/tcg-target.opc.h
24
+{
71
rename to tcg/ppc/tcg-target-opc.h.inc
25
+ register int32_t r0 asm("r0") = -1;
72
diff --git a/tcg/riscv/tcg-target.opc.h b/tcg/riscv/tcg-target-opc.h.inc
26
+ register int32_t r1 asm("r1") = -4241;
73
similarity index 100%
27
+ int32_t b = 101, q, r;
74
rename from tcg/riscv/tcg-target.opc.h
28
+
75
rename to tcg/riscv/tcg-target-opc.h.inc
29
+ asm("dr %[r0],%[b]"
76
diff --git a/tcg/s390x/tcg-target.opc.h b/tcg/s390x/tcg-target-opc.h.inc
30
+ : [r0] "+r" (r0), [r1] "+r" (r1)
77
similarity index 100%
31
+ : [b] "r" (b)
78
rename from tcg/s390x/tcg-target.opc.h
32
+ : "cc");
79
rename to tcg/s390x/tcg-target-opc.h.inc
33
+ q = r1;
80
diff --git a/tcg/sparc64/tcg-target-opc.h.inc b/tcg/sparc64/tcg-target-opc.h.inc
34
+ r = r0;
81
new file mode 100644
35
+ assert(q == -41);
82
index XXXXXXX..XXXXXXX
36
+ assert(r == -100);
83
--- /dev/null
37
+}
84
+++ b/tcg/sparc64/tcg-target-opc.h.inc
38
+
85
@@ -0,0 +1 @@
39
+static void test_dlr(void)
86
+/* No target specific opcodes. */
40
+{
87
diff --git a/tcg/tci/tcg-target-opc.h.inc b/tcg/tci/tcg-target-opc.h.inc
41
+ register uint32_t r0 asm("r0") = 0;
88
new file mode 100644
42
+ register uint32_t r1 asm("r1") = 4243;
89
index XXXXXXX..XXXXXXX
43
+ uint32_t b = 101, q, r;
90
--- /dev/null
44
+
91
+++ b/tcg/tci/tcg-target-opc.h.inc
45
+ asm("dlr %[r0],%[b]"
92
@@ -0,0 +1 @@
46
+ : [r0] "+r" (r0), [r1] "+r" (r1)
93
+/* No target specific opcodes. */
47
+ : [b] "r" (b)
48
+ : "cc");
49
+ q = r1;
50
+ r = r0;
51
+ assert(q == 42);
52
+ assert(r == 1);
53
+}
54
+
55
+int main(void)
56
+{
57
+ test_dr();
58
+ test_dlr();
59
+}
60
diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target
61
index XXXXXXX..XXXXXXX 100644
62
--- a/tests/tcg/s390x/Makefile.target
63
+++ b/tests/tcg/s390x/Makefile.target
64
@@ -XXX,XX +XXX,XX @@ TESTS+=trap
65
TESTS+=signals-s390x
66
TESTS+=branch-relative-long
67
TESTS+=noexec
68
+TESTS+=div
69
70
Z13_TESTS=vistr
71
$(Z13_TESTS): CFLAGS+=-march=z13 -O2
72
--
94
--
73
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
1
This enables allocation of i128. The type is not yet
1
Don't reference TCG_TARGET_MAYBE_vec in a public header.
2
usable, as we have not yet added data movement ops.
3
2
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@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
include/tcg/tcg.h | 32 +++++++++++++++++++++++++
6
include/tcg/tcg.h | 7 -------
9
tcg/tcg.c | 60 +++++++++++++++++++++++++++++++++--------------
7
tcg/tcg.c | 4 ++++
10
2 files changed, 74 insertions(+), 18 deletions(-)
8
2 files changed, 4 insertions(+), 7 deletions(-)
11
9
12
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
10
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
13
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
14
--- a/include/tcg/tcg.h
12
--- a/include/tcg/tcg.h
15
+++ b/include/tcg/tcg.h
13
+++ b/include/tcg/tcg.h
16
@@ -XXX,XX +XXX,XX @@ static inline TCGTemp *tcgv_i64_temp(TCGv_i64 v)
14
@@ -XXX,XX +XXX,XX @@ extern tcg_prologue_fn *tcg_qemu_tb_exec;
17
return tcgv_i32_temp((TCGv_i32)v);
15
18
}
16
void tcg_register_jit(const void *buf, size_t buf_size);
19
17
20
+static inline TCGTemp *tcgv_i128_temp(TCGv_i128 v)
18
-#if TCG_TARGET_MAYBE_vec
21
+{
19
/* Return zero if the tuple (opc, type, vece) is unsupportable;
22
+ return tcgv_i32_temp((TCGv_i32)v);
20
return > 0 if it is directly supportable;
23
+}
21
return < 0 if we must call tcg_expand_vec_op. */
24
+
22
int tcg_can_emit_vec_op(TCGOpcode, TCGType, unsigned);
25
static inline TCGTemp *tcgv_ptr_temp(TCGv_ptr v)
23
-#else
26
{
24
-static inline int tcg_can_emit_vec_op(TCGOpcode o, TCGType t, unsigned ve)
27
return tcgv_i32_temp((TCGv_i32)v);
25
-{
28
@@ -XXX,XX +XXX,XX @@ static inline TCGArg tcgv_i64_arg(TCGv_i64 v)
26
- return 0;
29
return temp_arg(tcgv_i64_temp(v));
27
-}
30
}
28
-#endif
31
29
32
+static inline TCGArg tcgv_i128_arg(TCGv_i128 v)
30
/* Expand the tuple (opc, type, vece) on the given arguments. */
33
+{
31
void tcg_expand_vec_op(TCGOpcode, TCGType, unsigned, TCGArg, ...);
34
+ return temp_arg(tcgv_i128_temp(v));
35
+}
36
+
37
static inline TCGArg tcgv_ptr_arg(TCGv_ptr v)
38
{
39
return temp_arg(tcgv_ptr_temp(v));
40
@@ -XXX,XX +XXX,XX @@ static inline TCGv_i64 temp_tcgv_i64(TCGTemp *t)
41
return (TCGv_i64)temp_tcgv_i32(t);
42
}
43
44
+static inline TCGv_i128 temp_tcgv_i128(TCGTemp *t)
45
+{
46
+ return (TCGv_i128)temp_tcgv_i32(t);
47
+}
48
+
49
static inline TCGv_ptr temp_tcgv_ptr(TCGTemp *t)
50
{
51
return (TCGv_ptr)temp_tcgv_i32(t);
52
@@ -XXX,XX +XXX,XX @@ static inline void tcg_temp_free_i64(TCGv_i64 arg)
53
tcg_temp_free_internal(tcgv_i64_temp(arg));
54
}
55
56
+static inline void tcg_temp_free_i128(TCGv_i128 arg)
57
+{
58
+ tcg_temp_free_internal(tcgv_i128_temp(arg));
59
+}
60
+
61
static inline void tcg_temp_free_ptr(TCGv_ptr arg)
62
{
63
tcg_temp_free_internal(tcgv_ptr_temp(arg));
64
@@ -XXX,XX +XXX,XX @@ static inline TCGv_i64 tcg_temp_local_new_i64(void)
65
return temp_tcgv_i64(t);
66
}
67
68
+static inline TCGv_i128 tcg_temp_new_i128(void)
69
+{
70
+ TCGTemp *t = tcg_temp_new_internal(TCG_TYPE_I128, false);
71
+ return temp_tcgv_i128(t);
72
+}
73
+
74
+static inline TCGv_i128 tcg_temp_local_new_i128(void)
75
+{
76
+ TCGTemp *t = tcg_temp_new_internal(TCG_TYPE_I128, true);
77
+ return temp_tcgv_i128(t);
78
+}
79
+
80
static inline TCGv_ptr tcg_global_mem_new_ptr(TCGv_ptr reg, intptr_t offset,
81
const char *name)
82
{
83
diff --git a/tcg/tcg.c b/tcg/tcg.c
32
diff --git a/tcg/tcg.c b/tcg/tcg.c
84
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
85
--- a/tcg/tcg.c
34
--- a/tcg/tcg.c
86
+++ b/tcg/tcg.c
35
+++ b/tcg/tcg.c
87
@@ -XXX,XX +XXX,XX @@ TCGTemp *tcg_temp_new_internal(TCGType type, bool temp_local)
36
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
88
tcg_debug_assert(ts->base_type == type);
37
{
89
tcg_debug_assert(ts->kind == kind);
38
g_assert_not_reached();
90
} else {
39
}
91
+ int i, n;
40
+int tcg_can_emit_vec_op(TCGOpcode o, TCGType t, unsigned ve)
92
+
41
+{
93
+ switch (type) {
42
+ return 0;
94
+ case TCG_TYPE_I32:
43
+}
95
+ case TCG_TYPE_V64:
44
#endif
96
+ case TCG_TYPE_V128:
45
static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, TCGReg arg1,
97
+ case TCG_TYPE_V256:
46
intptr_t arg2);
98
+ n = 1;
99
+ break;
100
+ case TCG_TYPE_I64:
101
+ n = 64 / TCG_TARGET_REG_BITS;
102
+ break;
103
+ case TCG_TYPE_I128:
104
+ n = 128 / TCG_TARGET_REG_BITS;
105
+ break;
106
+ default:
107
+ g_assert_not_reached();
108
+ }
109
+
110
ts = tcg_temp_alloc(s);
111
- if (TCG_TARGET_REG_BITS == 32 && type == TCG_TYPE_I64) {
112
- TCGTemp *ts2 = tcg_temp_alloc(s);
113
+ ts->base_type = type;
114
+ ts->temp_allocated = 1;
115
+ ts->kind = kind;
116
117
- ts->base_type = type;
118
- ts->type = TCG_TYPE_I32;
119
- ts->temp_allocated = 1;
120
- ts->kind = kind;
121
-
122
- tcg_debug_assert(ts2 == ts + 1);
123
- ts2->base_type = TCG_TYPE_I64;
124
- ts2->type = TCG_TYPE_I32;
125
- ts2->temp_allocated = 1;
126
- ts2->temp_subindex = 1;
127
- ts2->kind = kind;
128
- } else {
129
- ts->base_type = type;
130
+ if (n == 1) {
131
ts->type = type;
132
- ts->temp_allocated = 1;
133
- ts->kind = kind;
134
+ } else {
135
+ ts->type = TCG_TYPE_REG;
136
+
137
+ for (i = 1; i < n; ++i) {
138
+ TCGTemp *ts2 = tcg_temp_alloc(s);
139
+
140
+ tcg_debug_assert(ts2 == ts + i);
141
+ ts2->base_type = type;
142
+ ts2->type = TCG_TYPE_REG;
143
+ ts2->temp_allocated = 1;
144
+ ts2->temp_subindex = i;
145
+ ts2->kind = kind;
146
+ }
147
}
148
}
149
150
@@ -XXX,XX +XXX,XX @@ static void temp_allocate_frame(TCGContext *s, TCGTemp *ts)
151
case TCG_TYPE_V64:
152
align = 8;
153
break;
154
+ case TCG_TYPE_I128:
155
case TCG_TYPE_V128:
156
case TCG_TYPE_V256:
157
- /* Note that we do not require aligned storage for V256. */
158
+ /*
159
+ * Note that we do not require aligned storage for V256,
160
+ * and that we provide alignment for I128 to match V128,
161
+ * even if that's above what the host ABI requires.
162
+ */
163
align = 16;
164
break;
165
default:
166
--
47
--
167
2.34.1
48
2.43.0
168
49
169
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
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-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
1
9
10
diff --git a/tcg/aarch64/tcg-target-has.h b/tcg/aarch64/tcg-target-has.h
11
new file mode 100644
12
index XXXXXXX..XXXXXXX
13
--- /dev/null
14
+++ b/tcg/aarch64/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: GPL-2.0-or-later */
17
+/*
18
+ * Define target-specific opcode support
19
+ * Copyright (c) 2013 Huawei Technologies Duesseldorf GmbH
20
+ */
21
+
22
+#ifndef TCG_TARGET_HAS_H
23
+#define TCG_TARGET_HAS_H
24
+
25
+#include "host/cpuinfo.h"
26
+
27
+#define have_lse (cpuinfo & CPUINFO_LSE)
28
+#define have_lse2 (cpuinfo & CPUINFO_LSE2)
29
+
30
+/* optional instructions */
31
+#define TCG_TARGET_HAS_div_i32 1
32
+#define TCG_TARGET_HAS_rem_i32 1
33
+#define TCG_TARGET_HAS_ext8s_i32 1
34
+#define TCG_TARGET_HAS_ext16s_i32 1
35
+#define TCG_TARGET_HAS_ext8u_i32 1
36
+#define TCG_TARGET_HAS_ext16u_i32 1
37
+#define TCG_TARGET_HAS_bswap16_i32 1
38
+#define TCG_TARGET_HAS_bswap32_i32 1
39
+#define TCG_TARGET_HAS_not_i32 1
40
+#define TCG_TARGET_HAS_rot_i32 1
41
+#define TCG_TARGET_HAS_andc_i32 1
42
+#define TCG_TARGET_HAS_orc_i32 1
43
+#define TCG_TARGET_HAS_eqv_i32 1
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
+
96
+/*
97
+ * Without FEAT_LSE2, we must use LDXP+STXP to implement atomic 128-bit load,
98
+ * which requires writable pages. We must defer to the helper for user-only,
99
+ * but in system mode all ram is writable for the host.
100
+ */
101
+#ifdef CONFIG_USER_ONLY
102
+#define TCG_TARGET_HAS_qemu_ldst_i128 have_lse2
103
+#else
104
+#define TCG_TARGET_HAS_qemu_ldst_i128 1
105
+#endif
106
+
107
+#define TCG_TARGET_HAS_tst 1
108
+
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
136
index XXXXXXX..XXXXXXX 100644
137
--- a/tcg/aarch64/tcg-target.h
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
148
@@ -XXX,XX +XXX,XX @@ typedef enum {
149
150
#define TCG_TARGET_NB_REGS 64
151
152
-#define have_lse (cpuinfo & CPUINFO_LSE)
153
-#define have_lse2 (cpuinfo & CPUINFO_LSE2)
154
-
155
-/* optional instructions */
156
-#define TCG_TARGET_HAS_div_i32 1
157
-#define TCG_TARGET_HAS_rem_i32 1
158
-#define TCG_TARGET_HAS_ext8s_i32 1
159
-#define TCG_TARGET_HAS_ext16s_i32 1
160
-#define TCG_TARGET_HAS_ext8u_i32 1
161
-#define TCG_TARGET_HAS_ext16u_i32 1
162
-#define TCG_TARGET_HAS_bswap16_i32 1
163
-#define TCG_TARGET_HAS_bswap32_i32 1
164
-#define TCG_TARGET_HAS_not_i32 1
165
-#define TCG_TARGET_HAS_rot_i32 1
166
-#define TCG_TARGET_HAS_andc_i32 1
167
-#define TCG_TARGET_HAS_orc_i32 1
168
-#define TCG_TARGET_HAS_eqv_i32 1
169
-#define TCG_TARGET_HAS_nand_i32 0
170
-#define TCG_TARGET_HAS_nor_i32 0
171
-#define TCG_TARGET_HAS_clz_i32 1
172
-#define TCG_TARGET_HAS_ctz_i32 1
173
-#define TCG_TARGET_HAS_ctpop_i32 0
174
-#define TCG_TARGET_HAS_deposit_i32 1
175
-#define TCG_TARGET_HAS_extract_i32 1
176
-#define TCG_TARGET_HAS_sextract_i32 1
177
-#define TCG_TARGET_HAS_extract2_i32 1
178
-#define TCG_TARGET_HAS_negsetcond_i32 1
179
-#define TCG_TARGET_HAS_add2_i32 1
180
-#define TCG_TARGET_HAS_sub2_i32 1
181
-#define TCG_TARGET_HAS_mulu2_i32 0
182
-#define TCG_TARGET_HAS_muls2_i32 0
183
-#define TCG_TARGET_HAS_muluh_i32 0
184
-#define TCG_TARGET_HAS_mulsh_i32 0
185
-#define TCG_TARGET_HAS_extr_i64_i32 0
186
-#define TCG_TARGET_HAS_qemu_st8_i32 0
187
-
188
-#define TCG_TARGET_HAS_div_i64 1
189
-#define TCG_TARGET_HAS_rem_i64 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 1
197
-#define TCG_TARGET_HAS_bswap32_i64 1
198
-#define TCG_TARGET_HAS_bswap64_i64 1
199
-#define TCG_TARGET_HAS_not_i64 1
200
-#define TCG_TARGET_HAS_rot_i64 1
201
-#define TCG_TARGET_HAS_andc_i64 1
202
-#define TCG_TARGET_HAS_orc_i64 1
203
-#define TCG_TARGET_HAS_eqv_i64 1
204
-#define TCG_TARGET_HAS_nand_i64 0
205
-#define TCG_TARGET_HAS_nor_i64 0
206
-#define TCG_TARGET_HAS_clz_i64 1
207
-#define TCG_TARGET_HAS_ctz_i64 1
208
-#define TCG_TARGET_HAS_ctpop_i64 0
209
-#define TCG_TARGET_HAS_deposit_i64 1
210
-#define TCG_TARGET_HAS_extract_i64 1
211
-#define TCG_TARGET_HAS_sextract_i64 1
212
-#define TCG_TARGET_HAS_extract2_i64 1
213
-#define TCG_TARGET_HAS_negsetcond_i64 1
214
-#define TCG_TARGET_HAS_add2_i64 1
215
-#define TCG_TARGET_HAS_sub2_i64 1
216
-#define TCG_TARGET_HAS_mulu2_i64 0
217
-#define TCG_TARGET_HAS_muls2_i64 0
218
-#define TCG_TARGET_HAS_muluh_i64 1
219
-#define TCG_TARGET_HAS_mulsh_i64 1
220
-
221
-/*
222
- * Without FEAT_LSE2, we must use LDXP+STXP to implement atomic 128-bit load,
223
- * which requires writable pages. We must defer to the helper for user-only,
224
- * but in system mode all ram is writable for the host.
225
- */
226
-#ifdef CONFIG_USER_ONLY
227
-#define TCG_TARGET_HAS_qemu_ldst_i128 have_lse2
228
-#else
229
-#define TCG_TARGET_HAS_qemu_ldst_i128 1
230
-#endif
231
-
232
-#define TCG_TARGET_HAS_tst 1
233
-
234
-#define TCG_TARGET_HAS_v64 1
235
-#define TCG_TARGET_HAS_v128 1
236
-#define TCG_TARGET_HAS_v256 0
237
-
238
-#define TCG_TARGET_HAS_andc_vec 1
239
-#define TCG_TARGET_HAS_orc_vec 1
240
-#define TCG_TARGET_HAS_nand_vec 0
241
-#define TCG_TARGET_HAS_nor_vec 0
242
-#define TCG_TARGET_HAS_eqv_vec 0
243
-#define TCG_TARGET_HAS_not_vec 1
244
-#define TCG_TARGET_HAS_neg_vec 1
245
-#define TCG_TARGET_HAS_abs_vec 1
246
-#define TCG_TARGET_HAS_roti_vec 0
247
-#define TCG_TARGET_HAS_rots_vec 0
248
-#define TCG_TARGET_HAS_rotv_vec 0
249
-#define TCG_TARGET_HAS_shi_vec 1
250
-#define TCG_TARGET_HAS_shs_vec 0
251
-#define TCG_TARGET_HAS_shv_vec 1
252
-#define TCG_TARGET_HAS_mul_vec 1
253
-#define TCG_TARGET_HAS_sat_vec 1
254
-#define TCG_TARGET_HAS_minmax_vec 1
255
-#define TCG_TARGET_HAS_bitsel_vec 1
256
-#define TCG_TARGET_HAS_cmpsel_vec 0
257
-#define TCG_TARGET_HAS_tst_vec 1
258
+#include "tcg-target-has.h"
259
260
#define TCG_TARGET_DEFAULT_MO (0)
261
262
--
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
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-6-philmd@linaro.org>
4
---
5
tcg/i386/tcg-target-has.h | 139 ++++++++++++++++++++++++++++++++++++++
6
tcg/i386/tcg-target.h | 129 +----------------------------------
7
2 files changed, 140 insertions(+), 128 deletions(-)
8
create mode 100644 tcg/i386/tcg-target-has.h
1
9
10
diff --git a/tcg/i386/tcg-target-has.h b/tcg/i386/tcg-target-has.h
11
new file mode 100644
12
index XXXXXXX..XXXXXXX
13
--- /dev/null
14
+++ b/tcg/i386/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
+ */
21
+
22
+#ifndef TCG_TARGET_HAS_H
23
+#define TCG_TARGET_HAS_H
24
+
25
+#include "host/cpuinfo.h"
26
+
27
+#define have_bmi1 (cpuinfo & CPUINFO_BMI1)
28
+#define have_popcnt (cpuinfo & CPUINFO_POPCNT)
29
+#define have_avx1 (cpuinfo & CPUINFO_AVX1)
30
+#define have_avx2 (cpuinfo & CPUINFO_AVX2)
31
+#define have_movbe (cpuinfo & CPUINFO_MOVBE)
32
+
33
+/*
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.
36
+ */
37
+#define have_avx512vl ((cpuinfo & CPUINFO_AVX512VL) && \
38
+ (cpuinfo & CPUINFO_AVX512F))
39
+#define have_avx512bw ((cpuinfo & CPUINFO_AVX512BW) && have_avx512vl)
40
+#define have_avx512dq ((cpuinfo & CPUINFO_AVX512DQ) && have_avx512vl)
41
+#define have_avx512vbmi2 ((cpuinfo & CPUINFO_AVX512VBMI2) && have_avx512vl)
42
+
43
+/* optional instructions */
44
+#define TCG_TARGET_HAS_div2_i32 1
45
+#define TCG_TARGET_HAS_rot_i32 1
46
+#define TCG_TARGET_HAS_ext8s_i32 1
47
+#define TCG_TARGET_HAS_ext16s_i32 1
48
+#define TCG_TARGET_HAS_ext8u_i32 1
49
+#define TCG_TARGET_HAS_ext16u_i32 1
50
+#define TCG_TARGET_HAS_bswap16_i32 1
51
+#define TCG_TARGET_HAS_bswap32_i32 1
52
+#define TCG_TARGET_HAS_not_i32 1
53
+#define TCG_TARGET_HAS_andc_i32 have_bmi1
54
+#define TCG_TARGET_HAS_orc_i32 0
55
+#define TCG_TARGET_HAS_eqv_i32 0
56
+#define TCG_TARGET_HAS_nand_i32 0
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
108
+#else
109
+#define TCG_TARGET_HAS_qemu_st8_i32 1
110
+#endif
111
+
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
302
--
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
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-9-philmd@linaro.org>
4
---
5
tcg/ppc/tcg-target-has.h | 124 +++++++++++++++++++++++++++++++++++++++
6
tcg/ppc/tcg-target.h | 114 +----------------------------------
7
2 files changed, 125 insertions(+), 113 deletions(-)
8
create mode 100644 tcg/ppc/tcg-target-has.h
1
9
10
diff --git a/tcg/ppc/tcg-target-has.h b/tcg/ppc/tcg-target-has.h
11
new file mode 100644
12
index XXXXXXX..XXXXXXX
13
--- /dev/null
14
+++ b/tcg/ppc/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
+ */
21
+
22
+#ifndef TCG_TARGET_HAS_H
23
+#define TCG_TARGET_HAS_H
24
+
25
+#include "host/cpuinfo.h"
26
+
27
+#define have_isa_2_06 (cpuinfo & CPUINFO_V2_06)
28
+#define have_isa_2_07 (cpuinfo & CPUINFO_V2_07)
29
+#define have_isa_3_00 (cpuinfo & CPUINFO_V3_0)
30
+#define have_isa_3_10 (cpuinfo & CPUINFO_V3_1)
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.
113
+ */
114
+#define TCG_TARGET_HAS_v64 have_vsx
115
+#define TCG_TARGET_HAS_v128 have_altivec
116
+#define TCG_TARGET_HAS_v256 0
117
+
118
+#define TCG_TARGET_HAS_andc_vec 1
119
+#define TCG_TARGET_HAS_orc_vec have_isa_2_07
120
+#define TCG_TARGET_HAS_nand_vec have_isa_2_07
121
+#define TCG_TARGET_HAS_nor_vec 1
122
+#define TCG_TARGET_HAS_eqv_vec have_isa_2_07
123
+#define TCG_TARGET_HAS_not_vec 1
124
+#define TCG_TARGET_HAS_neg_vec have_isa_3_00
125
+#define TCG_TARGET_HAS_abs_vec 0
126
+#define TCG_TARGET_HAS_roti_vec 0
127
+#define TCG_TARGET_HAS_rots_vec 0
128
+#define TCG_TARGET_HAS_rotv_vec 1
129
+#define TCG_TARGET_HAS_shi_vec 0
130
+#define TCG_TARGET_HAS_shs_vec 0
131
+#define TCG_TARGET_HAS_shv_vec 1
132
+#define TCG_TARGET_HAS_mul_vec 1
133
+#define TCG_TARGET_HAS_sat_vec 1
134
+#define TCG_TARGET_HAS_minmax_vec 1
135
+#define TCG_TARGET_HAS_bitsel_vec have_vsx
136
+#define TCG_TARGET_HAS_cmpsel_vec 1
137
+#define TCG_TARGET_HAS_tst_vec 0
138
+
139
+#endif
140
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
141
index XXXXXXX..XXXXXXX 100644
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
272
--
273
2.43.0
274
275
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-10-philmd@linaro.org>
4
---
5
tcg/riscv/tcg-target-has.h | 112 +++++++++++++++++++++++++++++++++++++
6
tcg/riscv/tcg-target.h | 102 +--------------------------------
7
2 files changed, 113 insertions(+), 101 deletions(-)
8
create mode 100644 tcg/riscv/tcg-target-has.h
1
9
10
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
11
new file mode 100644
12
index XXXXXXX..XXXXXXX
13
--- /dev/null
14
+++ b/tcg/riscv/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: MIT */
17
+/*
18
+ * Define target-specific opcode support
19
+ * Copyright (c) 2018 SiFive, Inc
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 1
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 (cpuinfo & CPUINFO_ZBB)
33
+#define TCG_TARGET_HAS_deposit_i32 0
34
+#define TCG_TARGET_HAS_extract_i32 0
35
+#define TCG_TARGET_HAS_sextract_i32 0
36
+#define TCG_TARGET_HAS_extract2_i32 0
37
+#define TCG_TARGET_HAS_add2_i32 1
38
+#define TCG_TARGET_HAS_sub2_i32 1
39
+#define TCG_TARGET_HAS_mulu2_i32 0
40
+#define TCG_TARGET_HAS_muls2_i32 0
41
+#define TCG_TARGET_HAS_muluh_i32 0
42
+#define TCG_TARGET_HAS_mulsh_i32 0
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 (cpuinfo & CPUINFO_ZBB)
48
+#define TCG_TARGET_HAS_bswap32_i32 (cpuinfo & CPUINFO_ZBB)
49
+#define TCG_TARGET_HAS_not_i32 1
50
+#define TCG_TARGET_HAS_andc_i32 (cpuinfo & CPUINFO_ZBB)
51
+#define TCG_TARGET_HAS_orc_i32 (cpuinfo & CPUINFO_ZBB)
52
+#define TCG_TARGET_HAS_eqv_i32 (cpuinfo & CPUINFO_ZBB)
53
+#define TCG_TARGET_HAS_nand_i32 0
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
248
--
249
2.43.0
250
251
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-11-philmd@linaro.org>
4
---
5
tcg/s390x/tcg-target-has.h | 124 +++++++++++++++++++++++++++++++++++++
6
tcg/s390x/tcg-target.h | 114 +---------------------------------
7
2 files changed, 125 insertions(+), 113 deletions(-)
8
create mode 100644 tcg/s390x/tcg-target-has.h
1
9
10
diff --git a/tcg/s390x/tcg-target-has.h b/tcg/s390x/tcg-target-has.h
11
new file mode 100644
12
index XXXXXXX..XXXXXXX
13
--- /dev/null
14
+++ b/tcg/s390x/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: MIT */
17
+/*
18
+ * Define target-specific opcode support
19
+ * Copyright (c) 2009 Ulrich Hecht <uli@suse.de>
20
+ */
21
+
22
+#ifndef TCG_TARGET_HAS_H
23
+#define TCG_TARGET_HAS_H
24
+
25
+/* Facilities required for proper operation; checked at startup. */
26
+
27
+#define FACILITY_ZARCH_ACTIVE 2
28
+#define FACILITY_LONG_DISP 18
29
+#define FACILITY_EXT_IMM 21
30
+#define FACILITY_GEN_INST_EXT 34
31
+#define FACILITY_45 45
32
+
33
+/* Facilities that are checked at runtime. */
34
+
35
+#define FACILITY_LOAD_ON_COND2 53
36
+#define FACILITY_MISC_INSN_EXT2 58
37
+#define FACILITY_MISC_INSN_EXT3 61
38
+#define FACILITY_VECTOR 129
39
+#define FACILITY_VECTOR_ENH1 135
40
+
41
+extern uint64_t s390_facilities[3];
42
+
43
+#define HAVE_FACILITY(X) \
44
+ ((s390_facilities[FACILITY_##X / 64] >> (63 - FACILITY_##X % 64)) & 1)
45
+
46
+/* optional instructions */
47
+#define TCG_TARGET_HAS_div2_i32 1
48
+#define TCG_TARGET_HAS_rot_i32 1
49
+#define TCG_TARGET_HAS_ext8s_i32 1
50
+#define TCG_TARGET_HAS_ext16s_i32 1
51
+#define TCG_TARGET_HAS_ext8u_i32 1
52
+#define TCG_TARGET_HAS_ext16u_i32 1
53
+#define TCG_TARGET_HAS_bswap16_i32 1
54
+#define TCG_TARGET_HAS_bswap32_i32 1
55
+#define TCG_TARGET_HAS_not_i32 HAVE_FACILITY(MISC_INSN_EXT3)
56
+#define TCG_TARGET_HAS_andc_i32 HAVE_FACILITY(MISC_INSN_EXT3)
57
+#define TCG_TARGET_HAS_orc_i32 HAVE_FACILITY(MISC_INSN_EXT3)
58
+#define TCG_TARGET_HAS_eqv_i32 HAVE_FACILITY(MISC_INSN_EXT3)
59
+#define TCG_TARGET_HAS_nand_i32 HAVE_FACILITY(MISC_INSN_EXT3)
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
141
index XXXXXXX..XXXXXXX 100644
142
--- a/tcg/s390x/tcg-target.h
143
+++ b/tcg/s390x/tcg-target.h
144
@@ -XXX,XX +XXX,XX @@ typedef enum TCGReg {
145
146
#define TCG_TARGET_NB_REGS 64
147
148
-/* Facilities required for proper operation; checked at startup. */
149
-
150
-#define FACILITY_ZARCH_ACTIVE 2
151
-#define FACILITY_LONG_DISP 18
152
-#define FACILITY_EXT_IMM 21
153
-#define FACILITY_GEN_INST_EXT 34
154
-#define FACILITY_45 45
155
-
156
-/* Facilities that are checked at runtime. */
157
-
158
-#define FACILITY_LOAD_ON_COND2 53
159
-#define FACILITY_MISC_INSN_EXT2 58
160
-#define FACILITY_MISC_INSN_EXT3 61
161
-#define FACILITY_VECTOR 129
162
-#define FACILITY_VECTOR_ENH1 135
163
-
164
-extern uint64_t s390_facilities[3];
165
-
166
-#define HAVE_FACILITY(X) \
167
- ((s390_facilities[FACILITY_##X / 64] >> (63 - FACILITY_##X % 64)) & 1)
168
-
169
-/* optional instructions */
170
-#define TCG_TARGET_HAS_div2_i32 1
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_ext8u_i32 1
175
-#define TCG_TARGET_HAS_ext16u_i32 1
176
-#define TCG_TARGET_HAS_bswap16_i32 1
177
-#define TCG_TARGET_HAS_bswap32_i32 1
178
-#define TCG_TARGET_HAS_not_i32 HAVE_FACILITY(MISC_INSN_EXT3)
179
-#define TCG_TARGET_HAS_andc_i32 HAVE_FACILITY(MISC_INSN_EXT3)
180
-#define TCG_TARGET_HAS_orc_i32 HAVE_FACILITY(MISC_INSN_EXT3)
181
-#define TCG_TARGET_HAS_eqv_i32 HAVE_FACILITY(MISC_INSN_EXT3)
182
-#define TCG_TARGET_HAS_nand_i32 HAVE_FACILITY(MISC_INSN_EXT3)
183
-#define TCG_TARGET_HAS_nor_i32 HAVE_FACILITY(MISC_INSN_EXT3)
184
-#define TCG_TARGET_HAS_clz_i32 0
185
-#define TCG_TARGET_HAS_ctz_i32 0
186
-#define TCG_TARGET_HAS_ctpop_i32 1
187
-#define TCG_TARGET_HAS_deposit_i32 1
188
-#define TCG_TARGET_HAS_extract_i32 1
189
-#define TCG_TARGET_HAS_sextract_i32 0
190
-#define TCG_TARGET_HAS_extract2_i32 0
191
-#define TCG_TARGET_HAS_negsetcond_i32 1
192
-#define TCG_TARGET_HAS_add2_i32 1
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
265
--
266
2.43.0
267
268
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-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
1
9
10
diff --git a/tcg/sparc64/tcg-target-has.h b/tcg/sparc64/tcg-target-has.h
11
new file mode 100644
12
index XXXXXXX..XXXXXXX
13
--- /dev/null
14
+++ b/tcg/sparc64/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
+ */
21
+
22
+#ifndef TCG_TARGET_HAS_H
23
+#define TCG_TARGET_HAS_H
24
+
25
+#if defined(__VIS__) && __VIS__ >= 0x300
26
+#define use_vis3_instructions 1
27
+#else
28
+extern bool use_vis3_instructions;
29
+#endif
30
+
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
193
--
194
2.43.0
195
196
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-13-philmd@linaro.org>
4
---
5
tcg/tci/tcg-target-has.h | 83 ++++++++++++++++++++++++++++++++++++++++
6
tcg/tci/tcg-target.h | 75 +-----------------------------------
7
2 files changed, 84 insertions(+), 74 deletions(-)
8
create mode 100644 tcg/tci/tcg-target-has.h
1
9
10
diff --git a/tcg/tci/tcg-target-has.h b/tcg/tci/tcg-target-has.h
11
new file mode 100644
12
index XXXXXXX..XXXXXXX
13
--- /dev/null
14
+++ b/tcg/tci/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@
16
+/* SPDX-License-Identifier: MIT */
17
+/*
18
+ * Define target-specific opcode support
19
+ * Copyright (c) 2009, 2011 Stefan Weil
20
+ */
21
+
22
+#ifndef TCG_TARGET_HAS_H
23
+#define TCG_TARGET_HAS_H
24
+
25
+#define TCG_TARGET_HAS_bswap16_i32 1
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
52
+
53
+#if TCG_TARGET_REG_BITS == 64
54
+#define TCG_TARGET_HAS_extr_i64_i32 0
55
+#define TCG_TARGET_HAS_bswap16_i64 1
56
+#define TCG_TARGET_HAS_bswap32_i64 1
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 */
93
+
94
+#define TCG_TARGET_HAS_qemu_ldst_i128 0
95
+
96
+#define TCG_TARGET_HAS_tst 1
97
+
98
+#endif
99
diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h
100
index XXXXXXX..XXXXXXX 100644
101
--- a/tcg/tci/tcg-target.h
102
+++ b/tcg/tci/tcg-target.h
103
@@ -XXX,XX +XXX,XX @@
104
#define TCG_TARGET_INSN_UNIT_SIZE 4
105
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
106
107
-/* Optional instructions. */
108
-
109
-#define TCG_TARGET_HAS_bswap16_i32 1
110
-#define TCG_TARGET_HAS_bswap32_i32 1
111
-#define TCG_TARGET_HAS_div_i32 1
112
-#define TCG_TARGET_HAS_rem_i32 1
113
-#define TCG_TARGET_HAS_ext8s_i32 1
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
185
--
186
2.43.0
187
188
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
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-Id: <20221112042555.2622152-3-richard.henderson@linaro.org>
3
Message-ID: <20250108215156.8731-14-philmd@linaro.org>
4
---
4
---
5
target/arm/helper-a64.h | 2 --
5
tcg/aarch64/tcg-target.h | 2 --
6
target/arm/helper-a64.c | 43 ---------------------------
6
tcg/arm/tcg-target.h | 2 --
7
target/arm/translate-a64.c | 61 +++++++++++---------------------------
7
tcg/i386/tcg-target.h | 2 --
8
3 files changed, 18 insertions(+), 88 deletions(-)
8
tcg/loongarch64/tcg-target.h | 2 --
9
tcg/mips/tcg-target.h | 2 --
10
tcg/ppc/tcg-target.h | 2 --
11
tcg/riscv/tcg-target.h | 2 --
12
tcg/s390x/tcg-target.h | 2 --
13
tcg/sparc64/tcg-target.h | 2 --
14
tcg/tcg-has.h | 2 ++
15
tcg/tci/tcg-target.h | 2 --
16
11 files changed, 2 insertions(+), 20 deletions(-)
9
17
10
diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h
18
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
11
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
12
--- a/target/arm/helper-a64.h
20
--- a/tcg/aarch64/tcg-target.h
13
+++ b/target/arm/helper-a64.h
21
+++ b/tcg/aarch64/tcg-target.h
14
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(frecpx_f16, TCG_CALL_NO_RWG, f16, f16, ptr)
22
@@ -XXX,XX +XXX,XX @@ typedef enum {
15
DEF_HELPER_FLAGS_2(fcvtx_f64_to_f32, TCG_CALL_NO_RWG, f32, f64, env)
23
16
DEF_HELPER_FLAGS_3(crc32_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32)
24
#define TCG_TARGET_NB_REGS 64
17
DEF_HELPER_FLAGS_3(crc32c_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32)
25
18
-DEF_HELPER_5(casp_le_parallel, void, env, i32, i64, i64, i64)
26
-#include "tcg-target-has.h"
19
-DEF_HELPER_5(casp_be_parallel, void, env, i32, i64, i64, i64)
27
-
20
DEF_HELPER_FLAGS_3(advsimd_maxh, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
28
#define TCG_TARGET_DEFAULT_MO (0)
21
DEF_HELPER_FLAGS_3(advsimd_minh, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
29
22
DEF_HELPER_FLAGS_3(advsimd_maxnumh, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
30
#endif /* AARCH64_TCG_TARGET_H */
23
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
31
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
24
index XXXXXXX..XXXXXXX 100644
32
index XXXXXXX..XXXXXXX 100644
25
--- a/target/arm/helper-a64.c
33
--- a/tcg/arm/tcg-target.h
26
+++ b/target/arm/helper-a64.c
34
+++ b/tcg/arm/tcg-target.h
27
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(crc32c_64)(uint64_t acc, uint64_t val, uint32_t bytes)
35
@@ -XXX,XX +XXX,XX @@ typedef enum {
28
return crc32c(acc, buf, bytes) ^ 0xffffffff;
36
29
}
37
#define TCG_TARGET_NB_REGS 32
30
38
31
-/* Writes back the old data into Rs. */
39
-#include "tcg-target-has.h"
32
-void HELPER(casp_le_parallel)(CPUARMState *env, uint32_t rs, uint64_t addr,
33
- uint64_t new_lo, uint64_t new_hi)
34
-{
35
- Int128 oldv, cmpv, newv;
36
- uintptr_t ra = GETPC();
37
- int mem_idx;
38
- MemOpIdx oi;
39
-
40
-
40
- assert(HAVE_CMPXCHG128);
41
#define TCG_TARGET_DEFAULT_MO (0)
42
43
#endif
44
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
45
index XXXXXXX..XXXXXXX 100644
46
--- a/tcg/i386/tcg-target.h
47
+++ b/tcg/i386/tcg-target.h
48
@@ -XXX,XX +XXX,XX @@ typedef enum {
49
TCG_REG_CALL_STACK = TCG_REG_ESP
50
} TCGReg;
51
52
-#include "tcg-target-has.h"
41
-
53
-
42
- mem_idx = cpu_mmu_index(env, false);
54
/* This defines the natural memory order supported by this
43
- oi = make_memop_idx(MO_LE | MO_128 | MO_ALIGN, mem_idx);
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"
44
-
66
-
45
- cmpv = int128_make128(env->xregs[rs], env->xregs[rs + 1]);
67
#define TCG_TARGET_DEFAULT_MO (0)
46
- newv = int128_make128(new_lo, new_hi);
68
47
- oldv = cpu_atomic_cmpxchgo_le_mmu(env, addr, cmpv, newv, oi, ra);
69
#endif /* LOONGARCH_TCG_TARGET_H */
70
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
71
index XXXXXXX..XXXXXXX 100644
72
--- a/tcg/mips/tcg-target.h
73
+++ b/tcg/mips/tcg-target.h
74
@@ -XXX,XX +XXX,XX @@ typedef enum {
75
TCG_AREG0 = TCG_REG_S8,
76
} TCGReg;
77
78
-#include "tcg-target-has.h"
48
-
79
-
49
- env->xregs[rs] = int128_getlo(oldv);
80
#define TCG_TARGET_DEFAULT_MO 0
50
- env->xregs[rs + 1] = int128_gethi(oldv);
81
51
-}
82
#endif
83
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
84
index XXXXXXX..XXXXXXX 100644
85
--- a/tcg/ppc/tcg-target.h
86
+++ b/tcg/ppc/tcg-target.h
87
@@ -XXX,XX +XXX,XX @@ typedef enum {
88
TCG_AREG0 = TCG_REG_R27
89
} TCGReg;
90
91
-#include "tcg-target-has.h"
52
-
92
-
53
-void HELPER(casp_be_parallel)(CPUARMState *env, uint32_t rs, uint64_t addr,
93
#define TCG_TARGET_DEFAULT_MO (0)
54
- uint64_t new_hi, uint64_t new_lo)
94
55
-{
95
#endif
56
- Int128 oldv, cmpv, newv;
96
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
57
- uintptr_t ra = GETPC();
97
index XXXXXXX..XXXXXXX 100644
58
- int mem_idx;
98
--- a/tcg/riscv/tcg-target.h
59
- MemOpIdx oi;
99
+++ b/tcg/riscv/tcg-target.h
100
@@ -XXX,XX +XXX,XX @@ typedef enum {
101
TCG_REG_TMP2 = TCG_REG_T4,
102
} TCGReg;
103
104
-#include "tcg-target-has.h"
60
-
105
-
61
- assert(HAVE_CMPXCHG128);
106
#define TCG_TARGET_DEFAULT_MO (0)
107
108
#endif
109
diff --git a/tcg/s390x/tcg-target.h b/tcg/s390x/tcg-target.h
110
index XXXXXXX..XXXXXXX 100644
111
--- a/tcg/s390x/tcg-target.h
112
+++ b/tcg/s390x/tcg-target.h
113
@@ -XXX,XX +XXX,XX @@ typedef enum TCGReg {
114
115
#define TCG_TARGET_NB_REGS 64
116
117
-#include "tcg-target-has.h"
62
-
118
-
63
- mem_idx = cpu_mmu_index(env, false);
119
#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
64
- oi = make_memop_idx(MO_LE | MO_128 | MO_ALIGN, mem_idx);
120
121
#endif
122
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
123
index XXXXXXX..XXXXXXX 100644
124
--- a/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"
65
-
131
-
66
- cmpv = int128_make128(env->xregs[rs + 1], env->xregs[rs]);
132
#define TCG_TARGET_DEFAULT_MO (0)
67
- newv = int128_make128(new_lo, new_hi);
133
68
- oldv = cpu_atomic_cmpxchgo_be_mmu(env, addr, cmpv, newv, oi, ra);
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
139
@@ -XXX,XX +XXX,XX @@
140
#ifndef TCG_HAS_H
141
#define TCG_HAS_H
142
143
+#include "tcg-target-has.h"
144
+
145
#if TCG_TARGET_REG_BITS == 32
146
/* Turn some undef macros into false macros. */
147
#define TCG_TARGET_HAS_extr_i64_i32 0
148
diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h
149
index XXXXXXX..XXXXXXX 100644
150
--- a/tcg/tci/tcg-target.h
151
+++ b/tcg/tci/tcg-target.h
152
@@ -XXX,XX +XXX,XX @@
153
#define TCG_TARGET_INSN_UNIT_SIZE 4
154
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
155
156
-#include "tcg-target-has.h"
69
-
157
-
70
- env->xregs[rs + 1] = int128_getlo(oldv);
158
/* Number of registers available. */
71
- env->xregs[rs] = int128_gethi(oldv);
159
#define TCG_TARGET_NB_REGS 16
72
-}
73
-
74
/*
75
* AdvSIMD half-precision
76
*/
77
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
78
index XXXXXXX..XXXXXXX 100644
79
--- a/target/arm/translate-a64.c
80
+++ b/target/arm/translate-a64.c
81
@@ -XXX,XX +XXX,XX @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt,
82
tcg_gen_extr32_i64(s2, s1, cmp);
83
}
84
tcg_temp_free_i64(cmp);
85
- } else if (tb_cflags(s->base.tb) & CF_PARALLEL) {
86
- if (HAVE_CMPXCHG128) {
87
- TCGv_i32 tcg_rs = tcg_constant_i32(rs);
88
- if (s->be_data == MO_LE) {
89
- gen_helper_casp_le_parallel(cpu_env, tcg_rs,
90
- clean_addr, t1, t2);
91
- } else {
92
- gen_helper_casp_be_parallel(cpu_env, tcg_rs,
93
- clean_addr, t1, t2);
94
- }
95
- } else {
96
- gen_helper_exit_atomic(cpu_env);
97
- s->base.is_jmp = DISAS_NORETURN;
98
- }
99
} else {
100
- TCGv_i64 d1 = tcg_temp_new_i64();
101
- TCGv_i64 d2 = tcg_temp_new_i64();
102
- TCGv_i64 a2 = tcg_temp_new_i64();
103
- TCGv_i64 c1 = tcg_temp_new_i64();
104
- TCGv_i64 c2 = tcg_temp_new_i64();
105
- TCGv_i64 zero = tcg_constant_i64(0);
106
+ TCGv_i128 cmp = tcg_temp_new_i128();
107
+ TCGv_i128 val = tcg_temp_new_i128();
108
109
- /* Load the two words, in memory order. */
110
- tcg_gen_qemu_ld_i64(d1, clean_addr, memidx,
111
- MO_64 | MO_ALIGN_16 | s->be_data);
112
- tcg_gen_addi_i64(a2, clean_addr, 8);
113
- tcg_gen_qemu_ld_i64(d2, a2, memidx, MO_64 | s->be_data);
114
+ if (s->be_data == MO_LE) {
115
+ tcg_gen_concat_i64_i128(val, t1, t2);
116
+ tcg_gen_concat_i64_i128(cmp, s1, s2);
117
+ } else {
118
+ tcg_gen_concat_i64_i128(val, t2, t1);
119
+ tcg_gen_concat_i64_i128(cmp, s2, s1);
120
+ }
121
122
- /* Compare the two words, also in memory order. */
123
- tcg_gen_setcond_i64(TCG_COND_EQ, c1, d1, s1);
124
- tcg_gen_setcond_i64(TCG_COND_EQ, c2, d2, s2);
125
- tcg_gen_and_i64(c2, c2, c1);
126
+ tcg_gen_atomic_cmpxchg_i128(cmp, clean_addr, cmp, val, memidx,
127
+ MO_128 | MO_ALIGN | s->be_data);
128
+ tcg_temp_free_i128(val);
129
130
- /* If compare equal, write back new data, else write back old data. */
131
- tcg_gen_movcond_i64(TCG_COND_NE, c1, c2, zero, t1, d1);
132
- tcg_gen_movcond_i64(TCG_COND_NE, c2, c2, zero, t2, d2);
133
- tcg_gen_qemu_st_i64(c1, clean_addr, memidx, MO_64 | s->be_data);
134
- tcg_gen_qemu_st_i64(c2, a2, memidx, MO_64 | s->be_data);
135
- tcg_temp_free_i64(a2);
136
- tcg_temp_free_i64(c1);
137
- tcg_temp_free_i64(c2);
138
-
139
- /* Write back the data from memory to Rs. */
140
- tcg_gen_mov_i64(s1, d1);
141
- tcg_gen_mov_i64(s2, d2);
142
- tcg_temp_free_i64(d1);
143
- tcg_temp_free_i64(d2);
144
+ if (s->be_data == MO_LE) {
145
+ tcg_gen_extr_i128_i64(s1, s2, cmp);
146
+ } else {
147
+ tcg_gen_extr_i128_i64(s2, s1, cmp);
148
+ }
149
+ tcg_temp_free_i128(cmp);
150
}
151
}
152
160
153
--
161
--
154
2.34.1
162
2.43.0
163
164
diff view generated by jsdifflib
1
Note that the previous direct reference to reserve_val,
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
- tcg_gen_ld_i64(t1, cpu_env, (ctx->le_mode
4
- ? offsetof(CPUPPCState, reserve_val2)
5
- : offsetof(CPUPPCState, reserve_val)));
6
7
was incorrect because all references should have gone through
8
cpu_reserve_val. Create a cpu_reserve_val2 tcg temp to fix this.
9
3
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
12
Message-Id: <20221112061122.2720163-2-richard.henderson@linaro.org>
6
Message-ID: <20250108215156.8731-15-philmd@linaro.org>
13
---
7
---
14
target/ppc/helper.h | 2 -
8
include/tcg/tcg.h | 2 --
15
target/ppc/mem_helper.c | 44 -----------------
9
tcg/optimize.c | 1 +
16
target/ppc/translate.c | 102 ++++++++++++++++++----------------------
10
tcg/tcg-common.c | 1 +
17
3 files changed, 47 insertions(+), 101 deletions(-)
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(-)
18
18
19
diff --git a/target/ppc/helper.h b/target/ppc/helper.h
19
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
20
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
21
--- a/target/ppc/helper.h
21
--- a/include/tcg/tcg.h
22
+++ b/target/ppc/helper.h
22
+++ b/include/tcg/tcg.h
23
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(stq_le_parallel, TCG_CALL_NO_WG,
23
@@ -XXX,XX +XXX,XX @@ typedef uint64_t TCGRegSet;
24
void, env, tl, i64, i64, i32)
24
#error unsupported
25
DEF_HELPER_FLAGS_5(stq_be_parallel, TCG_CALL_NO_WG,
26
void, env, tl, i64, i64, i32)
27
-DEF_HELPER_5(stqcx_le_parallel, i32, env, tl, i64, i64, i32)
28
-DEF_HELPER_5(stqcx_be_parallel, i32, env, tl, i64, i64, i32)
29
#endif
25
#endif
30
diff --git a/target/ppc/mem_helper.c b/target/ppc/mem_helper.c
26
27
-#include "tcg/tcg-has.h"
28
-
29
typedef enum TCGOpcode {
30
#define DEF(name, oargs, iargs, cargs, flags) INDEX_op_ ## name,
31
#include "tcg/tcg-opc.h"
32
diff --git a/tcg/optimize.c b/tcg/optimize.c
31
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
32
--- a/target/ppc/mem_helper.c
34
--- a/tcg/optimize.c
33
+++ b/target/ppc/mem_helper.c
35
+++ b/tcg/optimize.c
34
@@ -XXX,XX +XXX,XX @@ void helper_stq_be_parallel(CPUPPCState *env, target_ulong addr,
36
@@ -XXX,XX +XXX,XX @@
35
val = int128_make128(lo, hi);
37
#include "qemu/interval-tree.h"
36
cpu_atomic_sto_be_mmu(env, addr, val, opidx, GETPC());
38
#include "tcg/tcg-op-common.h"
37
}
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"
38
-
76
-
39
-uint32_t helper_stqcx_le_parallel(CPUPPCState *env, target_ulong addr,
77
+#include "tcg-has.h"
40
- uint64_t new_lo, uint64_t new_hi,
78
41
- uint32_t opidx)
79
static void check_max_alignment(unsigned a_bits)
42
-{
80
{
43
- bool success = false;
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"
44
-
101
-
45
- /* We will have raised EXCP_ATOMIC from the translator. */
102
+#include "tcg-has.h"
46
- assert(HAVE_CMPXCHG128);
103
47
-
104
/*
48
- if (likely(addr == env->reserve_addr)) {
105
* Encourage the compiler to tail-call to a function, rather than inlining.
49
- Int128 oldv, cmpv, newv;
106
diff --git a/tcg/tcg.c b/tcg/tcg.c
50
-
107
index XXXXXXX..XXXXXXX 100644
51
- cmpv = int128_make128(env->reserve_val2, env->reserve_val);
108
--- a/tcg/tcg.c
52
- newv = int128_make128(new_lo, new_hi);
109
+++ b/tcg/tcg.c
53
- oldv = cpu_atomic_cmpxchgo_le_mmu(env, addr, cmpv, newv,
110
@@ -XXX,XX +XXX,XX @@
54
- opidx, GETPC());
111
#include "tcg/tcg-temp-internal.h"
55
- success = int128_eq(oldv, cmpv);
112
#include "tcg-internal.h"
56
- }
113
#include "tcg/perf.h"
57
- env->reserve_addr = -1;
114
+#include "tcg-has.h"
58
- return env->so + success * CRF_EQ_BIT;
115
#ifdef CONFIG_USER_ONLY
59
-}
116
#include "user/guest-base.h"
60
-
61
-uint32_t helper_stqcx_be_parallel(CPUPPCState *env, target_ulong addr,
62
- uint64_t new_lo, uint64_t new_hi,
63
- uint32_t opidx)
64
-{
65
- bool success = false;
66
-
67
- /* We will have raised EXCP_ATOMIC from the translator. */
68
- assert(HAVE_CMPXCHG128);
69
-
70
- if (likely(addr == env->reserve_addr)) {
71
- Int128 oldv, cmpv, newv;
72
-
73
- cmpv = int128_make128(env->reserve_val2, env->reserve_val);
74
- newv = int128_make128(new_lo, new_hi);
75
- oldv = cpu_atomic_cmpxchgo_be_mmu(env, addr, cmpv, newv,
76
- opidx, GETPC());
77
- success = int128_eq(oldv, cmpv);
78
- }
79
- env->reserve_addr = -1;
80
- return env->so + success * CRF_EQ_BIT;
81
-}
82
#endif
117
#endif
83
118
diff --git a/tcg/tci.c b/tcg/tci.c
84
/*****************************************************************************/
85
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
86
index XXXXXXX..XXXXXXX 100644
119
index XXXXXXX..XXXXXXX 100644
87
--- a/target/ppc/translate.c
120
--- a/tcg/tci.c
88
+++ b/target/ppc/translate.c
121
+++ b/tcg/tci.c
89
@@ -XXX,XX +XXX,XX @@ static TCGv cpu_cfar;
122
@@ -XXX,XX +XXX,XX @@
90
static TCGv cpu_xer, cpu_so, cpu_ov, cpu_ca, cpu_ov32, cpu_ca32;
123
#include "tcg/helper-info.h"
91
static TCGv cpu_reserve;
124
#include "tcg/tcg-ldst.h"
92
static TCGv cpu_reserve_val;
125
#include "disas/dis-asm.h"
93
+static TCGv cpu_reserve_val2;
126
+#include "tcg-has.h"
94
static TCGv cpu_fpscr;
127
#include <ffi.h>
95
static TCGv_i32 cpu_access_type;
128
96
97
@@ -XXX,XX +XXX,XX @@ void ppc_translate_init(void)
98
offsetof(CPUPPCState, reserve_addr),
99
"reserve_addr");
100
cpu_reserve_val = tcg_global_mem_new(cpu_env,
101
- offsetof(CPUPPCState, reserve_val),
102
- "reserve_val");
103
+ offsetof(CPUPPCState, reserve_val),
104
+ "reserve_val");
105
+ cpu_reserve_val2 = tcg_global_mem_new(cpu_env,
106
+ offsetof(CPUPPCState, reserve_val2),
107
+ "reserve_val2");
108
109
cpu_fpscr = tcg_global_mem_new(cpu_env,
110
offsetof(CPUPPCState, fpscr), "fpscr");
111
@@ -XXX,XX +XXX,XX @@ static void gen_lqarx(DisasContext *ctx)
112
/* stqcx. */
113
static void gen_stqcx_(DisasContext *ctx)
114
{
115
+ TCGLabel *lab_fail, *lab_over;
116
int rs = rS(ctx->opcode);
117
- TCGv EA, hi, lo;
118
+ TCGv EA, t0, t1;
119
+ TCGv_i128 cmp, val;
120
121
if (unlikely(rs & 1)) {
122
gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL);
123
return;
124
}
125
126
+ lab_fail = gen_new_label();
127
+ lab_over = gen_new_label();
128
+
129
gen_set_access_type(ctx, ACCESS_RES);
130
EA = tcg_temp_new();
131
gen_addr_reg_index(ctx, EA);
132
133
+ tcg_gen_brcond_tl(TCG_COND_NE, EA, cpu_reserve, lab_fail);
134
+ tcg_temp_free(EA);
135
+
136
+ cmp = tcg_temp_new_i128();
137
+ val = tcg_temp_new_i128();
138
+
139
+ tcg_gen_concat_i64_i128(cmp, cpu_reserve_val2, cpu_reserve_val);
140
+
141
/* Note that the low part is always in RS+1, even in LE mode. */
142
- lo = cpu_gpr[rs + 1];
143
- hi = cpu_gpr[rs];
144
+ tcg_gen_concat_i64_i128(val, cpu_gpr[rs + 1], cpu_gpr[rs]);
145
146
- if (tb_cflags(ctx->base.tb) & CF_PARALLEL) {
147
- if (HAVE_CMPXCHG128) {
148
- TCGv_i32 oi = tcg_const_i32(DEF_MEMOP(MO_128) | MO_ALIGN);
149
- if (ctx->le_mode) {
150
- gen_helper_stqcx_le_parallel(cpu_crf[0], cpu_env,
151
- EA, lo, hi, oi);
152
- } else {
153
- gen_helper_stqcx_be_parallel(cpu_crf[0], cpu_env,
154
- EA, lo, hi, oi);
155
- }
156
- tcg_temp_free_i32(oi);
157
- } else {
158
- /* Restart with exclusive lock. */
159
- gen_helper_exit_atomic(cpu_env);
160
- ctx->base.is_jmp = DISAS_NORETURN;
161
- }
162
- tcg_temp_free(EA);
163
- } else {
164
- TCGLabel *lab_fail = gen_new_label();
165
- TCGLabel *lab_over = gen_new_label();
166
- TCGv_i64 t0 = tcg_temp_new_i64();
167
- TCGv_i64 t1 = tcg_temp_new_i64();
168
+ tcg_gen_atomic_cmpxchg_i128(val, cpu_reserve, cmp, val, ctx->mem_idx,
169
+ DEF_MEMOP(MO_128 | MO_ALIGN));
170
+ tcg_temp_free_i128(cmp);
171
172
- tcg_gen_brcond_tl(TCG_COND_NE, EA, cpu_reserve, lab_fail);
173
- tcg_temp_free(EA);
174
+ t0 = tcg_temp_new();
175
+ t1 = tcg_temp_new();
176
+ tcg_gen_extr_i128_i64(t1, t0, val);
177
+ tcg_temp_free_i128(val);
178
179
- gen_qemu_ld64_i64(ctx, t0, cpu_reserve);
180
- tcg_gen_ld_i64(t1, cpu_env, (ctx->le_mode
181
- ? offsetof(CPUPPCState, reserve_val2)
182
- : offsetof(CPUPPCState, reserve_val)));
183
- tcg_gen_brcond_i64(TCG_COND_NE, t0, t1, lab_fail);
184
+ tcg_gen_xor_tl(t1, t1, cpu_reserve_val2);
185
+ tcg_gen_xor_tl(t0, t0, cpu_reserve_val);
186
+ tcg_gen_or_tl(t0, t0, t1);
187
+ tcg_temp_free(t1);
188
189
- tcg_gen_addi_i64(t0, cpu_reserve, 8);
190
- gen_qemu_ld64_i64(ctx, t0, t0);
191
- tcg_gen_ld_i64(t1, cpu_env, (ctx->le_mode
192
- ? offsetof(CPUPPCState, reserve_val)
193
- : offsetof(CPUPPCState, reserve_val2)));
194
- tcg_gen_brcond_i64(TCG_COND_NE, t0, t1, lab_fail);
195
+ tcg_gen_setcondi_tl(TCG_COND_EQ, t0, t0, 0);
196
+ tcg_gen_shli_tl(t0, t0, CRF_EQ_BIT);
197
+ tcg_gen_or_tl(t0, t0, cpu_so);
198
+ tcg_gen_trunc_tl_i32(cpu_crf[0], t0);
199
+ tcg_temp_free(t0);
200
201
- /* Success */
202
- gen_qemu_st64_i64(ctx, ctx->le_mode ? lo : hi, cpu_reserve);
203
- tcg_gen_addi_i64(t0, cpu_reserve, 8);
204
- gen_qemu_st64_i64(ctx, ctx->le_mode ? hi : lo, t0);
205
+ tcg_gen_br(lab_over);
206
+ gen_set_label(lab_fail);
207
208
- tcg_gen_trunc_tl_i32(cpu_crf[0], cpu_so);
209
- tcg_gen_ori_i32(cpu_crf[0], cpu_crf[0], CRF_EQ);
210
- tcg_gen_br(lab_over);
211
+ /*
212
+ * Address mismatch implies failure. But we still need to provide
213
+ * the memory barrier semantics of the instruction.
214
+ */
215
+ tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL);
216
+ tcg_gen_trunc_tl_i32(cpu_crf[0], cpu_so);
217
218
- gen_set_label(lab_fail);
219
- tcg_gen_trunc_tl_i32(cpu_crf[0], cpu_so);
220
-
221
- gen_set_label(lab_over);
222
- tcg_gen_movi_tl(cpu_reserve, -1);
223
- tcg_temp_free_i64(t0);
224
- tcg_temp_free_i64(t1);
225
- }
226
+ gen_set_label(lab_over);
227
+ tcg_gen_movi_tl(cpu_reserve, -1);
228
}
229
#endif /* defined(TARGET_PPC64) */
230
129
231
--
130
--
232
2.34.1
131
2.43.0
132
133
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
3
---
4
target/i386/tcg/translate.c | 48 ++++++++++++++++++++++++-------------
4
accel/tcg/internal-target.h | 1 +
5
1 file changed, 31 insertions(+), 17 deletions(-)
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
6
37
7
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
38
diff --git a/accel/tcg/internal-target.h b/accel/tcg/internal-target.h
8
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
9
--- a/target/i386/tcg/translate.c
40
--- a/accel/tcg/internal-target.h
10
+++ b/target/i386/tcg/translate.c
41
+++ b/accel/tcg/internal-target.h
11
@@ -XXX,XX +XXX,XX @@ static void gen_sty_env_A0(DisasContext *s, int offset, bool align)
42
@@ -XXX,XX +XXX,XX @@
12
#include "emit.c.inc"
43
#include "exec/exec-all.h"
13
#include "decode-new.c.inc"
44
#include "exec/translation-block.h"
14
45
#include "tb-internal.h"
15
+static void gen_cmpxchg8b(DisasContext *s, CPUX86State *env, int modrm)
46
+#include "tcg-target-mo.h"
16
+{
47
17
+ gen_lea_modrm(env, s, modrm);
48
/*
18
+
49
* Access to the various translations structures need to be serialised
19
+ if ((s->prefix & PREFIX_LOCK) &&
50
diff --git a/tcg/aarch64/tcg-target-mo.h b/tcg/aarch64/tcg-target-mo.h
20
+ (tb_cflags(s->base.tb) & CF_PARALLEL)) {
51
new file mode 100644
21
+ gen_helper_cmpxchg8b(cpu_env, s->A0);
52
index XXXXXXX..XXXXXXX
22
+ } else {
53
--- /dev/null
23
+ gen_helper_cmpxchg8b_unlocked(cpu_env, s->A0);
54
+++ b/tcg/aarch64/tcg-target-mo.h
24
+ }
55
@@ -XXX,XX +XXX,XX @@
25
+ set_cc_op(s, CC_OP_EFLAGS);
56
+/* SPDX-License-Identifier: GPL-2.0-or-later */
26
+}
57
+/*
27
+
58
+ * Define target-specific memory model
28
+#ifdef TARGET_X86_64
59
+ * Copyright (c) 2013 Huawei Technologies Duesseldorf GmbH
29
+static void gen_cmpxchg16b(DisasContext *s, CPUX86State *env, int modrm)
60
+ */
30
+{
61
+
31
+ gen_lea_modrm(env, s, modrm);
62
+#ifndef TCG_TARGET_MO_H
32
+
63
+#define TCG_TARGET_MO_H
33
+ if ((s->prefix & PREFIX_LOCK) &&
64
+
34
+ (tb_cflags(s->base.tb) & CF_PARALLEL)) {
65
+#define TCG_TARGET_DEFAULT_MO 0
35
+ gen_helper_cmpxchg16b(cpu_env, s->A0);
66
+
36
+ } else {
67
+#endif
37
+ gen_helper_cmpxchg16b_unlocked(cpu_env, s->A0);
68
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
38
+ }
69
index XXXXXXX..XXXXXXX 100644
39
+ set_cc_op(s, CC_OP_EFLAGS);
70
--- a/tcg/aarch64/tcg-target.h
40
+}
71
+++ b/tcg/aarch64/tcg-target.h
41
+#endif
72
@@ -XXX,XX +XXX,XX @@ typedef enum {
42
+
73
43
/* convert one instruction. s->base.is_jmp is set if the translation must
74
#define TCG_TARGET_NB_REGS 64
44
be stopped. Return the next pc value */
75
45
static bool disas_insn(DisasContext *s, CPUState *cpu)
76
-#define TCG_TARGET_DEFAULT_MO (0)
46
@@ -XXX,XX +XXX,XX @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
77
-
47
if (!(s->cpuid_ext_features & CPUID_EXT_CX16)) {
78
#endif /* AARCH64_TCG_TARGET_H */
48
goto illegal_op;
79
diff --git a/tcg/arm/tcg-target-mo.h b/tcg/arm/tcg-target-mo.h
49
}
80
new file mode 100644
50
- gen_lea_modrm(env, s, modrm);
81
index XXXXXXX..XXXXXXX
51
- if ((s->prefix & PREFIX_LOCK) &&
82
--- /dev/null
52
- (tb_cflags(s->base.tb) & CF_PARALLEL)) {
83
+++ b/tcg/arm/tcg-target-mo.h
53
- gen_helper_cmpxchg16b(cpu_env, s->A0);
84
@@ -XXX,XX +XXX,XX @@
54
- } else {
85
+/* SPDX-License-Identifier: MIT */
55
- gen_helper_cmpxchg16b_unlocked(cpu_env, s->A0);
86
+/*
56
- }
87
+ * Define target-specific memory model
57
- set_cc_op(s, CC_OP_EFLAGS);
88
+ * Copyright (c) 2008 Fabrice Bellard
58
+ gen_cmpxchg16b(s, env, modrm);
89
+ * Copyright (c) 2008 Andrzej Zaborowski
59
break;
90
+ */
60
}
91
+
61
-#endif
92
+#ifndef TCG_TARGET_MO_H
62
+#endif
93
+#define TCG_TARGET_MO_H
63
if (!(s->cpuid_features & CPUID_CX8)) {
94
+
64
goto illegal_op;
95
+#define TCG_TARGET_DEFAULT_MO 0
65
}
96
+
66
- gen_lea_modrm(env, s, modrm);
97
+#endif
67
- if ((s->prefix & PREFIX_LOCK) &&
98
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
68
- (tb_cflags(s->base.tb) & CF_PARALLEL)) {
99
index XXXXXXX..XXXXXXX 100644
69
- gen_helper_cmpxchg8b(cpu_env, s->A0);
100
--- a/tcg/arm/tcg-target.h
70
- } else {
101
+++ b/tcg/arm/tcg-target.h
71
- gen_helper_cmpxchg8b_unlocked(cpu_env, s->A0);
102
@@ -XXX,XX +XXX,XX @@ typedef enum {
72
- }
103
73
- set_cc_op(s, CC_OP_EFLAGS);
104
#define TCG_TARGET_NB_REGS 32
74
+ gen_cmpxchg8b(s, env, modrm);
105
75
break;
106
-#define TCG_TARGET_DEFAULT_MO (0)
76
107
-
77
case 7: /* RDSEED */
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
{
78
--
378
--
79
2.34.1
379
2.43.0
80
380
81
381
diff view generated by jsdifflib
1
Implement the function for arm, i386, and s390x, which will use it.
1
Return C_NotImplemented instead of asserting for opcodes
2
Add stubs for all other backends.
2
not implemented by the backend. For now, the assertion
3
moves to process_op_defs.
3
4
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
7
---
8
tcg/tcg.c | 2 ++
8
tcg/tcg.c | 10 ++++++----
9
tcg/aarch64/tcg-target.c.inc | 7 +++++++
9
tcg/aarch64/tcg-target.c.inc | 2 +-
10
tcg/arm/tcg-target.c.inc | 20 ++++++++++++++++++++
10
tcg/arm/tcg-target.c.inc | 2 +-
11
tcg/i386/tcg-target.c.inc | 8 ++++++++
11
tcg/i386/tcg-target.c.inc | 2 +-
12
tcg/loongarch64/tcg-target.c.inc | 7 +++++++
12
tcg/loongarch64/tcg-target.c.inc | 2 +-
13
tcg/mips/tcg-target.c.inc | 7 +++++++
13
tcg/mips/tcg-target.c.inc | 2 +-
14
tcg/ppc/tcg-target.c.inc | 7 +++++++
14
tcg/ppc/tcg-target.c.inc | 2 +-
15
tcg/riscv/tcg-target.c.inc | 7 +++++++
15
tcg/riscv/tcg-target.c.inc | 2 +-
16
tcg/s390x/tcg-target.c.inc | 7 +++++++
16
tcg/s390x/tcg-target.c.inc | 2 +-
17
tcg/sparc64/tcg-target.c.inc | 7 +++++++
17
tcg/sparc64/tcg-target.c.inc | 2 +-
18
tcg/tci/tcg-target.c.inc | 7 +++++++
18
tcg/tci/tcg-target.c.inc | 2 +-
19
11 files changed, 86 insertions(+)
19
11 files changed, 16 insertions(+), 14 deletions(-)
20
20
21
diff --git a/tcg/tcg.c b/tcg/tcg.c
21
diff --git a/tcg/tcg.c b/tcg/tcg.c
22
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
23
--- a/tcg/tcg.c
23
--- a/tcg/tcg.c
24
+++ b/tcg/tcg.c
24
+++ b/tcg/tcg.c
25
@@ -XXX,XX +XXX,XX @@ static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg1,
25
@@ -XXX,XX +XXX,XX @@ static int tcg_out_pool_finalize(TCGContext *s)
26
static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg);
26
#define C_N1_O1_I4(O1, O2, I1, I2, I3, I4) C_PFX6(c_n1_o1_i4_, O1, O2, I1, I2, I3, I4),
27
static void tcg_out_movi(TCGContext *s, TCGType type,
27
28
TCGReg ret, tcg_target_long arg);
28
typedef enum {
29
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg, TCGReg, tcg_target_long)
29
+ C_NotImplemented = -1,
30
+ __attribute__((unused));
30
#include "tcg-target-con-set.h"
31
static void tcg_out_exit_tb(TCGContext *s, uintptr_t arg);
31
} TCGConstraintSetIndex;
32
static void tcg_out_goto_tb(TCGContext *s, int which);
32
33
static void tcg_out_op(TCGContext *s, TCGOpcode opc,
33
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
34
const TCGTargetOpDef *tdefs;
35
bool saw_alias_pair = false;
36
int i, o, i2, o2, nb_args;
37
+ TCGConstraintSetIndex con_set;
38
39
if (def->flags & TCG_OPF_NOT_PRESENT) {
40
continue;
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++) {
34
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
57
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
35
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
36
--- a/tcg/aarch64/tcg-target.c.inc
59
--- a/tcg/aarch64/tcg-target.c.inc
37
+++ b/tcg/aarch64/tcg-target.c.inc
60
+++ b/tcg/aarch64/tcg-target.c.inc
38
@@ -XXX,XX +XXX,XX @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
61
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
39
tcg_out_insn(s, 3305, LDR, 0, rd);
62
return C_O1_I2(w, 0, w);
63
64
default:
65
- g_assert_not_reached();
66
+ return C_NotImplemented;
67
}
40
}
68
}
41
42
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
43
+ tcg_target_long imm)
44
+{
45
+ /* This function is only used for passing structs by reference. */
46
+ g_assert_not_reached();
47
+}
48
+
49
/* Define something more legible for general use. */
50
#define tcg_out_ldst_r tcg_out_insn_3310
51
69
52
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
70
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
53
index XXXXXXX..XXXXXXX 100644
71
index XXXXXXX..XXXXXXX 100644
54
--- a/tcg/arm/tcg-target.c.inc
72
--- a/tcg/arm/tcg-target.c.inc
55
+++ b/tcg/arm/tcg-target.c.inc
73
+++ b/tcg/arm/tcg-target.c.inc
56
@@ -XXX,XX +XXX,XX @@ static void tcg_out_movi(TCGContext *s, TCGType type,
74
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
57
tcg_out_movi32(s, COND_AL, ret, arg);
75
case INDEX_op_bitsel_vec:
76
return C_O1_I3(w, w, w, w);
77
default:
78
- g_assert_not_reached();
79
+ return C_NotImplemented;
80
}
58
}
81
}
59
82
60
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
61
+ tcg_target_long imm)
62
+{
63
+ int enc, opc = ARITH_ADD;
64
+
65
+ /* All of the easiest immediates to encode are positive. */
66
+ if (imm < 0) {
67
+ imm = -imm;
68
+ opc = ARITH_SUB;
69
+ }
70
+ enc = encode_imm(imm);
71
+ if (enc >= 0) {
72
+ tcg_out_dat_imm(s, COND_AL, opc, rd, rs, enc);
73
+ } else {
74
+ tcg_out_movi32(s, COND_AL, TCG_REG_TMP, imm);
75
+ tcg_out_dat_reg(s, COND_AL, opc, rd, rs,
76
+ TCG_REG_TMP, SHIFT_IMM_LSL(0));
77
+ }
78
+}
79
+
80
/* Type is always V128, with I64 elements. */
81
static void tcg_out_dup2_vec(TCGContext *s, TCGReg rd, TCGReg rl, TCGReg rh)
82
{
83
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
83
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
84
index XXXXXXX..XXXXXXX 100644
84
index XXXXXXX..XXXXXXX 100644
85
--- a/tcg/i386/tcg-target.c.inc
85
--- a/tcg/i386/tcg-target.c.inc
86
+++ b/tcg/i386/tcg-target.c.inc
86
+++ b/tcg/i386/tcg-target.c.inc
87
@@ -XXX,XX +XXX,XX @@ static void tcg_out_movi(TCGContext *s, TCGType type,
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;
88
}
93
}
89
}
94
}
90
95
91
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
92
+ tcg_target_long imm)
93
+{
94
+ /* This function is only used for passing structs by reference. */
95
+ tcg_debug_assert(TCG_TARGET_REG_BITS == 32);
96
+ tcg_out_modrm_offset(s, OPC_LEA, rd, rs, imm);
97
+}
98
+
99
static inline void tcg_out_pushi(TCGContext *s, tcg_target_long val)
100
{
101
if (val == (int8_t)val) {
102
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
96
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
103
index XXXXXXX..XXXXXXX 100644
97
index XXXXXXX..XXXXXXX 100644
104
--- a/tcg/loongarch64/tcg-target.c.inc
98
--- a/tcg/loongarch64/tcg-target.c.inc
105
+++ b/tcg/loongarch64/tcg-target.c.inc
99
+++ b/tcg/loongarch64/tcg-target.c.inc
106
@@ -XXX,XX +XXX,XX @@ static void tcg_out_addi(TCGContext *s, TCGType type, TCGReg rd,
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;
107
}
106
}
108
}
107
}
109
108
110
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
111
+ tcg_target_long imm)
112
+{
113
+ /* This function is only used for passing structs by reference. */
114
+ g_assert_not_reached();
115
+}
116
+
117
static void tcg_out_ext8u(TCGContext *s, TCGReg ret, TCGReg arg)
118
{
119
tcg_out_opc_andi(s, ret, arg, 0xff);
120
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
109
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
121
index XXXXXXX..XXXXXXX 100644
110
index XXXXXXX..XXXXXXX 100644
122
--- a/tcg/mips/tcg-target.c.inc
111
--- a/tcg/mips/tcg-target.c.inc
123
+++ b/tcg/mips/tcg-target.c.inc
112
+++ b/tcg/mips/tcg-target.c.inc
124
@@ -XXX,XX +XXX,XX @@ static void tcg_out_movi(TCGContext *s, TCGType type,
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;
125
}
119
}
126
}
120
}
127
121
128
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
129
+ tcg_target_long imm)
130
+{
131
+ /* This function is only used for passing structs by reference. */
132
+ g_assert_not_reached();
133
+}
134
+
135
static void tcg_out_bswap16(TCGContext *s, TCGReg ret, TCGReg arg, int flags)
136
{
137
/* ret and arg can't be register tmp0 */
138
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
139
index XXXXXXX..XXXXXXX 100644
123
index XXXXXXX..XXXXXXX 100644
140
--- a/tcg/ppc/tcg-target.c.inc
124
--- a/tcg/ppc/tcg-target.c.inc
141
+++ b/tcg/ppc/tcg-target.c.inc
125
+++ b/tcg/ppc/tcg-target.c.inc
142
@@ -XXX,XX +XXX,XX @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg ret,
126
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
127
return C_O1_I4(v, v, v, vZM, v);
128
129
default:
130
- g_assert_not_reached();
131
+ return C_NotImplemented;
143
}
132
}
144
}
133
}
145
134
146
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
147
+ tcg_target_long imm)
148
+{
149
+ /* This function is only used for passing structs by reference. */
150
+ g_assert_not_reached();
151
+}
152
+
153
static bool mask_operand(uint32_t c, int *mb, int *me)
154
{
155
uint32_t lsb, test;
156
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
135
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
157
index XXXXXXX..XXXXXXX 100644
136
index XXXXXXX..XXXXXXX 100644
158
--- a/tcg/riscv/tcg-target.c.inc
137
--- a/tcg/riscv/tcg-target.c.inc
159
+++ b/tcg/riscv/tcg-target.c.inc
138
+++ b/tcg/riscv/tcg-target.c.inc
160
@@ -XXX,XX +XXX,XX @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
139
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
161
tcg_out_opc_imm(s, OPC_LD, rd, rd, 0);
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
}
162
}
146
}
163
147
164
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
165
+ tcg_target_long imm)
166
+{
167
+ /* This function is only used for passing structs by reference. */
168
+ g_assert_not_reached();
169
+}
170
+
171
static void tcg_out_ext8u(TCGContext *s, TCGReg ret, TCGReg arg)
172
{
173
tcg_out_opc_imm(s, OPC_ANDI, ret, arg, 0xff);
174
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
148
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
175
index XXXXXXX..XXXXXXX 100644
149
index XXXXXXX..XXXXXXX 100644
176
--- a/tcg/s390x/tcg-target.c.inc
150
--- a/tcg/s390x/tcg-target.c.inc
177
+++ b/tcg/s390x/tcg-target.c.inc
151
+++ b/tcg/s390x/tcg-target.c.inc
178
@@ -XXX,XX +XXX,XX @@ static inline bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val,
152
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
179
return false;
153
: C_O1_I4(v, v, v, vZ, v));
154
155
default:
156
- g_assert_not_reached();
157
+ return C_NotImplemented;
158
}
180
}
159
}
181
160
182
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
183
+ tcg_target_long imm)
184
+{
185
+ /* This function is only used for passing structs by reference. */
186
+ tcg_out_mem(s, RX_LA, RXY_LAY, rd, rs, TCG_REG_NONE, imm);
187
+}
188
+
189
static inline void tcg_out_risbg(TCGContext *s, TCGReg dest, TCGReg src,
190
int msb, int lsb, int ofs, int z)
191
{
192
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
161
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
193
index XXXXXXX..XXXXXXX 100644
162
index XXXXXXX..XXXXXXX 100644
194
--- a/tcg/sparc64/tcg-target.c.inc
163
--- a/tcg/sparc64/tcg-target.c.inc
195
+++ b/tcg/sparc64/tcg-target.c.inc
164
+++ b/tcg/sparc64/tcg-target.c.inc
196
@@ -XXX,XX +XXX,XX @@ static void tcg_out_movi(TCGContext *s, TCGType type,
165
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
197
tcg_out_movi_int(s, type, ret, arg, false, TCG_REG_T2);
166
return C_O1_I2(r, r, r);
167
168
default:
169
- g_assert_not_reached();
170
+ return C_NotImplemented;
171
}
198
}
172
}
199
173
200
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
201
+ tcg_target_long imm)
202
+{
203
+ /* This function is only used for passing structs by reference. */
204
+ g_assert_not_reached();
205
+}
206
+
207
static void tcg_out_ldst_rr(TCGContext *s, TCGReg data, TCGReg a1,
208
TCGReg a2, int op)
209
{
210
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
174
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
211
index XXXXXXX..XXXXXXX 100644
175
index XXXXXXX..XXXXXXX 100644
212
--- a/tcg/tci/tcg-target.c.inc
176
--- a/tcg/tci/tcg-target.c.inc
213
+++ b/tcg/tci/tcg-target.c.inc
177
+++ b/tcg/tci/tcg-target.c.inc
214
@@ -XXX,XX +XXX,XX @@ static void tcg_out_movi(TCGContext *s, TCGType type,
178
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
179
return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I4(r, r, r, r);
180
181
default:
182
- g_assert_not_reached();
183
+ return C_NotImplemented;
215
}
184
}
216
}
185
}
217
186
218
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg rd, TCGReg rs,
219
+ tcg_target_long imm)
220
+{
221
+ /* This function is only used for passing structs by reference. */
222
+ g_assert_not_reached();
223
+}
224
+
225
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *func,
226
const TCGHelperInfo *info)
227
{
228
--
187
--
229
2.34.1
188
2.43.0
230
189
231
190
diff view generated by jsdifflib
1
Correctly handle large types while lowering.
1
Test each vector type, not just lumping them all together.
2
Add tests for I32 (always true) and I64 (64-bit hosts).
2
3
3
Fixes: fac87bd2a49b ("tcg: Add temp_subindex to TCGTemp")
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
---
6
tcg/tcg.c | 1 +
7
tcg/tcg.c | 66 ++++++++++++++++++++++++++++++++++++-------------------
7
1 file changed, 1 insertion(+)
8
1 file changed, 43 insertions(+), 23 deletions(-)
8
9
9
diff --git a/tcg/tcg.c b/tcg/tcg.c
10
diff --git a/tcg/tcg.c b/tcg/tcg.c
10
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/tcg.c
12
--- a/tcg/tcg.c
12
+++ b/tcg/tcg.c
13
+++ b/tcg/tcg.c
13
@@ -XXX,XX +XXX,XX @@ static bool liveness_pass_2(TCGContext *s)
14
@@ -XXX,XX +XXX,XX @@ TCGTemp *tcgv_i32_temp(TCGv_i32 v)
14
TCGTemp *dts = tcg_temp_alloc(s);
15
*/
15
dts->type = its->type;
16
bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
16
dts->base_type = its->base_type;
17
{
17
+ dts->temp_subindex = its->temp_subindex;
18
- const bool have_vec
18
dts->kind = TEMP_EBB;
19
- = TCG_TARGET_HAS_v64 | TCG_TARGET_HAS_v128 | TCG_TARGET_HAS_v256;
19
its->state_ptr = dts;
20
+ bool has_type;
20
} else {
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);
21
--
127
--
22
2.34.1
128
2.43.0
129
130
diff view generated by jsdifflib
1
These will be used by some hosts, both 32 and 64-bit, to pass and
1
Process each TCGConstraintSetIndex first. Allocate TCGArgConstraint
2
return i128. Not yet used, because allocation is not yet enabled.
2
arrays based on those. Only afterward process the TCGOpcodes and
3
share those TCGArgConstraint arrays.
3
4
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
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/tcg-internal.h | 3 +
8
include/tcg/tcg.h | 7 +-
8
tcg/tcg.c | 135 ++++++++++++++++++++++++++++++++++++++++++++-
9
tcg/tcg.c | 272 +++++++++++++++++++++++-----------------------
9
2 files changed, 135 insertions(+), 3 deletions(-)
10
2 files changed, 136 insertions(+), 143 deletions(-)
10
11
11
diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h
12
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/tcg-internal.h
14
--- a/include/tcg/tcg.h
14
+++ b/tcg/tcg-internal.h
15
+++ b/include/tcg/tcg.h
15
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@ typedef struct TCGOpDef {
16
*/
17
const char *name;
17
typedef enum {
18
uint8_t nb_oargs, nb_iargs, nb_cargs, nb_args;
18
TCG_CALL_RET_NORMAL, /* by registers */
19
uint8_t flags;
19
+ TCG_CALL_RET_BY_REF, /* for i128, by reference */
20
- TCGArgConstraint *args_ct;
20
} TCGCallReturnKind;
21
+ const TCGArgConstraint *args_ct;
21
22
} TCGOpDef;
22
typedef enum {
23
23
@@ -XXX,XX +XXX,XX @@ typedef enum {
24
extern TCGOpDef tcg_op_defs[];
24
TCG_CALL_ARG_EXTEND, /* for i32, as a sign/zero-extended i64 */
25
extern const size_t tcg_op_defs_max;
25
TCG_CALL_ARG_EXTEND_U, /* ... as a zero-extended i64 */
26
26
TCG_CALL_ARG_EXTEND_S, /* ... as a sign-extended i64 */
27
-typedef struct TCGTargetOpDef {
27
+ TCG_CALL_ARG_BY_REF, /* for i128, by reference, first */
28
- TCGOpcode op;
28
+ TCG_CALL_ARG_BY_REF_N, /* ... by reference, subsequent */
29
- const char *args_ct_str[TCG_MAX_OP_ARGS];
29
} TCGCallArgumentKind;
30
-} TCGTargetOpDef;
30
31
-
31
typedef struct TCGCallArgumentLoc {
32
/*
33
* tcg_op_supported:
34
* Query if @op, for @type and @flags, is supported by the host
32
diff --git a/tcg/tcg.c b/tcg/tcg.c
35
diff --git a/tcg/tcg.c b/tcg/tcg.c
33
index XXXXXXX..XXXXXXX 100644
36
index XXXXXXX..XXXXXXX 100644
34
--- a/tcg/tcg.c
37
--- a/tcg/tcg.c
35
+++ b/tcg/tcg.c
38
+++ b/tcg/tcg.c
36
@@ -XXX,XX +XXX,XX @@ static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg1,
39
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode);
37
static bool tcg_out_mov(TCGContext *s, TCGType type, TCGReg ret, TCGReg arg);
40
38
static void tcg_out_movi(TCGContext *s, TCGType type,
41
/* Put all of the constraint sets into an array, indexed by the enum. */
39
TCGReg ret, tcg_target_long arg);
42
40
-static void tcg_out_addi_ptr(TCGContext *s, TCGReg, TCGReg, tcg_target_long)
43
-#define C_O0_I1(I1) { .args_ct_str = { #I1 } },
41
- __attribute__((unused));
44
-#define C_O0_I2(I1, I2) { .args_ct_str = { #I1, #I2 } },
42
+static void tcg_out_addi_ptr(TCGContext *s, TCGReg, TCGReg, tcg_target_long);
45
-#define C_O0_I3(I1, I2, I3) { .args_ct_str = { #I1, #I2, #I3 } },
43
static void tcg_out_exit_tb(TCGContext *s, uintptr_t arg);
46
-#define C_O0_I4(I1, I2, I3, I4) { .args_ct_str = { #I1, #I2, #I3, #I4 } },
44
static void tcg_out_goto_tb(TCGContext *s, int which);
47
+typedef struct TCGConstraintSet {
45
static void tcg_out_op(TCGContext *s, TCGOpcode opc,
48
+ uint8_t nb_oargs, nb_iargs;
46
@@ -XXX,XX +XXX,XX @@ static void layout_arg_normal_n(TCGCumulativeArgs *cum,
49
+ const char *args_ct_str[TCG_MAX_OP_ARGS];
47
cum->arg_slot += n;
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)
48
}
128
}
49
129
50
+static void layout_arg_by_ref(TCGCumulativeArgs *cum, TCGHelperInfo *info)
130
/* we give more priority to constraints with less registers */
51
+{
131
-static int get_constraint_priority(const TCGOpDef *def, int k)
52
+ TCGCallArgumentLoc *loc = &info->in[cum->info_in_idx];
132
+static int get_constraint_priority(const TCGArgConstraint *arg_ct, int k)
53
+ int n = 128 / TCG_TARGET_REG_BITS;
54
+
55
+ /* The first subindex carries the pointer. */
56
+ layout_arg_1(cum, info, TCG_CALL_ARG_BY_REF);
57
+
58
+ /*
59
+ * The callee is allowed to clobber memory associated with
60
+ * structure pass by-reference. Therefore we must make copies.
61
+ * Allocate space from "ref_slot", which will be adjusted to
62
+ * follow the parameters on the stack.
63
+ */
64
+ loc[0].ref_slot = cum->ref_slot;
65
+
66
+ /*
67
+ * Subsequent words also go into the reference slot, but
68
+ * do not accumulate into the regular arguments.
69
+ */
70
+ for (int i = 1; i < n; ++i) {
71
+ loc[i] = (TCGCallArgumentLoc){
72
+ .kind = TCG_CALL_ARG_BY_REF_N,
73
+ .arg_idx = cum->arg_idx,
74
+ .tmp_subindex = i,
75
+ .ref_slot = cum->ref_slot + i,
76
+ };
77
+ }
78
+ cum->info_in_idx += n;
79
+ cum->ref_slot += n;
80
+}
81
+
82
static void init_call_layout(TCGHelperInfo *info)
83
{
133
{
84
int max_reg_slots = ARRAY_SIZE(tcg_target_call_iarg_regs);
134
- const TCGArgConstraint *arg_ct = &def->args_ct[k];
85
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
135
- int n = ctpop64(arg_ct->regs);
86
case TCG_CALL_RET_NORMAL:
136
+ int n;
87
assert(info->nr_out <= ARRAY_SIZE(tcg_target_call_oarg_regs));
137
+
88
break;
138
+ arg_ct += k;
89
+ case TCG_CALL_RET_BY_REF:
139
+ n = ctpop64(arg_ct->regs);
90
+ /*
140
91
+ * Allocate the first argument to the output.
141
/*
92
+ * We don't need to store this anywhere, just make it
142
* Sort constraints of a single register first, which includes output
93
+ * unavailable for use in the input loop below.
143
@@ -XXX,XX +XXX,XX @@ static int get_constraint_priority(const TCGOpDef *def, int k)
94
+ */
95
+ cum.arg_slot = 1;
96
+ break;
97
default:
98
qemu_build_not_reached();
99
}
100
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
101
case TCG_CALL_ARG_NORMAL:
102
layout_arg_normal_n(&cum, info, 128 / TCG_TARGET_REG_BITS);
103
break;
104
+ case TCG_CALL_ARG_BY_REF:
105
+ layout_arg_by_ref(&cum, info);
106
+ break;
107
default:
108
qemu_build_not_reached();
109
}
110
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
111
assert(cum.info_in_idx <= ARRAY_SIZE(info->in));
112
/* Validate the backend has enough argument space. */
113
assert(cum.arg_slot <= max_reg_slots + max_stk_slots);
114
- assert(cum.ref_slot <= max_stk_slots);
115
+
116
+ /*
117
+ * Relocate the "ref_slot" area to the end of the parameters.
118
+ * Minimizing this stack offset helps code size for x86,
119
+ * which has a signed 8-bit offset encoding.
120
+ */
121
+ if (cum.ref_slot != 0) {
122
+ int ref_base = 0;
123
+
124
+ if (cum.arg_slot > max_reg_slots) {
125
+ int align = __alignof(Int128) / sizeof(tcg_target_long);
126
+
127
+ ref_base = cum.arg_slot - max_reg_slots;
128
+ if (align > 1) {
129
+ ref_base = ROUND_UP(ref_base, align);
130
+ }
131
+ }
132
+ assert(ref_base + cum.ref_slot <= max_stk_slots);
133
+
134
+ if (ref_base != 0) {
135
+ for (int i = cum.info_in_idx - 1; i >= 0; --i) {
136
+ TCGCallArgumentLoc *loc = &info->in[i];
137
+ switch (loc->kind) {
138
+ case TCG_CALL_ARG_BY_REF:
139
+ case TCG_CALL_ARG_BY_REF_N:
140
+ loc->ref_slot += ref_base;
141
+ break;
142
+ default:
143
+ break;
144
+ }
145
+ }
146
+ }
147
+ }
148
}
144
}
149
145
150
static int indirect_reg_alloc_order[ARRAY_SIZE(tcg_target_reg_alloc_order)];
146
/* sort from highest priority to lowest */
151
@@ -XXX,XX +XXX,XX @@ void tcg_gen_callN(void *func, TCGTemp *ret, int nargs, TCGTemp **args)
147
-static void sort_constraints(TCGOpDef *def, int start, int n)
152
148
+static void sort_constraints(TCGArgConstraint *a, int start, int n)
153
switch (loc->kind) {
149
{
154
case TCG_CALL_ARG_NORMAL:
150
int i, j;
155
+ case TCG_CALL_ARG_BY_REF:
151
- TCGArgConstraint *a = def->args_ct;
156
+ case TCG_CALL_ARG_BY_REF_N:
152
157
op->args[pi++] = temp_arg(ts);
153
for (i = 0; i < n; i++) {
158
break;
154
a[start + i].sort_index = start + i;
159
155
@@ -XXX,XX +XXX,XX @@ static void sort_constraints(TCGOpDef *def, int start, int n)
160
@@ -XXX,XX +XXX,XX @@ static void load_arg_normal(TCGContext *s, const TCGCallArgumentLoc *l,
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)
161
}
167
}
162
}
168
}
163
169
164
+static void load_arg_ref(TCGContext *s, int arg_slot, TCGReg ref_base,
170
+static const TCGArgConstraint empty_cts[TCG_MAX_OP_ARGS];
165
+ intptr_t ref_off, TCGRegSet *allocated_regs)
171
+static TCGArgConstraint all_cts[ARRAY_SIZE(constraint_sets)][TCG_MAX_OP_ARGS];
166
+{
172
+
167
+ TCGReg reg;
173
static void process_op_defs(TCGContext *s)
168
+ int stk_slot = arg_slot - ARRAY_SIZE(tcg_target_call_iarg_regs);
174
{
169
+
175
- TCGOpcode op;
170
+ if (stk_slot < 0) {
176
-
171
+ reg = tcg_target_call_iarg_regs[arg_slot];
177
- for (op = 0; op < NB_OPS; op++) {
172
+ tcg_reg_free(s, reg, *allocated_regs);
178
- TCGOpDef *def = &tcg_op_defs[op];
173
+ tcg_out_addi_ptr(s, reg, ref_base, ref_off);
179
- const TCGTargetOpDef *tdefs;
174
+ tcg_regset_set_reg(*allocated_regs, reg);
180
+ for (size_t c = 0; c < ARRAY_SIZE(constraint_sets); ++c) {
175
+ } else {
181
+ const TCGConstraintSet *tdefs = &constraint_sets[c];
176
+ reg = tcg_reg_alloc(s, tcg_target_available_regs[TCG_TYPE_PTR],
182
+ TCGArgConstraint *args_ct = all_cts[c];
177
+ *allocated_regs, 0, false);
183
+ int nb_oargs = tdefs->nb_oargs;
178
+ tcg_out_addi_ptr(s, reg, ref_base, ref_off);
184
+ int nb_iargs = tdefs->nb_iargs;
179
+ tcg_out_st(s, TCG_TYPE_PTR, reg, TCG_REG_CALL_STACK,
185
+ int nb_args = nb_oargs + nb_iargs;
180
+ TCG_TARGET_CALL_STACK_OFFSET
186
bool saw_alias_pair = false;
181
+ + stk_slot * sizeof(tcg_target_long));
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);
182
+ }
429
+ }
183
+}
430
+
184
+
431
+ for (TCGOpcode op = 0; op < NB_OPS; op++) {
185
static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
432
+ TCGOpDef *def = &tcg_op_defs[op];
186
{
433
+ const TCGConstraintSet *tdefs;
187
const int nb_oargs = TCGOP_CALLO(op);
434
+ TCGConstraintSetIndex con_set;
188
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
435
+ int nb_args;
189
case TCG_CALL_ARG_EXTEND_S:
436
+
190
load_arg_normal(s, loc, ts, &allocated_regs);
437
+ nb_args = def->nb_iargs + def->nb_oargs;
191
break;
438
+ if (nb_args == 0) {
192
+ case TCG_CALL_ARG_BY_REF:
439
+ continue;
193
+ load_arg_stk(s, loc->ref_slot, ts, allocated_regs);
440
+ }
194
+ load_arg_ref(s, loc->arg_slot, TCG_REG_CALL_STACK,
441
+
195
+ TCG_TARGET_CALL_STACK_OFFSET
442
+ if (def->flags & TCG_OPF_NOT_PRESENT) {
196
+ + loc->ref_slot * sizeof(tcg_target_long),
443
+ def->args_ct = empty_cts;
197
+ &allocated_regs);
444
+ continue;
198
+ break;
445
+ }
199
+ case TCG_CALL_ARG_BY_REF_N:
446
+
200
+ load_arg_stk(s, loc->ref_slot, ts, allocated_regs);
447
+ /*
201
+ break;
448
+ * Macro magic should make it impossible, but double-check that
202
default:
449
+ * the array index is in range. At the same time, double-check
203
g_assert_not_reached();
450
+ * that the opcode is implemented, i.e. not C_NotImplemented.
204
}
451
+ */
205
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
452
+ con_set = tcg_target_op_def(op);
206
save_globals(s, allocated_regs);
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];
207
}
461
}
208
462
}
209
+ /*
463
210
+ * If the ABI passes a pointer to the returned struct as the first
211
+ * argument, load that now. Pass a pointer to the output home slot.
212
+ */
213
+ if (info->out_kind == TCG_CALL_RET_BY_REF) {
214
+ TCGTemp *ts = arg_temp(op->args[0]);
215
+
216
+ if (!ts->mem_allocated) {
217
+ temp_allocate_frame(s, ts);
218
+ }
219
+ load_arg_ref(s, 0, ts->mem_base->reg, ts->mem_offset, &allocated_regs);
220
+ }
221
+
222
tcg_out_call(s, tcg_call_func(op), info);
223
224
/* Assign output registers and emit moves if needed. */
225
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
226
ts->mem_coherent = 0;
227
}
228
break;
229
+
230
+ case TCG_CALL_RET_BY_REF:
231
+ /* The callee has performed a write through the reference. */
232
+ for (i = 0; i < nb_oargs; i++) {
233
+ TCGTemp *ts = arg_temp(op->args[i]);
234
+ ts->val_type = TEMP_VAL_MEM;
235
+ }
236
+ break;
237
+
238
default:
239
g_assert_not_reached();
240
}
241
--
464
--
242
2.34.1
465
2.43.0
243
466
244
467
diff view generated by jsdifflib
1
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
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>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
11
---
4
target/s390x/helper.h | 2 --
12
include/tcg/tcg.h | 1 -
5
target/s390x/tcg/insn-data.h.inc | 2 +-
13
tcg/tcg-common.c | 2 +-
6
target/s390x/tcg/mem_helper.c | 52 ------------------------------
14
tcg/tcg.c | 82 ++++++++++++++++++++++-------------------------
7
target/s390x/tcg/translate.c | 55 +++++++++++++++++++-------------
15
3 files changed, 40 insertions(+), 45 deletions(-)
8
4 files changed, 33 insertions(+), 78 deletions(-)
16
9
17
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
10
diff --git a/target/s390x/helper.h b/target/s390x/helper.h
11
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
12
--- a/target/s390x/helper.h
19
--- a/include/tcg/tcg.h
13
+++ b/target/s390x/helper.h
20
+++ b/include/tcg/tcg.h
14
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(cxgb, i128, env, s64, i32)
21
@@ -XXX,XX +XXX,XX @@ typedef struct TCGOpDef {
15
DEF_HELPER_3(celgb, i64, env, i64, i32)
22
const char *name;
16
DEF_HELPER_3(cdlgb, i64, env, i64, i32)
23
uint8_t nb_oargs, nb_iargs, nb_cargs, nb_args;
17
DEF_HELPER_3(cxlgb, i128, env, i64, i32)
24
uint8_t flags;
18
-DEF_HELPER_4(cdsg, void, env, i64, i32, i32)
25
- const TCGArgConstraint *args_ct;
19
-DEF_HELPER_4(cdsg_parallel, void, env, i64, i32, i32)
26
} TCGOpDef;
20
DEF_HELPER_4(csst, i32, env, i32, i64, i64)
27
21
DEF_HELPER_4(csst_parallel, i32, env, i32, i64, i64)
28
extern TCGOpDef tcg_op_defs[];
22
DEF_HELPER_FLAGS_3(aeb, TCG_CALL_NO_WG, i64, env, i64, i64)
29
diff --git a/tcg/tcg-common.c b/tcg/tcg-common.c
23
diff --git a/target/s390x/tcg/insn-data.h.inc b/target/s390x/tcg/insn-data.h.inc
24
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
25
--- a/target/s390x/tcg/insn-data.h.inc
31
--- a/tcg/tcg-common.c
26
+++ b/target/s390x/tcg/insn-data.h.inc
32
+++ b/tcg/tcg-common.c
27
@@ -XXX,XX +XXX,XX @@
33
@@ -XXX,XX +XXX,XX @@
28
/* COMPARE DOUBLE AND SWAP */
34
29
D(0xbb00, CDS, RS_a, Z, r3_D32, r1_D32, new, r1_D32, cs, 0, MO_TEUQ)
35
TCGOpDef tcg_op_defs[] = {
30
D(0xeb31, CDSY, RSY_a, LD, r3_D32, r1_D32, new, r1_D32, cs, 0, MO_TEUQ)
36
#define DEF(s, oargs, iargs, cargs, flags) \
31
- C(0xeb3e, CDSG, RSY_a, Z, 0, 0, 0, 0, cdsg, 0)
37
- { #s, oargs, iargs, cargs, iargs + oargs + cargs, flags, NULL },
32
+ C(0xeb3e, CDSG, RSY_a, Z, la2, r3_D64, 0, r1_D64, cdsg, 0)
38
+ { #s, oargs, iargs, cargs, iargs + oargs + cargs, flags },
33
/* COMPARE AND SWAP AND STORE */
39
#include "tcg/tcg-opc.h"
34
C(0xc802, CSST, SSF, CASS, la1, a2, 0, 0, csst, 0)
40
#undef DEF
35
41
};
36
diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c
42
diff --git a/tcg/tcg.c b/tcg/tcg.c
37
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
38
--- a/target/s390x/tcg/mem_helper.c
44
--- a/tcg/tcg.c
39
+++ b/target/s390x/tcg/mem_helper.c
45
+++ b/tcg/tcg.c
40
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(trXX)(CPUS390XState *env, uint32_t r1, uint32_t r2,
46
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
41
return cc;
42
}
47
}
43
48
44
-void HELPER(cdsg)(CPUS390XState *env, uint64_t addr,
49
static int indirect_reg_alloc_order[ARRAY_SIZE(tcg_target_reg_alloc_order)];
45
- uint32_t r1, uint32_t r3)
50
-static void process_op_defs(TCGContext *s);
46
-{
51
+static void process_constraint_sets(void);
47
- uintptr_t ra = GETPC();
52
static TCGTemp *tcg_global_reg_new_internal(TCGContext *s, TCGType type,
48
- Int128 cmpv = int128_make128(env->regs[r1 + 1], env->regs[r1]);
53
TCGReg reg, const char *name);
49
- Int128 newv = int128_make128(env->regs[r3 + 1], env->regs[r3]);
54
50
- Int128 oldv;
55
@@ -XXX,XX +XXX,XX @@ static void tcg_context_init(unsigned max_cpus)
51
- uint64_t oldh, oldl;
56
init_call_layout(&info_helper_st128_mmu);
52
- bool fail;
57
53
-
58
tcg_target_init(s);
54
- check_alignment(env, addr, 16, ra);
59
- process_op_defs(s);
55
-
60
+ process_constraint_sets();
56
- oldh = cpu_ldq_data_ra(env, addr + 0, ra);
61
57
- oldl = cpu_ldq_data_ra(env, addr + 8, ra);
62
/* Reverse the order of the saved registers, assuming they're all at
58
-
63
the start of tcg_target_reg_alloc_order. */
59
- oldv = int128_make128(oldl, oldh);
64
@@ -XXX,XX +XXX,XX @@ static void sort_constraints(TCGArgConstraint *a, int start, int n)
60
- fail = !int128_eq(oldv, cmpv);
65
static const TCGArgConstraint empty_cts[TCG_MAX_OP_ARGS];
61
- if (fail) {
66
static TCGArgConstraint all_cts[ARRAY_SIZE(constraint_sets)][TCG_MAX_OP_ARGS];
62
- newv = oldv;
67
63
- }
68
-static void process_op_defs(TCGContext *s)
64
-
69
+static void process_constraint_sets(void)
65
- cpu_stq_data_ra(env, addr + 0, int128_gethi(newv), ra);
66
- cpu_stq_data_ra(env, addr + 8, int128_getlo(newv), ra);
67
-
68
- env->cc_op = fail;
69
- env->regs[r1] = int128_gethi(oldv);
70
- env->regs[r1 + 1] = int128_getlo(oldv);
71
-}
72
-
73
-void HELPER(cdsg_parallel)(CPUS390XState *env, uint64_t addr,
74
- uint32_t r1, uint32_t r3)
75
-{
76
- uintptr_t ra = GETPC();
77
- Int128 cmpv = int128_make128(env->regs[r1 + 1], env->regs[r1]);
78
- Int128 newv = int128_make128(env->regs[r3 + 1], env->regs[r3]);
79
- int mem_idx;
80
- MemOpIdx oi;
81
- Int128 oldv;
82
- bool fail;
83
-
84
- assert(HAVE_CMPXCHG128);
85
-
86
- mem_idx = cpu_mmu_index(env, false);
87
- oi = make_memop_idx(MO_TE | MO_128 | MO_ALIGN, mem_idx);
88
- oldv = cpu_atomic_cmpxchgo_be_mmu(env, addr, cmpv, newv, oi, ra);
89
- fail = !int128_eq(oldv, cmpv);
90
-
91
- env->cc_op = fail;
92
- env->regs[r1] = int128_gethi(oldv);
93
- env->regs[r1 + 1] = int128_getlo(oldv);
94
-}
95
-
96
static uint32_t do_csst(CPUS390XState *env, uint32_t r3, uint64_t a1,
97
uint64_t a2, bool parallel)
98
{
70
{
99
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
71
for (size_t c = 0; c < ARRAY_SIZE(constraint_sets); ++c) {
100
index XXXXXXX..XXXXXXX 100644
72
const TCGConstraintSet *tdefs = &constraint_sets[c];
101
--- a/target/s390x/tcg/translate.c
73
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
102
+++ b/target/s390x/tcg/translate.c
74
sort_constraints(args_ct, 0, nb_oargs);
103
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_cs(DisasContext *s, DisasOps *o)
75
sort_constraints(args_ct, nb_oargs, nb_iargs);
104
static DisasJumpType op_cdsg(DisasContext *s, DisasOps *o)
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)
105
{
151
{
106
int r1 = get_field(s, r1);
152
const TCGLifeData arg_life = op->life;
107
- int r3 = get_field(s, r3);
153
TCGRegSet dup_out_regs, dup_in_regs;
108
- int d2 = get_field(s, d2);
154
+ const TCGArgConstraint *dup_args_ct;
109
- int b2 = get_field(s, b2);
155
TCGTemp *its, *ots;
110
- DisasJumpType ret = DISAS_NEXT;
156
TCGType itype, vtype;
111
- TCGv_i64 addr;
157
unsigned vece;
112
- TCGv_i32 t_r1, t_r3;
158
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
113
159
return;
114
- /* Note that R1:R1+1 = expected value and R3:R3+1 = new value. */
160
}
115
- addr = get_address(s, 0, b2, d2);
161
116
- t_r1 = tcg_const_i32(r1);
162
- dup_out_regs = tcg_op_defs[INDEX_op_dup_vec].args_ct[0].regs;
117
- t_r3 = tcg_const_i32(r3);
163
- dup_in_regs = tcg_op_defs[INDEX_op_dup_vec].args_ct[1].regs;
118
- if (!(tb_cflags(s->base.tb) & CF_PARALLEL)) {
164
+ dup_args_ct = opcode_args_ct(op);
119
- gen_helper_cdsg(cpu_env, addr, t_r1, t_r3);
165
+ dup_out_regs = dup_args_ct[0].regs;
120
- } else if (HAVE_CMPXCHG128) {
166
+ dup_in_regs = dup_args_ct[1].regs;
121
- gen_helper_cdsg_parallel(cpu_env, addr, t_r1, t_r3);
167
122
- } else {
168
/* Allocate the output register now. */
123
- gen_helper_exit_atomic(cpu_env);
169
if (ots->val_type != TEMP_VAL_REG) {
124
- ret = DISAS_NORETURN;
170
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
125
- }
171
int i, k, nb_iargs, nb_oargs;
126
- tcg_temp_free_i64(addr);
172
TCGReg reg;
127
- tcg_temp_free_i32(t_r1);
173
TCGArg arg;
128
- tcg_temp_free_i32(t_r3);
174
+ const TCGArgConstraint *args_ct;
129
+ o->out_128 = tcg_temp_new_i128();
175
const TCGArgConstraint *arg_ct;
130
+ tcg_gen_concat_i64_i128(o->out_128, regs[r1 + 1], regs[r1]);
176
TCGTemp *ts;
131
177
TCGArg new_args[TCG_MAX_OP_ARGS];
132
- set_cc_static(s);
178
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
133
- return ret;
179
break;
134
+ /* Note out (R1:R1+1) = expected value and in2 (R3:R3+1) = new value. */
180
}
135
+ tcg_gen_atomic_cmpxchg_i128(o->out_128, o->addr1, o->out_128, o->in2_128,
181
136
+ get_mem_index(s), MO_BE | MO_128 | MO_ALIGN);
182
+ args_ct = opcode_args_ct(op);
137
+
183
+
138
+ /*
184
/* satisfy input constraints */
139
+ * Extract result into cc_dst:cc_src, compare vs the expected value
185
for (k = 0; k < nb_iargs; k++) {
140
+ * in the as yet unmodified input registers, then update CC_OP.
186
TCGRegSet i_preferred_regs, i_required_regs;
141
+ */
187
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
142
+ tcg_gen_extr_i128_i64(cc_src, cc_dst, o->out_128);
188
TCGTemp *ts2;
143
+ tcg_gen_xor_i64(cc_dst, cc_dst, regs[r1]);
189
int i1, i2;
144
+ tcg_gen_xor_i64(cc_src, cc_src, regs[r1 + 1]);
190
145
+ tcg_gen_or_i64(cc_dst, cc_dst, cc_src);
191
- i = def->args_ct[nb_oargs + k].sort_index;
146
+ set_cc_nz_u64(s, cc_dst);
192
+ i = args_ct[nb_oargs + k].sort_index;
147
+
193
arg = op->args[i];
148
+ return DISAS_NEXT;
194
- arg_ct = &def->args_ct[i];
149
}
195
+ arg_ct = &args_ct[i];
150
196
ts = arg_temp(arg);
151
static DisasJumpType op_csst(DisasContext *s, DisasOps *o)
197
152
@@ -XXX,XX +XXX,XX @@ static void wout_r1_D32(DisasContext *s, DisasOps *o)
198
if (ts->val_type == TEMP_VAL_CONST
153
}
199
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
154
#define SPEC_wout_r1_D32 SPEC_r1_even
200
* register and move it.
155
201
*/
156
+static void wout_r1_D64(DisasContext *s, DisasOps *o)
202
if (temp_readonly(ts) || !IS_DEAD_ARG(i)
157
+{
203
- || def->args_ct[arg_ct->alias_index].newreg) {
158
+ int r1 = get_field(s, r1);
204
+ || args_ct[arg_ct->alias_index].newreg) {
159
+ tcg_gen_extr_i128_i64(regs[r1 + 1], regs[r1], o->out_128);
205
allocate_new_reg = true;
160
+}
206
} else if (ts->val_type == TEMP_VAL_REG) {
161
+#define SPEC_wout_r1_D64 SPEC_r1_even
207
/*
162
+
208
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
163
static void wout_r3_P32(DisasContext *s, DisasOps *o)
209
}
164
{
210
165
int r3 = get_field(s, r3);
211
/* satisfy the output constraints */
166
@@ -XXX,XX +XXX,XX @@ static void in2_r3(DisasContext *s, DisasOps *o)
212
- for(k = 0; k < nb_oargs; k++) {
167
}
213
- i = def->args_ct[k].sort_index;
168
#define SPEC_in2_r3 0
214
+ for (k = 0; k < nb_oargs; k++) {
169
215
+ i = args_ct[k].sort_index;
170
+static void in2_r3_D64(DisasContext *s, DisasOps *o)
216
arg = op->args[i];
171
+{
217
- arg_ct = &def->args_ct[i];
172
+ int r3 = get_field(s, r3);
218
+ arg_ct = &args_ct[i];
173
+ o->in2_128 = tcg_temp_new_i128();
219
ts = arg_temp(arg);
174
+ tcg_gen_concat_i64_i128(o->in2_128, regs[r3 + 1], regs[r3]);
220
175
+}
221
/* ENV should not be modified. */
176
+#define SPEC_in2_r3_D64 SPEC_r3_even
222
@@ -XXX,XX +XXX,XX @@ static bool tcg_reg_alloc_dup2(TCGContext *s, const TCGOp *op)
177
+
223
/* Allocate the output register now. */
178
static void in2_r3_sr32(DisasContext *s, DisasOps *o)
224
if (ots->val_type != TEMP_VAL_REG) {
179
{
225
TCGRegSet allocated_regs = s->reserved_regs;
180
o->in2 = tcg_temp_new_i64();
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. */
181
--
232
--
182
2.34.1
233
2.43.0
234
235
diff view generated by jsdifflib
1
Use tcg_gen_atomic_cmpxchg_i64 for the atomic case,
1
Now that we're no longer assigning to TCGOpDef.args_ct,
2
and tcg_gen_nonatomic_cmpxchg_i64 otherwise.
2
we can make the array constant.
3
3
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
6
---
8
target/i386/helper.h | 2 --
7
include/tcg/tcg.h | 2 +-
9
target/i386/tcg/mem_helper.c | 57 ------------------------------------
8
tcg/tcg-common.c | 2 +-
10
target/i386/tcg/translate.c | 54 ++++++++++++++++++++++++++++++----
9
tcg/tcg.c | 2 +-
11
3 files changed, 49 insertions(+), 64 deletions(-)
10
3 files changed, 3 insertions(+), 3 deletions(-)
12
11
13
diff --git a/target/i386/helper.h b/target/i386/helper.h
12
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
14
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
15
--- a/target/i386/helper.h
14
--- a/include/tcg/tcg.h
16
+++ b/target/i386/helper.h
15
+++ b/include/tcg/tcg.h
17
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_1(rsm, void, env)
16
@@ -XXX,XX +XXX,XX @@ typedef struct TCGOpDef {
18
#endif /* !CONFIG_USER_ONLY */
17
uint8_t flags;
19
18
} TCGOpDef;
20
DEF_HELPER_2(into, void, env, int)
19
21
-DEF_HELPER_2(cmpxchg8b_unlocked, void, env, tl)
20
-extern TCGOpDef tcg_op_defs[];
22
-DEF_HELPER_2(cmpxchg8b, void, env, tl)
21
+extern const TCGOpDef tcg_op_defs[];
23
#ifdef TARGET_X86_64
22
extern const size_t tcg_op_defs_max;
24
DEF_HELPER_2(cmpxchg16b_unlocked, void, env, tl)
23
25
DEF_HELPER_2(cmpxchg16b, void, env, tl)
24
/*
26
diff --git a/target/i386/tcg/mem_helper.c b/target/i386/tcg/mem_helper.c
25
diff --git a/tcg/tcg-common.c b/tcg/tcg-common.c
27
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
28
--- a/target/i386/tcg/mem_helper.c
27
--- a/tcg/tcg-common.c
29
+++ b/target/i386/tcg/mem_helper.c
28
+++ b/tcg/tcg-common.c
30
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@
31
#include "tcg/tcg.h"
30
#include "tcg/tcg.h"
32
#include "helper-tcg.h"
31
#include "tcg-has.h"
33
32
34
-void helper_cmpxchg8b_unlocked(CPUX86State *env, target_ulong a0)
33
-TCGOpDef tcg_op_defs[] = {
35
-{
34
+const TCGOpDef tcg_op_defs[] = {
36
- uintptr_t ra = GETPC();
35
#define DEF(s, oargs, iargs, cargs, flags) \
37
- uint64_t oldv, cmpv, newv;
36
{ #s, oargs, iargs, cargs, iargs + oargs + cargs, flags },
38
- int eflags;
37
#include "tcg/tcg-opc.h"
39
-
38
diff --git a/tcg/tcg.c b/tcg/tcg.c
40
- eflags = cpu_cc_compute_all(env, CC_OP);
39
index XXXXXXX..XXXXXXX 100644
41
-
40
--- a/tcg/tcg.c
42
- cmpv = deposit64(env->regs[R_EAX], 32, 32, env->regs[R_EDX]);
41
+++ b/tcg/tcg.c
43
- newv = deposit64(env->regs[R_EBX], 32, 32, env->regs[R_ECX]);
42
@@ -XXX,XX +XXX,XX @@ static void process_constraint_sets(void)
44
-
43
45
- oldv = cpu_ldq_data_ra(env, a0, ra);
44
static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
46
- newv = (cmpv == oldv ? newv : oldv);
47
- /* always do the store */
48
- cpu_stq_data_ra(env, a0, newv, ra);
49
-
50
- if (oldv == cmpv) {
51
- eflags |= CC_Z;
52
- } else {
53
- env->regs[R_EAX] = (uint32_t)oldv;
54
- env->regs[R_EDX] = (uint32_t)(oldv >> 32);
55
- eflags &= ~CC_Z;
56
- }
57
- CC_SRC = eflags;
58
-}
59
-
60
-void helper_cmpxchg8b(CPUX86State *env, target_ulong a0)
61
-{
62
-#ifdef CONFIG_ATOMIC64
63
- uint64_t oldv, cmpv, newv;
64
- int eflags;
65
-
66
- eflags = cpu_cc_compute_all(env, CC_OP);
67
-
68
- cmpv = deposit64(env->regs[R_EAX], 32, 32, env->regs[R_EDX]);
69
- newv = deposit64(env->regs[R_EBX], 32, 32, env->regs[R_ECX]);
70
-
71
- {
72
- uintptr_t ra = GETPC();
73
- int mem_idx = cpu_mmu_index(env, false);
74
- MemOpIdx oi = make_memop_idx(MO_TEUQ, mem_idx);
75
- oldv = cpu_atomic_cmpxchgq_le_mmu(env, a0, cmpv, newv, oi, ra);
76
- }
77
-
78
- if (oldv == cmpv) {
79
- eflags |= CC_Z;
80
- } else {
81
- env->regs[R_EAX] = (uint32_t)oldv;
82
- env->regs[R_EDX] = (uint32_t)(oldv >> 32);
83
- eflags &= ~CC_Z;
84
- }
85
- CC_SRC = eflags;
86
-#else
87
- cpu_loop_exit_atomic(env_cpu(env), GETPC());
88
-#endif /* CONFIG_ATOMIC64 */
89
-}
90
-
91
#ifdef TARGET_X86_64
92
void helper_cmpxchg16b_unlocked(CPUX86State *env, target_ulong a0)
93
{
45
{
94
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
46
- TCGOpDef *def = &tcg_op_defs[op->opc];
95
index XXXXXXX..XXXXXXX 100644
47
+ const TCGOpDef *def = &tcg_op_defs[op->opc];
96
--- a/target/i386/tcg/translate.c
48
TCGConstraintSetIndex con_set;
97
+++ b/target/i386/tcg/translate.c
49
98
@@ -XXX,XX +XXX,XX @@ static void gen_sty_env_A0(DisasContext *s, int offset, bool align)
50
if (def->nb_iargs + def->nb_oargs == 0) {
99
100
static void gen_cmpxchg8b(DisasContext *s, CPUX86State *env, int modrm)
101
{
102
+ TCGv_i64 cmp, val, old;
103
+ TCGv Z;
104
+
105
gen_lea_modrm(env, s, modrm);
106
107
- if ((s->prefix & PREFIX_LOCK) &&
108
- (tb_cflags(s->base.tb) & CF_PARALLEL)) {
109
- gen_helper_cmpxchg8b(cpu_env, s->A0);
110
+ cmp = tcg_temp_new_i64();
111
+ val = tcg_temp_new_i64();
112
+ old = tcg_temp_new_i64();
113
+
114
+ /* Construct the comparison values from the register pair. */
115
+ tcg_gen_concat_tl_i64(cmp, cpu_regs[R_EAX], cpu_regs[R_EDX]);
116
+ tcg_gen_concat_tl_i64(val, cpu_regs[R_EBX], cpu_regs[R_ECX]);
117
+
118
+ /* Only require atomic with LOCK; non-parallel handled in generator. */
119
+ if (s->prefix & PREFIX_LOCK) {
120
+ tcg_gen_atomic_cmpxchg_i64(old, s->A0, cmp, val, s->mem_index, MO_TEUQ);
121
} else {
122
- gen_helper_cmpxchg8b_unlocked(cpu_env, s->A0);
123
+ tcg_gen_nonatomic_cmpxchg_i64(old, s->A0, cmp, val,
124
+ s->mem_index, MO_TEUQ);
125
}
126
- set_cc_op(s, CC_OP_EFLAGS);
127
+ tcg_temp_free_i64(val);
128
+
129
+ /* Set tmp0 to match the required value of Z. */
130
+ tcg_gen_setcond_i64(TCG_COND_EQ, cmp, old, cmp);
131
+ Z = tcg_temp_new();
132
+ tcg_gen_trunc_i64_tl(Z, cmp);
133
+ tcg_temp_free_i64(cmp);
134
+
135
+ /*
136
+ * Extract the result values for the register pair.
137
+ * For 32-bit, we may do this unconditionally, because on success (Z=1),
138
+ * the old value matches the previous value in EDX:EAX. For x86_64,
139
+ * the store must be conditional, because we must leave the source
140
+ * registers unchanged on success, and zero-extend the writeback
141
+ * on failure (Z=0).
142
+ */
143
+ if (TARGET_LONG_BITS == 32) {
144
+ tcg_gen_extr_i64_tl(cpu_regs[R_EAX], cpu_regs[R_EDX], old);
145
+ } else {
146
+ TCGv zero = tcg_constant_tl(0);
147
+
148
+ tcg_gen_extr_i64_tl(s->T0, s->T1, old);
149
+ tcg_gen_movcond_tl(TCG_COND_EQ, cpu_regs[R_EAX], Z, zero,
150
+ s->T0, cpu_regs[R_EAX]);
151
+ tcg_gen_movcond_tl(TCG_COND_EQ, cpu_regs[R_EDX], Z, zero,
152
+ s->T1, cpu_regs[R_EDX]);
153
+ }
154
+ tcg_temp_free_i64(old);
155
+
156
+ /* Update Z. */
157
+ gen_compute_eflags(s);
158
+ tcg_gen_deposit_tl(cpu_cc_src, cpu_cc_src, Z, ctz32(CC_Z), 1);
159
+ tcg_temp_free(Z);
160
}
161
162
#ifdef TARGET_X86_64
163
--
51
--
164
2.34.1
52
2.43.0
165
53
166
54
diff view generated by jsdifflib
1
When allocating a temp to the stack frame, consider the
1
We should have checked that the op is supported before
2
base type and allocate all parts at once.
2
emitting it. The backend cannot be expected to have a
3
constraint set for unsupported ops.
3
4
4
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
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/tcg.c | 34 ++++++++++++++++++++++++++--------
8
tcg/tcg.c | 4 ++++
8
1 file changed, 26 insertions(+), 8 deletions(-)
9
1 file changed, 4 insertions(+)
9
10
10
diff --git a/tcg/tcg.c b/tcg/tcg.c
11
diff --git a/tcg/tcg.c b/tcg/tcg.c
11
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/tcg.c
13
--- a/tcg/tcg.c
13
+++ b/tcg/tcg.c
14
+++ b/tcg/tcg.c
14
@@ -XXX,XX +XXX,XX @@ static bool liveness_pass_2(TCGContext *s)
15
@@ -XXX,XX +XXX,XX @@ static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
15
16
const TCGOpDef *def = &tcg_op_defs[op->opc];
16
static void temp_allocate_frame(TCGContext *s, TCGTemp *ts)
17
TCGConstraintSetIndex con_set;
17
{
18
18
- int size = tcg_type_size(ts->type);
19
+#ifdef CONFIG_DEBUG_TCG
19
- int align;
20
+ assert(tcg_op_supported(op->opc, TCGOP_TYPE(op), TCGOP_FLAGS(op)));
20
intptr_t off;
21
+#endif
21
+ int size, align;
22
+
22
23
if (def->nb_iargs + def->nb_oargs == 0) {
23
- switch (ts->type) {
24
return NULL;
24
+ /* When allocating an object, look at the full type. */
25
+ size = tcg_type_size(ts->base_type);
26
+ switch (ts->base_type) {
27
case TCG_TYPE_I32:
28
align = 4;
29
break;
30
@@ -XXX,XX +XXX,XX @@ static void temp_allocate_frame(TCGContext *s, TCGTemp *ts)
31
tcg_raise_tb_overflow(s);
32
}
25
}
33
s->current_frame_offset = off + size;
34
-
35
- ts->mem_offset = off;
36
#if defined(__sparc__)
37
- ts->mem_offset += TCG_TARGET_STACK_BIAS;
38
+ off += TCG_TARGET_STACK_BIAS;
39
#endif
40
- ts->mem_base = s->frame_temp;
41
- ts->mem_allocated = 1;
42
+
43
+ /* If the object was subdivided, assign memory to all the parts. */
44
+ if (ts->base_type != ts->type) {
45
+ int part_size = tcg_type_size(ts->type);
46
+ int part_count = size / part_size;
47
+
48
+ /*
49
+ * Each part is allocated sequentially in tcg_temp_new_internal.
50
+ * Jump back to the first part by subtracting the current index.
51
+ */
52
+ ts -= ts->temp_subindex;
53
+ for (int i = 0; i < part_count; ++i) {
54
+ ts[i].mem_offset = off + i * part_size;
55
+ ts[i].mem_base = s->frame_temp;
56
+ ts[i].mem_allocated = 1;
57
+ }
58
+ } else {
59
+ ts->mem_offset = off;
60
+ ts->mem_base = s->frame_temp;
61
+ ts->mem_allocated = 1;
62
+ }
63
}
64
65
/* Assign @reg to @ts, and update reg_to_temp[]. */
66
--
26
--
67
2.34.1
27
2.43.0
68
28
69
29
diff view generated by jsdifflib
1
From: Eric Auger <eric.auger@redhat.com>
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.
2
5
3
After commit 4e4fa6c12d ("accel/tcg: Complete cpu initialization
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
before registration"), it looks the CPUJumpCache pointer can be NULL.
5
This causes a SIGSEV when running debug-wp-migration kvm unit test.
6
7
At the first place it should be clarified why this TCG code is called
8
with KVM acceleration. This may hide another bug.
9
10
Fixes: 4e4fa6c12d ("accel/tcg: Complete cpu initialization before registration")
11
Signed-off-by: Eric Auger <eric.auger@redhat.com>
12
Message-Id: <20230203171510.2867451-1-eric.auger@redhat.com>
13
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
---
8
---
15
accel/tcg/cputlb.c | 7 ++++++-
9
include/tcg/tcg-opc.h | 8 ++++----
16
1 file changed, 6 insertions(+), 1 deletion(-)
10
tcg/tcg.c | 3 ---
11
2 files changed, 4 insertions(+), 7 deletions(-)
17
12
18
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
13
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
19
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
20
--- a/accel/tcg/cputlb.c
15
--- a/include/tcg/tcg-opc.h
21
+++ b/accel/tcg/cputlb.c
16
+++ b/include/tcg/tcg-opc.h
22
@@ -XXX,XX +XXX,XX @@ static void tlb_window_reset(CPUTLBDesc *desc, int64_t ns,
17
@@ -XXX,XX +XXX,XX @@ DEF(set_label, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
23
18
/* variable number of parameters */
24
static void tb_jmp_cache_clear_page(CPUState *cpu, target_ulong page_addr)
19
DEF(call, 0, 0, 3, TCG_OPF_CALL_CLOBBER | TCG_OPF_NOT_PRESENT)
25
{
20
26
- int i, i0 = tb_jmp_cache_hash_page(page_addr);
21
-DEF(br, 0, 0, 1, TCG_OPF_BB_END)
27
CPUJumpCache *jc = cpu->tb_jmp_cache;
22
+DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
28
+ int i, i0;
23
29
24
#define IMPL(X) (__builtin_constant_p(X) && (X) <= 0 ? TCG_OPF_NOT_PRESENT : 0)
30
+ if (unlikely(!jc)) {
25
#if TCG_TARGET_REG_BITS == 32
31
+ return;
26
@@ -XXX,XX +XXX,XX @@ DEF(br, 0, 0, 1, TCG_OPF_BB_END)
32
+ }
27
# define IMPL64 TCG_OPF_64BIT
33
+
28
#endif
34
+ i0 = tb_jmp_cache_hash_page(page_addr);
29
35
for (i = 0; i < TB_JMP_PAGE_SIZE; i++) {
30
-DEF(mb, 0, 0, 1, 0)
36
qatomic_set(&jc->array[i0 + i].tb, NULL);
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;
37
}
59
}
38
--
60
--
39
2.34.1
61
2.43.0
62
63
diff view generated by jsdifflib
1
Pack the quotient and remainder into a single Int128.
1
Allow the backend to make constraint choices based on more parameters.
2
Use the divu128 primitive to remove the cpu_abort on
3
32-bit hosts.
4
2
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
5
---
9
v2: Extended div test case to cover these insns.
6
tcg/tcg.c | 4 ++--
10
---
7
tcg/aarch64/tcg-target.c.inc | 3 ++-
11
target/s390x/helper.h | 4 ++--
8
tcg/arm/tcg-target.c.inc | 3 ++-
12
target/s390x/tcg/int_helper.c | 38 +++++++++--------------------------
9
tcg/i386/tcg-target.c.inc | 3 ++-
13
target/s390x/tcg/translate.c | 14 +++++++++----
10
tcg/loongarch64/tcg-target.c.inc | 3 ++-
14
tests/tcg/s390x/div.c | 35 ++++++++++++++++++++++++++++++++
11
tcg/mips/tcg-target.c.inc | 3 ++-
15
4 files changed, 56 insertions(+), 35 deletions(-)
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(-)
16
18
17
diff --git a/target/s390x/helper.h b/target/s390x/helper.h
19
diff --git a/tcg/tcg.c b/tcg/tcg.c
18
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
19
--- a/target/s390x/helper.h
21
--- a/tcg/tcg.c
20
+++ b/target/s390x/helper.h
22
+++ b/tcg/tcg.c
21
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(clcl, i32, env, i32, i32)
23
@@ -XXX,XX +XXX,XX @@ typedef enum {
22
DEF_HELPER_FLAGS_4(clm, TCG_CALL_NO_WG, i32, env, i32, i32, i64)
24
#include "tcg-target-con-set.h"
23
DEF_HELPER_FLAGS_3(divs32, TCG_CALL_NO_WG, i64, env, s64, s64)
25
} TCGConstraintSetIndex;
24
DEF_HELPER_FLAGS_3(divu32, TCG_CALL_NO_WG, i64, env, i64, i64)
26
25
-DEF_HELPER_FLAGS_3(divs64, TCG_CALL_NO_WG, s64, env, s64, s64)
27
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode);
26
-DEF_HELPER_FLAGS_4(divu64, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
28
+static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode, TCGType, unsigned);
27
+DEF_HELPER_FLAGS_3(divs64, TCG_CALL_NO_WG, i128, env, s64, s64)
29
28
+DEF_HELPER_FLAGS_4(divu64, TCG_CALL_NO_WG, i128, env, i64, i64, i64)
30
#undef C_O0_I1
29
DEF_HELPER_3(srst, void, env, i32, i32)
31
#undef C_O0_I2
30
DEF_HELPER_3(srstu, void, env, i32, i32)
32
@@ -XXX,XX +XXX,XX @@ static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
31
DEF_HELPER_4(clst, i64, env, i64, i64, i64)
33
return empty_cts;
32
diff --git a/target/s390x/tcg/int_helper.c b/target/s390x/tcg/int_helper.c
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. */
41
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
33
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
34
--- a/target/s390x/tcg/int_helper.c
43
--- a/tcg/aarch64/tcg-target.c.inc
35
+++ b/target/s390x/tcg/int_helper.c
44
+++ b/tcg/aarch64/tcg-target.c.inc
36
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(divu32)(CPUS390XState *env, uint64_t a, uint64_t b64)
45
@@ -XXX,XX +XXX,XX @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
46
}
37
}
47
}
38
48
39
/* 64/64 -> 64 signed division */
49
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
40
-int64_t HELPER(divs64)(CPUS390XState *env, int64_t a, int64_t b)
50
+static TCGConstraintSetIndex
41
+Int128 HELPER(divs64)(CPUS390XState *env, int64_t a, int64_t b)
51
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
42
{
52
{
43
/* Catch divide by zero, and non-representable quotient (MIN / -1). */
53
switch (op) {
44
if (b == 0 || (b == -1 && a == (1ll << 63))) {
54
case INDEX_op_goto_ptr:
45
tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
55
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
56
index XXXXXXX..XXXXXXX 100644
57
--- a/tcg/arm/tcg-target.c.inc
58
+++ b/tcg/arm/tcg-target.c.inc
59
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
46
}
60
}
47
- env->retxl = a % b;
48
- return a / b;
49
+ return int128_make128(a / b, a % b);
50
}
61
}
51
62
52
/* 128 -> 64/64 unsigned division */
63
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
53
-uint64_t HELPER(divu64)(CPUS390XState *env, uint64_t ah, uint64_t al,
64
+static TCGConstraintSetIndex
54
- uint64_t b)
65
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
55
+Int128 HELPER(divu64)(CPUS390XState *env, uint64_t ah, uint64_t al, uint64_t b)
56
{
66
{
57
- uint64_t ret;
67
switch (op) {
58
- /* Signal divide by zero. */
68
case INDEX_op_goto_ptr:
59
- if (b == 0) {
69
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
60
- tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
70
index XXXXXXX..XXXXXXX 100644
61
- }
71
--- a/tcg/i386/tcg-target.c.inc
62
- if (ah == 0) {
72
+++ b/tcg/i386/tcg-target.c.inc
63
- /* 64 -> 64/64 case */
73
@@ -XXX,XX +XXX,XX @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
64
- env->retxl = al % b;
65
- ret = al / b;
66
- } else {
67
- /* ??? Move i386 idivq helper to host-utils. */
68
-#ifdef CONFIG_INT128
69
- __uint128_t a = ((__uint128_t)ah << 64) | al;
70
- __uint128_t q = a / b;
71
- env->retxl = a % b;
72
- ret = q;
73
- if (ret != q) {
74
- tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
75
+ if (b != 0) {
76
+ uint64_t r = divu128(&al, &ah, b);
77
+ if (ah == 0) {
78
+ return int128_make128(al, r);
79
}
80
-#else
81
- /* 32-bit hosts would need special wrapper functionality - just abort if
82
- we encounter such a case; it's very unlikely anyways. */
83
- cpu_abort(env_cpu(env), "128 -> 64/64 division not implemented\n");
84
-#endif
85
}
74
}
86
- return ret;
87
+ /* divide by zero or overflow */
88
+ tcg_s390_program_interrupt(env, PGM_FIXPT_DIVIDE, GETPC());
89
}
75
}
90
76
91
uint64_t HELPER(cvd)(int32_t reg)
77
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
92
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
78
+static TCGConstraintSetIndex
79
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
80
{
81
switch (op) {
82
case INDEX_op_goto_ptr:
83
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
93
index XXXXXXX..XXXXXXX 100644
84
index XXXXXXX..XXXXXXX 100644
94
--- a/target/s390x/tcg/translate.c
85
--- a/tcg/loongarch64/tcg-target.c.inc
95
+++ b/target/s390x/tcg/translate.c
86
+++ b/tcg/loongarch64/tcg-target.c.inc
96
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_divu32(DisasContext *s, DisasOps *o)
87
@@ -XXX,XX +XXX,XX @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
97
88
g_assert_not_reached();
98
static DisasJumpType op_divs64(DisasContext *s, DisasOps *o)
89
}
90
91
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
92
+static TCGConstraintSetIndex
93
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
99
{
94
{
100
- gen_helper_divs64(o->out2, cpu_env, o->in1, o->in2);
95
switch (op) {
101
- return_low128(o->out);
96
case INDEX_op_goto_ptr:
102
+ TCGv_i128 t = tcg_temp_new_i128();
97
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
103
+
98
index XXXXXXX..XXXXXXX 100644
104
+ gen_helper_divs64(t, cpu_env, o->in1, o->in2);
99
--- a/tcg/mips/tcg-target.c.inc
105
+ tcg_gen_extr_i128_i64(o->out2, o->out, t);
100
+++ b/tcg/mips/tcg-target.c.inc
106
+ tcg_temp_free_i128(t);
101
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
107
return DISAS_NEXT;
102
}
108
}
103
}
109
104
110
static DisasJumpType op_divu64(DisasContext *s, DisasOps *o)
105
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
106
+static TCGConstraintSetIndex
107
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
111
{
108
{
112
- gen_helper_divu64(o->out2, cpu_env, o->out, o->out2, o->in2);
109
switch (op) {
113
- return_low128(o->out);
110
case INDEX_op_goto_ptr:
114
+ TCGv_i128 t = tcg_temp_new_i128();
111
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
115
+
112
index XXXXXXX..XXXXXXX 100644
116
+ gen_helper_divu64(t, cpu_env, o->out, o->out2, o->in2);
113
--- a/tcg/ppc/tcg-target.c.inc
117
+ tcg_gen_extr_i128_i64(o->out2, o->out, t);
114
+++ b/tcg/ppc/tcg-target.c.inc
118
+ tcg_temp_free_i128(t);
115
@@ -XXX,XX +XXX,XX @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
119
return DISAS_NEXT;
116
va_end(va);
120
}
117
}
121
118
122
diff --git a/tests/tcg/s390x/div.c b/tests/tcg/s390x/div.c
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
123
index XXXXXXX..XXXXXXX 100644
126
index XXXXXXX..XXXXXXX 100644
124
--- a/tests/tcg/s390x/div.c
127
--- a/tcg/riscv/tcg-target.c.inc
125
+++ b/tests/tcg/s390x/div.c
128
+++ b/tcg/riscv/tcg-target.c.inc
126
@@ -XXX,XX +XXX,XX @@ static void test_dlr(void)
129
@@ -XXX,XX +XXX,XX @@ int tcg_can_emit_vec_op(TCGOpcode opc, TCGType type, unsigned vece)
127
assert(r == 1);
130
}
128
}
131
}
129
132
130
+static void test_dsgr(void)
133
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
131
+{
134
+static TCGConstraintSetIndex
132
+ register int64_t r0 asm("r0") = -1;
135
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
133
+ register int64_t r1 asm("r1") = -4241;
134
+ int64_t b = 101, q, r;
135
+
136
+ asm("dsgr %[r0],%[b]"
137
+ : [r0] "+r" (r0), [r1] "+r" (r1)
138
+ : [b] "r" (b)
139
+ : "cc");
140
+ q = r1;
141
+ r = r0;
142
+ assert(q == -41);
143
+ assert(r == -100);
144
+}
145
+
146
+static void test_dlgr(void)
147
+{
148
+ register uint64_t r0 asm("r0") = 0;
149
+ register uint64_t r1 asm("r1") = 4243;
150
+ uint64_t b = 101, q, r;
151
+
152
+ asm("dlgr %[r0],%[b]"
153
+ : [r0] "+r" (r0), [r1] "+r" (r1)
154
+ : [b] "r" (b)
155
+ : "cc");
156
+ q = r1;
157
+ r = r0;
158
+ assert(q == 42);
159
+ assert(r == 1);
160
+}
161
+
162
int main(void)
163
{
136
{
164
test_dr();
137
switch (op) {
165
test_dlr();
138
case INDEX_op_goto_ptr:
166
+ test_dsgr();
139
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
167
+ test_dlgr();
140
index XXXXXXX..XXXXXXX 100644
168
+ return 0;
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);
169
}
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
157
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
158
}
159
}
160
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:
170
--
181
--
171
2.34.1
182
2.43.0
172
183
173
184
diff view generated by jsdifflib
1
Replace the flat array tcg_target_call_oarg_regs[] with
1
Pass TCGOp.type to the output function.
2
a function call including the TCGCallReturnKind.
2
For aarch64 and tci, use this instead of testing TCG_OPF_64BIT.
3
3
For s390x, use this instead of testing INDEX_op_deposit_i64.
4
Extend the set of registers for ARM to r0-r3 to match the ABI:
4
For i386, use this to initialize rexw.
5
https://github.com/ARM-software/abi-aa/blob/main/aapcs32/aapcs32.rst#result-return
5
6
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
---
8
---
11
tcg/tcg.c | 9 ++++++---
9
tcg/tcg.c | 4 ++--
12
tcg/aarch64/tcg-target.c.inc | 10 +++++++---
10
tcg/aarch64/tcg-target.c.inc | 6 +-----
13
tcg/arm/tcg-target.c.inc | 10 +++++++---
11
tcg/arm/tcg-target.c.inc | 2 +-
14
tcg/i386/tcg-target.c.inc | 16 ++++++++++------
12
tcg/i386/tcg-target.c.inc | 10 +++++-----
15
tcg/loongarch64/tcg-target.c.inc | 10 ++++++----
13
tcg/loongarch64/tcg-target.c.inc | 2 +-
16
tcg/mips/tcg-target.c.inc | 10 ++++++----
14
tcg/mips/tcg-target.c.inc | 2 +-
17
tcg/ppc/tcg-target.c.inc | 10 ++++++----
15
tcg/ppc/tcg-target.c.inc | 2 +-
18
tcg/riscv/tcg-target.c.inc | 10 ++++++----
16
tcg/riscv/tcg-target.c.inc | 2 +-
19
tcg/s390x/tcg-target.c.inc | 9 ++++++---
17
tcg/s390x/tcg-target.c.inc | 7 +++----
20
tcg/sparc64/tcg-target.c.inc | 12 ++++++------
18
tcg/sparc64/tcg-target.c.inc | 2 +-
21
tcg/tci/tcg-target.c.inc | 12 ++++++------
19
tcg/tci/tcg-target.c.inc | 4 ++--
22
11 files changed, 72 insertions(+), 46 deletions(-)
20
11 files changed, 19 insertions(+), 24 deletions(-)
23
21
24
diff --git a/tcg/tcg.c b/tcg/tcg.c
22
diff --git a/tcg/tcg.c b/tcg/tcg.c
25
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
26
--- a/tcg/tcg.c
24
--- a/tcg/tcg.c
27
+++ b/tcg/tcg.c
25
+++ b/tcg/tcg.c
28
@@ -XXX,XX +XXX,XX @@ static bool tcg_out_sti(TCGContext *s, TCGType type, TCGArg val,
26
@@ -XXX,XX +XXX,XX @@ static void tcg_out_addi_ptr(TCGContext *s, TCGReg, TCGReg, tcg_target_long);
29
TCGReg base, intptr_t ofs);
27
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2);
30
static void tcg_out_call(TCGContext *s, const tcg_insn_unit *target,
28
static void tcg_out_exit_tb(TCGContext *s, uintptr_t arg);
31
const TCGHelperInfo *info);
29
static void tcg_out_goto_tb(TCGContext *s, int which);
32
+static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot);
30
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
33
static bool tcg_target_const_match(int64_t val, TCGType type, int ct);
31
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
34
#ifdef TCG_TARGET_NEED_LDST_LABELS
32
const TCGArg args[TCG_MAX_OP_ARGS],
35
static int tcg_out_ldst_finalize(TCGContext *s);
33
const int const_args[TCG_MAX_OP_ARGS]);
36
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
34
#if TCG_TARGET_MAYBE_vec
37
case dh_typecode_s64:
35
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
38
info->nr_out = 64 / TCG_TARGET_REG_BITS;
36
tcg_out_vec_op(s, op->opc, TCGOP_TYPE(op) - TCG_TYPE_V64,
39
info->out_kind = TCG_CALL_RET_NORMAL;
37
TCGOP_VECE(op), new_args, const_args);
40
- assert(info->nr_out <= ARRAY_SIZE(tcg_target_call_oarg_regs));
38
} else {
41
+ /* Query the last register now to trigger any assert early. */
39
- tcg_out_op(s, op->opc, new_args, const_args);
42
+ tcg_target_call_oarg_reg(info->out_kind, info->nr_out - 1);
40
+ tcg_out_op(s, op->opc, TCGOP_TYPE(op), new_args, const_args);
41
}
43
break;
42
break;
44
case dh_typecode_i128:
43
}
45
info->nr_out = 128 / TCG_TARGET_REG_BITS;
46
info->out_kind = TCG_CALL_RET_NORMAL; /* TODO */
47
switch (/* TODO */ TCG_CALL_RET_NORMAL) {
48
case TCG_CALL_RET_NORMAL:
49
- assert(info->nr_out <= ARRAY_SIZE(tcg_target_call_oarg_regs));
50
+ /* Query the last register now to trigger any assert early. */
51
+ tcg_target_call_oarg_reg(info->out_kind, info->nr_out - 1);
52
break;
53
case TCG_CALL_RET_BY_REF:
54
/*
55
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_call(TCGContext *s, TCGOp *op)
56
case TCG_CALL_RET_NORMAL:
57
for (i = 0; i < nb_oargs; i++) {
58
TCGTemp *ts = arg_temp(op->args[i]);
59
- TCGReg reg = tcg_target_call_oarg_regs[i];
60
+ TCGReg reg = tcg_target_call_oarg_reg(TCG_CALL_RET_NORMAL, i);
61
62
/* ENV should not be modified. */
63
tcg_debug_assert(!temp_readonly(ts));
64
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
65
index XXXXXXX..XXXXXXX 100644
45
index XXXXXXX..XXXXXXX 100644
66
--- a/tcg/aarch64/tcg-target.c.inc
46
--- a/tcg/aarch64/tcg-target.c.inc
67
+++ b/tcg/aarch64/tcg-target.c.inc
47
+++ b/tcg/aarch64/tcg-target.c.inc
68
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_call_iarg_regs[8] = {
48
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
69
TCG_REG_X0, TCG_REG_X1, TCG_REG_X2, TCG_REG_X3,
49
flush_idcache_range(jmp_rx, jmp_rw, 4);
70
TCG_REG_X4, TCG_REG_X5, TCG_REG_X6, TCG_REG_X7
50
}
71
};
51
72
-static const int tcg_target_call_oarg_regs[1] = {
52
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
73
- TCG_REG_X0
53
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
74
-};
54
const TCGArg args[TCG_MAX_OP_ARGS],
75
+
55
const int const_args[TCG_MAX_OP_ARGS])
76
+static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
56
{
77
+{
57
- /* 99% of the time, we can signal the use of extension registers
78
+ tcg_debug_assert(kind == TCG_CALL_RET_NORMAL);
58
- by looking to see if the opcode handles 64-bit data. */
79
+ tcg_debug_assert(slot >= 0 && slot <= 1);
59
- TCGType ext = (tcg_op_defs[opc].flags & TCG_OPF_64BIT) != 0;
80
+ return TCG_REG_X0 + slot;
60
-
81
+}
61
/* Hoist the loads of the most common arguments. */
82
62
TCGArg a0 = args[0];
83
#define TCG_REG_TMP TCG_REG_X30
63
TCGArg a1 = args[1];
84
#define TCG_VEC_TMP TCG_REG_V31
85
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
64
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
86
index XXXXXXX..XXXXXXX 100644
65
index XXXXXXX..XXXXXXX 100644
87
--- a/tcg/arm/tcg-target.c.inc
66
--- a/tcg/arm/tcg-target.c.inc
88
+++ b/tcg/arm/tcg-target.c.inc
67
+++ b/tcg/arm/tcg-target.c.inc
89
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_reg_alloc_order[] = {
68
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
90
static const int tcg_target_call_iarg_regs[4] = {
69
flush_idcache_range(jmp_rx, jmp_rw, 4);
91
TCG_REG_R0, TCG_REG_R1, TCG_REG_R2, TCG_REG_R3
70
}
92
};
71
93
-static const int tcg_target_call_oarg_regs[2] = {
72
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
94
- TCG_REG_R0, TCG_REG_R1
73
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
95
-};
74
const TCGArg args[TCG_MAX_OP_ARGS],
96
+
75
const int const_args[TCG_MAX_OP_ARGS])
97
+static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
76
{
98
+{
99
+ tcg_debug_assert(kind == TCG_CALL_RET_NORMAL);
100
+ tcg_debug_assert(slot >= 0 && slot <= 3);
101
+ return TCG_REG_R0 + slot;
102
+}
103
104
#define TCG_REG_TMP TCG_REG_R12
105
#define TCG_VEC_TMP TCG_REG_Q15
106
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
77
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
107
index XXXXXXX..XXXXXXX 100644
78
index XXXXXXX..XXXXXXX 100644
108
--- a/tcg/i386/tcg-target.c.inc
79
--- a/tcg/i386/tcg-target.c.inc
109
+++ b/tcg/i386/tcg-target.c.inc
80
+++ b/tcg/i386/tcg-target.c.inc
110
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_call_iarg_regs[] = {
81
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
111
#endif
82
/* no need to flush icache explicitly */
112
};
83
}
113
84
114
-static const int tcg_target_call_oarg_regs[] = {
85
-static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
115
- TCG_REG_EAX,
86
- const TCGArg args[TCG_MAX_OP_ARGS],
116
-#if TCG_TARGET_REG_BITS == 32
87
- const int const_args[TCG_MAX_OP_ARGS])
117
- TCG_REG_EDX
88
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
118
-#endif
89
+ const TCGArg args[TCG_MAX_OP_ARGS],
119
-};
90
+ const int const_args[TCG_MAX_OP_ARGS])
120
+static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
91
{
121
+{
92
TCGArg a0, a1, a2;
122
+ switch (kind) {
93
- int c, const_a2, vexop, rexw = 0;
123
+ case TCG_CALL_RET_NORMAL:
94
+ int c, const_a2, vexop, rexw;
124
+ tcg_debug_assert(slot >= 0 && slot <= 1);
95
125
+ return slot ? TCG_REG_EDX : TCG_REG_EAX;
96
#if TCG_TARGET_REG_BITS == 64
126
+ default:
97
# define OP_32_64(x) \
127
+ g_assert_not_reached();
98
case glue(glue(INDEX_op_, x), _i64): \
128
+ }
99
- rexw = P_REXW; /* FALLTHRU */ \
129
+}
100
case glue(glue(INDEX_op_, x), _i32)
130
101
#else
131
/* Constants we accept. */
102
# define OP_32_64(x) \
132
#define TCG_CT_CONST_S32 0x100
103
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
104
a1 = args[1];
105
a2 = args[2];
106
const_a2 = const_args[2];
107
+ rexw = type == TCG_TYPE_I32 ? 0 : P_REXW;
108
109
switch (opc) {
110
case INDEX_op_goto_ptr:
133
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
111
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
134
index XXXXXXX..XXXXXXX 100644
112
index XXXXXXX..XXXXXXX 100644
135
--- a/tcg/loongarch64/tcg-target.c.inc
113
--- a/tcg/loongarch64/tcg-target.c.inc
136
+++ b/tcg/loongarch64/tcg-target.c.inc
114
+++ b/tcg/loongarch64/tcg-target.c.inc
137
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_call_iarg_regs[] = {
115
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
138
TCG_REG_A7,
116
flush_idcache_range(jmp_rx, jmp_rw, 4);
139
};
117
}
140
118
141
-static const int tcg_target_call_oarg_regs[] = {
119
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
142
- TCG_REG_A0,
120
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
143
- TCG_REG_A1,
121
const TCGArg args[TCG_MAX_OP_ARGS],
144
-};
122
const int const_args[TCG_MAX_OP_ARGS])
145
+static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
123
{
146
+{
147
+ tcg_debug_assert(kind == TCG_CALL_RET_NORMAL);
148
+ tcg_debug_assert(slot >= 0 && slot <= 1);
149
+ return TCG_REG_A0 + slot;
150
+}
151
152
#ifndef CONFIG_SOFTMMU
153
#define USE_GUEST_BASE (guest_base != 0)
154
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
124
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
155
index XXXXXXX..XXXXXXX 100644
125
index XXXXXXX..XXXXXXX 100644
156
--- a/tcg/mips/tcg-target.c.inc
126
--- a/tcg/mips/tcg-target.c.inc
157
+++ b/tcg/mips/tcg-target.c.inc
127
+++ b/tcg/mips/tcg-target.c.inc
158
@@ -XXX,XX +XXX,XX @@ static const TCGReg tcg_target_call_iarg_regs[] = {
128
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
159
#endif
129
/* Always indirect, nothing to do */
160
};
130
}
161
131
162
-static const TCGReg tcg_target_call_oarg_regs[2] = {
132
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
163
- TCG_REG_V0,
133
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
164
- TCG_REG_V1
134
const TCGArg args[TCG_MAX_OP_ARGS],
165
-};
135
const int const_args[TCG_MAX_OP_ARGS])
166
+static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
136
{
167
+{
168
+ tcg_debug_assert(kind == TCG_CALL_RET_NORMAL);
169
+ tcg_debug_assert(slot >= 0 && slot <= 1);
170
+ return TCG_REG_V0 + slot;
171
+}
172
173
static const tcg_insn_unit *tb_ret_addr;
174
static const tcg_insn_unit *bswap32_addr;
175
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
137
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
176
index XXXXXXX..XXXXXXX 100644
138
index XXXXXXX..XXXXXXX 100644
177
--- a/tcg/ppc/tcg-target.c.inc
139
--- a/tcg/ppc/tcg-target.c.inc
178
+++ b/tcg/ppc/tcg-target.c.inc
140
+++ b/tcg/ppc/tcg-target.c.inc
179
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_call_iarg_regs[] = {
141
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
180
TCG_REG_R10
142
flush_idcache_range(jmp_rx, jmp_rw, 4);
181
};
143
}
182
144
183
-static const int tcg_target_call_oarg_regs[] = {
145
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
184
- TCG_REG_R3,
146
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
185
- TCG_REG_R4
147
const TCGArg args[TCG_MAX_OP_ARGS],
186
-};
148
const int const_args[TCG_MAX_OP_ARGS])
187
+static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
149
{
188
+{
189
+ tcg_debug_assert(kind == TCG_CALL_RET_NORMAL);
190
+ tcg_debug_assert(slot >= 0 && slot <= 1);
191
+ return TCG_REG_R3 + slot;
192
+}
193
194
static const int tcg_target_callee_save_regs[] = {
195
#ifdef _CALL_DARWIN
196
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
150
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
197
index XXXXXXX..XXXXXXX 100644
151
index XXXXXXX..XXXXXXX 100644
198
--- a/tcg/riscv/tcg-target.c.inc
152
--- a/tcg/riscv/tcg-target.c.inc
199
+++ b/tcg/riscv/tcg-target.c.inc
153
+++ b/tcg/riscv/tcg-target.c.inc
200
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_call_iarg_regs[] = {
154
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
201
TCG_REG_A7,
155
flush_idcache_range(jmp_rx, jmp_rw, 4);
202
};
156
}
203
157
204
-static const int tcg_target_call_oarg_regs[] = {
158
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
205
- TCG_REG_A0,
159
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
206
- TCG_REG_A1,
160
const TCGArg args[TCG_MAX_OP_ARGS],
207
-};
161
const int const_args[TCG_MAX_OP_ARGS])
208
+static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
162
{
209
+{
210
+ tcg_debug_assert(kind == TCG_CALL_RET_NORMAL);
211
+ tcg_debug_assert(slot >= 0 && slot <= 1);
212
+ return TCG_REG_A0 + slot;
213
+}
214
215
#define TCG_CT_CONST_ZERO 0x100
216
#define TCG_CT_CONST_S12 0x200
217
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
163
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
218
index XXXXXXX..XXXXXXX 100644
164
index XXXXXXX..XXXXXXX 100644
219
--- a/tcg/s390x/tcg-target.c.inc
165
--- a/tcg/s390x/tcg-target.c.inc
220
+++ b/tcg/s390x/tcg-target.c.inc
166
+++ b/tcg/s390x/tcg-target.c.inc
221
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_call_iarg_regs[] = {
167
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
222
TCG_REG_R6,
168
case glue(glue(INDEX_op_,x),_i32): \
223
};
169
case glue(glue(INDEX_op_,x),_i64)
224
170
225
-static const int tcg_target_call_oarg_regs[] = {
171
-static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
226
- TCG_REG_R2,
172
- const TCGArg args[TCG_MAX_OP_ARGS],
227
-};
173
- const int const_args[TCG_MAX_OP_ARGS])
228
+static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
174
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
229
+{
175
+ const TCGArg args[TCG_MAX_OP_ARGS],
230
+ tcg_debug_assert(kind == TCG_CALL_RET_NORMAL);
176
+ const int const_args[TCG_MAX_OP_ARGS])
231
+ tcg_debug_assert(slot == 0);
177
{
232
+ return TCG_REG_R2;
178
S390Opcode op, op2;
233
+}
179
TCGArg a0, a1, a2;
234
180
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
235
#define S390_CC_EQ 8
181
/* Since we can't support "0Z" as a constraint, we allow a1 in
236
#define S390_CC_LT 4
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;
237
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
188
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
238
index XXXXXXX..XXXXXXX 100644
189
index XXXXXXX..XXXXXXX 100644
239
--- a/tcg/sparc64/tcg-target.c.inc
190
--- a/tcg/sparc64/tcg-target.c.inc
240
+++ b/tcg/sparc64/tcg-target.c.inc
191
+++ b/tcg/sparc64/tcg-target.c.inc
241
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_call_iarg_regs[6] = {
192
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
242
TCG_REG_O5,
193
{
243
};
194
}
244
195
245
-static const int tcg_target_call_oarg_regs[] = {
196
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
246
- TCG_REG_O0,
197
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
247
- TCG_REG_O1,
198
const TCGArg args[TCG_MAX_OP_ARGS],
248
- TCG_REG_O2,
199
const int const_args[TCG_MAX_OP_ARGS])
249
- TCG_REG_O3,
200
{
250
-};
251
+static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
252
+{
253
+ tcg_debug_assert(kind == TCG_CALL_RET_NORMAL);
254
+ tcg_debug_assert(slot >= 0 && slot <= 3);
255
+ return TCG_REG_O0 + slot;
256
+}
257
258
#define INSN_OP(x) ((x) << 30)
259
#define INSN_OP2(x) ((x) << 22)
260
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
201
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
261
index XXXXXXX..XXXXXXX 100644
202
index XXXXXXX..XXXXXXX 100644
262
--- a/tcg/tci/tcg-target.c.inc
203
--- a/tcg/tci/tcg-target.c.inc
263
+++ b/tcg/tci/tcg-target.c.inc
204
+++ b/tcg/tci/tcg-target.c.inc
264
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_reg_alloc_order[] = {
205
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
265
/* No call arguments via registers. All will be stored on the "stack". */
206
/* Always indirect, nothing to do */
266
static const int tcg_target_call_iarg_regs[] = { };
207
}
267
208
268
-static const int tcg_target_call_oarg_regs[] = {
209
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
269
- TCG_REG_R0,
210
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
270
-#if TCG_TARGET_REG_BITS == 32
211
const TCGArg args[TCG_MAX_OP_ARGS],
271
- TCG_REG_R1
212
const int const_args[TCG_MAX_OP_ARGS])
272
-#endif
213
{
273
-};
214
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
274
+static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
215
CASE_32_64(sextract) /* Optional (TCG_TARGET_HAS_sextract_*). */
275
+{
216
{
276
+ tcg_debug_assert(kind == TCG_CALL_RET_NORMAL);
217
TCGArg pos = args[2], len = args[3];
277
+ tcg_debug_assert(slot >= 0 && slot < 64 / TCG_TARGET_REG_BITS);
218
- TCGArg max = tcg_op_defs[opc].flags & TCG_OPF_64BIT ? 64 : 32;
278
+ return TCG_REG_R0 + slot;
219
+ TCGArg max = type == TCG_TYPE_I32 ? 32 : 64;
279
+}
220
280
221
tcg_debug_assert(pos < max);
281
#ifdef CONFIG_DEBUG_TCG
222
tcg_debug_assert(pos + len <= max);
282
static const char *const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
283
--
223
--
284
2.34.1
224
2.43.0
285
225
286
226
diff view generated by jsdifflib
1
Begin staging in support for TCGv_i128 with Int128.
1
This flag is no longer used.
2
Define the type enumerator, the typedef, and the
3
helper-head.h macros.
4
2
5
This cannot yet be used, because you can't allocate
6
temporaries of this new type.
7
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
---
5
---
12
include/exec/helper-head.h | 7 +++++++
6
include/tcg/tcg-opc.h | 22 +++++++++++-----------
13
include/tcg/tcg.h | 17 ++++++++++-------
7
include/tcg/tcg.h | 2 --
14
2 files changed, 17 insertions(+), 7 deletions(-)
8
2 files changed, 11 insertions(+), 13 deletions(-)
15
9
16
diff --git a/include/exec/helper-head.h b/include/exec/helper-head.h
10
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
17
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
18
--- a/include/exec/helper-head.h
12
--- a/include/tcg/tcg-opc.h
19
+++ b/include/exec/helper-head.h
13
+++ b/include/tcg/tcg-opc.h
20
@@ -XXX,XX +XXX,XX @@
14
@@ -XXX,XX +XXX,XX @@ DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
21
#define dh_alias_int i32
15
22
#define dh_alias_i64 i64
16
#define IMPL(X) (__builtin_constant_p(X) && (X) <= 0 ? TCG_OPF_NOT_PRESENT : 0)
23
#define dh_alias_s64 i64
17
#if TCG_TARGET_REG_BITS == 32
24
+#define dh_alias_i128 i128
18
-# define IMPL64 TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT
25
#define dh_alias_f16 i32
19
+# define IMPL64 TCG_OPF_NOT_PRESENT
26
#define dh_alias_f32 i32
20
#else
27
#define dh_alias_f64 i64
21
-# define IMPL64 TCG_OPF_64BIT
28
@@ -XXX,XX +XXX,XX @@
22
+# define IMPL64 0
29
#define dh_ctype_int int
23
#endif
30
#define dh_ctype_i64 uint64_t
24
31
#define dh_ctype_s64 int64_t
25
DEF(mb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
32
+#define dh_ctype_i128 Int128
26
@@ -XXX,XX +XXX,XX @@ DEF(clz_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_clz_i32))
33
#define dh_ctype_f16 uint32_t
27
DEF(ctz_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_ctz_i32))
34
#define dh_ctype_f32 float32
28
DEF(ctpop_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ctpop_i32))
35
#define dh_ctype_f64 float64
29
36
@@ -XXX,XX +XXX,XX @@
30
-DEF(mov_i64, 1, 1, 0, TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT)
37
#define dh_retvar_decl0_noreturn void
31
+DEF(mov_i64, 1, 1, 0, TCG_OPF_NOT_PRESENT)
38
#define dh_retvar_decl0_i32 TCGv_i32 retval
32
DEF(setcond_i64, 1, 2, 1, IMPL64)
39
#define dh_retvar_decl0_i64 TCGv_i64 retval
33
DEF(negsetcond_i64, 1, 2, 1, IMPL64 | IMPL(TCG_TARGET_HAS_negsetcond_i64))
40
+#define dh_retval_decl0_i128 TCGv_i128 retval
34
DEF(movcond_i64, 1, 4, 1, IMPL64)
41
#define dh_retvar_decl0_ptr TCGv_ptr retval
35
@@ -XXX,XX +XXX,XX @@ DEF(qemu_ld_a32_i32, 1, 1, 1,
42
#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
36
DEF(qemu_st_a32_i32, 0, 1 + 1, 1,
43
37
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
44
@@ -XXX,XX +XXX,XX @@
38
DEF(qemu_ld_a32_i64, DATA64_ARGS, 1, 1,
45
#define dh_retvar_decl_noreturn
39
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
46
#define dh_retvar_decl_i32 TCGv_i32 retval,
40
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
47
#define dh_retvar_decl_i64 TCGv_i64 retval,
41
DEF(qemu_st_a32_i64, 0, DATA64_ARGS + 1, 1,
48
+#define dh_retvar_decl_i128 TCGv_i128 retval,
42
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
49
#define dh_retvar_decl_ptr TCGv_ptr retval,
43
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
50
#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
44
51
45
DEF(qemu_ld_a64_i32, 1, DATA64_ARGS, 1,
52
@@ -XXX,XX +XXX,XX @@
46
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
53
#define dh_retvar_noreturn NULL
47
DEF(qemu_st_a64_i32, 0, 1 + DATA64_ARGS, 1,
54
#define dh_retvar_i32 tcgv_i32_temp(retval)
48
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
55
#define dh_retvar_i64 tcgv_i64_temp(retval)
49
DEF(qemu_ld_a64_i64, DATA64_ARGS, DATA64_ARGS, 1,
56
+#define dh_retvar_i128 tcgv_i128_temp(retval)
50
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
57
#define dh_retvar_ptr tcgv_ptr_temp(retval)
51
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
58
#define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
52
DEF(qemu_st_a64_i64, 0, DATA64_ARGS + DATA64_ARGS, 1,
59
53
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
60
@@ -XXX,XX +XXX,XX @@
54
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
61
#define dh_typecode_i64 4
55
62
#define dh_typecode_s64 5
56
/* Only used by i386 to cope with stupid register constraints. */
63
#define dh_typecode_ptr 6
57
DEF(qemu_st8_a32_i32, 0, 1 + 1, 1,
64
+#define dh_typecode_i128 7
58
@@ -XXX,XX +XXX,XX @@ DEF(qemu_st8_a64_i32, 0, 1 + DATA64_ARGS, 1,
65
#define dh_typecode_int dh_typecode_s32
59
66
#define dh_typecode_f16 dh_typecode_i32
60
/* Only for 64-bit hosts at the moment. */
67
#define dh_typecode_f32 dh_typecode_i32
61
DEF(qemu_ld_a32_i128, 2, 1, 1,
68
@@ -XXX,XX +XXX,XX @@
62
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
69
63
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
70
#define dh_callflag_i32 0
64
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
71
#define dh_callflag_i64 0
65
DEF(qemu_ld_a64_i128, 2, 1, 1,
72
+#define dh_callflag_i128 0
66
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
73
#define dh_callflag_ptr 0
67
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
74
#define dh_callflag_void 0
68
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
75
#define dh_callflag_noreturn TCG_CALL_NO_RETURN
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. */
76
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
79
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
77
index XXXXXXX..XXXXXXX 100644
80
index XXXXXXX..XXXXXXX 100644
78
--- a/include/tcg/tcg.h
81
--- a/include/tcg/tcg.h
79
+++ b/include/tcg/tcg.h
82
+++ b/include/tcg/tcg.h
80
@@ -XXX,XX +XXX,XX @@ typedef struct TCGPool {
83
@@ -XXX,XX +XXX,XX @@ enum {
81
typedef enum TCGType {
84
/* Instruction has side effects: it cannot be removed if its outputs
82
TCG_TYPE_I32,
85
are not used, and might trigger exceptions. */
83
TCG_TYPE_I64,
86
TCG_OPF_SIDE_EFFECTS = 0x08,
84
+ TCG_TYPE_I128,
87
- /* Instruction operands are 64-bits (otherwise 32-bits). */
85
88
- TCG_OPF_64BIT = 0x10,
86
TCG_TYPE_V64,
89
/* Instruction is optional and not implemented by the host, or insn
87
TCG_TYPE_V128,
90
is generic and should not be implemented by the host. */
88
@@ -XXX,XX +XXX,XX @@ typedef tcg_target_ulong TCGArg;
91
TCG_OPF_NOT_PRESENT = 0x20,
89
in tcg/README. Target CPU front-end code uses these types to deal
90
with TCG variables as it emits TCG code via the tcg_gen_* functions.
91
They come in several flavours:
92
- * TCGv_i32 : 32 bit integer type
93
- * TCGv_i64 : 64 bit integer type
94
- * TCGv_ptr : a host pointer type
95
- * TCGv_vec : a host vector type; the exact size is not exposed
96
- to the CPU front-end code.
97
- * TCGv : an integer type the same size as target_ulong
98
- (an alias for either TCGv_i32 or TCGv_i64)
99
+ * TCGv_i32 : 32 bit integer type
100
+ * TCGv_i64 : 64 bit integer type
101
+ * TCGv_i128 : 128 bit integer type
102
+ * TCGv_ptr : a host pointer type
103
+ * TCGv_vec : a host vector type; the exact size is not exposed
104
+ to the CPU front-end code.
105
+ * TCGv : an integer type the same size as target_ulong
106
+ (an alias for either TCGv_i32 or TCGv_i64)
107
The compiler's type checking will complain if you mix them
108
up and pass the wrong sized TCGv to a function.
109
110
@@ -XXX,XX +XXX,XX @@ typedef tcg_target_ulong TCGArg;
111
112
typedef struct TCGv_i32_d *TCGv_i32;
113
typedef struct TCGv_i64_d *TCGv_i64;
114
+typedef struct TCGv_i128_d *TCGv_i128;
115
typedef struct TCGv_ptr_d *TCGv_ptr;
116
typedef struct TCGv_vec_d *TCGv_vec;
117
typedef TCGv_ptr TCGv_env;
118
--
92
--
119
2.34.1
93
2.43.0
120
94
121
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
1
Use tcg_gen_atomic_cmpxchg_i128 for the atomic case,
1
We always provide bswap subroutines, whether they are optimized
2
and tcg_gen_qemu_ld/st_i128 otherwise.
2
using mips32r2 when available or not.
3
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
6
---
7
target/i386/helper.h | 4 ---
7
tcg/mips/tcg-target-has.h | 8 ++++----
8
target/i386/tcg/mem_helper.c | 69 ------------------------------------
8
1 file changed, 4 insertions(+), 4 deletions(-)
9
target/i386/tcg/translate.c | 44 ++++++++++++++++++++---
10
3 files changed, 39 insertions(+), 78 deletions(-)
11
9
12
diff --git a/target/i386/helper.h b/target/i386/helper.h
10
diff --git a/tcg/mips/tcg-target-has.h b/tcg/mips/tcg-target-has.h
13
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
14
--- a/target/i386/helper.h
12
--- a/tcg/mips/tcg-target-has.h
15
+++ b/target/i386/helper.h
13
+++ b/tcg/mips/tcg-target-has.h
16
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_1(rsm, void, env)
14
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
17
#endif /* !CONFIG_USER_ONLY */
15
#define TCG_TARGET_HAS_muls2_i32 (!use_mips32r6_instructions)
18
16
#define TCG_TARGET_HAS_muluh_i32 1
19
DEF_HELPER_2(into, void, env, int)
17
#define TCG_TARGET_HAS_mulsh_i32 1
20
-#ifdef TARGET_X86_64
18
+#define TCG_TARGET_HAS_bswap16_i32 1
21
-DEF_HELPER_2(cmpxchg16b_unlocked, void, env, tl)
19
#define TCG_TARGET_HAS_bswap32_i32 1
22
-DEF_HELPER_2(cmpxchg16b, void, env, tl)
20
#define TCG_TARGET_HAS_negsetcond_i32 0
23
-#endif
21
24
DEF_HELPER_FLAGS_1(single_step, TCG_CALL_NO_WG, noreturn, env)
22
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
25
DEF_HELPER_1(rechecking_single_step, void, env)
26
DEF_HELPER_1(cpuid, void, env)
27
diff --git a/target/i386/tcg/mem_helper.c b/target/i386/tcg/mem_helper.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/target/i386/tcg/mem_helper.c
30
+++ b/target/i386/tcg/mem_helper.c
31
@@ -XXX,XX +XXX,XX @@
32
#include "tcg/tcg.h"
33
#include "helper-tcg.h"
34
35
-#ifdef TARGET_X86_64
36
-void helper_cmpxchg16b_unlocked(CPUX86State *env, target_ulong a0)
37
-{
38
- uintptr_t ra = GETPC();
39
- Int128 oldv, cmpv, newv;
40
- uint64_t o0, o1;
41
- int eflags;
42
- bool success;
43
-
44
- if ((a0 & 0xf) != 0) {
45
- raise_exception_ra(env, EXCP0D_GPF, GETPC());
46
- }
47
- eflags = cpu_cc_compute_all(env, CC_OP);
48
-
49
- cmpv = int128_make128(env->regs[R_EAX], env->regs[R_EDX]);
50
- newv = int128_make128(env->regs[R_EBX], env->regs[R_ECX]);
51
-
52
- o0 = cpu_ldq_data_ra(env, a0 + 0, ra);
53
- o1 = cpu_ldq_data_ra(env, a0 + 8, ra);
54
-
55
- oldv = int128_make128(o0, o1);
56
- success = int128_eq(oldv, cmpv);
57
- if (!success) {
58
- newv = oldv;
59
- }
60
-
61
- cpu_stq_data_ra(env, a0 + 0, int128_getlo(newv), ra);
62
- cpu_stq_data_ra(env, a0 + 8, int128_gethi(newv), ra);
63
-
64
- if (success) {
65
- eflags |= CC_Z;
66
- } else {
67
- env->regs[R_EAX] = int128_getlo(oldv);
68
- env->regs[R_EDX] = int128_gethi(oldv);
69
- eflags &= ~CC_Z;
70
- }
71
- CC_SRC = eflags;
72
-}
73
-
74
-void helper_cmpxchg16b(CPUX86State *env, target_ulong a0)
75
-{
76
- uintptr_t ra = GETPC();
77
-
78
- if ((a0 & 0xf) != 0) {
79
- raise_exception_ra(env, EXCP0D_GPF, ra);
80
- } else if (HAVE_CMPXCHG128) {
81
- int eflags = cpu_cc_compute_all(env, CC_OP);
82
-
83
- Int128 cmpv = int128_make128(env->regs[R_EAX], env->regs[R_EDX]);
84
- Int128 newv = int128_make128(env->regs[R_EBX], env->regs[R_ECX]);
85
-
86
- int mem_idx = cpu_mmu_index(env, false);
87
- MemOpIdx oi = make_memop_idx(MO_TE | MO_128 | MO_ALIGN, mem_idx);
88
- Int128 oldv = cpu_atomic_cmpxchgo_le_mmu(env, a0, cmpv, newv, oi, ra);
89
-
90
- if (int128_eq(oldv, cmpv)) {
91
- eflags |= CC_Z;
92
- } else {
93
- env->regs[R_EAX] = int128_getlo(oldv);
94
- env->regs[R_EDX] = int128_gethi(oldv);
95
- eflags &= ~CC_Z;
96
- }
97
- CC_SRC = eflags;
98
- } else {
99
- cpu_loop_exit_atomic(env_cpu(env), ra);
100
- }
101
-}
102
-#endif
103
-
104
void helper_boundw(CPUX86State *env, target_ulong a0, int v)
105
{
106
int low, high;
107
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
108
index XXXXXXX..XXXXXXX 100644
109
--- a/target/i386/tcg/translate.c
110
+++ b/target/i386/tcg/translate.c
111
@@ -XXX,XX +XXX,XX @@ static void gen_cmpxchg8b(DisasContext *s, CPUX86State *env, int modrm)
112
#ifdef TARGET_X86_64
113
static void gen_cmpxchg16b(DisasContext *s, CPUX86State *env, int modrm)
114
{
115
+ MemOp mop = MO_TE | MO_128 | MO_ALIGN;
116
+ TCGv_i64 t0, t1;
117
+ TCGv_i128 cmp, val;
118
+
119
gen_lea_modrm(env, s, modrm);
120
121
- if ((s->prefix & PREFIX_LOCK) &&
122
- (tb_cflags(s->base.tb) & CF_PARALLEL)) {
123
- gen_helper_cmpxchg16b(cpu_env, s->A0);
124
+ cmp = tcg_temp_new_i128();
125
+ val = tcg_temp_new_i128();
126
+ tcg_gen_concat_i64_i128(cmp, cpu_regs[R_EAX], cpu_regs[R_EDX]);
127
+ tcg_gen_concat_i64_i128(val, cpu_regs[R_EBX], cpu_regs[R_ECX]);
128
+
129
+ /* Only require atomic with LOCK; non-parallel handled in generator. */
130
+ if (s->prefix & PREFIX_LOCK) {
131
+ tcg_gen_atomic_cmpxchg_i128(val, s->A0, cmp, val, s->mem_index, mop);
132
} else {
133
- gen_helper_cmpxchg16b_unlocked(cpu_env, s->A0);
134
+ tcg_gen_nonatomic_cmpxchg_i128(val, s->A0, cmp, val, s->mem_index, mop);
135
}
136
- set_cc_op(s, CC_OP_EFLAGS);
137
+
138
+ tcg_gen_extr_i128_i64(s->T0, s->T1, val);
139
+ tcg_temp_free_i128(cmp);
140
+ tcg_temp_free_i128(val);
141
+
142
+ /* Determine success after the fact. */
143
+ t0 = tcg_temp_new_i64();
144
+ t1 = tcg_temp_new_i64();
145
+ tcg_gen_xor_i64(t0, s->T0, cpu_regs[R_EAX]);
146
+ tcg_gen_xor_i64(t1, s->T1, cpu_regs[R_EDX]);
147
+ tcg_gen_or_i64(t0, t0, t1);
148
+ tcg_temp_free_i64(t1);
149
+
150
+ /* Update Z. */
151
+ gen_compute_eflags(s);
152
+ tcg_gen_setcondi_i64(TCG_COND_EQ, t0, t0, 0);
153
+ tcg_gen_deposit_tl(cpu_cc_src, cpu_cc_src, t0, ctz32(CC_Z), 1);
154
+ tcg_temp_free_i64(t0);
155
+
156
+ /*
157
+ * Extract the result values for the register pair. We may do this
158
+ * unconditionally, because on success (Z=1), the old value matches
159
+ * the previous value in RDX:RAX.
160
+ */
161
+ tcg_gen_mov_i64(cpu_regs[R_EAX], s->T0);
162
+ tcg_gen_mov_i64(cpu_regs[R_EDX], s->T1);
163
}
164
#endif
23
#endif
165
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
166
--
43
--
167
2.34.1
44
2.43.0
168
45
169
46
diff view generated by jsdifflib
1
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
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.
4
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
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
target/s390x/helper.h | 2 +-
8
tcg/i386/tcg-target.c.inc | 23 +++++++++++++++++++----
6
target/s390x/tcg/mem_helper.c | 7 +++----
9
1 file changed, 19 insertions(+), 4 deletions(-)
7
target/s390x/tcg/translate.c | 7 +++++--
8
3 files changed, 9 insertions(+), 7 deletions(-)
9
10
10
diff --git a/target/s390x/helper.h b/target/s390x/helper.h
11
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
11
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
12
--- a/target/s390x/helper.h
13
--- a/tcg/i386/tcg-target.c.inc
13
+++ b/target/s390x/helper.h
14
+++ b/tcg/i386/tcg-target.c.inc
14
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(unpka, TCG_CALL_NO_WG, i32, env, i64, i32, i64)
15
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_rolw_8(TCGContext *s, int reg)
15
DEF_HELPER_FLAGS_4(unpku, TCG_CALL_NO_WG, i32, env, i64, i32, i64)
16
16
DEF_HELPER_FLAGS_3(tp, TCG_CALL_NO_WG, i32, env, i64, i32)
17
static void tcg_out_ext8u(TCGContext *s, TCGReg dest, TCGReg src)
17
DEF_HELPER_FLAGS_4(tr, TCG_CALL_NO_WG, void, env, i32, i64, i64)
18
{
18
-DEF_HELPER_4(tre, i64, env, i64, i64, i64)
19
- /* movzbl */
19
+DEF_HELPER_4(tre, i128, env, i64, i64, i64)
20
- tcg_debug_assert(src < 4 || TCG_TARGET_REG_BITS == 64);
20
DEF_HELPER_4(trt, i32, env, i32, i64, i64)
21
+ if (TCG_TARGET_REG_BITS == 32 && src >= 4) {
21
DEF_HELPER_4(trtr, i32, env, i32, i64, i64)
22
+ tcg_out_mov(s, TCG_TYPE_I32, dest, src);
22
DEF_HELPER_5(trXX, i32, env, i32, i32, i32, i32)
23
+ if (dest >= 4) {
23
diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c
24
+ tcg_out_modrm(s, OPC_ARITH_EvIz, ARITH_AND, dest);
24
index XXXXXXX..XXXXXXX 100644
25
+ tcg_out32(s, 0xff);
25
--- a/target/s390x/tcg/mem_helper.c
26
+ return;
26
+++ b/target/s390x/tcg/mem_helper.c
27
+ }
27
@@ -XXX,XX +XXX,XX @@ void HELPER(tr)(CPUS390XState *env, uint32_t len, uint64_t array,
28
+ src = dest;
28
do_helper_tr(env, len, array, trans, GETPC());
29
+ }
30
tcg_out_modrm(s, OPC_MOVZBL + P_REXB_RM, dest, src);
29
}
31
}
30
32
31
-uint64_t HELPER(tre)(CPUS390XState *env, uint64_t array,
33
static void tcg_out_ext8s(TCGContext *s, TCGType type, TCGReg dest, TCGReg src)
32
- uint64_t len, uint64_t trans)
33
+Int128 HELPER(tre)(CPUS390XState *env, uint64_t array,
34
+ uint64_t len, uint64_t trans)
35
{
34
{
36
uintptr_t ra = GETPC();
35
int rexw = type == TCG_TYPE_I32 ? 0 : P_REXW;
37
uint8_t end = env->regs[0] & 0xff;
36
- /* movsbl */
38
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(tre)(CPUS390XState *env, uint64_t array,
37
- tcg_debug_assert(src < 4 || TCG_TARGET_REG_BITS == 64);
39
}
38
+
40
39
+ if (TCG_TARGET_REG_BITS == 32 && src >= 4) {
41
env->cc_op = cc;
40
+ tcg_out_mov(s, TCG_TYPE_I32, dest, src);
42
- env->retxl = len - i;
41
+ if (dest >= 4) {
43
- return array + i;
42
+ tcg_out_shifti(s, SHIFT_SHL, dest, 24);
44
+ return int128_make128(len - i, array + i);
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);
45
}
49
}
46
50
47
static inline uint32_t do_helper_trt(CPUS390XState *env, int len,
48
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/target/s390x/tcg/translate.c
51
+++ b/target/s390x/tcg/translate.c
52
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_tr(DisasContext *s, DisasOps *o)
53
54
static DisasJumpType op_tre(DisasContext *s, DisasOps *o)
55
{
56
- gen_helper_tre(o->out, cpu_env, o->out, o->out2, o->in2);
57
- return_low128(o->out2);
58
+ TCGv_i128 pair = tcg_temp_new_i128();
59
+
60
+ gen_helper_tre(pair, cpu_env, o->out, o->out2, o->in2);
61
+ tcg_gen_extr_i128_i64(o->out2, o->out, pair);
62
+ tcg_temp_free_i128(pair);
63
set_cc_static(s);
64
return DISAS_NEXT;
65
}
66
--
51
--
67
2.34.1
52
2.43.0
68
53
69
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
1
This case is trivial to implement inline.
1
Trivially mirrors TCG_TARGET_HAS_{s}extract_*.
2
2
3
Reviewed-by: David Hildenbrand <david@redhat.com>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
5
---
6
target/s390x/tcg/translate.c | 3 +++
6
tcg/aarch64/tcg-target-has.h | 3 +++
7
1 file changed, 3 insertions(+)
7
1 file changed, 3 insertions(+)
8
8
9
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
9
diff --git a/tcg/aarch64/tcg-target-has.h b/tcg/aarch64/tcg-target-has.h
10
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/s390x/tcg/translate.c
11
--- a/tcg/aarch64/tcg-target-has.h
12
+++ b/target/s390x/tcg/translate.c
12
+++ b/tcg/aarch64/tcg-target-has.h
13
@@ -XXX,XX +XXX,XX @@ static void gen_op_calc_cc(DisasContext *s)
13
@@ -XXX,XX +XXX,XX @@
14
/* env->cc_op already is the cc value */
14
#define TCG_TARGET_HAS_cmpsel_vec 0
15
break;
15
#define TCG_TARGET_HAS_tst_vec 1
16
case CC_OP_NZ:
16
17
+ tcg_gen_setcondi_i64(TCG_COND_NE, cc_dst, cc_dst, 0);
17
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
18
+ tcg_gen_extrl_i64_i32(cc_op, cc_dst);
18
+#define TCG_TARGET_sextract_valid(type, ofs, len) 1
19
+ break;
19
+
20
case CC_OP_ABS_64:
20
#endif
21
case CC_OP_NABS_64:
22
case CC_OP_ABS_32:
23
--
21
--
24
2.34.1
22
2.43.0
23
24
diff view generated by jsdifflib
1
'offset' should be bits [23:5] of LDR instruction, rather than [4:0].
1
We're about to change canonicalization of masks as extract
2
instead of and. Retain the andi expansion here.
2
3
3
Fixes: d59d83a1c388 ("tcg/aarch64: Reorg goto_tb implementation")
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Zenghui Yu <yuzenghui@huawei.com>
5
Reported-by: Zenghui Yu <yuzenghui@huawei.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
6
---
8
tcg/aarch64/tcg-target.c.inc | 2 +-
7
tcg/aarch64/tcg-target.c.inc | 7 ++++++-
9
1 file changed, 1 insertion(+), 1 deletion(-)
8
1 file changed, 6 insertions(+), 1 deletion(-)
10
9
11
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
12
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/aarch64/tcg-target.c.inc
12
--- a/tcg/aarch64/tcg-target.c.inc
14
+++ b/tcg/aarch64/tcg-target.c.inc
13
+++ b/tcg/aarch64/tcg-target.c.inc
15
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
14
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
16
ptrdiff_t i_offset = i_addr - jmp_rx;
15
17
16
case INDEX_op_extract_i64:
18
/* Note that we asserted this in range in tcg_out_goto_tb. */
17
case INDEX_op_extract_i32:
19
- insn = deposit32(I3305_LDR | TCG_REG_TMP, 0, 5, i_offset >> 2);
18
- tcg_out_ubfm(s, ext, a0, a1, a2, a2 + args[3] - 1);
20
+ insn = deposit32(I3305_LDR | TCG_REG_TMP, 5, 19, i_offset >> 2);
19
+ if (a2 == 0) {
21
}
20
+ uint64_t mask = MAKE_64BIT_MASK(0, args[3]);
22
qatomic_set((uint32_t *)jmp_rw, insn);
21
+ tcg_out_logicali(s, I3404_ANDI, ext, a0, a1, mask);
23
flush_idcache_range(jmp_rx, jmp_rw, 4);
22
+ } else {
23
+ tcg_out_ubfm(s, ext, a0, a1, a2, a2 + args[3] - 1);
24
+ }
25
break;
26
27
case INDEX_op_sextract_i64:
24
--
28
--
25
2.34.1
29
2.43.0
30
31
diff view generated by jsdifflib
1
Normally this is automatically handled by the CF_PARALLEL checks
1
The armv6 uxt and sxt opcodes have a 2-bit rotate field
2
with in tcg_gen_atomic_cmpxchg_i{32,64}, but x86 has a special
2
which supports extractions from ofs = {0,8,16,24}.
3
case of !PREFIX_LOCK where it always wants the non-atomic version.
3
Special case ofs = 0, len <= 8 as AND.
4
4
5
Split these out so that x86 does not have to roll its own.
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
7
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
---
7
---
10
include/tcg/tcg-op.h | 4 ++
8
tcg/arm/tcg-target-has.h | 21 ++++++++++++++--
11
tcg/tcg-op.c | 154 +++++++++++++++++++++++++++----------------
9
tcg/arm/tcg-target.c.inc | 54 +++++++++++++++++++++++++++++++++++-----
12
2 files changed, 101 insertions(+), 57 deletions(-)
10
2 files changed, 67 insertions(+), 8 deletions(-)
13
11
14
diff --git a/include/tcg/tcg-op.h b/include/tcg/tcg-op.h
12
diff --git a/tcg/arm/tcg-target-has.h b/tcg/arm/tcg-target-has.h
15
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
16
--- a/include/tcg/tcg-op.h
14
--- a/tcg/arm/tcg-target-has.h
17
+++ b/include/tcg/tcg-op.h
15
+++ b/tcg/arm/tcg-target-has.h
18
@@ -XXX,XX +XXX,XX @@ void tcg_gen_atomic_cmpxchg_i64(TCGv_i64, TCGv, TCGv_i64, TCGv_i64,
16
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
19
void tcg_gen_atomic_cmpxchg_i128(TCGv_i128, TCGv, TCGv_i128, TCGv_i128,
17
#define TCG_TARGET_HAS_ctz_i32 use_armv7_instructions
20
TCGArg, MemOp);
18
#define TCG_TARGET_HAS_ctpop_i32 0
21
19
#define TCG_TARGET_HAS_deposit_i32 use_armv7_instructions
22
+void tcg_gen_nonatomic_cmpxchg_i32(TCGv_i32, TCGv, TCGv_i32, TCGv_i32,
20
-#define TCG_TARGET_HAS_extract_i32 use_armv7_instructions
23
+ TCGArg, MemOp);
21
-#define TCG_TARGET_HAS_sextract_i32 use_armv7_instructions
24
+void tcg_gen_nonatomic_cmpxchg_i64(TCGv_i64, TCGv, TCGv_i64, TCGv_i64,
22
+#define TCG_TARGET_HAS_extract_i32 1
25
+ TCGArg, MemOp);
23
+#define TCG_TARGET_HAS_sextract_i32 1
26
void tcg_gen_nonatomic_cmpxchg_i128(TCGv_i128, TCGv, TCGv_i128, TCGv_i128,
24
#define TCG_TARGET_HAS_extract2_i32 1
27
TCGArg, MemOp);
25
#define TCG_TARGET_HAS_negsetcond_i32 1
28
26
#define TCG_TARGET_HAS_mulu2_i32 1
29
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
27
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
30
index XXXXXXX..XXXXXXX 100644
28
#define TCG_TARGET_HAS_cmpsel_vec 0
31
--- a/tcg/tcg-op.c
29
#define TCG_TARGET_HAS_tst_vec 1
32
+++ b/tcg/tcg-op.c
30
33
@@ -XXX,XX +XXX,XX @@ static void * const table_cmpxchg[(MO_SIZE | MO_BSWAP) + 1] = {
31
+static inline bool
34
WITH_ATOMIC128([MO_128 | MO_BE] = gen_helper_atomic_cmpxchgo_be)
32
+tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
35
};
36
37
+void tcg_gen_nonatomic_cmpxchg_i32(TCGv_i32 retv, TCGv addr, TCGv_i32 cmpv,
38
+ TCGv_i32 newv, TCGArg idx, MemOp memop)
39
+{
33
+{
40
+ TCGv_i32 t1 = tcg_temp_new_i32();
34
+ if (use_armv7_instructions) {
41
+ TCGv_i32 t2 = tcg_temp_new_i32();
35
+ return true; /* SBFX or UBFX */
42
+
43
+ tcg_gen_ext_i32(t2, cmpv, memop & MO_SIZE);
44
+
45
+ tcg_gen_qemu_ld_i32(t1, addr, idx, memop & ~MO_SIGN);
46
+ tcg_gen_movcond_i32(TCG_COND_EQ, t2, t1, t2, newv, t1);
47
+ tcg_gen_qemu_st_i32(t2, addr, idx, memop);
48
+ tcg_temp_free_i32(t2);
49
+
50
+ if (memop & MO_SIGN) {
51
+ tcg_gen_ext_i32(retv, t1, memop);
52
+ } else {
53
+ tcg_gen_mov_i32(retv, t1);
54
+ }
36
+ }
55
+ tcg_temp_free_i32(t1);
37
+ switch (len) {
38
+ case 8: /* SXTB or UXTB */
39
+ case 16: /* SXTH or UXTH */
40
+ return (ofs % 8) == 0;
41
+ }
42
+ return false;
56
+}
43
+}
57
+
44
+
58
void tcg_gen_atomic_cmpxchg_i32(TCGv_i32 retv, TCGv addr, TCGv_i32 cmpv,
45
+#define TCG_TARGET_extract_valid tcg_target_extract_valid
59
TCGv_i32 newv, TCGArg idx, MemOp memop)
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
50
index XXXXXXX..XXXXXXX 100644
51
--- a/tcg/arm/tcg-target.c.inc
52
+++ b/tcg/arm/tcg-target.c.inc
53
@@ -XXX,XX +XXX,XX @@ static void tcg_out_deposit(TCGContext *s, ARMCond cond, TCGReg rd,
54
static void tcg_out_extract(TCGContext *s, ARMCond cond, TCGReg rd,
55
TCGReg rn, int ofs, int len)
60
{
56
{
61
- memop = tcg_canonicalize_memop(memop, 0, 0);
57
- /* ubfx */
62
+ gen_atomic_cx_i32 gen;
58
- tcg_out32(s, 0x07e00050 | (cond << 28) | (rd << 12) | rn
63
+ MemOpIdx oi;
59
- | (ofs << 7) | ((len - 1) << 16));
64
60
+ /* According to gcc, AND can be faster. */
65
if (!(tcg_ctx->gen_tb->cflags & CF_PARALLEL)) {
61
+ if (ofs == 0 && len <= 8) {
66
- TCGv_i32 t1 = tcg_temp_new_i32();
62
+ tcg_out_dat_imm(s, cond, ARITH_AND, rd, rn,
67
- TCGv_i32 t2 = tcg_temp_new_i32();
63
+ encode_imm_nofail((1 << len) - 1));
68
-
69
- tcg_gen_ext_i32(t2, cmpv, memop & MO_SIZE);
70
-
71
- tcg_gen_qemu_ld_i32(t1, addr, idx, memop & ~MO_SIGN);
72
- tcg_gen_movcond_i32(TCG_COND_EQ, t2, t1, t2, newv, t1);
73
- tcg_gen_qemu_st_i32(t2, addr, idx, memop);
74
- tcg_temp_free_i32(t2);
75
-
76
- if (memop & MO_SIGN) {
77
- tcg_gen_ext_i32(retv, t1, memop);
78
- } else {
79
- tcg_gen_mov_i32(retv, t1);
80
- }
81
- tcg_temp_free_i32(t1);
82
- } else {
83
- gen_atomic_cx_i32 gen;
84
- MemOpIdx oi;
85
-
86
- gen = table_cmpxchg[memop & (MO_SIZE | MO_BSWAP)];
87
- tcg_debug_assert(gen != NULL);
88
-
89
- oi = make_memop_idx(memop & ~MO_SIGN, idx);
90
- gen(retv, cpu_env, addr, cmpv, newv, tcg_constant_i32(oi));
91
-
92
- if (memop & MO_SIGN) {
93
- tcg_gen_ext_i32(retv, retv, memop);
94
- }
95
+ tcg_gen_nonatomic_cmpxchg_i32(retv, addr, cmpv, newv, idx, memop);
96
+ return;
97
}
98
+
99
+ memop = tcg_canonicalize_memop(memop, 0, 0);
100
+ gen = table_cmpxchg[memop & (MO_SIZE | MO_BSWAP)];
101
+ tcg_debug_assert(gen != NULL);
102
+
103
+ oi = make_memop_idx(memop & ~MO_SIGN, idx);
104
+ gen(retv, cpu_env, addr, cmpv, newv, tcg_constant_i32(oi));
105
+
106
+ if (memop & MO_SIGN) {
107
+ tcg_gen_ext_i32(retv, retv, memop);
108
+ }
109
+}
110
+
111
+void tcg_gen_nonatomic_cmpxchg_i64(TCGv_i64 retv, TCGv addr, TCGv_i64 cmpv,
112
+ TCGv_i64 newv, TCGArg idx, MemOp memop)
113
+{
114
+ TCGv_i64 t1, t2;
115
+
116
+ if (TCG_TARGET_REG_BITS == 32 && (memop & MO_SIZE) < MO_64) {
117
+ tcg_gen_nonatomic_cmpxchg_i32(TCGV_LOW(retv), addr, TCGV_LOW(cmpv),
118
+ TCGV_LOW(newv), idx, memop);
119
+ if (memop & MO_SIGN) {
120
+ tcg_gen_sari_i32(TCGV_HIGH(retv), TCGV_LOW(retv), 31);
121
+ } else {
122
+ tcg_gen_movi_i32(TCGV_HIGH(retv), 0);
123
+ }
124
+ return;
64
+ return;
125
+ }
65
+ }
126
+
66
+
127
+ t1 = tcg_temp_new_i64();
67
+ if (use_armv7_instructions) {
128
+ t2 = tcg_temp_new_i64();
68
+ /* ubfx */
129
+
69
+ tcg_out32(s, 0x07e00050 | (cond << 28) | (rd << 12) | rn
130
+ tcg_gen_ext_i64(t2, cmpv, memop & MO_SIZE);
70
+ | (ofs << 7) | ((len - 1) << 16));
131
+
132
+ tcg_gen_qemu_ld_i64(t1, addr, idx, memop & ~MO_SIGN);
133
+ tcg_gen_movcond_i64(TCG_COND_EQ, t2, t1, t2, newv, t1);
134
+ tcg_gen_qemu_st_i64(t2, addr, idx, memop);
135
+ tcg_temp_free_i64(t2);
136
+
137
+ if (memop & MO_SIGN) {
138
+ tcg_gen_ext_i64(retv, t1, memop);
139
+ } else {
140
+ tcg_gen_mov_i64(retv, t1);
141
+ }
142
+ tcg_temp_free_i64(t1);
143
}
144
145
void tcg_gen_atomic_cmpxchg_i64(TCGv_i64 retv, TCGv addr, TCGv_i64 cmpv,
146
TCGv_i64 newv, TCGArg idx, MemOp memop)
147
{
148
- memop = tcg_canonicalize_memop(memop, 1, 0);
149
-
150
if (!(tcg_ctx->gen_tb->cflags & CF_PARALLEL)) {
151
- TCGv_i64 t1 = tcg_temp_new_i64();
152
- TCGv_i64 t2 = tcg_temp_new_i64();
153
+ tcg_gen_nonatomic_cmpxchg_i64(retv, addr, cmpv, newv, idx, memop);
154
+ return;
155
+ }
156
157
- tcg_gen_ext_i64(t2, cmpv, memop & MO_SIZE);
158
-
159
- tcg_gen_qemu_ld_i64(t1, addr, idx, memop & ~MO_SIGN);
160
- tcg_gen_movcond_i64(TCG_COND_EQ, t2, t1, t2, newv, t1);
161
- tcg_gen_qemu_st_i64(t2, addr, idx, memop);
162
- tcg_temp_free_i64(t2);
163
-
164
- if (memop & MO_SIGN) {
165
- tcg_gen_ext_i64(retv, t1, memop);
166
- } else {
167
- tcg_gen_mov_i64(retv, t1);
168
- }
169
- tcg_temp_free_i64(t1);
170
- } else if ((memop & MO_SIZE) == MO_64) {
171
-#ifdef CONFIG_ATOMIC64
172
+ if ((memop & MO_SIZE) == MO_64) {
173
gen_atomic_cx_i64 gen;
174
- MemOpIdx oi;
175
176
+ memop = tcg_canonicalize_memop(memop, 1, 0);
177
gen = table_cmpxchg[memop & (MO_SIZE | MO_BSWAP)];
178
- tcg_debug_assert(gen != NULL);
179
+ if (gen) {
180
+ MemOpIdx oi = make_memop_idx(memop, idx);
181
+ gen(retv, cpu_env, addr, cmpv, newv, tcg_constant_i32(oi));
182
+ return;
183
+ }
184
185
- oi = make_memop_idx(memop, idx);
186
- gen(retv, cpu_env, addr, cmpv, newv, tcg_constant_i32(oi));
187
-#else
188
gen_helper_exit_atomic(cpu_env);
189
- /* Produce a result, so that we have a well-formed opcode stream
190
- with respect to uses of the result in the (dead) code following. */
191
+
192
+ /*
193
+ * Produce a result for a well-formed opcode stream. This satisfies
194
+ * liveness for set before used, which happens before this dead code
195
+ * is removed.
196
+ */
197
tcg_gen_movi_i64(retv, 0);
198
-#endif /* CONFIG_ATOMIC64 */
199
+ return;
71
+ return;
200
+ }
72
+ }
201
+
73
+
202
+ if (TCG_TARGET_REG_BITS == 32) {
74
+ assert(ofs % 8 == 0);
203
+ tcg_gen_atomic_cmpxchg_i32(TCGV_LOW(retv), addr, TCGV_LOW(cmpv),
75
+ switch (len) {
204
+ TCGV_LOW(newv), idx, memop);
76
+ case 8:
205
+ if (memop & MO_SIGN) {
77
+ /* uxtb */
206
+ tcg_gen_sari_i32(TCGV_HIGH(retv), TCGV_LOW(retv), 31);
78
+ tcg_out32(s, 0x06ef0070 | (cond << 28) | (rd << 12) | (ofs << 7) | rn);
207
+ } else {
79
+ break;
208
+ tcg_gen_movi_i32(TCGV_HIGH(retv), 0);
80
+ case 16:
209
+ }
81
+ /* uxth */
210
} else {
82
+ tcg_out32(s, 0x06ff0070 | (cond << 28) | (rd << 12) | (ofs << 7) | rn);
211
TCGv_i32 c32 = tcg_temp_new_i32();
83
+ break;
212
TCGv_i32 n32 = tcg_temp_new_i32();
84
+ default:
85
+ g_assert_not_reached();
86
+ }
87
}
88
89
static void tcg_out_sextract(TCGContext *s, ARMCond cond, TCGReg rd,
90
TCGReg rn, int ofs, int len)
91
{
92
- /* sbfx */
93
- tcg_out32(s, 0x07a00050 | (cond << 28) | (rd << 12) | rn
94
- | (ofs << 7) | ((len - 1) << 16));
95
+ if (use_armv7_instructions) {
96
+ /* sbfx */
97
+ tcg_out32(s, 0x07a00050 | (cond << 28) | (rd << 12) | rn
98
+ | (ofs << 7) | ((len - 1) << 16));
99
+ return;
100
+ }
101
+
102
+ assert(ofs % 8 == 0);
103
+ switch (len) {
104
+ case 8:
105
+ /* sxtb */
106
+ tcg_out32(s, 0x06af0070 | (cond << 28) | (rd << 12) | (ofs << 7) | rn);
107
+ break;
108
+ case 16:
109
+ /* sxth */
110
+ tcg_out32(s, 0x06bf0070 | (cond << 28) | (rd << 12) | (ofs << 7) | rn);
111
+ break;
112
+ default:
113
+ g_assert_not_reached();
114
+ }
115
}
116
117
+
118
static void tcg_out_ld32u(TCGContext *s, ARMCond cond,
119
TCGReg rd, TCGReg rn, int32_t offset)
120
{
213
--
121
--
214
2.34.1
122
2.43.0
215
123
216
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
1
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
1
Accept byte and word extensions with the extract opcodes.
2
This is preparatory to removing the specialized extracts.
3
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
6
---
5
tests/tcg/s390x/long-double.c | 24 ++++++++++++++++++++++++
7
tcg/riscv/tcg-target-has.h | 39 ++++++++++++++++++++++++++++++++++----
6
tests/tcg/s390x/Makefile.target | 1 +
8
tcg/riscv/tcg-target.c.inc | 34 +++++++++++++++++++++++++++++++++
7
2 files changed, 25 insertions(+)
9
2 files changed, 69 insertions(+), 4 deletions(-)
8
create mode 100644 tests/tcg/s390x/long-double.c
9
10
10
diff --git a/tests/tcg/s390x/long-double.c b/tests/tcg/s390x/long-double.c
11
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
11
new file mode 100644
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX
13
--- a/tcg/riscv/tcg-target-has.h
13
--- /dev/null
14
+++ b/tcg/riscv/tcg-target-has.h
14
+++ b/tests/tcg/s390x/long-double.c
15
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@
16
+/*
16
#define TCG_TARGET_HAS_div2_i32 0
17
+ * Perform some basic arithmetic with long double, as a sanity check.
17
#define TCG_TARGET_HAS_rot_i32 (cpuinfo & CPUINFO_ZBB)
18
+ * With small integral numbers, we can cross-check with integers.
18
#define TCG_TARGET_HAS_deposit_i32 0
19
+ */
19
-#define TCG_TARGET_HAS_extract_i32 0
20
+
20
-#define TCG_TARGET_HAS_sextract_i32 0
21
+#include <assert.h>
21
+#define TCG_TARGET_HAS_extract_i32 1
22
+
22
+#define TCG_TARGET_HAS_sextract_i32 1
23
+int main()
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)
24
+{
43
+{
25
+ int i, j;
44
+ if (ofs == 0) {
26
+
45
+ switch (len) {
27
+ for (i = 1; i < 5; i++) {
46
+ case 16:
28
+ for (j = 1; j < 5; j++) {
47
+ return cpuinfo & CPUINFO_ZBB;
29
+ long double la = (long double)i + j;
48
+ case 32:
30
+ long double lm = (long double)i * j;
49
+ return (cpuinfo & CPUINFO_ZBA) && type == TCG_TYPE_I64;
31
+ long double ls = (long double)i - j;
32
+
33
+ assert(la == i + j);
34
+ assert(lm == i * j);
35
+ assert(ls == i - j);
36
+ }
50
+ }
37
+ }
51
+ }
38
+ return 0;
52
+ return false;
39
+}
53
+}
40
diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target
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
41
index XXXXXXX..XXXXXXX 100644
74
index XXXXXXX..XXXXXXX 100644
42
--- a/tests/tcg/s390x/Makefile.target
75
--- a/tcg/riscv/tcg-target.c.inc
43
+++ b/tests/tcg/s390x/Makefile.target
76
+++ b/tcg/riscv/tcg-target.c.inc
44
@@ -XXX,XX +XXX,XX @@ TESTS+=branch-relative-long
77
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
45
TESTS+=noexec
78
tcg_out_mb(s, a0);
46
TESTS+=div
79
break;
47
TESTS+=clst
80
48
+TESTS+=long-double
81
+ case INDEX_op_extract_i64:
49
82
+ if (a2 == 0 && args[3] == 32) {
50
Z13_TESTS=vistr
83
+ tcg_out_ext32u(s, a0, a1);
51
$(Z13_TESTS): CFLAGS+=-march=z13 -O2
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:
52
--
125
--
53
2.34.1
126
2.43.0
54
127
55
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
1
Acked-by: David Hildenbrand <david@redhat.com>
1
Accept byte and word extensions with the extract opcodes.
2
This is preparatory to removing the specialized extracts.
3
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
6
---
5
v2: Fix SPEC_in1_x1.
7
tcg/s390x/tcg-target-has.h | 22 ++++++++++++++++++++--
6
---
8
tcg/s390x/tcg-target.c.inc | 37 +++++++++++++++++++++++++++++++++++++
7
target/s390x/helper.h | 32 ++++++------
9
2 files changed, 57 insertions(+), 2 deletions(-)
8
target/s390x/tcg/insn-data.h.inc | 30 +++++------
9
target/s390x/tcg/fpu_helper.c | 88 ++++++++++++++------------------
10
target/s390x/tcg/translate.c | 76 ++++++++++++++++++---------
11
4 files changed, 121 insertions(+), 105 deletions(-)
12
10
13
diff --git a/target/s390x/helper.h b/target/s390x/helper.h
11
diff --git a/tcg/s390x/tcg-target-has.h b/tcg/s390x/tcg-target-has.h
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/target/s390x/helper.h
13
--- a/tcg/s390x/tcg-target-has.h
16
+++ b/target/s390x/helper.h
14
+++ b/tcg/s390x/tcg-target-has.h
17
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_4(csst, i32, env, i32, i64, i64)
15
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
18
DEF_HELPER_4(csst_parallel, i32, env, i32, i64, i64)
16
#define TCG_TARGET_HAS_ctpop_i32 1
19
DEF_HELPER_FLAGS_3(aeb, TCG_CALL_NO_WG, i64, env, i64, i64)
17
#define TCG_TARGET_HAS_deposit_i32 1
20
DEF_HELPER_FLAGS_3(adb, TCG_CALL_NO_WG, i64, env, i64, i64)
18
#define TCG_TARGET_HAS_extract_i32 1
21
-DEF_HELPER_FLAGS_5(axb, TCG_CALL_NO_WG, i128, env, i64, i64, i64, i64)
19
-#define TCG_TARGET_HAS_sextract_i32 0
22
+DEF_HELPER_FLAGS_3(axb, TCG_CALL_NO_WG, i128, env, i128, i128)
20
+#define TCG_TARGET_HAS_sextract_i32 1
23
DEF_HELPER_FLAGS_3(seb, TCG_CALL_NO_WG, i64, env, i64, i64)
21
#define TCG_TARGET_HAS_extract2_i32 0
24
DEF_HELPER_FLAGS_3(sdb, TCG_CALL_NO_WG, i64, env, i64, i64)
22
#define TCG_TARGET_HAS_negsetcond_i32 1
25
-DEF_HELPER_FLAGS_5(sxb, TCG_CALL_NO_WG, i128, env, i64, i64, i64, i64)
23
#define TCG_TARGET_HAS_add2_i32 1
26
+DEF_HELPER_FLAGS_3(sxb, TCG_CALL_NO_WG, i128, env, i128, i128)
24
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
27
DEF_HELPER_FLAGS_3(deb, TCG_CALL_NO_WG, i64, env, i64, i64)
25
#define TCG_TARGET_HAS_ctpop_i64 1
28
DEF_HELPER_FLAGS_3(ddb, TCG_CALL_NO_WG, i64, env, i64, i64)
26
#define TCG_TARGET_HAS_deposit_i64 1
29
-DEF_HELPER_FLAGS_5(dxb, TCG_CALL_NO_WG, i128, env, i64, i64, i64, i64)
27
#define TCG_TARGET_HAS_extract_i64 1
30
+DEF_HELPER_FLAGS_3(dxb, TCG_CALL_NO_WG, i128, env, i128, i128)
28
-#define TCG_TARGET_HAS_sextract_i64 0
31
DEF_HELPER_FLAGS_3(meeb, TCG_CALL_NO_WG, i64, env, i64, i64)
29
+#define TCG_TARGET_HAS_sextract_i64 1
32
DEF_HELPER_FLAGS_3(mdeb, TCG_CALL_NO_WG, i64, env, i64, i64)
30
#define TCG_TARGET_HAS_extract2_i64 0
33
DEF_HELPER_FLAGS_3(mdb, TCG_CALL_NO_WG, i64, env, i64, i64)
31
#define TCG_TARGET_HAS_negsetcond_i64 1
34
-DEF_HELPER_FLAGS_5(mxb, TCG_CALL_NO_WG, i128, env, i64, i64, i64, i64)
32
#define TCG_TARGET_HAS_add2_i64 1
35
-DEF_HELPER_FLAGS_4(mxdb, TCG_CALL_NO_WG, i128, env, i64, i64, i64)
33
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
36
+DEF_HELPER_FLAGS_3(mxb, TCG_CALL_NO_WG, i128, env, i128, i128)
34
#define TCG_TARGET_HAS_cmpsel_vec 1
37
+DEF_HELPER_FLAGS_3(mxdb, TCG_CALL_NO_WG, i128, env, i128, i64)
35
#define TCG_TARGET_HAS_tst_vec 0
38
DEF_HELPER_FLAGS_2(ldeb, TCG_CALL_NO_WG, i64, env, i64)
36
39
-DEF_HELPER_FLAGS_4(ldxb, TCG_CALL_NO_WG, i64, env, i64, i64, i32)
37
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
40
+DEF_HELPER_FLAGS_3(ldxb, TCG_CALL_NO_WG, i64, env, i128, i32)
38
+
41
DEF_HELPER_FLAGS_2(lxdb, TCG_CALL_NO_WG, i128, env, i64)
39
+static inline bool
42
DEF_HELPER_FLAGS_2(lxeb, TCG_CALL_NO_WG, i128, env, i64)
40
+tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
43
DEF_HELPER_FLAGS_3(ledb, TCG_CALL_NO_WG, i64, env, i64, i32)
41
+{
44
-DEF_HELPER_FLAGS_4(lexb, TCG_CALL_NO_WG, i64, env, i64, i64, i32)
42
+ if (ofs == 0) {
45
+DEF_HELPER_FLAGS_3(lexb, TCG_CALL_NO_WG, i64, env, i128, i32)
43
+ switch (len) {
46
DEF_HELPER_FLAGS_3(ceb, TCG_CALL_NO_WG_SE, i32, env, i64, i64)
44
+ case 8:
47
DEF_HELPER_FLAGS_3(cdb, TCG_CALL_NO_WG_SE, i32, env, i64, i64)
45
+ case 16:
48
-DEF_HELPER_FLAGS_5(cxb, TCG_CALL_NO_WG_SE, i32, env, i64, i64, i64, i64)
46
+ return true;
49
+DEF_HELPER_FLAGS_3(cxb, TCG_CALL_NO_WG_SE, i32, env, i128, i128)
47
+ case 32:
50
DEF_HELPER_FLAGS_3(keb, TCG_CALL_NO_WG, i32, env, i64, i64)
48
+ return type == TCG_TYPE_I64;
51
DEF_HELPER_FLAGS_3(kdb, TCG_CALL_NO_WG, i32, env, i64, i64)
49
+ }
52
-DEF_HELPER_FLAGS_5(kxb, TCG_CALL_NO_WG, i32, env, i64, i64, i64, i64)
50
+ }
53
+DEF_HELPER_FLAGS_3(kxb, TCG_CALL_NO_WG, i32, env, i128, i128)
51
+ return false;
54
DEF_HELPER_3(cgeb, i64, env, i64, i32)
52
+}
55
DEF_HELPER_3(cgdb, i64, env, i64, i32)
53
+#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
56
-DEF_HELPER_4(cgxb, i64, env, i64, i64, i32)
54
+
57
+DEF_HELPER_3(cgxb, i64, env, i128, i32)
55
#endif
58
DEF_HELPER_3(cfeb, i64, env, i64, i32)
56
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
59
DEF_HELPER_3(cfdb, i64, env, i64, i32)
60
-DEF_HELPER_4(cfxb, i64, env, i64, i64, i32)
61
+DEF_HELPER_3(cfxb, i64, env, i128, i32)
62
DEF_HELPER_3(clgeb, i64, env, i64, i32)
63
DEF_HELPER_3(clgdb, i64, env, i64, i32)
64
-DEF_HELPER_4(clgxb, i64, env, i64, i64, i32)
65
+DEF_HELPER_3(clgxb, i64, env, i128, i32)
66
DEF_HELPER_3(clfeb, i64, env, i64, i32)
67
DEF_HELPER_3(clfdb, i64, env, i64, i32)
68
-DEF_HELPER_4(clfxb, i64, env, i64, i64, i32)
69
+DEF_HELPER_3(clfxb, i64, env, i128, i32)
70
DEF_HELPER_FLAGS_3(fieb, TCG_CALL_NO_WG, i64, env, i64, i32)
71
DEF_HELPER_FLAGS_3(fidb, TCG_CALL_NO_WG, i64, env, i64, i32)
72
-DEF_HELPER_FLAGS_4(fixb, TCG_CALL_NO_WG, i128, env, i64, i64, i32)
73
+DEF_HELPER_FLAGS_3(fixb, TCG_CALL_NO_WG, i128, env, i128, i32)
74
DEF_HELPER_FLAGS_4(maeb, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
75
DEF_HELPER_FLAGS_4(madb, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
76
DEF_HELPER_FLAGS_4(mseb, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
77
DEF_HELPER_FLAGS_4(msdb, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
78
DEF_HELPER_FLAGS_3(tceb, TCG_CALL_NO_RWG_SE, i32, env, i64, i64)
79
DEF_HELPER_FLAGS_3(tcdb, TCG_CALL_NO_RWG_SE, i32, env, i64, i64)
80
-DEF_HELPER_FLAGS_4(tcxb, TCG_CALL_NO_RWG_SE, i32, env, i64, i64, i64)
81
+DEF_HELPER_FLAGS_3(tcxb, TCG_CALL_NO_RWG_SE, i32, env, i128, i64)
82
DEF_HELPER_FLAGS_2(sqeb, TCG_CALL_NO_WG, i64, env, i64)
83
DEF_HELPER_FLAGS_2(sqdb, TCG_CALL_NO_WG, i64, env, i64)
84
-DEF_HELPER_FLAGS_3(sqxb, TCG_CALL_NO_WG, i128, env, i64, i64)
85
+DEF_HELPER_FLAGS_2(sqxb, TCG_CALL_NO_WG, i128, env, i128)
86
DEF_HELPER_FLAGS_1(cvd, TCG_CALL_NO_RWG_SE, i64, s32)
87
DEF_HELPER_FLAGS_4(pack, TCG_CALL_NO_WG, void, env, i32, i64, i64)
88
DEF_HELPER_FLAGS_4(pka, TCG_CALL_NO_WG, void, env, i64, i64, i32)
89
diff --git a/target/s390x/tcg/insn-data.h.inc b/target/s390x/tcg/insn-data.h.inc
90
index XXXXXXX..XXXXXXX 100644
57
index XXXXXXX..XXXXXXX 100644
91
--- a/target/s390x/tcg/insn-data.h.inc
58
--- a/tcg/s390x/tcg-target.c.inc
92
+++ b/target/s390x/tcg/insn-data.h.inc
59
+++ b/tcg/s390x/tcg-target.c.inc
93
@@ -XXX,XX +XXX,XX @@
60
@@ -XXX,XX +XXX,XX @@ static void tgen_deposit(TCGContext *s, TCGReg dest, TCGReg src,
94
C(0xe318, AGF, RXY_a, Z, r1, m2_32s, r1, 0, add, adds64)
61
static void tgen_extract(TCGContext *s, TCGReg dest, TCGReg src,
95
F(0xb30a, AEBR, RRE, Z, e1, e2, new, e1, aeb, f32, IF_BFP)
62
int ofs, int len)
96
F(0xb31a, ADBR, RRE, Z, f1, f2, new, f1, adb, f64, IF_BFP)
63
{
97
- F(0xb34a, AXBR, RRE, Z, x2h, x2l, x1, x1, axb, f128, IF_BFP)
64
+ if (ofs == 0) {
98
+ F(0xb34a, AXBR, RRE, Z, x1, x2, new_x, x1, axb, f128, IF_BFP)
65
+ switch (len) {
99
F(0xed0a, AEB, RXE, Z, e1, m2_32u, new, e1, aeb, f32, IF_BFP)
66
+ case 8:
100
F(0xed1a, ADB, RXE, Z, f1, m2_64, new, f1, adb, f64, IF_BFP)
67
+ tcg_out_ext8u(s, dest, src);
101
/* ADD HIGH */
68
+ return;
102
@@ -XXX,XX +XXX,XX @@
69
+ case 16:
103
C(0xe330, CGF, RXY_a, Z, r1_o, m2_32s, 0, 0, 0, cmps64)
70
+ tcg_out_ext16u(s, dest, src);
104
F(0xb309, CEBR, RRE, Z, e1, e2, 0, 0, ceb, 0, IF_BFP)
71
+ return;
105
F(0xb319, CDBR, RRE, Z, f1, f2, 0, 0, cdb, 0, IF_BFP)
72
+ case 32:
106
- F(0xb349, CXBR, RRE, Z, x2h, x2l, x1, 0, cxb, 0, IF_BFP)
73
+ tcg_out_ext32u(s, dest, src);
107
+ F(0xb349, CXBR, RRE, Z, x1, x2, 0, 0, cxb, 0, IF_BFP)
74
+ return;
108
F(0xed09, CEB, RXE, Z, e1, m2_32u, 0, 0, ceb, 0, IF_BFP)
75
+ }
109
F(0xed19, CDB, RXE, Z, f1, m2_64, 0, 0, cdb, 0, IF_BFP)
76
+ }
110
/* COMPARE AND SIGNAL */
77
tcg_out_risbg(s, dest, src, 64 - len, 63, 64 - ofs, 1);
111
F(0xb308, KEBR, RRE, Z, e1, e2, 0, 0, keb, 0, IF_BFP)
112
F(0xb318, KDBR, RRE, Z, f1, f2, 0, 0, kdb, 0, IF_BFP)
113
- F(0xb348, KXBR, RRE, Z, x2h, x2l, x1, 0, kxb, 0, IF_BFP)
114
+ F(0xb348, KXBR, RRE, Z, x1, x2, 0, 0, kxb, 0, IF_BFP)
115
F(0xed08, KEB, RXE, Z, e1, m2_32u, 0, 0, keb, 0, IF_BFP)
116
F(0xed18, KDB, RXE, Z, f1, m2_64, 0, 0, kdb, 0, IF_BFP)
117
/* COMPARE IMMEDIATE */
118
@@ -XXX,XX +XXX,XX @@
119
/* CONVERT TO FIXED */
120
F(0xb398, CFEBR, RRF_e, Z, 0, e2, new, r1_32, cfeb, 0, IF_BFP)
121
F(0xb399, CFDBR, RRF_e, Z, 0, f2, new, r1_32, cfdb, 0, IF_BFP)
122
- F(0xb39a, CFXBR, RRF_e, Z, x2h, x2l, new, r1_32, cfxb, 0, IF_BFP)
123
+ F(0xb39a, CFXBR, RRF_e, Z, 0, x2, new, r1_32, cfxb, 0, IF_BFP)
124
F(0xb3a8, CGEBR, RRF_e, Z, 0, e2, r1, 0, cgeb, 0, IF_BFP)
125
F(0xb3a9, CGDBR, RRF_e, Z, 0, f2, r1, 0, cgdb, 0, IF_BFP)
126
- F(0xb3aa, CGXBR, RRF_e, Z, x2h, x2l, r1, 0, cgxb, 0, IF_BFP)
127
+ F(0xb3aa, CGXBR, RRF_e, Z, 0, x2, r1, 0, cgxb, 0, IF_BFP)
128
/* CONVERT FROM FIXED */
129
F(0xb394, CEFBR, RRF_e, Z, 0, r2_32s, new, e1, cegb, 0, IF_BFP)
130
F(0xb395, CDFBR, RRF_e, Z, 0, r2_32s, new, f1, cdgb, 0, IF_BFP)
131
@@ -XXX,XX +XXX,XX @@
132
/* CONVERT TO LOGICAL */
133
F(0xb39c, CLFEBR, RRF_e, FPE, 0, e2, new, r1_32, clfeb, 0, IF_BFP)
134
F(0xb39d, CLFDBR, RRF_e, FPE, 0, f2, new, r1_32, clfdb, 0, IF_BFP)
135
- F(0xb39e, CLFXBR, RRF_e, FPE, x2h, x2l, new, r1_32, clfxb, 0, IF_BFP)
136
+ F(0xb39e, CLFXBR, RRF_e, FPE, 0, x2, new, r1_32, clfxb, 0, IF_BFP)
137
F(0xb3ac, CLGEBR, RRF_e, FPE, 0, e2, r1, 0, clgeb, 0, IF_BFP)
138
F(0xb3ad, CLGDBR, RRF_e, FPE, 0, f2, r1, 0, clgdb, 0, IF_BFP)
139
- F(0xb3ae, CLGXBR, RRF_e, FPE, x2h, x2l, r1, 0, clgxb, 0, IF_BFP)
140
+ F(0xb3ae, CLGXBR, RRF_e, FPE, 0, x2, r1, 0, clgxb, 0, IF_BFP)
141
/* CONVERT FROM LOGICAL */
142
F(0xb390, CELFBR, RRF_e, FPE, 0, r2_32u, new, e1, celgb, 0, IF_BFP)
143
F(0xb391, CDLFBR, RRF_e, FPE, 0, r2_32u, new, f1, cdlgb, 0, IF_BFP)
144
@@ -XXX,XX +XXX,XX @@
145
C(0x5d00, D, RX_a, Z, r1_D32, m2_32s, new_P, r1_P32, divs32, 0)
146
F(0xb30d, DEBR, RRE, Z, e1, e2, new, e1, deb, 0, IF_BFP)
147
F(0xb31d, DDBR, RRE, Z, f1, f2, new, f1, ddb, 0, IF_BFP)
148
- F(0xb34d, DXBR, RRE, Z, x2h, x2l, x1, x1, dxb, 0, IF_BFP)
149
+ F(0xb34d, DXBR, RRE, Z, x1, x2, new_x, x1, dxb, 0, IF_BFP)
150
F(0xed0d, DEB, RXE, Z, e1, m2_32u, new, e1, deb, 0, IF_BFP)
151
F(0xed1d, DDB, RXE, Z, f1, m2_64, new, f1, ddb, 0, IF_BFP)
152
/* DIVIDE LOGICAL */
153
@@ -XXX,XX +XXX,XX @@
154
/* LOAD FP INTEGER */
155
F(0xb357, FIEBR, RRF_e, Z, 0, e2, new, e1, fieb, 0, IF_BFP)
156
F(0xb35f, FIDBR, RRF_e, Z, 0, f2, new, f1, fidb, 0, IF_BFP)
157
- F(0xb347, FIXBR, RRF_e, Z, x2h, x2l, new_x, x1, fixb, 0, IF_BFP)
158
+ F(0xb347, FIXBR, RRF_e, Z, 0, x2, new_x, x1, fixb, 0, IF_BFP)
159
160
/* LOAD LENGTHENED */
161
F(0xb304, LDEBR, RRE, Z, 0, e2, new, f1, ldeb, 0, IF_BFP)
162
@@ -XXX,XX +XXX,XX @@
163
F(0xed24, LDE, RXE, Z, 0, m2_32u, new, f1, lde, 0, IF_AFP1)
164
/* LOAD ROUNDED */
165
F(0xb344, LEDBR, RRF_e, Z, 0, f2, new, e1, ledb, 0, IF_BFP)
166
- F(0xb345, LDXBR, RRF_e, Z, x2h, x2l, new, f1, ldxb, 0, IF_BFP)
167
- F(0xb346, LEXBR, RRF_e, Z, x2h, x2l, new, e1, lexb, 0, IF_BFP)
168
+ F(0xb345, LDXBR, RRF_e, Z, 0, x2, new, f1, ldxb, 0, IF_BFP)
169
+ F(0xb346, LEXBR, RRF_e, Z, 0, x2, new, e1, lexb, 0, IF_BFP)
170
171
/* LOAD MULTIPLE */
172
C(0x9800, LM, RS_a, Z, 0, a2, 0, 0, lm32, 0)
173
@@ -XXX,XX +XXX,XX @@
174
C(0xe384, MG, RXY_a, MIE2,r1p1_o, m2_64, r1_P, 0, muls128, 0)
175
F(0xb317, MEEBR, RRE, Z, e1, e2, new, e1, meeb, 0, IF_BFP)
176
F(0xb31c, MDBR, RRE, Z, f1, f2, new, f1, mdb, 0, IF_BFP)
177
- F(0xb34c, MXBR, RRE, Z, x2h, x2l, x1, x1, mxb, 0, IF_BFP)
178
+ F(0xb34c, MXBR, RRE, Z, x1, x2, new_x, x1, mxb, 0, IF_BFP)
179
F(0xb30c, MDEBR, RRE, Z, f1, e2, new, f1, mdeb, 0, IF_BFP)
180
F(0xb307, MXDBR, RRE, Z, 0, f2, x1, x1, mxdb, 0, IF_BFP)
181
F(0xed17, MEEB, RXE, Z, e1, m2_32u, new, e1, meeb, 0, IF_BFP)
182
@@ -XXX,XX +XXX,XX @@
183
/* SQUARE ROOT */
184
F(0xb314, SQEBR, RRE, Z, 0, e2, new, e1, sqeb, 0, IF_BFP)
185
F(0xb315, SQDBR, RRE, Z, 0, f2, new, f1, sqdb, 0, IF_BFP)
186
- F(0xb316, SQXBR, RRE, Z, x2h, x2l, new_x, x1, sqxb, 0, IF_BFP)
187
+ F(0xb316, SQXBR, RRE, Z, 0, x2, new_x, x1, sqxb, 0, IF_BFP)
188
F(0xed14, SQEB, RXE, Z, 0, m2_32u, new, e1, sqeb, 0, IF_BFP)
189
F(0xed15, SQDB, RXE, Z, 0, m2_64, new, f1, sqdb, 0, IF_BFP)
190
191
@@ -XXX,XX +XXX,XX @@
192
C(0xe319, SGF, RXY_a, Z, r1, m2_32s, r1, 0, sub, subs64)
193
F(0xb30b, SEBR, RRE, Z, e1, e2, new, e1, seb, f32, IF_BFP)
194
F(0xb31b, SDBR, RRE, Z, f1, f2, new, f1, sdb, f64, IF_BFP)
195
- F(0xb34b, SXBR, RRE, Z, x2h, x2l, x1, x1, sxb, f128, IF_BFP)
196
+ F(0xb34b, SXBR, RRE, Z, x1, x2, new_x, x1, sxb, f128, IF_BFP)
197
F(0xed0b, SEB, RXE, Z, e1, m2_32u, new, e1, seb, f32, IF_BFP)
198
F(0xed1b, SDB, RXE, Z, f1, m2_64, new, f1, sdb, f64, IF_BFP)
199
/* SUBTRACT HALFWORD */
200
@@ -XXX,XX +XXX,XX @@
201
/* TEST DATA CLASS */
202
F(0xed10, TCEB, RXE, Z, e1, a2, 0, 0, tceb, 0, IF_BFP)
203
F(0xed11, TCDB, RXE, Z, f1, a2, 0, 0, tcdb, 0, IF_BFP)
204
- F(0xed12, TCXB, RXE, Z, 0, a2, x1, 0, tcxb, 0, IF_BFP)
205
+ F(0xed12, TCXB, RXE, Z, x1, a2, 0, 0, tcxb, 0, IF_BFP)
206
207
/* TEST DECIMAL */
208
C(0xebc0, TP, RSL, E2, la1, 0, 0, 0, tp, 0)
209
diff --git a/target/s390x/tcg/fpu_helper.c b/target/s390x/tcg/fpu_helper.c
210
index XXXXXXX..XXXXXXX 100644
211
--- a/target/s390x/tcg/fpu_helper.c
212
+++ b/target/s390x/tcg/fpu_helper.c
213
@@ -XXX,XX +XXX,XX @@ static inline Int128 RET128(float128 f)
214
return int128_make128(f.low, f.high);
215
}
78
}
216
79
217
+static inline float128 ARG128(Int128 i)
80
+static void tgen_sextract(TCGContext *s, TCGReg dest, TCGReg src,
81
+ int ofs, int len)
218
+{
82
+{
219
+ return make_float128(int128_gethi(i), int128_getlo(i));
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();
220
+}
97
+}
221
+
98
+
222
uint8_t s390_softfloat_exc_to_ieee(unsigned int exc)
99
static void tgen_gotoi(TCGContext *s, int cc, const tcg_insn_unit *dest)
223
{
100
{
224
uint8_t s390_exc = 0;
101
ptrdiff_t off = tcg_pcrel_diff(s, dest) >> 1;
225
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(adb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
102
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
226
}
103
OP_32_64(extract):
227
104
tgen_extract(s, args[0], args[1], args[2], args[3]);
228
/* 128-bit FP addition */
105
break;
229
-Int128 HELPER(axb)(CPUS390XState *env, uint64_t ah, uint64_t al,
106
+ OP_32_64(sextract):
230
- uint64_t bh, uint64_t bl)
107
+ tgen_sextract(s, args[0], args[1], args[2], args[3]);
231
+Int128 HELPER(axb)(CPUS390XState *env, Int128 a, Int128 b)
108
+ break;
232
{
109
233
- float128 ret = float128_add(make_float128(ah, al),
110
case INDEX_op_clz_i64:
234
- make_float128(bh, bl),
111
tgen_clz(s, args[0], args[1], args[2], const_args[2]);
235
- &env->fpu_status);
112
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
236
+ float128 ret = float128_add(ARG128(a), ARG128(b), &env->fpu_status);
113
case INDEX_op_extu_i32_i64:
237
handle_exceptions(env, false, GETPC());
114
case INDEX_op_extract_i32:
238
return RET128(ret);
115
case INDEX_op_extract_i64:
239
}
116
+ case INDEX_op_sextract_i32:
240
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(sdb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
117
+ case INDEX_op_sextract_i64:
241
}
118
case INDEX_op_ctpop_i32:
242
119
case INDEX_op_ctpop_i64:
243
/* 128-bit FP subtraction */
120
return C_O1_I1(r, r);
244
-Int128 HELPER(sxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
245
- uint64_t bh, uint64_t bl)
246
+Int128 HELPER(sxb)(CPUS390XState *env, Int128 a, Int128 b)
247
{
248
- float128 ret = float128_sub(make_float128(ah, al),
249
- make_float128(bh, bl),
250
- &env->fpu_status);
251
+ float128 ret = float128_sub(ARG128(a), ARG128(b), &env->fpu_status);
252
handle_exceptions(env, false, GETPC());
253
return RET128(ret);
254
}
255
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(ddb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
256
}
257
258
/* 128-bit FP division */
259
-Int128 HELPER(dxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
260
- uint64_t bh, uint64_t bl)
261
+Int128 HELPER(dxb)(CPUS390XState *env, Int128 a, Int128 b)
262
{
263
- float128 ret = float128_div(make_float128(ah, al),
264
- make_float128(bh, bl),
265
- &env->fpu_status);
266
+ float128 ret = float128_div(ARG128(a), ARG128(b), &env->fpu_status);
267
handle_exceptions(env, false, GETPC());
268
return RET128(ret);
269
}
270
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(mdeb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
271
}
272
273
/* 128-bit FP multiplication */
274
-Int128 HELPER(mxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
275
- uint64_t bh, uint64_t bl)
276
+Int128 HELPER(mxb)(CPUS390XState *env, Int128 a, Int128 b)
277
{
278
- float128 ret = float128_mul(make_float128(ah, al),
279
- make_float128(bh, bl),
280
- &env->fpu_status);
281
+ float128 ret = float128_mul(ARG128(a), ARG128(b), &env->fpu_status);
282
handle_exceptions(env, false, GETPC());
283
return RET128(ret);
284
}
285
286
/* 128/64-bit FP multiplication */
287
-Int128 HELPER(mxdb)(CPUS390XState *env, uint64_t ah, uint64_t al, uint64_t f2)
288
+Int128 HELPER(mxdb)(CPUS390XState *env, Int128 a, uint64_t f2)
289
{
290
float128 ret = float64_to_float128(f2, &env->fpu_status);
291
- ret = float128_mul(make_float128(ah, al), ret, &env->fpu_status);
292
+ ret = float128_mul(ARG128(a), ret, &env->fpu_status);
293
handle_exceptions(env, false, GETPC());
294
return RET128(ret);
295
}
296
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(ldeb)(CPUS390XState *env, uint64_t f2)
297
}
298
299
/* convert 128-bit float to 64-bit float */
300
-uint64_t HELPER(ldxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
301
- uint32_t m34)
302
+uint64_t HELPER(ldxb)(CPUS390XState *env, Int128 a, uint32_t m34)
303
{
304
int old_mode = s390_swap_bfp_rounding_mode(env, round_from_m34(m34));
305
- float64 ret = float128_to_float64(make_float128(ah, al), &env->fpu_status);
306
+ float64 ret = float128_to_float64(ARG128(a), &env->fpu_status);
307
308
s390_restore_bfp_rounding_mode(env, old_mode);
309
handle_exceptions(env, xxc_from_m34(m34), GETPC());
310
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(ledb)(CPUS390XState *env, uint64_t f2, uint32_t m34)
311
}
312
313
/* convert 128-bit float to 32-bit float */
314
-uint64_t HELPER(lexb)(CPUS390XState *env, uint64_t ah, uint64_t al,
315
- uint32_t m34)
316
+uint64_t HELPER(lexb)(CPUS390XState *env, Int128 a, uint32_t m34)
317
{
318
int old_mode = s390_swap_bfp_rounding_mode(env, round_from_m34(m34));
319
- float32 ret = float128_to_float32(make_float128(ah, al), &env->fpu_status);
320
+ float32 ret = float128_to_float32(ARG128(a), &env->fpu_status);
321
322
s390_restore_bfp_rounding_mode(env, old_mode);
323
handle_exceptions(env, xxc_from_m34(m34), GETPC());
324
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(cdb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
325
}
326
327
/* 128-bit FP compare */
328
-uint32_t HELPER(cxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
329
- uint64_t bh, uint64_t bl)
330
+uint32_t HELPER(cxb)(CPUS390XState *env, Int128 a, Int128 b)
331
{
332
- FloatRelation cmp = float128_compare_quiet(make_float128(ah, al),
333
- make_float128(bh, bl),
334
+ FloatRelation cmp = float128_compare_quiet(ARG128(a), ARG128(b),
335
&env->fpu_status);
336
handle_exceptions(env, false, GETPC());
337
return float_comp_to_cc(env, cmp);
338
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(cgdb)(CPUS390XState *env, uint64_t v2, uint32_t m34)
339
}
340
341
/* convert 128-bit float to 64-bit int */
342
-uint64_t HELPER(cgxb)(CPUS390XState *env, uint64_t h, uint64_t l, uint32_t m34)
343
+uint64_t HELPER(cgxb)(CPUS390XState *env, Int128 i2, uint32_t m34)
344
{
345
int old_mode = s390_swap_bfp_rounding_mode(env, round_from_m34(m34));
346
- float128 v2 = make_float128(h, l);
347
+ float128 v2 = ARG128(i2);
348
int64_t ret = float128_to_int64(v2, &env->fpu_status);
349
uint32_t cc = set_cc_conv_f128(v2, &env->fpu_status);
350
351
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(cfdb)(CPUS390XState *env, uint64_t v2, uint32_t m34)
352
}
353
354
/* convert 128-bit float to 32-bit int */
355
-uint64_t HELPER(cfxb)(CPUS390XState *env, uint64_t h, uint64_t l, uint32_t m34)
356
+uint64_t HELPER(cfxb)(CPUS390XState *env, Int128 i2, uint32_t m34)
357
{
358
int old_mode = s390_swap_bfp_rounding_mode(env, round_from_m34(m34));
359
- float128 v2 = make_float128(h, l);
360
+ float128 v2 = ARG128(i2);
361
int32_t ret = float128_to_int32(v2, &env->fpu_status);
362
uint32_t cc = set_cc_conv_f128(v2, &env->fpu_status);
363
364
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(clgdb)(CPUS390XState *env, uint64_t v2, uint32_t m34)
365
}
366
367
/* convert 128-bit float to 64-bit uint */
368
-uint64_t HELPER(clgxb)(CPUS390XState *env, uint64_t h, uint64_t l, uint32_t m34)
369
+uint64_t HELPER(clgxb)(CPUS390XState *env, Int128 i2, uint32_t m34)
370
{
371
int old_mode = s390_swap_bfp_rounding_mode(env, round_from_m34(m34));
372
- float128 v2 = make_float128(h, l);
373
+ float128 v2 = ARG128(i2);
374
uint64_t ret = float128_to_uint64(v2, &env->fpu_status);
375
uint32_t cc = set_cc_conv_f128(v2, &env->fpu_status);
376
377
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(clfdb)(CPUS390XState *env, uint64_t v2, uint32_t m34)
378
}
379
380
/* convert 128-bit float to 32-bit uint */
381
-uint64_t HELPER(clfxb)(CPUS390XState *env, uint64_t h, uint64_t l, uint32_t m34)
382
+uint64_t HELPER(clfxb)(CPUS390XState *env, Int128 i2, uint32_t m34)
383
{
384
int old_mode = s390_swap_bfp_rounding_mode(env, round_from_m34(m34));
385
- float128 v2 = make_float128(h, l);
386
+ float128 v2 = ARG128(i2);
387
uint32_t ret = float128_to_uint32(v2, &env->fpu_status);
388
uint32_t cc = set_cc_conv_f128(v2, &env->fpu_status);
389
390
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(fidb)(CPUS390XState *env, uint64_t f2, uint32_t m34)
391
}
392
393
/* round to integer 128-bit */
394
-Int128 HELPER(fixb)(CPUS390XState *env, uint64_t ah, uint64_t al, uint32_t m34)
395
+Int128 HELPER(fixb)(CPUS390XState *env, Int128 a, uint32_t m34)
396
{
397
int old_mode = s390_swap_bfp_rounding_mode(env, round_from_m34(m34));
398
- float128 ret = float128_round_to_int(make_float128(ah, al),
399
- &env->fpu_status);
400
+ float128 ret = float128_round_to_int(ARG128(a), &env->fpu_status);
401
402
s390_restore_bfp_rounding_mode(env, old_mode);
403
handle_exceptions(env, xxc_from_m34(m34), GETPC());
404
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(kdb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
405
}
406
407
/* 128-bit FP compare and signal */
408
-uint32_t HELPER(kxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
409
- uint64_t bh, uint64_t bl)
410
+uint32_t HELPER(kxb)(CPUS390XState *env, Int128 a, Int128 b)
411
{
412
- FloatRelation cmp = float128_compare(make_float128(ah, al),
413
- make_float128(bh, bl),
414
+ FloatRelation cmp = float128_compare(ARG128(a), ARG128(b),
415
&env->fpu_status);
416
handle_exceptions(env, false, GETPC());
417
return float_comp_to_cc(env, cmp);
418
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(tcdb)(CPUS390XState *env, uint64_t v1, uint64_t m2)
419
}
420
421
/* test data class 128-bit */
422
-uint32_t HELPER(tcxb)(CPUS390XState *env, uint64_t ah, uint64_t al, uint64_t m2)
423
+uint32_t HELPER(tcxb)(CPUS390XState *env, Int128 a, uint64_t m2)
424
{
425
- return (m2 & float128_dcmask(env, make_float128(ah, al))) != 0;
426
+ return (m2 & float128_dcmask(env, ARG128(a))) != 0;
427
}
428
429
/* square root 32-bit */
430
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(sqdb)(CPUS390XState *env, uint64_t f2)
431
}
432
433
/* square root 128-bit */
434
-Int128 HELPER(sqxb)(CPUS390XState *env, uint64_t ah, uint64_t al)
435
+Int128 HELPER(sqxb)(CPUS390XState *env, Int128 a)
436
{
437
- float128 ret = float128_sqrt(make_float128(ah, al), &env->fpu_status);
438
+ float128 ret = float128_sqrt(ARG128(a), &env->fpu_status);
439
handle_exceptions(env, false, GETPC());
440
return RET128(ret);
441
}
442
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
443
index XXXXXXX..XXXXXXX 100644
444
--- a/target/s390x/tcg/translate.c
445
+++ b/target/s390x/tcg/translate.c
446
@@ -XXX,XX +XXX,XX @@ static TCGv_i64 load_freg32_i64(int reg)
447
return r;
448
}
449
450
+static TCGv_i128 load_freg_128(int reg)
451
+{
452
+ TCGv_i64 h = load_freg(reg);
453
+ TCGv_i64 l = load_freg(reg + 2);
454
+ TCGv_i128 r = tcg_temp_new_i128();
455
+
456
+ tcg_gen_concat_i64_i128(r, l, h);
457
+ tcg_temp_free_i64(h);
458
+ tcg_temp_free_i64(l);
459
+ return r;
460
+}
461
+
462
static void store_reg(int reg, TCGv_i64 v)
463
{
464
tcg_gen_mov_i64(regs[reg], v);
465
@@ -XXX,XX +XXX,XX @@ typedef struct {
466
bool g_out, g_out2, g_in1, g_in2;
467
TCGv_i64 out, out2, in1, in2;
468
TCGv_i64 addr1;
469
- TCGv_i128 out_128;
470
+ TCGv_i128 out_128, in1_128, in2_128;
471
} DisasOps;
472
473
/* Instructions can place constraints on their operands, raising specification
474
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_adb(DisasContext *s, DisasOps *o)
475
476
static DisasJumpType op_axb(DisasContext *s, DisasOps *o)
477
{
478
- gen_helper_axb(o->out_128, cpu_env, o->out, o->out2, o->in1, o->in2);
479
+ gen_helper_axb(o->out_128, cpu_env, o->in1_128, o->in2_128);
480
return DISAS_NEXT;
481
}
482
483
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_cdb(DisasContext *s, DisasOps *o)
484
485
static DisasJumpType op_cxb(DisasContext *s, DisasOps *o)
486
{
487
- gen_helper_cxb(cc_op, cpu_env, o->out, o->out2, o->in1, o->in2);
488
+ gen_helper_cxb(cc_op, cpu_env, o->in1_128, o->in2_128);
489
set_cc_static(s);
490
return DISAS_NEXT;
491
}
492
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_cfxb(DisasContext *s, DisasOps *o)
493
if (!m34) {
494
return DISAS_NORETURN;
495
}
496
- gen_helper_cfxb(o->out, cpu_env, o->in1, o->in2, m34);
497
+ gen_helper_cfxb(o->out, cpu_env, o->in2_128, m34);
498
tcg_temp_free_i32(m34);
499
set_cc_static(s);
500
return DISAS_NEXT;
501
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_cgxb(DisasContext *s, DisasOps *o)
502
if (!m34) {
503
return DISAS_NORETURN;
504
}
505
- gen_helper_cgxb(o->out, cpu_env, o->in1, o->in2, m34);
506
+ gen_helper_cgxb(o->out, cpu_env, o->in2_128, m34);
507
tcg_temp_free_i32(m34);
508
set_cc_static(s);
509
return DISAS_NEXT;
510
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_clfxb(DisasContext *s, DisasOps *o)
511
if (!m34) {
512
return DISAS_NORETURN;
513
}
514
- gen_helper_clfxb(o->out, cpu_env, o->in1, o->in2, m34);
515
+ gen_helper_clfxb(o->out, cpu_env, o->in2_128, m34);
516
tcg_temp_free_i32(m34);
517
set_cc_static(s);
518
return DISAS_NEXT;
519
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_clgxb(DisasContext *s, DisasOps *o)
520
if (!m34) {
521
return DISAS_NORETURN;
522
}
523
- gen_helper_clgxb(o->out, cpu_env, o->in1, o->in2, m34);
524
+ gen_helper_clgxb(o->out, cpu_env, o->in2_128, m34);
525
tcg_temp_free_i32(m34);
526
set_cc_static(s);
527
return DISAS_NEXT;
528
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_ddb(DisasContext *s, DisasOps *o)
529
530
static DisasJumpType op_dxb(DisasContext *s, DisasOps *o)
531
{
532
- gen_helper_dxb(o->out_128, cpu_env, o->out, o->out2, o->in1, o->in2);
533
+ gen_helper_dxb(o->out_128, cpu_env, o->in1_128, o->in2_128);
534
return DISAS_NEXT;
535
}
536
537
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_fixb(DisasContext *s, DisasOps *o)
538
if (!m34) {
539
return DISAS_NORETURN;
540
}
541
- gen_helper_fixb(o->out_128, cpu_env, o->in1, o->in2, m34);
542
+ gen_helper_fixb(o->out_128, cpu_env, o->in2_128, m34);
543
tcg_temp_free_i32(m34);
544
return DISAS_NEXT;
545
}
546
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_kdb(DisasContext *s, DisasOps *o)
547
548
static DisasJumpType op_kxb(DisasContext *s, DisasOps *o)
549
{
550
- gen_helper_kxb(cc_op, cpu_env, o->out, o->out2, o->in1, o->in2);
551
+ gen_helper_kxb(cc_op, cpu_env, o->in1_128, o->in2_128);
552
set_cc_static(s);
553
return DISAS_NEXT;
554
}
555
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_ldxb(DisasContext *s, DisasOps *o)
556
if (!m34) {
557
return DISAS_NORETURN;
558
}
559
- gen_helper_ldxb(o->out, cpu_env, o->in1, o->in2, m34);
560
+ gen_helper_ldxb(o->out, cpu_env, o->in2_128, m34);
561
tcg_temp_free_i32(m34);
562
return DISAS_NEXT;
563
}
564
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_lexb(DisasContext *s, DisasOps *o)
565
if (!m34) {
566
return DISAS_NORETURN;
567
}
568
- gen_helper_lexb(o->out, cpu_env, o->in1, o->in2, m34);
569
+ gen_helper_lexb(o->out, cpu_env, o->in2_128, m34);
570
tcg_temp_free_i32(m34);
571
return DISAS_NEXT;
572
}
573
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_mdb(DisasContext *s, DisasOps *o)
574
575
static DisasJumpType op_mxb(DisasContext *s, DisasOps *o)
576
{
577
- gen_helper_mxb(o->out_128, cpu_env, o->out, o->out2, o->in1, o->in2);
578
+ gen_helper_mxb(o->out_128, cpu_env, o->in1_128, o->in2_128);
579
return DISAS_NEXT;
580
}
581
582
static DisasJumpType op_mxdb(DisasContext *s, DisasOps *o)
583
{
584
- gen_helper_mxdb(o->out_128, cpu_env, o->out, o->out2, o->in2);
585
+ gen_helper_mxdb(o->out_128, cpu_env, o->in1_128, o->in2);
586
return DISAS_NEXT;
587
}
588
589
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_sdb(DisasContext *s, DisasOps *o)
590
591
static DisasJumpType op_sxb(DisasContext *s, DisasOps *o)
592
{
593
- gen_helper_sxb(o->out_128, cpu_env, o->out, o->out2, o->in1, o->in2);
594
+ gen_helper_sxb(o->out_128, cpu_env, o->in1_128, o->in2_128);
595
return DISAS_NEXT;
596
}
597
598
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_sqdb(DisasContext *s, DisasOps *o)
599
600
static DisasJumpType op_sqxb(DisasContext *s, DisasOps *o)
601
{
602
- gen_helper_sqxb(o->out_128, cpu_env, o->in1, o->in2);
603
+ gen_helper_sqxb(o->out_128, cpu_env, o->in2_128);
604
return DISAS_NEXT;
605
}
606
607
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_tcdb(DisasContext *s, DisasOps *o)
608
609
static DisasJumpType op_tcxb(DisasContext *s, DisasOps *o)
610
{
611
- gen_helper_tcxb(cc_op, cpu_env, o->out, o->out2, o->in2);
612
+ gen_helper_tcxb(cc_op, cpu_env, o->in1_128, o->in2);
613
set_cc_static(s);
614
return DISAS_NEXT;
615
}
616
@@ -XXX,XX +XXX,XX @@ static void prep_new_P(DisasContext *s, DisasOps *o)
617
618
static void prep_new_x(DisasContext *s, DisasOps *o)
619
{
620
- o->out = tcg_temp_new_i64();
621
- o->out2 = tcg_temp_new_i64();
622
o->out_128 = tcg_temp_new_i128();
623
}
624
#define SPEC_prep_new_x 0
625
@@ -XXX,XX +XXX,XX @@ static void prep_r1_P(DisasContext *s, DisasOps *o)
626
627
static void prep_x1(DisasContext *s, DisasOps *o)
628
{
629
- o->out = load_freg(get_field(s, r1));
630
- o->out2 = load_freg(get_field(s, r1) + 2);
631
- o->out_128 = tcg_temp_new_i128();
632
- tcg_gen_concat_i64_i128(o->out_128, o->out2, o->out);
633
+ o->out_128 = load_freg_128(get_field(s, r1));
634
}
635
#define SPEC_prep_x1 SPEC_r1_f128
636
637
@@ -XXX,XX +XXX,XX @@ static void wout_x1(DisasContext *s, DisasOps *o)
638
{
639
int f1 = get_field(s, r1);
640
641
+ /* Split out_128 into out+out2 for cout_f128. */
642
+ tcg_debug_assert(o->out == NULL);
643
+ o->out = tcg_temp_new_i64();
644
+ o->out2 = tcg_temp_new_i64();
645
+
646
tcg_gen_extr_i128_i64(o->out2, o->out, o->out_128);
647
store_freg(f1, o->out);
648
store_freg(f1 + 2, o->out2);
649
@@ -XXX,XX +XXX,XX @@ static void in1_f1(DisasContext *s, DisasOps *o)
650
}
651
#define SPEC_in1_f1 0
652
653
+static void in1_x1(DisasContext *s, DisasOps *o)
654
+{
655
+ o->in1_128 = load_freg_128(get_field(s, r1));
656
+}
657
+#define SPEC_in1_x1 SPEC_r1_f128
658
+
659
/* Load the high double word of an extended (128-bit) format FP number */
660
static void in1_x2h(DisasContext *s, DisasOps *o)
661
{
662
@@ -XXX,XX +XXX,XX @@ static void in2_f2(DisasContext *s, DisasOps *o)
663
}
664
#define SPEC_in2_f2 0
665
666
+static void in2_x2(DisasContext *s, DisasOps *o)
667
+{
668
+ o->in2_128 = load_freg_128(get_field(s, r2));
669
+}
670
+#define SPEC_in2_x2 SPEC_r2_f128
671
+
672
/* Load the low double word of an extended (128-bit) format FP number */
673
static void in2_x2l(DisasContext *s, DisasOps *o)
674
{
675
@@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(CPUS390XState *env, DisasContext *s)
676
if (o.out_128) {
677
tcg_temp_free_i128(o.out_128);
678
}
679
+ if (o.in1_128) {
680
+ tcg_temp_free_i128(o.in1_128);
681
+ }
682
+ if (o.in2_128) {
683
+ tcg_temp_free_i128(o.in2_128);
684
+ }
685
/* io should be the last instruction in tb when icount is enabled */
686
if (unlikely(icount && ret == DISAS_NEXT)) {
687
ret = DISAS_TOO_MANY;
688
--
121
--
689
2.34.1
122
2.43.0
690
123
691
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
We are about to allow passing Int128 to/from tcg helper functions,
1
Trivially mirrors TCG_TARGET_HAS_{s}extract_*.
2
but libffi doesn't support __int128_t, so use the structure.
3
2
4
In order for atomic128.h to continue working, we must provide
5
a mechanism to frob between real __int128_t and the structure.
6
Provide a new union, Int128Alias, for this. We cannot modify
7
Int128 itself, as any changed alignment would also break libffi.
8
9
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
10
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
---
5
---
13
include/qemu/atomic128.h | 29 +++++++++++++++++++++------
6
tcg/tci/tcg-target-has.h | 3 +++
14
include/qemu/int128.h | 25 +++++++++++++++++++++---
7
1 file changed, 3 insertions(+)
15
util/int128.c | 42 ++++++++++++++++++++++++++++++++++++++++
16
3 files changed, 87 insertions(+), 9 deletions(-)
17
8
18
diff --git a/include/qemu/atomic128.h b/include/qemu/atomic128.h
9
diff --git a/tcg/tci/tcg-target-has.h b/tcg/tci/tcg-target-has.h
19
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
20
--- a/include/qemu/atomic128.h
11
--- a/tcg/tci/tcg-target-has.h
21
+++ b/include/qemu/atomic128.h
12
+++ b/tcg/tci/tcg-target-has.h
22
@@ -XXX,XX +XXX,XX @@
13
@@ -XXX,XX +XXX,XX @@
23
#if defined(CONFIG_ATOMIC128)
14
24
static inline Int128 atomic16_cmpxchg(Int128 *ptr, Int128 cmp, Int128 new)
15
#define TCG_TARGET_HAS_tst 1
25
{
16
26
- return qatomic_cmpxchg__nocheck(ptr, cmp, new);
17
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
27
+ Int128Alias r, c, n;
18
+#define TCG_TARGET_sextract_valid(type, ofs, len) 1
28
+
29
+ c.s = cmp;
30
+ n.s = new;
31
+ r.i = qatomic_cmpxchg__nocheck((__int128_t *)ptr, c.i, n.i);
32
+ return r.s;
33
}
34
# define HAVE_CMPXCHG128 1
35
#elif defined(CONFIG_CMPXCHG128)
36
static inline Int128 atomic16_cmpxchg(Int128 *ptr, Int128 cmp, Int128 new)
37
{
38
- return __sync_val_compare_and_swap_16(ptr, cmp, new);
39
+ Int128Alias r, c, n;
40
+
41
+ c.s = cmp;
42
+ n.s = new;
43
+ r.i = __sync_val_compare_and_swap_16((__int128_t *)ptr, c.i, n.i);
44
+ return r.s;
45
}
46
# define HAVE_CMPXCHG128 1
47
#elif defined(__aarch64__)
48
@@ -XXX,XX +XXX,XX @@ Int128 QEMU_ERROR("unsupported atomic")
49
#if defined(CONFIG_ATOMIC128)
50
static inline Int128 atomic16_read(Int128 *ptr)
51
{
52
- return qatomic_read__nocheck(ptr);
53
+ Int128Alias r;
54
+
55
+ r.i = qatomic_read__nocheck((__int128_t *)ptr);
56
+ return r.s;
57
}
58
59
static inline void atomic16_set(Int128 *ptr, Int128 val)
60
{
61
- qatomic_set__nocheck(ptr, val);
62
+ Int128Alias v;
63
+
64
+ v.s = val;
65
+ qatomic_set__nocheck((__int128_t *)ptr, v.i);
66
}
67
68
# define HAVE_ATOMIC128 1
69
@@ -XXX,XX +XXX,XX @@ static inline void atomic16_set(Int128 *ptr, Int128 val)
70
static inline Int128 atomic16_read(Int128 *ptr)
71
{
72
/* Maybe replace 0 with 0, returning the old value. */
73
- return atomic16_cmpxchg(ptr, 0, 0);
74
+ Int128 z = int128_make64(0);
75
+ return atomic16_cmpxchg(ptr, z, z);
76
}
77
78
static inline void atomic16_set(Int128 *ptr, Int128 val)
79
@@ -XXX,XX +XXX,XX @@ static inline void atomic16_set(Int128 *ptr, Int128 val)
80
do {
81
cmp = old;
82
old = atomic16_cmpxchg(ptr, cmp, val);
83
- } while (old != cmp);
84
+ } while (int128_ne(old, cmp));
85
}
86
87
# define HAVE_ATOMIC128 1
88
diff --git a/include/qemu/int128.h b/include/qemu/int128.h
89
index XXXXXXX..XXXXXXX 100644
90
--- a/include/qemu/int128.h
91
+++ b/include/qemu/int128.h
92
@@ -XXX,XX +XXX,XX @@
93
94
#include "qemu/bswap.h"
95
96
-#ifdef CONFIG_INT128
97
+/*
98
+ * With TCI, we need to use libffi for interfacing with TCG helpers.
99
+ * But libffi does not support __int128_t, and therefore cannot pass
100
+ * or return values of this type, force use of the Int128 struct.
101
+ */
102
+#if defined(CONFIG_INT128) && !defined(CONFIG_TCG_INTERPRETER)
103
typedef __int128_t Int128;
104
105
static inline Int128 int128_make64(uint64_t a)
106
@@ -XXX,XX +XXX,XX @@ Int128 int128_divu(Int128, Int128);
107
Int128 int128_remu(Int128, Int128);
108
Int128 int128_divs(Int128, Int128);
109
Int128 int128_rems(Int128, Int128);
110
-
111
-#endif /* CONFIG_INT128 */
112
+#endif /* CONFIG_INT128 && !CONFIG_TCG_INTERPRETER */
113
114
static inline void bswap128s(Int128 *s)
115
{
116
@@ -XXX,XX +XXX,XX @@ static inline void bswap128s(Int128 *s)
117
#define INT128_MAX int128_make128(UINT64_MAX, INT64_MAX)
118
#define INT128_MIN int128_make128(0, INT64_MIN)
119
120
+/*
121
+ * When compiler supports a 128-bit type, define a combination of
122
+ * a possible structure and the native types. Ease parameter passing
123
+ * via use of the transparent union extension.
124
+ */
125
+#ifdef CONFIG_INT128
126
+typedef union {
127
+ Int128 s;
128
+ __int128_t i;
129
+ __uint128_t u;
130
+} Int128Alias __attribute__((transparent_union));
131
+#else
132
+typedef Int128 Int128Alias;
133
+#endif /* CONFIG_INT128 */
134
+
135
#endif /* INT128_H */
136
diff --git a/util/int128.c b/util/int128.c
137
index XXXXXXX..XXXXXXX 100644
138
--- a/util/int128.c
139
+++ b/util/int128.c
140
@@ -XXX,XX +XXX,XX @@ Int128 int128_rems(Int128 a, Int128 b)
141
return r;
142
}
143
144
+#elif defined(CONFIG_TCG_INTERPRETER)
145
+
146
+Int128 int128_divu(Int128 a_s, Int128 b_s)
147
+{
148
+ Int128Alias r, a, b;
149
+
150
+ a.s = a_s;
151
+ b.s = b_s;
152
+ r.u = a.u / b.u;
153
+ return r.s;
154
+}
155
+
156
+Int128 int128_remu(Int128 a_s, Int128 b_s)
157
+{
158
+ Int128Alias r, a, b;
159
+
160
+ a.s = a_s;
161
+ b.s = b_s;
162
+ r.u = a.u % b.u;
163
+ return r.s;
164
+}
165
+
166
+Int128 int128_divs(Int128 a_s, Int128 b_s)
167
+{
168
+ Int128Alias r, a, b;
169
+
170
+ a.s = a_s;
171
+ b.s = b_s;
172
+ r.i = a.i / b.i;
173
+ return r.s;
174
+}
175
+
176
+Int128 int128_rems(Int128 a_s, Int128 b_s)
177
+{
178
+ Int128Alias r, a, b;
179
+
180
+ a.s = a_s;
181
+ b.s = b_s;
182
+ r.i = a.i % b.i;
183
+ return r.s;
184
+}
185
+
19
+
186
#endif
20
#endif
187
--
21
--
188
2.34.1
22
2.43.0
189
23
190
24
diff view generated by jsdifflib
1
Make a copy of wout_x1 before modifying it, as wout_x1_P
1
We already have these assertions during opcode creation.
2
emphasizing that it operates on the out/out2 pair. The insns
3
that use x1_P are data movement that will not change to Int128.
4
2
5
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
5
---
9
target/s390x/tcg/insn-data.h.inc | 12 ++++++------
6
tcg/tci/tcg-target.c.inc | 20 ++------------------
10
target/s390x/tcg/translate.c | 8 ++++++++
7
1 file changed, 2 insertions(+), 18 deletions(-)
11
2 files changed, 14 insertions(+), 6 deletions(-)
12
8
13
diff --git a/target/s390x/tcg/insn-data.h.inc b/target/s390x/tcg/insn-data.h.inc
9
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
14
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
15
--- a/target/s390x/tcg/insn-data.h.inc
11
--- a/tcg/tci/tcg-target.c.inc
16
+++ b/target/s390x/tcg/insn-data.h.inc
12
+++ b/tcg/tci/tcg-target.c.inc
17
@@ -XXX,XX +XXX,XX @@
13
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
18
F(0x3800, LER, RR_a, Z, 0, e2, 0, cond_e1e2, mov2, 0, IF_AFP1 | IF_AFP2)
14
break;
19
F(0x7800, LE, RX_a, Z, 0, m2_32u, 0, e1, mov2, 0, IF_AFP1)
15
20
F(0xed64, LEY, RXY_a, LD, 0, m2_32u, 0, e1, mov2, 0, IF_AFP1)
16
CASE_32_64(deposit) /* Optional (TCG_TARGET_HAS_deposit_*). */
21
- F(0xb365, LXR, RRE, Z, x2h, x2l, 0, x1, movx, 0, IF_AFP1)
17
- {
22
+ F(0xb365, LXR, RRE, Z, x2h, x2l, 0, x1_P, movx, 0, IF_AFP1)
18
- TCGArg pos = args[3], len = args[4];
23
/* LOAD IMMEDIATE */
19
- TCGArg max = opc == INDEX_op_deposit_i32 ? 32 : 64;
24
C(0xc001, LGFI, RIL_a, EI, 0, i2, 0, r1, mov2, 0)
20
-
25
/* LOAD RELATIVE LONG */
21
- tcg_debug_assert(pos < max);
26
@@ -XXX,XX +XXX,XX @@
22
- tcg_debug_assert(pos + len <= max);
27
C(0xe332, LTGF, RXY_a, GIE, 0, a2, r1, 0, ld32s, s64)
23
-
28
F(0xb302, LTEBR, RRE, Z, 0, e2, 0, cond_e1e2, mov2, f32, IF_BFP)
24
- tcg_out_op_rrrbb(s, opc, args[0], args[1], args[2], pos, len);
29
F(0xb312, LTDBR, RRE, Z, 0, f2, 0, f1, mov2, f64, IF_BFP)
25
- }
30
- F(0xb342, LTXBR, RRE, Z, x2h, x2l, 0, x1, movx, f128, IF_BFP)
26
+ tcg_out_op_rrrbb(s, opc, args[0], args[1], args[2], args[3], args[4]);
31
+ F(0xb342, LTXBR, RRE, Z, x2h, x2l, 0, x1_P, movx, f128, IF_BFP)
27
break;
32
/* LOAD AND TRAP */
28
33
C(0xe39f, LAT, RXY_a, LAT, 0, m2_32u, r1, 0, lat, 0)
29
CASE_32_64(extract) /* Optional (TCG_TARGET_HAS_extract_*). */
34
C(0xe385, LGAT, RXY_a, LAT, 0, a2, r1, 0, lgat, 0)
30
CASE_32_64(sextract) /* Optional (TCG_TARGET_HAS_sextract_*). */
35
@@ -XXX,XX +XXX,XX @@
31
- {
36
C(0xb913, LCGFR, RRE, Z, 0, r2_32s, r1, 0, neg, neg64)
32
- TCGArg pos = args[2], len = args[3];
37
F(0xb303, LCEBR, RRE, Z, 0, e2, new, e1, negf32, f32, IF_BFP)
33
- TCGArg max = type == TCG_TYPE_I32 ? 32 : 64;
38
F(0xb313, LCDBR, RRE, Z, 0, f2, new, f1, negf64, f64, IF_BFP)
34
-
39
- F(0xb343, LCXBR, RRE, Z, x2h, x2l, new_P, x1, negf128, f128, IF_BFP)
35
- tcg_debug_assert(pos < max);
40
+ F(0xb343, LCXBR, RRE, Z, x2h, x2l, new_P, x1_P, negf128, f128, IF_BFP)
36
- tcg_debug_assert(pos + len <= max);
41
F(0xb373, LCDFR, RRE, FPSSH, 0, f2, new, f1, negf64, 0, IF_AFP1 | IF_AFP2)
37
-
42
/* LOAD COUNT TO BLOCK BOUNDARY */
38
- tcg_out_op_rrbb(s, opc, args[0], args[1], pos, len);
43
C(0xe727, LCBB, RXE, V, la2, 0, r1, 0, lcbb, 0)
39
- }
44
@@ -XXX,XX +XXX,XX @@
40
+ tcg_out_op_rrbb(s, opc, args[0], args[1], args[2], args[3]);
45
C(0xb911, LNGFR, RRE, Z, 0, r2_32s, r1, 0, nabs, nabs64)
41
break;
46
F(0xb301, LNEBR, RRE, Z, 0, e2, new, e1, nabsf32, f32, IF_BFP)
42
47
F(0xb311, LNDBR, RRE, Z, 0, f2, new, f1, nabsf64, f64, IF_BFP)
43
CASE_32_64(brcond)
48
- F(0xb341, LNXBR, RRE, Z, x2h, x2l, new_P, x1, nabsf128, f128, IF_BFP)
49
+ F(0xb341, LNXBR, RRE, Z, x2h, x2l, new_P, x1_P, nabsf128, f128, IF_BFP)
50
F(0xb371, LNDFR, RRE, FPSSH, 0, f2, new, f1, nabsf64, 0, IF_AFP1 | IF_AFP2)
51
/* LOAD ON CONDITION */
52
C(0xb9f2, LOCR, RRF_c, LOC, r1, r2, new, r1_32, loc, 0)
53
@@ -XXX,XX +XXX,XX @@
54
C(0xb910, LPGFR, RRE, Z, 0, r2_32s, r1, 0, abs, abs64)
55
F(0xb300, LPEBR, RRE, Z, 0, e2, new, e1, absf32, f32, IF_BFP)
56
F(0xb310, LPDBR, RRE, Z, 0, f2, new, f1, absf64, f64, IF_BFP)
57
- F(0xb340, LPXBR, RRE, Z, x2h, x2l, new_P, x1, absf128, f128, IF_BFP)
58
+ F(0xb340, LPXBR, RRE, Z, x2h, x2l, new_P, x1_P, absf128, f128, IF_BFP)
59
F(0xb370, LPDFR, RRE, FPSSH, 0, f2, new, f1, absf64, 0, IF_AFP1 | IF_AFP2)
60
/* LOAD REVERSED */
61
C(0xb91f, LRVR, RRE, Z, 0, r2_32u, new, r1_32, rev32, 0)
62
@@ -XXX,XX +XXX,XX @@
63
/* LOAD ZERO */
64
F(0xb374, LZER, RRE, Z, 0, 0, 0, e1, zero, 0, IF_AFP1)
65
F(0xb375, LZDR, RRE, Z, 0, 0, 0, f1, zero, 0, IF_AFP1)
66
- F(0xb376, LZXR, RRE, Z, 0, 0, 0, x1, zero2, 0, IF_AFP1)
67
+ F(0xb376, LZXR, RRE, Z, 0, 0, 0, x1_P, zero2, 0, IF_AFP1)
68
69
/* LOAD FPC */
70
F(0xb29d, LFPC, S, Z, 0, m2_32u, 0, 0, sfpc, 0, IF_BFP)
71
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
72
index XXXXXXX..XXXXXXX 100644
73
--- a/target/s390x/tcg/translate.c
74
+++ b/target/s390x/tcg/translate.c
75
@@ -XXX,XX +XXX,XX @@ static void wout_x1(DisasContext *s, DisasOps *o)
76
}
77
#define SPEC_wout_x1 SPEC_r1_f128
78
79
+static void wout_x1_P(DisasContext *s, DisasOps *o)
80
+{
81
+ int f1 = get_field(s, r1);
82
+ store_freg(f1, o->out);
83
+ store_freg(f1 + 2, o->out2);
84
+}
85
+#define SPEC_wout_x1_P SPEC_r1_f128
86
+
87
static void wout_cond_r1r2_32(DisasContext *s, DisasOps *o)
88
{
89
if (get_field(s, r1) != get_field(s, r2)) {
90
--
44
--
91
2.34.1
45
2.43.0
92
46
93
47
diff view generated by jsdifflib
1
We expect the backend to require register pairs in
1
Make extract and sextract "unconditional" in the sense
2
host-endian ordering, thus for big-endian the first
2
that the opcodes are always present. Rely instead on
3
register of a pair contains the high part.
3
TCG_TARGET_HAS_{s}extract_valid, now always defined.
4
We were forcing R0 to contain the low part for calls.
5
4
6
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
---
7
---
10
tcg/tci.c | 21 +++++++++++----------
8
tcg/aarch64/tcg-target-has.h | 4 ----
11
1 file changed, 11 insertions(+), 10 deletions(-)
9
tcg/arm/tcg-target-has.h | 2 --
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(-)
12
23
24
diff --git a/tcg/aarch64/tcg-target-has.h b/tcg/aarch64/tcg-target-has.h
25
index XXXXXXX..XXXXXXX 100644
26
--- a/tcg/aarch64/tcg-target-has.h
27
+++ b/tcg/aarch64/tcg-target-has.h
28
@@ -XXX,XX +XXX,XX @@
29
#define TCG_TARGET_HAS_ctz_i32 1
30
#define TCG_TARGET_HAS_ctpop_i32 0
31
#define TCG_TARGET_HAS_deposit_i32 1
32
-#define TCG_TARGET_HAS_extract_i32 1
33
-#define TCG_TARGET_HAS_sextract_i32 1
34
#define TCG_TARGET_HAS_extract2_i32 1
35
#define TCG_TARGET_HAS_negsetcond_i32 1
36
#define TCG_TARGET_HAS_add2_i32 1
37
@@ -XXX,XX +XXX,XX @@
38
#define TCG_TARGET_HAS_ctz_i64 1
39
#define TCG_TARGET_HAS_ctpop_i64 0
40
#define TCG_TARGET_HAS_deposit_i64 1
41
-#define TCG_TARGET_HAS_extract_i64 1
42
-#define TCG_TARGET_HAS_sextract_i64 1
43
#define TCG_TARGET_HAS_extract2_i64 1
44
#define TCG_TARGET_HAS_negsetcond_i64 1
45
#define TCG_TARGET_HAS_add2_i64 1
46
diff --git a/tcg/arm/tcg-target-has.h b/tcg/arm/tcg-target-has.h
47
index XXXXXXX..XXXXXXX 100644
48
--- a/tcg/arm/tcg-target-has.h
49
+++ b/tcg/arm/tcg-target-has.h
50
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
51
#define TCG_TARGET_HAS_ctz_i32 use_armv7_instructions
52
#define TCG_TARGET_HAS_ctpop_i32 0
53
#define TCG_TARGET_HAS_deposit_i32 use_armv7_instructions
54
-#define TCG_TARGET_HAS_extract_i32 1
55
-#define TCG_TARGET_HAS_sextract_i32 1
56
#define TCG_TARGET_HAS_extract2_i32 1
57
#define TCG_TARGET_HAS_negsetcond_i32 1
58
#define TCG_TARGET_HAS_mulu2_i32 1
59
diff --git a/tcg/i386/tcg-target-has.h b/tcg/i386/tcg-target-has.h
60
index XXXXXXX..XXXXXXX 100644
61
--- a/tcg/i386/tcg-target-has.h
62
+++ b/tcg/i386/tcg-target-has.h
63
@@ -XXX,XX +XXX,XX @@
64
#define TCG_TARGET_HAS_ctz_i32 1
65
#define TCG_TARGET_HAS_ctpop_i32 have_popcnt
66
#define TCG_TARGET_HAS_deposit_i32 1
67
-#define TCG_TARGET_HAS_extract_i32 1
68
-#define TCG_TARGET_HAS_sextract_i32 1
69
#define TCG_TARGET_HAS_extract2_i32 1
70
#define TCG_TARGET_HAS_negsetcond_i32 1
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;
275
}
276
if (TCG_TARGET_sextract_valid(TCG_TYPE_I32, sh, 1)) {
277
- sext_opc = TCG_TARGET_HAS_sextract_i32 ? INDEX_op_sextract_i32 : 0;
278
+ sext_opc = INDEX_op_sextract_i32;
279
}
280
break;
281
case TCG_TYPE_I64:
282
@@ -XXX,XX +XXX,XX @@ static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
283
shr_opc = INDEX_op_shr_i64;
284
neg_opc = INDEX_op_neg_i64;
285
if (TCG_TARGET_extract_valid(TCG_TYPE_I64, sh, 1)) {
286
- uext_opc = TCG_TARGET_HAS_extract_i64 ? INDEX_op_extract_i64 : 0;
287
+ uext_opc = INDEX_op_extract_i64;
288
}
289
if (TCG_TARGET_sextract_valid(TCG_TYPE_I64, sh, 1)) {
290
- sext_opc = TCG_TARGET_HAS_sextract_i64 ? INDEX_op_sextract_i64 : 0;
291
+ sext_opc = INDEX_op_sextract_i64;
292
}
293
break;
294
default:
295
diff --git a/tcg/tcg.c b/tcg/tcg.c
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:
13
diff --git a/tcg/tci.c b/tcg/tci.c
339
diff --git a/tcg/tci.c b/tcg/tci.c
14
index XXXXXXX..XXXXXXX 100644
340
index XXXXXXX..XXXXXXX 100644
15
--- a/tcg/tci.c
341
--- a/tcg/tci.c
16
+++ b/tcg/tci.c
342
+++ b/tcg/tci.c
17
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
343
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
18
ffi_call(pptr[1], pptr[0], stack, call_slots);
344
regs[r0] = deposit32(regs[r1], pos, len, regs[r2]);
19
}
345
break;
20
346
#endif
21
- /* Any result winds up "left-aligned" in the stack[0] slot. */
347
-#if TCG_TARGET_HAS_extract_i32
22
switch (len) {
348
case INDEX_op_extract_i32:
23
case 0: /* void */
349
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
24
break;
350
regs[r0] = extract32(regs[r1], pos, len);
25
case 1: /* uint32_t */
351
break;
26
/*
352
-#endif
27
+ * The result winds up "left-aligned" in the stack[0] slot.
353
-#if TCG_TARGET_HAS_sextract_i32
28
* Note that libffi has an odd special case in that it will
354
case INDEX_op_sextract_i32:
29
* always widen an integral result to ffi_arg.
355
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
30
*/
356
regs[r0] = sextract32(regs[r1], pos, len);
31
- if (sizeof(ffi_arg) == 4) {
357
break;
32
- regs[TCG_REG_R0] = *(uint32_t *)stack;
358
-#endif
33
- break;
359
case INDEX_op_brcond_i32:
34
- }
360
tci_args_rl(insn, tb_ptr, &r0, &ptr);
35
- /* fall through */
361
if ((uint32_t)regs[r0]) {
36
- case 2: /* uint64_t */
362
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
37
- if (TCG_TARGET_REG_BITS == 32) {
363
regs[r0] = deposit64(regs[r1], pos, len, regs[r2]);
38
- tci_write_reg64(regs, TCG_REG_R1, TCG_REG_R0, stack[0]);
364
break;
39
+ if (sizeof(ffi_arg) == 8) {
365
#endif
40
+ regs[TCG_REG_R0] = (uint32_t)stack[0];
366
-#if TCG_TARGET_HAS_extract_i64
41
} else {
367
case INDEX_op_extract_i64:
42
- regs[TCG_REG_R0] = stack[0];
368
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
43
+ regs[TCG_REG_R0] = *(uint32_t *)stack;
369
regs[r0] = extract64(regs[r1], pos, len);
44
}
370
break;
45
break;
371
-#endif
46
+ case 2: /* uint64_t */
372
-#if TCG_TARGET_HAS_sextract_i64
47
+ /*
373
case INDEX_op_sextract_i64:
48
+ * For TCG_TARGET_REG_BITS == 32, the register pair
374
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
49
+ * must stay in host memory order.
375
regs[r0] = sextract64(regs[r1], pos, len);
50
+ */
376
break;
51
+ memcpy(&regs[TCG_REG_R0], stack, 8);
377
-#endif
52
+ break;
378
case INDEX_op_brcond_i64:
53
default:
379
tci_args_rl(insn, tb_ptr, &r0, &ptr);
54
g_assert_not_reached();
380
if (regs[r0]) {
55
}
56
--
381
--
57
2.34.1
382
2.43.0
58
383
59
384
diff view generated by jsdifflib
1
Fill in the parameters for libffi for Int128.
1
Make deposit "unconditional" in the sense that the opcode is
2
Adjust the interpreter to allow for 16-byte return values.
2
always present. Rely instead on TCG_TARGET_deposit_valid,
3
Adjust tcg_out_call to record the return value length.
3
now always defined.
4
4
5
Call parameters are no longer all the same size, so we
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
cannot reuse the same call_slots array for every function.
7
Compute it each time now, but only fill in slots required
8
for the call we're about to make.
9
10
Reviewed-by: Alex Bennée <alex.bennee@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
tcg/tci/tcg-target.h | 3 +++
8
tcg/aarch64/tcg-target-has.h | 3 +--
14
tcg/tcg.c | 19 +++++++++++++++++
9
tcg/arm/tcg-target-has.h | 2 +-
15
tcg/tci.c | 44 ++++++++++++++++++++--------------------
10
tcg/i386/tcg-target-has.h | 5 +----
16
tcg/tci/tcg-target.c.inc | 10 ++++-----
11
tcg/loongarch64/tcg-target-has.h | 3 +--
17
4 files changed, 49 insertions(+), 27 deletions(-)
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(-)
18
24
19
diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h
25
diff --git a/tcg/aarch64/tcg-target-has.h b/tcg/aarch64/tcg-target-has.h
20
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
21
--- a/tcg/tci/tcg-target.h
27
--- a/tcg/aarch64/tcg-target-has.h
22
+++ b/tcg/tci/tcg-target.h
28
+++ b/tcg/aarch64/tcg-target-has.h
23
@@ -XXX,XX +XXX,XX @@ typedef enum {
29
@@ -XXX,XX +XXX,XX @@
24
#if TCG_TARGET_REG_BITS == 32
30
#define TCG_TARGET_HAS_clz_i32 1
25
# define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EVEN
31
#define TCG_TARGET_HAS_ctz_i32 1
26
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
32
#define TCG_TARGET_HAS_ctpop_i32 0
27
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
33
-#define TCG_TARGET_HAS_deposit_i32 1
28
#else
34
#define TCG_TARGET_HAS_extract2_i32 1
29
# define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
35
#define TCG_TARGET_HAS_negsetcond_i32 1
30
# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
36
#define TCG_TARGET_HAS_add2_i32 1
31
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
37
@@ -XXX,XX +XXX,XX @@
32
#endif
38
#define TCG_TARGET_HAS_clz_i64 1
33
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
39
#define TCG_TARGET_HAS_ctz_i64 1
34
40
#define TCG_TARGET_HAS_ctpop_i64 0
35
#define HAVE_TCG_QEMU_TB_EXEC
41
-#define TCG_TARGET_HAS_deposit_i64 1
36
#define TCG_TARGET_NEED_POOL_LABELS
42
#define TCG_TARGET_HAS_extract2_i64 1
43
#define TCG_TARGET_HAS_negsetcond_i64 1
44
#define TCG_TARGET_HAS_add2_i64 1
45
@@ -XXX,XX +XXX,XX @@
46
47
#define TCG_TARGET_extract_valid(type, ofs, len) 1
48
#define TCG_TARGET_sextract_valid(type, ofs, len) 1
49
+#define TCG_TARGET_deposit_valid(type, ofs, len) 1
50
51
#endif
52
diff --git a/tcg/arm/tcg-target-has.h b/tcg/arm/tcg-target-has.h
53
index XXXXXXX..XXXXXXX 100644
54
--- a/tcg/arm/tcg-target-has.h
55
+++ b/tcg/arm/tcg-target-has.h
56
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
57
#define TCG_TARGET_HAS_clz_i32 1
58
#define TCG_TARGET_HAS_ctz_i32 use_armv7_instructions
59
#define TCG_TARGET_HAS_ctpop_i32 0
60
-#define TCG_TARGET_HAS_deposit_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
@@ -XXX,XX +XXX,XX @@ tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
65
66
#define TCG_TARGET_extract_valid tcg_target_extract_valid
67
#define TCG_TARGET_sextract_valid tcg_target_extract_valid
68
+#define TCG_TARGET_deposit_valid(type, ofs, len) use_armv7_instructions
69
70
#endif
71
diff --git a/tcg/i386/tcg-target-has.h b/tcg/i386/tcg-target-has.h
72
index XXXXXXX..XXXXXXX 100644
73
--- a/tcg/i386/tcg-target-has.h
74
+++ b/tcg/i386/tcg-target-has.h
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);
37
diff --git a/tcg/tcg.c b/tcg/tcg.c
384
diff --git a/tcg/tcg.c b/tcg/tcg.c
38
index XXXXXXX..XXXXXXX 100644
385
index XXXXXXX..XXXXXXX 100644
39
--- a/tcg/tcg.c
386
--- a/tcg/tcg.c
40
+++ b/tcg/tcg.c
387
+++ b/tcg/tcg.c
41
@@ -XXX,XX +XXX,XX @@ static GHashTable *helper_table;
388
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
42
#ifdef CONFIG_TCG_INTERPRETER
389
case INDEX_op_sar_i32:
43
static ffi_type *typecode_to_ffi(int argmask)
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)
44
{
425
{
45
+ /*
426
+ unsigned width;
46
+ * libffi does not support __int128_t, so we have forced Int128
47
+ * to use the structure definition instead of the builtin type.
48
+ */
49
+ static ffi_type *ffi_type_i128_elements[3] = {
50
+ &ffi_type_uint64,
51
+ &ffi_type_uint64,
52
+ NULL
53
+ };
54
+ static ffi_type ffi_type_i128 = {
55
+ .size = 16,
56
+ .alignment = __alignof__(Int128),
57
+ .type = FFI_TYPE_STRUCT,
58
+ .elements = ffi_type_i128_elements,
59
+ };
60
+
427
+
61
switch (argmask) {
428
+ tcg_debug_assert(type == TCG_TYPE_I32 || type == TCG_TYPE_I64);
62
case dh_typecode_void:
429
+ width = (type == TCG_TYPE_I32 ? 32 : 64);
63
return &ffi_type_void;
430
+
64
@@ -XXX,XX +XXX,XX @@ static ffi_type *typecode_to_ffi(int argmask)
431
+ tcg_debug_assert(ofs < width);
65
return &ffi_type_sint64;
432
tcg_debug_assert(len > 0);
66
case dh_typecode_ptr:
433
- switch (type) {
67
return &ffi_type_pointer;
434
- case TCG_TYPE_I32:
68
+ case dh_typecode_i128:
435
- tcg_debug_assert(ofs < 32);
69
+ return &ffi_type_i128;
436
- tcg_debug_assert(len <= 32);
70
}
437
- tcg_debug_assert(ofs + len <= 32);
71
g_assert_not_reached();
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);
72
}
452
}
73
@@ -XXX,XX +XXX,XX @@ static void init_ffi_layouts(void)
453
74
/* Ignoring the return type, find the last non-zero field. */
454
static TCGOp *tcg_op_alloc(TCGOpcode opc, unsigned nargs);
75
nargs = 32 - clz32(typemask >> 3);
76
nargs = DIV_ROUND_UP(nargs, 3);
77
+ assert(nargs <= MAX_CALL_IARGS);
78
79
ca = g_malloc0(sizeof(*ca) + nargs * sizeof(ffi_type *));
80
ca->cif.rtype = typecode_to_ffi(typemask & 7);
81
diff --git a/tcg/tci.c b/tcg/tci.c
455
diff --git a/tcg/tci.c b/tcg/tci.c
82
index XXXXXXX..XXXXXXX 100644
456
index XXXXXXX..XXXXXXX 100644
83
--- a/tcg/tci.c
457
--- a/tcg/tci.c
84
+++ b/tcg/tci.c
458
+++ b/tcg/tci.c
85
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
459
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
86
tcg_target_ulong regs[TCG_TARGET_NB_REGS];
460
regs[r0] = ror32(regs[r1], regs[r2] & 31);
87
uint64_t stack[(TCG_STATIC_CALL_ARGS_SIZE + TCG_STATIC_FRAME_SIZE)
461
break;
88
/ sizeof(uint64_t)];
462
#endif
89
- void *call_slots[TCG_STATIC_CALL_ARGS_SIZE / sizeof(uint64_t)];
463
-#if TCG_TARGET_HAS_deposit_i32
90
464
case INDEX_op_deposit_i32:
91
regs[TCG_AREG0] = (tcg_target_ulong)env;
465
tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len);
92
regs[TCG_REG_CALL_STACK] = (uintptr_t)stack;
466
regs[r0] = deposit32(regs[r1], pos, len, regs[r2]);
93
- /* Other call_slots entries initialized at first use (see below). */
467
break;
94
- call_slots[0] = NULL;
468
-#endif
95
tci_assert(tb_ptr);
469
case INDEX_op_extract_i32:
96
470
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
97
for (;;) {
471
regs[r0] = extract32(regs[r1], pos, len);
98
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
472
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
99
473
regs[r0] = ror64(regs[r1], regs[r2] & 63);
100
switch (opc) {
474
break;
101
case INDEX_op_call:
475
#endif
102
- /*
476
-#if TCG_TARGET_HAS_deposit_i64
103
- * Set up the ffi_avalue array once, delayed until now
477
case INDEX_op_deposit_i64:
104
- * because many TB's do not make any calls. In tcg_gen_callN,
478
tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len);
105
- * we arranged for every real argument to be "left-aligned"
479
regs[r0] = deposit64(regs[r1], pos, len, regs[r2]);
106
- * in each 64-bit slot.
480
break;
107
- */
481
-#endif
108
- if (unlikely(call_slots[0] == NULL)) {
482
case INDEX_op_extract_i64:
109
- for (int i = 0; i < ARRAY_SIZE(call_slots); ++i) {
483
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
110
- call_slots[i] = &stack[i];
484
regs[r0] = extract64(regs[r1], pos, len);
111
- }
112
- }
113
-
114
- tci_args_nl(insn, tb_ptr, &len, &ptr);
115
-
116
- /* Helper functions may need to access the "return address" */
117
- tci_tb_ptr = (uintptr_t)tb_ptr;
118
-
119
{
120
- void **pptr = ptr;
121
- ffi_call(pptr[1], pptr[0], stack, call_slots);
122
+ void *call_slots[MAX_CALL_IARGS];
123
+ ffi_cif *cif;
124
+ void *func;
125
+ unsigned i, s, n;
126
+
127
+ tci_args_nl(insn, tb_ptr, &len, &ptr);
128
+ func = ((void **)ptr)[0];
129
+ cif = ((void **)ptr)[1];
130
+
131
+ n = cif->nargs;
132
+ for (i = s = 0; i < n; ++i) {
133
+ ffi_type *t = cif->arg_types[i];
134
+ call_slots[i] = &stack[s];
135
+ s += DIV_ROUND_UP(t->size, 8);
136
+ }
137
+
138
+ /* Helper functions may need to access the "return address" */
139
+ tci_tb_ptr = (uintptr_t)tb_ptr;
140
+ ffi_call(cif, func, stack, call_slots);
141
}
142
143
switch (len) {
144
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
145
*/
146
memcpy(&regs[TCG_REG_R0], stack, 8);
147
break;
148
+ case 3: /* Int128 */
149
+ memcpy(&regs[TCG_REG_R0], stack, 16);
150
+ break;
151
default:
152
g_assert_not_reached();
153
}
154
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
485
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
155
index XXXXXXX..XXXXXXX 100644
486
index XXXXXXX..XXXXXXX 100644
156
--- a/tcg/tci/tcg-target.c.inc
487
--- a/tcg/tci/tcg-target.c.inc
157
+++ b/tcg/tci/tcg-target.c.inc
488
+++ b/tcg/tci/tcg-target.c.inc
158
@@ -XXX,XX +XXX,XX @@ static const int tcg_target_call_iarg_regs[] = { };
489
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
159
static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot)
490
tcg_out_op_rrr(s, opc, args[0], args[1], args[2]);
160
{
491
break;
161
tcg_debug_assert(kind == TCG_CALL_RET_NORMAL);
492
162
- tcg_debug_assert(slot >= 0 && slot < 64 / TCG_TARGET_REG_BITS);
493
- CASE_32_64(deposit) /* Optional (TCG_TARGET_HAS_deposit_*). */
163
+ tcg_debug_assert(slot >= 0 && slot < 128 / TCG_TARGET_REG_BITS);
494
+ CASE_32_64(deposit)
164
return TCG_REG_R0 + slot;
495
tcg_out_op_rrrbb(s, opc, args[0], args[1], args[2], args[3], args[4]);
165
}
496
break;
166
497
167
@@ -XXX,XX +XXX,XX @@ static void tcg_out_call(TCGContext *s, const tcg_insn_unit *func,
168
169
if (cif->rtype == &ffi_type_void) {
170
which = 0;
171
- } else if (cif->rtype->size == 4) {
172
- which = 1;
173
} else {
174
- tcg_debug_assert(cif->rtype->size == 8);
175
- which = 2;
176
+ tcg_debug_assert(cif->rtype->size == 4 ||
177
+ cif->rtype->size == 8 ||
178
+ cif->rtype->size == 16);
179
+ which = ctz32(cif->rtype->size) - 1;
180
}
181
new_pool_l2(s, 20, s->code_ptr, 0, (uintptr_t)func, (uintptr_t)cif);
182
insn = deposit32(insn, 0, 8, INDEX_op_call);
183
--
498
--
184
2.34.1
499
2.43.0
185
500
186
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: Ilya Leoshkevich <iii@linux.ibm.com>
1
From: Helge Deller <deller@kernel.org>
2
2
3
Add a simple test to prevent regressions.
3
Add some missing fields which may be parsed by userspace applications.
4
4
5
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
5
Signed-off-by: Helge Deller <deller@gmx.de>
6
Message-Id: <20230201133257.3223115-1-iii@linux.ibm.com>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Message-ID: <Z39B1wzNNpndmOxZ@p100>
8
---
9
---
9
tests/tcg/s390x/cdsg.c | 93 +++++++++++++++++++++++++++++++++
10
linux-user/sparc/target_proc.h | 20 +++++++++++++++++++-
10
tests/tcg/s390x/Makefile.target | 4 ++
11
1 file changed, 19 insertions(+), 1 deletion(-)
11
2 files changed, 97 insertions(+)
12
create mode 100644 tests/tcg/s390x/cdsg.c
13
12
14
diff --git a/tests/tcg/s390x/cdsg.c b/tests/tcg/s390x/cdsg.c
13
diff --git a/linux-user/sparc/target_proc.h b/linux-user/sparc/target_proc.h
15
new file mode 100644
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX
15
--- a/linux-user/sparc/target_proc.h
17
--- /dev/null
16
+++ b/linux-user/sparc/target_proc.h
18
+++ b/tests/tcg/s390x/cdsg.c
19
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@
20
+/*
18
21
+ * Test CDSG instruction.
19
static int open_cpuinfo(CPUArchState *cpu_env, int fd)
22
+ *
20
{
23
+ * Increment the first half of aligned_quadword by 1, and the second half by 2
21
- dprintf(fd, "type\t\t: sun4u\n");
24
+ * from 2 threads. Verify that the result is consistent.
22
+ int i, num_cpus;
25
+ *
23
+ const char *cpu_type;
26
+ * SPDX-License-Identifier: GPL-2.0-or-later
27
+ */
28
+#include <assert.h>
29
+#include <pthread.h>
30
+#include <stdbool.h>
31
+#include <stdlib.h>
32
+
24
+
33
+static volatile bool start;
25
+ num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
34
+typedef unsigned long aligned_quadword[2] __attribute__((__aligned__(16)));
26
+ if (cpu_env->def.features & CPU_FEATURE_HYPV) {
35
+static aligned_quadword val;
27
+ cpu_type = "sun4v";
36
+static const int n_iterations = 1000000;
28
+ } else {
37
+
29
+ cpu_type = "sun4u";
38
+static inline int cdsg(unsigned long *orig0, unsigned long *orig1,
39
+ unsigned long new0, unsigned long new1,
40
+ aligned_quadword *mem)
41
+{
42
+ register unsigned long r0 asm("r0");
43
+ register unsigned long r1 asm("r1");
44
+ register unsigned long r2 asm("r2");
45
+ register unsigned long r3 asm("r3");
46
+ int cc;
47
+
48
+ r0 = *orig0;
49
+ r1 = *orig1;
50
+ r2 = new0;
51
+ r3 = new1;
52
+ asm("cdsg %[r0],%[r2],%[db2]\n"
53
+ "ipm %[cc]"
54
+ : [r0] "+r" (r0)
55
+ , [r1] "+r" (r1)
56
+ , [db2] "+m" (*mem)
57
+ , [cc] "=r" (cc)
58
+ : [r2] "r" (r2)
59
+ , [r3] "r" (r3)
60
+ : "cc");
61
+ *orig0 = r0;
62
+ *orig1 = r1;
63
+
64
+ return (cc >> 28) & 3;
65
+}
66
+
67
+void *cdsg_loop(void *arg)
68
+{
69
+ unsigned long orig0, orig1, new0, new1;
70
+ int cc;
71
+ int i;
72
+
73
+ while (!start) {
74
+ }
30
+ }
75
+
31
+
76
+ orig0 = val[0];
32
+ dprintf(fd, "cpu\t\t: %s (QEMU)\n", cpu_env->def.name);
77
+ orig1 = val[1];
33
+ dprintf(fd, "type\t\t: %s\n", cpu_type);
78
+ for (i = 0; i < n_iterations;) {
34
+ dprintf(fd, "ncpus probed\t: %d\n", num_cpus);
79
+ new0 = orig0 + 1;
35
+ dprintf(fd, "ncpus active\t: %d\n", num_cpus);
80
+ new1 = orig1 + 2;
36
+ dprintf(fd, "State:\n");
81
+
37
+ for (i = 0; i < num_cpus; i++) {
82
+ cc = cdsg(&orig0, &orig1, new0, new1, &val);
38
+ dprintf(fd, "CPU%d:\t\t: online\n", i);
83
+
84
+ if (cc == 0) {
85
+ orig0 = new0;
86
+ orig1 = new1;
87
+ i++;
88
+ } else {
89
+ assert(cc == 1);
90
+ }
91
+ }
39
+ }
92
+
40
+
93
+ return NULL;
41
return 0;
94
+}
42
}
95
+
43
#define HAVE_ARCH_PROC_CPUINFO
96
+int main(void)
97
+{
98
+ pthread_t thread;
99
+ int ret;
100
+
101
+ ret = pthread_create(&thread, NULL, cdsg_loop, NULL);
102
+ assert(ret == 0);
103
+ start = true;
104
+ cdsg_loop(NULL);
105
+ ret = pthread_join(thread, NULL);
106
+ assert(ret == 0);
107
+
108
+ assert(val[0] == n_iterations * 2);
109
+ assert(val[1] == n_iterations * 4);
110
+
111
+ return EXIT_SUCCESS;
112
+}
113
diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target
114
index XXXXXXX..XXXXXXX 100644
115
--- a/tests/tcg/s390x/Makefile.target
116
+++ b/tests/tcg/s390x/Makefile.target
117
@@ -XXX,XX +XXX,XX @@ TESTS+=noexec
118
TESTS+=div
119
TESTS+=clst
120
TESTS+=long-double
121
+TESTS+=cdsg
122
+
123
+cdsg: CFLAGS+=-pthread
124
+cdsg: LDFLAGS+=-pthread
125
126
Z13_TESTS=vistr
127
$(Z13_TESTS): CFLAGS+=-march=z13 -O2
128
--
44
--
129
2.34.1
45
2.43.0
diff view generated by jsdifflib
1
From: Ilya Leoshkevich <iii@linux.ibm.com>
2
3
These similarly named functions serve different purposes; add
4
docstrings to highlight them.
5
6
Suggested-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
8
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
Message-ID: <20250116213214.5695-1-iii@linux.ibm.com>
3
Message-Id: <20221112042555.2622152-2-richard.henderson@linaro.org>
4
---
12
---
5
target/arm/helper-a64.h | 6 ---
13
include/tcg/tcg.h | 41 +++++++++++++++++++++++++++++++++++++++++
6
target/arm/helper-a64.c | 104 -------------------------------------
14
accel/tcg/cpu-exec.c | 15 ++++++++++++++-
7
target/arm/translate-a64.c | 60 ++++++++++++---------
15
2 files changed, 55 insertions(+), 1 deletion(-)
8
3 files changed, 35 insertions(+), 135 deletions(-)
9
16
10
diff --git a/target/arm/helper-a64.h b/target/arm/helper-a64.h
17
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
11
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
12
--- a/target/arm/helper-a64.h
19
--- a/include/tcg/tcg.h
13
+++ b/target/arm/helper-a64.h
20
+++ b/include/tcg/tcg.h
14
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(frecpx_f16, TCG_CALL_NO_RWG, f16, f16, ptr)
21
@@ -XXX,XX +XXX,XX @@ void tcg_region_reset_all(void);
15
DEF_HELPER_FLAGS_2(fcvtx_f64_to_f32, TCG_CALL_NO_RWG, f32, f64, env)
22
size_t tcg_code_size(void);
16
DEF_HELPER_FLAGS_3(crc32_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32)
23
size_t tcg_code_capacity(void);
17
DEF_HELPER_FLAGS_3(crc32c_64, TCG_CALL_NO_RWG_SE, i64, i64, i64, i32)
24
18
-DEF_HELPER_FLAGS_4(paired_cmpxchg64_le, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
25
+/**
19
-DEF_HELPER_FLAGS_4(paired_cmpxchg64_le_parallel, TCG_CALL_NO_WG,
26
+ * tcg_tb_insert:
20
- i64, env, i64, i64, i64)
27
+ * @tb: translation block to insert
21
-DEF_HELPER_FLAGS_4(paired_cmpxchg64_be, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
28
+ *
22
-DEF_HELPER_FLAGS_4(paired_cmpxchg64_be_parallel, TCG_CALL_NO_WG,
29
+ * Insert @tb into the region trees.
23
- i64, env, i64, i64, i64)
30
+ */
24
DEF_HELPER_5(casp_le_parallel, void, env, i32, i64, i64, i64)
31
void tcg_tb_insert(TranslationBlock *tb);
25
DEF_HELPER_5(casp_be_parallel, void, env, i32, i64, i64, i64)
32
+
26
DEF_HELPER_FLAGS_3(advsimd_maxh, TCG_CALL_NO_RWG, f16, f16, f16, ptr)
33
+/**
27
diff --git a/target/arm/helper-a64.c b/target/arm/helper-a64.c
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
28
index XXXXXXX..XXXXXXX 100644
74
index XXXXXXX..XXXXXXX 100644
29
--- a/target/arm/helper-a64.c
75
--- a/accel/tcg/cpu-exec.c
30
+++ b/target/arm/helper-a64.c
76
+++ b/accel/tcg/cpu-exec.c
31
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(crc32c_64)(uint64_t acc, uint64_t val, uint32_t bytes)
77
@@ -XXX,XX +XXX,XX @@ static TranslationBlock *tb_htable_lookup(CPUState *cpu, vaddr pc,
32
return crc32c(acc, buf, bytes) ^ 0xffffffff;
78
return qht_lookup_custom(&tb_ctx.htable, &desc, h, tb_lookup_cmp);
33
}
79
}
34
80
35
-uint64_t HELPER(paired_cmpxchg64_le)(CPUARMState *env, uint64_t addr,
81
-/* Might cause an exception, so have a longjmp destination ready */
36
- uint64_t new_lo, uint64_t new_hi)
82
+/**
37
-{
83
+ * tb_lookup:
38
- Int128 cmpv = int128_make128(env->exclusive_val, env->exclusive_high);
84
+ * @cpu: CPU that will execute the returned translation block
39
- Int128 newv = int128_make128(new_lo, new_hi);
85
+ * @pc: guest PC
40
- Int128 oldv;
86
+ * @cs_base: arch-specific value associated with translation block
41
- uintptr_t ra = GETPC();
87
+ * @flags: arch-specific translation block flags
42
- uint64_t o0, o1;
88
+ * @cflags: CF_* flags
43
- bool success;
89
+ *
44
- int mem_idx = cpu_mmu_index(env, false);
90
+ * Look up a translation block inside the QHT using @pc, @cs_base, @flags and
45
- MemOpIdx oi0 = make_memop_idx(MO_LEUQ | MO_ALIGN_16, mem_idx);
91
+ * @cflags. Uses @cpu's tb_jmp_cache. Might cause an exception, so have a
46
- MemOpIdx oi1 = make_memop_idx(MO_LEUQ, mem_idx);
92
+ * longjmp destination ready.
47
-
93
+ *
48
- o0 = cpu_ldq_le_mmu(env, addr + 0, oi0, ra);
94
+ * Returns: an existing translation block or NULL.
49
- o1 = cpu_ldq_le_mmu(env, addr + 8, oi1, ra);
95
+ */
50
- oldv = int128_make128(o0, o1);
96
static inline TranslationBlock *tb_lookup(CPUState *cpu, vaddr pc,
51
-
97
uint64_t cs_base, uint32_t flags,
52
- success = int128_eq(oldv, cmpv);
98
uint32_t cflags)
53
- if (success) {
54
- cpu_stq_le_mmu(env, addr + 0, int128_getlo(newv), oi1, ra);
55
- cpu_stq_le_mmu(env, addr + 8, int128_gethi(newv), oi1, ra);
56
- }
57
-
58
- return !success;
59
-}
60
-
61
-uint64_t HELPER(paired_cmpxchg64_le_parallel)(CPUARMState *env, uint64_t addr,
62
- uint64_t new_lo, uint64_t new_hi)
63
-{
64
- Int128 oldv, cmpv, newv;
65
- uintptr_t ra = GETPC();
66
- bool success;
67
- int mem_idx;
68
- MemOpIdx oi;
69
-
70
- assert(HAVE_CMPXCHG128);
71
-
72
- mem_idx = cpu_mmu_index(env, false);
73
- oi = make_memop_idx(MO_LE | MO_128 | MO_ALIGN, mem_idx);
74
-
75
- cmpv = int128_make128(env->exclusive_val, env->exclusive_high);
76
- newv = int128_make128(new_lo, new_hi);
77
- oldv = cpu_atomic_cmpxchgo_le_mmu(env, addr, cmpv, newv, oi, ra);
78
-
79
- success = int128_eq(oldv, cmpv);
80
- return !success;
81
-}
82
-
83
-uint64_t HELPER(paired_cmpxchg64_be)(CPUARMState *env, uint64_t addr,
84
- uint64_t new_lo, uint64_t new_hi)
85
-{
86
- /*
87
- * High and low need to be switched here because this is not actually a
88
- * 128bit store but two doublewords stored consecutively
89
- */
90
- Int128 cmpv = int128_make128(env->exclusive_high, env->exclusive_val);
91
- Int128 newv = int128_make128(new_hi, new_lo);
92
- Int128 oldv;
93
- uintptr_t ra = GETPC();
94
- uint64_t o0, o1;
95
- bool success;
96
- int mem_idx = cpu_mmu_index(env, false);
97
- MemOpIdx oi0 = make_memop_idx(MO_BEUQ | MO_ALIGN_16, mem_idx);
98
- MemOpIdx oi1 = make_memop_idx(MO_BEUQ, mem_idx);
99
-
100
- o1 = cpu_ldq_be_mmu(env, addr + 0, oi0, ra);
101
- o0 = cpu_ldq_be_mmu(env, addr + 8, oi1, ra);
102
- oldv = int128_make128(o0, o1);
103
-
104
- success = int128_eq(oldv, cmpv);
105
- if (success) {
106
- cpu_stq_be_mmu(env, addr + 0, int128_gethi(newv), oi1, ra);
107
- cpu_stq_be_mmu(env, addr + 8, int128_getlo(newv), oi1, ra);
108
- }
109
-
110
- return !success;
111
-}
112
-
113
-uint64_t HELPER(paired_cmpxchg64_be_parallel)(CPUARMState *env, uint64_t addr,
114
- uint64_t new_lo, uint64_t new_hi)
115
-{
116
- Int128 oldv, cmpv, newv;
117
- uintptr_t ra = GETPC();
118
- bool success;
119
- int mem_idx;
120
- MemOpIdx oi;
121
-
122
- assert(HAVE_CMPXCHG128);
123
-
124
- mem_idx = cpu_mmu_index(env, false);
125
- oi = make_memop_idx(MO_BE | MO_128 | MO_ALIGN, mem_idx);
126
-
127
- /*
128
- * High and low need to be switched here because this is not actually a
129
- * 128bit store but two doublewords stored consecutively
130
- */
131
- cmpv = int128_make128(env->exclusive_high, env->exclusive_val);
132
- newv = int128_make128(new_hi, new_lo);
133
- oldv = cpu_atomic_cmpxchgo_be_mmu(env, addr, cmpv, newv, oi, ra);
134
-
135
- success = int128_eq(oldv, cmpv);
136
- return !success;
137
-}
138
-
139
/* Writes back the old data into Rs. */
140
void HELPER(casp_le_parallel)(CPUARMState *env, uint32_t rs, uint64_t addr,
141
uint64_t new_lo, uint64_t new_hi)
142
diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c
143
index XXXXXXX..XXXXXXX 100644
144
--- a/target/arm/translate-a64.c
145
+++ b/target/arm/translate-a64.c
146
@@ -XXX,XX +XXX,XX @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2,
147
get_mem_index(s),
148
MO_64 | MO_ALIGN | s->be_data);
149
tcg_gen_setcond_i64(TCG_COND_NE, tmp, tmp, cpu_exclusive_val);
150
- } else if (tb_cflags(s->base.tb) & CF_PARALLEL) {
151
- if (!HAVE_CMPXCHG128) {
152
- gen_helper_exit_atomic(cpu_env);
153
- /*
154
- * Produce a result so we have a well-formed opcode
155
- * stream when the following (dead) code uses 'tmp'.
156
- * TCG will remove the dead ops for us.
157
- */
158
- tcg_gen_movi_i64(tmp, 0);
159
- } else if (s->be_data == MO_LE) {
160
- gen_helper_paired_cmpxchg64_le_parallel(tmp, cpu_env,
161
- cpu_exclusive_addr,
162
- cpu_reg(s, rt),
163
- cpu_reg(s, rt2));
164
- } else {
165
- gen_helper_paired_cmpxchg64_be_parallel(tmp, cpu_env,
166
- cpu_exclusive_addr,
167
- cpu_reg(s, rt),
168
- cpu_reg(s, rt2));
169
- }
170
- } else if (s->be_data == MO_LE) {
171
- gen_helper_paired_cmpxchg64_le(tmp, cpu_env, cpu_exclusive_addr,
172
- cpu_reg(s, rt), cpu_reg(s, rt2));
173
} else {
174
- gen_helper_paired_cmpxchg64_be(tmp, cpu_env, cpu_exclusive_addr,
175
- cpu_reg(s, rt), cpu_reg(s, rt2));
176
+ TCGv_i128 t16 = tcg_temp_new_i128();
177
+ TCGv_i128 c16 = tcg_temp_new_i128();
178
+ TCGv_i64 a, b;
179
+
180
+ if (s->be_data == MO_LE) {
181
+ tcg_gen_concat_i64_i128(t16, cpu_reg(s, rt), cpu_reg(s, rt2));
182
+ tcg_gen_concat_i64_i128(c16, cpu_exclusive_val,
183
+ cpu_exclusive_high);
184
+ } else {
185
+ tcg_gen_concat_i64_i128(t16, cpu_reg(s, rt2), cpu_reg(s, rt));
186
+ tcg_gen_concat_i64_i128(c16, cpu_exclusive_high,
187
+ cpu_exclusive_val);
188
+ }
189
+
190
+ tcg_gen_atomic_cmpxchg_i128(t16, cpu_exclusive_addr, c16, t16,
191
+ get_mem_index(s),
192
+ MO_128 | MO_ALIGN | s->be_data);
193
+ tcg_temp_free_i128(c16);
194
+
195
+ a = tcg_temp_new_i64();
196
+ b = tcg_temp_new_i64();
197
+ if (s->be_data == MO_LE) {
198
+ tcg_gen_extr_i128_i64(a, b, t16);
199
+ } else {
200
+ tcg_gen_extr_i128_i64(b, a, t16);
201
+ }
202
+
203
+ tcg_gen_xor_i64(a, a, cpu_exclusive_val);
204
+ tcg_gen_xor_i64(b, b, cpu_exclusive_high);
205
+ tcg_gen_or_i64(tmp, a, b);
206
+ tcg_temp_free_i64(a);
207
+ tcg_temp_free_i64(b);
208
+ tcg_temp_free_i128(t16);
209
+
210
+ tcg_gen_setcondi_i64(TCG_COND_NE, tmp, tmp, 0);
211
}
212
} else {
213
tcg_gen_atomic_cmpxchg_i64(tmp, cpu_exclusive_addr, cpu_exclusive_val,
214
--
99
--
215
2.34.1
100
2.43.0
101
102
diff view generated by jsdifflib
1
From: Ilya Leoshkevich <iii@linux.ibm.com>
1
From: Ilya Leoshkevich <iii@linux.ibm.com>
2
2
3
Add a basic test to prevent regressions.
3
Currently one-insn TBs created from I/O memory are not added to
4
region_trees. Therefore, when they generate exceptions, they are not
5
handled by cpu_restore_state_from_tb().
4
6
7
For x86 this is not a problem, because x86_restore_state_to_opc() only
8
restores pc and cc, which already have the correct values if the first
9
TB instruction causes an exception. However, on several other
10
architectures, restore_state_to_opc() is not stricly limited to state
11
restoration and affects some exception-related registers, where guests
12
can notice incorrect values, for example:
13
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>
29
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
30
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
6
Message-Id: <20221025213008.2209006-2-iii@linux.ibm.com>
31
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
32
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
33
Message-ID: <20250116213214.5695-2-iii@linux.ibm.com>
8
---
34
---
9
tests/tcg/s390x/clst.c | 82 +++++++++++++++++++++++++++++++++
35
accel/tcg/translate-all.c | 29 +++++++++++++++++++----------
10
tests/tcg/s390x/Makefile.target | 1 +
36
1 file changed, 19 insertions(+), 10 deletions(-)
11
2 files changed, 83 insertions(+)
12
create mode 100644 tests/tcg/s390x/clst.c
13
37
14
diff --git a/tests/tcg/s390x/clst.c b/tests/tcg/s390x/clst.c
38
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
15
new file mode 100644
39
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX
40
--- a/accel/tcg/translate-all.c
17
--- /dev/null
41
+++ b/accel/tcg/translate-all.c
18
+++ b/tests/tcg/s390x/clst.c
42
@@ -XXX,XX +XXX,XX @@ TranslationBlock *tb_gen_code(CPUState *cpu,
19
@@ -XXX,XX +XXX,XX @@
43
tb_reset_jump(tb, 1);
20
+#define _GNU_SOURCE
44
}
21
+#include <stdio.h>
45
22
+#include <stdlib.h>
46
- /*
23
+
47
- * If the TB is not associated with a physical RAM page then it must be
24
+static int clst(char sep, const char **s1, const char **s2)
48
- * a temporary one-insn TB, and we have nothing left to do. Return early
25
+{
49
- * before attempting to link to other TBs or add to the lookup table.
26
+ const char *r1 = *s1;
50
- */
27
+ const char *r2 = *s2;
51
- if (tb_page_addr0(tb) == -1) {
28
+ int cc;
52
- assert_no_pages_locked();
29
+
53
- return tb;
30
+ do {
54
- }
31
+ register int r0 asm("r0") = sep;
55
-
32
+
56
/*
33
+ asm("clst %[r1],%[r2]\n"
57
* Insert TB into the corresponding region tree before publishing it
34
+ "ipm %[cc]\n"
58
* through QHT. Otherwise rewinding happened in the TB might fail to
35
+ "srl %[cc],28"
59
@@ -XXX,XX +XXX,XX @@ TranslationBlock *tb_gen_code(CPUState *cpu,
36
+ : [r1] "+r" (r1), [r2] "+r" (r2), "+r" (r0), [cc] "=r" (cc)
60
*/
37
+ :
61
tcg_tb_insert(tb);
38
+ : "cc");
62
39
+ *s1 = r1;
63
+ /*
40
+ *s2 = r2;
64
+ * If the TB is not associated with a physical RAM page then it must be
41
+ } while (cc == 3);
65
+ * a temporary one-insn TB.
42
+
66
+ *
43
+ return cc;
67
+ * Such TBs must be added to region trees in order to make sure that
44
+}
68
+ * restore_state_to_opc() - which on some architectures is not limited to
45
+
69
+ * rewinding, but also affects exception handling! - is called when such a
46
+static const struct test {
70
+ * TB causes an exception.
47
+ const char *name;
71
+ *
48
+ char sep;
72
+ * At the same time, temporary one-insn TBs must be executed at most once,
49
+ const char *s1;
73
+ * because subsequent reads from, e.g., I/O memory may return different
50
+ const char *s2;
74
+ * values. So return early before attempting to link to other TBs or add
51
+ int exp_cc;
75
+ * to the QHT.
52
+ int exp_off;
76
+ */
53
+} tests[] = {
77
+ if (tb_page_addr0(tb) == -1) {
54
+ {
78
+ assert_no_pages_locked();
55
+ .name = "cc0",
79
+ return tb;
56
+ .sep = 0,
57
+ .s1 = "aa",
58
+ .s2 = "aa",
59
+ .exp_cc = 0,
60
+ .exp_off = 0,
61
+ },
62
+ {
63
+ .name = "cc1",
64
+ .sep = 1,
65
+ .s1 = "a\x01",
66
+ .s2 = "aa\x01",
67
+ .exp_cc = 1,
68
+ .exp_off = 1,
69
+ },
70
+ {
71
+ .name = "cc2",
72
+ .sep = 2,
73
+ .s1 = "abc\x02",
74
+ .s2 = "abb\x02",
75
+ .exp_cc = 2,
76
+ .exp_off = 2,
77
+ },
78
+};
79
+
80
+int main(void)
81
+{
82
+ const struct test *t;
83
+ const char *s1, *s2;
84
+ size_t i;
85
+ int cc;
86
+
87
+ for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) {
88
+ t = &tests[i];
89
+ s1 = t->s1;
90
+ s2 = t->s2;
91
+ cc = clst(t->sep, &s1, &s2);
92
+ if (cc != t->exp_cc ||
93
+ s1 != t->s1 + t->exp_off ||
94
+ s2 != t->s2 + t->exp_off) {
95
+ fprintf(stderr, "%s\n", t->name);
96
+ return EXIT_FAILURE;
97
+ }
98
+ }
80
+ }
99
+
81
+
100
+ return EXIT_SUCCESS;
82
/*
101
+}
83
* No explicit memory barrier is required -- tb_link_page() makes the
102
diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target
84
* TB visible in a consistent state.
103
index XXXXXXX..XXXXXXX 100644
104
--- a/tests/tcg/s390x/Makefile.target
105
+++ b/tests/tcg/s390x/Makefile.target
106
@@ -XXX,XX +XXX,XX @@ TESTS+=signals-s390x
107
TESTS+=branch-relative-long
108
TESTS+=noexec
109
TESTS+=div
110
+TESTS+=clst
111
112
Z13_TESTS=vistr
113
$(Z13_TESTS): CFLAGS+=-march=z13 -O2
114
--
85
--
115
2.34.1
86
2.43.0
87
88
diff view generated by jsdifflib
1
Acked-by: David Hildenbrand <david@redhat.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
3
These helpers don't alter float_status. Make it const.
4
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-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>
4
---
9
---
5
v2: Remove extraneous return_low128.
10
include/fpu/softfloat-helpers.h | 25 ++++++++++++++-----------
6
---
11
1 file changed, 14 insertions(+), 11 deletions(-)
7
target/s390x/helper.h | 22 +++++++-------
8
target/s390x/tcg/insn-data.h.inc | 20 ++++++-------
9
target/s390x/tcg/fpu_helper.c | 29 +++++++++---------
10
target/s390x/tcg/translate.c | 51 +++++++++++++++++---------------
11
4 files changed, 63 insertions(+), 59 deletions(-)
12
12
13
diff --git a/target/s390x/helper.h b/target/s390x/helper.h
13
diff --git a/include/fpu/softfloat-helpers.h b/include/fpu/softfloat-helpers.h
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/s390x/helper.h
15
--- a/include/fpu/softfloat-helpers.h
16
+++ b/target/s390x/helper.h
16
+++ b/include/fpu/softfloat-helpers.h
17
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_4(clcle, i32, env, i32, i64, i32)
17
@@ -XXX,XX +XXX,XX @@ static inline void set_no_signaling_nans(bool val, float_status *status)
18
DEF_HELPER_4(clclu, i32, env, i32, i64, i32)
18
status->no_signaling_nans = val;
19
DEF_HELPER_3(cegb, i64, env, s64, i32)
19
}
20
DEF_HELPER_3(cdgb, i64, env, s64, i32)
20
21
-DEF_HELPER_3(cxgb, i64, env, s64, i32)
21
-static inline bool get_float_detect_tininess(float_status *status)
22
+DEF_HELPER_3(cxgb, i128, env, s64, i32)
22
+static inline bool get_float_detect_tininess(const float_status *status)
23
DEF_HELPER_3(celgb, i64, env, i64, i32)
24
DEF_HELPER_3(cdlgb, i64, env, i64, i32)
25
-DEF_HELPER_3(cxlgb, i64, env, i64, i32)
26
+DEF_HELPER_3(cxlgb, i128, env, i64, i32)
27
DEF_HELPER_4(cdsg, void, env, i64, i32, i32)
28
DEF_HELPER_4(cdsg_parallel, void, env, i64, i32, i32)
29
DEF_HELPER_4(csst, i32, env, i32, i64, i64)
30
DEF_HELPER_4(csst_parallel, i32, env, i32, i64, i64)
31
DEF_HELPER_FLAGS_3(aeb, TCG_CALL_NO_WG, i64, env, i64, i64)
32
DEF_HELPER_FLAGS_3(adb, TCG_CALL_NO_WG, i64, env, i64, i64)
33
-DEF_HELPER_FLAGS_5(axb, TCG_CALL_NO_WG, i64, env, i64, i64, i64, i64)
34
+DEF_HELPER_FLAGS_5(axb, TCG_CALL_NO_WG, i128, env, i64, i64, i64, i64)
35
DEF_HELPER_FLAGS_3(seb, TCG_CALL_NO_WG, i64, env, i64, i64)
36
DEF_HELPER_FLAGS_3(sdb, TCG_CALL_NO_WG, i64, env, i64, i64)
37
-DEF_HELPER_FLAGS_5(sxb, TCG_CALL_NO_WG, i64, env, i64, i64, i64, i64)
38
+DEF_HELPER_FLAGS_5(sxb, TCG_CALL_NO_WG, i128, env, i64, i64, i64, i64)
39
DEF_HELPER_FLAGS_3(deb, TCG_CALL_NO_WG, i64, env, i64, i64)
40
DEF_HELPER_FLAGS_3(ddb, TCG_CALL_NO_WG, i64, env, i64, i64)
41
-DEF_HELPER_FLAGS_5(dxb, TCG_CALL_NO_WG, i64, env, i64, i64, i64, i64)
42
+DEF_HELPER_FLAGS_5(dxb, TCG_CALL_NO_WG, i128, env, i64, i64, i64, i64)
43
DEF_HELPER_FLAGS_3(meeb, TCG_CALL_NO_WG, i64, env, i64, i64)
44
DEF_HELPER_FLAGS_3(mdeb, TCG_CALL_NO_WG, i64, env, i64, i64)
45
DEF_HELPER_FLAGS_3(mdb, TCG_CALL_NO_WG, i64, env, i64, i64)
46
-DEF_HELPER_FLAGS_5(mxb, TCG_CALL_NO_WG, i64, env, i64, i64, i64, i64)
47
-DEF_HELPER_FLAGS_4(mxdb, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
48
+DEF_HELPER_FLAGS_5(mxb, TCG_CALL_NO_WG, i128, env, i64, i64, i64, i64)
49
+DEF_HELPER_FLAGS_4(mxdb, TCG_CALL_NO_WG, i128, env, i64, i64, i64)
50
DEF_HELPER_FLAGS_2(ldeb, TCG_CALL_NO_WG, i64, env, i64)
51
DEF_HELPER_FLAGS_4(ldxb, TCG_CALL_NO_WG, i64, env, i64, i64, i32)
52
-DEF_HELPER_FLAGS_2(lxdb, TCG_CALL_NO_WG, i64, env, i64)
53
-DEF_HELPER_FLAGS_2(lxeb, TCG_CALL_NO_WG, i64, env, i64)
54
+DEF_HELPER_FLAGS_2(lxdb, TCG_CALL_NO_WG, i128, env, i64)
55
+DEF_HELPER_FLAGS_2(lxeb, TCG_CALL_NO_WG, i128, env, i64)
56
DEF_HELPER_FLAGS_3(ledb, TCG_CALL_NO_WG, i64, env, i64, i32)
57
DEF_HELPER_FLAGS_4(lexb, TCG_CALL_NO_WG, i64, env, i64, i64, i32)
58
DEF_HELPER_FLAGS_3(ceb, TCG_CALL_NO_WG_SE, i32, env, i64, i64)
59
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(clfdb, i64, env, i64, i32)
60
DEF_HELPER_4(clfxb, i64, env, i64, i64, i32)
61
DEF_HELPER_FLAGS_3(fieb, TCG_CALL_NO_WG, i64, env, i64, i32)
62
DEF_HELPER_FLAGS_3(fidb, TCG_CALL_NO_WG, i64, env, i64, i32)
63
-DEF_HELPER_FLAGS_4(fixb, TCG_CALL_NO_WG, i64, env, i64, i64, i32)
64
+DEF_HELPER_FLAGS_4(fixb, TCG_CALL_NO_WG, i128, env, i64, i64, i32)
65
DEF_HELPER_FLAGS_4(maeb, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
66
DEF_HELPER_FLAGS_4(madb, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
67
DEF_HELPER_FLAGS_4(mseb, TCG_CALL_NO_WG, i64, env, i64, i64, i64)
68
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(tcdb, TCG_CALL_NO_RWG_SE, i32, env, i64, i64)
69
DEF_HELPER_FLAGS_4(tcxb, TCG_CALL_NO_RWG_SE, i32, env, i64, i64, i64)
70
DEF_HELPER_FLAGS_2(sqeb, TCG_CALL_NO_WG, i64, env, i64)
71
DEF_HELPER_FLAGS_2(sqdb, TCG_CALL_NO_WG, i64, env, i64)
72
-DEF_HELPER_FLAGS_3(sqxb, TCG_CALL_NO_WG, i64, env, i64, i64)
73
+DEF_HELPER_FLAGS_3(sqxb, TCG_CALL_NO_WG, i128, env, i64, i64)
74
DEF_HELPER_FLAGS_1(cvd, TCG_CALL_NO_RWG_SE, i64, s32)
75
DEF_HELPER_FLAGS_4(pack, TCG_CALL_NO_WG, void, env, i32, i64, i64)
76
DEF_HELPER_FLAGS_4(pka, TCG_CALL_NO_WG, void, env, i64, i64, i32)
77
diff --git a/target/s390x/tcg/insn-data.h.inc b/target/s390x/tcg/insn-data.h.inc
78
index XXXXXXX..XXXXXXX 100644
79
--- a/target/s390x/tcg/insn-data.h.inc
80
+++ b/target/s390x/tcg/insn-data.h.inc
81
@@ -XXX,XX +XXX,XX @@
82
/* CONVERT FROM FIXED */
83
F(0xb394, CEFBR, RRF_e, Z, 0, r2_32s, new, e1, cegb, 0, IF_BFP)
84
F(0xb395, CDFBR, RRF_e, Z, 0, r2_32s, new, f1, cdgb, 0, IF_BFP)
85
- F(0xb396, CXFBR, RRF_e, Z, 0, r2_32s, new_P, x1, cxgb, 0, IF_BFP)
86
+ F(0xb396, CXFBR, RRF_e, Z, 0, r2_32s, new_x, x1, cxgb, 0, IF_BFP)
87
F(0xb3a4, CEGBR, RRF_e, Z, 0, r2_o, new, e1, cegb, 0, IF_BFP)
88
F(0xb3a5, CDGBR, RRF_e, Z, 0, r2_o, new, f1, cdgb, 0, IF_BFP)
89
- F(0xb3a6, CXGBR, RRF_e, Z, 0, r2_o, new_P, x1, cxgb, 0, IF_BFP)
90
+ F(0xb3a6, CXGBR, RRF_e, Z, 0, r2_o, new_x, x1, cxgb, 0, IF_BFP)
91
/* CONVERT TO LOGICAL */
92
F(0xb39c, CLFEBR, RRF_e, FPE, 0, e2, new, r1_32, clfeb, 0, IF_BFP)
93
F(0xb39d, CLFDBR, RRF_e, FPE, 0, f2, new, r1_32, clfdb, 0, IF_BFP)
94
@@ -XXX,XX +XXX,XX @@
95
/* CONVERT FROM LOGICAL */
96
F(0xb390, CELFBR, RRF_e, FPE, 0, r2_32u, new, e1, celgb, 0, IF_BFP)
97
F(0xb391, CDLFBR, RRF_e, FPE, 0, r2_32u, new, f1, cdlgb, 0, IF_BFP)
98
- F(0xb392, CXLFBR, RRF_e, FPE, 0, r2_32u, new_P, x1, cxlgb, 0, IF_BFP)
99
+ F(0xb392, CXLFBR, RRF_e, FPE, 0, r2_32u, new_x, x1, cxlgb, 0, IF_BFP)
100
F(0xb3a0, CELGBR, RRF_e, FPE, 0, r2_o, new, e1, celgb, 0, IF_BFP)
101
F(0xb3a1, CDLGBR, RRF_e, FPE, 0, r2_o, new, f1, cdlgb, 0, IF_BFP)
102
- F(0xb3a2, CXLGBR, RRF_e, FPE, 0, r2_o, new_P, x1, cxlgb, 0, IF_BFP)
103
+ F(0xb3a2, CXLGBR, RRF_e, FPE, 0, r2_o, new_x, x1, cxlgb, 0, IF_BFP)
104
105
/* CONVERT UTF-8 TO UTF-16 */
106
D(0xb2a7, CU12, RRF_c, Z, 0, 0, 0, 0, cuXX, 0, 12)
107
@@ -XXX,XX +XXX,XX @@
108
/* LOAD FP INTEGER */
109
F(0xb357, FIEBR, RRF_e, Z, 0, e2, new, e1, fieb, 0, IF_BFP)
110
F(0xb35f, FIDBR, RRF_e, Z, 0, f2, new, f1, fidb, 0, IF_BFP)
111
- F(0xb347, FIXBR, RRF_e, Z, x2h, x2l, new_P, x1, fixb, 0, IF_BFP)
112
+ F(0xb347, FIXBR, RRF_e, Z, x2h, x2l, new_x, x1, fixb, 0, IF_BFP)
113
114
/* LOAD LENGTHENED */
115
F(0xb304, LDEBR, RRE, Z, 0, e2, new, f1, ldeb, 0, IF_BFP)
116
- F(0xb305, LXDBR, RRE, Z, 0, f2, new_P, x1, lxdb, 0, IF_BFP)
117
- F(0xb306, LXEBR, RRE, Z, 0, e2, new_P, x1, lxeb, 0, IF_BFP)
118
+ F(0xb305, LXDBR, RRE, Z, 0, f2, new_x, x1, lxdb, 0, IF_BFP)
119
+ F(0xb306, LXEBR, RRE, Z, 0, e2, new_x, x1, lxeb, 0, IF_BFP)
120
F(0xed04, LDEB, RXE, Z, 0, m2_32u, new, f1, ldeb, 0, IF_BFP)
121
- F(0xed05, LXDB, RXE, Z, 0, m2_64, new_P, x1, lxdb, 0, IF_BFP)
122
- F(0xed06, LXEB, RXE, Z, 0, m2_32u, new_P, x1, lxeb, 0, IF_BFP)
123
+ F(0xed05, LXDB, RXE, Z, 0, m2_64, new_x, x1, lxdb, 0, IF_BFP)
124
+ F(0xed06, LXEB, RXE, Z, 0, m2_32u, new_x, x1, lxeb, 0, IF_BFP)
125
F(0xb324, LDER, RXE, Z, 0, e2, new, f1, lde, 0, IF_AFP1)
126
F(0xed24, LDE, RXE, Z, 0, m2_32u, new, f1, lde, 0, IF_AFP1)
127
/* LOAD ROUNDED */
128
@@ -XXX,XX +XXX,XX @@
129
/* SQUARE ROOT */
130
F(0xb314, SQEBR, RRE, Z, 0, e2, new, e1, sqeb, 0, IF_BFP)
131
F(0xb315, SQDBR, RRE, Z, 0, f2, new, f1, sqdb, 0, IF_BFP)
132
- F(0xb316, SQXBR, RRE, Z, x2h, x2l, new_P, x1, sqxb, 0, IF_BFP)
133
+ F(0xb316, SQXBR, RRE, Z, x2h, x2l, new_x, x1, sqxb, 0, IF_BFP)
134
F(0xed14, SQEB, RXE, Z, 0, m2_32u, new, e1, sqeb, 0, IF_BFP)
135
F(0xed15, SQDB, RXE, Z, 0, m2_64, new, f1, sqdb, 0, IF_BFP)
136
137
diff --git a/target/s390x/tcg/fpu_helper.c b/target/s390x/tcg/fpu_helper.c
138
index XXXXXXX..XXXXXXX 100644
139
--- a/target/s390x/tcg/fpu_helper.c
140
+++ b/target/s390x/tcg/fpu_helper.c
141
@@ -XXX,XX +XXX,XX @@
142
#define HELPER_LOG(x...)
143
#endif
144
145
-#define RET128(F) (env->retxl = F.low, F.high)
146
+static inline Int128 RET128(float128 f)
147
+{
148
+ return int128_make128(f.low, f.high);
149
+}
150
151
uint8_t s390_softfloat_exc_to_ieee(unsigned int exc)
152
{
23
{
153
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(adb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
24
return status->tininess_before_rounding;
154
}
25
}
155
26
156
/* 128-bit FP addition */
27
-static inline FloatRoundMode get_float_rounding_mode(float_status *status)
157
-uint64_t HELPER(axb)(CPUS390XState *env, uint64_t ah, uint64_t al,
28
+static inline FloatRoundMode get_float_rounding_mode(const float_status *status)
158
+Int128 HELPER(axb)(CPUS390XState *env, uint64_t ah, uint64_t al,
159
uint64_t bh, uint64_t bl)
160
{
29
{
161
float128 ret = float128_add(make_float128(ah, al),
30
return status->float_rounding_mode;
162
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(sdb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
163
}
31
}
164
32
165
/* 128-bit FP subtraction */
33
-static inline int get_float_exception_flags(float_status *status)
166
-uint64_t HELPER(sxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
34
+static inline int get_float_exception_flags(const float_status *status)
167
+Int128 HELPER(sxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
168
uint64_t bh, uint64_t bl)
169
{
35
{
170
float128 ret = float128_sub(make_float128(ah, al),
36
return status->float_exception_flags;
171
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(ddb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
172
}
37
}
173
38
174
/* 128-bit FP division */
39
static inline FloatX80RoundPrec
175
-uint64_t HELPER(dxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
40
-get_floatx80_rounding_precision(float_status *status)
176
+Int128 HELPER(dxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
41
+get_floatx80_rounding_precision(const float_status *status)
177
uint64_t bh, uint64_t bl)
178
{
42
{
179
float128 ret = float128_div(make_float128(ah, al),
43
return status->floatx80_rounding_precision;
180
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(mdeb)(CPUS390XState *env, uint64_t f1, uint64_t f2)
181
}
44
}
182
45
183
/* 128-bit FP multiplication */
46
-static inline Float2NaNPropRule get_float_2nan_prop_rule(float_status *status)
184
-uint64_t HELPER(mxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
47
+static inline Float2NaNPropRule
185
+Int128 HELPER(mxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
48
+get_float_2nan_prop_rule(const float_status *status)
186
uint64_t bh, uint64_t bl)
187
{
49
{
188
float128 ret = float128_mul(make_float128(ah, al),
50
return status->float_2nan_prop_rule;
189
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(mxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
190
}
51
}
191
52
192
/* 128/64-bit FP multiplication */
53
-static inline Float3NaNPropRule get_float_3nan_prop_rule(float_status *status)
193
-uint64_t HELPER(mxdb)(CPUS390XState *env, uint64_t ah, uint64_t al,
54
+static inline Float3NaNPropRule
194
- uint64_t f2)
55
+get_float_3nan_prop_rule(const float_status *status)
195
+Int128 HELPER(mxdb)(CPUS390XState *env, uint64_t ah, uint64_t al, uint64_t f2)
196
{
56
{
197
float128 ret = float64_to_float128(f2, &env->fpu_status);
57
return status->float_3nan_prop_rule;
198
ret = float128_mul(make_float128(ah, al), ret, &env->fpu_status);
199
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(ldxb)(CPUS390XState *env, uint64_t ah, uint64_t al,
200
}
58
}
201
59
202
/* convert 64-bit float to 128-bit float */
60
-static inline FloatInfZeroNaNRule get_float_infzeronan_rule(float_status *status)
203
-uint64_t HELPER(lxdb)(CPUS390XState *env, uint64_t f2)
61
+static inline FloatInfZeroNaNRule
204
+Int128 HELPER(lxdb)(CPUS390XState *env, uint64_t f2)
62
+get_float_infzeronan_rule(const float_status *status)
205
{
63
{
206
float128 ret = float64_to_float128(f2, &env->fpu_status);
64
return status->float_infzeronan_rule;
207
handle_exceptions(env, false, GETPC());
208
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(lxdb)(CPUS390XState *env, uint64_t f2)
209
}
65
}
210
66
211
/* convert 32-bit float to 128-bit float */
67
-static inline uint8_t get_float_default_nan_pattern(float_status *status)
212
-uint64_t HELPER(lxeb)(CPUS390XState *env, uint64_t f2)
68
+static inline uint8_t get_float_default_nan_pattern(const float_status *status)
213
+Int128 HELPER(lxeb)(CPUS390XState *env, uint64_t f2)
214
{
69
{
215
float128 ret = float32_to_float128(f2, &env->fpu_status);
70
return status->default_nan_pattern;
216
handle_exceptions(env, false, GETPC());
217
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(cdgb)(CPUS390XState *env, int64_t v2, uint32_t m34)
218
}
71
}
219
72
220
/* convert 64-bit int to 128-bit float */
73
-static inline bool get_flush_to_zero(float_status *status)
221
-uint64_t HELPER(cxgb)(CPUS390XState *env, int64_t v2, uint32_t m34)
74
+static inline bool get_flush_to_zero(const float_status *status)
222
+Int128 HELPER(cxgb)(CPUS390XState *env, int64_t v2, uint32_t m34)
223
{
75
{
224
int old_mode = s390_swap_bfp_rounding_mode(env, round_from_m34(m34));
76
return status->flush_to_zero;
225
float128 ret = int64_to_float128(v2, &env->fpu_status);
226
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(cdlgb)(CPUS390XState *env, uint64_t v2, uint32_t m34)
227
}
77
}
228
78
229
/* convert 64-bit uint to 128-bit float */
79
-static inline bool get_flush_inputs_to_zero(float_status *status)
230
-uint64_t HELPER(cxlgb)(CPUS390XState *env, uint64_t v2, uint32_t m34)
80
+static inline bool get_flush_inputs_to_zero(const float_status *status)
231
+Int128 HELPER(cxlgb)(CPUS390XState *env, uint64_t v2, uint32_t m34)
232
{
81
{
233
int old_mode = s390_swap_bfp_rounding_mode(env, round_from_m34(m34));
82
return status->flush_inputs_to_zero;
234
float128 ret = uint64_to_float128(v2, &env->fpu_status);
235
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(fidb)(CPUS390XState *env, uint64_t f2, uint32_t m34)
236
}
83
}
237
84
238
/* round to integer 128-bit */
85
-static inline bool get_default_nan_mode(float_status *status)
239
-uint64_t HELPER(fixb)(CPUS390XState *env, uint64_t ah, uint64_t al,
86
+static inline bool get_default_nan_mode(const float_status *status)
240
- uint32_t m34)
241
+Int128 HELPER(fixb)(CPUS390XState *env, uint64_t ah, uint64_t al, uint32_t m34)
242
{
87
{
243
int old_mode = s390_swap_bfp_rounding_mode(env, round_from_m34(m34));
88
return status->default_nan_mode;
244
float128 ret = float128_round_to_int(make_float128(ah, al),
245
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(sqdb)(CPUS390XState *env, uint64_t f2)
246
}
89
}
247
248
/* square root 128-bit */
249
-uint64_t HELPER(sqxb)(CPUS390XState *env, uint64_t ah, uint64_t al)
250
+Int128 HELPER(sqxb)(CPUS390XState *env, uint64_t ah, uint64_t al)
251
{
252
float128 ret = float128_sqrt(make_float128(ah, al), &env->fpu_status);
253
handle_exceptions(env, false, GETPC());
254
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
255
index XXXXXXX..XXXXXXX 100644
256
--- a/target/s390x/tcg/translate.c
257
+++ b/target/s390x/tcg/translate.c
258
@@ -XXX,XX +XXX,XX @@ typedef struct {
259
bool g_out, g_out2, g_in1, g_in2;
260
TCGv_i64 out, out2, in1, in2;
261
TCGv_i64 addr1;
262
+ TCGv_i128 out_128;
263
} DisasOps;
264
265
/* Instructions can place constraints on their operands, raising specification
266
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_adb(DisasContext *s, DisasOps *o)
267
268
static DisasJumpType op_axb(DisasContext *s, DisasOps *o)
269
{
270
- gen_helper_axb(o->out, cpu_env, o->out, o->out2, o->in1, o->in2);
271
- return_low128(o->out2);
272
+ gen_helper_axb(o->out_128, cpu_env, o->out, o->out2, o->in1, o->in2);
273
return DISAS_NEXT;
274
}
275
276
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_cxgb(DisasContext *s, DisasOps *o)
277
if (!m34) {
278
return DISAS_NORETURN;
279
}
280
- gen_helper_cxgb(o->out, cpu_env, o->in2, m34);
281
+ gen_helper_cxgb(o->out_128, cpu_env, o->in2, m34);
282
tcg_temp_free_i32(m34);
283
- return_low128(o->out2);
284
return DISAS_NEXT;
285
}
286
287
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_cxlgb(DisasContext *s, DisasOps *o)
288
if (!m34) {
289
return DISAS_NORETURN;
290
}
291
- gen_helper_cxlgb(o->out, cpu_env, o->in2, m34);
292
+ gen_helper_cxlgb(o->out_128, cpu_env, o->in2, m34);
293
tcg_temp_free_i32(m34);
294
- return_low128(o->out2);
295
return DISAS_NEXT;
296
}
297
298
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_ddb(DisasContext *s, DisasOps *o)
299
300
static DisasJumpType op_dxb(DisasContext *s, DisasOps *o)
301
{
302
- gen_helper_dxb(o->out, cpu_env, o->out, o->out2, o->in1, o->in2);
303
- return_low128(o->out2);
304
+ gen_helper_dxb(o->out_128, cpu_env, o->out, o->out2, o->in1, o->in2);
305
return DISAS_NEXT;
306
}
307
308
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_fixb(DisasContext *s, DisasOps *o)
309
if (!m34) {
310
return DISAS_NORETURN;
311
}
312
- gen_helper_fixb(o->out, cpu_env, o->in1, o->in2, m34);
313
- return_low128(o->out2);
314
+ gen_helper_fixb(o->out_128, cpu_env, o->in1, o->in2, m34);
315
tcg_temp_free_i32(m34);
316
return DISAS_NEXT;
317
}
318
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_lexb(DisasContext *s, DisasOps *o)
319
320
static DisasJumpType op_lxdb(DisasContext *s, DisasOps *o)
321
{
322
- gen_helper_lxdb(o->out, cpu_env, o->in2);
323
- return_low128(o->out2);
324
+ gen_helper_lxdb(o->out_128, cpu_env, o->in2);
325
return DISAS_NEXT;
326
}
327
328
static DisasJumpType op_lxeb(DisasContext *s, DisasOps *o)
329
{
330
- gen_helper_lxeb(o->out, cpu_env, o->in2);
331
- return_low128(o->out2);
332
+ gen_helper_lxeb(o->out_128, cpu_env, o->in2);
333
return DISAS_NEXT;
334
}
335
336
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_mdb(DisasContext *s, DisasOps *o)
337
338
static DisasJumpType op_mxb(DisasContext *s, DisasOps *o)
339
{
340
- gen_helper_mxb(o->out, cpu_env, o->out, o->out2, o->in1, o->in2);
341
- return_low128(o->out2);
342
+ gen_helper_mxb(o->out_128, cpu_env, o->out, o->out2, o->in1, o->in2);
343
return DISAS_NEXT;
344
}
345
346
static DisasJumpType op_mxdb(DisasContext *s, DisasOps *o)
347
{
348
- gen_helper_mxdb(o->out, cpu_env, o->out, o->out2, o->in2);
349
- return_low128(o->out2);
350
+ gen_helper_mxdb(o->out_128, cpu_env, o->out, o->out2, o->in2);
351
return DISAS_NEXT;
352
}
353
354
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_sdb(DisasContext *s, DisasOps *o)
355
356
static DisasJumpType op_sxb(DisasContext *s, DisasOps *o)
357
{
358
- gen_helper_sxb(o->out, cpu_env, o->out, o->out2, o->in1, o->in2);
359
- return_low128(o->out2);
360
+ gen_helper_sxb(o->out_128, cpu_env, o->out, o->out2, o->in1, o->in2);
361
return DISAS_NEXT;
362
}
363
364
@@ -XXX,XX +XXX,XX @@ static DisasJumpType op_sqdb(DisasContext *s, DisasOps *o)
365
366
static DisasJumpType op_sqxb(DisasContext *s, DisasOps *o)
367
{
368
- gen_helper_sqxb(o->out, cpu_env, o->in1, o->in2);
369
- return_low128(o->out2);
370
+ gen_helper_sqxb(o->out_128, cpu_env, o->in1, o->in2);
371
return DISAS_NEXT;
372
}
373
374
@@ -XXX,XX +XXX,XX @@ static void prep_new_P(DisasContext *s, DisasOps *o)
375
}
376
#define SPEC_prep_new_P 0
377
378
+static void prep_new_x(DisasContext *s, DisasOps *o)
379
+{
380
+ o->out = tcg_temp_new_i64();
381
+ o->out2 = tcg_temp_new_i64();
382
+ o->out_128 = tcg_temp_new_i128();
383
+}
384
+#define SPEC_prep_new_x 0
385
+
386
static void prep_r1(DisasContext *s, DisasOps *o)
387
{
388
o->out = regs[get_field(s, r1)];
389
@@ -XXX,XX +XXX,XX @@ static void prep_r1_P(DisasContext *s, DisasOps *o)
390
}
391
#define SPEC_prep_r1_P SPEC_r1_even
392
393
-/* Whenever we need x1 in addition to other inputs, we'll load it to out/out2 */
394
static void prep_x1(DisasContext *s, DisasOps *o)
395
{
396
o->out = load_freg(get_field(s, r1));
397
o->out2 = load_freg(get_field(s, r1) + 2);
398
+ o->out_128 = tcg_temp_new_i128();
399
+ tcg_gen_concat_i64_i128(o->out_128, o->out2, o->out);
400
}
401
#define SPEC_prep_x1 SPEC_r1_f128
402
403
@@ -XXX,XX +XXX,XX @@ static void wout_f1(DisasContext *s, DisasOps *o)
404
static void wout_x1(DisasContext *s, DisasOps *o)
405
{
406
int f1 = get_field(s, r1);
407
+
408
+ tcg_gen_extr_i128_i64(o->out2, o->out, o->out_128);
409
store_freg(f1, o->out);
410
store_freg(f1 + 2, o->out2);
411
}
412
@@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(CPUS390XState *env, DisasContext *s)
413
if (o.addr1) {
414
tcg_temp_free_i64(o.addr1);
415
}
416
-
417
+ if (o.out_128) {
418
+ tcg_temp_free_i128(o.out_128);
419
+ }
420
/* io should be the last instruction in tb when icount is enabled */
421
if (unlikely(icount && ret == DISAS_NEXT)) {
422
ret = DISAS_TOO_MANY;
423
--
90
--
424
2.34.1
91
2.43.0
425
92
426
93
diff view generated by jsdifflib