1
The following changes since commit aa3a285b5bc56a4208b3b57d4a55291e9c260107:
1
Note that I have refreshed the expiry of my public key.
2
2
and pushed to keys.openpgp.org.
3
Merge tag 'mem-2024-12-21' of https://github.com/davidhildenbrand/qemu into staging (2024-12-22 14:33:27 -0500)
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-20241224
14
https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20250117
8
15
9
for you to fetch changes up to e4a8e093dc74be049f4829831dce76e5edab0003:
16
for you to fetch changes up to db1649823d4f27b924a5aa5f9e0111457accb798:
10
17
11
accel/tcg: Move gen_intermediate_code to TCGCPUOps.translate_core (2024-12-24 08:32:15 -0800)
18
softfloat: Constify helpers returning float_status field (2025-01-17 08:29:25 -0800)
12
19
13
----------------------------------------------------------------
20
----------------------------------------------------------------
14
tcg/optimize: Remove in-flight mask data from OptContext
21
tcg:
15
fpu: Add float*_muladd_scalbn
22
- Add TCGOP_TYPE, TCGOP_FLAGS.
16
fpu: Remove float_muladd_halve_result
23
- Pass type and flags to tcg_op_supported, tcg_target_op_def.
17
fpu: Add float_round_nearest_even_max
24
- Split out tcg-target-has.h and unexport from tcg.h.
18
fpu: Add float_muladd_suppress_add_product_zero
25
- Reorg constraint processing; constify TCGOpDef.
19
target/hexagon: Use float32_muladd
26
- Make extract, sextract, deposit opcodes mandatory.
20
accel/tcg: Move gen_intermediate_code to TCGCPUOps.translate_core
27
- Merge ext{8,16,32}{s,u} opcodes into {s}extract.
28
tcg/mips: Expand bswap unconditionally
29
tcg/riscv: Use SRAIW, SRLIW for {s}extract_i64
30
tcg/riscv: Use BEXTI for single-bit extractions
31
tcg/sparc64: Use SRA, SRL for {s}extract_i64
32
33
disas/riscv: Guard dec->cfg dereference for host disassemble
34
util/cpuinfo-riscv: Detect Zbs
35
accel/tcg: Call tcg_tb_insert() for one-insn TBs
36
linux-user: Add missing /proc/cpuinfo fields for sparc
21
37
22
----------------------------------------------------------------
38
----------------------------------------------------------------
23
Ilya Leoshkevich (1):
39
Helge Deller (1):
24
tests/tcg: Do not use inttypes.h in multiarch/system/memory.c
40
linux-user: Add missing /proc/cpuinfo fields for sparc
25
41
26
Pierrick Bouvier (1):
42
Ilya Leoshkevich (2):
27
plugins: optimize cpu_index code generation
43
tcg: Document tb_lookup() and tcg_tb_lookup()
28
44
accel/tcg: Call tcg_tb_insert() for one-insn TBs
29
Richard Henderson (70):
45
30
tcg/optimize: Split out finish_bb, finish_ebb
46
LIU Zhiwei (1):
31
tcg/optimize: Split out fold_affected_mask
47
disas/riscv: Guard dec->cfg dereference for host disassemble
32
tcg/optimize: Copy mask writeback to fold_masks
48
33
tcg/optimize: Split out fold_masks_zs
49
Philippe Mathieu-Daudé (1):
34
tcg/optimize: Augment s_mask from z_mask in fold_masks_zs
50
softfloat: Constify helpers returning float_status field
35
tcg/optimize: Change representation of s_mask
51
36
tcg/optimize: Use finish_folding in fold_add, fold_add_vec, fold_addsub2
52
Richard Henderson (63):
37
tcg/optimize: Introduce const value accessors for TempOptInfo
53
tcg: Move call abi parameters from tcg-target.h to tcg-target.c.inc
38
tcg/optimize: Use fold_masks_zs in fold_and
54
tcg: Replace TCGOP_VECL with TCGOP_TYPE
39
tcg/optimize: Use fold_masks_zs in fold_andc
55
tcg: Move tcg_op_insert_{after,before} decls to tcg-internal.h
40
tcg/optimize: Use fold_masks_zs in fold_bswap
56
tcg: Copy TCGOP_TYPE in tcg_op_insert_{after,before}
41
tcg/optimize: Use fold_masks_zs in fold_count_zeros
57
tcg: Add TCGOP_FLAGS
42
tcg/optimize: Use fold_masks_z in fold_ctpop
58
tcg: Add type and flags arguments to tcg_op_supported
43
tcg/optimize: Use fold_and and fold_masks_z in fold_deposit
59
target/arm: Do not test TCG_TARGET_HAS_bitsel_vec
44
tcg/optimize: Compute sign mask in fold_deposit
60
target/arm: Use tcg_op_supported
45
tcg/optimize: Use finish_folding in fold_divide
61
target/tricore: Use tcg_op_supported
46
tcg/optimize: Use finish_folding in fold_dup, fold_dup2
62
tcg: Add tcg_op_deposit_valid
47
tcg/optimize: Use fold_masks_s in fold_eqv
63
target/i386: Remove TCG_TARGET_extract_tl_valid
48
tcg/optimize: Use fold_masks_z in fold_extract
64
target/i386: Use tcg_op_deposit_valid
49
tcg/optimize: Use finish_folding in fold_extract2
65
target/i386: Use tcg_op_supported
50
tcg/optimize: Use fold_masks_zs in fold_exts
66
tcg: Remove TCG_TARGET_NEED_LDST_LABELS and TCG_TARGET_NEED_POOL_LABELS
51
tcg/optimize: Use fold_masks_z in fold_extu
67
tcg: Rename tcg-target.opc.h to tcg-target-opc.h.inc
52
tcg/optimize: Use fold_masks_zs in fold_movcond
68
tcg/tci: Move TCI specific opcodes to tcg-target-opc.h.inc
53
tcg/optimize: Use finish_folding in fold_mul*
69
tcg: Move fallback tcg_can_emit_vec_op out of line
54
tcg/optimize: Use fold_masks_s in fold_nand
70
tcg/ppc: Remove TCGPowerISA enum
55
tcg/optimize: Use fold_masks_z in fold_neg_no_const
71
tcg: Extract default TCG_TARGET_HAS_foo definitions to 'tcg-has.h'
56
tcg/optimize: Use fold_masks_s in fold_nor
72
tcg/aarch64: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
57
tcg/optimize: Use fold_masks_s in fold_not
73
tcg/arm: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
58
tcg/optimize: Use fold_masks_zs in fold_or
74
tcg/i386: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
59
tcg/optimize: Use fold_masks_zs in fold_orc
75
tcg/loongarch64: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
60
tcg/optimize: Use fold_masks_zs in fold_qemu_ld
76
tcg/mips: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
61
tcg/optimize: Return true from fold_qemu_st, fold_tcg_st
77
tcg/ppc: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
62
tcg/optimize: Use finish_folding in fold_remainder
78
tcg/riscv: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
63
tcg/optimize: Distinguish simplification in fold_setcond_zmask
79
tcg/s390x: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
64
tcg/optimize: Use fold_masks_z in fold_setcond
80
tcg/sparc64: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
65
tcg/optimize: Use fold_masks_s in fold_negsetcond
81
tcg/tci: Extract TCG_TARGET_HAS_foo defs to 'tcg-target-has.h'
66
tcg/optimize: Use fold_masks_z in fold_setcond2
82
tcg: Include 'tcg-target-has.h' once in 'tcg-has.h'
67
tcg/optimize: Use finish_folding in fold_cmp_vec
83
tcg: Only include 'tcg-has.h' when necessary
68
tcg/optimize: Use finish_folding in fold_cmpsel_vec
84
tcg: Split out tcg-target-mo.h
69
tcg/optimize: Use fold_masks_zs in fold_sextract
85
tcg: Use C_NotImplemented in tcg_target_op_def
70
tcg/optimize: Use fold_masks_zs, fold_masks_s in fold_shift
86
tcg: Change have_vec to has_type in tcg_op_supported
71
tcg/optimize: Simplify sign bit test in fold_shift
87
tcg: Reorg process_op_defs
72
tcg/optimize: Use finish_folding in fold_sub, fold_sub_vec
88
tcg: Remove args_ct from TCGOpDef
73
tcg/optimize: Use fold_masks_zs in fold_tcg_ld
89
tcg: Constify tcg_op_defs
74
tcg/optimize: Use finish_folding in fold_tcg_ld_memcopy
90
tcg: Validate op supported in opcode_args_ct
75
tcg/optimize: Use fold_masks_zs in fold_xor
91
tcg: Add TCG_OPF_NOT_PRESENT to opcodes without inputs or outputs
76
tcg/optimize: Use finish_folding in fold_bitsel_vec
92
tcg: Pass type and flags to tcg_target_op_def
77
tcg/optimize: Use finish_folding as default in tcg_optimize
93
tcg: Add TCGType argument to tcg_out_op
78
tcg/optimize: Remove z_mask, s_mask from OptContext
94
tcg: Remove TCG_OPF_64BIT
79
tcg/optimize: Re-enable sign-mask optimizations
95
tcg: Drop implementation checks from tcg-opc.h
80
tcg/optimize: Move fold_bitsel_vec into alphabetic sort
96
tcg: Replace IMPLVEC with TCG_OPF_VECTOR
81
tcg/optimize: Move fold_cmp_vec, fold_cmpsel_vec into alphabetic sort
97
tcg/mips: Expand bswap unconditionally
82
softfloat: Add float{16,32,64}_muladd_scalbn
98
tcg/i386: Handle all 8-bit extensions for i686
83
target/arm: Use float*_muladd_scalbn
99
tcg/i386: Fold the ext{8,16,32}[us] cases into {s}extract
84
target/sparc: Use float*_muladd_scalbn
100
tcg/aarch64: Provide TCG_TARGET_{s}extract_valid
85
softfloat: Remove float_muladd_halve_result
101
tcg/aarch64: Expand extract with offset 0 with andi
86
softfloat: Add float_round_nearest_even_max
102
tcg/arm: Add full [US]XT[BH] into {s}extract
87
softfloat: Add float_muladd_suppress_add_product_zero
103
tcg/loongarch64: Fold the ext{8,16,32}[us] cases into {s}extract
88
target/hexagon: Use float32_mul in helper_sfmpy
104
tcg/mips: Fold the ext{8,16,32}[us] cases into {s}extract
89
target/hexagon: Use float32_muladd for helper_sffma
105
tcg/ppc: Fold the ext{8,16,32}[us] cases into {s}extract
90
target/hexagon: Use float32_muladd for helper_sffms
106
tcg/riscv64: Fold the ext{8,16,32}[us] cases into {s}extract
91
target/hexagon: Use float32_muladd_scalbn for helper_sffma_sc
107
tcg/riscv: Use SRAIW, SRLIW for {s}extract_i64
92
target/hexagon: Use float32_muladd for helper_sffm[as]_lib
108
tcg/s390x: Fold the ext{8,16,32}[us] cases into {s}extract
93
target/hexagon: Remove internal_fmafx
109
tcg/sparc64: Use SRA, SRL for {s}extract_i64
94
target/hexagon: Expand GEN_XF_ROUND
110
tcg/tci: Provide TCG_TARGET_{s}extract_valid
95
target/hexagon: Remove Float
111
tcg/tci: Remove assertions for deposit and extract
96
target/hexagon: Remove Double
112
tcg: Remove TCG_TARGET_HAS_{s}extract_{i32,i64}
97
target/hexagon: Use mulu64 for int128_mul_6464
113
tcg: Remove TCG_TARGET_HAS_deposit_{i32,i64}
98
target/hexagon: Simplify internal_mpyhh setup
114
util/cpuinfo-riscv: Detect Zbs
99
accel/tcg: Move gen_intermediate_code to TCGCPUOps.translate_core
115
tcg/riscv: Use BEXTI for single-bit extractions
100
116
101
include/exec/translator.h | 14 -
117
accel/tcg/internal-target.h | 1 +
102
include/fpu/softfloat-types.h | 2 +
118
host/include/riscv/host/cpuinfo.h | 5 +-
103
include/fpu/softfloat.h | 14 +-
119
include/fpu/softfloat-helpers.h | 25 +-
104
include/hw/core/tcg-cpu-ops.h | 13 +
120
include/tcg/tcg-opc.h | 355 +++++-------
105
target/alpha/cpu.h | 2 +
121
include/tcg/tcg.h | 187 ++----
106
target/arm/internals.h | 2 +
122
linux-user/sparc/target_proc.h | 20 +-
107
target/avr/cpu.h | 2 +
123
tcg/aarch64/tcg-target-has.h | 117 ++++
108
target/hexagon/cpu.h | 2 +
124
tcg/aarch64/tcg-target-mo.h | 12 +
109
target/hexagon/fma_emu.h | 3 -
125
tcg/aarch64/tcg-target.h | 126 ----
110
target/hppa/cpu.h | 2 +
126
tcg/arm/tcg-target-has.h | 100 ++++
111
target/i386/tcg/helper-tcg.h | 2 +
127
tcg/arm/tcg-target-mo.h | 13 +
112
target/loongarch/internals.h | 2 +
128
tcg/arm/tcg-target.h | 86 ---
113
target/m68k/cpu.h | 2 +
129
tcg/i386/tcg-target-has.h | 169 ++++++
114
target/microblaze/cpu.h | 2 +
130
tcg/i386/tcg-target-mo.h | 19 +
115
target/mips/tcg/tcg-internal.h | 2 +
131
tcg/i386/tcg-target.h | 162 ------
116
target/openrisc/cpu.h | 2 +
132
tcg/loongarch64/tcg-target-has.h | 119 ++++
117
target/ppc/cpu.h | 2 +
133
tcg/loongarch64/tcg-target-mo.h | 12 +
118
target/riscv/cpu.h | 3 +
134
tcg/loongarch64/tcg-target.h | 115 ----
119
target/rx/cpu.h | 2 +
135
tcg/mips/tcg-target-has.h | 135 +++++
120
target/s390x/s390x-internal.h | 2 +
136
tcg/mips/tcg-target-mo.h | 13 +
121
target/sh4/cpu.h | 2 +
137
tcg/mips/tcg-target.h | 130 -----
122
target/sparc/cpu.h | 2 +
138
tcg/ppc/tcg-target-has.h | 131 +++++
123
target/sparc/helper.h | 4 +-
139
tcg/ppc/tcg-target-mo.h | 12 +
124
target/tricore/cpu.h | 2 +
140
tcg/ppc/tcg-target.h | 126 ----
125
target/xtensa/cpu.h | 2 +
141
tcg/riscv/tcg-target-has.h | 135 +++++
126
accel/tcg/cpu-exec.c | 8 +-
142
tcg/riscv/tcg-target-mo.h | 12 +
127
accel/tcg/plugin-gen.c | 9 +
143
tcg/riscv/tcg-target.h | 116 ----
128
accel/tcg/translate-all.c | 8 +-
144
tcg/s390x/tcg-target-has.h | 137 +++++
129
fpu/softfloat.c | 63 +--
145
tcg/s390x/tcg-target-mo.h | 12 +
130
target/alpha/cpu.c | 1 +
146
tcg/s390x/tcg-target.h | 126 ----
131
target/alpha/translate.c | 4 +-
147
tcg/sparc64/tcg-target-has.h | 87 +++
132
target/arm/cpu.c | 1 +
148
tcg/sparc64/tcg-target-mo.h | 12 +
133
target/arm/tcg/cpu-v7m.c | 1 +
149
tcg/sparc64/tcg-target.h | 91 ---
134
target/arm/tcg/helper-a64.c | 6 +-
150
tcg/tcg-has.h | 101 ++++
135
target/arm/tcg/translate.c | 5 +-
151
tcg/tcg-internal.h | 18 +-
136
target/avr/cpu.c | 1 +
152
tcg/tci/tcg-target-has.h | 81 +++
137
target/avr/translate.c | 6 +-
153
tcg/tci/tcg-target-mo.h | 17 +
138
target/hexagon/cpu.c | 1 +
154
tcg/tci/tcg-target.h | 94 ---
139
target/hexagon/fma_emu.c | 496 ++++++---------------
155
accel/tcg/cpu-exec.c | 15 +-
140
target/hexagon/op_helper.c | 125 ++----
156
accel/tcg/translate-all.c | 29 +-
141
target/hexagon/translate.c | 4 +-
157
disas/riscv.c | 23 +-
142
target/hppa/cpu.c | 1 +
158
target/arm/tcg/translate-a64.c | 10 +-
143
target/hppa/translate.c | 4 +-
159
target/arm/tcg/translate-sve.c | 22 +-
144
target/i386/tcg/tcg-cpu.c | 1 +
160
target/arm/tcg/translate.c | 2 +-
145
target/i386/tcg/translate.c | 5 +-
161
target/tricore/translate.c | 4 +-
146
target/loongarch/cpu.c | 1 +
162
tcg/optimize.c | 27 +-
147
target/loongarch/tcg/translate.c | 4 +-
163
tcg/tcg-common.c | 5 +-
148
target/m68k/cpu.c | 1 +
164
tcg/tcg-op-gvec.c | 1 +
149
target/m68k/translate.c | 4 +-
165
tcg/tcg-op-ldst.c | 29 +-
150
target/microblaze/cpu.c | 1 +
166
tcg/tcg-op-vec.c | 9 +-
151
target/microblaze/translate.c | 4 +-
167
tcg/tcg-op.c | 149 ++---
152
target/mips/cpu.c | 1 +
168
tcg/tcg.c | 643 ++++++++++++++-------
153
target/mips/tcg/translate.c | 4 +-
169
tcg/tci.c | 13 +-
154
target/openrisc/cpu.c | 1 +
170
util/cpuinfo-riscv.c | 18 +-
155
target/openrisc/translate.c | 4 +-
171
docs/devel/tcg-ops.rst | 15 +-
156
target/ppc/cpu_init.c | 1 +
172
target/i386/tcg/emit.c.inc | 14 +-
157
target/ppc/translate.c | 4 +-
173
.../{tcg-target.opc.h => tcg-target-opc.h.inc} | 4 +-
158
target/riscv/tcg/tcg-cpu.c | 1 +
174
tcg/aarch64/tcg-target.c.inc | 33 +-
159
target/riscv/translate.c | 4 +-
175
tcg/arm/{tcg-target.opc.h => tcg-target-opc.h.inc} | 6 +-
160
target/rx/cpu.c | 1 +
176
tcg/arm/tcg-target.c.inc | 71 ++-
161
target/rx/translate.c | 4 +-
177
.../{tcg-target.opc.h => tcg-target-opc.h.inc} | 22 +-
162
target/s390x/cpu.c | 1 +
178
tcg/i386/tcg-target.c.inc | 121 +++-
163
target/s390x/tcg/translate.c | 4 +-
179
.../{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
164
target/sh4/cpu.c | 1 +
180
tcg/loongarch64/tcg-target.c.inc | 59 +-
165
target/sh4/translate.c | 4 +-
181
tcg/mips/tcg-target-opc.h.inc | 1 +
166
target/sparc/cpu.c | 1 +
182
tcg/mips/tcg-target.c.inc | 55 +-
167
target/sparc/fop_helper.c | 8 +-
183
tcg/ppc/{tcg-target.opc.h => tcg-target-opc.h.inc} | 12 +-
168
target/sparc/translate.c | 84 ++--
184
tcg/ppc/tcg-target.c.inc | 39 +-
169
target/tricore/cpu.c | 1 +
185
.../{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
170
target/tricore/translate.c | 5 +-
186
tcg/riscv/tcg-target.c.inc | 66 ++-
171
target/xtensa/cpu.c | 1 +
187
.../{tcg-target.opc.h => tcg-target-opc.h.inc} | 6 +-
172
target/xtensa/translate.c | 4 +-
188
tcg/s390x/tcg-target.c.inc | 59 +-
173
tcg/optimize.c | 857 +++++++++++++++++++-----------------
189
tcg/sparc64/tcg-target-opc.h.inc | 1 +
174
tests/tcg/multiarch/system/memory.c | 9 +-
190
tcg/sparc64/tcg-target.c.inc | 29 +-
175
fpu/softfloat-parts.c.inc | 16 +-
191
tcg/tcg-ldst.c.inc | 65 ---
176
75 files changed, 866 insertions(+), 1009 deletions(-)
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
1
Initialize x with accumulated via direct assignment,
1
From: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
2
rather than multiplying by 1.
3
2
4
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
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>
5
Signed-off-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>
6
---
20
---
7
target/hexagon/fma_emu.c | 2 +-
21
disas/riscv.c | 23 ++++++++++++-----------
8
1 file changed, 1 insertion(+), 1 deletion(-)
22
1 file changed, 12 insertions(+), 11 deletions(-)
9
23
10
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
24
diff --git a/disas/riscv.c b/disas/riscv.c
11
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
12
--- a/target/hexagon/fma_emu.c
26
--- a/disas/riscv.c
13
+++ b/target/hexagon/fma_emu.c
27
+++ b/disas/riscv.c
14
@@ -XXX,XX +XXX,XX @@ float64 internal_mpyhh(float64 a, float64 b,
28
@@ -XXX,XX +XXX,XX @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
15
float64_is_infinity(b)) {
29
break;
16
return float64_mul(a, b, fp_status);
30
case 2: op = rv_op_c_li; break;
17
}
31
case 3:
18
- x.mant = int128_mul_6464(accumulated, 1);
32
- if (dec->cfg->ext_zcmop) {
19
+ x.mant = int128_make64(accumulated);
33
+ if (dec->cfg && dec->cfg->ext_zcmop) {
20
x.sticky = sticky;
34
if ((((inst >> 2) & 0b111111) == 0b100000) &&
21
prod = fGETUWORD(1, float64_getmant(a)) * fGETUWORD(1, float64_getmant(b));
35
(((inst >> 11) & 0b11) == 0b0)) {
22
x.mant = int128_add(x.mant, int128_mul_6464(prod, 0x100000000ULL));
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)
23
--
125
--
24
2.43.0
126
2.43.0
diff view generated by jsdifflib
1
No need to open-code 64x64->128-bit multiplication.
1
These defines are not required outside of tcg/tcg.c,
2
which includes tcg-target.c.inc before use.
3
Reduces the exported symbol set of tcg-target.h.
2
4
3
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
7
---
6
target/hexagon/fma_emu.c | 32 +++-----------------------------
8
tcg/aarch64/tcg-target.h | 13 -------------
7
1 file changed, 3 insertions(+), 29 deletions(-)
9
tcg/arm/tcg-target.h | 8 --------
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(-)
8
27
9
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
28
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
10
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
11
--- a/target/hexagon/fma_emu.c
30
--- a/tcg/aarch64/tcg-target.h
12
+++ b/target/hexagon/fma_emu.c
31
+++ b/tcg/aarch64/tcg-target.h
13
@@ -XXX,XX +XXX,XX @@ int32_t float32_getexp(float32 f32)
32
@@ -XXX,XX +XXX,XX @@ typedef enum {
14
return -1;
33
15
}
34
#define TCG_TARGET_NB_REGS 64
16
35
17
-static uint32_t int128_getw0(Int128 x)
36
-/* used for function call generation */
18
-{
37
-#define TCG_REG_CALL_STACK TCG_REG_SP
19
- return int128_getlo(x);
38
-#define TCG_TARGET_STACK_ALIGN 16
20
-}
39
-#define TCG_TARGET_CALL_STACK_OFFSET 0
21
-
40
-#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
22
-static uint32_t int128_getw1(Int128 x)
41
-#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
23
-{
42
-#ifdef CONFIG_DARWIN
24
- return int128_getlo(x) >> 32;
43
-# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
25
-}
44
-#else
26
-
45
-# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
27
static Int128 int128_mul_6464(uint64_t ai, uint64_t bi)
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
71
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
72
index XXXXXXX..XXXXXXX 100644
73
--- a/tcg/i386/tcg-target.h
74
+++ b/tcg/i386/tcg-target.h
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;
263
#endif
264
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
293
+#if defined(_WIN64)
294
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_BY_REF
295
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_VEC
296
+#elif TCG_TARGET_REG_BITS == 64
297
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
298
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
299
+#else
300
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
301
+# define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
302
+#endif
303
+
304
#ifdef CONFIG_DEBUG_TCG
305
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
306
#if TCG_TARGET_REG_BITS == 64
307
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
308
index XXXXXXX..XXXXXXX 100644
309
--- a/tcg/loongarch64/tcg-target.c.inc
310
+++ b/tcg/loongarch64/tcg-target.c.inc
311
@@ -XXX,XX +XXX,XX @@
312
#include "../tcg-ldst.c.inc"
313
#include <asm/hwcap.h>
314
315
+/* used for function call generation */
316
+#define TCG_REG_CALL_STACK TCG_REG_SP
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
345
+#endif
346
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
347
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
348
+
349
#if TCG_TARGET_REG_BITS == 32
350
# define LO_OFF (HOST_BIG_ENDIAN * 4)
351
# define HI_OFF (4 - LO_OFF)
352
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
353
index XXXXXXX..XXXXXXX 100644
354
--- a/tcg/riscv/tcg-target.c.inc
355
+++ b/tcg/riscv/tcg-target.c.inc
356
@@ -XXX,XX +XXX,XX @@
357
#include "../tcg-ldst.c.inc"
358
#include "../tcg-pool.c.inc"
359
360
+/* Used for function call generation. */
361
+#define TCG_REG_CALL_STACK TCG_REG_SP
362
+#define TCG_TARGET_STACK_ALIGN 16
363
+#define TCG_TARGET_CALL_STACK_OFFSET 0
364
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
365
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
366
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
367
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
368
+
369
#ifdef CONFIG_DEBUG_TCG
370
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
371
"zero", "ra", "sp", "gp", "tp", "t0", "t1", "t2",
372
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
373
index XXXXXXX..XXXXXXX 100644
374
--- a/tcg/s390x/tcg-target.c.inc
375
+++ b/tcg/s390x/tcg-target.c.inc
376
@@ -XXX,XX +XXX,XX @@
377
#include "../tcg-pool.c.inc"
378
#include "elf.h"
379
380
+/* Used for function call generation. */
381
+#define TCG_TARGET_STACK_ALIGN 8
382
+#define TCG_TARGET_CALL_STACK_OFFSET 160
383
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
384
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
385
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_BY_REF
386
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_BY_REF
387
+
388
#define TCG_CT_CONST_S16 (1 << 8)
389
#define TCG_CT_CONST_S32 (1 << 9)
390
#define TCG_CT_CONST_U32 (1 << 10)
391
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
392
index XXXXXXX..XXXXXXX 100644
393
--- a/tcg/sparc64/tcg-target.c.inc
394
+++ b/tcg/sparc64/tcg-target.c.inc
395
@@ -XXX,XX +XXX,XX @@
396
#include "../tcg-ldst.c.inc"
397
#include "../tcg-pool.c.inc"
398
399
+/* Used for function call generation. */
400
+#define TCG_REG_CALL_STACK TCG_REG_O6
401
+#define TCG_TARGET_STACK_BIAS 2047
402
+#define TCG_TARGET_STACK_ALIGN 16
403
+#define TCG_TARGET_CALL_STACK_OFFSET (128 + 6 * 8 + TCG_TARGET_STACK_BIAS)
404
+#define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EXTEND
405
+#define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
406
+#define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
407
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
408
+
409
#ifdef CONFIG_DEBUG_TCG
410
static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = {
411
"%g0",
412
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
413
index XXXXXXX..XXXXXXX 100644
414
--- a/tcg/tci/tcg-target.c.inc
415
+++ b/tcg/tci/tcg-target.c.inc
416
@@ -XXX,XX +XXX,XX @@
417
418
#include "../tcg-pool.c.inc"
419
420
+/* Used for function call generation. */
421
+#define TCG_TARGET_CALL_STACK_OFFSET 0
422
+#define TCG_TARGET_STACK_ALIGN 8
423
+#if TCG_TARGET_REG_BITS == 32
424
+# define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_EVEN
425
+# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_EVEN
426
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_EVEN
427
+#else
428
+# define TCG_TARGET_CALL_ARG_I32 TCG_CALL_ARG_NORMAL
429
+# define TCG_TARGET_CALL_ARG_I64 TCG_CALL_ARG_NORMAL
430
+# define TCG_TARGET_CALL_ARG_I128 TCG_CALL_ARG_NORMAL
431
+#endif
432
+#define TCG_TARGET_CALL_RET_I128 TCG_CALL_RET_NORMAL
433
+
434
static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
28
{
435
{
29
- Int128 a, b;
436
switch (op) {
30
- uint64_t pp0, pp1a, pp1b, pp1s, pp2;
31
+ uint64_t l, h;
32
33
- a = int128_make64(ai);
34
- b = int128_make64(bi);
35
- pp0 = (uint64_t)int128_getw0(a) * (uint64_t)int128_getw0(b);
36
- pp1a = (uint64_t)int128_getw1(a) * (uint64_t)int128_getw0(b);
37
- pp1b = (uint64_t)int128_getw1(b) * (uint64_t)int128_getw0(a);
38
- pp2 = (uint64_t)int128_getw1(a) * (uint64_t)int128_getw1(b);
39
-
40
- pp1s = pp1a + pp1b;
41
- if ((pp1s < pp1a) || (pp1s < pp1b)) {
42
- pp2 += (1ULL << 32);
43
- }
44
- uint64_t ret_low = pp0 + (pp1s << 32);
45
- if ((ret_low < pp0) || (ret_low < (pp1s << 32))) {
46
- pp2 += 1;
47
- }
48
-
49
- return int128_make128(ret_low, pp2 + (pp1s >> 32));
50
+ mulu64(&l, &h, ai, bi);
51
+ return int128_make128(l, h);
52
}
53
54
static Int128 int128_sub_borrow(Int128 a, Int128 b, int borrow)
55
--
437
--
56
2.43.0
438
2.43.0
439
440
diff view generated by jsdifflib
1
Consider the passed s_mask to be a minimum deduced from
1
In the replacement, drop the TCGType - TCG_TYPE_V64 adjustment,
2
either existing s_mask or from a sign-extension operation.
2
except for the call to tcg_out_vec_op. Pass type to tcg_gen_op[1-6],
3
We may be able to deduce more from the set of known zeros.
3
so that all integer opcodes gain the type.
4
Remove identical logic from several opcode folders.
5
4
6
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@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/optimize.c | 21 ++++++---------------
8
include/tcg/tcg.h | 2 +-
10
1 file changed, 6 insertions(+), 15 deletions(-)
9
tcg/tcg-internal.h | 13 ++---
10
tcg/optimize.c | 10 +---
11
tcg/tcg-op-ldst.c | 26 ++++++----
12
tcg/tcg-op-vec.c | 8 +--
13
tcg/tcg-op.c | 113 +++++++++++++++++++++++------------------
14
tcg/tcg.c | 11 ++--
15
docs/devel/tcg-ops.rst | 15 +++---
16
8 files changed, 105 insertions(+), 93 deletions(-)
11
17
18
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/include/tcg/tcg.h
21
+++ b/include/tcg/tcg.h
22
@@ -XXX,XX +XXX,XX @@ struct TCGOp {
23
#define TCGOP_CALLI(X) (X)->param1
24
#define TCGOP_CALLO(X) (X)->param2
25
26
-#define TCGOP_VECL(X) (X)->param1
27
+#define TCGOP_TYPE(X) (X)->param1
28
#define TCGOP_VECE(X) (X)->param2
29
30
/* Make sure operands fit in the bitfields above. */
31
diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h
32
index XXXXXXX..XXXXXXX 100644
33
--- a/tcg/tcg-internal.h
34
+++ b/tcg/tcg-internal.h
35
@@ -XXX,XX +XXX,XX @@ TCGTemp *tcg_temp_new_internal(TCGType type, TCGTempKind kind);
36
*/
37
TCGTemp *tcg_constant_internal(TCGType type, int64_t val);
38
39
-TCGOp *tcg_gen_op1(TCGOpcode, TCGArg);
40
-TCGOp *tcg_gen_op2(TCGOpcode, TCGArg, TCGArg);
41
-TCGOp *tcg_gen_op3(TCGOpcode, TCGArg, TCGArg, TCGArg);
42
-TCGOp *tcg_gen_op4(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg);
43
-TCGOp *tcg_gen_op5(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg);
44
-TCGOp *tcg_gen_op6(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg);
45
+TCGOp *tcg_gen_op1(TCGOpcode, TCGType, TCGArg);
46
+TCGOp *tcg_gen_op2(TCGOpcode, TCGType, TCGArg, TCGArg);
47
+TCGOp *tcg_gen_op3(TCGOpcode, TCGType, TCGArg, TCGArg, TCGArg);
48
+TCGOp *tcg_gen_op4(TCGOpcode, TCGType, TCGArg, TCGArg, TCGArg, TCGArg);
49
+TCGOp *tcg_gen_op5(TCGOpcode, TCGType, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg);
50
+TCGOp *tcg_gen_op6(TCGOpcode, TCGType, TCGArg, TCGArg,
51
+ TCGArg, TCGArg, TCGArg, TCGArg);
52
53
void vec_gen_2(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg);
54
void vec_gen_3(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg, TCGArg);
12
diff --git a/tcg/optimize.c b/tcg/optimize.c
55
diff --git a/tcg/optimize.c b/tcg/optimize.c
13
index XXXXXXX..XXXXXXX 100644
56
index XXXXXXX..XXXXXXX 100644
14
--- a/tcg/optimize.c
57
--- a/tcg/optimize.c
15
+++ b/tcg/optimize.c
58
+++ b/tcg/optimize.c
16
@@ -XXX,XX +XXX,XX @@ static bool fold_const2_commutative(OptContext *ctx, TCGOp *op)
59
@@ -XXX,XX +XXX,XX @@ static bool tcg_opt_gen_mov(OptContext *ctx, TCGOp *op, TCGArg dst, TCGArg src)
17
* Record "zero" and "sign" masks for the single output of @op.
60
case TCG_TYPE_V64:
18
* See TempOptInfo definition of z_mask and s_mask.
61
case TCG_TYPE_V128:
19
* If z_mask allows, fold the output to constant zero.
62
case TCG_TYPE_V256:
20
+ * The passed s_mask may be augmented by z_mask.
63
- /* TCGOP_VECL and TCGOP_VECE remain unchanged. */
21
*/
64
+ /* TCGOP_TYPE and TCGOP_VECE remain unchanged. */
22
static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
65
new_op = INDEX_op_mov_vec;
23
uint64_t z_mask, uint64_t s_mask)
66
break;
24
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
25
26
ti = ts_info(ts);
27
ti->z_mask = z_mask;
28
- ti->s_mask = s_mask;
29
+ ti->s_mask = s_mask | smask_from_zmask(z_mask);
30
return true;
31
}
32
33
@@ -XXX,XX +XXX,XX @@ static bool fold_bswap(OptContext *ctx, TCGOp *op)
34
default:
67
default:
35
g_assert_not_reached();
68
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
36
}
69
copy_propagate(&ctx, op, def->nb_oargs, def->nb_iargs);
37
- s_mask = smask_from_zmask(z_mask);
70
38
71
/* Pre-compute the type of the operation. */
39
+ s_mask = 0;
72
- if (def->flags & TCG_OPF_VECTOR) {
40
switch (op->args[2] & (TCG_BSWAP_OZ | TCG_BSWAP_OS)) {
73
- ctx.type = TCG_TYPE_V64 + TCGOP_VECL(op);
41
case TCG_BSWAP_OZ:
74
- } else if (def->flags & TCG_OPF_64BIT) {
42
break;
75
- ctx.type = TCG_TYPE_I64;
43
@@ -XXX,XX +XXX,XX @@ static bool fold_bswap(OptContext *ctx, TCGOp *op)
76
- } else {
44
default:
77
- ctx.type = TCG_TYPE_I32;
45
/* The high bits are undefined: force all bits above the sign to 1. */
78
- }
46
z_mask |= sign << 1;
79
+ ctx.type = TCGOP_TYPE(op);
47
- s_mask = 0;
80
48
break;
81
/*
49
}
82
* Process each opcode.
50
ctx->z_mask = z_mask;
83
diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c
51
@@ -XXX,XX +XXX,XX @@ static bool fold_count_zeros(OptContext *ctx, TCGOp *op)
84
index XXXXXXX..XXXXXXX 100644
52
g_assert_not_reached();
85
--- a/tcg/tcg-op-ldst.c
53
}
86
+++ b/tcg/tcg-op-ldst.c
54
ctx->z_mask = arg_info(op->args[2])->z_mask | z_mask;
87
@@ -XXX,XX +XXX,XX @@ static MemOp tcg_canonicalize_memop(MemOp op, bool is64, bool st)
55
- ctx->s_mask = smask_from_zmask(ctx->z_mask);
88
return op;
56
return false;
89
}
57
}
90
58
91
-static void gen_ldst(TCGOpcode opc, TCGTemp *vl, TCGTemp *vh,
59
@@ -XXX,XX +XXX,XX @@ static bool fold_ctpop(OptContext *ctx, TCGOp *op)
92
+static void gen_ldst(TCGOpcode opc, TCGType type, TCGTemp *vl, TCGTemp *vh,
60
default:
93
TCGTemp *addr, MemOpIdx oi)
61
g_assert_not_reached();
94
{
62
}
95
if (TCG_TARGET_REG_BITS == 64 || tcg_ctx->addr_type == TCG_TYPE_I32) {
63
- ctx->s_mask = smask_from_zmask(ctx->z_mask);
96
if (vh) {
64
return false;
97
- tcg_gen_op4(opc, temp_arg(vl), temp_arg(vh), temp_arg(addr), oi);
65
}
98
+ tcg_gen_op4(opc, type, temp_arg(vl), temp_arg(vh),
66
99
+ temp_arg(addr), oi);
67
@@ -XXX,XX +XXX,XX @@ static bool fold_extract(OptContext *ctx, TCGOp *op)
100
} else {
68
return true;
101
- tcg_gen_op3(opc, temp_arg(vl), temp_arg(addr), oi);
69
}
102
+ tcg_gen_op3(opc, type, temp_arg(vl), temp_arg(addr), oi);
70
ctx->z_mask = z_mask;
103
}
71
- ctx->s_mask = smask_from_zmask(z_mask);
104
} else {
72
105
/* See TCGV_LOW/HIGH. */
73
return fold_masks(ctx, op);
106
@@ -XXX,XX +XXX,XX @@ static void gen_ldst(TCGOpcode opc, TCGTemp *vl, TCGTemp *vh,
74
}
107
TCGTemp *ah = addr + !HOST_BIG_ENDIAN;
75
@@ -XXX,XX +XXX,XX @@ static bool fold_extu(OptContext *ctx, TCGOp *op)
108
76
}
109
if (vh) {
77
110
- tcg_gen_op5(opc, temp_arg(vl), temp_arg(vh),
78
ctx->z_mask = z_mask;
111
+ tcg_gen_op5(opc, type, temp_arg(vl), temp_arg(vh),
79
- ctx->s_mask = smask_from_zmask(z_mask);
112
temp_arg(al), temp_arg(ah), oi);
80
if (!type_change && fold_affected_mask(ctx, op, z_mask_old ^ z_mask)) {
113
} else {
81
return true;
114
- tcg_gen_op4(opc, temp_arg(vl), temp_arg(al), temp_arg(ah), oi);
82
}
115
+ tcg_gen_op4(opc, type, temp_arg(vl),
83
@@ -XXX,XX +XXX,XX @@ static bool fold_qemu_ld(OptContext *ctx, TCGOp *op)
116
+ temp_arg(al), temp_arg(ah), oi);
84
int width = 8 * memop_size(mop);
85
86
if (width < 64) {
87
- ctx->s_mask = MAKE_64BIT_MASK(width, 64 - width);
88
- if (!(mop & MO_SIGN)) {
89
+ if (mop & MO_SIGN) {
90
+ ctx->s_mask = MAKE_64BIT_MASK(width, 64 - width);
91
+ } else {
92
ctx->z_mask = MAKE_64BIT_MASK(0, width);
93
- ctx->s_mask <<= 1;
94
}
117
}
95
}
118
}
96
119
}
97
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond(OptContext *ctx, TCGOp *op)
120
@@ -XXX,XX +XXX,XX @@ static void gen_ldst_i64(TCGOpcode opc, TCGv_i64 v, TCGTemp *addr, MemOpIdx oi)
98
fold_setcond_tst_pow2(ctx, op, false);
121
if (TCG_TARGET_REG_BITS == 32) {
99
122
TCGTemp *vl = tcgv_i32_temp(TCGV_LOW(v));
100
ctx->z_mask = 1;
123
TCGTemp *vh = tcgv_i32_temp(TCGV_HIGH(v));
101
- ctx->s_mask = smask_from_zmask(1);
124
- gen_ldst(opc, vl, vh, addr, oi);
102
return false;
125
+ gen_ldst(opc, TCG_TYPE_I64, vl, vh, addr, oi);
103
}
126
} else {
104
127
- gen_ldst(opc, tcgv_i64_temp(v), NULL, addr, oi);
105
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond2(OptContext *ctx, TCGOp *op)
128
+ gen_ldst(opc, TCG_TYPE_I64, tcgv_i64_temp(v), NULL, addr, oi);
106
}
129
}
107
130
}
108
ctx->z_mask = 1;
131
109
- ctx->s_mask = smask_from_zmask(1);
132
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i32_int(TCGv_i32 val, TCGTemp *addr,
110
return false;
133
} else {
111
134
opc = INDEX_op_qemu_ld_a64_i32;
112
do_setcond_const:
135
}
113
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_ld(OptContext *ctx, TCGOp *op)
136
- gen_ldst(opc, tcgv_i32_temp(val), NULL, addr, oi);
114
break;
137
+ gen_ldst(opc, TCG_TYPE_I32, tcgv_i32_temp(val), NULL, addr, oi);
115
CASE_OP_32_64(ld8u):
138
plugin_gen_mem_callbacks_i32(val, copy_addr, addr, orig_oi,
116
ctx->z_mask = MAKE_64BIT_MASK(0, 8);
139
QEMU_PLUGIN_MEM_R);
117
- ctx->s_mask = MAKE_64BIT_MASK(9, 55);
140
118
break;
141
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i32_int(TCGv_i32 val, TCGTemp *addr,
119
CASE_OP_32_64(ld16s):
142
opc = INDEX_op_qemu_st_a64_i32;
120
ctx->s_mask = MAKE_64BIT_MASK(16, 48);
143
}
121
break;
144
}
122
CASE_OP_32_64(ld16u):
145
- gen_ldst(opc, tcgv_i32_temp(val), NULL, addr, oi);
123
ctx->z_mask = MAKE_64BIT_MASK(0, 16);
146
+ gen_ldst(opc, TCG_TYPE_I32, tcgv_i32_temp(val), NULL, addr, oi);
124
- ctx->s_mask = MAKE_64BIT_MASK(17, 47);
147
plugin_gen_mem_callbacks_i32(val, NULL, addr, orig_oi, QEMU_PLUGIN_MEM_W);
125
break;
148
126
case INDEX_op_ld32s_i64:
149
if (swap) {
127
ctx->s_mask = MAKE_64BIT_MASK(32, 32);
150
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr,
128
break;
151
} else {
129
case INDEX_op_ld32u_i64:
152
opc = INDEX_op_qemu_ld_a64_i128;
130
ctx->z_mask = MAKE_64BIT_MASK(0, 32);
153
}
131
- ctx->s_mask = MAKE_64BIT_MASK(33, 31);
154
- gen_ldst(opc, tcgv_i64_temp(lo), tcgv_i64_temp(hi), addr, oi);
155
+ gen_ldst(opc, TCG_TYPE_I128, tcgv_i64_temp(lo),
156
+ tcgv_i64_temp(hi), addr, oi);
157
158
if (need_bswap) {
159
tcg_gen_bswap64_i64(lo, lo);
160
@@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr,
161
} else {
162
opc = INDEX_op_qemu_st_a64_i128;
163
}
164
- gen_ldst(opc, tcgv_i64_temp(lo), tcgv_i64_temp(hi), addr, oi);
165
+ gen_ldst(opc, TCG_TYPE_I128, tcgv_i64_temp(lo),
166
+ tcgv_i64_temp(hi), addr, oi);
167
168
if (need_bswap) {
169
tcg_temp_free_i64(lo);
170
diff --git a/tcg/tcg-op-vec.c b/tcg/tcg-op-vec.c
171
index XXXXXXX..XXXXXXX 100644
172
--- a/tcg/tcg-op-vec.c
173
+++ b/tcg/tcg-op-vec.c
174
@@ -XXX,XX +XXX,XX @@ bool tcg_can_emit_vecop_list(const TCGOpcode *list,
175
void vec_gen_2(TCGOpcode opc, TCGType type, unsigned vece, TCGArg r, TCGArg a)
176
{
177
TCGOp *op = tcg_emit_op(opc, 2);
178
- TCGOP_VECL(op) = type - TCG_TYPE_V64;
179
+ TCGOP_TYPE(op) = type;
180
TCGOP_VECE(op) = vece;
181
op->args[0] = r;
182
op->args[1] = a;
183
@@ -XXX,XX +XXX,XX @@ void vec_gen_3(TCGOpcode opc, TCGType type, unsigned vece,
184
TCGArg r, TCGArg a, TCGArg b)
185
{
186
TCGOp *op = tcg_emit_op(opc, 3);
187
- TCGOP_VECL(op) = type - TCG_TYPE_V64;
188
+ TCGOP_TYPE(op) = type;
189
TCGOP_VECE(op) = vece;
190
op->args[0] = r;
191
op->args[1] = a;
192
@@ -XXX,XX +XXX,XX @@ void vec_gen_4(TCGOpcode opc, TCGType type, unsigned vece,
193
TCGArg r, TCGArg a, TCGArg b, TCGArg c)
194
{
195
TCGOp *op = tcg_emit_op(opc, 4);
196
- TCGOP_VECL(op) = type - TCG_TYPE_V64;
197
+ TCGOP_TYPE(op) = type;
198
TCGOP_VECE(op) = vece;
199
op->args[0] = r;
200
op->args[1] = a;
201
@@ -XXX,XX +XXX,XX @@ void vec_gen_6(TCGOpcode opc, TCGType type, unsigned vece, TCGArg r,
202
TCGArg a, TCGArg b, TCGArg c, TCGArg d, TCGArg e)
203
{
204
TCGOp *op = tcg_emit_op(opc, 6);
205
- TCGOP_VECL(op) = type - TCG_TYPE_V64;
206
+ TCGOP_TYPE(op) = type;
207
TCGOP_VECE(op) = vece;
208
op->args[0] = r;
209
op->args[1] = a;
210
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
211
index XXXXXXX..XXXXXXX 100644
212
--- a/tcg/tcg-op.c
213
+++ b/tcg/tcg-op.c
214
@@ -XXX,XX +XXX,XX @@
215
*/
216
#define NI __attribute__((noinline))
217
218
-TCGOp * NI tcg_gen_op1(TCGOpcode opc, TCGArg a1)
219
+TCGOp * NI tcg_gen_op1(TCGOpcode opc, TCGType type, TCGArg a1)
220
{
221
TCGOp *op = tcg_emit_op(opc, 1);
222
+ TCGOP_TYPE(op) = type;
223
op->args[0] = a1;
224
return op;
225
}
226
227
-TCGOp * NI tcg_gen_op2(TCGOpcode opc, TCGArg a1, TCGArg a2)
228
+TCGOp * NI tcg_gen_op2(TCGOpcode opc, TCGType type, TCGArg a1, TCGArg a2)
229
{
230
TCGOp *op = tcg_emit_op(opc, 2);
231
+ TCGOP_TYPE(op) = type;
232
op->args[0] = a1;
233
op->args[1] = a2;
234
return op;
235
}
236
237
-TCGOp * NI tcg_gen_op3(TCGOpcode opc, TCGArg a1, TCGArg a2, TCGArg a3)
238
+TCGOp * NI tcg_gen_op3(TCGOpcode opc, TCGType type, TCGArg a1,
239
+ TCGArg a2, TCGArg a3)
240
{
241
TCGOp *op = tcg_emit_op(opc, 3);
242
+ TCGOP_TYPE(op) = type;
243
op->args[0] = a1;
244
op->args[1] = a2;
245
op->args[2] = a3;
246
return op;
247
}
248
249
-TCGOp * NI tcg_gen_op4(TCGOpcode opc, TCGArg a1, TCGArg a2,
250
+TCGOp * NI tcg_gen_op4(TCGOpcode opc, TCGType type, TCGArg a1, TCGArg a2,
251
TCGArg a3, TCGArg a4)
252
{
253
TCGOp *op = tcg_emit_op(opc, 4);
254
+ TCGOP_TYPE(op) = type;
255
op->args[0] = a1;
256
op->args[1] = a2;
257
op->args[2] = a3;
258
@@ -XXX,XX +XXX,XX @@ TCGOp * NI tcg_gen_op4(TCGOpcode opc, TCGArg a1, TCGArg a2,
259
return op;
260
}
261
262
-TCGOp * NI tcg_gen_op5(TCGOpcode opc, TCGArg a1, TCGArg a2,
263
+TCGOp * NI tcg_gen_op5(TCGOpcode opc, TCGType type, TCGArg a1, TCGArg a2,
264
TCGArg a3, TCGArg a4, TCGArg a5)
265
{
266
TCGOp *op = tcg_emit_op(opc, 5);
267
+ TCGOP_TYPE(op) = type;
268
op->args[0] = a1;
269
op->args[1] = a2;
270
op->args[2] = a3;
271
@@ -XXX,XX +XXX,XX @@ TCGOp * NI tcg_gen_op5(TCGOpcode opc, TCGArg a1, TCGArg a2,
272
return op;
273
}
274
275
-TCGOp * NI tcg_gen_op6(TCGOpcode opc, TCGArg a1, TCGArg a2, TCGArg a3,
276
- TCGArg a4, TCGArg a5, TCGArg a6)
277
+TCGOp * NI tcg_gen_op6(TCGOpcode opc, TCGType type, TCGArg a1, TCGArg a2,
278
+ TCGArg a3, TCGArg a4, TCGArg a5, TCGArg a6)
279
{
280
TCGOp *op = tcg_emit_op(opc, 6);
281
+ TCGOP_TYPE(op) = type;
282
op->args[0] = a1;
283
op->args[1] = a2;
284
op->args[2] = a3;
285
@@ -XXX,XX +XXX,XX @@ TCGOp * NI tcg_gen_op6(TCGOpcode opc, TCGArg a1, TCGArg a2, TCGArg a3,
286
# define DNI
287
#endif
288
289
-static void DNI tcg_gen_op1_i32(TCGOpcode opc, TCGv_i32 a1)
290
+static void DNI tcg_gen_op1_i32(TCGOpcode opc, TCGType type, TCGv_i32 a1)
291
{
292
- tcg_gen_op1(opc, tcgv_i32_arg(a1));
293
+ tcg_gen_op1(opc, type, tcgv_i32_arg(a1));
294
}
295
296
-static void DNI tcg_gen_op1_i64(TCGOpcode opc, TCGv_i64 a1)
297
+static void DNI tcg_gen_op1_i64(TCGOpcode opc, TCGType type, TCGv_i64 a1)
298
{
299
- tcg_gen_op1(opc, tcgv_i64_arg(a1));
300
+ tcg_gen_op1(opc, type, tcgv_i64_arg(a1));
301
}
302
303
-static TCGOp * DNI tcg_gen_op1i(TCGOpcode opc, TCGArg a1)
304
+static TCGOp * DNI tcg_gen_op1i(TCGOpcode opc, TCGType type, TCGArg a1)
305
{
306
- return tcg_gen_op1(opc, a1);
307
+ return tcg_gen_op1(opc, type, a1);
308
}
309
310
static void DNI tcg_gen_op2_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2)
311
{
312
- tcg_gen_op2(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2));
313
+ tcg_gen_op2(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2));
314
}
315
316
static void DNI tcg_gen_op2_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2)
317
{
318
- tcg_gen_op2(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2));
319
+ tcg_gen_op2(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2));
320
}
321
322
static void DNI tcg_gen_op3_i32(TCGOpcode opc, TCGv_i32 a1,
323
TCGv_i32 a2, TCGv_i32 a3)
324
{
325
- tcg_gen_op3(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2), tcgv_i32_arg(a3));
326
+ tcg_gen_op3(opc, TCG_TYPE_I32, tcgv_i32_arg(a1),
327
+ tcgv_i32_arg(a2), tcgv_i32_arg(a3));
328
}
329
330
static void DNI tcg_gen_op3_i64(TCGOpcode opc, TCGv_i64 a1,
331
TCGv_i64 a2, TCGv_i64 a3)
332
{
333
- tcg_gen_op3(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2), tcgv_i64_arg(a3));
334
+ tcg_gen_op3(opc, TCG_TYPE_I64, tcgv_i64_arg(a1),
335
+ tcgv_i64_arg(a2), tcgv_i64_arg(a3));
336
}
337
338
static void DNI tcg_gen_op3i_i32(TCGOpcode opc, TCGv_i32 a1,
339
TCGv_i32 a2, TCGArg a3)
340
{
341
- tcg_gen_op3(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2), a3);
342
+ tcg_gen_op3(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2), a3);
343
}
344
345
static void DNI tcg_gen_op3i_i64(TCGOpcode opc, TCGv_i64 a1,
346
TCGv_i64 a2, TCGArg a3)
347
{
348
- tcg_gen_op3(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2), a3);
349
+ tcg_gen_op3(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2), a3);
350
}
351
352
static void DNI tcg_gen_ldst_op_i32(TCGOpcode opc, TCGv_i32 val,
353
TCGv_ptr base, TCGArg offset)
354
{
355
- tcg_gen_op3(opc, tcgv_i32_arg(val), tcgv_ptr_arg(base), offset);
356
+ tcg_gen_op3(opc, TCG_TYPE_I32, tcgv_i32_arg(val),
357
+ tcgv_ptr_arg(base), offset);
358
}
359
360
static void DNI tcg_gen_ldst_op_i64(TCGOpcode opc, TCGv_i64 val,
361
TCGv_ptr base, TCGArg offset)
362
{
363
- tcg_gen_op3(opc, tcgv_i64_arg(val), tcgv_ptr_arg(base), offset);
364
+ tcg_gen_op3(opc, TCG_TYPE_I64, tcgv_i64_arg(val),
365
+ tcgv_ptr_arg(base), offset);
366
}
367
368
static void DNI tcg_gen_op4_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
369
TCGv_i32 a3, TCGv_i32 a4)
370
{
371
- tcg_gen_op4(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
372
+ tcg_gen_op4(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
373
tcgv_i32_arg(a3), tcgv_i32_arg(a4));
374
}
375
376
static void DNI tcg_gen_op4_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
377
TCGv_i64 a3, TCGv_i64 a4)
378
{
379
- tcg_gen_op4(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
380
+ tcg_gen_op4(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
381
tcgv_i64_arg(a3), tcgv_i64_arg(a4));
382
}
383
384
static void DNI tcg_gen_op4i_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
385
TCGv_i32 a3, TCGArg a4)
386
{
387
- tcg_gen_op4(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
388
+ tcg_gen_op4(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
389
tcgv_i32_arg(a3), a4);
390
}
391
392
static void DNI tcg_gen_op4i_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
393
TCGv_i64 a3, TCGArg a4)
394
{
395
- tcg_gen_op4(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
396
+ tcg_gen_op4(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
397
tcgv_i64_arg(a3), a4);
398
}
399
400
static TCGOp * DNI tcg_gen_op4ii_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
401
TCGArg a3, TCGArg a4)
402
{
403
- return tcg_gen_op4(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2), a3, a4);
404
+ return tcg_gen_op4(opc, TCG_TYPE_I32,
405
+ tcgv_i32_arg(a1), tcgv_i32_arg(a2), a3, a4);
406
}
407
408
static TCGOp * DNI tcg_gen_op4ii_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
409
TCGArg a3, TCGArg a4)
410
{
411
- return tcg_gen_op4(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2), a3, a4);
412
+ return tcg_gen_op4(opc, TCG_TYPE_I64,
413
+ tcgv_i64_arg(a1), tcgv_i64_arg(a2), a3, a4);
414
}
415
416
static void DNI tcg_gen_op5_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
417
TCGv_i32 a3, TCGv_i32 a4, TCGv_i32 a5)
418
{
419
- tcg_gen_op5(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
420
+ tcg_gen_op5(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
421
tcgv_i32_arg(a3), tcgv_i32_arg(a4), tcgv_i32_arg(a5));
422
}
423
424
static void DNI tcg_gen_op5_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
425
TCGv_i64 a3, TCGv_i64 a4, TCGv_i64 a5)
426
{
427
- tcg_gen_op5(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
428
+ tcg_gen_op5(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
429
tcgv_i64_arg(a3), tcgv_i64_arg(a4), tcgv_i64_arg(a5));
430
}
431
432
static void DNI tcg_gen_op5ii_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
433
TCGv_i32 a3, TCGArg a4, TCGArg a5)
434
{
435
- tcg_gen_op5(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
436
+ tcg_gen_op5(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
437
tcgv_i32_arg(a3), a4, a5);
438
}
439
440
static void DNI tcg_gen_op5ii_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
441
TCGv_i64 a3, TCGArg a4, TCGArg a5)
442
{
443
- tcg_gen_op5(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
444
+ tcg_gen_op5(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
445
tcgv_i64_arg(a3), a4, a5);
446
}
447
448
@@ -XXX,XX +XXX,XX @@ static void DNI tcg_gen_op6_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
449
TCGv_i32 a3, TCGv_i32 a4,
450
TCGv_i32 a5, TCGv_i32 a6)
451
{
452
- tcg_gen_op6(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
453
+ tcg_gen_op6(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
454
tcgv_i32_arg(a3), tcgv_i32_arg(a4), tcgv_i32_arg(a5),
455
tcgv_i32_arg(a6));
456
}
457
@@ -XXX,XX +XXX,XX @@ static void DNI tcg_gen_op6_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
458
TCGv_i64 a3, TCGv_i64 a4,
459
TCGv_i64 a5, TCGv_i64 a6)
460
{
461
- tcg_gen_op6(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
462
+ tcg_gen_op6(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
463
tcgv_i64_arg(a3), tcgv_i64_arg(a4), tcgv_i64_arg(a5),
464
tcgv_i64_arg(a6));
465
}
466
@@ -XXX,XX +XXX,XX @@ static void DNI tcg_gen_op6i_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
467
TCGv_i32 a3, TCGv_i32 a4,
468
TCGv_i32 a5, TCGArg a6)
469
{
470
- tcg_gen_op6(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
471
+ tcg_gen_op6(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
472
tcgv_i32_arg(a3), tcgv_i32_arg(a4), tcgv_i32_arg(a5), a6);
473
}
474
475
@@ -XXX,XX +XXX,XX @@ static void DNI tcg_gen_op6i_i64(TCGOpcode opc, TCGv_i64 a1, TCGv_i64 a2,
476
TCGv_i64 a3, TCGv_i64 a4,
477
TCGv_i64 a5, TCGArg a6)
478
{
479
- tcg_gen_op6(opc, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
480
+ tcg_gen_op6(opc, TCG_TYPE_I64, tcgv_i64_arg(a1), tcgv_i64_arg(a2),
481
tcgv_i64_arg(a3), tcgv_i64_arg(a4), tcgv_i64_arg(a5), a6);
482
}
483
484
@@ -XXX,XX +XXX,XX @@ static TCGOp * DNI tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
485
TCGv_i32 a3, TCGv_i32 a4,
486
TCGArg a5, TCGArg a6)
487
{
488
- return tcg_gen_op6(opc, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
489
+ return tcg_gen_op6(opc, TCG_TYPE_I32, tcgv_i32_arg(a1), tcgv_i32_arg(a2),
490
tcgv_i32_arg(a3), tcgv_i32_arg(a4), a5, a6);
491
}
492
493
@@ -XXX,XX +XXX,XX @@ static TCGOp * DNI tcg_gen_op6ii_i32(TCGOpcode opc, TCGv_i32 a1, TCGv_i32 a2,
494
void gen_set_label(TCGLabel *l)
495
{
496
l->present = 1;
497
- tcg_gen_op1(INDEX_op_set_label, label_arg(l));
498
+ tcg_gen_op1(INDEX_op_set_label, 0, label_arg(l));
499
}
500
501
static void add_as_label_use(TCGLabel *l, TCGOp *op)
502
@@ -XXX,XX +XXX,XX @@ static void add_as_label_use(TCGLabel *l, TCGOp *op)
503
504
void tcg_gen_br(TCGLabel *l)
505
{
506
- add_as_label_use(l, tcg_gen_op1(INDEX_op_br, label_arg(l)));
507
+ add_as_label_use(l, tcg_gen_op1(INDEX_op_br, 0, label_arg(l)));
508
}
509
510
void tcg_gen_mb(TCGBar mb_type)
511
@@ -XXX,XX +XXX,XX @@ void tcg_gen_mb(TCGBar mb_type)
512
#endif
513
514
if (parallel) {
515
- tcg_gen_op1(INDEX_op_mb, mb_type);
516
+ tcg_gen_op1(INDEX_op_mb, 0, mb_type);
517
}
518
}
519
520
void tcg_gen_plugin_cb(unsigned from)
521
{
522
- tcg_gen_op1(INDEX_op_plugin_cb, from);
523
+ tcg_gen_op1(INDEX_op_plugin_cb, 0, from);
524
}
525
526
void tcg_gen_plugin_mem_cb(TCGv_i64 addr, unsigned meminfo)
527
{
528
- tcg_gen_op2(INDEX_op_plugin_mem_cb, tcgv_i64_arg(addr), meminfo);
529
+ tcg_gen_op2(INDEX_op_plugin_mem_cb, 0, tcgv_i64_arg(addr), meminfo);
530
}
531
532
/* 32 bit ops */
533
534
void tcg_gen_discard_i32(TCGv_i32 arg)
535
{
536
- tcg_gen_op1_i32(INDEX_op_discard, arg);
537
+ tcg_gen_op1_i32(INDEX_op_discard, TCG_TYPE_I32, arg);
538
}
539
540
void tcg_gen_mov_i32(TCGv_i32 ret, TCGv_i32 arg)
541
@@ -XXX,XX +XXX,XX @@ void tcg_gen_st_i32(TCGv_i32 arg1, TCGv_ptr arg2, tcg_target_long offset)
542
void tcg_gen_discard_i64(TCGv_i64 arg)
543
{
544
if (TCG_TARGET_REG_BITS == 64) {
545
- tcg_gen_op1_i64(INDEX_op_discard, arg);
546
+ tcg_gen_op1_i64(INDEX_op_discard, TCG_TYPE_I64, arg);
547
} else {
548
tcg_gen_discard_i32(TCGV_LOW(arg));
549
tcg_gen_discard_i32(TCGV_HIGH(arg));
550
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extrl_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
551
if (TCG_TARGET_REG_BITS == 32) {
552
tcg_gen_mov_i32(ret, TCGV_LOW(arg));
553
} else if (TCG_TARGET_HAS_extr_i64_i32) {
554
- tcg_gen_op2(INDEX_op_extrl_i64_i32,
555
+ tcg_gen_op2(INDEX_op_extrl_i64_i32, TCG_TYPE_I32,
556
tcgv_i32_arg(ret), tcgv_i64_arg(arg));
557
} else {
558
tcg_gen_mov_i32(ret, (TCGv_i32)arg);
559
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extrh_i64_i32(TCGv_i32 ret, TCGv_i64 arg)
560
if (TCG_TARGET_REG_BITS == 32) {
561
tcg_gen_mov_i32(ret, TCGV_HIGH(arg));
562
} else if (TCG_TARGET_HAS_extr_i64_i32) {
563
- tcg_gen_op2(INDEX_op_extrh_i64_i32,
564
+ tcg_gen_op2(INDEX_op_extrh_i64_i32, TCG_TYPE_I32,
565
tcgv_i32_arg(ret), tcgv_i64_arg(arg));
566
} else {
567
TCGv_i64 t = tcg_temp_ebb_new_i64();
568
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extu_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
569
tcg_gen_mov_i32(TCGV_LOW(ret), arg);
570
tcg_gen_movi_i32(TCGV_HIGH(ret), 0);
571
} else {
572
- tcg_gen_op2(INDEX_op_extu_i32_i64,
573
+ tcg_gen_op2(INDEX_op_extu_i32_i64, TCG_TYPE_I64,
574
tcgv_i64_arg(ret), tcgv_i32_arg(arg));
575
}
576
}
577
@@ -XXX,XX +XXX,XX @@ void tcg_gen_ext_i32_i64(TCGv_i64 ret, TCGv_i32 arg)
578
tcg_gen_mov_i32(TCGV_LOW(ret), arg);
579
tcg_gen_sari_i32(TCGV_HIGH(ret), TCGV_LOW(ret), 31);
580
} else {
581
- tcg_gen_op2(INDEX_op_ext_i32_i64,
582
+ tcg_gen_op2(INDEX_op_ext_i32_i64, TCG_TYPE_I64,
583
tcgv_i64_arg(ret), tcgv_i32_arg(arg));
584
}
585
}
586
@@ -XXX,XX +XXX,XX @@ void tcg_gen_exit_tb(const TranslationBlock *tb, unsigned idx)
587
tcg_debug_assert(idx == TB_EXIT_REQUESTED);
588
}
589
590
- tcg_gen_op1i(INDEX_op_exit_tb, val);
591
+ tcg_gen_op1i(INDEX_op_exit_tb, 0, val);
592
}
593
594
void tcg_gen_goto_tb(unsigned idx)
595
@@ -XXX,XX +XXX,XX @@ void tcg_gen_goto_tb(unsigned idx)
596
tcg_ctx->goto_tb_issue_mask |= 1 << idx;
597
#endif
598
plugin_gen_disable_mem_helpers();
599
- tcg_gen_op1i(INDEX_op_goto_tb, idx);
600
+ tcg_gen_op1i(INDEX_op_goto_tb, 0, idx);
601
}
602
603
void tcg_gen_lookup_and_goto_ptr(void)
604
@@ -XXX,XX +XXX,XX @@ void tcg_gen_lookup_and_goto_ptr(void)
605
plugin_gen_disable_mem_helpers();
606
ptr = tcg_temp_ebb_new_ptr();
607
gen_helper_lookup_tb_ptr(ptr, tcg_env);
608
- tcg_gen_op1i(INDEX_op_goto_ptr, tcgv_ptr_arg(ptr));
609
+ tcg_gen_op1i(INDEX_op_goto_ptr, TCG_TYPE_PTR, tcgv_ptr_arg(ptr));
610
tcg_temp_free_ptr(ptr);
611
}
612
diff --git a/tcg/tcg.c b/tcg/tcg.c
613
index XXXXXXX..XXXXXXX 100644
614
--- a/tcg/tcg.c
615
+++ b/tcg/tcg.c
616
@@ -XXX,XX +XXX,XX @@ void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs)
617
nb_cargs = def->nb_cargs;
618
619
if (def->flags & TCG_OPF_VECTOR) {
620
- col += ne_fprintf(f, "v%d,e%d,", 64 << TCGOP_VECL(op),
621
+ col += ne_fprintf(f, "v%d,e%d,",
622
+ 8 * tcg_type_size(TCGOP_TYPE(op)),
623
8 << TCGOP_VECE(op));
624
}
625
626
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
627
628
itype = its->type;
629
vece = TCGOP_VECE(op);
630
- vtype = TCGOP_VECL(op) + TCG_TYPE_V64;
631
+ vtype = TCGOP_TYPE(op);
632
633
if (its->val_type == TEMP_VAL_CONST) {
634
/* Propagate constant via movi -> dupi. */
635
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
132
break;
636
break;
133
default:
637
default:
134
g_assert_not_reached();
638
if (def->flags & TCG_OPF_VECTOR) {
639
- tcg_out_vec_op(s, op->opc, TCGOP_VECL(op), TCGOP_VECE(op),
640
- new_args, const_args);
641
+ tcg_out_vec_op(s, op->opc, TCGOP_TYPE(op) - TCG_TYPE_V64,
642
+ TCGOP_VECE(op), new_args, const_args);
643
} else {
644
tcg_out_op(s, op->opc, new_args, const_args);
645
}
646
@@ -XXX,XX +XXX,XX @@ static bool tcg_reg_alloc_dup2(TCGContext *s, const TCGOp *op)
647
{
648
const TCGLifeData arg_life = op->life;
649
TCGTemp *ots, *itsl, *itsh;
650
- TCGType vtype = TCGOP_VECL(op) + TCG_TYPE_V64;
651
+ TCGType vtype = TCGOP_TYPE(op);
652
653
/* This opcode is only valid for 32-bit hosts, for 64-bit elements. */
654
tcg_debug_assert(TCG_TARGET_REG_BITS == 32);
655
diff --git a/docs/devel/tcg-ops.rst b/docs/devel/tcg-ops.rst
656
index XXXXXXX..XXXXXXX 100644
657
--- a/docs/devel/tcg-ops.rst
658
+++ b/docs/devel/tcg-ops.rst
659
@@ -XXX,XX +XXX,XX @@ QEMU specific operations
660
Host vector operations
661
----------------------
662
663
-All of the vector ops have two parameters, ``TCGOP_VECL`` & ``TCGOP_VECE``.
664
-The former specifies the length of the vector in log2 64-bit units; the
665
-latter specifies the length of the element (if applicable) in log2 8-bit units.
666
-E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
667
+All of the vector ops have two parameters, ``TCGOP_TYPE`` & ``TCGOP_VECE``.
668
+The former specifies the length of the vector as a TCGType; the latter
669
+specifies the length of the element (if applicable) in log2 8-bit units.
670
671
.. list-table::
672
673
@@ -XXX,XX +XXX,XX @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
674
675
* - dup_vec *v0*, *r1*
676
677
- - | Duplicate the low N bits of *r1* into VECL/VECE copies across *v0*.
678
+ - | Duplicate the low N bits of *r1* into TYPE/VECE copies across *v0*.
679
680
* - dupi_vec *v0*, *c*
681
682
@@ -XXX,XX +XXX,XX @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
683
684
* - dup2_vec *v0*, *r1*, *r2*
685
686
- - | Duplicate *r2*:*r1* into VECL/64 copies across *v0*. This opcode is
687
+ - | Duplicate *r2*:*r1* into TYPE/64 copies across *v0*. This opcode is
688
only present for 32-bit hosts.
689
690
* - add_vec *v0*, *v1*, *v2*
691
@@ -XXX,XX +XXX,XX @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
692
693
.. code-block:: c
694
695
- for (i = 0; i < VECL/VECE; ++i) {
696
+ for (i = 0; i < TYPE/VECE; ++i) {
697
v0[i] = v1[i] << s2;
698
}
699
700
@@ -XXX,XX +XXX,XX @@ E.g. VECL = 1 -> 64 << 1 -> v128, and VECE = 2 -> 1 << 2 -> i32.
701
702
.. code-block:: c
703
704
- for (i = 0; i < VECL/VECE; ++i) {
705
+ for (i = 0; i < TYPE/VECE; ++i) {
706
v0[i] = v1[i] << v2[i];
707
}
708
135
--
709
--
136
2.43.0
710
2.43.0
711
712
diff view generated by jsdifflib
1
This structure, with bitfields, is incorrect for big-endian.
1
These are not particularly useful outside of optimization passes.
2
Use the existing float32_getexp_raw which uses extract32.
3
2
4
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
5
---
7
target/hexagon/fma_emu.c | 16 +++-------------
6
include/tcg/tcg.h | 4 ----
8
1 file changed, 3 insertions(+), 13 deletions(-)
7
tcg/tcg-internal.h | 5 +++++
8
2 files changed, 5 insertions(+), 4 deletions(-)
9
9
10
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
10
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/target/hexagon/fma_emu.c
12
--- a/include/tcg/tcg.h
13
+++ b/target/hexagon/fma_emu.c
13
+++ b/include/tcg/tcg.h
14
@@ -XXX,XX +XXX,XX @@ typedef union {
14
@@ -XXX,XX +XXX,XX @@ void tcg_gen_call7(void *func, TCGHelperInfo *, TCGTemp *ret,
15
};
15
16
} Double;
16
TCGOp *tcg_emit_op(TCGOpcode opc, unsigned nargs);
17
17
void tcg_op_remove(TCGContext *s, TCGOp *op);
18
-typedef union {
18
-TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op,
19
- float f;
19
- TCGOpcode opc, unsigned nargs);
20
- uint32_t i;
20
-TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op,
21
- struct {
21
- TCGOpcode opc, unsigned nargs);
22
- uint32_t mant:23;
22
23
- uint32_t exp:8;
23
/**
24
- uint32_t sign:1;
24
* tcg_remove_ops_after:
25
- };
25
diff --git a/tcg/tcg-internal.h b/tcg/tcg-internal.h
26
-} Float;
26
index XXXXXXX..XXXXXXX 100644
27
-
27
--- a/tcg/tcg-internal.h
28
static uint64_t float64_getmant(float64 f64)
28
+++ b/tcg/tcg-internal.h
29
{
29
@@ -XXX,XX +XXX,XX @@ void vec_gen_4(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg, TCGArg, TCGArg);
30
Double a = { .i = f64 };
30
void vec_gen_6(TCGOpcode opc, TCGType type, unsigned vece, TCGArg r,
31
@@ -XXX,XX +XXX,XX @@ int32_t float64_getexp(float64 f64)
31
TCGArg a, TCGArg b, TCGArg c, TCGArg d, TCGArg e);
32
32
33
int32_t float32_getexp(float32 f32)
33
+TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *op,
34
{
34
+ TCGOpcode opc, unsigned nargs);
35
- Float a = { .i = f32 };
35
+TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *op,
36
+ int exp = float32_getexp_raw(f32);
36
+ TCGOpcode opc, unsigned nargs);
37
if (float32_is_normal(f32)) {
37
+
38
- return a.exp;
38
#endif /* TCG_INTERNAL_H */
39
+ return exp;
40
}
41
if (float32_is_denormal(f32)) {
42
- return a.exp + 1;
43
+ return exp + 1;
44
}
45
return -1;
46
}
47
--
39
--
48
2.43.0
40
2.43.0
41
42
diff view generated by jsdifflib
1
This instruction has a special case that 0 * x + c returns c
1
Simplify use within the optimizers by defaulting the
2
without the normal sign folding that comes with 0 + -0.
2
new opcode to the same type as the old opcode.
3
Use the new float_muladd_suppress_add_product_zero to
4
describe this.
5
3
6
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
6
---
9
target/hexagon/op_helper.c | 11 +++--------
7
tcg/tcg.c | 4 ++++
10
1 file changed, 3 insertions(+), 8 deletions(-)
8
1 file changed, 4 insertions(+)
11
9
12
diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
10
diff --git a/tcg/tcg.c b/tcg/tcg.c
13
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
14
--- a/target/hexagon/op_helper.c
12
--- a/tcg/tcg.c
15
+++ b/target/hexagon/op_helper.c
13
+++ b/tcg/tcg.c
16
@@ -XXX,XX +XXX,XX @@ static float32 check_nan(float32 dst, float32 x, float_status *fp_status)
14
@@ -XXX,XX +XXX,XX @@ TCGOp *tcg_op_insert_before(TCGContext *s, TCGOp *old_op,
17
float32 HELPER(sffma_sc)(CPUHexagonState *env, float32 RxV,
15
TCGOpcode opc, unsigned nargs)
18
float32 RsV, float32 RtV, float32 PuV)
19
{
16
{
20
- size4s_t tmp;
17
TCGOp *new_op = tcg_op_alloc(opc, nargs);
21
arch_fpop_start(env);
18
+
22
- RxV = check_nan(RxV, RxV, &env->fp_status);
19
+ TCGOP_TYPE(new_op) = TCGOP_TYPE(old_op);
23
- RxV = check_nan(RxV, RsV, &env->fp_status);
20
QTAILQ_INSERT_BEFORE(old_op, new_op, link);
24
- RxV = check_nan(RxV, RtV, &env->fp_status);
21
return new_op;
25
- tmp = internal_fmafx(RsV, RtV, RxV, fSXTN(8, 64, PuV), &env->fp_status);
22
}
26
- if (!(float32_is_zero(RxV) && is_zero_prod(RsV, RtV))) {
23
@@ -XXX,XX +XXX,XX @@ TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *old_op,
27
- RxV = tmp;
24
TCGOpcode opc, unsigned nargs)
28
- }
25
{
29
+ RxV = float32_muladd_scalbn(RsV, RtV, RxV, fSXTN(8, 64, PuV),
26
TCGOp *new_op = tcg_op_alloc(opc, nargs);
30
+ float_muladd_suppress_add_product_zero,
27
+
31
+ &env->fp_status);
28
+ TCGOP_TYPE(new_op) = TCGOP_TYPE(old_op);
32
arch_fpop_end(env);
29
QTAILQ_INSERT_AFTER(&s->ops, old_op, new_op, link);
33
return RxV;
30
return new_op;
34
}
31
}
35
--
32
--
36
2.43.0
33
2.43.0
34
35
diff view generated by jsdifflib
1
Certain Hexagon instructions suppress changes to the result
1
To be used by some integer operations instead of,
2
when the product of fma() is a true zero.
2
or in addition to, a trailing constant argument.
3
3
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
5
---
6
include/fpu/softfloat.h | 5 +++++
6
include/tcg/tcg.h | 1 +
7
fpu/softfloat.c | 3 +++
7
1 file changed, 1 insertion(+)
8
fpu/softfloat-parts.c.inc | 4 +++-
9
3 files changed, 11 insertions(+), 1 deletion(-)
10
8
11
diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
9
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
12
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
13
--- a/include/fpu/softfloat.h
11
--- a/include/tcg/tcg.h
14
+++ b/include/fpu/softfloat.h
12
+++ b/include/tcg/tcg.h
15
@@ -XXX,XX +XXX,XX @@ bfloat16 bfloat16_squash_input_denormal(bfloat16 a, float_status *status);
13
@@ -XXX,XX +XXX,XX @@ struct TCGOp {
16
| Using these differs from negating an input or output before calling
14
#define TCGOP_CALLO(X) (X)->param2
17
| the muladd function in that this means that a NaN doesn't have its
15
18
| sign bit inverted before it is propagated.
16
#define TCGOP_TYPE(X) (X)->param1
19
+|
17
+#define TCGOP_FLAGS(X) (X)->param2
20
+| With float_muladd_suppress_add_product_zero, if A or B is zero
18
#define TCGOP_VECE(X) (X)->param2
21
+| such that the product is a true zero, then return C without addition.
19
22
+| This preserves the sign of C when C is +/- 0. Used for Hexagon.
20
/* Make sure operands fit in the bitfields above. */
23
*----------------------------------------------------------------------------*/
24
enum {
25
float_muladd_negate_c = 1,
26
float_muladd_negate_product = 2,
27
float_muladd_negate_result = 4,
28
+ float_muladd_suppress_add_product_zero = 8,
29
};
30
31
/*----------------------------------------------------------------------------
32
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/fpu/softfloat.c
35
+++ b/fpu/softfloat.c
36
@@ -XXX,XX +XXX,XX @@ float32_muladd(float32 xa, float32 xb, float32 xc, int flags, float_status *s)
37
if (unlikely(!can_use_fpu(s))) {
38
goto soft;
39
}
40
+ if (unlikely(flags & float_muladd_suppress_add_product_zero)) {
41
+ goto soft;
42
+ }
43
44
float32_input_flush3(&ua.s, &ub.s, &uc.s, s);
45
if (unlikely(!f32_is_zon3(ua, ub, uc))) {
46
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
47
index XXXXXXX..XXXXXXX 100644
48
--- a/fpu/softfloat-parts.c.inc
49
+++ b/fpu/softfloat-parts.c.inc
50
@@ -XXX,XX +XXX,XX @@ static FloatPartsN *partsN(muladd_scalbn)(FloatPartsN *a, FloatPartsN *b,
51
goto return_normal;
52
}
53
if (c->cls == float_class_zero) {
54
- if (a->sign != c->sign) {
55
+ if (flags & float_muladd_suppress_add_product_zero) {
56
+ a->sign = c->sign;
57
+ } else if (a->sign != c->sign) {
58
goto return_sub_zero;
59
}
60
goto return_zero;
61
--
21
--
62
2.43.0
22
2.43.0
diff view generated by jsdifflib
1
The function is now unused.
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
3
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
3
---
6
target/hexagon/fma_emu.h | 2 -
4
include/tcg/tcg.h | 7 ++++++-
7
target/hexagon/fma_emu.c | 171 ---------------------------------------
5
tcg/tcg.c | 11 +++++++----
8
2 files changed, 173 deletions(-)
6
2 files changed, 13 insertions(+), 5 deletions(-)
9
7
10
diff --git a/target/hexagon/fma_emu.h b/target/hexagon/fma_emu.h
8
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
11
index XXXXXXX..XXXXXXX 100644
9
index XXXXXXX..XXXXXXX 100644
12
--- a/target/hexagon/fma_emu.h
10
--- a/include/tcg/tcg.h
13
+++ b/target/hexagon/fma_emu.h
11
+++ b/include/tcg/tcg.h
14
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float32_getexp_raw(float32 f32)
12
@@ -XXX,XX +XXX,XX @@ typedef struct TCGTargetOpDef {
13
const char *args_ct_str[TCG_MAX_OP_ARGS];
14
} TCGTargetOpDef;
15
16
-bool tcg_op_supported(TCGOpcode op);
17
+/*
18
+ * tcg_op_supported:
19
+ * Query if @op, for @type and @flags, is supported by the host
20
+ * on which we are currently executing.
21
+ */
22
+bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags);
23
24
void tcg_gen_call0(void *func, TCGHelperInfo *, TCGTemp *ret);
25
void tcg_gen_call1(void *func, TCGHelperInfo *, TCGTemp *ret, TCGTemp *);
26
diff --git a/tcg/tcg.c b/tcg/tcg.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/tcg/tcg.c
29
+++ b/tcg/tcg.c
30
@@ -XXX,XX +XXX,XX @@ TCGTemp *tcgv_i32_temp(TCGv_i32 v)
15
}
31
}
16
int32_t float32_getexp(float32 f32);
32
#endif /* CONFIG_DEBUG_TCG */
17
float32 infinite_float32(uint8_t sign);
33
18
-float32 internal_fmafx(float32 a, float32 b, float32 c,
34
-/* Return true if OP may appear in the opcode stream.
19
- int scale, float_status *fp_status);
35
- Test the runtime variable that controls each opcode. */
20
float64 internal_mpyhh(float64 a, float64 b,
36
-bool tcg_op_supported(TCGOpcode op)
21
unsigned long long int accumulated,
37
+/*
22
float_status *fp_status);
38
+ * Return true if OP may appear in the opcode stream with TYPE.
23
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
39
+ * Test the runtime variable that controls each opcode.
24
index XXXXXXX..XXXXXXX 100644
40
+ */
25
--- a/target/hexagon/fma_emu.c
41
+bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
26
+++ b/target/hexagon/fma_emu.c
27
@@ -XXX,XX +XXX,XX @@ int32_t float64_getexp(float64 f64)
28
return -1;
29
}
30
31
-static uint64_t float32_getmant(float32 f32)
32
-{
33
- Float a = { .i = f32 };
34
- if (float32_is_normal(f32)) {
35
- return a.mant | 1ULL << 23;
36
- }
37
- if (float32_is_zero(f32)) {
38
- return 0;
39
- }
40
- if (float32_is_denormal(f32)) {
41
- return a.mant;
42
- }
43
- return ~0ULL;
44
-}
45
-
46
int32_t float32_getexp(float32 f32)
47
{
42
{
48
Float a = { .i = f32 };
43
const bool have_vec
49
@@ -XXX,XX +XXX,XX @@ float32 infinite_float32(uint8_t sign)
44
= TCG_TARGET_HAS_v64 | TCG_TARGET_HAS_v128 | TCG_TARGET_HAS_v256;
50
}
45
@@ -XXX,XX +XXX,XX @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start)
51
46
/* fall through */
52
/* Return a maximum finite value with the requested sign */
47
default:
53
-static float32 maxfinite_float32(uint8_t sign)
48
/* Sanity check that we've not introduced any unhandled opcodes. */
54
-{
49
- tcg_debug_assert(tcg_op_supported(opc));
55
- if (sign) {
50
+ tcg_debug_assert(tcg_op_supported(opc, TCGOP_TYPE(op),
56
- return make_float32(SF_MINUS_MAXF);
51
+ TCGOP_FLAGS(op)));
57
- } else {
52
/* Note: in order to speed up the code, it would be much
58
- return make_float32(SF_MAXF);
53
faster to have specialized register allocator functions for
59
- }
54
some common argument patterns */
60
-}
61
-
62
-/* Return a zero value with requested sign */
63
-static float32 zero_float32(uint8_t sign)
64
-{
65
- if (sign) {
66
- return make_float32(0x80000000);
67
- } else {
68
- return float32_zero;
69
- }
70
-}
71
-
72
#define GEN_XF_ROUND(SUFFIX, MANTBITS, INF_EXP, INTERNAL_TYPE) \
73
static SUFFIX accum_round_##SUFFIX(Accum a, float_status * fp_status) \
74
{ \
75
@@ -XXX,XX +XXX,XX @@ static SUFFIX accum_round_##SUFFIX(Accum a, float_status * fp_status) \
76
}
77
78
GEN_XF_ROUND(float64, DF_MANTBITS, DF_INF_EXP, Double)
79
-GEN_XF_ROUND(float32, SF_MANTBITS, SF_INF_EXP, Float)
80
-
81
-static bool is_inf_prod(float64 a, float64 b)
82
-{
83
- return ((float64_is_infinity(a) && float64_is_infinity(b)) ||
84
- (float64_is_infinity(a) && is_finite(b) && (!float64_is_zero(b))) ||
85
- (float64_is_infinity(b) && is_finite(a) && (!float64_is_zero(a))));
86
-}
87
-
88
-static float64 special_fma(float64 a, float64 b, float64 c,
89
- float_status *fp_status)
90
-{
91
- float64 ret = make_float64(0);
92
-
93
- /*
94
- * If A multiplied by B is an exact infinity and C is also an infinity
95
- * but with the opposite sign, FMA returns NaN and raises invalid.
96
- */
97
- uint8_t a_sign = float64_is_neg(a);
98
- uint8_t b_sign = float64_is_neg(b);
99
- uint8_t c_sign = float64_is_neg(c);
100
- if (is_inf_prod(a, b) && float64_is_infinity(c)) {
101
- if ((a_sign ^ b_sign) != c_sign) {
102
- ret = make_float64(DF_NAN);
103
- float_raise(float_flag_invalid, fp_status);
104
- return ret;
105
- }
106
- }
107
- if ((float64_is_infinity(a) && float64_is_zero(b)) ||
108
- (float64_is_zero(a) && float64_is_infinity(b))) {
109
- ret = make_float64(DF_NAN);
110
- float_raise(float_flag_invalid, fp_status);
111
- return ret;
112
- }
113
- /*
114
- * If none of the above checks are true and C is a NaN,
115
- * a NaN shall be returned
116
- * If A or B are NaN, a NAN shall be returned.
117
- */
118
- if (float64_is_any_nan(a) ||
119
- float64_is_any_nan(b) ||
120
- float64_is_any_nan(c)) {
121
- if (float64_is_any_nan(a) && (fGETBIT(51, a) == 0)) {
122
- float_raise(float_flag_invalid, fp_status);
123
- }
124
- if (float64_is_any_nan(b) && (fGETBIT(51, b) == 0)) {
125
- float_raise(float_flag_invalid, fp_status);
126
- }
127
- if (float64_is_any_nan(c) && (fGETBIT(51, c) == 0)) {
128
- float_raise(float_flag_invalid, fp_status);
129
- }
130
- ret = make_float64(DF_NAN);
131
- return ret;
132
- }
133
- /*
134
- * We have checked for adding opposite-signed infinities.
135
- * Other infinities return infinity with the correct sign
136
- */
137
- if (float64_is_infinity(c)) {
138
- ret = infinite_float64(c_sign);
139
- return ret;
140
- }
141
- if (float64_is_infinity(a) || float64_is_infinity(b)) {
142
- ret = infinite_float64(a_sign ^ b_sign);
143
- return ret;
144
- }
145
- g_assert_not_reached();
146
-}
147
-
148
-static float32 special_fmaf(float32 a, float32 b, float32 c,
149
- float_status *fp_status)
150
-{
151
- float64 aa, bb, cc;
152
- aa = float32_to_float64(a, fp_status);
153
- bb = float32_to_float64(b, fp_status);
154
- cc = float32_to_float64(c, fp_status);
155
- return float64_to_float32(special_fma(aa, bb, cc, fp_status), fp_status);
156
-}
157
-
158
-float32 internal_fmafx(float32 a, float32 b, float32 c, int scale,
159
- float_status *fp_status)
160
-{
161
- Accum prod;
162
- Accum acc;
163
- Accum result;
164
- accum_init(&prod);
165
- accum_init(&acc);
166
- accum_init(&result);
167
-
168
- uint8_t a_sign = float32_is_neg(a);
169
- uint8_t b_sign = float32_is_neg(b);
170
- uint8_t c_sign = float32_is_neg(c);
171
- if (float32_is_infinity(a) ||
172
- float32_is_infinity(b) ||
173
- float32_is_infinity(c)) {
174
- return special_fmaf(a, b, c, fp_status);
175
- }
176
- if (float32_is_any_nan(a) ||
177
- float32_is_any_nan(b) ||
178
- float32_is_any_nan(c)) {
179
- return special_fmaf(a, b, c, fp_status);
180
- }
181
- if ((scale == 0) && (float32_is_zero(a) || float32_is_zero(b))) {
182
- float32 tmp = float32_mul(a, b, fp_status);
183
- tmp = float32_add(tmp, c, fp_status);
184
- return tmp;
185
- }
186
-
187
- /* (a * 2**b) * (c * 2**d) == a*c * 2**(b+d) */
188
- prod.mant = int128_mul_6464(float32_getmant(a), float32_getmant(b));
189
-
190
- /*
191
- * Note: extracting the mantissa into an int is multiplying by
192
- * 2**23, so adjust here
193
- */
194
- prod.exp = float32_getexp(a) + float32_getexp(b) - SF_BIAS - 23;
195
- prod.sign = a_sign ^ b_sign;
196
- if (float32_is_zero(a) || float32_is_zero(b)) {
197
- prod.exp = -2 * WAY_BIG_EXP;
198
- }
199
- if ((scale > 0) && float32_is_denormal(c)) {
200
- acc.mant = int128_mul_6464(0, 0);
201
- acc.exp = -WAY_BIG_EXP;
202
- acc.sign = c_sign;
203
- acc.sticky = 1;
204
- result = accum_add(prod, acc);
205
- } else if (!float32_is_zero(c)) {
206
- acc.mant = int128_mul_6464(float32_getmant(c), 1);
207
- acc.exp = float32_getexp(c);
208
- acc.sign = c_sign;
209
- result = accum_add(prod, acc);
210
- } else {
211
- result = prod;
212
- }
213
- result.exp += scale;
214
- return accum_round_float32(result, fp_status);
215
-}
216
217
float64 internal_mpyhh(float64 a, float64 b,
218
unsigned long long int accumulated,
219
--
55
--
220
2.43.0
56
2.43.0
57
58
diff view generated by jsdifflib
1
The big comment just above says functions should be sorted.
1
Rely on tcg-op-vec.c to expand the opcode if missing.
2
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
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
tcg/optimize.c | 60 +++++++++++++++++++++++++-------------------------
6
target/arm/tcg/translate-sve.c | 20 ++++----------------
7
1 file changed, 30 insertions(+), 30 deletions(-)
7
1 file changed, 4 insertions(+), 16 deletions(-)
8
8
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c
10
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
11
--- a/target/arm/tcg/translate-sve.c
12
+++ b/tcg/optimize.c
12
+++ b/target/arm/tcg/translate-sve.c
13
@@ -XXX,XX +XXX,XX @@ static bool fold_call(OptContext *ctx, TCGOp *op)
13
@@ -XXX,XX +XXX,XX @@ static void gen_bsl1n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
14
return true;
14
static void gen_bsl1n_vec(unsigned vece, TCGv_vec d, TCGv_vec n,
15
TCGv_vec m, TCGv_vec k)
16
{
17
- if (TCG_TARGET_HAS_bitsel_vec) {
18
- tcg_gen_not_vec(vece, n, n);
19
- tcg_gen_bitsel_vec(vece, d, k, n, m);
20
- } else {
21
- tcg_gen_andc_vec(vece, n, k, n);
22
- tcg_gen_andc_vec(vece, m, m, k);
23
- tcg_gen_or_vec(vece, d, n, m);
24
- }
25
+ tcg_gen_not_vec(vece, n, n);
26
+ tcg_gen_bitsel_vec(vece, d, k, n, m);
15
}
27
}
16
28
17
+static bool fold_cmp_vec(OptContext *ctx, TCGOp *op)
29
static void gen_bsl1n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
18
+{
30
@@ -XXX,XX +XXX,XX @@ static void gen_bsl2n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
19
+ /* Canonicalize the comparison to put immediate second. */
31
static void gen_bsl2n_vec(unsigned vece, TCGv_vec d, TCGv_vec n,
20
+ if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
32
TCGv_vec m, TCGv_vec k)
21
+ op->args[3] = tcg_swap_cond(op->args[3]);
22
+ }
23
+ return finish_folding(ctx, op);
24
+}
25
+
26
+static bool fold_cmpsel_vec(OptContext *ctx, TCGOp *op)
27
+{
28
+ /* If true and false values are the same, eliminate the cmp. */
29
+ if (args_are_copies(op->args[3], op->args[4])) {
30
+ return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[3]);
31
+ }
32
+
33
+ /* Canonicalize the comparison to put immediate second. */
34
+ if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
35
+ op->args[5] = tcg_swap_cond(op->args[5]);
36
+ }
37
+ /*
38
+ * Canonicalize the "false" input reg to match the destination,
39
+ * so that the tcg backend can implement "move if true".
40
+ */
41
+ if (swap_commutative(op->args[0], &op->args[4], &op->args[3])) {
42
+ op->args[5] = tcg_invert_cond(op->args[5]);
43
+ }
44
+ return finish_folding(ctx, op);
45
+}
46
+
47
static bool fold_count_zeros(OptContext *ctx, TCGOp *op)
48
{
33
{
49
uint64_t z_mask, s_mask;
34
- if (TCG_TARGET_HAS_bitsel_vec) {
50
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond2(OptContext *ctx, TCGOp *op)
35
- tcg_gen_not_vec(vece, m, m);
51
return tcg_opt_gen_movi(ctx, op, op->args[0], i);
36
- tcg_gen_bitsel_vec(vece, d, k, n, m);
37
- } else {
38
- tcg_gen_and_vec(vece, n, n, k);
39
- tcg_gen_or_vec(vece, m, m, k);
40
- tcg_gen_orc_vec(vece, d, n, m);
41
- }
42
+ tcg_gen_not_vec(vece, m, m);
43
+ tcg_gen_bitsel_vec(vece, d, k, n, m);
52
}
44
}
53
45
54
-static bool fold_cmp_vec(OptContext *ctx, TCGOp *op)
46
static void gen_bsl2n(unsigned vece, uint32_t d, uint32_t n, uint32_t m,
55
-{
56
- /* Canonicalize the comparison to put immediate second. */
57
- if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
58
- op->args[3] = tcg_swap_cond(op->args[3]);
59
- }
60
- return finish_folding(ctx, op);
61
-}
62
-
63
-static bool fold_cmpsel_vec(OptContext *ctx, TCGOp *op)
64
-{
65
- /* If true and false values are the same, eliminate the cmp. */
66
- if (args_are_copies(op->args[3], op->args[4])) {
67
- return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[3]);
68
- }
69
-
70
- /* Canonicalize the comparison to put immediate second. */
71
- if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
72
- op->args[5] = tcg_swap_cond(op->args[5]);
73
- }
74
- /*
75
- * Canonicalize the "false" input reg to match the destination,
76
- * so that the tcg backend can implement "move if true".
77
- */
78
- if (swap_commutative(op->args[0], &op->args[4], &op->args[3])) {
79
- op->args[5] = tcg_invert_cond(op->args[5]);
80
- }
81
- return finish_folding(ctx, op);
82
-}
83
-
84
static bool fold_sextract(OptContext *ctx, TCGOp *op)
85
{
86
uint64_t z_mask, s_mask, s_mask_old;
87
--
47
--
88
2.43.0
48
2.43.0
49
50
diff view generated by jsdifflib
1
Convert all targets simultaneously, as the gen_intermediate_code
1
Do not reference TCG_TARGET_HAS_* directly.
2
function disappears from the target. While there are possible
3
workarounds, they're larger than simply performing the conversion.
4
2
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/exec/translator.h | 14 --------------
6
target/arm/tcg/translate-a64.c | 10 ++++++----
9
include/hw/core/tcg-cpu-ops.h | 13 +++++++++++++
7
target/arm/tcg/translate-sve.c | 2 +-
10
target/alpha/cpu.h | 2 ++
8
target/arm/tcg/translate.c | 2 +-
11
target/arm/internals.h | 2 ++
9
3 files changed, 8 insertions(+), 6 deletions(-)
12
target/avr/cpu.h | 2 ++
13
target/hexagon/cpu.h | 2 ++
14
target/hppa/cpu.h | 2 ++
15
target/i386/tcg/helper-tcg.h | 2 ++
16
target/loongarch/internals.h | 2 ++
17
target/m68k/cpu.h | 2 ++
18
target/microblaze/cpu.h | 2 ++
19
target/mips/tcg/tcg-internal.h | 2 ++
20
target/openrisc/cpu.h | 2 ++
21
target/ppc/cpu.h | 2 ++
22
target/riscv/cpu.h | 3 +++
23
target/rx/cpu.h | 2 ++
24
target/s390x/s390x-internal.h | 2 ++
25
target/sh4/cpu.h | 2 ++
26
target/sparc/cpu.h | 2 ++
27
target/tricore/cpu.h | 2 ++
28
target/xtensa/cpu.h | 2 ++
29
accel/tcg/cpu-exec.c | 8 +++++---
30
accel/tcg/translate-all.c | 8 +++++---
31
target/alpha/cpu.c | 1 +
32
target/alpha/translate.c | 4 ++--
33
target/arm/cpu.c | 1 +
34
target/arm/tcg/cpu-v7m.c | 1 +
35
target/arm/tcg/translate.c | 5 ++---
36
target/avr/cpu.c | 1 +
37
target/avr/translate.c | 6 +++---
38
target/hexagon/cpu.c | 1 +
39
target/hexagon/translate.c | 4 ++--
40
target/hppa/cpu.c | 1 +
41
target/hppa/translate.c | 4 ++--
42
target/i386/tcg/tcg-cpu.c | 1 +
43
target/i386/tcg/translate.c | 5 ++---
44
target/loongarch/cpu.c | 1 +
45
target/loongarch/tcg/translate.c | 4 ++--
46
target/m68k/cpu.c | 1 +
47
target/m68k/translate.c | 4 ++--
48
target/microblaze/cpu.c | 1 +
49
target/microblaze/translate.c | 4 ++--
50
target/mips/cpu.c | 1 +
51
target/mips/tcg/translate.c | 4 ++--
52
target/openrisc/cpu.c | 1 +
53
target/openrisc/translate.c | 4 ++--
54
target/ppc/cpu_init.c | 1 +
55
target/ppc/translate.c | 4 ++--
56
target/riscv/tcg/tcg-cpu.c | 1 +
57
target/riscv/translate.c | 4 ++--
58
target/rx/cpu.c | 1 +
59
target/rx/translate.c | 4 ++--
60
target/s390x/cpu.c | 1 +
61
target/s390x/tcg/translate.c | 4 ++--
62
target/sh4/cpu.c | 1 +
63
target/sh4/translate.c | 4 ++--
64
target/sparc/cpu.c | 1 +
65
target/sparc/translate.c | 4 ++--
66
target/tricore/cpu.c | 1 +
67
target/tricore/translate.c | 5 ++---
68
target/xtensa/cpu.c | 1 +
69
target/xtensa/translate.c | 4 ++--
70
62 files changed, 121 insertions(+), 62 deletions(-)
71
10
72
diff --git a/include/exec/translator.h b/include/exec/translator.h
11
diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c
73
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
74
--- a/include/exec/translator.h
13
--- a/target/arm/tcg/translate-a64.c
75
+++ b/include/exec/translator.h
14
+++ b/target/arm/tcg/translate-a64.c
76
@@ -XXX,XX +XXX,XX @@
15
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
77
#include "qemu/bswap.h"
16
TCGv_i64 tcg_rn, tcg_y;
78
#include "exec/vaddr.h"
17
DisasCompare c;
79
18
unsigned nzcv;
80
-/**
19
+ bool has_andc;
81
- * gen_intermediate_code
20
82
- * @cpu: cpu context
21
/* Set T0 = !COND. */
83
- * @tb: translation block
22
arm_test_cc(&c, a->cond);
84
- * @max_insns: max number of instructions to translate
23
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
85
- * @pc: guest virtual program counter address
24
tcg_gen_subi_i32(tcg_t2, tcg_t0, 1);
86
- * @host_pc: host physical program counter address
25
87
- *
26
nzcv = a->nzcv;
88
- * This function must be provided by the target, which should create
27
+ has_andc = tcg_op_supported(INDEX_op_andc_i32, TCG_TYPE_I32, 0);
89
- * the target-specific DisasContext, and then invoke translator_loop.
28
if (nzcv & 8) { /* N */
90
- */
29
tcg_gen_or_i32(cpu_NF, cpu_NF, tcg_t1);
91
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
30
} else {
92
- vaddr pc, void *host_pc);
31
- if (TCG_TARGET_HAS_andc_i32) {
93
-
32
+ if (has_andc) {
94
/**
33
tcg_gen_andc_i32(cpu_NF, cpu_NF, tcg_t1);
95
* DisasJumpType:
34
} else {
96
* @DISAS_NEXT: Next instruction in program order.
35
tcg_gen_and_i32(cpu_NF, cpu_NF, tcg_t2);
97
diff --git a/include/hw/core/tcg-cpu-ops.h b/include/hw/core/tcg-cpu-ops.h
36
}
37
}
38
if (nzcv & 4) { /* Z */
39
- if (TCG_TARGET_HAS_andc_i32) {
40
+ if (has_andc) {
41
tcg_gen_andc_i32(cpu_ZF, cpu_ZF, tcg_t1);
42
} else {
43
tcg_gen_and_i32(cpu_ZF, cpu_ZF, tcg_t2);
44
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
45
if (nzcv & 2) { /* C */
46
tcg_gen_or_i32(cpu_CF, cpu_CF, tcg_t0);
47
} else {
48
- if (TCG_TARGET_HAS_andc_i32) {
49
+ if (has_andc) {
50
tcg_gen_andc_i32(cpu_CF, cpu_CF, tcg_t1);
51
} else {
52
tcg_gen_and_i32(cpu_CF, cpu_CF, tcg_t2);
53
@@ -XXX,XX +XXX,XX @@ static bool trans_CCMP(DisasContext *s, arg_CCMP *a)
54
if (nzcv & 1) { /* V */
55
tcg_gen_or_i32(cpu_VF, cpu_VF, tcg_t1);
56
} else {
57
- if (TCG_TARGET_HAS_andc_i32) {
58
+ if (has_andc) {
59
tcg_gen_andc_i32(cpu_VF, cpu_VF, tcg_t1);
60
} else {
61
tcg_gen_and_i32(cpu_VF, cpu_VF, tcg_t2);
62
diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c
98
index XXXXXXX..XXXXXXX 100644
63
index XXXXXXX..XXXXXXX 100644
99
--- a/include/hw/core/tcg-cpu-ops.h
64
--- a/target/arm/tcg/translate-sve.c
100
+++ b/include/hw/core/tcg-cpu-ops.h
65
+++ b/target/arm/tcg/translate-sve.c
101
@@ -XXX,XX +XXX,XX @@ struct TCGCPUOps {
66
@@ -XXX,XX +XXX,XX @@ static void gen_bsl2n_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, TCGv_i64 k)
102
* Called when the first CPU is realized.
67
* = | ~(m | k)
103
*/
68
*/
104
void (*initialize)(void);
69
tcg_gen_and_i64(n, n, k);
105
+ /**
70
- if (TCG_TARGET_HAS_orc_i64) {
106
+ * @translate_code: Translate guest instructions to TCGOps
71
+ if (tcg_op_supported(INDEX_op_orc_i64, TCG_TYPE_I64, 0)) {
107
+ * @cpu: cpu context
72
tcg_gen_or_i64(m, m, k);
108
+ * @tb: translation block
73
tcg_gen_orc_i64(d, n, m);
109
+ * @max_insns: max number of instructions to translate
74
} else {
110
+ * @pc: guest virtual program counter address
111
+ * @host_pc: host physical program counter address
112
+ *
113
+ * This function must be provided by the target, which should create
114
+ * the target-specific DisasContext, and then invoke translator_loop.
115
+ */
116
+ void (*translate_code)(CPUState *cpu, TranslationBlock *tb,
117
+ int *max_insns, vaddr pc, void *host_pc);
118
/**
119
* @synchronize_from_tb: Synchronize state from a TCG #TranslationBlock
120
*
121
diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h
122
index XXXXXXX..XXXXXXX 100644
123
--- a/target/alpha/cpu.h
124
+++ b/target/alpha/cpu.h
125
@@ -XXX,XX +XXX,XX @@ enum {
126
};
127
128
void alpha_translate_init(void);
129
+void alpha_translate_code(CPUState *cs, TranslationBlock *tb,
130
+ int *max_insns, vaddr pc, void *host_pc);
131
132
#define CPU_RESOLVING_TYPE TYPE_ALPHA_CPU
133
134
diff --git a/target/arm/internals.h b/target/arm/internals.h
135
index XXXXXXX..XXXXXXX 100644
136
--- a/target/arm/internals.h
137
+++ b/target/arm/internals.h
138
@@ -XXX,XX +XXX,XX @@ void init_cpreg_list(ARMCPU *cpu);
139
140
void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu);
141
void arm_translate_init(void);
142
+void arm_translate_code(CPUState *cs, TranslationBlock *tb,
143
+ int *max_insns, vaddr pc, void *host_pc);
144
145
void arm_cpu_register_gdb_commands(ARMCPU *cpu);
146
void aarch64_cpu_register_gdb_commands(ARMCPU *cpu, GString *,
147
diff --git a/target/avr/cpu.h b/target/avr/cpu.h
148
index XXXXXXX..XXXXXXX 100644
149
--- a/target/avr/cpu.h
150
+++ b/target/avr/cpu.h
151
@@ -XXX,XX +XXX,XX @@ static inline void set_avr_feature(CPUAVRState *env, int feature)
152
}
153
154
void avr_cpu_tcg_init(void);
155
+void avr_cpu_translate_code(CPUState *cs, TranslationBlock *tb,
156
+ int *max_insns, vaddr pc, void *host_pc);
157
158
int cpu_avr_exec(CPUState *cpu);
159
160
diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h
161
index XXXXXXX..XXXXXXX 100644
162
--- a/target/hexagon/cpu.h
163
+++ b/target/hexagon/cpu.h
164
@@ -XXX,XX +XXX,XX @@ static inline void cpu_get_tb_cpu_state(CPUHexagonState *env, vaddr *pc,
165
typedef HexagonCPU ArchCPU;
166
167
void hexagon_translate_init(void);
168
+void hexagon_translate_code(CPUState *cs, TranslationBlock *tb,
169
+ int *max_insns, vaddr pc, void *host_pc);
170
171
#include "exec/cpu-all.h"
172
173
diff --git a/target/hppa/cpu.h b/target/hppa/cpu.h
174
index XXXXXXX..XXXXXXX 100644
175
--- a/target/hppa/cpu.h
176
+++ b/target/hppa/cpu.h
177
@@ -XXX,XX +XXX,XX @@ static inline int HPPA_BTLB_ENTRIES(CPUHPPAState *env)
178
}
179
180
void hppa_translate_init(void);
181
+void hppa_translate_code(CPUState *cs, TranslationBlock *tb,
182
+ int *max_insns, vaddr pc, void *host_pc);
183
184
#define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
185
186
diff --git a/target/i386/tcg/helper-tcg.h b/target/i386/tcg/helper-tcg.h
187
index XXXXXXX..XXXXXXX 100644
188
--- a/target/i386/tcg/helper-tcg.h
189
+++ b/target/i386/tcg/helper-tcg.h
190
@@ -XXX,XX +XXX,XX @@ static inline target_long lshift(target_long x, int n)
191
192
/* translate.c */
193
void tcg_x86_init(void);
194
+void x86_translate_code(CPUState *cs, TranslationBlock *tb,
195
+ int *max_insns, vaddr pc, void *host_pc);
196
197
/* excp_helper.c */
198
G_NORETURN void raise_exception(CPUX86State *env, int exception_index);
199
diff --git a/target/loongarch/internals.h b/target/loongarch/internals.h
200
index XXXXXXX..XXXXXXX 100644
201
--- a/target/loongarch/internals.h
202
+++ b/target/loongarch/internals.h
203
@@ -XXX,XX +XXX,XX @@
204
#define TARGET_VIRT_MASK MAKE_64BIT_MASK(0, TARGET_VIRT_ADDR_SPACE_BITS)
205
206
void loongarch_translate_init(void);
207
+void loongarch_translate_code(CPUState *cs, TranslationBlock *tb,
208
+ int *max_insns, vaddr pc, void *host_pc);
209
210
void G_NORETURN do_raise_exception(CPULoongArchState *env,
211
uint32_t exception,
212
diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h
213
index XXXXXXX..XXXXXXX 100644
214
--- a/target/m68k/cpu.h
215
+++ b/target/m68k/cpu.h
216
@@ -XXX,XX +XXX,XX @@ int m68k_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
217
int m68k_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
218
219
void m68k_tcg_init(void);
220
+void m68k_translate_code(CPUState *cs, TranslationBlock *tb,
221
+ int *max_insns, vaddr pc, void *host_pc);
222
void m68k_cpu_init_gdb(M68kCPU *cpu);
223
uint32_t cpu_m68k_get_ccr(CPUM68KState *env);
224
void cpu_m68k_set_ccr(CPUM68KState *env, uint32_t);
225
diff --git a/target/microblaze/cpu.h b/target/microblaze/cpu.h
226
index XXXXXXX..XXXXXXX 100644
227
--- a/target/microblaze/cpu.h
228
+++ b/target/microblaze/cpu.h
229
@@ -XXX,XX +XXX,XX @@ static inline void mb_cpu_write_msr(CPUMBState *env, uint32_t val)
230
}
231
232
void mb_tcg_init(void);
233
+void mb_translate_code(CPUState *cs, TranslationBlock *tb,
234
+ int *max_insns, vaddr pc, void *host_pc);
235
236
#define CPU_RESOLVING_TYPE TYPE_MICROBLAZE_CPU
237
238
diff --git a/target/mips/tcg/tcg-internal.h b/target/mips/tcg/tcg-internal.h
239
index XXXXXXX..XXXXXXX 100644
240
--- a/target/mips/tcg/tcg-internal.h
241
+++ b/target/mips/tcg/tcg-internal.h
242
@@ -XXX,XX +XXX,XX @@
243
#include "cpu.h"
244
245
void mips_tcg_init(void);
246
+void mips_translate_code(CPUState *cs, TranslationBlock *tb,
247
+ int *max_insns, vaddr pc, void *host_pc);
248
249
void mips_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb);
250
G_NORETURN void mips_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
251
diff --git a/target/openrisc/cpu.h b/target/openrisc/cpu.h
252
index XXXXXXX..XXXXXXX 100644
253
--- a/target/openrisc/cpu.h
254
+++ b/target/openrisc/cpu.h
255
@@ -XXX,XX +XXX,XX @@ void openrisc_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
256
int openrisc_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
257
int openrisc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
258
void openrisc_translate_init(void);
259
+void openrisc_translate_code(CPUState *cs, TranslationBlock *tb,
260
+ int *max_insns, vaddr pc, void *host_pc);
261
int print_insn_or1k(bfd_vma addr, disassemble_info *info);
262
263
#ifndef CONFIG_USER_ONLY
264
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
265
index XXXXXXX..XXXXXXX 100644
266
--- a/target/ppc/cpu.h
267
+++ b/target/ppc/cpu.h
268
@@ -XXX,XX +XXX,XX @@ extern const VMStateDescription vmstate_ppc_cpu;
269
270
/*****************************************************************************/
271
void ppc_translate_init(void);
272
+void ppc_translate_code(CPUState *cs, TranslationBlock *tb,
273
+ int *max_insns, vaddr pc, void *host_pc);
274
275
#if !defined(CONFIG_USER_ONLY)
276
void ppc_store_sdr1(CPUPPCState *env, target_ulong value);
277
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
278
index XXXXXXX..XXXXXXX 100644
279
--- a/target/riscv/cpu.h
280
+++ b/target/riscv/cpu.h
281
@@ -XXX,XX +XXX,XX @@ RISCVException smstateen_acc_ok(CPURISCVState *env, int index, uint64_t bit);
282
void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv, bool virt_en);
283
284
void riscv_translate_init(void);
285
+void riscv_translate_code(CPUState *cs, TranslationBlock *tb,
286
+ int *max_insns, vaddr pc, void *host_pc);
287
+
288
G_NORETURN void riscv_raise_exception(CPURISCVState *env,
289
uint32_t exception, uintptr_t pc);
290
291
diff --git a/target/rx/cpu.h b/target/rx/cpu.h
292
index XXXXXXX..XXXXXXX 100644
293
--- a/target/rx/cpu.h
294
+++ b/target/rx/cpu.h
295
@@ -XXX,XX +XXX,XX @@ int rx_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
296
int rx_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
297
298
void rx_translate_init(void);
299
+void rx_translate_code(CPUState *cs, TranslationBlock *tb,
300
+ int *max_insns, vaddr pc, void *host_pc);
301
void rx_cpu_unpack_psw(CPURXState *env, uint32_t psw, int rte);
302
303
#include "exec/cpu-all.h"
304
diff --git a/target/s390x/s390x-internal.h b/target/s390x/s390x-internal.h
305
index XXXXXXX..XXXXXXX 100644
306
--- a/target/s390x/s390x-internal.h
307
+++ b/target/s390x/s390x-internal.h
308
@@ -XXX,XX +XXX,XX @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3,
309
310
/* translate.c */
311
void s390x_translate_init(void);
312
+void s390x_translate_code(CPUState *cs, TranslationBlock *tb,
313
+ int *max_insns, vaddr pc, void *host_pc);
314
void s390x_restore_state_to_opc(CPUState *cs,
315
const TranslationBlock *tb,
316
const uint64_t *data);
317
diff --git a/target/sh4/cpu.h b/target/sh4/cpu.h
318
index XXXXXXX..XXXXXXX 100644
319
--- a/target/sh4/cpu.h
320
+++ b/target/sh4/cpu.h
321
@@ -XXX,XX +XXX,XX @@ G_NORETURN void superh_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
322
uintptr_t retaddr);
323
324
void sh4_translate_init(void);
325
+void sh4_translate_code(CPUState *cs, TranslationBlock *tb,
326
+ int *max_insns, vaddr pc, void *host_pc);
327
328
#if !defined(CONFIG_USER_ONLY)
329
hwaddr superh_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
330
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
331
index XXXXXXX..XXXXXXX 100644
332
--- a/target/sparc/cpu.h
333
+++ b/target/sparc/cpu.h
334
@@ -XXX,XX +XXX,XX @@ int sparc_cpu_memory_rw_debug(CPUState *cpu, vaddr addr,
335
336
/* translate.c */
337
void sparc_tcg_init(void);
338
+void sparc_translate_code(CPUState *cs, TranslationBlock *tb,
339
+ int *max_insns, vaddr pc, void *host_pc);
340
341
/* fop_helper.c */
342
target_ulong cpu_get_fsr(CPUSPARCState *);
343
diff --git a/target/tricore/cpu.h b/target/tricore/cpu.h
344
index XXXXXXX..XXXXXXX 100644
345
--- a/target/tricore/cpu.h
346
+++ b/target/tricore/cpu.h
347
@@ -XXX,XX +XXX,XX @@ FIELD(TB_FLAGS, PRIV, 0, 2)
348
349
void cpu_state_reset(CPUTriCoreState *s);
350
void tricore_tcg_init(void);
351
+void tricore_translate_code(CPUState *cs, TranslationBlock *tb,
352
+ int *max_insns, vaddr pc, void *host_pc);
353
354
static inline void cpu_get_tb_cpu_state(CPUTriCoreState *env, vaddr *pc,
355
uint64_t *cs_base, uint32_t *flags)
356
diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h
357
index XXXXXXX..XXXXXXX 100644
358
--- a/target/xtensa/cpu.h
359
+++ b/target/xtensa/cpu.h
360
@@ -XXX,XX +XXX,XX @@ G_NORETURN void xtensa_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
361
362
void xtensa_collect_sr_names(const XtensaConfig *config);
363
void xtensa_translate_init(void);
364
+void xtensa_translate_code(CPUState *cs, TranslationBlock *tb,
365
+ int *max_insns, vaddr pc, void *host_pc);
366
void **xtensa_get_regfile_by_name(const char *name, int entries, int bits);
367
void xtensa_breakpoint_handler(CPUState *cs);
368
void xtensa_register_core(XtensaConfigList *node);
369
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
370
index XXXXXXX..XXXXXXX 100644
371
--- a/accel/tcg/cpu-exec.c
372
+++ b/accel/tcg/cpu-exec.c
373
@@ -XXX,XX +XXX,XX @@ bool tcg_exec_realizefn(CPUState *cpu, Error **errp)
374
375
if (!tcg_target_initialized) {
376
/* Check mandatory TCGCPUOps handlers */
377
+ const TCGCPUOps *tcg_ops = cpu->cc->tcg_ops;
378
#ifndef CONFIG_USER_ONLY
379
- assert(cpu->cc->tcg_ops->cpu_exec_halt);
380
- assert(cpu->cc->tcg_ops->cpu_exec_interrupt);
381
+ assert(tcg_ops->cpu_exec_halt);
382
+ assert(tcg_ops->cpu_exec_interrupt);
383
#endif /* !CONFIG_USER_ONLY */
384
- cpu->cc->tcg_ops->initialize();
385
+ assert(tcg_ops->translate_code);
386
+ tcg_ops->initialize();
387
tcg_target_initialized = true;
388
}
389
390
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
391
index XXXXXXX..XXXXXXX 100644
392
--- a/accel/tcg/translate-all.c
393
+++ b/accel/tcg/translate-all.c
394
@@ -XXX,XX +XXX,XX @@ static int setjmp_gen_code(CPUArchState *env, TranslationBlock *tb,
395
396
tcg_func_start(tcg_ctx);
397
398
- tcg_ctx->cpu = env_cpu(env);
399
- gen_intermediate_code(env_cpu(env), tb, max_insns, pc, host_pc);
400
+ CPUState *cs = env_cpu(env);
401
+ tcg_ctx->cpu = cs;
402
+ cs->cc->tcg_ops->translate_code(cs, tb, max_insns, pc, host_pc);
403
+
404
assert(tb->size != 0);
405
tcg_ctx->cpu = NULL;
406
*max_insns = tb->icount;
407
@@ -XXX,XX +XXX,XX @@ TranslationBlock *tb_gen_code(CPUState *cpu,
408
/*
409
* Overflow of code_gen_buffer, or the current slice of it.
410
*
411
- * TODO: We don't need to re-do gen_intermediate_code, nor
412
+ * TODO: We don't need to re-do tcg_ops->translate_code, nor
413
* should we re-do the tcg optimization currently hidden
414
* inside tcg_gen_code. All that should be required is to
415
* flush the TBs, allocate a new TB, re-initialize it per
416
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
417
index XXXXXXX..XXXXXXX 100644
418
--- a/target/alpha/cpu.c
419
+++ b/target/alpha/cpu.c
420
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps alpha_sysemu_ops = {
421
422
static const TCGCPUOps alpha_tcg_ops = {
423
.initialize = alpha_translate_init,
424
+ .translate_code = alpha_translate_code,
425
.synchronize_from_tb = alpha_cpu_synchronize_from_tb,
426
.restore_state_to_opc = alpha_restore_state_to_opc,
427
428
diff --git a/target/alpha/translate.c b/target/alpha/translate.c
429
index XXXXXXX..XXXXXXX 100644
430
--- a/target/alpha/translate.c
431
+++ b/target/alpha/translate.c
432
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps alpha_tr_ops = {
433
.tb_stop = alpha_tr_tb_stop,
434
};
435
436
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
437
- vaddr pc, void *host_pc)
438
+void alpha_translate_code(CPUState *cpu, TranslationBlock *tb,
439
+ int *max_insns, vaddr pc, void *host_pc)
440
{
441
DisasContext dc;
442
translator_loop(cpu, tb, max_insns, pc, host_pc, &alpha_tr_ops, &dc.base);
443
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
444
index XXXXXXX..XXXXXXX 100644
445
--- a/target/arm/cpu.c
446
+++ b/target/arm/cpu.c
447
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps arm_sysemu_ops = {
448
#ifdef CONFIG_TCG
449
static const TCGCPUOps arm_tcg_ops = {
450
.initialize = arm_translate_init,
451
+ .translate_code = arm_translate_code,
452
.synchronize_from_tb = arm_cpu_synchronize_from_tb,
453
.debug_excp_handler = arm_debug_excp_handler,
454
.restore_state_to_opc = arm_restore_state_to_opc,
455
diff --git a/target/arm/tcg/cpu-v7m.c b/target/arm/tcg/cpu-v7m.c
456
index XXXXXXX..XXXXXXX 100644
457
--- a/target/arm/tcg/cpu-v7m.c
458
+++ b/target/arm/tcg/cpu-v7m.c
459
@@ -XXX,XX +XXX,XX @@ static void cortex_m55_initfn(Object *obj)
460
461
static const TCGCPUOps arm_v7m_tcg_ops = {
462
.initialize = arm_translate_init,
463
+ .translate_code = arm_translate_code,
464
.synchronize_from_tb = arm_cpu_synchronize_from_tb,
465
.debug_excp_handler = arm_debug_excp_handler,
466
.restore_state_to_opc = arm_restore_state_to_opc,
467
diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c
75
diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c
468
index XXXXXXX..XXXXXXX 100644
76
index XXXXXXX..XXXXXXX 100644
469
--- a/target/arm/tcg/translate.c
77
--- a/target/arm/tcg/translate.c
470
+++ b/target/arm/tcg/translate.c
78
+++ b/target/arm/tcg/translate.c
471
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps thumb_translator_ops = {
79
@@ -XXX,XX +XXX,XX @@ static void gen_add_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
472
.tb_stop = arm_tr_tb_stop,
80
static void gen_adc_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1)
473
};
474
475
-/* generate intermediate code for basic block 'tb'. */
476
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
477
- vaddr pc, void *host_pc)
478
+void arm_translate_code(CPUState *cpu, TranslationBlock *tb,
479
+ int *max_insns, vaddr pc, void *host_pc)
480
{
81
{
481
DisasContext dc = { };
82
TCGv_i32 tmp = tcg_temp_new_i32();
482
const TranslatorOps *ops = &arm_translator_ops;
83
- if (TCG_TARGET_HAS_add2_i32) {
483
diff --git a/target/avr/cpu.c b/target/avr/cpu.c
84
+ if (tcg_op_supported(INDEX_op_add2_i32, TCG_TYPE_I32, 0)) {
484
index XXXXXXX..XXXXXXX 100644
85
tcg_gen_movi_i32(tmp, 0);
485
--- a/target/avr/cpu.c
86
tcg_gen_add2_i32(cpu_NF, cpu_CF, t0, tmp, cpu_CF, tmp);
486
+++ b/target/avr/cpu.c
87
tcg_gen_add2_i32(cpu_NF, cpu_CF, cpu_NF, cpu_CF, t1, tmp);
487
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps avr_sysemu_ops = {
488
489
static const TCGCPUOps avr_tcg_ops = {
490
.initialize = avr_cpu_tcg_init,
491
+ .translate_code = avr_cpu_translate_code,
492
.synchronize_from_tb = avr_cpu_synchronize_from_tb,
493
.restore_state_to_opc = avr_restore_state_to_opc,
494
.cpu_exec_interrupt = avr_cpu_exec_interrupt,
495
diff --git a/target/avr/translate.c b/target/avr/translate.c
496
index XXXXXXX..XXXXXXX 100644
497
--- a/target/avr/translate.c
498
+++ b/target/avr/translate.c
499
@@ -XXX,XX +XXX,XX @@ static bool trans_WDR(DisasContext *ctx, arg_WDR *a)
500
*
501
* - translate()
502
* - canonicalize_skip()
503
- * - gen_intermediate_code()
504
+ * - translate_code()
505
* - restore_state_to_opc()
506
*
507
*/
508
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps avr_tr_ops = {
509
.tb_stop = avr_tr_tb_stop,
510
};
511
512
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
513
- vaddr pc, void *host_pc)
514
+void avr_cpu_translate_code(CPUState *cs, TranslationBlock *tb,
515
+ int *max_insns, vaddr pc, void *host_pc)
516
{
517
DisasContext dc = { };
518
translator_loop(cs, tb, max_insns, pc, host_pc, &avr_tr_ops, &dc.base);
519
diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c
520
index XXXXXXX..XXXXXXX 100644
521
--- a/target/hexagon/cpu.c
522
+++ b/target/hexagon/cpu.c
523
@@ -XXX,XX +XXX,XX @@ static void hexagon_cpu_init(Object *obj)
524
525
static const TCGCPUOps hexagon_tcg_ops = {
526
.initialize = hexagon_translate_init,
527
+ .translate_code = hexagon_translate_code,
528
.synchronize_from_tb = hexagon_cpu_synchronize_from_tb,
529
.restore_state_to_opc = hexagon_restore_state_to_opc,
530
};
531
diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c
532
index XXXXXXX..XXXXXXX 100644
533
--- a/target/hexagon/translate.c
534
+++ b/target/hexagon/translate.c
535
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps hexagon_tr_ops = {
536
.tb_stop = hexagon_tr_tb_stop,
537
};
538
539
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
540
- vaddr pc, void *host_pc)
541
+void hexagon_translate_code(CPUState *cs, TranslationBlock *tb,
542
+ int *max_insns, vaddr pc, void *host_pc)
543
{
544
DisasContext ctx;
545
546
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
547
index XXXXXXX..XXXXXXX 100644
548
--- a/target/hppa/cpu.c
549
+++ b/target/hppa/cpu.c
550
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps hppa_sysemu_ops = {
551
552
static const TCGCPUOps hppa_tcg_ops = {
553
.initialize = hppa_translate_init,
554
+ .translate_code = hppa_translate_code,
555
.synchronize_from_tb = hppa_cpu_synchronize_from_tb,
556
.restore_state_to_opc = hppa_restore_state_to_opc,
557
558
diff --git a/target/hppa/translate.c b/target/hppa/translate.c
559
index XXXXXXX..XXXXXXX 100644
560
--- a/target/hppa/translate.c
561
+++ b/target/hppa/translate.c
562
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps hppa_tr_ops = {
563
#endif
564
};
565
566
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
567
- vaddr pc, void *host_pc)
568
+void hppa_translate_code(CPUState *cs, TranslationBlock *tb,
569
+ int *max_insns, vaddr pc, void *host_pc)
570
{
571
DisasContext ctx = { };
572
translator_loop(cs, tb, max_insns, pc, host_pc, &hppa_tr_ops, &ctx.base);
573
diff --git a/target/i386/tcg/tcg-cpu.c b/target/i386/tcg/tcg-cpu.c
574
index XXXXXXX..XXXXXXX 100644
575
--- a/target/i386/tcg/tcg-cpu.c
576
+++ b/target/i386/tcg/tcg-cpu.c
577
@@ -XXX,XX +XXX,XX @@ static bool x86_debug_check_breakpoint(CPUState *cs)
578
579
static const TCGCPUOps x86_tcg_ops = {
580
.initialize = tcg_x86_init,
581
+ .translate_code = x86_translate_code,
582
.synchronize_from_tb = x86_cpu_synchronize_from_tb,
583
.restore_state_to_opc = x86_restore_state_to_opc,
584
.cpu_exec_enter = x86_cpu_exec_enter,
585
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
586
index XXXXXXX..XXXXXXX 100644
587
--- a/target/i386/tcg/translate.c
588
+++ b/target/i386/tcg/translate.c
589
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps i386_tr_ops = {
590
.tb_stop = i386_tr_tb_stop,
591
};
592
593
-/* generate intermediate code for basic block 'tb'. */
594
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
595
- vaddr pc, void *host_pc)
596
+void x86_translate_code(CPUState *cpu, TranslationBlock *tb,
597
+ int *max_insns, vaddr pc, void *host_pc)
598
{
599
DisasContext dc;
600
601
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
602
index XXXXXXX..XXXXXXX 100644
603
--- a/target/loongarch/cpu.c
604
+++ b/target/loongarch/cpu.c
605
@@ -XXX,XX +XXX,XX @@ static void loongarch_cpu_dump_state(CPUState *cs, FILE *f, int flags)
606
607
static const TCGCPUOps loongarch_tcg_ops = {
608
.initialize = loongarch_translate_init,
609
+ .translate_code = loongarch_translate_code,
610
.synchronize_from_tb = loongarch_cpu_synchronize_from_tb,
611
.restore_state_to_opc = loongarch_restore_state_to_opc,
612
613
diff --git a/target/loongarch/tcg/translate.c b/target/loongarch/tcg/translate.c
614
index XXXXXXX..XXXXXXX 100644
615
--- a/target/loongarch/tcg/translate.c
616
+++ b/target/loongarch/tcg/translate.c
617
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps loongarch_tr_ops = {
618
.tb_stop = loongarch_tr_tb_stop,
619
};
620
621
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
622
- vaddr pc, void *host_pc)
623
+void loongarch_translate_code(CPUState *cs, TranslationBlock *tb,
624
+ int *max_insns, vaddr pc, void *host_pc)
625
{
626
DisasContext ctx;
627
628
diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c
629
index XXXXXXX..XXXXXXX 100644
630
--- a/target/m68k/cpu.c
631
+++ b/target/m68k/cpu.c
632
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps m68k_sysemu_ops = {
633
634
static const TCGCPUOps m68k_tcg_ops = {
635
.initialize = m68k_tcg_init,
636
+ .translate_code = m68k_translate_code,
637
.restore_state_to_opc = m68k_restore_state_to_opc,
638
639
#ifndef CONFIG_USER_ONLY
640
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
641
index XXXXXXX..XXXXXXX 100644
642
--- a/target/m68k/translate.c
643
+++ b/target/m68k/translate.c
644
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps m68k_tr_ops = {
645
.tb_stop = m68k_tr_tb_stop,
646
};
647
648
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
649
- vaddr pc, void *host_pc)
650
+void m68k_translate_code(CPUState *cpu, TranslationBlock *tb,
651
+ int *max_insns, vaddr pc, void *host_pc)
652
{
653
DisasContext dc;
654
translator_loop(cpu, tb, max_insns, pc, host_pc, &m68k_tr_ops, &dc.base);
655
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
656
index XXXXXXX..XXXXXXX 100644
657
--- a/target/microblaze/cpu.c
658
+++ b/target/microblaze/cpu.c
659
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps mb_sysemu_ops = {
660
661
static const TCGCPUOps mb_tcg_ops = {
662
.initialize = mb_tcg_init,
663
+ .translate_code = mb_translate_code,
664
.synchronize_from_tb = mb_cpu_synchronize_from_tb,
665
.restore_state_to_opc = mb_restore_state_to_opc,
666
667
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
668
index XXXXXXX..XXXXXXX 100644
669
--- a/target/microblaze/translate.c
670
+++ b/target/microblaze/translate.c
671
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps mb_tr_ops = {
672
.tb_stop = mb_tr_tb_stop,
673
};
674
675
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
676
- vaddr pc, void *host_pc)
677
+void mb_translate_code(CPUState *cpu, TranslationBlock *tb,
678
+ int *max_insns, vaddr pc, void *host_pc)
679
{
680
DisasContext dc;
681
translator_loop(cpu, tb, max_insns, pc, host_pc, &mb_tr_ops, &dc.base);
682
diff --git a/target/mips/cpu.c b/target/mips/cpu.c
683
index XXXXXXX..XXXXXXX 100644
684
--- a/target/mips/cpu.c
685
+++ b/target/mips/cpu.c
686
@@ -XXX,XX +XXX,XX @@ static const Property mips_cpu_properties[] = {
687
#include "hw/core/tcg-cpu-ops.h"
688
static const TCGCPUOps mips_tcg_ops = {
689
.initialize = mips_tcg_init,
690
+ .translate_code = mips_translate_code,
691
.synchronize_from_tb = mips_cpu_synchronize_from_tb,
692
.restore_state_to_opc = mips_restore_state_to_opc,
693
694
diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c
695
index XXXXXXX..XXXXXXX 100644
696
--- a/target/mips/tcg/translate.c
697
+++ b/target/mips/tcg/translate.c
698
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps mips_tr_ops = {
699
.tb_stop = mips_tr_tb_stop,
700
};
701
702
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
703
- vaddr pc, void *host_pc)
704
+void mips_translate_code(CPUState *cs, TranslationBlock *tb,
705
+ int *max_insns, vaddr pc, void *host_pc)
706
{
707
DisasContext ctx;
708
709
diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c
710
index XXXXXXX..XXXXXXX 100644
711
--- a/target/openrisc/cpu.c
712
+++ b/target/openrisc/cpu.c
713
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps openrisc_sysemu_ops = {
714
715
static const TCGCPUOps openrisc_tcg_ops = {
716
.initialize = openrisc_translate_init,
717
+ .translate_code = openrisc_translate_code,
718
.synchronize_from_tb = openrisc_cpu_synchronize_from_tb,
719
.restore_state_to_opc = openrisc_restore_state_to_opc,
720
721
diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c
722
index XXXXXXX..XXXXXXX 100644
723
--- a/target/openrisc/translate.c
724
+++ b/target/openrisc/translate.c
725
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps openrisc_tr_ops = {
726
.tb_stop = openrisc_tr_tb_stop,
727
};
728
729
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
730
- vaddr pc, void *host_pc)
731
+void openrisc_translate_code(CPUState *cs, TranslationBlock *tb,
732
+ int *max_insns, vaddr pc, void *host_pc)
733
{
734
DisasContext ctx;
735
736
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
737
index XXXXXXX..XXXXXXX 100644
738
--- a/target/ppc/cpu_init.c
739
+++ b/target/ppc/cpu_init.c
740
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps ppc_sysemu_ops = {
741
742
static const TCGCPUOps ppc_tcg_ops = {
743
.initialize = ppc_translate_init,
744
+ .translate_code = ppc_translate_code,
745
.restore_state_to_opc = ppc_restore_state_to_opc,
746
747
#ifdef CONFIG_USER_ONLY
748
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
749
index XXXXXXX..XXXXXXX 100644
750
--- a/target/ppc/translate.c
751
+++ b/target/ppc/translate.c
752
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps ppc_tr_ops = {
753
.tb_stop = ppc_tr_tb_stop,
754
};
755
756
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
757
- vaddr pc, void *host_pc)
758
+void ppc_translate_code(CPUState *cs, TranslationBlock *tb,
759
+ int *max_insns, vaddr pc, void *host_pc)
760
{
761
DisasContext ctx;
762
763
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
764
index XXXXXXX..XXXXXXX 100644
765
--- a/target/riscv/tcg/tcg-cpu.c
766
+++ b/target/riscv/tcg/tcg-cpu.c
767
@@ -XXX,XX +XXX,XX @@ static void riscv_restore_state_to_opc(CPUState *cs,
768
769
static const TCGCPUOps riscv_tcg_ops = {
770
.initialize = riscv_translate_init,
771
+ .translate_code = riscv_translate_code,
772
.synchronize_from_tb = riscv_cpu_synchronize_from_tb,
773
.restore_state_to_opc = riscv_restore_state_to_opc,
774
775
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
776
index XXXXXXX..XXXXXXX 100644
777
--- a/target/riscv/translate.c
778
+++ b/target/riscv/translate.c
779
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps riscv_tr_ops = {
780
.tb_stop = riscv_tr_tb_stop,
781
};
782
783
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
784
- vaddr pc, void *host_pc)
785
+void riscv_translate_code(CPUState *cs, TranslationBlock *tb,
786
+ int *max_insns, vaddr pc, void *host_pc)
787
{
788
DisasContext ctx;
789
790
diff --git a/target/rx/cpu.c b/target/rx/cpu.c
791
index XXXXXXX..XXXXXXX 100644
792
--- a/target/rx/cpu.c
793
+++ b/target/rx/cpu.c
794
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps rx_sysemu_ops = {
795
796
static const TCGCPUOps rx_tcg_ops = {
797
.initialize = rx_translate_init,
798
+ .translate_code = rx_translate_code,
799
.synchronize_from_tb = rx_cpu_synchronize_from_tb,
800
.restore_state_to_opc = rx_restore_state_to_opc,
801
.tlb_fill = rx_cpu_tlb_fill,
802
diff --git a/target/rx/translate.c b/target/rx/translate.c
803
index XXXXXXX..XXXXXXX 100644
804
--- a/target/rx/translate.c
805
+++ b/target/rx/translate.c
806
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps rx_tr_ops = {
807
.tb_stop = rx_tr_tb_stop,
808
};
809
810
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
811
- vaddr pc, void *host_pc)
812
+void rx_translate_code(CPUState *cs, TranslationBlock *tb,
813
+ int *max_insns, vaddr pc, void *host_pc)
814
{
815
DisasContext dc;
816
817
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
818
index XXXXXXX..XXXXXXX 100644
819
--- a/target/s390x/cpu.c
820
+++ b/target/s390x/cpu.c
821
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUS390XState *env, vaddr *pc,
822
823
static const TCGCPUOps s390_tcg_ops = {
824
.initialize = s390x_translate_init,
825
+ .translate_code = s390x_translate_code,
826
.restore_state_to_opc = s390x_restore_state_to_opc,
827
828
#ifdef CONFIG_USER_ONLY
829
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
830
index XXXXXXX..XXXXXXX 100644
831
--- a/target/s390x/tcg/translate.c
832
+++ b/target/s390x/tcg/translate.c
833
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps s390x_tr_ops = {
834
.disas_log = s390x_tr_disas_log,
835
};
836
837
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
838
- vaddr pc, void *host_pc)
839
+void s390x_translate_code(CPUState *cs, TranslationBlock *tb,
840
+ int *max_insns, vaddr pc, void *host_pc)
841
{
842
DisasContext dc;
843
844
diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c
845
index XXXXXXX..XXXXXXX 100644
846
--- a/target/sh4/cpu.c
847
+++ b/target/sh4/cpu.c
848
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps sh4_sysemu_ops = {
849
850
static const TCGCPUOps superh_tcg_ops = {
851
.initialize = sh4_translate_init,
852
+ .translate_code = sh4_translate_code,
853
.synchronize_from_tb = superh_cpu_synchronize_from_tb,
854
.restore_state_to_opc = superh_restore_state_to_opc,
855
856
diff --git a/target/sh4/translate.c b/target/sh4/translate.c
857
index XXXXXXX..XXXXXXX 100644
858
--- a/target/sh4/translate.c
859
+++ b/target/sh4/translate.c
860
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps sh4_tr_ops = {
861
.tb_stop = sh4_tr_tb_stop,
862
};
863
864
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
865
- vaddr pc, void *host_pc)
866
+void sh4_translate_code(CPUState *cs, TranslationBlock *tb,
867
+ int *max_insns, vaddr pc, void *host_pc)
868
{
869
DisasContext ctx;
870
871
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
872
index XXXXXXX..XXXXXXX 100644
873
--- a/target/sparc/cpu.c
874
+++ b/target/sparc/cpu.c
875
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps sparc_sysemu_ops = {
876
877
static const TCGCPUOps sparc_tcg_ops = {
878
.initialize = sparc_tcg_init,
879
+ .translate_code = sparc_translate_code,
880
.synchronize_from_tb = sparc_cpu_synchronize_from_tb,
881
.restore_state_to_opc = sparc_restore_state_to_opc,
882
883
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
884
index XXXXXXX..XXXXXXX 100644
885
--- a/target/sparc/translate.c
886
+++ b/target/sparc/translate.c
887
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps sparc_tr_ops = {
888
.tb_stop = sparc_tr_tb_stop,
889
};
890
891
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
892
- vaddr pc, void *host_pc)
893
+void sparc_translate_code(CPUState *cs, TranslationBlock *tb,
894
+ int *max_insns, vaddr pc, void *host_pc)
895
{
896
DisasContext dc = {};
897
898
diff --git a/target/tricore/cpu.c b/target/tricore/cpu.c
899
index XXXXXXX..XXXXXXX 100644
900
--- a/target/tricore/cpu.c
901
+++ b/target/tricore/cpu.c
902
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps tricore_sysemu_ops = {
903
904
static const TCGCPUOps tricore_tcg_ops = {
905
.initialize = tricore_tcg_init,
906
+ .translate_code = tricore_translate_code,
907
.synchronize_from_tb = tricore_cpu_synchronize_from_tb,
908
.restore_state_to_opc = tricore_restore_state_to_opc,
909
.tlb_fill = tricore_cpu_tlb_fill,
910
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
911
index XXXXXXX..XXXXXXX 100644
912
--- a/target/tricore/translate.c
913
+++ b/target/tricore/translate.c
914
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps tricore_tr_ops = {
915
.tb_stop = tricore_tr_tb_stop,
916
};
917
918
-
919
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
920
- vaddr pc, void *host_pc)
921
+void tricore_translate_code(CPUState *cs, TranslationBlock *tb,
922
+ int *max_insns, vaddr pc, void *host_pc)
923
{
924
DisasContext ctx;
925
translator_loop(cs, tb, max_insns, pc, host_pc,
926
diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c
927
index XXXXXXX..XXXXXXX 100644
928
--- a/target/xtensa/cpu.c
929
+++ b/target/xtensa/cpu.c
930
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps xtensa_sysemu_ops = {
931
932
static const TCGCPUOps xtensa_tcg_ops = {
933
.initialize = xtensa_translate_init,
934
+ .translate_code = xtensa_translate_code,
935
.debug_excp_handler = xtensa_breakpoint_handler,
936
.restore_state_to_opc = xtensa_restore_state_to_opc,
937
938
diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c
939
index XXXXXXX..XXXXXXX 100644
940
--- a/target/xtensa/translate.c
941
+++ b/target/xtensa/translate.c
942
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps xtensa_translator_ops = {
943
.tb_stop = xtensa_tr_tb_stop,
944
};
945
946
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
947
- vaddr pc, void *host_pc)
948
+void xtensa_translate_code(CPUState *cpu, TranslationBlock *tb,
949
+ int *max_insns, vaddr pc, void *host_pc)
950
{
951
DisasContext dc = {};
952
translator_loop(cpu, tb, max_insns, pc, host_pc,
953
--
88
--
954
2.43.0
89
2.43.0
955
90
956
91
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
1
Do not reference TCG_TARGET_HAS_* directly.
2
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
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
tcg/optimize.c | 4 ++--
6
target/tricore/translate.c | 4 ++--
7
1 file changed, 2 insertions(+), 2 deletions(-)
7
1 file changed, 2 insertions(+), 2 deletions(-)
8
8
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
10
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
11
--- a/target/tricore/translate.c
12
+++ b/tcg/optimize.c
12
+++ b/target/tricore/translate.c
13
@@ -XXX,XX +XXX,XX @@ static bool fold_extu(OptContext *ctx, TCGOp *op)
13
@@ -XXX,XX +XXX,XX @@ static void decode_bit_andacc(DisasContext *ctx)
14
g_assert_not_reached();
14
pos1, pos2, &tcg_gen_andc_tl, &tcg_gen_and_tl);
15
}
15
break;
16
16
case OPC2_32_BIT_AND_NOR_T:
17
- ctx->z_mask = z_mask;
17
- if (TCG_TARGET_HAS_andc_i32) {
18
if (!type_change && fold_affected_mask(ctx, op, z_mask_old ^ z_mask)) {
18
+ if (tcg_op_supported(INDEX_op_andc_i32, TCG_TYPE_I32, 0)) {
19
return true;
19
gen_bit_2op(cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2],
20
}
20
pos1, pos2, &tcg_gen_or_tl, &tcg_gen_andc_tl);
21
- return fold_masks(ctx, op);
21
} else {
22
+
22
@@ -XXX,XX +XXX,XX @@ static void decode_bit_orand(DisasContext *ctx)
23
+ return fold_masks_z(ctx, op, z_mask);
23
pos1, pos2, &tcg_gen_andc_tl, &tcg_gen_or_tl);
24
}
24
break;
25
25
case OPC2_32_BIT_OR_NOR_T:
26
static bool fold_mb(OptContext *ctx, TCGOp *op)
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 {
27
--
31
--
28
2.43.0
32
2.43.0
33
34
diff view generated by jsdifflib
1
Add fold_masks_z as a trivial wrapper around fold_masks_zs.
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Avoid the use of the OptContext slots.
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@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/optimize.c | 13 ++++++++++---
4
include/tcg/tcg.h | 6 ++++++
8
1 file changed, 10 insertions(+), 3 deletions(-)
5
tcg/tcg.c | 21 +++++++++++++++++++++
6
2 files changed, 27 insertions(+)
9
7
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
11
index XXXXXXX..XXXXXXX 100644
9
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
10
--- a/include/tcg/tcg.h
13
+++ b/tcg/optimize.c
11
+++ b/include/tcg/tcg.h
14
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
12
@@ -XXX,XX +XXX,XX @@ typedef struct TCGTargetOpDef {
15
return true;
13
* on which we are currently executing.
14
*/
15
bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags);
16
+/*
17
+ * tcg_op_deposit_valid:
18
+ * Query if a deposit into (ofs, len) is supported for @type by
19
+ * the host on which we are currently executing.
20
+ */
21
+bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len);
22
23
void tcg_gen_call0(void *func, TCGHelperInfo *, TCGTemp *ret);
24
void tcg_gen_call1(void *func, TCGHelperInfo *, TCGTemp *ret, TCGTemp *);
25
diff --git a/tcg/tcg.c b/tcg/tcg.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/tcg/tcg.c
28
+++ b/tcg/tcg.c
29
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
30
}
16
}
31
}
17
32
18
+static bool fold_masks_z(OptContext *ctx, TCGOp *op, uint64_t z_mask)
33
+bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len)
19
+{
34
+{
20
+ return fold_masks_zs(ctx, op, z_mask, 0);
35
+ tcg_debug_assert(len > 0);
36
+ switch (type) {
37
+ case TCG_TYPE_I32:
38
+ tcg_debug_assert(ofs < 32);
39
+ tcg_debug_assert(len <= 32);
40
+ tcg_debug_assert(ofs + len <= 32);
41
+ return TCG_TARGET_HAS_deposit_i32 &&
42
+ TCG_TARGET_deposit_i32_valid(ofs, len);
43
+ case TCG_TYPE_I64:
44
+ tcg_debug_assert(ofs < 64);
45
+ tcg_debug_assert(len <= 64);
46
+ tcg_debug_assert(ofs + len <= 64);
47
+ return TCG_TARGET_HAS_deposit_i64 &&
48
+ TCG_TARGET_deposit_i64_valid(ofs, len);
49
+ default:
50
+ g_assert_not_reached();
51
+ }
21
+}
52
+}
22
+
53
+
23
static bool fold_masks(OptContext *ctx, TCGOp *op)
54
static TCGOp *tcg_op_alloc(TCGOpcode opc, unsigned nargs);
24
{
55
25
return fold_masks_zs(ctx, op, ctx->z_mask, ctx->s_mask);
56
static void tcg_gen_callN(void *func, TCGHelperInfo *info,
26
@@ -XXX,XX +XXX,XX @@ static bool fold_count_zeros(OptContext *ctx, TCGOp *op)
27
28
static bool fold_ctpop(OptContext *ctx, TCGOp *op)
29
{
30
+ uint64_t z_mask;
31
+
32
if (fold_const1(ctx, op)) {
33
return true;
34
}
35
36
switch (ctx->type) {
37
case TCG_TYPE_I32:
38
- ctx->z_mask = 32 | 31;
39
+ z_mask = 32 | 31;
40
break;
41
case TCG_TYPE_I64:
42
- ctx->z_mask = 64 | 63;
43
+ z_mask = 64 | 63;
44
break;
45
default:
46
g_assert_not_reached();
47
}
48
- return false;
49
+ return fold_masks_z(ctx, op, z_mask);
50
}
51
52
static bool fold_deposit(OptContext *ctx, TCGOp *op)
53
--
57
--
54
2.43.0
58
2.43.0
59
60
diff view generated by jsdifflib
1
There are no special cases for this instruction. Since hexagon
1
This macro is unused.
2
always uses default-nan mode, explicitly negating the first
3
input is unnecessary. Use float_muladd_negate_product instead.
4
2
5
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
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
target/hexagon/op_helper.c | 5 ++---
6
target/i386/tcg/emit.c.inc | 2 --
9
1 file changed, 2 insertions(+), 3 deletions(-)
7
1 file changed, 2 deletions(-)
10
8
11
diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
9
diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc
12
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
13
--- a/target/hexagon/op_helper.c
11
--- a/target/i386/tcg/emit.c.inc
14
+++ b/target/hexagon/op_helper.c
12
+++ b/target/i386/tcg/emit.c.inc
15
@@ -XXX,XX +XXX,XX @@ float32 HELPER(sffma_sc)(CPUHexagonState *env, float32 RxV,
13
@@ -XXX,XX +XXX,XX @@
16
float32 HELPER(sffms)(CPUHexagonState *env, float32 RxV,
14
#ifdef TARGET_X86_64
17
float32 RsV, float32 RtV)
15
#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i64
18
{
16
#define TCG_TARGET_deposit_tl_valid TCG_TARGET_deposit_i64_valid
19
- float32 neg_RsV;
17
-#define TCG_TARGET_extract_tl_valid TCG_TARGET_extract_i64_valid
20
arch_fpop_start(env);
18
#else
21
- neg_RsV = float32_set_sign(RsV, float32_is_neg(RsV) ? 0 : 1);
19
#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i32
22
- RxV = internal_fmafx(neg_RsV, RtV, RxV, 0, &env->fp_status);
20
#define TCG_TARGET_deposit_tl_valid TCG_TARGET_deposit_i32_valid
23
+ RxV = float32_muladd(RsV, RtV, RxV, float_muladd_negate_product,
21
-#define TCG_TARGET_extract_tl_valid TCG_TARGET_extract_i32_valid
24
+ &env->fp_status);
22
#endif
25
arch_fpop_end(env);
23
26
return RxV;
24
#define MMX_OFFSET(reg) \
27
}
28
--
25
--
29
2.43.0
26
2.43.0
27
28
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
1
Avoid direct usage of TCG_TARGET_deposit_*_valid.
2
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
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
tcg/optimize.c | 24 +++++++++---------------
6
target/i386/tcg/emit.c.inc | 6 ++----
7
1 file changed, 9 insertions(+), 15 deletions(-)
7
1 file changed, 2 insertions(+), 4 deletions(-)
8
8
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc
10
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
11
--- a/target/i386/tcg/emit.c.inc
12
+++ b/tcg/optimize.c
12
+++ b/target/i386/tcg/emit.c.inc
13
@@ -XXX,XX +XXX,XX @@ static bool fold_cmpsel_vec(OptContext *ctx, TCGOp *op)
13
@@ -XXX,XX +XXX,XX @@
14
static bool fold_sextract(OptContext *ctx, TCGOp *op)
14
*/
15
{
15
#ifdef TARGET_X86_64
16
uint64_t z_mask, s_mask, s_mask_old;
16
#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i64
17
+ TempOptInfo *t1 = arg_info(op->args[1]);
17
-#define TCG_TARGET_deposit_tl_valid TCG_TARGET_deposit_i64_valid
18
int pos = op->args[2];
18
#else
19
int len = op->args[3];
19
#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i32
20
20
-#define TCG_TARGET_deposit_tl_valid TCG_TARGET_deposit_i32_valid
21
- if (arg_is_const(op->args[1])) {
21
#endif
22
- uint64_t t;
22
23
-
23
#define MMX_OFFSET(reg) \
24
- t = arg_info(op->args[1])->val;
24
@@ -XXX,XX +XXX,XX @@ static void gen_RCL(DisasContext *s, X86DecodedInsn *decode)
25
- t = sextract64(t, pos, len);
26
- return tcg_opt_gen_movi(ctx, op, op->args[0], t);
27
+ if (ti_is_const(t1)) {
28
+ return tcg_opt_gen_movi(ctx, op, op->args[0],
29
+ sextract64(ti_const_val(t1), pos, len));
30
}
25
}
31
26
32
- z_mask = arg_info(op->args[1])->z_mask;
27
/* Compute high part, including incoming carry. */
33
- z_mask = sextract64(z_mask, pos, len);
28
- if (!have_1bit_cin || TCG_TARGET_deposit_tl_valid(1, TARGET_LONG_BITS - 1)) {
34
- ctx->z_mask = z_mask;
29
+ if (!have_1bit_cin || tcg_op_deposit_valid(TCG_TYPE_TL, 1, TARGET_LONG_BITS - 1)) {
35
-
30
/* high = (T0 << 1) | cin */
36
- s_mask_old = arg_info(op->args[1])->s_mask;
31
TCGv cin = have_1bit_cin ? decode->cc_dst : decode->cc_src;
37
- s_mask = sextract64(s_mask_old, pos, len);
32
tcg_gen_deposit_tl(high, cin, s->T0, 1, TARGET_LONG_BITS - 1);
38
- s_mask |= MAKE_64BIT_MASK(len, 64 - len);
33
@@ -XXX,XX +XXX,XX @@ static void gen_RCR(DisasContext *s, X86DecodedInsn *decode)
39
- ctx->s_mask = s_mask;
40
+ s_mask_old = t1->s_mask;
41
+ s_mask = s_mask_old >> pos;
42
+ s_mask |= -1ull << (len - 1);
43
44
if (0 && pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
45
return true;
46
}
34
}
47
35
48
- return fold_masks(ctx, op);
36
/* Save incoming carry into high, it will be shifted later. */
49
+ z_mask = sextract64(t1->z_mask, pos, len);
37
- if (!have_1bit_cin || TCG_TARGET_deposit_tl_valid(1, TARGET_LONG_BITS - 1)) {
50
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
38
+ if (!have_1bit_cin || tcg_op_deposit_valid(TCG_TYPE_TL, 1, TARGET_LONG_BITS - 1)) {
51
}
39
TCGv cin = have_1bit_cin ? decode->cc_dst : decode->cc_src;
52
40
tcg_gen_deposit_tl(high, cin, s->T0, 1, TARGET_LONG_BITS - 1);
53
static bool fold_shift(OptContext *ctx, TCGOp *op)
41
} else {
54
--
42
--
55
2.43.0
43
2.43.0
44
45
diff view generated by jsdifflib
1
Use the scalbn interface instead of float_muladd_halve_result.
1
Do not reference TCG_TARGET_HAS_* directly.
2
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
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/arm/tcg/helper-a64.c | 6 +++---
6
target/i386/tcg/emit.c.inc | 6 +++---
7
1 file changed, 3 insertions(+), 3 deletions(-)
7
1 file changed, 3 insertions(+), 3 deletions(-)
8
8
9
diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
9
diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc
10
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/arm/tcg/helper-a64.c
11
--- a/target/i386/tcg/emit.c.inc
12
+++ b/target/arm/tcg/helper-a64.c
12
+++ b/target/i386/tcg/emit.c.inc
13
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(rsqrtsf_f16)(uint32_t a, uint32_t b, float_status *fpst)
13
@@ -XXX,XX +XXX,XX @@
14
(float16_is_infinity(b) && float16_is_zero(a))) {
14
* The exact opcode to check depends on 32- vs. 64-bit.
15
return float16_one_point_five;
15
*/
16
}
16
#ifdef TARGET_X86_64
17
- return float16_muladd(a, b, float16_three, float_muladd_halve_result, fpst);
17
-#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i64
18
+ return float16_muladd_scalbn(a, b, float16_three, -1, 0, fpst);
18
+#define INDEX_op_extract2_tl INDEX_op_extract2_i64
19
}
19
#else
20
20
-#define TCG_TARGET_HAS_extract2_tl TCG_TARGET_HAS_extract2_i32
21
float32 HELPER(rsqrtsf_f32)(float32 a, float32 b, float_status *fpst)
21
+#define INDEX_op_extract2_tl INDEX_op_extract2_i32
22
@@ -XXX,XX +XXX,XX @@ float32 HELPER(rsqrtsf_f32)(float32 a, float32 b, float_status *fpst)
22
#endif
23
(float32_is_infinity(b) && float32_is_zero(a))) {
23
24
return float32_one_point_five;
24
#define MMX_OFFSET(reg) \
25
}
25
@@ -XXX,XX +XXX,XX @@ static void gen_PMOVMSKB(DisasContext *s, X86DecodedInsn *decode)
26
- return float32_muladd(a, b, float32_three, float_muladd_halve_result, fpst);
26
tcg_gen_ld8u_tl(s->T0, tcg_env, offsetof(CPUX86State, xmm_t0.ZMM_B(vec_len - 1)));
27
+ return float32_muladd_scalbn(a, b, float32_three, -1, 0, fpst);
27
while (vec_len > 8) {
28
}
28
vec_len -= 8;
29
29
- if (TCG_TARGET_HAS_extract2_tl) {
30
float64 HELPER(rsqrtsf_f64)(float64 a, float64 b, float_status *fpst)
30
+ if (tcg_op_supported(INDEX_op_extract2_tl, TCG_TYPE_TL, 0)) {
31
@@ -XXX,XX +XXX,XX @@ float64 HELPER(rsqrtsf_f64)(float64 a, float64 b, float_status *fpst)
31
/*
32
(float64_is_infinity(b) && float64_is_zero(a))) {
32
* Load the next byte of the result into the high byte of T.
33
return float64_one_point_five;
33
* TCG does a similar expansion of deposit to shl+extract2; by
34
}
35
- return float64_muladd(a, b, float64_three, float_muladd_halve_result, fpst);
36
+ return float64_muladd_scalbn(a, b, float64_three, -1, 0, fpst);
37
}
38
39
/* Floating-point reciprocal exponent - see FPRecpX in ARM ARM */
40
--
34
--
41
2.43.0
35
2.43.0
42
36
43
37
diff view generated by jsdifflib
1
The big comment just above says functions should be sorted.
1
Make these features unconditional, as they're used by most
2
Add forward declarations as needed.
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: Pierrick Bouvier <pierrick.bouvier@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
8
---
7
tcg/optimize.c | 114 +++++++++++++++++++++++++------------------------
9
include/tcg/tcg.h | 4 -
8
1 file changed, 59 insertions(+), 55 deletions(-)
10
tcg/aarch64/tcg-target.h | 2 -
11
tcg/arm/tcg-target.h | 2 -
12
tcg/i386/tcg-target.h | 2 -
13
tcg/loongarch64/tcg-target.h | 2 -
14
tcg/mips/tcg-target.h | 2 -
15
tcg/ppc/tcg-target.h | 2 -
16
tcg/riscv/tcg-target.h | 3 -
17
tcg/s390x/tcg-target.h | 2 -
18
tcg/sparc64/tcg-target.h | 2 -
19
tcg/tcg.c | 211 +++++++++++++++++++++++++++++--
20
tcg/aarch64/tcg-target.c.inc | 2 -
21
tcg/arm/tcg-target.c.inc | 2 -
22
tcg/i386/tcg-target.c.inc | 3 -
23
tcg/loongarch64/tcg-target.c.inc | 9 +-
24
tcg/mips/tcg-target.c.inc | 3 -
25
tcg/ppc/tcg-target.c.inc | 2 -
26
tcg/riscv/tcg-target.c.inc | 3 -
27
tcg/s390x/tcg-target.c.inc | 2 -
28
tcg/sparc64/tcg-target.c.inc | 3 -
29
tcg/tcg-ldst.c.inc | 65 ----------
30
tcg/tcg-pool.c.inc | 162 ------------------------
31
tcg/tci/tcg-target.c.inc | 12 +-
32
23 files changed, 216 insertions(+), 286 deletions(-)
33
delete mode 100644 tcg/tcg-ldst.c.inc
34
delete mode 100644 tcg/tcg-pool.c.inc
9
35
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
36
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
11
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
38
--- a/include/tcg/tcg.h
13
+++ b/tcg/optimize.c
39
+++ b/include/tcg/tcg.h
14
@@ -XXX,XX +XXX,XX @@ static bool fold_xx_to_x(OptContext *ctx, TCGOp *op)
40
@@ -XXX,XX +XXX,XX @@ struct TCGContext {
15
* 3) those that produce information about the result value.
41
CPUState *cpu; /* *_trans */
16
*/
42
17
43
/* These structures are private to tcg-target.c.inc. */
18
+static bool fold_or(OptContext *ctx, TCGOp *op);
44
-#ifdef TCG_TARGET_NEED_LDST_LABELS
19
+static bool fold_orc(OptContext *ctx, TCGOp *op);
45
QSIMPLEQ_HEAD(, TCGLabelQemuLdst) ldst_labels;
20
+static bool fold_xor(OptContext *ctx, TCGOp *op);
46
-#endif
21
+
47
-#ifdef TCG_TARGET_NEED_POOL_LABELS
22
static bool fold_add(OptContext *ctx, TCGOp *op)
48
struct TCGLabelPoolData *pool_labels;
23
{
49
-#endif
24
if (fold_const2_commutative(ctx, op) ||
50
25
@@ -XXX,XX +XXX,XX @@ static bool fold_andc(OptContext *ctx, TCGOp *op)
51
TCGLabel *exitreq_label;
26
return fold_masks_zs(ctx, op, z_mask, s_mask);
52
53
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
54
index XXXXXXX..XXXXXXX 100644
55
--- a/tcg/aarch64/tcg-target.h
56
+++ b/tcg/aarch64/tcg-target.h
57
@@ -XXX,XX +XXX,XX @@ typedef enum {
58
#define TCG_TARGET_HAS_tst_vec 1
59
60
#define TCG_TARGET_DEFAULT_MO (0)
61
-#define TCG_TARGET_NEED_LDST_LABELS
62
-#define TCG_TARGET_NEED_POOL_LABELS
63
64
#endif /* AARCH64_TCG_TARGET_H */
65
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
66
index XXXXXXX..XXXXXXX 100644
67
--- a/tcg/arm/tcg-target.h
68
+++ b/tcg/arm/tcg-target.h
69
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
70
#define TCG_TARGET_HAS_tst_vec 1
71
72
#define TCG_TARGET_DEFAULT_MO (0)
73
-#define TCG_TARGET_NEED_LDST_LABELS
74
-#define TCG_TARGET_NEED_POOL_LABELS
75
76
#endif
77
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
78
index XXXXXXX..XXXXXXX 100644
79
--- a/tcg/i386/tcg-target.h
80
+++ b/tcg/i386/tcg-target.h
81
@@ -XXX,XX +XXX,XX @@ typedef enum {
82
#include "tcg/tcg-mo.h"
83
84
#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
85
-#define TCG_TARGET_NEED_LDST_LABELS
86
-#define TCG_TARGET_NEED_POOL_LABELS
87
88
#endif
89
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
90
index XXXXXXX..XXXXXXX 100644
91
--- a/tcg/loongarch64/tcg-target.h
92
+++ b/tcg/loongarch64/tcg-target.h
93
@@ -XXX,XX +XXX,XX @@ typedef enum {
94
95
#define TCG_TARGET_DEFAULT_MO (0)
96
97
-#define TCG_TARGET_NEED_LDST_LABELS
98
-
99
#endif /* LOONGARCH_TCG_TARGET_H */
100
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
101
index XXXXXXX..XXXXXXX 100644
102
--- a/tcg/mips/tcg-target.h
103
+++ b/tcg/mips/tcg-target.h
104
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
105
#define TCG_TARGET_HAS_tst 0
106
107
#define TCG_TARGET_DEFAULT_MO 0
108
-#define TCG_TARGET_NEED_LDST_LABELS
109
-#define TCG_TARGET_NEED_POOL_LABELS
110
111
#endif
112
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
113
index XXXXXXX..XXXXXXX 100644
114
--- a/tcg/ppc/tcg-target.h
115
+++ b/tcg/ppc/tcg-target.h
116
@@ -XXX,XX +XXX,XX @@ typedef enum {
117
#define TCG_TARGET_HAS_tst_vec 0
118
119
#define TCG_TARGET_DEFAULT_MO (0)
120
-#define TCG_TARGET_NEED_LDST_LABELS
121
-#define TCG_TARGET_NEED_POOL_LABELS
122
123
#endif
124
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
125
index XXXXXXX..XXXXXXX 100644
126
--- a/tcg/riscv/tcg-target.h
127
+++ b/tcg/riscv/tcg-target.h
128
@@ -XXX,XX +XXX,XX @@ typedef enum {
129
130
#define TCG_TARGET_DEFAULT_MO (0)
131
132
-#define TCG_TARGET_NEED_LDST_LABELS
133
-#define TCG_TARGET_NEED_POOL_LABELS
134
-
135
#endif
136
diff --git a/tcg/s390x/tcg-target.h b/tcg/s390x/tcg-target.h
137
index XXXXXXX..XXXXXXX 100644
138
--- a/tcg/s390x/tcg-target.h
139
+++ b/tcg/s390x/tcg-target.h
140
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
141
#define TCG_TARGET_HAS_tst_vec 0
142
143
#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
144
-#define TCG_TARGET_NEED_LDST_LABELS
145
-#define TCG_TARGET_NEED_POOL_LABELS
146
147
#endif
148
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
149
index XXXXXXX..XXXXXXX 100644
150
--- a/tcg/sparc64/tcg-target.h
151
+++ b/tcg/sparc64/tcg-target.h
152
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
153
#define TCG_AREG0 TCG_REG_I0
154
155
#define TCG_TARGET_DEFAULT_MO (0)
156
-#define TCG_TARGET_NEED_LDST_LABELS
157
-#define TCG_TARGET_NEED_POOL_LABELS
158
159
#endif
160
diff --git a/tcg/tcg.c b/tcg/tcg.c
161
index XXXXXXX..XXXXXXX 100644
162
--- a/tcg/tcg.c
163
+++ b/tcg/tcg.c
164
@@ -XXX,XX +XXX,XX @@ static void tcg_target_init(TCGContext *s);
165
static void tcg_target_qemu_prologue(TCGContext *s);
166
static bool patch_reloc(tcg_insn_unit *code_ptr, int type,
167
intptr_t value, intptr_t addend);
168
+static void tcg_out_nop_fill(tcg_insn_unit *p, int count);
169
+
170
+typedef struct TCGLabelQemuLdst TCGLabelQemuLdst;
171
+static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
172
+static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
173
174
/* The CIE and FDE header definitions will be common to all hosts. */
175
typedef struct {
176
@@ -XXX,XX +XXX,XX @@ typedef struct QEMU_PACKED {
177
DebugFrameFDEHeader fde;
178
} DebugFrameHeader;
179
180
-typedef struct TCGLabelQemuLdst {
181
+struct TCGLabelQemuLdst {
182
bool is_ld; /* qemu_ld: true, qemu_st: false */
183
MemOpIdx oi;
184
TCGType type; /* result type of a load */
185
@@ -XXX,XX +XXX,XX @@ typedef struct TCGLabelQemuLdst {
186
const tcg_insn_unit *raddr; /* addr of the next IR of qemu_ld/st IR */
187
tcg_insn_unit *label_ptr[2]; /* label pointers to be updated */
188
QSIMPLEQ_ENTRY(TCGLabelQemuLdst) next;
189
-} TCGLabelQemuLdst;
190
+};
191
192
static void tcg_register_jit_int(const void *buf, size_t size,
193
const void *debug_frame,
194
@@ -XXX,XX +XXX,XX @@ static void tcg_out_call(TCGContext *s, const tcg_insn_unit *target,
195
static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot);
196
static bool tcg_target_const_match(int64_t val, int ct,
197
TCGType type, TCGCond cond, int vece);
198
-#ifdef TCG_TARGET_NEED_LDST_LABELS
199
-static int tcg_out_ldst_finalize(TCGContext *s);
200
-#endif
201
202
#ifndef CONFIG_USER_ONLY
203
#define guest_base ({ qemu_build_not_reached(); (uintptr_t)0; })
204
@@ -XXX,XX +XXX,XX @@ static void tcg_out_movext3(TCGContext *s, const TCGMovExtend *i1,
205
}
27
}
206
}
28
207
29
+static bool fold_bitsel_vec(OptContext *ctx, TCGOp *op)
208
+/*
30
+{
209
+ * Allocate a new TCGLabelQemuLdst entry.
31
+ /* If true and false values are the same, eliminate the cmp. */
210
+ */
32
+ if (args_are_copies(op->args[2], op->args[3])) {
211
+
33
+ return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[2]);
212
+__attribute__((unused))
34
+ }
213
+static TCGLabelQemuLdst *new_ldst_label(TCGContext *s)
35
+
214
+{
36
+ if (arg_is_const(op->args[2]) && arg_is_const(op->args[3])) {
215
+ TCGLabelQemuLdst *l = tcg_malloc(sizeof(*l));
37
+ uint64_t tv = arg_info(op->args[2])->val;
216
+
38
+ uint64_t fv = arg_info(op->args[3])->val;
217
+ memset(l, 0, sizeof(*l));
39
+
218
+ QSIMPLEQ_INSERT_TAIL(&s->ldst_labels, l, next);
40
+ if (tv == -1 && fv == 0) {
219
+
41
+ return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[1]);
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;
42
+ }
258
+ }
43
+ if (tv == 0 && fv == -1) {
259
+ if (nlong < i->nlong) {
44
+ if (TCG_TARGET_HAS_not_vec) {
260
+ continue;
45
+ op->opc = INDEX_op_not_vec;
261
+ }
46
+ return fold_not(ctx, op);
262
+ if (memcmp(n->data, i->data, sizeof(tcg_target_ulong) * nlong) >= 0) {
47
+ } else {
263
+ break;
48
+ op->opc = INDEX_op_xor_vec;
49
+ op->args[2] = arg_new_constant(ctx, -1);
50
+ return fold_xor(ctx, op);
51
+ }
52
+ }
264
+ }
53
+ }
265
+ }
54
+ if (arg_is_const(op->args[2])) {
266
+ n->next = *pp;
55
+ uint64_t tv = arg_info(op->args[2])->val;
267
+ *pp = n;
56
+ if (tv == -1) {
268
+}
57
+ op->opc = INDEX_op_or_vec;
269
+
58
+ op->args[2] = op->args[3];
270
+/* The "usual" for generic integer code. */
59
+ return fold_or(ctx, op);
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;
60
+ }
342
+ }
61
+ if (tv == 0 && TCG_TARGET_HAS_andc_vec) {
343
+
62
+ op->opc = INDEX_op_andc_vec;
344
+ /*
63
+ op->args[2] = op->args[1];
345
+ * Test for (pending) buffer overflow. The assumption is that any
64
+ op->args[1] = op->args[3];
346
+ * one operation beginning below the high water mark cannot overrun
65
+ return fold_andc(ctx, op);
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;
66
+ }
352
+ }
67
+ }
353
+ }
68
+ if (arg_is_const(op->args[3])) {
354
+ return 0;
69
+ uint64_t fv = arg_info(op->args[3])->val;
355
+}
70
+ if (fv == 0) {
356
+
71
+ op->opc = INDEX_op_and_vec;
357
+static int tcg_out_pool_finalize(TCGContext *s)
72
+ return fold_and(ctx, op);
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;
73
+ }
387
+ }
74
+ if (fv == -1 && TCG_TARGET_HAS_orc_vec) {
388
+
75
+ op->opc = INDEX_op_orc_vec;
389
+ value = (uintptr_t)tcg_splitwx_to_rx(a) - size;
76
+ op->args[2] = op->args[1];
390
+ if (!patch_reloc(p->label, p->rtype, value, p->addend)) {
77
+ op->args[1] = op->args[3];
391
+ return -2;
78
+ return fold_orc(ctx, op);
79
+ }
392
+ }
80
+ }
393
+ }
81
+ return finish_folding(ctx, op);
394
+
82
+}
395
+ s->code_ptr = a;
83
+
396
+ return 0;
84
static bool fold_brcond(OptContext *ctx, TCGOp *op)
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)
85
{
499
{
86
int i = do_constant_folding_cond1(ctx, op, NO_DEST, &op->args[0],
500
unsigned long hwcap = qemu_getauxval(AT_HWCAP);
87
@@ -XXX,XX +XXX,XX @@ static bool fold_xor(OptContext *ctx, TCGOp *op)
501
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
88
return fold_masks_zs(ctx, op, z_mask, s_mask);
502
index XXXXXXX..XXXXXXX 100644
89
}
503
--- a/tcg/mips/tcg-target.c.inc
90
504
+++ b/tcg/mips/tcg-target.c.inc
91
-static bool fold_bitsel_vec(OptContext *ctx, TCGOp *op)
505
@@ -XXX,XX +XXX,XX @@
506
* THE SOFTWARE.
507
*/
508
509
-#include "../tcg-ldst.c.inc"
510
-#include "../tcg-pool.c.inc"
511
-
512
/* used for function call generation */
513
#define TCG_TARGET_STACK_ALIGN 16
514
#if _MIPS_SIM == _ABIO32
515
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
516
index XXXXXXX..XXXXXXX 100644
517
--- a/tcg/ppc/tcg-target.c.inc
518
+++ b/tcg/ppc/tcg-target.c.inc
519
@@ -XXX,XX +XXX,XX @@
520
*/
521
522
#include "elf.h"
523
-#include "../tcg-pool.c.inc"
524
-#include "../tcg-ldst.c.inc"
525
526
/*
527
* Standardize on the _CALL_FOO symbols used by GCC:
528
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
529
index XXXXXXX..XXXXXXX 100644
530
--- a/tcg/riscv/tcg-target.c.inc
531
+++ b/tcg/riscv/tcg-target.c.inc
532
@@ -XXX,XX +XXX,XX @@
533
* THE SOFTWARE.
534
*/
535
536
-#include "../tcg-ldst.c.inc"
537
-#include "../tcg-pool.c.inc"
538
-
539
/* Used for function call generation. */
540
#define TCG_REG_CALL_STACK TCG_REG_SP
541
#define TCG_TARGET_STACK_ALIGN 16
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"
561
#endif
562
563
-#include "../tcg-ldst.c.inc"
564
-#include "../tcg-pool.c.inc"
565
-
566
/* Used for function call generation. */
567
#define TCG_REG_CALL_STACK TCG_REG_O6
568
#define TCG_TARGET_STACK_BIAS 2047
569
diff --git a/tcg/tcg-ldst.c.inc b/tcg/tcg-ldst.c.inc
570
deleted file mode 100644
571
index XXXXXXX..XXXXXXX
572
--- a/tcg/tcg-ldst.c.inc
573
+++ /dev/null
574
@@ -XXX,XX +XXX,XX @@
575
-/*
576
- * TCG Backend Data: load-store optimization only.
577
- *
578
- * Permission is hereby granted, free of charge, to any person obtaining a copy
579
- * of this software and associated documentation files (the "Software"), to deal
580
- * in the Software without restriction, including without limitation the rights
581
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
582
- * copies of the Software, and to permit persons to whom the Software is
583
- * furnished to do so, subject to the following conditions:
584
- *
585
- * The above copyright notice and this permission notice shall be included in
586
- * all copies or substantial portions of the Software.
587
- *
588
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
589
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
590
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
591
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
592
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
593
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
594
- * THE SOFTWARE.
595
- */
596
-
597
-/*
598
- * Generate TB finalization at the end of block
599
- */
600
-
601
-static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
602
-static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *l);
603
-
604
-static int tcg_out_ldst_finalize(TCGContext *s)
92
-{
605
-{
93
- /* If true and false values are the same, eliminate the cmp. */
606
- TCGLabelQemuLdst *lb;
94
- if (args_are_copies(op->args[2], op->args[3])) {
607
-
95
- return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[2]);
608
- /* qemu_ld/st slow paths */
96
- }
609
- QSIMPLEQ_FOREACH(lb, &s->ldst_labels, next) {
97
-
610
- if (lb->is_ld
98
- if (arg_is_const(op->args[2]) && arg_is_const(op->args[3])) {
611
- ? !tcg_out_qemu_ld_slow_path(s, lb)
99
- uint64_t tv = arg_info(op->args[2])->val;
612
- : !tcg_out_qemu_st_slow_path(s, lb)) {
100
- uint64_t fv = arg_info(op->args[3])->val;
613
- return -2;
101
-
102
- if (tv == -1 && fv == 0) {
103
- return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[1]);
104
- }
614
- }
105
- if (tv == 0 && fv == -1) {
615
-
106
- if (TCG_TARGET_HAS_not_vec) {
616
- /* Test for (pending) buffer overflow. The assumption is that any
107
- op->opc = INDEX_op_not_vec;
617
- one operation beginning below the high water mark cannot overrun
108
- return fold_not(ctx, op);
618
- the buffer completely. Thus we can test for overflow after
109
- } else {
619
- generating code without having to check during generation. */
110
- op->opc = INDEX_op_xor_vec;
620
- if (unlikely((void *)s->code_ptr > s->code_gen_highwater)) {
111
- op->args[2] = arg_new_constant(ctx, -1);
621
- return -1;
112
- return fold_xor(ctx, op);
113
- }
114
- }
622
- }
115
- }
623
- }
116
- if (arg_is_const(op->args[2])) {
624
- return 0;
117
- uint64_t tv = arg_info(op->args[2])->val;
625
-}
118
- if (tv == -1) {
626
-
119
- op->opc = INDEX_op_or_vec;
627
-/*
120
- op->args[2] = op->args[3];
628
- * Allocate a new TCGLabelQemuLdst entry.
121
- return fold_or(ctx, op);
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;
122
- }
700
- }
123
- if (tv == 0 && TCG_TARGET_HAS_andc_vec) {
701
- if (nlong < i->nlong) {
124
- op->opc = INDEX_op_andc_vec;
702
- continue;
125
- op->args[2] = op->args[1];
703
- }
126
- op->args[1] = op->args[3];
704
- if (memcmp(n->data, i->data, sizeof(tcg_target_ulong) * nlong) >= 0) {
127
- return fold_andc(ctx, op);
705
- break;
128
- }
706
- }
129
- }
707
- }
130
- if (arg_is_const(op->args[3])) {
708
- n->next = *pp;
131
- uint64_t fv = arg_info(op->args[3])->val;
709
- *pp = n;
132
- if (fv == 0) {
710
-}
133
- op->opc = INDEX_op_and_vec;
711
-
134
- return fold_and(ctx, op);
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;
135
- }
797
- }
136
- if (fv == -1 && TCG_TARGET_HAS_orc_vec) {
798
-
137
- op->opc = INDEX_op_orc_vec;
799
- value = (uintptr_t)tcg_splitwx_to_rx(a) - size;
138
- op->args[2] = op->args[1];
800
- if (!patch_reloc(p->label, p->rtype, value, p->addend)) {
139
- op->args[1] = op->args[3];
801
- return -2;
140
- return fold_orc(ctx, op);
141
- }
802
- }
142
- }
803
- }
143
- return finish_folding(ctx, op);
804
-
805
- s->code_ptr = a;
806
- return 0;
144
-}
807
-}
145
-
808
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
146
/* Propagate constants and copies, fold constant expressions. */
809
index XXXXXXX..XXXXXXX 100644
147
void tcg_optimize(TCGContext *s)
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)
148
{
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
+}
149
--
835
--
150
2.43.0
836
2.43.0
837
838
diff view generated by jsdifflib
1
There are no special cases for this instruction.
1
In addition, add empty files for mips, sparc64 and tci.
2
Make the include unconditional within tcg-opc.h.
2
3
3
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
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
target/hexagon/op_helper.c | 2 +-
7
include/tcg/tcg-opc.h | 4 +---
7
1 file changed, 1 insertion(+), 1 deletion(-)
8
tcg/aarch64/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
9
tcg/arm/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
10
tcg/i386/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
11
tcg/loongarch64/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
12
tcg/mips/tcg-target-opc.h.inc | 1 +
13
tcg/ppc/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
14
tcg/riscv/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
15
tcg/s390x/{tcg-target.opc.h => tcg-target-opc.h.inc} | 0
16
tcg/sparc64/tcg-target-opc.h.inc | 1 +
17
tcg/tci/tcg-target-opc.h.inc | 1 +
18
11 files changed, 4 insertions(+), 3 deletions(-)
19
rename tcg/aarch64/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
20
rename tcg/arm/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
21
rename tcg/i386/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
22
rename tcg/loongarch64/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
23
create mode 100644 tcg/mips/tcg-target-opc.h.inc
24
rename tcg/ppc/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
25
rename tcg/riscv/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
26
rename tcg/s390x/{tcg-target.opc.h => tcg-target-opc.h.inc} (100%)
27
create mode 100644 tcg/sparc64/tcg-target-opc.h.inc
28
create mode 100644 tcg/tci/tcg-target-opc.h.inc
8
29
9
diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
30
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
10
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
11
--- a/target/hexagon/op_helper.c
32
--- a/include/tcg/tcg-opc.h
12
+++ b/target/hexagon/op_helper.c
33
+++ b/include/tcg/tcg-opc.h
13
@@ -XXX,XX +XXX,XX @@ float32 HELPER(sffma)(CPUHexagonState *env, float32 RxV,
34
@@ -XXX,XX +XXX,XX @@ DEF(cmpsel_vec, 1, 4, 1, IMPLVEC | IMPL(TCG_TARGET_HAS_cmpsel_vec))
14
float32 RsV, float32 RtV)
35
15
{
36
DEF(last_generic, 0, 0, 0, TCG_OPF_NOT_PRESENT)
16
arch_fpop_start(env);
37
17
- RxV = internal_fmafx(RsV, RtV, RxV, 0, &env->fp_status);
38
-#if TCG_TARGET_MAYBE_vec
18
+ RxV = float32_muladd(RsV, RtV, RxV, 0, &env->fp_status);
39
-#include "tcg-target.opc.h"
19
arch_fpop_end(env);
40
-#endif
20
return RxV;
41
+#include "tcg-target-opc.h.inc"
21
}
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
62
new file mode 100644
63
index XXXXXXX..XXXXXXX
64
--- /dev/null
65
+++ b/tcg/mips/tcg-target-opc.h.inc
66
@@ -0,0 +1 @@
67
+/* No target specific opcodes. */
68
diff --git a/tcg/ppc/tcg-target.opc.h b/tcg/ppc/tcg-target-opc.h.inc
69
similarity index 100%
70
rename from tcg/ppc/tcg-target.opc.h
71
rename to tcg/ppc/tcg-target-opc.h.inc
72
diff --git a/tcg/riscv/tcg-target.opc.h b/tcg/riscv/tcg-target-opc.h.inc
73
similarity index 100%
74
rename from tcg/riscv/tcg-target.opc.h
75
rename to tcg/riscv/tcg-target-opc.h.inc
76
diff --git a/tcg/s390x/tcg-target.opc.h b/tcg/s390x/tcg-target-opc.h.inc
77
similarity index 100%
78
rename from tcg/s390x/tcg-target.opc.h
79
rename to tcg/s390x/tcg-target-opc.h.inc
80
diff --git a/tcg/sparc64/tcg-target-opc.h.inc b/tcg/sparc64/tcg-target-opc.h.inc
81
new file mode 100644
82
index XXXXXXX..XXXXXXX
83
--- /dev/null
84
+++ b/tcg/sparc64/tcg-target-opc.h.inc
85
@@ -0,0 +1 @@
86
+/* No target specific opcodes. */
87
diff --git a/tcg/tci/tcg-target-opc.h.inc b/tcg/tci/tcg-target-opc.h.inc
88
new file mode 100644
89
index XXXXXXX..XXXXXXX
90
--- /dev/null
91
+++ b/tcg/tci/tcg-target-opc.h.inc
92
@@ -0,0 +1 @@
93
+/* No target specific opcodes. */
22
--
94
--
23
2.43.0
95
2.43.0
96
97
diff view generated by jsdifflib
1
There are no special cases for this instruction.
1
Now that tcg-target-opc.h.inc is unconditional,
2
Remove internal_mpyf as unused.
2
we can move these out of the generic header.
3
3
4
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
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/hexagon/fma_emu.h | 1 -
7
include/tcg/tcg-opc.h | 6 ------
8
target/hexagon/fma_emu.c | 8 --------
8
tcg/tci/tcg-target-opc.h.inc | 5 ++++-
9
target/hexagon/op_helper.c | 2 +-
9
2 files changed, 4 insertions(+), 7 deletions(-)
10
3 files changed, 1 insertion(+), 10 deletions(-)
11
10
12
diff --git a/target/hexagon/fma_emu.h b/target/hexagon/fma_emu.h
11
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/target/hexagon/fma_emu.h
13
--- a/include/tcg/tcg-opc.h
15
+++ b/target/hexagon/fma_emu.h
14
+++ b/include/tcg/tcg-opc.h
16
@@ -XXX,XX +XXX,XX @@ int32_t float32_getexp(float32 f32);
15
@@ -XXX,XX +XXX,XX @@ DEF(last_generic, 0, 0, 0, TCG_OPF_NOT_PRESENT)
17
float32 infinite_float32(uint8_t sign);
16
18
float32 internal_fmafx(float32 a, float32 b, float32 c,
17
#include "tcg-target-opc.h.inc"
19
int scale, float_status *fp_status);
18
20
-float32 internal_mpyf(float32 a, float32 b, float_status *fp_status);
19
-#ifdef TCG_TARGET_INTERPRETER
21
float64 internal_mpyhh(float64 a, float64 b,
20
-/* These opcodes are only for use between the tci generator and interpreter. */
22
unsigned long long int accumulated,
21
-DEF(tci_movi, 1, 0, 1, TCG_OPF_NOT_PRESENT)
23
float_status *fp_status);
22
-DEF(tci_movl, 1, 0, 1, TCG_OPF_NOT_PRESENT)
24
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
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
25
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
26
--- a/target/hexagon/fma_emu.c
30
--- a/tcg/tci/tcg-target-opc.h.inc
27
+++ b/target/hexagon/fma_emu.c
31
+++ b/tcg/tci/tcg-target-opc.h.inc
28
@@ -XXX,XX +XXX,XX @@ float32 internal_fmafx(float32 a, float32 b, float32 c, int scale,
32
@@ -1 +1,4 @@
29
return accum_round_float32(result, fp_status);
33
-/* No target specific opcodes. */
30
}
34
+/* SPDX-License-Identifier: MIT */
31
35
+/* These opcodes for use between the tci generator and interpreter. */
32
-float32 internal_mpyf(float32 a, float32 b, float_status *fp_status)
36
+DEF(tci_movi, 1, 0, 1, TCG_OPF_NOT_PRESENT)
33
-{
37
+DEF(tci_movl, 1, 0, 1, TCG_OPF_NOT_PRESENT)
34
- if (float32_is_zero(a) || float32_is_zero(b)) {
35
- return float32_mul(a, b, fp_status);
36
- }
37
- return internal_fmafx(a, b, float32_zero, 0, fp_status);
38
-}
39
-
40
float64 internal_mpyhh(float64 a, float64 b,
41
unsigned long long int accumulated,
42
float_status *fp_status)
43
diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/target/hexagon/op_helper.c
46
+++ b/target/hexagon/op_helper.c
47
@@ -XXX,XX +XXX,XX @@ float32 HELPER(sfmpy)(CPUHexagonState *env, float32 RsV, float32 RtV)
48
{
49
float32 RdV;
50
arch_fpop_start(env);
51
- RdV = internal_mpyf(RsV, RtV, &env->fp_status);
52
+ RdV = float32_mul(RsV, RtV, &env->fp_status);
53
arch_fpop_end(env);
54
return RdV;
55
}
56
--
38
--
57
2.43.0
39
2.43.0
40
41
diff view generated by jsdifflib
1
All uses have been convered to float*_muladd_scalbn.
1
Don't reference TCG_TARGET_MAYBE_vec in a public header.
2
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
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
include/fpu/softfloat.h | 3 ---
6
include/tcg/tcg.h | 7 -------
7
fpu/softfloat.c | 6 ------
7
tcg/tcg.c | 4 ++++
8
fpu/softfloat-parts.c.inc | 4 ----
8
2 files changed, 4 insertions(+), 7 deletions(-)
9
3 files changed, 13 deletions(-)
10
9
11
diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
10
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
12
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
13
--- a/include/fpu/softfloat.h
12
--- a/include/tcg/tcg.h
14
+++ b/include/fpu/softfloat.h
13
+++ b/include/tcg/tcg.h
15
@@ -XXX,XX +XXX,XX @@ bfloat16 bfloat16_squash_input_denormal(bfloat16 a, float_status *status);
14
@@ -XXX,XX +XXX,XX @@ extern tcg_prologue_fn *tcg_qemu_tb_exec;
16
| Using these differs from negating an input or output before calling
15
17
| the muladd function in that this means that a NaN doesn't have its
16
void tcg_register_jit(const void *buf, size_t buf_size);
18
| sign bit inverted before it is propagated.
17
19
-| We also support halving the result before rounding, as a special
18
-#if TCG_TARGET_MAYBE_vec
20
-| case to support the ARM fused-sqrt-step instruction FRSQRTS.
19
/* Return zero if the tuple (opc, type, vece) is unsupportable;
21
*----------------------------------------------------------------------------*/
20
return > 0 if it is directly supportable;
22
enum {
21
return < 0 if we must call tcg_expand_vec_op. */
23
float_muladd_negate_c = 1,
22
int tcg_can_emit_vec_op(TCGOpcode, TCGType, unsigned);
24
float_muladd_negate_product = 2,
23
-#else
25
float_muladd_negate_result = 4,
24
-static inline int tcg_can_emit_vec_op(TCGOpcode o, TCGType t, unsigned ve)
26
- float_muladd_halve_result = 8,
25
-{
27
};
26
- return 0;
28
27
-}
29
/*----------------------------------------------------------------------------
28
-#endif
30
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
29
30
/* Expand the tuple (opc, type, vece) on the given arguments. */
31
void tcg_expand_vec_op(TCGOpcode, TCGType, unsigned, TCGArg, ...);
32
diff --git a/tcg/tcg.c b/tcg/tcg.c
31
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
32
--- a/fpu/softfloat.c
34
--- a/tcg/tcg.c
33
+++ b/fpu/softfloat.c
35
+++ b/tcg/tcg.c
34
@@ -XXX,XX +XXX,XX @@ float32_muladd(float32 xa, float32 xb, float32 xc, int flags, float_status *s)
36
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
35
if (unlikely(!can_use_fpu(s))) {
37
{
36
goto soft;
38
g_assert_not_reached();
37
}
39
}
38
- if (unlikely(flags & float_muladd_halve_result)) {
40
+int tcg_can_emit_vec_op(TCGOpcode o, TCGType t, unsigned ve)
39
- goto soft;
41
+{
40
- }
42
+ return 0;
41
43
+}
42
float32_input_flush3(&ua.s, &ub.s, &uc.s, s);
44
#endif
43
if (unlikely(!f32_is_zon3(ua, ub, uc))) {
45
static void tcg_out_st(TCGContext *s, TCGType type, TCGReg arg, TCGReg arg1,
44
@@ -XXX,XX +XXX,XX @@ float64_muladd(float64 xa, float64 xb, float64 xc, int flags, float_status *s)
46
intptr_t arg2);
45
if (unlikely(!can_use_fpu(s))) {
46
goto soft;
47
}
48
- if (unlikely(flags & float_muladd_halve_result)) {
49
- goto soft;
50
- }
51
52
float64_input_flush3(&ua.s, &ub.s, &uc.s, s);
53
if (unlikely(!f64_is_zon3(ua, ub, uc))) {
54
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
55
index XXXXXXX..XXXXXXX 100644
56
--- a/fpu/softfloat-parts.c.inc
57
+++ b/fpu/softfloat-parts.c.inc
58
@@ -XXX,XX +XXX,XX @@ static FloatPartsN *partsN(muladd_scalbn)(FloatPartsN *a, FloatPartsN *b,
59
a->exp = p_widen.exp;
60
61
return_normal:
62
- /* TODO: Replace all use of float_muladd_halve_result with scale. */
63
- if (flags & float_muladd_halve_result) {
64
- a->exp -= 1;
65
- }
66
a->exp += scale;
67
finish_sign:
68
if (flags & float_muladd_negate_result) {
69
--
47
--
70
2.43.0
48
2.43.0
71
49
72
50
diff view generated by jsdifflib
1
Introduce ti_is_const, ti_const_val, ti_is_const_val.
1
Left-over from commit 623d7e3551a ("util: Add cpuinfo-ppc.c").
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
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>
4
---
6
---
5
tcg/optimize.c | 20 +++++++++++++++++---
7
tcg/ppc/tcg-target.h | 8 --------
6
1 file changed, 17 insertions(+), 3 deletions(-)
8
1 file changed, 8 deletions(-)
7
9
8
diff --git a/tcg/optimize.c b/tcg/optimize.c
10
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
9
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
10
--- a/tcg/optimize.c
12
--- a/tcg/ppc/tcg-target.h
11
+++ b/tcg/optimize.c
13
+++ b/tcg/ppc/tcg-target.h
12
@@ -XXX,XX +XXX,XX @@ static inline TempOptInfo *arg_info(TCGArg arg)
14
@@ -XXX,XX +XXX,XX @@ typedef enum {
13
return ts_info(arg_temp(arg));
15
TCG_AREG0 = TCG_REG_R27
14
}
16
} TCGReg;
15
17
16
+static inline bool ti_is_const(TempOptInfo *ti)
18
-typedef enum {
17
+{
19
- tcg_isa_base,
18
+ return ti->is_const;
20
- tcg_isa_2_06,
19
+}
21
- tcg_isa_2_07,
20
+
22
- tcg_isa_3_00,
21
+static inline uint64_t ti_const_val(TempOptInfo *ti)
23
- tcg_isa_3_10,
22
+{
24
-} TCGPowerISA;
23
+ return ti->val;
25
-
24
+}
26
#define have_isa_2_06 (cpuinfo & CPUINFO_V2_06)
25
+
27
#define have_isa_2_07 (cpuinfo & CPUINFO_V2_07)
26
+static inline bool ti_is_const_val(TempOptInfo *ti, uint64_t val)
28
#define have_isa_3_00 (cpuinfo & CPUINFO_V3_0)
27
+{
28
+ return ti_is_const(ti) && ti_const_val(ti) == val;
29
+}
30
+
31
static inline bool ts_is_const(TCGTemp *ts)
32
{
33
- return ts_info(ts)->is_const;
34
+ return ti_is_const(ts_info(ts));
35
}
36
37
static inline bool ts_is_const_val(TCGTemp *ts, uint64_t val)
38
{
39
- TempOptInfo *ti = ts_info(ts);
40
- return ti->is_const && ti->val == val;
41
+ return ti_is_const_val(ts_info(ts), val);
42
}
43
44
static inline bool arg_is_const(TCGArg arg)
45
--
29
--
46
2.43.0
30
2.43.0
31
32
diff view generated by jsdifflib
1
All non-default cases now finish folding within each function.
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Do the same with the default case and assert it is done after.
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
3
9
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
10
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/optimize.c | 6 ++----
8
1 file changed, 2 insertions(+), 4 deletions(-)
9
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
12
--- a/include/tcg/tcg.h
13
+++ b/tcg/optimize.c
13
+++ b/include/tcg/tcg.h
14
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
14
@@ -XXX,XX +XXX,XX @@ typedef uint64_t TCGRegSet;
15
done = true;
15
#error unsupported
16
break;
16
#endif
17
default:
17
18
+ done = finish_folding(&ctx, op);
18
-#if TCG_TARGET_REG_BITS == 32
19
break;
19
-/* Turn some undef macros into false macros. */
20
}
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
21
-
58
-
22
- if (!done) {
59
-#ifndef TCG_TARGET_deposit_i32_valid
23
- finish_folding(&ctx, op);
60
-#define TCG_TARGET_deposit_i32_valid(ofs, len) 1
24
- }
61
-#endif
25
+ tcg_debug_assert(done);
62
-#ifndef TCG_TARGET_deposit_i64_valid
26
}
63
-#define TCG_TARGET_deposit_i64_valid(ofs, len) 1
27
}
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
28
--
247
--
29
2.43.0
248
2.43.0
249
250
diff view generated by jsdifflib
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-4-philmd@linaro.org>
3
---
4
---
4
tcg/optimize.c | 2 +-
5
tcg/aarch64/tcg-target-has.h | 119 +++++++++++++++++++++++++++++++++++
5
1 file changed, 1 insertion(+), 1 deletion(-)
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
6
9
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
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
8
index XXXXXXX..XXXXXXX 100644
136
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/optimize.c
137
--- a/tcg/aarch64/tcg-target.h
10
+++ b/tcg/optimize.c
138
+++ b/tcg/aarch64/tcg-target.h
11
@@ -XXX,XX +XXX,XX @@ static bool fold_bitsel_vec(OptContext *ctx, TCGOp *op)
139
@@ -XXX,XX +XXX,XX @@
12
return fold_orc(ctx, op);
140
#ifndef AARCH64_TCG_TARGET_H
13
}
141
#define AARCH64_TCG_TARGET_H
14
}
142
15
- return false;
143
-#include "host/cpuinfo.h"
16
+ return finish_folding(ctx, op);
144
-
17
}
145
#define TCG_TARGET_INSN_UNIT_SIZE 4
18
146
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
19
/* Propagate constants and copies, fold constant expressions. */
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
20
--
262
--
21
2.43.0
263
2.43.0
264
265
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Remove fold_masks as the function becomes unused.
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
3
9
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
10
diff --git a/tcg/arm/tcg-target-has.h b/tcg/arm/tcg-target-has.h
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
new file mode 100644
6
---
12
index XXXXXXX..XXXXXXX
7
tcg/optimize.c | 18 ++++++++----------
13
--- /dev/null
8
1 file changed, 8 insertions(+), 10 deletions(-)
14
+++ b/tcg/arm/tcg-target-has.h
9
15
@@ -XXX,XX +XXX,XX @@
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
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
11
index XXXXXXX..XXXXXXX 100644
102
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
103
--- a/tcg/arm/tcg-target.h
13
+++ b/tcg/optimize.c
104
+++ b/tcg/arm/tcg-target.h
14
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_s(OptContext *ctx, TCGOp *op, uint64_t s_mask)
105
@@ -XXX,XX +XXX,XX @@
15
return fold_masks_zs(ctx, op, -1, s_mask);
106
#ifndef ARM_TCG_TARGET_H
16
}
107
#define ARM_TCG_TARGET_H
17
108
18
-static bool fold_masks(OptContext *ctx, TCGOp *op)
109
-extern int arm_arch;
19
-{
20
- return fold_masks_zs(ctx, op, ctx->z_mask, ctx->s_mask);
21
-}
22
-
110
-
23
/*
111
-#define use_armv7_instructions (__ARM_ARCH >= 7 || arm_arch >= 7)
24
* An "affected" mask bit is 0 if and only if the result is identical
112
-
25
* to the first input. Thus if the entire mask is 0, the operation
113
#define TCG_TARGET_INSN_UNIT_SIZE 4
26
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_st_memcopy(OptContext *ctx, TCGOp *op)
114
#define MAX_CODE_GEN_BUFFER_SIZE UINT32_MAX
27
115
28
static bool fold_xor(OptContext *ctx, TCGOp *op)
116
@@ -XXX,XX +XXX,XX @@ typedef enum {
29
{
117
30
+ uint64_t z_mask, s_mask;
118
#define TCG_TARGET_NB_REGS 32
31
+ TempOptInfo *t1, *t2;
119
32
+
120
-#ifdef __ARM_ARCH_EXT_IDIV__
33
if (fold_const2_commutative(ctx, op) ||
121
-#define use_idiv_instructions 1
34
fold_xx_to_i(ctx, op, 0) ||
122
-#else
35
fold_xi_to_x(ctx, op, 0) ||
123
-extern bool use_idiv_instructions;
36
@@ -XXX,XX +XXX,XX @@ static bool fold_xor(OptContext *ctx, TCGOp *op)
124
-#endif
37
return true;
125
-#ifdef __ARM_NEON__
38
}
126
-#define use_neon_instructions 1
39
127
-#else
40
- ctx->z_mask = arg_info(op->args[1])->z_mask
128
-extern bool use_neon_instructions;
41
- | arg_info(op->args[2])->z_mask;
129
-#endif
42
- ctx->s_mask = arg_info(op->args[1])->s_mask
130
-
43
- & arg_info(op->args[2])->s_mask;
131
-/* optional instructions */
44
- return fold_masks(ctx, op);
132
-#define TCG_TARGET_HAS_ext8s_i32 1
45
+ t1 = arg_info(op->args[1]);
133
-#define TCG_TARGET_HAS_ext16s_i32 1
46
+ t2 = arg_info(op->args[2]);
134
-#define TCG_TARGET_HAS_ext8u_i32 0 /* and r0, r1, #0xff */
47
+ z_mask = t1->z_mask | t2->z_mask;
135
-#define TCG_TARGET_HAS_ext16u_i32 1
48
+ s_mask = t1->s_mask & t2->s_mask;
136
-#define TCG_TARGET_HAS_bswap16_i32 1
49
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
137
-#define TCG_TARGET_HAS_bswap32_i32 1
50
}
138
-#define TCG_TARGET_HAS_not_i32 1
51
139
-#define TCG_TARGET_HAS_rot_i32 1
52
static bool fold_bitsel_vec(OptContext *ctx, TCGOp *op)
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
53
--
193
--
54
2.43.0
194
2.43.0
195
196
diff view generated by jsdifflib
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-6-philmd@linaro.org>
3
---
4
---
4
tcg/optimize.c | 2 +-
5
tcg/i386/tcg-target-has.h | 139 ++++++++++++++++++++++++++++++++++++++
5
1 file changed, 1 insertion(+), 1 deletion(-)
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
6
9
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
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
8
index XXXXXXX..XXXXXXX 100644
156
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/optimize.c
157
--- a/tcg/i386/tcg-target.h
10
+++ b/tcg/optimize.c
158
+++ b/tcg/i386/tcg-target.h
11
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_ld_memcopy(OptContext *ctx, TCGOp *op)
159
@@ -XXX,XX +XXX,XX @@
12
TCGType type;
160
#ifndef I386_TCG_TARGET_H
13
161
#define I386_TCG_TARGET_H
14
if (op->args[1] != tcgv_ptr_arg(tcg_env)) {
162
15
- return false;
163
-#include "host/cpuinfo.h"
16
+ return finish_folding(ctx, op);
164
-
17
}
165
#define TCG_TARGET_INSN_UNIT_SIZE 1
18
166
19
type = ctx->type;
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
20
--
302
--
21
2.43.0
303
2.43.0
304
305
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
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
2
9
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
10
diff --git a/tcg/loongarch64/tcg-target-has.h b/tcg/loongarch64/tcg-target-has.h
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
new file mode 100644
5
---
12
index XXXXXXX..XXXXXXX
6
tcg/optimize.c | 16 +++++++++-------
13
--- /dev/null
7
1 file changed, 9 insertions(+), 7 deletions(-)
14
+++ b/tcg/loongarch64/tcg-target-has.h
8
15
@@ -XXX,XX +XXX,XX @@
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
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
10
index XXXXXXX..XXXXXXX 100644
130
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
131
--- a/tcg/loongarch64/tcg-target.h
12
+++ b/tcg/optimize.c
132
+++ b/tcg/loongarch64/tcg-target.h
13
@@ -XXX,XX +XXX,XX @@ static bool fold_sub2(OptContext *ctx, TCGOp *op)
133
@@ -XXX,XX +XXX,XX @@
14
134
#ifndef LOONGARCH_TCG_TARGET_H
15
static bool fold_tcg_ld(OptContext *ctx, TCGOp *op)
135
#define LOONGARCH_TCG_TARGET_H
16
{
136
17
+ uint64_t z_mask = -1, s_mask = 0;
137
-#include "host/cpuinfo.h"
18
+
138
-
19
/* We can't do any folding with a load, but we can record bits. */
139
#define TCG_TARGET_INSN_UNIT_SIZE 4
20
switch (op->opc) {
140
#define TCG_TARGET_NB_REGS 64
21
CASE_OP_32_64(ld8s):
141
22
- ctx->s_mask = MAKE_64BIT_MASK(8, 56);
142
@@ -XXX,XX +XXX,XX @@ typedef enum {
23
+ s_mask = INT8_MIN;
143
TCG_VEC_TMP0 = TCG_REG_V23,
24
break;
144
} TCGReg;
25
CASE_OP_32_64(ld8u):
145
26
- ctx->z_mask = MAKE_64BIT_MASK(0, 8);
146
-/* optional instructions */
27
+ z_mask = MAKE_64BIT_MASK(0, 8);
147
-#define TCG_TARGET_HAS_negsetcond_i32 0
28
break;
148
-#define TCG_TARGET_HAS_div_i32 1
29
CASE_OP_32_64(ld16s):
149
-#define TCG_TARGET_HAS_rem_i32 1
30
- ctx->s_mask = MAKE_64BIT_MASK(16, 48);
150
-#define TCG_TARGET_HAS_div2_i32 0
31
+ s_mask = INT16_MIN;
151
-#define TCG_TARGET_HAS_rot_i32 1
32
break;
152
-#define TCG_TARGET_HAS_deposit_i32 1
33
CASE_OP_32_64(ld16u):
153
-#define TCG_TARGET_HAS_extract_i32 1
34
- ctx->z_mask = MAKE_64BIT_MASK(0, 16);
154
-#define TCG_TARGET_HAS_sextract_i32 0
35
+ z_mask = MAKE_64BIT_MASK(0, 16);
155
-#define TCG_TARGET_HAS_extract2_i32 0
36
break;
156
-#define TCG_TARGET_HAS_add2_i32 0
37
case INDEX_op_ld32s_i64:
157
-#define TCG_TARGET_HAS_sub2_i32 0
38
- ctx->s_mask = MAKE_64BIT_MASK(32, 32);
158
-#define TCG_TARGET_HAS_mulu2_i32 0
39
+ s_mask = INT32_MIN;
159
-#define TCG_TARGET_HAS_muls2_i32 0
40
break;
160
-#define TCG_TARGET_HAS_muluh_i32 1
41
case INDEX_op_ld32u_i64:
161
-#define TCG_TARGET_HAS_mulsh_i32 1
42
- ctx->z_mask = MAKE_64BIT_MASK(0, 32);
162
-#define TCG_TARGET_HAS_ext8s_i32 1
43
+ z_mask = MAKE_64BIT_MASK(0, 32);
163
-#define TCG_TARGET_HAS_ext16s_i32 1
44
break;
164
-#define TCG_TARGET_HAS_ext8u_i32 1
45
default:
165
-#define TCG_TARGET_HAS_ext16u_i32 1
46
g_assert_not_reached();
166
-#define TCG_TARGET_HAS_bswap16_i32 1
47
}
167
-#define TCG_TARGET_HAS_bswap32_i32 1
48
- return false;
168
-#define TCG_TARGET_HAS_not_i32 1
49
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
169
-#define TCG_TARGET_HAS_andc_i32 1
50
}
170
-#define TCG_TARGET_HAS_orc_i32 1
51
171
-#define TCG_TARGET_HAS_eqv_i32 0
52
static bool fold_tcg_ld_memcopy(OptContext *ctx, TCGOp *op)
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
53
--
249
--
54
2.43.0
250
2.43.0
251
252
diff view generated by jsdifflib
1
Duplicate fold_sub_vec into fold_sub instead of calling it,
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
now that fold_sub_vec always returns true.
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
3
9
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
10
diff --git a/tcg/mips/tcg-target-has.h b/tcg/mips/tcg-target-has.h
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
new file mode 100644
6
---
12
index XXXXXXX..XXXXXXX
7
tcg/optimize.c | 9 ++++++---
13
--- /dev/null
8
1 file changed, 6 insertions(+), 3 deletions(-)
14
+++ b/tcg/mips/tcg-target-has.h
9
15
@@ -XXX,XX +XXX,XX @@
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
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
11
index XXXXXXX..XXXXXXX 100644
139
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
140
--- a/tcg/mips/tcg-target.h
13
+++ b/tcg/optimize.c
141
+++ b/tcg/mips/tcg-target.h
14
@@ -XXX,XX +XXX,XX @@ static bool fold_sub_vec(OptContext *ctx, TCGOp *op)
142
@@ -XXX,XX +XXX,XX @@ typedef enum {
15
fold_sub_to_neg(ctx, op)) {
143
TCG_AREG0 = TCG_REG_S8,
16
return true;
144
} TCGReg;
17
}
145
18
- return false;
146
-/* MOVN/MOVZ instructions detection */
19
+ return finish_folding(ctx, op);
147
-#if (defined(__mips_isa_rev) && (__mips_isa_rev >= 1)) || \
20
}
148
- defined(_MIPS_ARCH_LOONGSON2E) || defined(_MIPS_ARCH_LOONGSON2F) || \
21
149
- defined(_MIPS_ARCH_MIPS4)
22
static bool fold_sub(OptContext *ctx, TCGOp *op)
150
-#define use_movnz_instructions 1
23
{
151
-#else
24
- if (fold_const2(ctx, op) || fold_sub_vec(ctx, op)) {
152
-extern bool use_movnz_instructions;
25
+ if (fold_const2(ctx, op) ||
153
-#endif
26
+ fold_xx_to_i(ctx, op, 0) ||
154
-
27
+ fold_xi_to_x(ctx, op, 0) ||
155
-/* MIPS32 instruction set detection */
28
+ fold_sub_to_neg(ctx, op)) {
156
-#if defined(__mips_isa_rev) && (__mips_isa_rev >= 1)
29
return true;
157
-#define use_mips32_instructions 1
30
}
158
-#else
31
159
-extern bool use_mips32_instructions;
32
@@ -XXX,XX +XXX,XX @@ static bool fold_sub(OptContext *ctx, TCGOp *op)
160
-#endif
33
? INDEX_op_add_i32 : INDEX_op_add_i64);
161
-
34
op->args[2] = arg_new_constant(ctx, -val);
162
-/* MIPS32R2 instruction set detection */
35
}
163
-#if defined(__mips_isa_rev) && (__mips_isa_rev >= 2)
36
- return false;
164
-#define use_mips32r2_instructions 1
37
+ return finish_folding(ctx, op);
165
-#else
38
}
166
-extern bool use_mips32r2_instructions;
39
167
-#endif
40
static bool fold_sub2(OptContext *ctx, TCGOp *op)
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
41
--
261
--
42
2.43.0
262
2.43.0
263
264
diff view generated by jsdifflib
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-9-philmd@linaro.org>
3
---
4
---
4
tcg/optimize.c | 2 +-
5
tcg/ppc/tcg-target-has.h | 124 +++++++++++++++++++++++++++++++++++++++
5
1 file changed, 1 insertion(+), 1 deletion(-)
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
6
9
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
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
8
index XXXXXXX..XXXXXXX 100644
141
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/optimize.c
142
--- a/tcg/ppc/tcg-target.h
10
+++ b/tcg/optimize.c
143
+++ b/tcg/ppc/tcg-target.h
11
@@ -XXX,XX +XXX,XX @@ static bool fold_cmpsel_vec(OptContext *ctx, TCGOp *op)
144
@@ -XXX,XX +XXX,XX @@
12
if (swap_commutative(op->args[0], &op->args[4], &op->args[3])) {
145
#ifndef PPC_TCG_TARGET_H
13
op->args[5] = tcg_invert_cond(op->args[5]);
146
#define PPC_TCG_TARGET_H
14
}
147
15
- return false;
148
-#include "host/cpuinfo.h"
16
+ return finish_folding(ctx, op);
149
-
17
}
150
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
18
151
19
static bool fold_sextract(OptContext *ctx, TCGOp *op)
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
20
--
272
--
21
2.43.0
273
2.43.0
274
275
diff view generated by jsdifflib
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-10-philmd@linaro.org>
3
---
4
---
4
tcg/optimize.c | 2 +-
5
tcg/riscv/tcg-target-has.h | 112 +++++++++++++++++++++++++++++++++++++
5
1 file changed, 1 insertion(+), 1 deletion(-)
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
6
9
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
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
8
index XXXXXXX..XXXXXXX 100644
129
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/optimize.c
130
--- a/tcg/riscv/tcg-target.h
10
+++ b/tcg/optimize.c
131
+++ b/tcg/riscv/tcg-target.h
11
@@ -XXX,XX +XXX,XX @@ static bool fold_cmp_vec(OptContext *ctx, TCGOp *op)
132
@@ -XXX,XX +XXX,XX @@
12
if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
133
#ifndef RISCV_TCG_TARGET_H
13
op->args[3] = tcg_swap_cond(op->args[3]);
134
#define RISCV_TCG_TARGET_H
14
}
135
15
- return false;
136
-#include "host/cpuinfo.h"
16
+ return finish_folding(ctx, op);
137
-
17
}
138
#define TCG_TARGET_INSN_UNIT_SIZE 4
18
139
#define TCG_TARGET_NB_REGS 64
19
static bool fold_cmpsel_vec(OptContext *ctx, TCGOp *op)
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
20
--
248
--
21
2.43.0
249
2.43.0
250
251
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
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
2
9
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
10
diff --git a/tcg/s390x/tcg-target-has.h b/tcg/s390x/tcg-target-has.h
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
new file mode 100644
5
---
12
index XXXXXXX..XXXXXXX
6
tcg/optimize.c | 3 +--
13
--- /dev/null
7
1 file changed, 1 insertion(+), 2 deletions(-)
14
+++ b/tcg/s390x/tcg-target-has.h
8
15
@@ -XXX,XX +XXX,XX @@
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
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
10
index XXXXXXX..XXXXXXX 100644
141
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
142
--- a/tcg/s390x/tcg-target.h
12
+++ b/tcg/optimize.c
143
+++ b/tcg/s390x/tcg-target.h
13
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond2(OptContext *ctx, TCGOp *op)
144
@@ -XXX,XX +XXX,XX @@ typedef enum TCGReg {
14
return fold_setcond(ctx, op);
145
15
}
146
#define TCG_TARGET_NB_REGS 64
16
147
17
- ctx->z_mask = 1;
148
-/* Facilities required for proper operation; checked at startup. */
18
- return false;
149
-
19
+ return fold_masks_z(ctx, op, 1);
150
-#define FACILITY_ZARCH_ACTIVE 2
20
151
-#define FACILITY_LONG_DISP 18
21
do_setcond_const:
152
-#define FACILITY_EXT_IMM 21
22
return tcg_opt_gen_movi(ctx, op, op->args[0], i);
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
23
--
265
--
24
2.43.0
266
2.43.0
267
268
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
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
2
9
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
10
diff --git a/tcg/sparc64/tcg-target-has.h b/tcg/sparc64/tcg-target-has.h
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
new file mode 100644
5
---
12
index XXXXXXX..XXXXXXX
6
tcg/optimize.c | 3 +--
13
--- /dev/null
7
1 file changed, 1 insertion(+), 2 deletions(-)
14
+++ b/tcg/sparc64/tcg-target-has.h
8
15
@@ -XXX,XX +XXX,XX @@
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
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
10
index XXXXXXX..XXXXXXX 100644
103
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
104
--- a/tcg/sparc64/tcg-target.h
12
+++ b/tcg/optimize.c
105
+++ b/tcg/sparc64/tcg-target.h
13
@@ -XXX,XX +XXX,XX @@ static bool fold_negsetcond(OptContext *ctx, TCGOp *op)
106
@@ -XXX,XX +XXX,XX @@ typedef enum {
14
}
107
TCG_REG_I7,
15
108
} TCGReg;
16
/* Value is {0,-1} so all bits are repetitions of the sign. */
109
17
- ctx->s_mask = -1;
110
-#if defined(__VIS__) && __VIS__ >= 0x300
18
- return false;
111
-#define use_vis3_instructions 1
19
+ return fold_masks_s(ctx, op, -1);
112
-#else
20
}
113
-extern bool use_vis3_instructions;
21
114
-#endif
22
static bool fold_setcond2(OptContext *ctx, TCGOp *op)
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
23
--
193
--
24
2.43.0
194
2.43.0
195
196
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
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
2
9
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
10
diff --git a/tcg/tci/tcg-target-has.h b/tcg/tci/tcg-target-has.h
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
new file mode 100644
5
---
12
index XXXXXXX..XXXXXXX
6
tcg/optimize.c | 3 +--
13
--- /dev/null
7
1 file changed, 1 insertion(+), 2 deletions(-)
14
+++ b/tcg/tci/tcg-target-has.h
8
15
@@ -XXX,XX +XXX,XX @@
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
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
10
index XXXXXXX..XXXXXXX 100644
100
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
101
--- a/tcg/tci/tcg-target.h
12
+++ b/tcg/optimize.c
102
+++ b/tcg/tci/tcg-target.h
13
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond(OptContext *ctx, TCGOp *op)
103
@@ -XXX,XX +XXX,XX @@
14
fold_setcond_tst_pow2(ctx, op, false);
104
#define TCG_TARGET_INSN_UNIT_SIZE 4
15
}
105
#define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
16
106
17
- ctx->z_mask = 1;
107
-/* Optional instructions. */
18
- return false;
108
-
19
+ return fold_masks_z(ctx, op, 1);
109
-#define TCG_TARGET_HAS_bswap16_i32 1
20
}
110
-#define TCG_TARGET_HAS_bswap32_i32 1
21
111
-#define TCG_TARGET_HAS_div_i32 1
22
static bool fold_negsetcond(OptContext *ctx, TCGOp *op)
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
23
--
185
--
24
2.43.0
186
2.43.0
187
188
diff view generated by jsdifflib
1
All instances of s_mask have been converted to the new
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
representation. We can now re-enable usage.
2
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Message-ID: <20250108215156.8731-14-philmd@linaro.org>
4
---
5
tcg/aarch64/tcg-target.h | 2 --
6
tcg/arm/tcg-target.h | 2 --
7
tcg/i386/tcg-target.h | 2 --
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(-)
3
17
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
18
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/optimize.c | 4 ++--
8
1 file changed, 2 insertions(+), 2 deletions(-)
9
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
20
--- a/tcg/aarch64/tcg-target.h
13
+++ b/tcg/optimize.c
21
+++ b/tcg/aarch64/tcg-target.h
14
@@ -XXX,XX +XXX,XX @@ static bool fold_exts(OptContext *ctx, TCGOp *op)
22
@@ -XXX,XX +XXX,XX @@ typedef enum {
15
g_assert_not_reached();
23
16
}
24
#define TCG_TARGET_NB_REGS 64
17
25
18
- if (0 && !type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
26
-#include "tcg-target-has.h"
19
+ if (!type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
27
-
20
return true;
28
#define TCG_TARGET_DEFAULT_MO (0)
21
}
29
22
30
#endif /* AARCH64_TCG_TARGET_H */
23
@@ -XXX,XX +XXX,XX @@ static bool fold_sextract(OptContext *ctx, TCGOp *op)
31
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
24
s_mask = s_mask_old >> pos;
32
index XXXXXXX..XXXXXXX 100644
25
s_mask |= -1ull << (len - 1);
33
--- a/tcg/arm/tcg-target.h
26
34
+++ b/tcg/arm/tcg-target.h
27
- if (0 && pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
35
@@ -XXX,XX +XXX,XX @@ typedef enum {
28
+ if (pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
36
29
return true;
37
#define TCG_TARGET_NB_REGS 32
30
}
38
39
-#include "tcg-target-has.h"
40
-
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"
53
-
54
/* This defines the natural memory order supported by this
55
* architecture before guarantees made by various barrier
56
* instructions.
57
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
58
index XXXXXXX..XXXXXXX 100644
59
--- a/tcg/loongarch64/tcg-target.h
60
+++ b/tcg/loongarch64/tcg-target.h
61
@@ -XXX,XX +XXX,XX @@ typedef enum {
62
TCG_VEC_TMP0 = TCG_REG_V23,
63
} TCGReg;
64
65
-#include "tcg-target-has.h"
66
-
67
#define TCG_TARGET_DEFAULT_MO (0)
68
69
#endif /* LOONGARCH_TCG_TARGET_H */
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"
79
-
80
#define TCG_TARGET_DEFAULT_MO 0
81
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"
92
-
93
#define TCG_TARGET_DEFAULT_MO (0)
94
95
#endif
96
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
97
index XXXXXXX..XXXXXXX 100644
98
--- a/tcg/riscv/tcg-target.h
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"
105
-
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"
118
-
119
#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
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"
131
-
132
#define TCG_TARGET_DEFAULT_MO (0)
133
134
#endif
135
diff --git a/tcg/tcg-has.h b/tcg/tcg-has.h
136
index XXXXXXX..XXXXXXX 100644
137
--- a/tcg/tcg-has.h
138
+++ b/tcg/tcg-has.h
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"
157
-
158
/* Number of registers available. */
159
#define TCG_TARGET_NB_REGS 16
31
160
32
--
161
--
33
2.43.0
162
2.43.0
163
164
diff view generated by jsdifflib
1
Use of fold_masks should be restricted to those opcodes that
1
TCG_TARGET_HAS_* definitions don't need to be exposed
2
can reliably make use of it -- those with a single output,
2
by "tcg/tcg.h". Only include 'tcg-has.h' when necessary.
3
and from higher-level folders that set up the masks.
4
Prepare for conversion of each folder in turn.
5
3
6
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Message-ID: <20250108215156.8731-15-philmd@linaro.org>
8
---
7
---
9
tcg/optimize.c | 17 ++++++++++++++---
8
include/tcg/tcg.h | 2 --
10
1 file changed, 14 insertions(+), 3 deletions(-)
9
tcg/optimize.c | 1 +
10
tcg/tcg-common.c | 1 +
11
tcg/tcg-op-gvec.c | 1 +
12
tcg/tcg-op-ldst.c | 2 +-
13
tcg/tcg-op-vec.c | 1 +
14
tcg/tcg-op.c | 2 +-
15
tcg/tcg.c | 1 +
16
tcg/tci.c | 1 +
17
9 files changed, 8 insertions(+), 4 deletions(-)
11
18
19
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/include/tcg/tcg.h
22
+++ b/include/tcg/tcg.h
23
@@ -XXX,XX +XXX,XX @@ typedef uint64_t TCGRegSet;
24
#error unsupported
25
#endif
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"
12
diff --git a/tcg/optimize.c b/tcg/optimize.c
32
diff --git a/tcg/optimize.c b/tcg/optimize.c
13
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
14
--- a/tcg/optimize.c
34
--- a/tcg/optimize.c
15
+++ b/tcg/optimize.c
35
+++ b/tcg/optimize.c
16
@@ -XXX,XX +XXX,XX @@ static bool fold_masks(OptContext *ctx, TCGOp *op)
36
@@ -XXX,XX +XXX,XX @@
37
#include "qemu/interval-tree.h"
38
#include "tcg/tcg-op-common.h"
39
#include "tcg-internal.h"
40
+#include "tcg-has.h"
41
42
#define CASE_OP_32_64(x) \
43
glue(glue(case INDEX_op_, x), _i32): \
44
diff --git a/tcg/tcg-common.c b/tcg/tcg-common.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/tcg/tcg-common.c
47
+++ b/tcg/tcg-common.c
48
@@ -XXX,XX +XXX,XX @@
49
50
#include "qemu/osdep.h"
51
#include "tcg/tcg.h"
52
+#include "tcg-has.h"
53
54
TCGOpDef tcg_op_defs[] = {
55
#define DEF(s, oargs, iargs, cargs, flags) \
56
diff --git a/tcg/tcg-op-gvec.c b/tcg/tcg-op-gvec.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/tcg/tcg-op-gvec.c
59
+++ b/tcg/tcg-op-gvec.c
60
@@ -XXX,XX +XXX,XX @@
61
#include "tcg/tcg-op-common.h"
62
#include "tcg/tcg-op-gvec-common.h"
63
#include "tcg/tcg-gvec-desc.h"
64
+#include "tcg-has.h"
65
66
#define MAX_UNROLL 4
67
68
diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/tcg/tcg-op-ldst.c
71
+++ b/tcg/tcg-op-ldst.c
72
@@ -XXX,XX +XXX,XX @@
73
#include "exec/translation-block.h"
74
#include "exec/plugin-gen.h"
75
#include "tcg-internal.h"
76
-
77
+#include "tcg-has.h"
78
79
static void check_max_alignment(unsigned a_bits)
17
{
80
{
18
uint64_t z_mask = ctx->z_mask;
81
diff --git a/tcg/tcg-op-vec.c b/tcg/tcg-op-vec.c
19
uint64_t s_mask = ctx->s_mask;
82
index XXXXXXX..XXXXXXX 100644
20
+ const TCGOpDef *def = &tcg_op_defs[op->opc];
83
--- a/tcg/tcg-op-vec.c
21
+ TCGTemp *ts;
84
+++ b/tcg/tcg-op-vec.c
22
+ TempOptInfo *ti;
85
@@ -XXX,XX +XXX,XX @@
23
+
86
#include "tcg/tcg-op-common.h"
24
+ /* Only single-output opcodes are supported here. */
87
#include "tcg/tcg-mo.h"
25
+ tcg_debug_assert(def->nb_oargs == 1);
88
#include "tcg-internal.h"
26
89
+#include "tcg-has.h"
27
/*
28
* 32-bit ops generate 32-bit results, which for the purpose of
29
@@ -XXX,XX +XXX,XX @@ static bool fold_masks(OptContext *ctx, TCGOp *op)
30
if (ctx->type == TCG_TYPE_I32) {
31
z_mask = (int32_t)z_mask;
32
s_mask |= MAKE_64BIT_MASK(32, 32);
33
- ctx->z_mask = z_mask;
34
- ctx->s_mask = s_mask;
35
}
36
37
if (z_mask == 0) {
38
return tcg_opt_gen_movi(ctx, op, op->args[0], 0);
39
}
40
- return false;
41
+
42
+ ts = arg_temp(op->args[0]);
43
+ reset_ts(ctx, ts);
44
+
45
+ ti = ts_info(ts);
46
+ ti->z_mask = z_mask;
47
+ ti->s_mask = s_mask;
48
+ return true;
49
}
50
90
51
/*
91
/*
92
* Vector optional opcode tracking.
93
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/tcg/tcg-op.c
96
+++ b/tcg/tcg-op.c
97
@@ -XXX,XX +XXX,XX @@
98
#include "exec/translation-block.h"
99
#include "exec/plugin-gen.h"
100
#include "tcg-internal.h"
101
-
102
+#include "tcg-has.h"
103
104
/*
105
* Encourage the compiler to tail-call to a function, rather than inlining.
106
diff --git a/tcg/tcg.c b/tcg/tcg.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/tcg/tcg.c
109
+++ b/tcg/tcg.c
110
@@ -XXX,XX +XXX,XX @@
111
#include "tcg/tcg-temp-internal.h"
112
#include "tcg-internal.h"
113
#include "tcg/perf.h"
114
+#include "tcg-has.h"
115
#ifdef CONFIG_USER_ONLY
116
#include "user/guest-base.h"
117
#endif
118
diff --git a/tcg/tci.c b/tcg/tci.c
119
index XXXXXXX..XXXXXXX 100644
120
--- a/tcg/tci.c
121
+++ b/tcg/tci.c
122
@@ -XXX,XX +XXX,XX @@
123
#include "tcg/helper-info.h"
124
#include "tcg/tcg-ldst.h"
125
#include "disas/dis-asm.h"
126
+#include "tcg-has.h"
127
#include <ffi.h>
128
129
52
--
130
--
53
2.43.0
131
2.43.0
132
133
diff view generated by jsdifflib
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@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
tcg/optimize.c | 2 +-
4
accel/tcg/internal-target.h | 1 +
5
1 file changed, 1 insertion(+), 1 deletion(-)
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/tcg/optimize.c b/tcg/optimize.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/tcg/optimize.c
40
--- a/accel/tcg/internal-target.h
10
+++ b/tcg/optimize.c
41
+++ b/accel/tcg/internal-target.h
11
@@ -XXX,XX +XXX,XX @@ static bool fold_remainder(OptContext *ctx, TCGOp *op)
42
@@ -XXX,XX +XXX,XX @@
12
fold_xx_to_i(ctx, op, 0)) {
43
#include "exec/exec-all.h"
13
return true;
44
#include "exec/translation-block.h"
14
}
45
#include "tb-internal.h"
15
- return false;
46
+#include "tcg-target-mo.h"
16
+ return finish_folding(ctx, op);
47
17
}
48
/*
18
49
* Access to the various translations structures need to be serialised
19
static bool fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
50
diff --git a/tcg/aarch64/tcg-target-mo.h b/tcg/aarch64/tcg-target-mo.h
51
new file mode 100644
52
index XXXXXXX..XXXXXXX
53
--- /dev/null
54
+++ b/tcg/aarch64/tcg-target-mo.h
55
@@ -XXX,XX +XXX,XX @@
56
+/* SPDX-License-Identifier: GPL-2.0-or-later */
57
+/*
58
+ * Define target-specific memory model
59
+ * Copyright (c) 2013 Huawei Technologies Duesseldorf GmbH
60
+ */
61
+
62
+#ifndef TCG_TARGET_MO_H
63
+#define TCG_TARGET_MO_H
64
+
65
+#define TCG_TARGET_DEFAULT_MO 0
66
+
67
+#endif
68
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
69
index XXXXXXX..XXXXXXX 100644
70
--- a/tcg/aarch64/tcg-target.h
71
+++ b/tcg/aarch64/tcg-target.h
72
@@ -XXX,XX +XXX,XX @@ typedef enum {
73
74
#define TCG_TARGET_NB_REGS 64
75
76
-#define TCG_TARGET_DEFAULT_MO (0)
77
-
78
#endif /* AARCH64_TCG_TARGET_H */
79
diff --git a/tcg/arm/tcg-target-mo.h b/tcg/arm/tcg-target-mo.h
80
new file mode 100644
81
index XXXXXXX..XXXXXXX
82
--- /dev/null
83
+++ b/tcg/arm/tcg-target-mo.h
84
@@ -XXX,XX +XXX,XX @@
85
+/* SPDX-License-Identifier: MIT */
86
+/*
87
+ * Define target-specific memory model
88
+ * Copyright (c) 2008 Fabrice Bellard
89
+ * Copyright (c) 2008 Andrzej Zaborowski
90
+ */
91
+
92
+#ifndef TCG_TARGET_MO_H
93
+#define TCG_TARGET_MO_H
94
+
95
+#define TCG_TARGET_DEFAULT_MO 0
96
+
97
+#endif
98
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
99
index XXXXXXX..XXXXXXX 100644
100
--- a/tcg/arm/tcg-target.h
101
+++ b/tcg/arm/tcg-target.h
102
@@ -XXX,XX +XXX,XX @@ typedef enum {
103
104
#define TCG_TARGET_NB_REGS 32
105
106
-#define TCG_TARGET_DEFAULT_MO (0)
107
-
108
#endif
109
diff --git a/tcg/i386/tcg-target-mo.h b/tcg/i386/tcg-target-mo.h
110
new file mode 100644
111
index XXXXXXX..XXXXXXX
112
--- /dev/null
113
+++ b/tcg/i386/tcg-target-mo.h
114
@@ -XXX,XX +XXX,XX @@
115
+/* SPDX-License-Identifier: MIT */
116
+/*
117
+ * Define target-specific memory model
118
+ * Copyright (c) 2008 Fabrice Bellard
119
+ */
120
+
121
+#ifndef TCG_TARGET_MO_H
122
+#define TCG_TARGET_MO_H
123
+
124
+/*
125
+ * This defines the natural memory order supported by this architecture
126
+ * before guarantees made by various barrier instructions.
127
+ *
128
+ * The x86 has a pretty strong memory ordering which only really
129
+ * allows for some stores to be re-ordered after loads.
130
+ */
131
+#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
132
+
133
+#endif
134
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
135
index XXXXXXX..XXXXXXX 100644
136
--- a/tcg/i386/tcg-target.h
137
+++ b/tcg/i386/tcg-target.h
138
@@ -XXX,XX +XXX,XX @@ typedef enum {
139
TCG_REG_CALL_STACK = TCG_REG_ESP
140
} TCGReg;
141
142
-/* This defines the natural memory order supported by this
143
- * architecture before guarantees made by various barrier
144
- * instructions.
145
- *
146
- * The x86 has a pretty strong memory ordering which only really
147
- * allows for some stores to be re-ordered after loads.
148
- */
149
-#include "tcg/tcg-mo.h"
150
-
151
-#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
152
-
153
#endif
154
diff --git a/tcg/loongarch64/tcg-target-mo.h b/tcg/loongarch64/tcg-target-mo.h
155
new file mode 100644
156
index XXXXXXX..XXXXXXX
157
--- /dev/null
158
+++ b/tcg/loongarch64/tcg-target-mo.h
159
@@ -XXX,XX +XXX,XX @@
160
+/* SPDX-License-Identifier: MIT */
161
+/*
162
+ * Define target-specific memory model
163
+ * Copyright (c) 2021 WANG Xuerui <git@xen0n.name>
164
+ */
165
+
166
+#ifndef TCG_TARGET_MO_H
167
+#define TCG_TARGET_MO_H
168
+
169
+#define TCG_TARGET_DEFAULT_MO 0
170
+
171
+#endif
172
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
173
index XXXXXXX..XXXXXXX 100644
174
--- a/tcg/loongarch64/tcg-target.h
175
+++ b/tcg/loongarch64/tcg-target.h
176
@@ -XXX,XX +XXX,XX @@ typedef enum {
177
TCG_VEC_TMP0 = TCG_REG_V23,
178
} TCGReg;
179
180
-#define TCG_TARGET_DEFAULT_MO (0)
181
-
182
#endif /* LOONGARCH_TCG_TARGET_H */
183
diff --git a/tcg/mips/tcg-target-mo.h b/tcg/mips/tcg-target-mo.h
184
new file mode 100644
185
index XXXXXXX..XXXXXXX
186
--- /dev/null
187
+++ b/tcg/mips/tcg-target-mo.h
188
@@ -XXX,XX +XXX,XX @@
189
+/* SPDX-License-Identifier: MIT */
190
+/*
191
+ * Define target-specific memory model
192
+ * Copyright (c) 2008-2009 Arnaud Patard <arnaud.patard@rtp-net.org>
193
+ * Copyright (c) 2009 Aurelien Jarno <aurelien@aurel32.net>
194
+ */
195
+
196
+#ifndef TCG_TARGET_MO_H
197
+#define TCG_TARGET_MO_H
198
+
199
+#define TCG_TARGET_DEFAULT_MO 0
200
+
201
+#endif
202
diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h
203
index XXXXXXX..XXXXXXX 100644
204
--- a/tcg/mips/tcg-target.h
205
+++ b/tcg/mips/tcg-target.h
206
@@ -XXX,XX +XXX,XX @@ typedef enum {
207
TCG_AREG0 = TCG_REG_S8,
208
} TCGReg;
209
210
-#define TCG_TARGET_DEFAULT_MO 0
211
-
212
#endif
213
diff --git a/tcg/ppc/tcg-target-mo.h b/tcg/ppc/tcg-target-mo.h
214
new file mode 100644
215
index XXXXXXX..XXXXXXX
216
--- /dev/null
217
+++ b/tcg/ppc/tcg-target-mo.h
218
@@ -XXX,XX +XXX,XX @@
219
+/* SPDX-License-Identifier: MIT */
220
+/*
221
+ * Define target-specific memory model
222
+ * Copyright (c) 2008 Fabrice Bellard
223
+ */
224
+
225
+#ifndef TCG_TARGET_MO_H
226
+#define TCG_TARGET_MO_H
227
+
228
+#define TCG_TARGET_DEFAULT_MO 0
229
+
230
+#endif
231
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
232
index XXXXXXX..XXXXXXX 100644
233
--- a/tcg/ppc/tcg-target.h
234
+++ b/tcg/ppc/tcg-target.h
235
@@ -XXX,XX +XXX,XX @@ typedef enum {
236
TCG_AREG0 = TCG_REG_R27
237
} TCGReg;
238
239
-#define TCG_TARGET_DEFAULT_MO (0)
240
-
241
#endif
242
diff --git a/tcg/riscv/tcg-target-mo.h b/tcg/riscv/tcg-target-mo.h
243
new file mode 100644
244
index XXXXXXX..XXXXXXX
245
--- /dev/null
246
+++ b/tcg/riscv/tcg-target-mo.h
247
@@ -XXX,XX +XXX,XX @@
248
+/* SPDX-License-Identifier: MIT */
249
+/*
250
+ * Define target-specific memory model
251
+ * Copyright (c) 2018 SiFive, Inc
252
+ */
253
+
254
+#ifndef TCG_TARGET_MO_H
255
+#define TCG_TARGET_MO_H
256
+
257
+#define TCG_TARGET_DEFAULT_MO 0
258
+
259
+#endif
260
diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
261
index XXXXXXX..XXXXXXX 100644
262
--- a/tcg/riscv/tcg-target.h
263
+++ b/tcg/riscv/tcg-target.h
264
@@ -XXX,XX +XXX,XX @@ typedef enum {
265
TCG_REG_TMP2 = TCG_REG_T4,
266
} TCGReg;
267
268
-#define TCG_TARGET_DEFAULT_MO (0)
269
-
270
#endif
271
diff --git a/tcg/s390x/tcg-target-mo.h b/tcg/s390x/tcg-target-mo.h
272
new file mode 100644
273
index XXXXXXX..XXXXXXX
274
--- /dev/null
275
+++ b/tcg/s390x/tcg-target-mo.h
276
@@ -XXX,XX +XXX,XX @@
277
+/* SPDX-License-Identifier: MIT */
278
+/*
279
+ * Define target-specific memory model
280
+ * Copyright (c) 2009 Ulrich Hecht <uli@suse.de>
281
+ */
282
+
283
+#ifndef TCG_TARGET_MO_H
284
+#define TCG_TARGET_MO_H
285
+
286
+#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
287
+
288
+#endif
289
diff --git a/tcg/s390x/tcg-target.h b/tcg/s390x/tcg-target.h
290
index XXXXXXX..XXXXXXX 100644
291
--- a/tcg/s390x/tcg-target.h
292
+++ b/tcg/s390x/tcg-target.h
293
@@ -XXX,XX +XXX,XX @@ typedef enum TCGReg {
294
295
#define TCG_TARGET_NB_REGS 64
296
297
-#define TCG_TARGET_DEFAULT_MO (TCG_MO_ALL & ~TCG_MO_ST_LD)
298
-
299
#endif
300
diff --git a/tcg/sparc64/tcg-target-mo.h b/tcg/sparc64/tcg-target-mo.h
301
new file mode 100644
302
index XXXXXXX..XXXXXXX
303
--- /dev/null
304
+++ b/tcg/sparc64/tcg-target-mo.h
305
@@ -XXX,XX +XXX,XX @@
306
+/* SPDX-License-Identifier: MIT */
307
+/*
308
+ * Define target-specific memory model
309
+ * Copyright (c) 2008 Fabrice Bellard
310
+ */
311
+
312
+#ifndef TCG_TARGET_MO_H
313
+#define TCG_TARGET_MO_H
314
+
315
+#define TCG_TARGET_DEFAULT_MO 0
316
+
317
+#endif
318
diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h
319
index XXXXXXX..XXXXXXX 100644
320
--- a/tcg/sparc64/tcg-target.h
321
+++ b/tcg/sparc64/tcg-target.h
322
@@ -XXX,XX +XXX,XX @@ typedef enum {
323
324
#define TCG_AREG0 TCG_REG_I0
325
326
-#define TCG_TARGET_DEFAULT_MO (0)
327
-
328
#endif
329
diff --git a/tcg/tci/tcg-target-mo.h b/tcg/tci/tcg-target-mo.h
330
new file mode 100644
331
index XXXXXXX..XXXXXXX
332
--- /dev/null
333
+++ b/tcg/tci/tcg-target-mo.h
334
@@ -XXX,XX +XXX,XX @@
335
+/* SPDX-License-Identifier: MIT */
336
+/*
337
+ * Define target-specific memory model
338
+ * Copyright (c) 2009, 2011 Stefan Weil
339
+ */
340
+
341
+#ifndef TCG_TARGET_MO_H
342
+#define TCG_TARGET_MO_H
343
+
344
+/*
345
+ * We could notice __i386__ or __s390x__ and reduce the barriers depending
346
+ * on the host. But if you want performance, you use the normal backend.
347
+ * We prefer consistency across hosts on this.
348
+ */
349
+#define TCG_TARGET_DEFAULT_MO 0
350
+
351
+#endif
352
diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h
353
index XXXXXXX..XXXXXXX 100644
354
--- a/tcg/tci/tcg-target.h
355
+++ b/tcg/tci/tcg-target.h
356
@@ -XXX,XX +XXX,XX @@ typedef enum {
357
#define HAVE_TCG_QEMU_TB_EXEC
358
#define TCG_TARGET_NEED_POOL_LABELS
359
360
-/* We could notice __i386__ or __s390x__ and reduce the barriers depending
361
- on the host. But if you want performance, you use the normal backend.
362
- We prefer consistency across hosts on this. */
363
-#define TCG_TARGET_DEFAULT_MO (0)
364
-
365
#endif /* TCG_TARGET_H */
366
diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c
367
index XXXXXXX..XXXXXXX 100644
368
--- a/tcg/tcg-op-ldst.c
369
+++ b/tcg/tcg-op-ldst.c
370
@@ -XXX,XX +XXX,XX @@
371
#include "exec/plugin-gen.h"
372
#include "tcg-internal.h"
373
#include "tcg-has.h"
374
+#include "tcg-target-mo.h"
375
376
static void check_max_alignment(unsigned a_bits)
377
{
20
--
378
--
21
2.43.0
379
2.43.0
380
381
diff view generated by jsdifflib
1
Use the scalbn interface instead of float_muladd_halve_result.
1
Return C_NotImplemented instead of asserting for opcodes
2
not implemented by the backend. For now, the assertion
3
moves to process_op_defs.
2
4
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
7
---
6
target/sparc/helper.h | 4 +-
8
tcg/tcg.c | 10 ++++++----
7
target/sparc/fop_helper.c | 8 ++--
9
tcg/aarch64/tcg-target.c.inc | 2 +-
8
target/sparc/translate.c | 80 +++++++++++++++++++++++----------------
10
tcg/arm/tcg-target.c.inc | 2 +-
9
3 files changed, 54 insertions(+), 38 deletions(-)
11
tcg/i386/tcg-target.c.inc | 2 +-
12
tcg/loongarch64/tcg-target.c.inc | 2 +-
13
tcg/mips/tcg-target.c.inc | 2 +-
14
tcg/ppc/tcg-target.c.inc | 2 +-
15
tcg/riscv/tcg-target.c.inc | 2 +-
16
tcg/s390x/tcg-target.c.inc | 2 +-
17
tcg/sparc64/tcg-target.c.inc | 2 +-
18
tcg/tci/tcg-target.c.inc | 2 +-
19
11 files changed, 16 insertions(+), 14 deletions(-)
10
20
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
21
diff --git a/tcg/tcg.c b/tcg/tcg.c
12
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
23
--- a/tcg/tcg.c
14
+++ b/target/sparc/helper.h
24
+++ b/tcg/tcg.c
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(faddd, TCG_CALL_NO_WG, f64, env, f64, f64)
25
@@ -XXX,XX +XXX,XX @@ static int tcg_out_pool_finalize(TCGContext *s)
16
DEF_HELPER_FLAGS_3(fsubd, TCG_CALL_NO_WG, f64, env, f64, f64)
26
#define C_N1_O1_I4(O1, O2, I1, I2, I3, I4) C_PFX6(c_n1_o1_i4_, O1, O2, I1, I2, I3, I4),
17
DEF_HELPER_FLAGS_3(fmuld, TCG_CALL_NO_WG, f64, env, f64, f64)
27
18
DEF_HELPER_FLAGS_3(fdivd, TCG_CALL_NO_WG, f64, env, f64, f64)
28
typedef enum {
19
-DEF_HELPER_FLAGS_5(fmaddd, TCG_CALL_NO_WG, f64, env, f64, f64, f64, i32)
29
+ C_NotImplemented = -1,
20
+DEF_HELPER_FLAGS_6(fmaddd, TCG_CALL_NO_WG, f64, env, f64, f64, f64, s32, i32)
30
#include "tcg-target-con-set.h"
21
DEF_HELPER_FLAGS_3(fnaddd, TCG_CALL_NO_WG, f64, env, f64, f64)
31
} TCGConstraintSetIndex;
22
DEF_HELPER_FLAGS_3(fnmuld, TCG_CALL_NO_WG, f64, env, f64, f64)
32
23
33
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
24
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fadds, TCG_CALL_NO_WG, f32, env, f32, f32)
34
const TCGTargetOpDef *tdefs;
25
DEF_HELPER_FLAGS_3(fsubs, TCG_CALL_NO_WG, f32, env, f32, f32)
35
bool saw_alias_pair = false;
26
DEF_HELPER_FLAGS_3(fmuls, TCG_CALL_NO_WG, f32, env, f32, f32)
36
int i, o, i2, o2, nb_args;
27
DEF_HELPER_FLAGS_3(fdivs, TCG_CALL_NO_WG, f32, env, f32, f32)
37
+ TCGConstraintSetIndex con_set;
28
-DEF_HELPER_FLAGS_5(fmadds, TCG_CALL_NO_WG, f32, env, f32, f32, f32, i32)
38
29
+DEF_HELPER_FLAGS_6(fmadds, TCG_CALL_NO_WG, f32, env, f32, f32, f32, s32, i32)
39
if (def->flags & TCG_OPF_NOT_PRESENT) {
30
DEF_HELPER_FLAGS_3(fnadds, TCG_CALL_NO_WG, f32, env, f32, f32)
40
continue;
31
DEF_HELPER_FLAGS_3(fnmuls, TCG_CALL_NO_WG, f32, env, f32, f32)
41
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
32
42
33
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
43
/*
44
* Macro magic should make it impossible, but double-check that
45
- * the array index is in range. Since the signness of an enum
46
- * is implementation defined, force the result to unsigned.
47
+ * the array index is in range. At the same time, double-check
48
+ * that the opcode is implemented, i.e. not C_NotImplemented.
49
*/
50
- unsigned con_set = tcg_target_op_def(op);
51
- tcg_debug_assert(con_set < ARRAY_SIZE(constraint_sets));
52
+ con_set = tcg_target_op_def(op);
53
+ tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
54
tdefs = &constraint_sets[con_set];
55
56
for (i = 0; i < nb_args; i++) {
57
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
34
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
35
--- a/target/sparc/fop_helper.c
59
--- a/tcg/aarch64/tcg-target.c.inc
36
+++ b/target/sparc/fop_helper.c
60
+++ b/tcg/aarch64/tcg-target.c.inc
37
@@ -XXX,XX +XXX,XX @@ Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
61
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
62
return C_O1_I2(w, 0, w);
63
64
default:
65
- g_assert_not_reached();
66
+ return C_NotImplemented;
67
}
38
}
68
}
39
69
40
float32 helper_fmadds(CPUSPARCState *env, float32 s1,
70
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
41
- float32 s2, float32 s3, uint32_t op)
71
index XXXXXXX..XXXXXXX 100644
42
+ float32 s2, float32 s3, int32_t sc, uint32_t op)
72
--- a/tcg/arm/tcg-target.c.inc
43
{
73
+++ b/tcg/arm/tcg-target.c.inc
44
- float32 ret = float32_muladd(s1, s2, s3, op, &env->fp_status);
74
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
45
+ float32 ret = float32_muladd_scalbn(s1, s2, s3, sc, op, &env->fp_status);
75
case INDEX_op_bitsel_vec:
46
check_ieee_exceptions(env, GETPC());
76
return C_O1_I3(w, w, w, w);
47
return ret;
77
default:
78
- g_assert_not_reached();
79
+ return C_NotImplemented;
80
}
48
}
81
}
49
82
50
float64 helper_fmaddd(CPUSPARCState *env, float64 s1,
83
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
51
- float64 s2, float64 s3, uint32_t op)
84
index XXXXXXX..XXXXXXX 100644
52
+ float64 s2, float64 s3, int32_t sc, uint32_t op)
85
--- a/tcg/i386/tcg-target.c.inc
53
{
86
+++ b/tcg/i386/tcg-target.c.inc
54
- float64 ret = float64_muladd(s1, s2, s3, op, &env->fp_status);
87
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
55
+ float64 ret = float64_muladd_scalbn(s1, s2, s3, sc, op, &env->fp_status);
88
return C_O1_I4(x, x, x, xO, x);
56
check_ieee_exceptions(env, GETPC());
89
57
return ret;
90
default:
91
- g_assert_not_reached();
92
+ return C_NotImplemented;
93
}
58
}
94
}
59
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
95
96
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
60
index XXXXXXX..XXXXXXX 100644
97
index XXXXXXX..XXXXXXX 100644
61
--- a/target/sparc/translate.c
98
--- a/tcg/loongarch64/tcg-target.c.inc
62
+++ b/target/sparc/translate.c
99
+++ b/tcg/loongarch64/tcg-target.c.inc
63
@@ -XXX,XX +XXX,XX @@ static void gen_op_fabsq(TCGv_i128 dst, TCGv_i128 src)
100
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
64
101
return C_O1_I3(w, w, w, w);
65
static void gen_op_fmadds(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2, TCGv_i32 s3)
102
66
{
103
default:
67
- gen_helper_fmadds(d, tcg_env, s1, s2, s3, tcg_constant_i32(0));
104
- g_assert_not_reached();
68
+ TCGv_i32 z = tcg_constant_i32(0);
105
+ return C_NotImplemented;
69
+ gen_helper_fmadds(d, tcg_env, s1, s2, s3, z, z);
106
}
70
}
107
}
71
108
72
static void gen_op_fmaddd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2, TCGv_i64 s3)
109
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
73
{
110
index XXXXXXX..XXXXXXX 100644
74
- gen_helper_fmaddd(d, tcg_env, s1, s2, s3, tcg_constant_i32(0));
111
--- a/tcg/mips/tcg-target.c.inc
75
+ TCGv_i32 z = tcg_constant_i32(0);
112
+++ b/tcg/mips/tcg-target.c.inc
76
+ gen_helper_fmaddd(d, tcg_env, s1, s2, s3, z, z);
113
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
114
: C_O0_I4(rZ, rZ, r, r));
115
116
default:
117
- g_assert_not_reached();
118
+ return C_NotImplemented;
119
}
77
}
120
}
78
121
79
static void gen_op_fmsubs(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2, TCGv_i32 s3)
122
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
80
{
123
index XXXXXXX..XXXXXXX 100644
81
- int op = float_muladd_negate_c;
124
--- a/tcg/ppc/tcg-target.c.inc
82
- gen_helper_fmadds(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
125
+++ b/tcg/ppc/tcg-target.c.inc
83
+ TCGv_i32 z = tcg_constant_i32(0);
126
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
84
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c);
127
return C_O1_I4(v, v, v, vZM, v);
85
+ gen_helper_fmadds(d, tcg_env, s1, s2, s3, z, op);
128
129
default:
130
- g_assert_not_reached();
131
+ return C_NotImplemented;
132
}
86
}
133
}
87
134
88
static void gen_op_fmsubd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2, TCGv_i64 s3)
135
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
89
{
136
index XXXXXXX..XXXXXXX 100644
90
- int op = float_muladd_negate_c;
137
--- a/tcg/riscv/tcg-target.c.inc
91
- gen_helper_fmaddd(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
138
+++ b/tcg/riscv/tcg-target.c.inc
92
+ TCGv_i32 z = tcg_constant_i32(0);
139
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
93
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c);
140
case INDEX_op_cmpsel_vec:
94
+ gen_helper_fmaddd(d, tcg_env, s1, s2, s3, z, op);
141
return C_O1_I4(v, v, vL, vK, vK);
142
default:
143
- g_assert_not_reached();
144
+ return C_NotImplemented;
145
}
95
}
146
}
96
147
97
static void gen_op_fnmsubs(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2, TCGv_i32 s3)
148
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
98
{
149
index XXXXXXX..XXXXXXX 100644
99
- int op = float_muladd_negate_c | float_muladd_negate_result;
150
--- a/tcg/s390x/tcg-target.c.inc
100
- gen_helper_fmadds(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
151
+++ b/tcg/s390x/tcg-target.c.inc
101
+ TCGv_i32 z = tcg_constant_i32(0);
152
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
102
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c |
153
: C_O1_I4(v, v, v, vZ, v));
103
+ float_muladd_negate_result);
154
104
+ gen_helper_fmadds(d, tcg_env, s1, s2, s3, z, op);
155
default:
156
- g_assert_not_reached();
157
+ return C_NotImplemented;
158
}
105
}
159
}
106
160
107
static void gen_op_fnmsubd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2, TCGv_i64 s3)
161
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
108
{
162
index XXXXXXX..XXXXXXX 100644
109
- int op = float_muladd_negate_c | float_muladd_negate_result;
163
--- a/tcg/sparc64/tcg-target.c.inc
110
- gen_helper_fmaddd(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
164
+++ b/tcg/sparc64/tcg-target.c.inc
111
+ TCGv_i32 z = tcg_constant_i32(0);
165
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
112
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c |
166
return C_O1_I2(r, r, r);
113
+ float_muladd_negate_result);
167
114
+ gen_helper_fmaddd(d, tcg_env, s1, s2, s3, z, op);
168
default:
169
- g_assert_not_reached();
170
+ return C_NotImplemented;
171
}
115
}
172
}
116
173
117
static void gen_op_fnmadds(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2, TCGv_i32 s3)
174
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
118
{
175
index XXXXXXX..XXXXXXX 100644
119
- int op = float_muladd_negate_result;
176
--- a/tcg/tci/tcg-target.c.inc
120
- gen_helper_fmadds(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
177
+++ b/tcg/tci/tcg-target.c.inc
121
+ TCGv_i32 z = tcg_constant_i32(0);
178
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
122
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_result);
179
return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I4(r, r, r, r);
123
+ gen_helper_fmadds(d, tcg_env, s1, s2, s3, z, op);
180
181
default:
182
- g_assert_not_reached();
183
+ return C_NotImplemented;
184
}
124
}
185
}
125
186
126
static void gen_op_fnmaddd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2, TCGv_i64 s3)
127
{
128
- int op = float_muladd_negate_result;
129
- gen_helper_fmaddd(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
130
+ TCGv_i32 z = tcg_constant_i32(0);
131
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_result);
132
+ gen_helper_fmaddd(d, tcg_env, s1, s2, s3, z, op);
133
}
134
135
/* Use muladd to compute (1 * src1) + src2 / 2 with one rounding. */
136
static void gen_op_fhadds(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2)
137
{
138
- TCGv_i32 one = tcg_constant_i32(float32_one);
139
- int op = float_muladd_halve_result;
140
- gen_helper_fmadds(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
141
+ TCGv_i32 fone = tcg_constant_i32(float32_one);
142
+ TCGv_i32 mone = tcg_constant_i32(-1);
143
+ TCGv_i32 op = tcg_constant_i32(0);
144
+ gen_helper_fmadds(d, tcg_env, fone, s1, s2, mone, op);
145
}
146
147
static void gen_op_fhaddd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2)
148
{
149
- TCGv_i64 one = tcg_constant_i64(float64_one);
150
- int op = float_muladd_halve_result;
151
- gen_helper_fmaddd(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
152
+ TCGv_i64 fone = tcg_constant_i64(float64_one);
153
+ TCGv_i32 mone = tcg_constant_i32(-1);
154
+ TCGv_i32 op = tcg_constant_i32(0);
155
+ gen_helper_fmaddd(d, tcg_env, fone, s1, s2, mone, op);
156
}
157
158
/* Use muladd to compute (1 * src1) - src2 / 2 with one rounding. */
159
static void gen_op_fhsubs(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2)
160
{
161
- TCGv_i32 one = tcg_constant_i32(float32_one);
162
- int op = float_muladd_negate_c | float_muladd_halve_result;
163
- gen_helper_fmadds(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
164
+ TCGv_i32 fone = tcg_constant_i32(float32_one);
165
+ TCGv_i32 mone = tcg_constant_i32(-1);
166
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c);
167
+ gen_helper_fmadds(d, tcg_env, fone, s1, s2, mone, op);
168
}
169
170
static void gen_op_fhsubd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2)
171
{
172
- TCGv_i64 one = tcg_constant_i64(float64_one);
173
- int op = float_muladd_negate_c | float_muladd_halve_result;
174
- gen_helper_fmaddd(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
175
+ TCGv_i64 fone = tcg_constant_i64(float64_one);
176
+ TCGv_i32 mone = tcg_constant_i32(-1);
177
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c);
178
+ gen_helper_fmaddd(d, tcg_env, fone, s1, s2, mone, op);
179
}
180
181
/* Use muladd to compute -((1 * src1) + src2 / 2) with one rounding. */
182
static void gen_op_fnhadds(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2)
183
{
184
- TCGv_i32 one = tcg_constant_i32(float32_one);
185
- int op = float_muladd_negate_result | float_muladd_halve_result;
186
- gen_helper_fmadds(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
187
+ TCGv_i32 fone = tcg_constant_i32(float32_one);
188
+ TCGv_i32 mone = tcg_constant_i32(-1);
189
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_result);
190
+ gen_helper_fmadds(d, tcg_env, fone, s1, s2, mone, op);
191
}
192
193
static void gen_op_fnhaddd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2)
194
{
195
- TCGv_i64 one = tcg_constant_i64(float64_one);
196
- int op = float_muladd_negate_result | float_muladd_halve_result;
197
- gen_helper_fmaddd(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
198
+ TCGv_i64 fone = tcg_constant_i64(float64_one);
199
+ TCGv_i32 mone = tcg_constant_i32(-1);
200
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_result);
201
+ gen_helper_fmaddd(d, tcg_env, fone, s1, s2, mone, op);
202
}
203
204
static void gen_op_fpexception_im(DisasContext *dc, int ftt)
205
--
187
--
206
2.43.0
188
2.43.0
207
189
208
190
diff view generated by jsdifflib
1
Change return from bool to int; distinguish between
1
Test each vector type, not just lumping them all together.
2
complete folding, simplification, and no change.
2
Add tests for I32 (always true) and I64 (64-bit hosts).
3
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@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
tcg/optimize.c | 22 ++++++++++++++--------
7
tcg/tcg.c | 66 ++++++++++++++++++++++++++++++++++++-------------------
8
1 file changed, 14 insertions(+), 8 deletions(-)
8
1 file changed, 43 insertions(+), 23 deletions(-)
9
9
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
10
diff --git a/tcg/tcg.c b/tcg/tcg.c
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
12
--- a/tcg/tcg.c
13
+++ b/tcg/optimize.c
13
+++ b/tcg/tcg.c
14
@@ -XXX,XX +XXX,XX @@ static bool fold_remainder(OptContext *ctx, TCGOp *op)
14
@@ -XXX,XX +XXX,XX @@ TCGTemp *tcgv_i32_temp(TCGv_i32 v)
15
return finish_folding(ctx, op);
15
*/
16
}
16
bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
17
18
-static bool fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
19
+/* Return 1 if finished, -1 if simplified, 0 if unchanged. */
20
+static int fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
21
{
17
{
22
uint64_t a_zmask, b_val;
18
- const bool have_vec
23
TCGCond cond;
19
- = TCG_TARGET_HAS_v64 | TCG_TARGET_HAS_v128 | TCG_TARGET_HAS_v256;
24
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
20
+ bool has_type;
25
op->opc = xor_opc;
21
+
26
op->args[2] = arg_new_constant(ctx, 1);
22
+ switch (type) {
27
}
23
+ case TCG_TYPE_I32:
28
- return false;
24
+ has_type = true;
29
+ return -1;
25
+ break;
30
}
26
+ case TCG_TYPE_I64:
31
}
27
+ has_type = TCG_TARGET_REG_BITS == 64;
32
-
28
+ break;
33
- return false;
29
+ case TCG_TYPE_V64:
34
+ return 0;
30
+ has_type = TCG_TARGET_HAS_v64;
35
}
31
+ break;
36
32
+ case TCG_TYPE_V128:
37
static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
33
+ has_type = TCG_TARGET_HAS_v128;
38
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond(OptContext *ctx, TCGOp *op)
34
+ break;
39
return tcg_opt_gen_movi(ctx, op, op->args[0], i);
35
+ case TCG_TYPE_V256:
40
}
36
+ has_type = TCG_TARGET_HAS_v256;
41
37
+ break;
42
- if (fold_setcond_zmask(ctx, op, false)) {
38
+ default:
43
+ i = fold_setcond_zmask(ctx, op, false);
39
+ has_type = false;
44
+ if (i > 0) {
40
+ break;
45
return true;
46
}
47
- fold_setcond_tst_pow2(ctx, op, false);
48
+ if (i == 0) {
49
+ fold_setcond_tst_pow2(ctx, op, false);
50
+ }
41
+ }
51
42
52
ctx->z_mask = 1;
43
switch (op) {
53
return false;
44
case INDEX_op_discard:
54
@@ -XXX,XX +XXX,XX @@ static bool fold_negsetcond(OptContext *ctx, TCGOp *op)
45
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
55
return tcg_opt_gen_movi(ctx, op, op->args[0], -i);
46
case INDEX_op_or_vec:
56
}
47
case INDEX_op_xor_vec:
57
48
case INDEX_op_cmp_vec:
58
- if (fold_setcond_zmask(ctx, op, true)) {
49
- return have_vec;
59
+ i = fold_setcond_zmask(ctx, op, true);
50
+ return has_type;
60
+ if (i > 0) {
51
case INDEX_op_dup2_vec:
61
return true;
52
- return have_vec && TCG_TARGET_REG_BITS == 32;
62
}
53
+ return has_type && TCG_TARGET_REG_BITS == 32;
63
- fold_setcond_tst_pow2(ctx, op, true);
54
case INDEX_op_not_vec:
64
+ if (i == 0) {
55
- return have_vec && TCG_TARGET_HAS_not_vec;
65
+ fold_setcond_tst_pow2(ctx, op, true);
56
+ return has_type && TCG_TARGET_HAS_not_vec;
66
+ }
57
case INDEX_op_neg_vec:
67
58
- return have_vec && TCG_TARGET_HAS_neg_vec;
68
/* Value is {0,-1} so all bits are repetitions of the sign. */
59
+ return has_type && TCG_TARGET_HAS_neg_vec;
69
ctx->s_mask = -1;
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);
70
--
127
--
71
2.43.0
128
2.43.0
129
130
diff view generated by jsdifflib
1
Stores have no output operands, and so need no further work.
1
Process each TCGConstraintSetIndex first. Allocate TCGArgConstraint
2
arrays based on those. Only afterward process the TCGOpcodes and
3
share those TCGArgConstraint arrays.
2
4
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
7
---
6
tcg/optimize.c | 11 +++++------
8
include/tcg/tcg.h | 7 +-
7
1 file changed, 5 insertions(+), 6 deletions(-)
9
tcg/tcg.c | 272 +++++++++++++++++++++++-----------------------
10
2 files changed, 136 insertions(+), 143 deletions(-)
8
11
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
10
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
14
--- a/include/tcg/tcg.h
12
+++ b/tcg/optimize.c
15
+++ b/include/tcg/tcg.h
13
@@ -XXX,XX +XXX,XX @@ static bool fold_qemu_st(OptContext *ctx, TCGOp *op)
16
@@ -XXX,XX +XXX,XX @@ typedef struct TCGOpDef {
17
const char *name;
18
uint8_t nb_oargs, nb_iargs, nb_cargs, nb_args;
19
uint8_t flags;
20
- TCGArgConstraint *args_ct;
21
+ const TCGArgConstraint *args_ct;
22
} TCGOpDef;
23
24
extern TCGOpDef tcg_op_defs[];
25
extern const size_t tcg_op_defs_max;
26
27
-typedef struct TCGTargetOpDef {
28
- TCGOpcode op;
29
- const char *args_ct_str[TCG_MAX_OP_ARGS];
30
-} TCGTargetOpDef;
31
-
32
/*
33
* tcg_op_supported:
34
* Query if @op, for @type and @flags, is supported by the host
35
diff --git a/tcg/tcg.c b/tcg/tcg.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/tcg/tcg.c
38
+++ b/tcg/tcg.c
39
@@ -XXX,XX +XXX,XX @@ static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode);
40
41
/* Put all of the constraint sets into an array, indexed by the enum. */
42
43
-#define C_O0_I1(I1) { .args_ct_str = { #I1 } },
44
-#define C_O0_I2(I1, I2) { .args_ct_str = { #I1, #I2 } },
45
-#define C_O0_I3(I1, I2, I3) { .args_ct_str = { #I1, #I2, #I3 } },
46
-#define C_O0_I4(I1, I2, I3, I4) { .args_ct_str = { #I1, #I2, #I3, #I4 } },
47
+typedef struct TCGConstraintSet {
48
+ uint8_t nb_oargs, nb_iargs;
49
+ const char *args_ct_str[TCG_MAX_OP_ARGS];
50
+} TCGConstraintSet;
51
52
-#define C_O1_I1(O1, I1) { .args_ct_str = { #O1, #I1 } },
53
-#define C_O1_I2(O1, I1, I2) { .args_ct_str = { #O1, #I1, #I2 } },
54
-#define C_O1_I3(O1, I1, I2, I3) { .args_ct_str = { #O1, #I1, #I2, #I3 } },
55
-#define C_O1_I4(O1, I1, I2, I3, I4) { .args_ct_str = { #O1, #I1, #I2, #I3, #I4 } },
56
+#define C_O0_I1(I1) { 0, 1, { #I1 } },
57
+#define C_O0_I2(I1, I2) { 0, 2, { #I1, #I2 } },
58
+#define C_O0_I3(I1, I2, I3) { 0, 3, { #I1, #I2, #I3 } },
59
+#define C_O0_I4(I1, I2, I3, I4) { 0, 4, { #I1, #I2, #I3, #I4 } },
60
61
-#define C_N1_I2(O1, I1, I2) { .args_ct_str = { "&" #O1, #I1, #I2 } },
62
-#define C_N1O1_I1(O1, O2, I1) { .args_ct_str = { "&" #O1, #O2, #I1 } },
63
-#define C_N2_I1(O1, O2, I1) { .args_ct_str = { "&" #O1, "&" #O2, #I1 } },
64
+#define C_O1_I1(O1, I1) { 1, 1, { #O1, #I1 } },
65
+#define C_O1_I2(O1, I1, I2) { 1, 2, { #O1, #I1, #I2 } },
66
+#define C_O1_I3(O1, I1, I2, I3) { 1, 3, { #O1, #I1, #I2, #I3 } },
67
+#define C_O1_I4(O1, I1, I2, I3, I4) { 1, 4, { #O1, #I1, #I2, #I3, #I4 } },
68
69
-#define C_O2_I1(O1, O2, I1) { .args_ct_str = { #O1, #O2, #I1 } },
70
-#define C_O2_I2(O1, O2, I1, I2) { .args_ct_str = { #O1, #O2, #I1, #I2 } },
71
-#define C_O2_I3(O1, O2, I1, I2, I3) { .args_ct_str = { #O1, #O2, #I1, #I2, #I3 } },
72
-#define C_O2_I4(O1, O2, I1, I2, I3, I4) { .args_ct_str = { #O1, #O2, #I1, #I2, #I3, #I4 } },
73
-#define C_N1_O1_I4(O1, O2, I1, I2, I3, I4) { .args_ct_str = { "&" #O1, #O2, #I1, #I2, #I3, #I4 } },
74
+#define C_N1_I2(O1, I1, I2) { 1, 2, { "&" #O1, #I1, #I2 } },
75
+#define C_N1O1_I1(O1, O2, I1) { 2, 1, { "&" #O1, #O2, #I1 } },
76
+#define C_N2_I1(O1, O2, I1) { 2, 1, { "&" #O1, "&" #O2, #I1 } },
77
78
-static const TCGTargetOpDef constraint_sets[] = {
79
+#define C_O2_I1(O1, O2, I1) { 2, 1, { #O1, #O2, #I1 } },
80
+#define C_O2_I2(O1, O2, I1, I2) { 2, 2, { #O1, #O2, #I1, #I2 } },
81
+#define C_O2_I3(O1, O2, I1, I2, I3) { 2, 3, { #O1, #O2, #I1, #I2, #I3 } },
82
+#define C_O2_I4(O1, O2, I1, I2, I3, I4) { 2, 4, { #O1, #O2, #I1, #I2, #I3, #I4 } },
83
+#define C_N1_O1_I4(O1, O2, I1, I2, I3, I4) { 2, 4, { "&" #O1, #O2, #I1, #I2, #I3, #I4 } },
84
+
85
+static const TCGConstraintSet constraint_sets[] = {
86
#include "tcg-target-con-set.h"
87
};
88
89
-
90
#undef C_O0_I1
91
#undef C_O0_I2
92
#undef C_O0_I3
93
@@ -XXX,XX +XXX,XX @@ static TCGTemp *tcg_global_reg_new_internal(TCGContext *s, TCGType type,
94
static void tcg_context_init(unsigned max_cpus)
14
{
95
{
15
/* Opcodes that touch guest memory stop the mb optimization. */
96
TCGContext *s = &tcg_init_ctx;
16
ctx->prev_mb = NULL;
97
- int op, total_args, n, i;
17
- return false;
98
- TCGOpDef *def;
18
+ return true;
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)
19
}
128
}
20
129
21
static bool fold_remainder(OptContext *ctx, TCGOp *op)
130
/* we give more priority to constraints with less registers */
22
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_st(OptContext *ctx, TCGOp *op)
131
-static int get_constraint_priority(const TCGOpDef *def, int k)
23
132
+static int get_constraint_priority(const TCGArgConstraint *arg_ct, int k)
24
if (op->args[1] != tcgv_ptr_arg(tcg_env)) {
133
{
25
remove_mem_copy_all(ctx);
134
- const TCGArgConstraint *arg_ct = &def->args_ct[k];
26
- return false;
135
- int n = ctpop64(arg_ct->regs);
27
+ return true;
136
+ int n;
137
+
138
+ arg_ct += k;
139
+ n = ctpop64(arg_ct->regs);
140
141
/*
142
* Sort constraints of a single register first, which includes output
143
@@ -XXX,XX +XXX,XX @@ static int get_constraint_priority(const TCGOpDef *def, int k)
144
}
145
146
/* sort from highest priority to lowest */
147
-static void sort_constraints(TCGOpDef *def, int start, int n)
148
+static void sort_constraints(TCGArgConstraint *a, int start, int n)
149
{
150
int i, j;
151
- TCGArgConstraint *a = def->args_ct;
152
153
for (i = 0; i < n; i++) {
154
a[start + i].sort_index = start + i;
155
@@ -XXX,XX +XXX,XX @@ static void sort_constraints(TCGOpDef *def, int start, int n)
28
}
156
}
29
157
for (i = 0; i < n - 1; i++) {
30
switch (op->opc) {
158
for (j = i + 1; j < n; j++) {
31
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_st(OptContext *ctx, TCGOp *op)
159
- int p1 = get_constraint_priority(def, a[start + i].sort_index);
32
g_assert_not_reached();
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)
33
}
167
}
34
remove_mem_copy_in(ctx, ofs, ofs + lm1);
35
- return false;
36
+ return true;
37
}
168
}
38
169
39
static bool fold_tcg_st_memcopy(OptContext *ctx, TCGOp *op)
170
+static const TCGArgConstraint empty_cts[TCG_MAX_OP_ARGS];
40
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_st_memcopy(OptContext *ctx, TCGOp *op)
171
+static TCGArgConstraint all_cts[ARRAY_SIZE(constraint_sets)][TCG_MAX_OP_ARGS];
41
TCGType type;
172
+
42
173
static void process_op_defs(TCGContext *s)
43
if (op->args[1] != tcgv_ptr_arg(tcg_env)) {
174
{
44
- fold_tcg_st(ctx, op);
175
- TCGOpcode op;
45
- return false;
176
-
46
+ return fold_tcg_st(ctx, op);
177
- for (op = 0; op < NB_OPS; op++) {
178
- TCGOpDef *def = &tcg_op_defs[op];
179
- const TCGTargetOpDef *tdefs;
180
+ for (size_t c = 0; c < ARRAY_SIZE(constraint_sets); ++c) {
181
+ const TCGConstraintSet *tdefs = &constraint_sets[c];
182
+ TCGArgConstraint *args_ct = all_cts[c];
183
+ int nb_oargs = tdefs->nb_oargs;
184
+ int nb_iargs = tdefs->nb_iargs;
185
+ int nb_args = nb_oargs + nb_iargs;
186
bool saw_alias_pair = false;
187
- int i, o, i2, o2, nb_args;
188
- TCGConstraintSetIndex con_set;
189
190
- if (def->flags & TCG_OPF_NOT_PRESENT) {
191
- continue;
192
- }
193
-
194
- nb_args = def->nb_iargs + def->nb_oargs;
195
- if (nb_args == 0) {
196
- continue;
197
- }
198
-
199
- /*
200
- * Macro magic should make it impossible, but double-check that
201
- * the array index is in range. At the same time, double-check
202
- * that the opcode is implemented, i.e. not C_NotImplemented.
203
- */
204
- con_set = tcg_target_op_def(op);
205
- tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
206
- tdefs = &constraint_sets[con_set];
207
-
208
- for (i = 0; i < nb_args; i++) {
209
+ for (int i = 0; i < nb_args; i++) {
210
const char *ct_str = tdefs->args_ct_str[i];
211
- bool input_p = i >= def->nb_oargs;
212
-
213
- /* Incomplete TCGTargetOpDef entry. */
214
- tcg_debug_assert(ct_str != NULL);
215
+ bool input_p = i >= nb_oargs;
216
+ int o;
217
218
switch (*ct_str) {
219
case '0' ... '9':
220
o = *ct_str - '0';
221
tcg_debug_assert(input_p);
222
- tcg_debug_assert(o < def->nb_oargs);
223
- tcg_debug_assert(def->args_ct[o].regs != 0);
224
- tcg_debug_assert(!def->args_ct[o].oalias);
225
- def->args_ct[i] = def->args_ct[o];
226
+ tcg_debug_assert(o < nb_oargs);
227
+ tcg_debug_assert(args_ct[o].regs != 0);
228
+ tcg_debug_assert(!args_ct[o].oalias);
229
+ args_ct[i] = args_ct[o];
230
/* The output sets oalias. */
231
- def->args_ct[o].oalias = 1;
232
- def->args_ct[o].alias_index = i;
233
+ args_ct[o].oalias = 1;
234
+ args_ct[o].alias_index = i;
235
/* The input sets ialias. */
236
- def->args_ct[i].ialias = 1;
237
- def->args_ct[i].alias_index = o;
238
- if (def->args_ct[i].pair) {
239
+ args_ct[i].ialias = 1;
240
+ args_ct[i].alias_index = o;
241
+ if (args_ct[i].pair) {
242
saw_alias_pair = true;
243
}
244
tcg_debug_assert(ct_str[1] == '\0');
245
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
246
247
case '&':
248
tcg_debug_assert(!input_p);
249
- def->args_ct[i].newreg = true;
250
+ args_ct[i].newreg = true;
251
ct_str++;
252
break;
253
254
case 'p': /* plus */
255
/* Allocate to the register after the previous. */
256
- tcg_debug_assert(i > (input_p ? def->nb_oargs : 0));
257
+ tcg_debug_assert(i > (input_p ? nb_oargs : 0));
258
o = i - 1;
259
- tcg_debug_assert(!def->args_ct[o].pair);
260
- tcg_debug_assert(!def->args_ct[o].ct);
261
- def->args_ct[i] = (TCGArgConstraint){
262
+ tcg_debug_assert(!args_ct[o].pair);
263
+ tcg_debug_assert(!args_ct[o].ct);
264
+ args_ct[i] = (TCGArgConstraint){
265
.pair = 2,
266
.pair_index = o,
267
- .regs = def->args_ct[o].regs << 1,
268
- .newreg = def->args_ct[o].newreg,
269
+ .regs = args_ct[o].regs << 1,
270
+ .newreg = args_ct[o].newreg,
271
};
272
- def->args_ct[o].pair = 1;
273
- def->args_ct[o].pair_index = i;
274
+ args_ct[o].pair = 1;
275
+ args_ct[o].pair_index = i;
276
tcg_debug_assert(ct_str[1] == '\0');
277
continue;
278
279
case 'm': /* minus */
280
/* Allocate to the register before the previous. */
281
- tcg_debug_assert(i > (input_p ? def->nb_oargs : 0));
282
+ tcg_debug_assert(i > (input_p ? nb_oargs : 0));
283
o = i - 1;
284
- tcg_debug_assert(!def->args_ct[o].pair);
285
- tcg_debug_assert(!def->args_ct[o].ct);
286
- def->args_ct[i] = (TCGArgConstraint){
287
+ tcg_debug_assert(!args_ct[o].pair);
288
+ tcg_debug_assert(!args_ct[o].ct);
289
+ args_ct[i] = (TCGArgConstraint){
290
.pair = 1,
291
.pair_index = o,
292
- .regs = def->args_ct[o].regs >> 1,
293
- .newreg = def->args_ct[o].newreg,
294
+ .regs = args_ct[o].regs >> 1,
295
+ .newreg = args_ct[o].newreg,
296
};
297
- def->args_ct[o].pair = 2;
298
- def->args_ct[o].pair_index = i;
299
+ args_ct[o].pair = 2;
300
+ args_ct[o].pair_index = i;
301
tcg_debug_assert(ct_str[1] == '\0');
302
continue;
303
}
304
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
305
do {
306
switch (*ct_str) {
307
case 'i':
308
- def->args_ct[i].ct |= TCG_CT_CONST;
309
+ args_ct[i].ct |= TCG_CT_CONST;
310
break;
311
312
/* Include all of the target-specific constraints. */
313
314
#undef CONST
315
#define CONST(CASE, MASK) \
316
- case CASE: def->args_ct[i].ct |= MASK; break;
317
+ case CASE: args_ct[i].ct |= MASK; break;
318
#define REGS(CASE, MASK) \
319
- case CASE: def->args_ct[i].regs |= MASK; break;
320
+ case CASE: args_ct[i].regs |= MASK; break;
321
322
#include "tcg-target-con-str.h"
323
324
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
325
case '&':
326
case 'p':
327
case 'm':
328
- /* Typo in TCGTargetOpDef constraint. */
329
+ /* Typo in TCGConstraintSet constraint. */
330
g_assert_not_reached();
331
}
332
} while (*++ct_str != '\0');
333
}
334
335
- /* TCGTargetOpDef entry with too much information? */
336
- tcg_debug_assert(i == TCG_MAX_OP_ARGS || tdefs->args_ct_str[i] == NULL);
337
-
338
/*
339
* Fix up output pairs that are aliased with inputs.
340
* When we created the alias, we copied pair from the output.
341
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
342
* first output to pair=3, and the pair_index'es to match.
343
*/
344
if (saw_alias_pair) {
345
- for (i = def->nb_oargs; i < nb_args; i++) {
346
+ for (int i = nb_oargs; i < nb_args; i++) {
347
+ int o, o2, i2;
348
+
349
/*
350
* Since [0-9pm] must be alone in the constraint string,
351
* the only way they can both be set is if the pair comes
352
* from the output alias.
353
*/
354
- if (!def->args_ct[i].ialias) {
355
+ if (!args_ct[i].ialias) {
356
continue;
357
}
358
- switch (def->args_ct[i].pair) {
359
+ switch (args_ct[i].pair) {
360
case 0:
361
break;
362
case 1:
363
- o = def->args_ct[i].alias_index;
364
- o2 = def->args_ct[o].pair_index;
365
- tcg_debug_assert(def->args_ct[o].pair == 1);
366
- tcg_debug_assert(def->args_ct[o2].pair == 2);
367
- if (def->args_ct[o2].oalias) {
368
+ o = args_ct[i].alias_index;
369
+ o2 = args_ct[o].pair_index;
370
+ tcg_debug_assert(args_ct[o].pair == 1);
371
+ tcg_debug_assert(args_ct[o2].pair == 2);
372
+ if (args_ct[o2].oalias) {
373
/* Case 1a */
374
- i2 = def->args_ct[o2].alias_index;
375
- tcg_debug_assert(def->args_ct[i2].pair == 2);
376
- def->args_ct[i2].pair_index = i;
377
- def->args_ct[i].pair_index = i2;
378
+ i2 = args_ct[o2].alias_index;
379
+ tcg_debug_assert(args_ct[i2].pair == 2);
380
+ args_ct[i2].pair_index = i;
381
+ args_ct[i].pair_index = i2;
382
} else {
383
/* Case 1b */
384
- def->args_ct[i].pair_index = i;
385
+ args_ct[i].pair_index = i;
386
}
387
break;
388
case 2:
389
- o = def->args_ct[i].alias_index;
390
- o2 = def->args_ct[o].pair_index;
391
- tcg_debug_assert(def->args_ct[o].pair == 2);
392
- tcg_debug_assert(def->args_ct[o2].pair == 1);
393
- if (def->args_ct[o2].oalias) {
394
+ o = args_ct[i].alias_index;
395
+ o2 = args_ct[o].pair_index;
396
+ tcg_debug_assert(args_ct[o].pair == 2);
397
+ tcg_debug_assert(args_ct[o2].pair == 1);
398
+ if (args_ct[o2].oalias) {
399
/* Case 1a */
400
- i2 = def->args_ct[o2].alias_index;
401
- tcg_debug_assert(def->args_ct[i2].pair == 1);
402
- def->args_ct[i2].pair_index = i;
403
- def->args_ct[i].pair_index = i2;
404
+ i2 = args_ct[o2].alias_index;
405
+ tcg_debug_assert(args_ct[i2].pair == 1);
406
+ args_ct[i2].pair_index = i;
407
+ args_ct[i].pair_index = i2;
408
} else {
409
/* Case 2 */
410
- def->args_ct[i].pair = 3;
411
- def->args_ct[o2].pair = 3;
412
- def->args_ct[i].pair_index = o2;
413
- def->args_ct[o2].pair_index = i;
414
+ args_ct[i].pair = 3;
415
+ args_ct[o2].pair = 3;
416
+ args_ct[i].pair_index = o2;
417
+ args_ct[o2].pair_index = i;
418
}
419
break;
420
default:
421
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
422
}
423
424
/* sort the constraints (XXX: this is just an heuristic) */
425
- sort_constraints(def, 0, def->nb_oargs);
426
- sort_constraints(def, def->nb_oargs, def->nb_iargs);
427
+ sort_constraints(args_ct, 0, nb_oargs);
428
+ sort_constraints(args_ct, nb_oargs, nb_iargs);
429
+ }
430
+
431
+ for (TCGOpcode op = 0; op < NB_OPS; op++) {
432
+ TCGOpDef *def = &tcg_op_defs[op];
433
+ const TCGConstraintSet *tdefs;
434
+ TCGConstraintSetIndex con_set;
435
+ int nb_args;
436
+
437
+ nb_args = def->nb_iargs + def->nb_oargs;
438
+ if (nb_args == 0) {
439
+ continue;
440
+ }
441
+
442
+ if (def->flags & TCG_OPF_NOT_PRESENT) {
443
+ def->args_ct = empty_cts;
444
+ continue;
445
+ }
446
+
447
+ /*
448
+ * Macro magic should make it impossible, but double-check that
449
+ * the array index is in range. At the same time, double-check
450
+ * that the opcode is implemented, i.e. not C_NotImplemented.
451
+ */
452
+ con_set = tcg_target_op_def(op);
453
+ tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
454
+
455
+ /* The constraint arguments must match TCGOpcode arguments. */
456
+ tdefs = &constraint_sets[con_set];
457
+ tcg_debug_assert(tdefs->nb_oargs == def->nb_oargs);
458
+ tcg_debug_assert(tdefs->nb_iargs == def->nb_iargs);
459
+
460
+ def->args_ct = all_cts[con_set];
47
}
461
}
48
49
src = arg_temp(op->args[0]);
50
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_st_memcopy(OptContext *ctx, TCGOp *op)
51
last = ofs + tcg_type_size(type) - 1;
52
remove_mem_copy_in(ctx, ofs, last);
53
record_mem_copy(ctx, type, src, ofs, last);
54
- return false;
55
+ return true;
56
}
462
}
57
463
58
static bool fold_xor(OptContext *ctx, TCGOp *op)
59
--
464
--
60
2.43.0
465
2.43.0
466
467
diff view generated by jsdifflib
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
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
tcg/optimize.c | 6 +++---
12
include/tcg/tcg.h | 1 -
5
1 file changed, 3 insertions(+), 3 deletions(-)
13
tcg/tcg-common.c | 2 +-
6
14
tcg/tcg.c | 82 ++++++++++++++++++++++-------------------------
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
15
3 files changed, 40 insertions(+), 45 deletions(-)
16
17
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
8
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/optimize.c
19
--- a/include/tcg/tcg.h
10
+++ b/tcg/optimize.c
20
+++ b/include/tcg/tcg.h
11
@@ -XXX,XX +XXX,XX @@ static bool fold_mul(OptContext *ctx, TCGOp *op)
21
@@ -XXX,XX +XXX,XX @@ typedef struct TCGOpDef {
12
fold_xi_to_x(ctx, op, 1)) {
22
const char *name;
13
return true;
23
uint8_t nb_oargs, nb_iargs, nb_cargs, nb_args;
14
}
24
uint8_t flags;
15
- return false;
25
- const TCGArgConstraint *args_ct;
16
+ return finish_folding(ctx, op);
26
} TCGOpDef;
27
28
extern TCGOpDef tcg_op_defs[];
29
diff --git a/tcg/tcg-common.c b/tcg/tcg-common.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/tcg/tcg-common.c
32
+++ b/tcg/tcg-common.c
33
@@ -XXX,XX +XXX,XX @@
34
35
TCGOpDef tcg_op_defs[] = {
36
#define DEF(s, oargs, iargs, cargs, flags) \
37
- { #s, oargs, iargs, cargs, iargs + oargs + cargs, flags, NULL },
38
+ { #s, oargs, iargs, cargs, iargs + oargs + cargs, flags },
39
#include "tcg/tcg-opc.h"
40
#undef DEF
41
};
42
diff --git a/tcg/tcg.c b/tcg/tcg.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/tcg/tcg.c
45
+++ b/tcg/tcg.c
46
@@ -XXX,XX +XXX,XX @@ static void init_call_layout(TCGHelperInfo *info)
17
}
47
}
18
48
19
static bool fold_mul_highpart(OptContext *ctx, TCGOp *op)
49
static int indirect_reg_alloc_order[ARRAY_SIZE(tcg_target_reg_alloc_order)];
20
@@ -XXX,XX +XXX,XX @@ static bool fold_mul_highpart(OptContext *ctx, TCGOp *op)
50
-static void process_op_defs(TCGContext *s);
21
fold_xi_to_i(ctx, op, 0)) {
51
+static void process_constraint_sets(void);
22
return true;
52
static TCGTemp *tcg_global_reg_new_internal(TCGContext *s, TCGType type,
23
}
53
TCGReg reg, const char *name);
24
- return false;
54
25
+ return finish_folding(ctx, op);
55
@@ -XXX,XX +XXX,XX @@ static void tcg_context_init(unsigned max_cpus)
56
init_call_layout(&info_helper_st128_mmu);
57
58
tcg_target_init(s);
59
- process_op_defs(s);
60
+ process_constraint_sets();
61
62
/* Reverse the order of the saved registers, assuming they're all at
63
the start of tcg_target_reg_alloc_order. */
64
@@ -XXX,XX +XXX,XX @@ static void sort_constraints(TCGArgConstraint *a, int start, int n)
65
static const TCGArgConstraint empty_cts[TCG_MAX_OP_ARGS];
66
static TCGArgConstraint all_cts[ARRAY_SIZE(constraint_sets)][TCG_MAX_OP_ARGS];
67
68
-static void process_op_defs(TCGContext *s)
69
+static void process_constraint_sets(void)
70
{
71
for (size_t c = 0; c < ARRAY_SIZE(constraint_sets); ++c) {
72
const TCGConstraintSet *tdefs = &constraint_sets[c];
73
@@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s)
74
sort_constraints(args_ct, 0, nb_oargs);
75
sort_constraints(args_ct, nb_oargs, nb_iargs);
76
}
77
+}
78
79
- for (TCGOpcode op = 0; op < NB_OPS; op++) {
80
- TCGOpDef *def = &tcg_op_defs[op];
81
- const TCGConstraintSet *tdefs;
82
- TCGConstraintSetIndex con_set;
83
- int nb_args;
84
+static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
85
+{
86
+ TCGOpDef *def = &tcg_op_defs[op->opc];
87
+ TCGConstraintSetIndex con_set;
88
89
- nb_args = def->nb_iargs + def->nb_oargs;
90
- if (nb_args == 0) {
91
- continue;
92
- }
93
-
94
- if (def->flags & TCG_OPF_NOT_PRESENT) {
95
- def->args_ct = empty_cts;
96
- continue;
97
- }
98
-
99
- /*
100
- * Macro magic should make it impossible, but double-check that
101
- * the array index is in range. At the same time, double-check
102
- * that the opcode is implemented, i.e. not C_NotImplemented.
103
- */
104
- con_set = tcg_target_op_def(op);
105
- tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
106
-
107
- /* The constraint arguments must match TCGOpcode arguments. */
108
- tdefs = &constraint_sets[con_set];
109
- tcg_debug_assert(tdefs->nb_oargs == def->nb_oargs);
110
- tcg_debug_assert(tdefs->nb_iargs == def->nb_iargs);
111
-
112
- def->args_ct = all_cts[con_set];
113
+ if (def->nb_iargs + def->nb_oargs == 0) {
114
+ return NULL;
115
}
116
+ if (def->flags & TCG_OPF_NOT_PRESENT) {
117
+ return empty_cts;
118
+ }
119
+
120
+ con_set = tcg_target_op_def(op->opc);
121
+ tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
122
+
123
+ /* The constraint arguments must match TCGOpcode arguments. */
124
+ tcg_debug_assert(constraint_sets[con_set].nb_oargs == def->nb_oargs);
125
+ tcg_debug_assert(constraint_sets[con_set].nb_iargs == def->nb_iargs);
126
+
127
+ return all_cts[con_set];
26
}
128
}
27
129
28
static bool fold_multiply2(OptContext *ctx, TCGOp *op)
130
static void remove_label_use(TCGOp *op, int idx)
29
@@ -XXX,XX +XXX,XX @@ static bool fold_multiply2(OptContext *ctx, TCGOp *op)
131
@@ -XXX,XX +XXX,XX @@ liveness_pass_1(TCGContext *s)
30
tcg_opt_gen_movi(ctx, op2, rh, h);
132
TCGTemp *ts;
31
return true;
133
TCGOpcode opc = op->opc;
32
}
134
const TCGOpDef *def = &tcg_op_defs[opc];
33
- return false;
135
+ const TCGArgConstraint *args_ct;
34
+ return finish_folding(ctx, op);
136
35
}
137
switch (opc) {
36
138
case INDEX_op_call:
37
static bool fold_nand(OptContext *ctx, TCGOp *op)
139
@@ -XXX,XX +XXX,XX @@ liveness_pass_1(TCGContext *s)
140
break;
141
142
default:
143
+ args_ct = opcode_args_ct(op);
144
for (i = nb_oargs; i < nb_oargs + nb_iargs; i++) {
145
- const TCGArgConstraint *ct = &def->args_ct[i];
146
+ const TCGArgConstraint *ct = &args_ct[i];
147
TCGRegSet set, *pset;
148
149
ts = arg_temp(op->args[i]);
150
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
151
{
152
const TCGLifeData arg_life = op->life;
153
TCGRegSet dup_out_regs, dup_in_regs;
154
+ const TCGArgConstraint *dup_args_ct;
155
TCGTemp *its, *ots;
156
TCGType itype, vtype;
157
unsigned vece;
158
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_dup(TCGContext *s, const TCGOp *op)
159
return;
160
}
161
162
- dup_out_regs = tcg_op_defs[INDEX_op_dup_vec].args_ct[0].regs;
163
- dup_in_regs = tcg_op_defs[INDEX_op_dup_vec].args_ct[1].regs;
164
+ dup_args_ct = opcode_args_ct(op);
165
+ dup_out_regs = dup_args_ct[0].regs;
166
+ dup_in_regs = dup_args_ct[1].regs;
167
168
/* Allocate the output register now. */
169
if (ots->val_type != TEMP_VAL_REG) {
170
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
171
int i, k, nb_iargs, nb_oargs;
172
TCGReg reg;
173
TCGArg arg;
174
+ const TCGArgConstraint *args_ct;
175
const TCGArgConstraint *arg_ct;
176
TCGTemp *ts;
177
TCGArg new_args[TCG_MAX_OP_ARGS];
178
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
179
break;
180
}
181
182
+ args_ct = opcode_args_ct(op);
183
+
184
/* satisfy input constraints */
185
for (k = 0; k < nb_iargs; k++) {
186
TCGRegSet i_preferred_regs, i_required_regs;
187
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
188
TCGTemp *ts2;
189
int i1, i2;
190
191
- i = def->args_ct[nb_oargs + k].sort_index;
192
+ i = args_ct[nb_oargs + k].sort_index;
193
arg = op->args[i];
194
- arg_ct = &def->args_ct[i];
195
+ arg_ct = &args_ct[i];
196
ts = arg_temp(arg);
197
198
if (ts->val_type == TEMP_VAL_CONST
199
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
200
* register and move it.
201
*/
202
if (temp_readonly(ts) || !IS_DEAD_ARG(i)
203
- || def->args_ct[arg_ct->alias_index].newreg) {
204
+ || args_ct[arg_ct->alias_index].newreg) {
205
allocate_new_reg = true;
206
} else if (ts->val_type == TEMP_VAL_REG) {
207
/*
208
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
209
}
210
211
/* satisfy the output constraints */
212
- for(k = 0; k < nb_oargs; k++) {
213
- i = def->args_ct[k].sort_index;
214
+ for (k = 0; k < nb_oargs; k++) {
215
+ i = args_ct[k].sort_index;
216
arg = op->args[i];
217
- arg_ct = &def->args_ct[i];
218
+ arg_ct = &args_ct[i];
219
ts = arg_temp(arg);
220
221
/* ENV should not be modified. */
222
@@ -XXX,XX +XXX,XX @@ static bool tcg_reg_alloc_dup2(TCGContext *s, const TCGOp *op)
223
/* Allocate the output register now. */
224
if (ots->val_type != TEMP_VAL_REG) {
225
TCGRegSet allocated_regs = s->reserved_regs;
226
- TCGRegSet dup_out_regs =
227
- tcg_op_defs[INDEX_op_dup_vec].args_ct[0].regs;
228
+ TCGRegSet dup_out_regs = opcode_args_ct(op)[0].regs;
229
TCGReg oreg;
230
231
/* Make sure to not spill the input registers. */
38
--
232
--
39
2.43.0
233
2.43.0
234
235
diff view generated by jsdifflib
1
This rounding mode is used by Hexagon.
1
Now that we're no longer assigning to TCGOpDef.args_ct,
2
we can make the array constant.
2
3
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
include/fpu/softfloat-types.h | 2 ++
7
include/tcg/tcg.h | 2 +-
6
fpu/softfloat-parts.c.inc | 3 +++
8
tcg/tcg-common.c | 2 +-
7
2 files changed, 5 insertions(+)
9
tcg/tcg.c | 2 +-
10
3 files changed, 3 insertions(+), 3 deletions(-)
8
11
9
diff --git a/include/fpu/softfloat-types.h b/include/fpu/softfloat-types.h
12
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
10
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
11
--- a/include/fpu/softfloat-types.h
14
--- a/include/tcg/tcg.h
12
+++ b/include/fpu/softfloat-types.h
15
+++ b/include/tcg/tcg.h
13
@@ -XXX,XX +XXX,XX @@ typedef enum __attribute__((__packed__)) {
16
@@ -XXX,XX +XXX,XX @@ typedef struct TCGOpDef {
14
float_round_to_odd = 5,
17
uint8_t flags;
15
/* Not an IEEE rounding mode: round to closest odd, overflow to inf */
18
} TCGOpDef;
16
float_round_to_odd_inf = 6,
19
17
+ /* Not an IEEE rounding mode: round to nearest even, overflow to max */
20
-extern TCGOpDef tcg_op_defs[];
18
+ float_round_nearest_even_max = 7,
21
+extern const TCGOpDef tcg_op_defs[];
19
} FloatRoundMode;
22
extern const size_t tcg_op_defs_max;
20
23
21
/*
24
/*
22
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
25
diff --git a/tcg/tcg-common.c b/tcg/tcg-common.c
23
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
24
--- a/fpu/softfloat-parts.c.inc
27
--- a/tcg/tcg-common.c
25
+++ b/fpu/softfloat-parts.c.inc
28
+++ b/tcg/tcg-common.c
26
@@ -XXX,XX +XXX,XX @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
29
@@ -XXX,XX +XXX,XX @@
27
int exp, flags = 0;
30
#include "tcg/tcg.h"
28
31
#include "tcg-has.h"
29
switch (s->float_rounding_mode) {
32
30
+ case float_round_nearest_even_max:
33
-TCGOpDef tcg_op_defs[] = {
31
+ overflow_norm = true;
34
+const TCGOpDef tcg_op_defs[] = {
32
+ /* fall through */
35
#define DEF(s, oargs, iargs, cargs, flags) \
33
case float_round_nearest_even:
36
{ #s, oargs, iargs, cargs, iargs + oargs + cargs, flags },
34
if (N > 64 && frac_lsb == 0) {
37
#include "tcg/tcg-opc.h"
35
inc = ((p->frac_hi & 1) || (p->frac_lo & round_mask) != frac_lsbm1
38
diff --git a/tcg/tcg.c b/tcg/tcg.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/tcg/tcg.c
41
+++ b/tcg/tcg.c
42
@@ -XXX,XX +XXX,XX @@ static void process_constraint_sets(void)
43
44
static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
45
{
46
- TCGOpDef *def = &tcg_op_defs[op->opc];
47
+ const TCGOpDef *def = &tcg_op_defs[op->opc];
48
TCGConstraintSetIndex con_set;
49
50
if (def->nb_iargs + def->nb_oargs == 0) {
36
--
51
--
37
2.43.0
52
2.43.0
53
54
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
1
We should have checked that the op is supported before
2
emitting it. The backend cannot be expected to have a
3
constraint set for unsupported ops.
2
4
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
7
---
6
tcg/optimize.c | 8 +++++---
8
tcg/tcg.c | 4 ++++
7
1 file changed, 5 insertions(+), 3 deletions(-)
9
1 file changed, 4 insertions(+)
8
10
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
diff --git a/tcg/tcg.c b/tcg/tcg.c
10
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
13
--- a/tcg/tcg.c
12
+++ b/tcg/optimize.c
14
+++ b/tcg/tcg.c
13
@@ -XXX,XX +XXX,XX @@ static bool fold_or(OptContext *ctx, TCGOp *op)
15
@@ -XXX,XX +XXX,XX @@ static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
14
16
const TCGOpDef *def = &tcg_op_defs[op->opc];
15
static bool fold_orc(OptContext *ctx, TCGOp *op)
17
TCGConstraintSetIndex con_set;
16
{
18
17
+ uint64_t s_mask;
19
+#ifdef CONFIG_DEBUG_TCG
20
+ assert(tcg_op_supported(op->opc, TCGOP_TYPE(op), TCGOP_FLAGS(op)));
21
+#endif
18
+
22
+
19
if (fold_const2(ctx, op) ||
23
if (def->nb_iargs + def->nb_oargs == 0) {
20
fold_xx_to_i(ctx, op, -1) ||
24
return NULL;
21
fold_xi_to_x(ctx, op, -1) ||
22
@@ -XXX,XX +XXX,XX @@ static bool fold_orc(OptContext *ctx, TCGOp *op)
23
return true;
24
}
25
}
25
26
- ctx->s_mask = arg_info(op->args[1])->s_mask
27
- & arg_info(op->args[2])->s_mask;
28
- return false;
29
+ s_mask = arg_info(op->args[1])->s_mask
30
+ & arg_info(op->args[2])->s_mask;
31
+ return fold_masks_s(ctx, op, s_mask);
32
}
33
34
static bool fold_qemu_ld(OptContext *ctx, TCGOp *op)
35
--
26
--
36
2.43.0
27
2.43.0
28
29
diff view generated by jsdifflib
1
Change the representation from sign bit repetitions to all bits equal
1
The br, mb, goto_tb and exit_tb opcodes do not have
2
to the sign bit, including the sign bit itself.
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.
3
5
4
The previous format has a problem in that it is difficult to recreate
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
a valid sign mask after a shift operation: the "repetitions" part of
6
the previous format meant that applying the same shift as for the value
7
lead to an off-by-one value.
8
9
The new format, including the sign bit itself, means that the sign mask
10
can be manipulated in exactly the same way as the value, canonicalization
11
is easier.
12
13
Canonicalize the s_mask in fold_masks_zs, rather than requiring callers
14
to do so. Treat 0 as a non-canonical but typeless input for no sign
15
information, which will be reset as appropriate for the data type.
16
We can easily fold in the data from z_mask while canonicalizing.
17
18
Temporarily disable optimizations using s_mask while each operation is
19
converted to use fold_masks_zs and to the new form.
20
21
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
22
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
23
---
8
---
24
tcg/optimize.c | 64 ++++++++++++--------------------------------------
9
include/tcg/tcg-opc.h | 8 ++++----
25
1 file changed, 15 insertions(+), 49 deletions(-)
10
tcg/tcg.c | 3 ---
11
2 files changed, 4 insertions(+), 7 deletions(-)
26
12
27
diff --git a/tcg/optimize.c b/tcg/optimize.c
13
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
28
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
29
--- a/tcg/optimize.c
15
--- a/include/tcg/tcg-opc.h
30
+++ b/tcg/optimize.c
16
+++ b/include/tcg/tcg-opc.h
31
@@ -XXX,XX +XXX,XX @@ typedef struct TempOptInfo {
17
@@ -XXX,XX +XXX,XX @@ DEF(set_label, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
32
QSIMPLEQ_HEAD(, MemCopyInfo) mem_copy;
18
/* variable number of parameters */
33
uint64_t val;
19
DEF(call, 0, 0, 3, TCG_OPF_CALL_CLOBBER | TCG_OPF_NOT_PRESENT)
34
uint64_t z_mask; /* mask bit is 0 if and only if value bit is 0 */
20
35
- uint64_t s_mask; /* a left-aligned mask of clrsb(value) bits. */
21
-DEF(br, 0, 0, 1, TCG_OPF_BB_END)
36
+ uint64_t s_mask; /* mask bit is 1 if value bit matches msb */
22
+DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
37
} TempOptInfo;
23
38
24
#define IMPL(X) (__builtin_constant_p(X) && (X) <= 0 ? TCG_OPF_NOT_PRESENT : 0)
39
typedef struct OptContext {
25
#if TCG_TARGET_REG_BITS == 32
40
@@ -XXX,XX +XXX,XX @@ typedef struct OptContext {
26
@@ -XXX,XX +XXX,XX @@ DEF(br, 0, 0, 1, TCG_OPF_BB_END)
41
27
# define IMPL64 TCG_OPF_64BIT
42
/* In flight values from optimization. */
28
#endif
43
uint64_t z_mask; /* mask bit is 0 iff value bit is 0 */
29
44
- uint64_t s_mask; /* mask of clrsb(value) bits */
30
-DEF(mb, 0, 0, 1, 0)
45
+ uint64_t s_mask; /* mask bit is 1 if value bit matches msb */
31
+DEF(mb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
46
TCGType type;
32
47
} OptContext;
33
DEF(mov_i32, 1, 1, 0, TCG_OPF_NOT_PRESENT)
48
34
DEF(setcond_i32, 1, 2, 1, 0)
49
-/* Calculate the smask for a specific value. */
35
@@ -XXX,XX +XXX,XX @@ DEF(mulsh_i64, 1, 2, 0, IMPL64 | IMPL(TCG_TARGET_HAS_mulsh_i64))
50
-static uint64_t smask_from_value(uint64_t value)
36
/* There are tcg_ctx->insn_start_words here, not just one. */
51
-{
37
DEF(insn_start, 0, 0, DATA64_ARGS, TCG_OPF_NOT_PRESENT)
52
- int rep = clrsb64(value);
38
53
- return ~(~0ull >> rep);
39
-DEF(exit_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
54
-}
40
-DEF(goto_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
55
-
41
+DEF(exit_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
56
-/*
42
+DEF(goto_tb, 0, 0, 1, TCG_OPF_BB_EXIT | TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
57
- * Calculate the smask for a given set of known-zeros.
43
DEF(goto_ptr, 0, 1, 0, TCG_OPF_BB_EXIT | TCG_OPF_BB_END)
58
- * If there are lots of zeros on the left, we can consider the remainder
44
59
- * an unsigned field, and thus the corresponding signed field is one bit
45
DEF(plugin_cb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
60
- * larger.
46
diff --git a/tcg/tcg.c b/tcg/tcg.c
61
- */
47
index XXXXXXX..XXXXXXX 100644
62
-static uint64_t smask_from_zmask(uint64_t zmask)
48
--- a/tcg/tcg.c
63
-{
49
+++ b/tcg/tcg.c
64
- /*
50
@@ -XXX,XX +XXX,XX @@ static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
65
- * Only the 0 bits are significant for zmask, thus the msb itself
51
assert(tcg_op_supported(op->opc, TCGOP_TYPE(op), TCGOP_FLAGS(op)));
66
- * must be zero, else we have no sign information.
52
#endif
67
- */
53
68
- int rep = clz64(zmask);
54
- if (def->nb_iargs + def->nb_oargs == 0) {
69
- if (rep == 0) {
55
- return NULL;
70
- return 0;
71
- }
56
- }
72
- rep -= 1;
57
if (def->flags & TCG_OPF_NOT_PRESENT) {
73
- return ~(~0ull >> rep);
58
return empty_cts;
74
-}
75
-
76
-/*
77
- * Recreate a properly left-aligned smask after manipulation.
78
- * Some bit-shuffling, particularly shifts and rotates, may
79
- * retain sign bits on the left, but may scatter disconnected
80
- * sign bits on the right. Retain only what remains to the left.
81
- */
82
-static uint64_t smask_from_smask(int64_t smask)
83
-{
84
- /* Only the 1 bits are significant for smask */
85
- return smask_from_zmask(~smask);
86
-}
87
-
88
static inline TempOptInfo *ts_info(TCGTemp *ts)
89
{
90
return ts->state_ptr;
91
@@ -XXX,XX +XXX,XX @@ static void init_ts_info(OptContext *ctx, TCGTemp *ts)
92
ti->is_const = true;
93
ti->val = ts->val;
94
ti->z_mask = ts->val;
95
- ti->s_mask = smask_from_value(ts->val);
96
+ ti->s_mask = INT64_MIN >> clrsb64(ts->val);
97
} else {
98
ti->is_const = false;
99
ti->z_mask = -1;
100
@@ -XXX,XX +XXX,XX @@ static void finish_folding(OptContext *ctx, TCGOp *op)
101
*/
102
if (i == 0) {
103
ts_info(ts)->z_mask = ctx->z_mask;
104
- ts_info(ts)->s_mask = ctx->s_mask;
105
}
106
}
107
}
108
@@ -XXX,XX +XXX,XX @@ static bool fold_const2_commutative(OptContext *ctx, TCGOp *op)
109
* The passed s_mask may be augmented by z_mask.
110
*/
111
static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
112
- uint64_t z_mask, uint64_t s_mask)
113
+ uint64_t z_mask, int64_t s_mask)
114
{
115
const TCGOpDef *def = &tcg_op_defs[op->opc];
116
TCGTemp *ts;
117
TempOptInfo *ti;
118
+ int rep;
119
120
/* Only single-output opcodes are supported here. */
121
tcg_debug_assert(def->nb_oargs == 1);
122
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
123
*/
124
if (ctx->type == TCG_TYPE_I32) {
125
z_mask = (int32_t)z_mask;
126
- s_mask |= MAKE_64BIT_MASK(32, 32);
127
+ s_mask |= INT32_MIN;
128
}
129
130
if (z_mask == 0) {
131
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
132
133
ti = ts_info(ts);
134
ti->z_mask = z_mask;
135
- ti->s_mask = s_mask | smask_from_zmask(z_mask);
136
+
137
+ /* Canonicalize s_mask and incorporate data from z_mask. */
138
+ rep = clz64(~s_mask);
139
+ rep = MAX(rep, clz64(z_mask));
140
+ rep = MAX(rep - 1, 0);
141
+ ti->s_mask = INT64_MIN >> rep;
142
+
143
return true;
144
}
145
146
@@ -XXX,XX +XXX,XX @@ static bool fold_exts(OptContext *ctx, TCGOp *op)
147
148
ctx->z_mask = z_mask;
149
ctx->s_mask = s_mask;
150
- if (!type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
151
+ if (0 && !type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
152
return true;
153
}
154
155
@@ -XXX,XX +XXX,XX @@ static bool fold_sextract(OptContext *ctx, TCGOp *op)
156
s_mask |= MAKE_64BIT_MASK(len, 64 - len);
157
ctx->s_mask = s_mask;
158
159
- if (pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
160
+ if (0 && pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
161
return true;
162
}
163
164
@@ -XXX,XX +XXX,XX @@ static bool fold_shift(OptContext *ctx, TCGOp *op)
165
ctx->z_mask = do_constant_folding(op->opc, ctx->type, z_mask, sh);
166
167
s_mask = do_constant_folding(op->opc, ctx->type, s_mask, sh);
168
- ctx->s_mask = smask_from_smask(s_mask);
169
170
return fold_masks(ctx, op);
171
}
59
}
172
--
60
--
173
2.43.0
61
2.43.0
62
63
diff view generated by jsdifflib
1
There are multiple special cases for this instruction.
1
Allow the backend to make constraint choices based on more parameters.
2
(1) The saturate to normal maximum instead of overflow to infinity is
3
handled by the new float_round_nearest_even_max rounding mode.
4
(2) The 0 * n + c special case is handled by the new
5
float_muladd_suppress_add_product_zero flag.
6
(3) The Inf - Inf -> 0 special case can be detected after the fact
7
by examining float_flag_invalid_isi.
8
2
9
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
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
target/hexagon/op_helper.c | 105 +++++++++----------------------------
6
tcg/tcg.c | 4 ++--
13
1 file changed, 26 insertions(+), 79 deletions(-)
7
tcg/aarch64/tcg-target.c.inc | 3 ++-
8
tcg/arm/tcg-target.c.inc | 3 ++-
9
tcg/i386/tcg-target.c.inc | 3 ++-
10
tcg/loongarch64/tcg-target.c.inc | 3 ++-
11
tcg/mips/tcg-target.c.inc | 3 ++-
12
tcg/ppc/tcg-target.c.inc | 3 ++-
13
tcg/riscv/tcg-target.c.inc | 3 ++-
14
tcg/s390x/tcg-target.c.inc | 3 ++-
15
tcg/sparc64/tcg-target.c.inc | 3 ++-
16
tcg/tci/tcg-target.c.inc | 3 ++-
17
11 files changed, 22 insertions(+), 12 deletions(-)
14
18
15
diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
19
diff --git a/tcg/tcg.c b/tcg/tcg.c
16
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
17
--- a/target/hexagon/op_helper.c
21
--- a/tcg/tcg.c
18
+++ b/target/hexagon/op_helper.c
22
+++ b/tcg/tcg.c
19
@@ -XXX,XX +XXX,XX @@ float32 HELPER(sffma)(CPUHexagonState *env, float32 RxV,
23
@@ -XXX,XX +XXX,XX @@ typedef enum {
20
return RxV;
24
#include "tcg-target-con-set.h"
25
} TCGConstraintSetIndex;
26
27
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode);
28
+static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode, TCGType, unsigned);
29
30
#undef C_O0_I1
31
#undef C_O0_I2
32
@@ -XXX,XX +XXX,XX @@ static const TCGArgConstraint *opcode_args_ct(const TCGOp *op)
33
return empty_cts;
34
}
35
36
- con_set = tcg_target_op_def(op->opc);
37
+ con_set = tcg_target_op_def(op->opc, TCGOP_TYPE(op), TCGOP_FLAGS(op));
38
tcg_debug_assert(con_set >= 0 && con_set < ARRAY_SIZE(constraint_sets));
39
40
/* The constraint arguments must match TCGOpcode arguments. */
41
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
42
index XXXXXXX..XXXXXXX 100644
43
--- a/tcg/aarch64/tcg-target.c.inc
44
+++ b/tcg/aarch64/tcg-target.c.inc
45
@@ -XXX,XX +XXX,XX @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
46
}
21
}
47
}
22
48
23
-static bool is_zero_prod(float32 a, float32 b)
49
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
24
-{
50
+static TCGConstraintSetIndex
25
- return ((float32_is_zero(a) && is_finite(b)) ||
51
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
26
- (float32_is_zero(b) && is_finite(a)));
27
-}
28
-
29
-static float32 check_nan(float32 dst, float32 x, float_status *fp_status)
30
-{
31
- float32 ret = dst;
32
- if (float32_is_any_nan(x)) {
33
- if (extract32(x, 22, 1) == 0) {
34
- float_raise(float_flag_invalid, fp_status);
35
- }
36
- ret = make_float32(0xffffffff); /* nan */
37
- }
38
- return ret;
39
-}
40
-
41
float32 HELPER(sffma_sc)(CPUHexagonState *env, float32 RxV,
42
float32 RsV, float32 RtV, float32 PuV)
43
{
52
{
44
@@ -XXX,XX +XXX,XX @@ float32 HELPER(sffms)(CPUHexagonState *env, float32 RxV,
53
switch (op) {
45
return RxV;
54
case INDEX_op_goto_ptr:
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,
60
}
46
}
61
}
47
62
48
-static bool is_inf_prod(int32_t a, int32_t b)
63
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
49
+static float32 do_sffma_lib(CPUHexagonState *env, float32 RxV,
64
+static TCGConstraintSetIndex
50
+ float32 RsV, float32 RtV, int negate)
65
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
51
{
66
{
52
- return (float32_is_infinity(a) && float32_is_infinity(b)) ||
67
switch (op) {
53
- (float32_is_infinity(a) && is_finite(b) && !float32_is_zero(b)) ||
68
case INDEX_op_goto_ptr:
54
- (float32_is_infinity(b) && is_finite(a) && !float32_is_zero(a));
69
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
55
+ int flags;
70
index XXXXXXX..XXXXXXX 100644
56
+
71
--- a/tcg/i386/tcg-target.c.inc
57
+ arch_fpop_start(env);
72
+++ b/tcg/i386/tcg-target.c.inc
58
+
73
@@ -XXX,XX +XXX,XX @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
59
+ set_float_rounding_mode(float_round_nearest_even_max, &env->fp_status);
74
}
60
+ RxV = float32_muladd(RsV, RtV, RxV,
61
+ negate | float_muladd_suppress_add_product_zero,
62
+ &env->fp_status);
63
+
64
+ flags = get_float_exception_flags(&env->fp_status);
65
+ if (flags) {
66
+ /* Flags are suppressed by this instruction. */
67
+ set_float_exception_flags(0, &env->fp_status);
68
+
69
+ /* Return 0 for Inf - Inf. */
70
+ if (flags & float_flag_invalid_isi) {
71
+ RxV = 0;
72
+ }
73
+ }
74
+
75
+ arch_fpop_end(env);
76
+ return RxV;
77
}
75
}
78
76
79
float32 HELPER(sffma_lib)(CPUHexagonState *env, float32 RxV,
77
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
80
float32 RsV, float32 RtV)
78
+static TCGConstraintSetIndex
79
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
81
{
80
{
82
- bool infinp;
81
switch (op) {
83
- bool infminusinf;
82
case INDEX_op_goto_ptr:
84
- float32 tmp;
83
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
85
-
84
index XXXXXXX..XXXXXXX 100644
86
- arch_fpop_start(env);
85
--- a/tcg/loongarch64/tcg-target.c.inc
87
- set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
86
+++ b/tcg/loongarch64/tcg-target.c.inc
88
- infminusinf = float32_is_infinity(RxV) &&
87
@@ -XXX,XX +XXX,XX @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
89
- is_inf_prod(RsV, RtV) &&
88
g_assert_not_reached();
90
- (fGETBIT(31, RsV ^ RxV ^ RtV) != 0);
91
- infinp = float32_is_infinity(RxV) ||
92
- float32_is_infinity(RtV) ||
93
- float32_is_infinity(RsV);
94
- RxV = check_nan(RxV, RxV, &env->fp_status);
95
- RxV = check_nan(RxV, RsV, &env->fp_status);
96
- RxV = check_nan(RxV, RtV, &env->fp_status);
97
- tmp = internal_fmafx(RsV, RtV, RxV, 0, &env->fp_status);
98
- if (!(float32_is_zero(RxV) && is_zero_prod(RsV, RtV))) {
99
- RxV = tmp;
100
- }
101
- set_float_exception_flags(0, &env->fp_status);
102
- if (float32_is_infinity(RxV) && !infinp) {
103
- RxV = RxV - 1;
104
- }
105
- if (infminusinf) {
106
- RxV = 0;
107
- }
108
- arch_fpop_end(env);
109
- return RxV;
110
+ return do_sffma_lib(env, RxV, RsV, RtV, 0);
111
}
89
}
112
90
113
float32 HELPER(sffms_lib)(CPUHexagonState *env, float32 RxV,
91
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
114
float32 RsV, float32 RtV)
92
+static TCGConstraintSetIndex
93
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
115
{
94
{
116
- bool infinp;
95
switch (op) {
117
- bool infminusinf;
96
case INDEX_op_goto_ptr:
118
- float32 tmp;
97
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
119
-
98
index XXXXXXX..XXXXXXX 100644
120
- arch_fpop_start(env);
99
--- a/tcg/mips/tcg-target.c.inc
121
- set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
100
+++ b/tcg/mips/tcg-target.c.inc
122
- infminusinf = float32_is_infinity(RxV) &&
101
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
123
- is_inf_prod(RsV, RtV) &&
102
}
124
- (fGETBIT(31, RsV ^ RxV ^ RtV) == 0);
125
- infinp = float32_is_infinity(RxV) ||
126
- float32_is_infinity(RtV) ||
127
- float32_is_infinity(RsV);
128
- RxV = check_nan(RxV, RxV, &env->fp_status);
129
- RxV = check_nan(RxV, RsV, &env->fp_status);
130
- RxV = check_nan(RxV, RtV, &env->fp_status);
131
- float32 minus_RsV = float32_sub(float32_zero, RsV, &env->fp_status);
132
- tmp = internal_fmafx(minus_RsV, RtV, RxV, 0, &env->fp_status);
133
- if (!(float32_is_zero(RxV) && is_zero_prod(RsV, RtV))) {
134
- RxV = tmp;
135
- }
136
- set_float_exception_flags(0, &env->fp_status);
137
- if (float32_is_infinity(RxV) && !infinp) {
138
- RxV = RxV - 1;
139
- }
140
- if (infminusinf) {
141
- RxV = 0;
142
- }
143
- arch_fpop_end(env);
144
- return RxV;
145
+ return do_sffma_lib(env, RxV, RsV, RtV, float_muladd_negate_product);
146
}
103
}
147
104
148
float64 HELPER(dfmpyfix)(CPUHexagonState *env, float64 RssV, float64 RttV)
105
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
106
+static TCGConstraintSetIndex
107
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
108
{
109
switch (op) {
110
case INDEX_op_goto_ptr:
111
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
112
index XXXXXXX..XXXXXXX 100644
113
--- a/tcg/ppc/tcg-target.c.inc
114
+++ b/tcg/ppc/tcg-target.c.inc
115
@@ -XXX,XX +XXX,XX @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
116
va_end(va);
117
}
118
119
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
120
+static TCGConstraintSetIndex
121
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
122
{
123
switch (op) {
124
case INDEX_op_goto_ptr:
125
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
126
index XXXXXXX..XXXXXXX 100644
127
--- a/tcg/riscv/tcg-target.c.inc
128
+++ b/tcg/riscv/tcg-target.c.inc
129
@@ -XXX,XX +XXX,XX @@ int tcg_can_emit_vec_op(TCGOpcode opc, TCGType type, unsigned vece)
130
}
131
}
132
133
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
134
+static TCGConstraintSetIndex
135
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
136
{
137
switch (op) {
138
case INDEX_op_goto_ptr:
139
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
140
index XXXXXXX..XXXXXXX 100644
141
--- a/tcg/s390x/tcg-target.c.inc
142
+++ b/tcg/s390x/tcg-target.c.inc
143
@@ -XXX,XX +XXX,XX @@ void tcg_expand_vec_op(TCGOpcode opc, TCGType type, unsigned vece,
144
va_end(va);
145
}
146
147
-static TCGConstraintSetIndex tcg_target_op_def(TCGOpcode op)
148
+static TCGConstraintSetIndex
149
+tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
150
{
151
switch (op) {
152
case INDEX_op_goto_ptr:
153
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
154
index XXXXXXX..XXXXXXX 100644
155
--- a/tcg/sparc64/tcg-target.c.inc
156
+++ b/tcg/sparc64/tcg-target.c.inc
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:
149
--
181
--
150
2.43.0
182
2.43.0
183
184
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
1
Pass TCGOp.type to the output function.
2
2
For aarch64 and tci, use this instead of testing TCG_OPF_64BIT.
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
3
For s390x, use this instead of testing INDEX_op_deposit_i64.
4
For i386, use this to initialize rexw.
5
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
8
---
6
tcg/optimize.c | 27 ++++++++++++++-------------
9
tcg/tcg.c | 4 ++--
7
1 file changed, 14 insertions(+), 13 deletions(-)
10
tcg/aarch64/tcg-target.c.inc | 6 +-----
8
11
tcg/arm/tcg-target.c.inc | 2 +-
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
tcg/i386/tcg-target.c.inc | 10 +++++-----
10
index XXXXXXX..XXXXXXX 100644
13
tcg/loongarch64/tcg-target.c.inc | 2 +-
11
--- a/tcg/optimize.c
14
tcg/mips/tcg-target.c.inc | 2 +-
12
+++ b/tcg/optimize.c
15
tcg/ppc/tcg-target.c.inc | 2 +-
13
@@ -XXX,XX +XXX,XX @@ static bool fold_sextract(OptContext *ctx, TCGOp *op)
16
tcg/riscv/tcg-target.c.inc | 2 +-
14
static bool fold_shift(OptContext *ctx, TCGOp *op)
17
tcg/s390x/tcg-target.c.inc | 7 +++----
15
{
18
tcg/sparc64/tcg-target.c.inc | 2 +-
16
uint64_t s_mask, z_mask, sign;
19
tcg/tci/tcg-target.c.inc | 4 ++--
17
+ TempOptInfo *t1, *t2;
20
11 files changed, 19 insertions(+), 24 deletions(-)
18
21
19
if (fold_const2(ctx, op) ||
22
diff --git a/tcg/tcg.c b/tcg/tcg.c
20
fold_ix_to_i(ctx, op, 0) ||
23
index XXXXXXX..XXXXXXX 100644
21
@@ -XXX,XX +XXX,XX @@ static bool fold_shift(OptContext *ctx, TCGOp *op)
24
--- a/tcg/tcg.c
22
return true;
25
+++ b/tcg/tcg.c
23
}
26
@@ -XXX,XX +XXX,XX @@ static void tcg_out_addi_ptr(TCGContext *s, TCGReg, TCGReg, tcg_target_long);
24
27
static bool tcg_out_xchg(TCGContext *s, TCGType type, TCGReg r1, TCGReg r2);
25
- s_mask = arg_info(op->args[1])->s_mask;
28
static void tcg_out_exit_tb(TCGContext *s, uintptr_t arg);
26
- z_mask = arg_info(op->args[1])->z_mask;
29
static void tcg_out_goto_tb(TCGContext *s, int which);
27
+ t1 = arg_info(op->args[1]);
30
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
28
+ t2 = arg_info(op->args[2]);
31
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
29
+ s_mask = t1->s_mask;
32
const TCGArg args[TCG_MAX_OP_ARGS],
30
+ z_mask = t1->z_mask;
33
const int const_args[TCG_MAX_OP_ARGS]);
31
34
#if TCG_TARGET_MAYBE_vec
32
- if (arg_is_const(op->args[2])) {
35
@@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op)
33
- int sh = arg_info(op->args[2])->val;
36
tcg_out_vec_op(s, op->opc, TCGOP_TYPE(op) - TCG_TYPE_V64,
34
-
37
TCGOP_VECE(op), new_args, const_args);
35
- ctx->z_mask = do_constant_folding(op->opc, ctx->type, z_mask, sh);
38
} else {
36
+ if (ti_is_const(t2)) {
39
- tcg_out_op(s, op->opc, new_args, const_args);
37
+ int sh = ti_const_val(t2);
40
+ tcg_out_op(s, op->opc, TCGOP_TYPE(op), new_args, const_args);
38
39
+ z_mask = do_constant_folding(op->opc, ctx->type, z_mask, sh);
40
s_mask = do_constant_folding(op->opc, ctx->type, s_mask, sh);
41
42
- return fold_masks(ctx, op);
43
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
44
}
45
46
switch (op->opc) {
47
@@ -XXX,XX +XXX,XX @@ static bool fold_shift(OptContext *ctx, TCGOp *op)
48
* Arithmetic right shift will not reduce the number of
49
* input sign repetitions.
50
*/
51
- ctx->s_mask = s_mask;
52
- break;
53
+ return fold_masks_s(ctx, op, s_mask);
54
CASE_OP_32_64(shr):
55
/*
56
* If the sign bit is known zero, then logical right shift
57
- * will not reduced the number of input sign repetitions.
58
+ * will not reduce the number of input sign repetitions.
59
*/
60
- sign = (s_mask & -s_mask) >> 1;
61
+ sign = -s_mask;
62
if (sign && !(z_mask & sign)) {
63
- ctx->s_mask = s_mask;
64
+ return fold_masks_s(ctx, op, s_mask);
65
}
41
}
66
break;
42
break;
67
default:
68
break;
69
}
43
}
70
44
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
71
- return false;
45
index XXXXXXX..XXXXXXX 100644
72
+ return finish_folding(ctx, op);
46
--- a/tcg/aarch64/tcg-target.c.inc
73
}
47
+++ b/tcg/aarch64/tcg-target.c.inc
74
48
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
75
static bool fold_sub_to_neg(OptContext *ctx, TCGOp *op)
49
flush_idcache_range(jmp_rx, jmp_rw, 4);
50
}
51
52
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
53
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
54
const TCGArg args[TCG_MAX_OP_ARGS],
55
const int const_args[TCG_MAX_OP_ARGS])
56
{
57
- /* 99% of the time, we can signal the use of extension registers
58
- by looking to see if the opcode handles 64-bit data. */
59
- TCGType ext = (tcg_op_defs[opc].flags & TCG_OPF_64BIT) != 0;
60
-
61
/* Hoist the loads of the most common arguments. */
62
TCGArg a0 = args[0];
63
TCGArg a1 = args[1];
64
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
65
index XXXXXXX..XXXXXXX 100644
66
--- a/tcg/arm/tcg-target.c.inc
67
+++ b/tcg/arm/tcg-target.c.inc
68
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
69
flush_idcache_range(jmp_rx, jmp_rw, 4);
70
}
71
72
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
73
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
74
const TCGArg args[TCG_MAX_OP_ARGS],
75
const int const_args[TCG_MAX_OP_ARGS])
76
{
77
diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc
78
index XXXXXXX..XXXXXXX 100644
79
--- a/tcg/i386/tcg-target.c.inc
80
+++ b/tcg/i386/tcg-target.c.inc
81
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
82
/* no need to flush icache explicitly */
83
}
84
85
-static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
86
- const TCGArg args[TCG_MAX_OP_ARGS],
87
- const int const_args[TCG_MAX_OP_ARGS])
88
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
89
+ const TCGArg args[TCG_MAX_OP_ARGS],
90
+ const int const_args[TCG_MAX_OP_ARGS])
91
{
92
TCGArg a0, a1, a2;
93
- int c, const_a2, vexop, rexw = 0;
94
+ int c, const_a2, vexop, rexw;
95
96
#if TCG_TARGET_REG_BITS == 64
97
# define OP_32_64(x) \
98
case glue(glue(INDEX_op_, x), _i64): \
99
- rexw = P_REXW; /* FALLTHRU */ \
100
case glue(glue(INDEX_op_, x), _i32)
101
#else
102
# define OP_32_64(x) \
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:
111
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
112
index XXXXXXX..XXXXXXX 100644
113
--- a/tcg/loongarch64/tcg-target.c.inc
114
+++ b/tcg/loongarch64/tcg-target.c.inc
115
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
116
flush_idcache_range(jmp_rx, jmp_rw, 4);
117
}
118
119
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
120
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
121
const TCGArg args[TCG_MAX_OP_ARGS],
122
const int const_args[TCG_MAX_OP_ARGS])
123
{
124
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
125
index XXXXXXX..XXXXXXX 100644
126
--- a/tcg/mips/tcg-target.c.inc
127
+++ b/tcg/mips/tcg-target.c.inc
128
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
129
/* Always indirect, nothing to do */
130
}
131
132
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
133
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
134
const TCGArg args[TCG_MAX_OP_ARGS],
135
const int const_args[TCG_MAX_OP_ARGS])
136
{
137
diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc
138
index XXXXXXX..XXXXXXX 100644
139
--- a/tcg/ppc/tcg-target.c.inc
140
+++ b/tcg/ppc/tcg-target.c.inc
141
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
142
flush_idcache_range(jmp_rx, jmp_rw, 4);
143
}
144
145
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
146
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
147
const TCGArg args[TCG_MAX_OP_ARGS],
148
const int const_args[TCG_MAX_OP_ARGS])
149
{
150
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
151
index XXXXXXX..XXXXXXX 100644
152
--- a/tcg/riscv/tcg-target.c.inc
153
+++ b/tcg/riscv/tcg-target.c.inc
154
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
155
flush_idcache_range(jmp_rx, jmp_rw, 4);
156
}
157
158
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
159
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
160
const TCGArg args[TCG_MAX_OP_ARGS],
161
const int const_args[TCG_MAX_OP_ARGS])
162
{
163
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
164
index XXXXXXX..XXXXXXX 100644
165
--- a/tcg/s390x/tcg-target.c.inc
166
+++ b/tcg/s390x/tcg-target.c.inc
167
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
168
case glue(glue(INDEX_op_,x),_i32): \
169
case glue(glue(INDEX_op_,x),_i64)
170
171
-static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
172
- const TCGArg args[TCG_MAX_OP_ARGS],
173
- const int const_args[TCG_MAX_OP_ARGS])
174
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
175
+ const TCGArg args[TCG_MAX_OP_ARGS],
176
+ const int const_args[TCG_MAX_OP_ARGS])
177
{
178
S390Opcode op, op2;
179
TCGArg a0, a1, a2;
180
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
181
/* Since we can't support "0Z" as a constraint, we allow a1 in
182
any register. Fix things up as if a matching constraint. */
183
if (a0 != a1) {
184
- TCGType type = (opc == INDEX_op_deposit_i64);
185
if (a0 == a2) {
186
tcg_out_mov(s, type, TCG_TMP0, a2);
187
a2 = TCG_TMP0;
188
diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc
189
index XXXXXXX..XXXXXXX 100644
190
--- a/tcg/sparc64/tcg-target.c.inc
191
+++ b/tcg/sparc64/tcg-target.c.inc
192
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
193
{
194
}
195
196
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
197
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
198
const TCGArg args[TCG_MAX_OP_ARGS],
199
const int const_args[TCG_MAX_OP_ARGS])
200
{
201
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
202
index XXXXXXX..XXXXXXX 100644
203
--- a/tcg/tci/tcg-target.c.inc
204
+++ b/tcg/tci/tcg-target.c.inc
205
@@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *tb, int n,
206
/* Always indirect, nothing to do */
207
}
208
209
-static void tcg_out_op(TCGContext *s, TCGOpcode opc,
210
+static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
211
const TCGArg args[TCG_MAX_OP_ARGS],
212
const int const_args[TCG_MAX_OP_ARGS])
213
{
214
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
215
CASE_32_64(sextract) /* Optional (TCG_TARGET_HAS_sextract_*). */
216
{
217
TCGArg pos = args[2], len = args[3];
218
- TCGArg max = tcg_op_defs[opc].flags & TCG_OPF_64BIT ? 64 : 32;
219
+ TCGArg max = type == TCG_TYPE_I32 ? 32 : 64;
220
221
tcg_debug_assert(pos < max);
222
tcg_debug_assert(pos + len <= max);
76
--
223
--
77
2.43.0
224
2.43.0
225
226
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
1
This flag is no longer used.
2
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
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
tcg/optimize.c | 13 ++++++++-----
6
include/tcg/tcg-opc.h | 22 +++++++++++-----------
7
1 file changed, 8 insertions(+), 5 deletions(-)
7
include/tcg/tcg.h | 2 --
8
2 files changed, 11 insertions(+), 13 deletions(-)
8
9
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
10
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
10
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
12
--- a/include/tcg/tcg-opc.h
12
+++ b/tcg/optimize.c
13
+++ b/include/tcg/tcg-opc.h
13
@@ -XXX,XX +XXX,XX @@ static bool fold_not(OptContext *ctx, TCGOp *op)
14
@@ -XXX,XX +XXX,XX @@ DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
14
15
15
static bool fold_or(OptContext *ctx, TCGOp *op)
16
#define IMPL(X) (__builtin_constant_p(X) && (X) <= 0 ? TCG_OPF_NOT_PRESENT : 0)
16
{
17
#if TCG_TARGET_REG_BITS == 32
17
+ uint64_t z_mask, s_mask;
18
-# define IMPL64 TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT
18
+ TempOptInfo *t1, *t2;
19
+# define IMPL64 TCG_OPF_NOT_PRESENT
19
+
20
#else
20
if (fold_const2_commutative(ctx, op) ||
21
-# define IMPL64 TCG_OPF_64BIT
21
fold_xi_to_x(ctx, op, 0) ||
22
+# define IMPL64 0
22
fold_xx_to_x(ctx, op)) {
23
#endif
23
return true;
24
24
}
25
DEF(mb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
25
26
@@ -XXX,XX +XXX,XX @@ DEF(clz_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_clz_i32))
26
- ctx->z_mask = arg_info(op->args[1])->z_mask
27
DEF(ctz_i32, 1, 2, 0, IMPL(TCG_TARGET_HAS_ctz_i32))
27
- | arg_info(op->args[2])->z_mask;
28
DEF(ctpop_i32, 1, 1, 0, IMPL(TCG_TARGET_HAS_ctpop_i32))
28
- ctx->s_mask = arg_info(op->args[1])->s_mask
29
29
- & arg_info(op->args[2])->s_mask;
30
-DEF(mov_i64, 1, 1, 0, TCG_OPF_64BIT | TCG_OPF_NOT_PRESENT)
30
- return fold_masks(ctx, op);
31
+DEF(mov_i64, 1, 1, 0, TCG_OPF_NOT_PRESENT)
31
+ t1 = arg_info(op->args[1]);
32
DEF(setcond_i64, 1, 2, 1, IMPL64)
32
+ t2 = arg_info(op->args[2]);
33
DEF(negsetcond_i64, 1, 2, 1, IMPL64 | IMPL(TCG_TARGET_HAS_negsetcond_i64))
33
+ z_mask = t1->z_mask | t2->z_mask;
34
DEF(movcond_i64, 1, 4, 1, IMPL64)
34
+ s_mask = t1->s_mask & t2->s_mask;
35
@@ -XXX,XX +XXX,XX @@ DEF(qemu_ld_a32_i32, 1, 1, 1,
35
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
36
DEF(qemu_st_a32_i32, 0, 1 + 1, 1,
36
}
37
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
37
38
DEF(qemu_ld_a32_i64, DATA64_ARGS, 1, 1,
38
static bool fold_orc(OptContext *ctx, TCGOp *op)
39
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
40
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
41
DEF(qemu_st_a32_i64, 0, DATA64_ARGS + 1, 1,
42
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
43
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
44
45
DEF(qemu_ld_a64_i32, 1, DATA64_ARGS, 1,
46
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
47
DEF(qemu_st_a64_i32, 0, 1 + DATA64_ARGS, 1,
48
TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
49
DEF(qemu_ld_a64_i64, DATA64_ARGS, DATA64_ARGS, 1,
50
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
51
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
52
DEF(qemu_st_a64_i64, 0, DATA64_ARGS + DATA64_ARGS, 1,
53
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT)
54
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
55
56
/* Only used by i386 to cope with stupid register constraints. */
57
DEF(qemu_st8_a32_i32, 0, 1 + 1, 1,
58
@@ -XXX,XX +XXX,XX @@ DEF(qemu_st8_a64_i32, 0, 1 + DATA64_ARGS, 1,
59
60
/* Only for 64-bit hosts at the moment. */
61
DEF(qemu_ld_a32_i128, 2, 1, 1,
62
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
63
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
64
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
65
DEF(qemu_ld_a64_i128, 2, 1, 1,
66
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
67
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
68
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
69
DEF(qemu_st_a32_i128, 0, 3, 1,
70
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
71
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
72
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
73
DEF(qemu_st_a64_i128, 0, 3, 1,
74
- TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS | TCG_OPF_64BIT |
75
+ TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS |
76
IMPL(TCG_TARGET_HAS_qemu_ldst_i128))
77
78
/* Host vector support. */
79
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
80
index XXXXXXX..XXXXXXX 100644
81
--- a/include/tcg/tcg.h
82
+++ b/include/tcg/tcg.h
83
@@ -XXX,XX +XXX,XX @@ enum {
84
/* Instruction has side effects: it cannot be removed if its outputs
85
are not used, and might trigger exceptions. */
86
TCG_OPF_SIDE_EFFECTS = 0x08,
87
- /* Instruction operands are 64-bits (otherwise 32-bits). */
88
- TCG_OPF_64BIT = 0x10,
89
/* Instruction is optional and not implemented by the host, or insn
90
is generic and should not be implemented by the host. */
91
TCG_OPF_NOT_PRESENT = 0x20,
39
--
92
--
40
2.43.0
93
2.43.0
94
95
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
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
2
4
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
7
---
6
tcg/optimize.c | 7 +------
8
include/tcg/tcg-opc.h | 306 +++++++++++++++++++-----------------------
7
1 file changed, 1 insertion(+), 6 deletions(-)
9
1 file changed, 141 insertions(+), 165 deletions(-)
8
10
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
10
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
13
--- a/include/tcg/tcg-opc.h
12
+++ b/tcg/optimize.c
14
+++ b/include/tcg/tcg-opc.h
13
@@ -XXX,XX +XXX,XX @@ static bool fold_not(OptContext *ctx, TCGOp *op)
15
@@ -XXX,XX +XXX,XX @@ DEF(call, 0, 0, 3, TCG_OPF_CALL_CLOBBER | TCG_OPF_NOT_PRESENT)
14
if (fold_const1(ctx, op)) {
16
15
return true;
17
DEF(br, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_NOT_PRESENT)
16
}
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
17
-
25
-
18
- ctx->s_mask = arg_info(op->args[1])->s_mask;
26
DEF(mb, 0, 0, 1, TCG_OPF_NOT_PRESENT)
19
-
27
20
- /* Because of fold_to_not, we want to always return true, via finish. */
28
DEF(mov_i32, 1, 1, 0, TCG_OPF_NOT_PRESENT)
21
- finish_folding(ctx, op);
29
DEF(setcond_i32, 1, 2, 1, 0)
22
- return true;
30
-DEF(negsetcond_i32, 1, 2, 1, IMPL(TCG_TARGET_HAS_negsetcond_i32))
23
+ return fold_masks_s(ctx, op, arg_info(op->args[1])->s_mask);
31
+DEF(negsetcond_i32, 1, 2, 1, 0)
24
}
32
DEF(movcond_i32, 1, 4, 1, 0)
25
33
/* load/store */
26
static bool fold_or(OptContext *ctx, TCGOp *op)
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
27
--
399
--
28
2.43.0
400
2.43.0
401
402
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
1
This is now a direct replacement.
2
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
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
tcg/optimize.c | 8 +++++---
6
include/tcg/tcg-opc.h | 89 +++++++++++++++-----------------
7
1 file changed, 5 insertions(+), 3 deletions(-)
7
tcg/aarch64/tcg-target-opc.h.inc | 4 +-
8
8
tcg/arm/tcg-target-opc.h.inc | 6 +--
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
tcg/i386/tcg-target-opc.h.inc | 22 ++++----
10
index XXXXXXX..XXXXXXX 100644
10
tcg/ppc/tcg-target-opc.h.inc | 12 ++---
11
--- a/tcg/optimize.c
11
tcg/s390x/tcg-target-opc.h.inc | 6 +--
12
+++ b/tcg/optimize.c
12
6 files changed, 68 insertions(+), 71 deletions(-)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_neg(OptContext *ctx, TCGOp *op)
13
14
14
diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h
15
static bool fold_nor(OptContext *ctx, TCGOp *op)
15
index XXXXXXX..XXXXXXX 100644
16
{
16
--- a/include/tcg/tcg-opc.h
17
+ uint64_t s_mask;
17
+++ b/include/tcg/tcg-opc.h
18
+
18
@@ -XXX,XX +XXX,XX @@ DEF(qemu_st_a64_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS)
19
if (fold_const2_commutative(ctx, op) ||
19
20
fold_xi_to_not(ctx, op, 0)) {
20
/* Host vector support. */
21
return true;
21
22
}
22
-#define IMPLVEC TCG_OPF_VECTOR
23
23
-
24
- ctx->s_mask = arg_info(op->args[1])->s_mask
24
DEF(mov_vec, 1, 1, 0, TCG_OPF_VECTOR | TCG_OPF_NOT_PRESENT)
25
- & arg_info(op->args[2])->s_mask;
25
26
- return false;
26
-DEF(dup_vec, 1, 1, 0, IMPLVEC)
27
+ s_mask = arg_info(op->args[1])->s_mask
27
-DEF(dup2_vec, 1, 2, 0, IMPLVEC)
28
+ & arg_info(op->args[2])->s_mask;
28
+DEF(dup_vec, 1, 1, 0, TCG_OPF_VECTOR)
29
+ return fold_masks_s(ctx, op, s_mask);
29
+DEF(dup2_vec, 1, 2, 0, TCG_OPF_VECTOR)
30
}
30
31
31
-DEF(ld_vec, 1, 1, 1, IMPLVEC)
32
static bool fold_not(OptContext *ctx, TCGOp *op)
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)
33
--
218
--
34
2.43.0
219
2.43.0
220
221
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
1
We always provide bswap subroutines, whether they are optimized
2
using mips32r2 when available or not.
2
3
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
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/optimize.c | 9 ++-------
7
tcg/mips/tcg-target-has.h | 8 ++++----
7
1 file changed, 2 insertions(+), 7 deletions(-)
8
1 file changed, 4 insertions(+), 4 deletions(-)
8
9
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
10
diff --git a/tcg/mips/tcg-target-has.h b/tcg/mips/tcg-target-has.h
10
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
12
--- a/tcg/mips/tcg-target-has.h
12
+++ b/tcg/optimize.c
13
+++ b/tcg/mips/tcg-target-has.h
13
@@ -XXX,XX +XXX,XX @@ static bool fold_neg_no_const(OptContext *ctx, TCGOp *op)
14
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
14
{
15
#define TCG_TARGET_HAS_muls2_i32 (!use_mips32r6_instructions)
15
/* Set to 1 all bits to the left of the rightmost. */
16
#define TCG_TARGET_HAS_muluh_i32 1
16
uint64_t z_mask = arg_info(op->args[1])->z_mask;
17
#define TCG_TARGET_HAS_mulsh_i32 1
17
- ctx->z_mask = -(z_mask & -z_mask);
18
+#define TCG_TARGET_HAS_bswap16_i32 1
18
+ z_mask = -(z_mask & -z_mask);
19
#define TCG_TARGET_HAS_bswap32_i32 1
19
20
#define TCG_TARGET_HAS_negsetcond_i32 0
20
- /*
21
21
- * Because of fold_sub_to_neg, we want to always return true,
22
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
22
- * via finish_folding.
23
#endif
23
- */
24
24
- finish_folding(ctx, op);
25
/* optional instructions detected at runtime */
25
- return true;
26
-#define TCG_TARGET_HAS_bswap16_i32 use_mips32r2_instructions
26
+ return fold_masks_z(ctx, op, z_mask);
27
#define TCG_TARGET_HAS_deposit_i32 use_mips32r2_instructions
27
}
28
#define TCG_TARGET_HAS_extract_i32 use_mips32r2_instructions
28
29
#define TCG_TARGET_HAS_sextract_i32 0
29
static bool fold_neg(OptContext *ctx, TCGOp *op)
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
30
--
43
--
31
2.43.0
44
2.43.0
45
46
diff view generated by jsdifflib
1
Add fold_masks_s as a trivial wrapper around fold_masks_zs.
1
When we generalize {s}extract_i32, we'll lose the
2
Avoid the use of the OptContext slots.
2
specific register constraints on ext8u and ext8s.
3
It's just as easy to emit a couple of insns instead.
3
4
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@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/optimize.c | 13 ++++++++++---
8
tcg/i386/tcg-target.c.inc | 23 +++++++++++++++++++----
8
1 file changed, 10 insertions(+), 3 deletions(-)
9
1 file changed, 19 insertions(+), 4 deletions(-)
9
10
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
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/tcg/optimize.c
13
--- a/tcg/i386/tcg-target.c.inc
13
+++ b/tcg/optimize.c
14
+++ b/tcg/i386/tcg-target.c.inc
14
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_z(OptContext *ctx, TCGOp *op, uint64_t z_mask)
15
@@ -XXX,XX +XXX,XX @@ static inline void tcg_out_rolw_8(TCGContext *s, int reg)
15
return fold_masks_zs(ctx, op, z_mask, 0);
16
17
static void tcg_out_ext8u(TCGContext *s, TCGReg dest, TCGReg src)
18
{
19
- /* movzbl */
20
- tcg_debug_assert(src < 4 || TCG_TARGET_REG_BITS == 64);
21
+ if (TCG_TARGET_REG_BITS == 32 && src >= 4) {
22
+ tcg_out_mov(s, TCG_TYPE_I32, dest, src);
23
+ if (dest >= 4) {
24
+ tcg_out_modrm(s, OPC_ARITH_EvIz, ARITH_AND, dest);
25
+ tcg_out32(s, 0xff);
26
+ return;
27
+ }
28
+ src = dest;
29
+ }
30
tcg_out_modrm(s, OPC_MOVZBL + P_REXB_RM, dest, src);
16
}
31
}
17
32
18
+static bool fold_masks_s(OptContext *ctx, TCGOp *op, uint64_t s_mask)
33
static void tcg_out_ext8s(TCGContext *s, TCGType type, TCGReg dest, TCGReg src)
19
+{
34
{
20
+ return fold_masks_zs(ctx, op, -1, s_mask);
35
int rexw = type == TCG_TYPE_I32 ? 0 : P_REXW;
21
+}
36
- /* movsbl */
37
- tcg_debug_assert(src < 4 || TCG_TARGET_REG_BITS == 64);
22
+
38
+
23
static bool fold_masks(OptContext *ctx, TCGOp *op)
39
+ if (TCG_TARGET_REG_BITS == 32 && src >= 4) {
24
{
40
+ tcg_out_mov(s, TCG_TYPE_I32, dest, src);
25
return fold_masks_zs(ctx, op, ctx->z_mask, ctx->s_mask);
41
+ if (dest >= 4) {
26
@@ -XXX,XX +XXX,XX @@ static bool fold_dup2(OptContext *ctx, TCGOp *op)
42
+ tcg_out_shifti(s, SHIFT_SHL, dest, 24);
27
43
+ tcg_out_shifti(s, SHIFT_SAR, dest, 24);
28
static bool fold_eqv(OptContext *ctx, TCGOp *op)
44
+ return;
29
{
45
+ }
30
+ uint64_t s_mask;
46
+ src = dest;
31
+
47
+ }
32
if (fold_const2_commutative(ctx, op) ||
48
tcg_out_modrm(s, OPC_MOVSBL + P_REXB_RM + rexw, dest, src);
33
fold_xi_to_x(ctx, op, -1) ||
34
fold_xi_to_not(ctx, op, 0)) {
35
return true;
36
}
37
38
- ctx->s_mask = arg_info(op->args[1])->s_mask
39
- & arg_info(op->args[2])->s_mask;
40
- return false;
41
+ s_mask = arg_info(op->args[1])->s_mask
42
+ & arg_info(op->args[2])->s_mask;
43
+ return fold_masks_s(ctx, op, s_mask);
44
}
49
}
45
50
46
static bool fold_extract(OptContext *ctx, TCGOp *op)
47
--
51
--
48
2.43.0
52
2.43.0
53
54
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
1
Accept byte and word extensions with the extract opcodes.
2
2
This is preparatory to removing the specialized extracts.
3
Be careful not to call fold_masks_zs when the memory operation
3
4
is wide enough to require multiple outputs, so split into two
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
functions: fold_qemu_ld_1reg and fold_qemu_ld_2reg.
6
7
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
---
6
---
10
tcg/optimize.c | 26 +++++++++++++++++++++-----
7
tcg/i386/tcg-target-has.h | 49 +++++++++++++++++++++++++++----
11
1 file changed, 21 insertions(+), 5 deletions(-)
8
tcg/tcg-has.h | 12 +++++---
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. */
13
diff --git a/tcg/optimize.c b/tcg/optimize.c
104
diff --git a/tcg/optimize.c b/tcg/optimize.c
14
index XXXXXXX..XXXXXXX 100644
105
index XXXXXXX..XXXXXXX 100644
15
--- a/tcg/optimize.c
106
--- a/tcg/optimize.c
16
+++ b/tcg/optimize.c
107
+++ b/tcg/optimize.c
17
@@ -XXX,XX +XXX,XX @@ static bool fold_orc(OptContext *ctx, TCGOp *op)
108
@@ -XXX,XX +XXX,XX @@ static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
18
return fold_masks_s(ctx, op, s_mask);
109
xor_opc = INDEX_op_xor_i32;
19
}
110
shr_opc = INDEX_op_shr_i32;
20
111
neg_opc = INDEX_op_neg_i32;
21
-static bool fold_qemu_ld(OptContext *ctx, TCGOp *op)
112
- if (TCG_TARGET_extract_i32_valid(sh, 1)) {
22
+static bool fold_qemu_ld_1reg(OptContext *ctx, TCGOp *op)
113
+ if (TCG_TARGET_extract_valid(TCG_TYPE_I32, sh, 1)) {
23
{
114
uext_opc = TCG_TARGET_HAS_extract_i32 ? INDEX_op_extract_i32 : 0;
24
const TCGOpDef *def = &tcg_op_defs[op->opc];
115
+ }
25
MemOpIdx oi = op->args[def->nb_oargs + def->nb_iargs];
116
+ if (TCG_TARGET_sextract_valid(TCG_TYPE_I32, sh, 1)) {
26
MemOp mop = get_memop(oi);
117
sext_opc = TCG_TARGET_HAS_sextract_i32 ? INDEX_op_sextract_i32 : 0;
27
int width = 8 * memop_size(mop);
118
}
28
+ uint64_t z_mask = -1, s_mask = 0;
119
break;
29
120
@@ -XXX,XX +XXX,XX @@ static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
30
if (width < 64) {
121
xor_opc = INDEX_op_xor_i64;
31
if (mop & MO_SIGN) {
122
shr_opc = INDEX_op_shr_i64;
32
- ctx->s_mask = MAKE_64BIT_MASK(width, 64 - width);
123
neg_opc = INDEX_op_neg_i64;
33
+ s_mask = MAKE_64BIT_MASK(width - 1, 64 - (width - 1));
124
- if (TCG_TARGET_extract_i64_valid(sh, 1)) {
34
} else {
125
+ if (TCG_TARGET_extract_valid(TCG_TYPE_I64, sh, 1)) {
35
- ctx->z_mask = MAKE_64BIT_MASK(0, width);
126
uext_opc = TCG_TARGET_HAS_extract_i64 ? INDEX_op_extract_i64 : 0;
36
+ z_mask = MAKE_64BIT_MASK(0, width);
127
+ }
37
}
128
+ if (TCG_TARGET_sextract_valid(TCG_TYPE_I64, sh, 1)) {
38
}
129
sext_opc = TCG_TARGET_HAS_sextract_i64 ? INDEX_op_sextract_i64 : 0;
39
130
}
40
/* Opcodes that touch guest memory stop the mb optimization. */
131
break;
41
ctx->prev_mb = NULL;
132
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
42
- return false;
133
index XXXXXXX..XXXXXXX 100644
43
+
134
--- a/tcg/tcg-op.c
44
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
135
+++ b/tcg/tcg-op.c
45
+}
136
@@ -XXX,XX +XXX,XX @@ void tcg_gen_extract_i32(TCGv_i32 ret, TCGv_i32 arg,
46
+
137
return;
47
+static bool fold_qemu_ld_2reg(OptContext *ctx, TCGOp *op)
138
}
48
+{
139
49
+ /* Opcodes that touch guest memory stop the mb optimization. */
140
- if (TCG_TARGET_HAS_extract_i32
50
+ ctx->prev_mb = NULL;
141
- && TCG_TARGET_extract_i32_valid(ofs, len)) {
51
+ return finish_folding(ctx, op);
142
+ if (TCG_TARGET_extract_valid(TCG_TYPE_I32, ofs, len)) {
52
}
143
tcg_gen_op4ii_i32(INDEX_op_extract_i32, ret, arg, ofs, len);
53
144
return;
54
static bool fold_qemu_st(OptContext *ctx, TCGOp *op)
145
}
55
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
146
@@ -XXX,XX +XXX,XX @@ void tcg_gen_sextract_i32(TCGv_i32 ret, TCGv_i32 arg,
56
break;
147
}
57
case INDEX_op_qemu_ld_a32_i32:
148
}
58
case INDEX_op_qemu_ld_a64_i32:
149
59
+ done = fold_qemu_ld_1reg(&ctx, op);
150
- if (TCG_TARGET_HAS_sextract_i32
60
+ break;
151
- && TCG_TARGET_extract_i32_valid(ofs, len)) {
61
case INDEX_op_qemu_ld_a32_i64:
152
+ if (TCG_TARGET_sextract_valid(TCG_TYPE_I32, ofs, len)) {
62
case INDEX_op_qemu_ld_a64_i64:
153
tcg_gen_op4ii_i32(INDEX_op_sextract_i32, ret, arg, ofs, len);
63
+ if (TCG_TARGET_REG_BITS == 64) {
154
return;
64
+ done = fold_qemu_ld_1reg(&ctx, op);
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);
65
+ break;
186
+ break;
66
+ }
187
+ }
67
+ QEMU_FALLTHROUGH;
188
/* This is a 32-bit zero-extending right shift. */
68
case INDEX_op_qemu_ld_a32_i128:
189
tcg_out_mov(s, TCG_TYPE_I32, a0, a1);
69
case INDEX_op_qemu_ld_a64_i128:
190
tcg_out_shifti(s, SHIFT_SHR, a0, a2);
70
- done = fold_qemu_ld(&ctx, op);
191
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
71
+ done = fold_qemu_ld_2reg(&ctx, op);
192
}
72
break;
193
/* FALLTHRU */
73
case INDEX_op_qemu_st8_a32_i32:
194
case INDEX_op_extract_i32:
74
case INDEX_op_qemu_st8_a64_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);
75
--
269
--
76
2.43.0
270
2.43.0
271
272
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
1
Trivially mirrors TCG_TARGET_HAS_{s}extract_*.
2
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
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
tcg/optimize.c | 8 +++++---
6
tcg/aarch64/tcg-target-has.h | 3 +++
7
1 file changed, 5 insertions(+), 3 deletions(-)
7
1 file changed, 3 insertions(+)
8
8
9
diff --git a/tcg/optimize.c b/tcg/optimize.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/tcg/optimize.c
11
--- a/tcg/aarch64/tcg-target-has.h
12
+++ b/tcg/optimize.c
12
+++ b/tcg/aarch64/tcg-target-has.h
13
@@ -XXX,XX +XXX,XX @@ static bool fold_multiply2(OptContext *ctx, TCGOp *op)
13
@@ -XXX,XX +XXX,XX @@
14
14
#define TCG_TARGET_HAS_cmpsel_vec 0
15
static bool fold_nand(OptContext *ctx, TCGOp *op)
15
#define TCG_TARGET_HAS_tst_vec 1
16
{
16
17
+ uint64_t s_mask;
17
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
18
+#define TCG_TARGET_sextract_valid(type, ofs, len) 1
18
+
19
+
19
if (fold_const2_commutative(ctx, op) ||
20
#endif
20
fold_xi_to_not(ctx, op, -1)) {
21
return true;
22
}
23
24
- ctx->s_mask = arg_info(op->args[1])->s_mask
25
- & arg_info(op->args[2])->s_mask;
26
- return false;
27
+ s_mask = arg_info(op->args[1])->s_mask
28
+ & arg_info(op->args[2])->s_mask;
29
+ return fold_masks_s(ctx, op, s_mask);
30
}
31
32
static bool fold_neg_no_const(OptContext *ctx, TCGOp *op)
33
--
21
--
34
2.43.0
22
2.43.0
23
24
diff view generated by jsdifflib
1
We currently have a flag, float_muladd_halve_result, to scale
1
We're about to change canonicalization of masks as extract
2
the result by 2**-1. Extend this to handle arbitrary scaling.
2
instead of and. Retain the andi expansion here.
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
include/fpu/softfloat.h | 6 ++++
7
tcg/aarch64/tcg-target.c.inc | 7 ++++++-
8
fpu/softfloat.c | 58 ++++++++++++++++++++++-----------------
8
1 file changed, 6 insertions(+), 1 deletion(-)
9
fpu/softfloat-parts.c.inc | 7 +++--
10
3 files changed, 44 insertions(+), 27 deletions(-)
11
9
12
diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
10
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
13
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
14
--- a/include/fpu/softfloat.h
12
--- a/tcg/aarch64/tcg-target.c.inc
15
+++ b/include/fpu/softfloat.h
13
+++ b/tcg/aarch64/tcg-target.c.inc
16
@@ -XXX,XX +XXX,XX @@ float16 float16_add(float16, float16, float_status *status);
14
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext,
17
float16 float16_sub(float16, float16, float_status *status);
15
18
float16 float16_mul(float16, float16, float_status *status);
16
case INDEX_op_extract_i64:
19
float16 float16_muladd(float16, float16, float16, int, float_status *status);
17
case INDEX_op_extract_i32:
20
+float16 float16_muladd_scalbn(float16, float16, float16,
18
- tcg_out_ubfm(s, ext, a0, a1, a2, a2 + args[3] - 1);
21
+ int, int, float_status *status);
19
+ if (a2 == 0) {
22
float16 float16_div(float16, float16, float_status *status);
20
+ uint64_t mask = MAKE_64BIT_MASK(0, args[3]);
23
float16 float16_scalbn(float16, int, float_status *status);
21
+ tcg_out_logicali(s, I3404_ANDI, ext, a0, a1, mask);
24
float16 float16_min(float16, float16, float_status *status);
22
+ } else {
25
@@ -XXX,XX +XXX,XX @@ float32 float32_mul(float32, float32, float_status *status);
23
+ tcg_out_ubfm(s, ext, a0, a1, a2, a2 + args[3] - 1);
26
float32 float32_div(float32, float32, float_status *status);
24
+ }
27
float32 float32_rem(float32, float32, float_status *status);
25
break;
28
float32 float32_muladd(float32, float32, float32, int, float_status *status);
26
29
+float32 float32_muladd_scalbn(float32, float32, float32,
27
case INDEX_op_sextract_i64:
30
+ int, int, float_status *status);
31
float32 float32_sqrt(float32, float_status *status);
32
float32 float32_exp2(float32, float_status *status);
33
float32 float32_log2(float32, float_status *status);
34
@@ -XXX,XX +XXX,XX @@ float64 float64_mul(float64, float64, float_status *status);
35
float64 float64_div(float64, float64, float_status *status);
36
float64 float64_rem(float64, float64, float_status *status);
37
float64 float64_muladd(float64, float64, float64, int, float_status *status);
38
+float64 float64_muladd_scalbn(float64, float64, float64,
39
+ int, int, float_status *status);
40
float64 float64_sqrt(float64, float_status *status);
41
float64 float64_log2(float64, float_status *status);
42
FloatRelation float64_compare(float64, float64, float_status *status);
43
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/fpu/softfloat.c
46
+++ b/fpu/softfloat.c
47
@@ -XXX,XX +XXX,XX @@ static FloatParts128 *parts128_mul(FloatParts128 *a, FloatParts128 *b,
48
#define parts_mul(A, B, S) \
49
PARTS_GENERIC_64_128(mul, A)(A, B, S)
50
51
-static FloatParts64 *parts64_muladd(FloatParts64 *a, FloatParts64 *b,
52
- FloatParts64 *c, int flags,
53
- float_status *s);
54
-static FloatParts128 *parts128_muladd(FloatParts128 *a, FloatParts128 *b,
55
- FloatParts128 *c, int flags,
56
- float_status *s);
57
+static FloatParts64 *parts64_muladd_scalbn(FloatParts64 *a, FloatParts64 *b,
58
+ FloatParts64 *c, int scale,
59
+ int flags, float_status *s);
60
+static FloatParts128 *parts128_muladd_scalbn(FloatParts128 *a, FloatParts128 *b,
61
+ FloatParts128 *c, int scale,
62
+ int flags, float_status *s);
63
64
-#define parts_muladd(A, B, C, Z, S) \
65
- PARTS_GENERIC_64_128(muladd, A)(A, B, C, Z, S)
66
+#define parts_muladd_scalbn(A, B, C, Z, Y, S) \
67
+ PARTS_GENERIC_64_128(muladd_scalbn, A)(A, B, C, Z, Y, S)
68
69
static FloatParts64 *parts64_div(FloatParts64 *a, FloatParts64 *b,
70
float_status *s);
71
@@ -XXX,XX +XXX,XX @@ floatx80_mul(floatx80 a, floatx80 b, float_status *status)
72
* Fused multiply-add
73
*/
74
75
-float16 QEMU_FLATTEN float16_muladd(float16 a, float16 b, float16 c,
76
- int flags, float_status *status)
77
+float16 QEMU_FLATTEN
78
+float16_muladd_scalbn(float16 a, float16 b, float16 c,
79
+ int scale, int flags, float_status *status)
80
{
81
FloatParts64 pa, pb, pc, *pr;
82
83
float16_unpack_canonical(&pa, a, status);
84
float16_unpack_canonical(&pb, b, status);
85
float16_unpack_canonical(&pc, c, status);
86
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
87
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, scale, flags, status);
88
89
return float16_round_pack_canonical(pr, status);
90
}
91
92
-static float32 QEMU_SOFTFLOAT_ATTR
93
-soft_f32_muladd(float32 a, float32 b, float32 c, int flags,
94
- float_status *status)
95
+float16 float16_muladd(float16 a, float16 b, float16 c,
96
+ int flags, float_status *status)
97
+{
98
+ return float16_muladd_scalbn(a, b, c, 0, flags, status);
99
+}
100
+
101
+float32 QEMU_SOFTFLOAT_ATTR
102
+float32_muladd_scalbn(float32 a, float32 b, float32 c,
103
+ int scale, int flags, float_status *status)
104
{
105
FloatParts64 pa, pb, pc, *pr;
106
107
float32_unpack_canonical(&pa, a, status);
108
float32_unpack_canonical(&pb, b, status);
109
float32_unpack_canonical(&pc, c, status);
110
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
111
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, scale, flags, status);
112
113
return float32_round_pack_canonical(pr, status);
114
}
115
116
-static float64 QEMU_SOFTFLOAT_ATTR
117
-soft_f64_muladd(float64 a, float64 b, float64 c, int flags,
118
- float_status *status)
119
+float64 QEMU_SOFTFLOAT_ATTR
120
+float64_muladd_scalbn(float64 a, float64 b, float64 c,
121
+ int scale, int flags, float_status *status)
122
{
123
FloatParts64 pa, pb, pc, *pr;
124
125
float64_unpack_canonical(&pa, a, status);
126
float64_unpack_canonical(&pb, b, status);
127
float64_unpack_canonical(&pc, c, status);
128
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
129
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, scale, flags, status);
130
131
return float64_round_pack_canonical(pr, status);
132
}
133
@@ -XXX,XX +XXX,XX @@ float32_muladd(float32 xa, float32 xb, float32 xc, int flags, float_status *s)
134
return ur.s;
135
136
soft:
137
- return soft_f32_muladd(ua.s, ub.s, uc.s, flags, s);
138
+ return float32_muladd_scalbn(ua.s, ub.s, uc.s, 0, flags, s);
139
}
140
141
float64 QEMU_FLATTEN
142
@@ -XXX,XX +XXX,XX @@ float64_muladd(float64 xa, float64 xb, float64 xc, int flags, float_status *s)
143
return ur.s;
144
145
soft:
146
- return soft_f64_muladd(ua.s, ub.s, uc.s, flags, s);
147
+ return float64_muladd_scalbn(ua.s, ub.s, uc.s, 0, flags, s);
148
}
149
150
float64 float64r32_muladd(float64 a, float64 b, float64 c,
151
@@ -XXX,XX +XXX,XX @@ float64 float64r32_muladd(float64 a, float64 b, float64 c,
152
float64_unpack_canonical(&pa, a, status);
153
float64_unpack_canonical(&pb, b, status);
154
float64_unpack_canonical(&pc, c, status);
155
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
156
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, 0, flags, status);
157
158
return float64r32_round_pack_canonical(pr, status);
159
}
160
@@ -XXX,XX +XXX,XX @@ bfloat16 QEMU_FLATTEN bfloat16_muladd(bfloat16 a, bfloat16 b, bfloat16 c,
161
bfloat16_unpack_canonical(&pa, a, status);
162
bfloat16_unpack_canonical(&pb, b, status);
163
bfloat16_unpack_canonical(&pc, c, status);
164
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
165
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, 0, flags, status);
166
167
return bfloat16_round_pack_canonical(pr, status);
168
}
169
@@ -XXX,XX +XXX,XX @@ float128 QEMU_FLATTEN float128_muladd(float128 a, float128 b, float128 c,
170
float128_unpack_canonical(&pa, a, status);
171
float128_unpack_canonical(&pb, b, status);
172
float128_unpack_canonical(&pc, c, status);
173
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
174
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, 0, flags, status);
175
176
return float128_round_pack_canonical(pr, status);
177
}
178
@@ -XXX,XX +XXX,XX @@ float32 float32_exp2(float32 a, float_status *status)
179
180
float64_unpack_canonical(&rp, float64_one, status);
181
for (i = 0 ; i < 15 ; i++) {
182
+
183
float64_unpack_canonical(&tp, float32_exp2_coefficients[i], status);
184
- rp = *parts_muladd(&tp, &xnp, &rp, 0, status);
185
+ rp = *parts_muladd_scalbn(&tp, &xnp, &rp, 0, 0, status);
186
xnp = *parts_mul(&xnp, &xp, status);
187
}
188
189
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
190
index XXXXXXX..XXXXXXX 100644
191
--- a/fpu/softfloat-parts.c.inc
192
+++ b/fpu/softfloat-parts.c.inc
193
@@ -XXX,XX +XXX,XX @@ static FloatPartsN *partsN(mul)(FloatPartsN *a, FloatPartsN *b,
194
* Requires A and C extracted into a double-sized structure to provide the
195
* extra space for the widening multiply.
196
*/
197
-static FloatPartsN *partsN(muladd)(FloatPartsN *a, FloatPartsN *b,
198
- FloatPartsN *c, int flags, float_status *s)
199
+static FloatPartsN *partsN(muladd_scalbn)(FloatPartsN *a, FloatPartsN *b,
200
+ FloatPartsN *c, int scale,
201
+ int flags, float_status *s)
202
{
203
int ab_mask, abc_mask;
204
FloatPartsW p_widen, c_widen;
205
@@ -XXX,XX +XXX,XX @@ static FloatPartsN *partsN(muladd)(FloatPartsN *a, FloatPartsN *b,
206
a->exp = p_widen.exp;
207
208
return_normal:
209
+ /* TODO: Replace all use of float_muladd_halve_result with scale. */
210
if (flags & float_muladd_halve_result) {
211
a->exp -= 1;
212
}
213
+ a->exp += scale;
214
finish_sign:
215
if (flags & float_muladd_negate_result) {
216
a->sign ^= 1;
217
--
28
--
218
2.43.0
29
2.43.0
219
30
220
31
diff view generated by jsdifflib
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
The armv6 uxt and sxt opcodes have a 2-bit rotate field
2
which supports extractions from ofs = {0,8,16,24}.
3
Special case ofs = 0, len <= 8 as AND.
4
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
7
---
4
tcg/optimize.c | 4 ++--
8
tcg/arm/tcg-target-has.h | 21 ++++++++++++++--
5
1 file changed, 2 insertions(+), 2 deletions(-)
9
tcg/arm/tcg-target.c.inc | 54 +++++++++++++++++++++++++++++++++++-----
10
2 files changed, 67 insertions(+), 8 deletions(-)
6
11
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
diff --git a/tcg/arm/tcg-target-has.h b/tcg/arm/tcg-target-has.h
8
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/optimize.c
14
--- a/tcg/arm/tcg-target-has.h
10
+++ b/tcg/optimize.c
15
+++ b/tcg/arm/tcg-target-has.h
11
@@ -XXX,XX +XXX,XX @@ static bool fold_dup(OptContext *ctx, TCGOp *op)
16
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
12
t = dup_const(TCGOP_VECE(op), t);
17
#define TCG_TARGET_HAS_ctz_i32 use_armv7_instructions
13
return tcg_opt_gen_movi(ctx, op, op->args[0], t);
18
#define TCG_TARGET_HAS_ctpop_i32 0
14
}
19
#define TCG_TARGET_HAS_deposit_i32 use_armv7_instructions
15
- return false;
20
-#define TCG_TARGET_HAS_extract_i32 use_armv7_instructions
16
+ return finish_folding(ctx, op);
21
-#define TCG_TARGET_HAS_sextract_i32 use_armv7_instructions
22
+#define TCG_TARGET_HAS_extract_i32 1
23
+#define TCG_TARGET_HAS_sextract_i32 1
24
#define TCG_TARGET_HAS_extract2_i32 1
25
#define TCG_TARGET_HAS_negsetcond_i32 1
26
#define TCG_TARGET_HAS_mulu2_i32 1
27
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
28
#define TCG_TARGET_HAS_cmpsel_vec 0
29
#define TCG_TARGET_HAS_tst_vec 1
30
31
+static inline bool
32
+tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
33
+{
34
+ if (use_armv7_instructions) {
35
+ return true; /* SBFX or UBFX */
36
+ }
37
+ switch (len) {
38
+ case 8: /* SXTB or UXTB */
39
+ case 16: /* SXTH or UXTH */
40
+ return (ofs % 8) == 0;
41
+ }
42
+ return false;
43
+}
44
+
45
+#define TCG_TARGET_extract_valid tcg_target_extract_valid
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)
56
{
57
- /* ubfx */
58
- tcg_out32(s, 0x07e00050 | (cond << 28) | (rd << 12) | rn
59
- | (ofs << 7) | ((len - 1) << 16));
60
+ /* According to gcc, AND can be faster. */
61
+ if (ofs == 0 && len <= 8) {
62
+ tcg_out_dat_imm(s, cond, ARITH_AND, rd, rn,
63
+ encode_imm_nofail((1 << len) - 1));
64
+ return;
65
+ }
66
+
67
+ if (use_armv7_instructions) {
68
+ /* ubfx */
69
+ tcg_out32(s, 0x07e00050 | (cond << 28) | (rd << 12) | rn
70
+ | (ofs << 7) | ((len - 1) << 16));
71
+ return;
72
+ }
73
+
74
+ assert(ofs % 8 == 0);
75
+ switch (len) {
76
+ case 8:
77
+ /* uxtb */
78
+ tcg_out32(s, 0x06ef0070 | (cond << 28) | (rd << 12) | (ofs << 7) | rn);
79
+ break;
80
+ case 16:
81
+ /* uxth */
82
+ tcg_out32(s, 0x06ff0070 | (cond << 28) | (rd << 12) | (ofs << 7) | rn);
83
+ break;
84
+ default:
85
+ g_assert_not_reached();
86
+ }
17
}
87
}
18
88
19
static bool fold_dup2(OptContext *ctx, TCGOp *op)
89
static void tcg_out_sextract(TCGContext *s, ARMCond cond, TCGReg rd,
20
@@ -XXX,XX +XXX,XX @@ static bool fold_dup2(OptContext *ctx, TCGOp *op)
90
TCGReg rn, int ofs, int len)
21
op->opc = INDEX_op_dup_vec;
91
{
22
TCGOP_VECE(op) = MO_32;
92
- /* sbfx */
23
}
93
- tcg_out32(s, 0x07a00050 | (cond << 28) | (rd << 12) | rn
24
- return false;
94
- | (ofs << 7) | ((len - 1) << 16));
25
+ return finish_folding(ctx, op);
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
+ }
26
}
115
}
27
116
28
static bool fold_eqv(OptContext *ctx, TCGOp *op)
117
+
118
static void tcg_out_ld32u(TCGContext *s, ARMCond cond,
119
TCGReg rd, TCGReg rn, int32_t offset)
120
{
29
--
121
--
30
2.43.0
122
2.43.0
123
124
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
1
Accept byte and word extensions with the extract opcodes.
2
Always set s_mask along the BSWAP_OS path, since the result is
2
This is preparatory to removing the specialized extracts.
3
being explicitly sign-extended.
4
3
5
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@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/optimize.c | 21 ++++++++++-----------
7
tcg/loongarch64/tcg-target-has.h | 15 ++++++++++++--
9
1 file changed, 10 insertions(+), 11 deletions(-)
8
tcg/loongarch64/tcg-target.c.inc | 34 ++++++++++++++++++++++++++++++--
9
2 files changed, 45 insertions(+), 4 deletions(-)
10
10
11
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
diff --git a/tcg/loongarch64/tcg-target-has.h b/tcg/loongarch64/tcg-target-has.h
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/optimize.c
13
--- a/tcg/loongarch64/tcg-target-has.h
14
+++ b/tcg/optimize.c
14
+++ b/tcg/loongarch64/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@ static bool fold_brcond2(OptContext *ctx, TCGOp *op)
15
@@ -XXX,XX +XXX,XX @@
16
static bool fold_bswap(OptContext *ctx, TCGOp *op)
16
#define TCG_TARGET_HAS_rot_i32 1
17
{
17
#define TCG_TARGET_HAS_deposit_i32 1
18
uint64_t z_mask, s_mask, sign;
18
#define TCG_TARGET_HAS_extract_i32 1
19
+ TempOptInfo *t1 = arg_info(op->args[1]);
19
-#define TCG_TARGET_HAS_sextract_i32 0
20
20
+#define TCG_TARGET_HAS_sextract_i32 1
21
- if (arg_is_const(op->args[1])) {
21
#define TCG_TARGET_HAS_extract2_i32 0
22
- uint64_t t = arg_info(op->args[1])->val;
22
#define TCG_TARGET_HAS_add2_i32 0
23
-
23
#define TCG_TARGET_HAS_sub2_i32 0
24
- t = do_constant_folding(op->opc, ctx->type, t, op->args[2]);
24
@@ -XXX,XX +XXX,XX @@
25
- return tcg_opt_gen_movi(ctx, op, op->args[0], t);
25
#define TCG_TARGET_HAS_rot_i64 1
26
+ if (ti_is_const(t1)) {
26
#define TCG_TARGET_HAS_deposit_i64 1
27
+ return tcg_opt_gen_movi(ctx, op, op->args[0],
27
#define TCG_TARGET_HAS_extract_i64 1
28
+ do_constant_folding(op->opc, ctx->type,
28
-#define TCG_TARGET_HAS_sextract_i64 0
29
+ ti_const_val(t1),
29
+#define TCG_TARGET_HAS_sextract_i64 1
30
+ op->args[2]));
30
#define TCG_TARGET_HAS_extract2_i64 0
31
}
31
#define TCG_TARGET_HAS_extr_i64_i32 1
32
32
#define TCG_TARGET_HAS_ext8s_i64 1
33
- z_mask = arg_info(op->args[1])->z_mask;
33
@@ -XXX,XX +XXX,XX @@
34
-
34
#define TCG_TARGET_HAS_cmpsel_vec 0
35
+ z_mask = t1->z_mask;
35
#define TCG_TARGET_HAS_tst_vec 0
36
switch (op->opc) {
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:
37
case INDEX_op_bswap16_i32:
101
case INDEX_op_bswap16_i32:
38
case INDEX_op_bswap16_i64:
102
case INDEX_op_bswap16_i64:
39
@@ -XXX,XX +XXX,XX @@ static bool fold_bswap(OptContext *ctx, TCGOp *op)
103
case INDEX_op_bswap32_i32:
40
/* If the sign bit may be 1, force all the bits above to 1. */
41
if (z_mask & sign) {
42
z_mask |= sign;
43
- s_mask = sign << 1;
44
}
45
+ /* The value and therefore s_mask is explicitly sign-extended. */
46
+ s_mask = sign;
47
break;
48
default:
49
/* The high bits are undefined: force all bits above the sign to 1. */
50
z_mask |= sign << 1;
51
break;
52
}
53
- ctx->z_mask = z_mask;
54
- ctx->s_mask = s_mask;
55
56
- return fold_masks(ctx, op);
57
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
58
}
59
60
static bool fold_call(OptContext *ctx, TCGOp *op)
61
--
104
--
62
2.43.0
105
2.43.0
106
107
diff view generated by jsdifflib
1
There are only a few logical operations which can compute
1
Accept AND, ext32u, ext32s extensions with the extract opcodes.
2
an "affected" mask. Split out handling of this optimization
2
This is preparatory to removing the specialized extracts.
3
to a separate function, only to be called when applicable.
4
3
5
Remove the a_mask field from OptContext, as the mask is
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
no longer stored anywhere.
7
8
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
---
6
---
11
tcg/optimize.c | 42 +++++++++++++++++++++++++++---------------
7
tcg/mips/tcg-target-has.h | 26 ++++++++++++++++++++++----
12
1 file changed, 27 insertions(+), 15 deletions(-)
8
tcg/mips/tcg-target.c.inc | 33 ++++++++++++++++++++++++++++++---
9
2 files changed, 52 insertions(+), 7 deletions(-)
13
10
14
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
diff --git a/tcg/mips/tcg-target-has.h b/tcg/mips/tcg-target-has.h
15
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
16
--- a/tcg/optimize.c
13
--- a/tcg/mips/tcg-target-has.h
17
+++ b/tcg/optimize.c
14
+++ b/tcg/mips/tcg-target-has.h
18
@@ -XXX,XX +XXX,XX @@ typedef struct OptContext {
15
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
19
QSIMPLEQ_HEAD(, MemCopyInfo) mem_free;
16
20
17
/* optional instructions detected at runtime */
21
/* In flight values from optimization. */
18
#define TCG_TARGET_HAS_deposit_i32 use_mips32r2_instructions
22
- uint64_t a_mask; /* mask bit is 0 iff value identical to first input */
19
-#define TCG_TARGET_HAS_extract_i32 use_mips32r2_instructions
23
uint64_t z_mask; /* mask bit is 0 iff value bit is 0 */
20
-#define TCG_TARGET_HAS_sextract_i32 0
24
uint64_t s_mask; /* mask of clrsb(value) bits */
21
+#define TCG_TARGET_HAS_extract_i32 1
25
TCGType type;
22
+#define TCG_TARGET_HAS_sextract_i32 1
26
@@ -XXX,XX +XXX,XX @@ static bool fold_const2_commutative(OptContext *ctx, TCGOp *op)
23
#define TCG_TARGET_HAS_extract2_i32 0
27
24
#define TCG_TARGET_HAS_ext8s_i32 use_mips32r2_instructions
28
static bool fold_masks(OptContext *ctx, TCGOp *op)
25
#define TCG_TARGET_HAS_ext16s_i32 use_mips32r2_instructions
29
{
26
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
30
- uint64_t a_mask = ctx->a_mask;
27
#define TCG_TARGET_HAS_bswap32_i64 1
31
uint64_t z_mask = ctx->z_mask;
28
#define TCG_TARGET_HAS_bswap64_i64 1
32
uint64_t s_mask = ctx->s_mask;
29
#define TCG_TARGET_HAS_deposit_i64 use_mips32r2_instructions
33
30
-#define TCG_TARGET_HAS_extract_i64 use_mips32r2_instructions
34
@@ -XXX,XX +XXX,XX @@ static bool fold_masks(OptContext *ctx, TCGOp *op)
31
-#define TCG_TARGET_HAS_sextract_i64 0
35
* type changing opcodes.
32
+#define TCG_TARGET_HAS_extract_i64 1
36
*/
33
+#define TCG_TARGET_HAS_sextract_i64 1
37
if (ctx->type == TCG_TYPE_I32) {
34
#define TCG_TARGET_HAS_extract2_i64 0
38
- a_mask = (int32_t)a_mask;
35
#define TCG_TARGET_HAS_ext8s_i64 use_mips32r2_instructions
39
z_mask = (int32_t)z_mask;
36
#define TCG_TARGET_HAS_ext16s_i64 use_mips32r2_instructions
40
s_mask |= MAKE_64BIT_MASK(32, 32);
37
@@ -XXX,XX +XXX,XX @@ extern bool use_mips32r2_instructions;
41
ctx->z_mask = z_mask;
38
#define TCG_TARGET_HAS_qemu_ldst_i128 0
42
@@ -XXX,XX +XXX,XX @@ static bool fold_masks(OptContext *ctx, TCGOp *op)
39
#define TCG_TARGET_HAS_tst 0
43
if (z_mask == 0) {
40
44
return tcg_opt_gen_movi(ctx, op, op->args[0], 0);
41
+#define TCG_TARGET_extract_valid(type, ofs, len) use_mips32r2_instructions
45
}
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
+ }
46
+ return false;
55
+ return false;
47
+}
56
+}
57
+#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
48
+
58
+
49
+/*
59
#endif
50
+ * An "affected" mask bit is 0 if and only if the result is identical
60
diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc
51
+ * to the first input. Thus if the entire mask is 0, the operation
61
index XXXXXXX..XXXXXXX 100644
52
+ * is equivalent to a copy.
62
--- a/tcg/mips/tcg-target.c.inc
53
+ */
63
+++ b/tcg/mips/tcg-target.c.inc
54
+static bool fold_affected_mask(OptContext *ctx, TCGOp *op, uint64_t a_mask)
64
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
55
+{
65
tcg_out_opc_bf64(s, OPC_DINS, OPC_DINSM, OPC_DINSU, a0, a2,
56
+ if (ctx->type == TCG_TYPE_I32) {
66
args[3] + args[4] - 1, args[3]);
57
+ a_mask = (uint32_t)a_mask;
67
break;
58
+ }
68
+
59
if (a_mask == 0) {
69
case INDEX_op_extract_i32:
60
return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[1]);
70
- tcg_out_opc_bf(s, OPC_EXT, a0, a1, args[3] - 1, a2);
61
}
71
+ if (a2 == 0 && args[3] <= 16) {
62
@@ -XXX,XX +XXX,XX @@ static bool fold_and(OptContext *ctx, TCGOp *op)
72
+ tcg_out_opc_imm(s, OPC_ANDI, a0, a1, (1 << args[3]) - 1);
63
* Known-zeros does not imply known-ones. Therefore unless
73
+ } else {
64
* arg2 is constant, we can't infer affected bits from it.
74
+ tcg_out_opc_bf(s, OPC_EXT, a0, a1, args[3] - 1, a2);
65
*/
66
- if (arg_is_const(op->args[2])) {
67
- ctx->a_mask = z1 & ~z2;
68
+ if (arg_is_const(op->args[2]) &&
69
+ fold_affected_mask(ctx, op, z1 & ~z2)) {
70
+ return true;
71
}
72
73
return fold_masks(ctx, op);
74
@@ -XXX,XX +XXX,XX @@ static bool fold_andc(OptContext *ctx, TCGOp *op)
75
*/
76
if (arg_is_const(op->args[2])) {
77
uint64_t z2 = ~arg_info(op->args[2])->z_mask;
78
- ctx->a_mask = z1 & ~z2;
79
+ if (fold_affected_mask(ctx, op, z1 & ~z2)) {
80
+ return true;
81
+ }
75
+ }
82
z1 &= z2;
76
break;
83
}
77
case INDEX_op_extract_i64:
84
ctx->z_mask = z1;
78
- tcg_out_opc_bf64(s, OPC_DEXT, OPC_DEXTM, OPC_DEXTU, a0, a1,
85
@@ -XXX,XX +XXX,XX @@ static bool fold_extract(OptContext *ctx, TCGOp *op)
79
- args[3] - 1, a2);
86
80
+ if (a2 == 0 && args[3] <= 16) {
87
z_mask_old = arg_info(op->args[1])->z_mask;
81
+ tcg_out_opc_imm(s, OPC_ANDI, a0, a1, (1 << args[3]) - 1);
88
z_mask = extract64(z_mask_old, pos, len);
82
+ } else {
89
- if (pos == 0) {
83
+ tcg_out_opc_bf64(s, OPC_DEXT, OPC_DEXTM, OPC_DEXTU,
90
- ctx->a_mask = z_mask_old ^ z_mask;
84
+ a0, a1, args[3] - 1, a2);
91
+ if (pos == 0 && fold_affected_mask(ctx, op, z_mask_old ^ z_mask)) {
85
+ }
92
+ return true;
86
+ break;
93
}
87
+
94
ctx->z_mask = z_mask;
88
+ case INDEX_op_sextract_i64:
95
ctx->s_mask = smask_from_zmask(z_mask);
89
+ if (a2 == 0 && args[3] == 32) {
96
@@ -XXX,XX +XXX,XX @@ static bool fold_exts(OptContext *ctx, TCGOp *op)
90
+ tcg_out_ext32s(s, a0, a1);
97
91
+ break;
98
ctx->z_mask = z_mask;
92
+ }
99
ctx->s_mask = s_mask;
93
+ /* FALLTHRU */
100
- if (!type_change) {
94
+ case INDEX_op_sextract_i32:
101
- ctx->a_mask = s_mask & ~s_mask_old;
95
+ if (a2 == 0 && args[3] == 8) {
102
+ if (!type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
96
+ tcg_out_ext8s(s, TCG_TYPE_REG, a0, a1);
103
+ return true;
97
+ } else if (a2 == 0 && args[3] == 16) {
104
}
98
+ tcg_out_ext16s(s, TCG_TYPE_REG, a0, a1);
105
99
+ } else {
106
return fold_masks(ctx, op);
100
+ g_assert_not_reached();
107
@@ -XXX,XX +XXX,XX @@ static bool fold_extu(OptContext *ctx, TCGOp *op)
101
+ }
108
102
break;
109
ctx->z_mask = z_mask;
103
110
ctx->s_mask = smask_from_zmask(z_mask);
104
case INDEX_op_brcond_i32:
111
- if (!type_change) {
105
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
112
- ctx->a_mask = z_mask_old ^ z_mask;
106
case INDEX_op_ext8s_i32:
113
+ if (!type_change && fold_affected_mask(ctx, op, z_mask_old ^ z_mask)) {
107
case INDEX_op_ext16s_i32:
114
+ return true;
108
case INDEX_op_extract_i32:
115
}
109
+ case INDEX_op_sextract_i32:
116
return fold_masks(ctx, op);
110
case INDEX_op_ld8u_i64:
117
}
111
case INDEX_op_ld8s_i64:
118
@@ -XXX,XX +XXX,XX @@ static bool fold_sextract(OptContext *ctx, TCGOp *op)
112
case INDEX_op_ld16u_i64:
119
s_mask |= MAKE_64BIT_MASK(len, 64 - len);
113
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
120
ctx->s_mask = s_mask;
114
case INDEX_op_extrl_i64_i32:
121
115
case INDEX_op_extrh_i64_i32:
122
- if (pos == 0) {
116
case INDEX_op_extract_i64:
123
- ctx->a_mask = s_mask & ~s_mask_old;
117
+ case INDEX_op_sextract_i64:
124
+ if (pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
118
return C_O1_I1(r, r);
125
+ return true;
119
126
}
120
case INDEX_op_st8_i32:
127
128
return fold_masks(ctx, op);
129
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
130
}
131
132
/* Assume all bits affected, no bits known zero, no sign reps. */
133
- ctx.a_mask = -1;
134
ctx.z_mask = -1;
135
ctx.s_mask = 0;
136
137
--
121
--
138
2.43.0
122
2.43.0
123
124
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
1
Accept byte and word extensions with the extract opcodes.
2
This is preparatory to removing the specialized extracts.
2
3
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
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/optimize.c | 19 +++++++++++--------
7
tcg/ppc/tcg-target-has.h | 16 ++++++++++++++--
7
1 file changed, 11 insertions(+), 8 deletions(-)
8
tcg/ppc/tcg-target.c.inc | 30 ++++++++++++++++++++++++++++++
9
2 files changed, 44 insertions(+), 2 deletions(-)
8
10
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
diff --git a/tcg/ppc/tcg-target-has.h b/tcg/ppc/tcg-target-has.h
10
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
13
--- a/tcg/ppc/tcg-target-has.h
12
+++ b/tcg/optimize.c
14
+++ b/tcg/ppc/tcg-target-has.h
13
@@ -XXX,XX +XXX,XX @@ static bool fold_mov(OptContext *ctx, TCGOp *op)
15
@@ -XXX,XX +XXX,XX @@
14
16
#define TCG_TARGET_HAS_ctpop_i32 have_isa_2_06
15
static bool fold_movcond(OptContext *ctx, TCGOp *op)
17
#define TCG_TARGET_HAS_deposit_i32 1
16
{
18
#define TCG_TARGET_HAS_extract_i32 1
17
+ uint64_t z_mask, s_mask;
19
-#define TCG_TARGET_HAS_sextract_i32 0
18
+ TempOptInfo *tt, *ft;
20
+#define TCG_TARGET_HAS_sextract_i32 1
19
int i;
21
#define TCG_TARGET_HAS_extract2_i32 0
20
22
#define TCG_TARGET_HAS_negsetcond_i32 1
21
/* If true and false values are the same, eliminate the cmp. */
23
#define TCG_TARGET_HAS_mulu2_i32 0
22
@@ -XXX,XX +XXX,XX @@ static bool fold_movcond(OptContext *ctx, TCGOp *op)
24
@@ -XXX,XX +XXX,XX @@
23
return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[4 - i]);
25
#define TCG_TARGET_HAS_ctpop_i64 have_isa_2_06
24
}
26
#define TCG_TARGET_HAS_deposit_i64 1
25
27
#define TCG_TARGET_HAS_extract_i64 1
26
- ctx->z_mask = arg_info(op->args[3])->z_mask
28
-#define TCG_TARGET_HAS_sextract_i64 0
27
- | arg_info(op->args[4])->z_mask;
29
+#define TCG_TARGET_HAS_sextract_i64 1
28
- ctx->s_mask = arg_info(op->args[3])->s_mask
30
#define TCG_TARGET_HAS_extract2_i64 0
29
- & arg_info(op->args[4])->s_mask;
31
#define TCG_TARGET_HAS_negsetcond_i64 1
30
+ tt = arg_info(op->args[3]);
32
#define TCG_TARGET_HAS_add2_i64 1
31
+ ft = arg_info(op->args[4]);
33
@@ -XXX,XX +XXX,XX @@
32
+ z_mask = tt->z_mask | ft->z_mask;
34
#define TCG_TARGET_HAS_cmpsel_vec 1
33
+ s_mask = tt->s_mask & ft->s_mask;
35
#define TCG_TARGET_HAS_tst_vec 0
34
36
35
- if (arg_is_const(op->args[3]) && arg_is_const(op->args[4])) {
37
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
36
- uint64_t tv = arg_info(op->args[3])->val;
37
- uint64_t fv = arg_info(op->args[4])->val;
38
+ if (ti_is_const(tt) && ti_is_const(ft)) {
39
+ uint64_t tv = ti_const_val(tt);
40
+ uint64_t fv = ti_const_val(ft);
41
TCGOpcode opc, negopc = 0;
42
TCGCond cond = op->args[5];
43
44
@@ -XXX,XX +XXX,XX @@ static bool fold_movcond(OptContext *ctx, TCGOp *op)
45
}
46
}
47
}
48
- return false;
49
+
38
+
50
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
39
+static inline bool
51
}
40
+tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
52
41
+{
53
static bool fold_mul(OptContext *ctx, TCGOp *op)
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:
54
--
112
--
55
2.43.0
113
2.43.0
114
115
diff view generated by jsdifflib
1
This massive macro is now only used once.
1
Accept byte and word extensions with the extract opcodes.
2
Expand it for use only by float64.
2
This is preparatory to removing the specialized extracts.
3
3
4
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
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/hexagon/fma_emu.c | 255 +++++++++++++++++++--------------------
7
tcg/riscv/tcg-target-has.h | 39 ++++++++++++++++++++++++++++++++++----
8
1 file changed, 127 insertions(+), 128 deletions(-)
8
tcg/riscv/tcg-target.c.inc | 34 +++++++++++++++++++++++++++++++++
9
2 files changed, 69 insertions(+), 4 deletions(-)
9
10
10
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
11
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
11
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
12
--- a/target/hexagon/fma_emu.c
13
--- a/tcg/riscv/tcg-target-has.h
13
+++ b/target/hexagon/fma_emu.c
14
+++ b/tcg/riscv/tcg-target-has.h
14
@@ -XXX,XX +XXX,XX @@ float32 infinite_float32(uint8_t sign)
15
@@ -XXX,XX +XXX,XX @@
15
}
16
#define TCG_TARGET_HAS_div2_i32 0
16
17
#define TCG_TARGET_HAS_rot_i32 (cpuinfo & CPUINFO_ZBB)
17
/* Return a maximum finite value with the requested sign */
18
#define TCG_TARGET_HAS_deposit_i32 0
18
-#define GEN_XF_ROUND(SUFFIX, MANTBITS, INF_EXP, INTERNAL_TYPE) \
19
-#define TCG_TARGET_HAS_extract_i32 0
19
-static SUFFIX accum_round_##SUFFIX(Accum a, float_status * fp_status) \
20
-#define TCG_TARGET_HAS_sextract_i32 0
20
-{ \
21
+#define TCG_TARGET_HAS_extract_i32 1
21
- if ((int128_gethi(a.mant) == 0) && (int128_getlo(a.mant) == 0) \
22
+#define TCG_TARGET_HAS_sextract_i32 1
22
- && ((a.guard | a.round | a.sticky) == 0)) { \
23
#define TCG_TARGET_HAS_extract2_i32 0
23
- /* result zero */ \
24
#define TCG_TARGET_HAS_add2_i32 1
24
- switch (fp_status->float_rounding_mode) { \
25
#define TCG_TARGET_HAS_sub2_i32 1
25
- case float_round_down: \
26
@@ -XXX,XX +XXX,XX @@
26
- return zero_##SUFFIX(1); \
27
#define TCG_TARGET_HAS_div2_i64 0
27
- default: \
28
#define TCG_TARGET_HAS_rot_i64 (cpuinfo & CPUINFO_ZBB)
28
- return zero_##SUFFIX(0); \
29
#define TCG_TARGET_HAS_deposit_i64 0
29
- } \
30
-#define TCG_TARGET_HAS_extract_i64 0
30
- } \
31
-#define TCG_TARGET_HAS_sextract_i64 0
31
- /* Normalize right */ \
32
+#define TCG_TARGET_HAS_extract_i64 1
32
- /* We want MANTBITS bits of mantissa plus the leading one. */ \
33
+#define TCG_TARGET_HAS_sextract_i64 1
33
- /* That means that we want MANTBITS+1 bits, or 0x000000000000FF_FFFF */ \
34
#define TCG_TARGET_HAS_extract2_i64 0
34
- /* So we need to normalize right while the high word is non-zero and \
35
#define TCG_TARGET_HAS_extr_i64_i32 1
35
- * while the low word is nonzero when masked with 0xffe0_0000_0000_0000 */ \
36
#define TCG_TARGET_HAS_ext8s_i64 1
36
- while ((int128_gethi(a.mant) != 0) || \
37
@@ -XXX,XX +XXX,XX @@
37
- ((int128_getlo(a.mant) >> (MANTBITS + 1)) != 0)) { \
38
38
- a = accum_norm_right(a, 1); \
39
#define TCG_TARGET_HAS_tst_vec 0
39
- } \
40
40
- /* \
41
+static inline bool
41
- * OK, now normalize left \
42
+tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
42
- * We want to normalize left until we have a leading one in bit 24 \
43
- * Theoretically, we only need to shift a maximum of one to the left if we \
44
- * shifted out lots of bits from B, or if we had no shift / 1 shift sticky \
45
- * should be 0 \
46
- */ \
47
- while ((int128_getlo(a.mant) & (1ULL << MANTBITS)) == 0) { \
48
- a = accum_norm_left(a); \
49
- } \
50
- /* \
51
- * OK, now we might need to denormalize because of potential underflow. \
52
- * We need to do this before rounding, and rounding might make us normal \
53
- * again \
54
- */ \
55
- while (a.exp <= 0) { \
56
- a = accum_norm_right(a, 1 - a.exp); \
57
- /* \
58
- * Do we have underflow? \
59
- * That's when we get an inexact answer because we ran out of bits \
60
- * in a denormal. \
61
- */ \
62
- if (a.guard || a.round || a.sticky) { \
63
- float_raise(float_flag_underflow, fp_status); \
64
- } \
65
- } \
66
- /* OK, we're relatively canonical... now we need to round */ \
67
- if (a.guard || a.round || a.sticky) { \
68
- float_raise(float_flag_inexact, fp_status); \
69
- switch (fp_status->float_rounding_mode) { \
70
- case float_round_to_zero: \
71
- /* Chop and we're done */ \
72
- break; \
73
- case float_round_up: \
74
- if (a.sign == 0) { \
75
- a.mant = int128_add(a.mant, int128_one()); \
76
- } \
77
- break; \
78
- case float_round_down: \
79
- if (a.sign != 0) { \
80
- a.mant = int128_add(a.mant, int128_one()); \
81
- } \
82
- break; \
83
- default: \
84
- if (a.round || a.sticky) { \
85
- /* round up if guard is 1, down if guard is zero */ \
86
- a.mant = int128_add(a.mant, int128_make64(a.guard)); \
87
- } else if (a.guard) { \
88
- /* exactly .5, round up if odd */ \
89
- a.mant = int128_add(a.mant, int128_and(a.mant, int128_one())); \
90
- } \
91
- break; \
92
- } \
93
- } \
94
- /* \
95
- * OK, now we might have carried all the way up. \
96
- * So we might need to shr once \
97
- * at least we know that the lsb should be zero if we rounded and \
98
- * got a carry out... \
99
- */ \
100
- if ((int128_getlo(a.mant) >> (MANTBITS + 1)) != 0) { \
101
- a = accum_norm_right(a, 1); \
102
- } \
103
- /* Overflow? */ \
104
- if (a.exp >= INF_EXP) { \
105
- /* Yep, inf result */ \
106
- float_raise(float_flag_overflow, fp_status); \
107
- float_raise(float_flag_inexact, fp_status); \
108
- switch (fp_status->float_rounding_mode) { \
109
- case float_round_to_zero: \
110
- return maxfinite_##SUFFIX(a.sign); \
111
- case float_round_up: \
112
- if (a.sign == 0) { \
113
- return infinite_##SUFFIX(a.sign); \
114
- } else { \
115
- return maxfinite_##SUFFIX(a.sign); \
116
- } \
117
- case float_round_down: \
118
- if (a.sign != 0) { \
119
- return infinite_##SUFFIX(a.sign); \
120
- } else { \
121
- return maxfinite_##SUFFIX(a.sign); \
122
- } \
123
- default: \
124
- return infinite_##SUFFIX(a.sign); \
125
- } \
126
- } \
127
- /* Underflow? */ \
128
- if (int128_getlo(a.mant) & (1ULL << MANTBITS)) { \
129
- /* Leading one means: No, we're normal. So, we should be done... */ \
130
- INTERNAL_TYPE ret; \
131
- ret.i = 0; \
132
- ret.sign = a.sign; \
133
- ret.exp = a.exp; \
134
- ret.mant = int128_getlo(a.mant); \
135
- return ret.i; \
136
- } \
137
- assert(a.exp == 1); \
138
- INTERNAL_TYPE ret; \
139
- ret.i = 0; \
140
- ret.sign = a.sign; \
141
- ret.exp = 0; \
142
- ret.mant = int128_getlo(a.mant); \
143
- return ret.i; \
144
+static float64 accum_round_float64(Accum a, float_status *fp_status)
145
+{
43
+{
146
+ if ((int128_gethi(a.mant) == 0) && (int128_getlo(a.mant) == 0)
44
+ if (ofs == 0) {
147
+ && ((a.guard | a.round | a.sticky) == 0)) {
45
+ switch (len) {
148
+ /* result zero */
46
+ case 16:
149
+ switch (fp_status->float_rounding_mode) {
47
+ return cpuinfo & CPUINFO_ZBB;
150
+ case float_round_down:
48
+ case 32:
151
+ return zero_float64(1);
49
+ return (cpuinfo & CPUINFO_ZBA) && type == TCG_TYPE_I64;
152
+ default:
153
+ return zero_float64(0);
154
+ }
50
+ }
155
+ }
51
+ }
156
+ /*
52
+ return false;
157
+ * Normalize right
53
+}
158
+ * We want DF_MANTBITS bits of mantissa plus the leading one.
54
+#define TCG_TARGET_extract_valid tcg_target_extract_valid
159
+ * That means that we want DF_MANTBITS+1 bits, or 0x000000000000FF_FFFF
55
+
160
+ * So we need to normalize right while the high word is non-zero and
56
+static inline bool
161
+ * while the low word is nonzero when masked with 0xffe0_0000_0000_0000
57
+tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
162
+ */
58
+{
163
+ while ((int128_gethi(a.mant) != 0) ||
59
+ if (ofs == 0) {
164
+ ((int128_getlo(a.mant) >> (DF_MANTBITS + 1)) != 0)) {
60
+ switch (len) {
165
+ a = accum_norm_right(a, 1);
61
+ case 8:
166
+ }
62
+ case 16:
167
+ /*
63
+ return cpuinfo & CPUINFO_ZBB;
168
+ * OK, now normalize left
64
+ case 32:
169
+ * We want to normalize left until we have a leading one in bit 24
65
+ return type == TCG_TYPE_I64;
170
+ * Theoretically, we only need to shift a maximum of one to the left if we
171
+ * shifted out lots of bits from B, or if we had no shift / 1 shift sticky
172
+ * should be 0
173
+ */
174
+ while ((int128_getlo(a.mant) & (1ULL << DF_MANTBITS)) == 0) {
175
+ a = accum_norm_left(a);
176
+ }
177
+ /*
178
+ * OK, now we might need to denormalize because of potential underflow.
179
+ * We need to do this before rounding, and rounding might make us normal
180
+ * again
181
+ */
182
+ while (a.exp <= 0) {
183
+ a = accum_norm_right(a, 1 - a.exp);
184
+ /*
185
+ * Do we have underflow?
186
+ * That's when we get an inexact answer because we ran out of bits
187
+ * in a denormal.
188
+ */
189
+ if (a.guard || a.round || a.sticky) {
190
+ float_raise(float_flag_underflow, fp_status);
191
+ }
66
+ }
192
+ }
67
+ }
193
+ /* OK, we're relatively canonical... now we need to round */
68
+ return false;
194
+ if (a.guard || a.round || a.sticky) {
69
+}
195
+ float_raise(float_flag_inexact, fp_status);
70
+#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
196
+ switch (fp_status->float_rounding_mode) {
71
+
197
+ case float_round_to_zero:
72
#endif
198
+ /* Chop and we're done */
73
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
199
+ break;
74
index XXXXXXX..XXXXXXX 100644
200
+ case float_round_up:
75
--- a/tcg/riscv/tcg-target.c.inc
201
+ if (a.sign == 0) {
76
+++ b/tcg/riscv/tcg-target.c.inc
202
+ a.mant = int128_add(a.mant, int128_one());
77
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
203
+ }
78
tcg_out_mb(s, a0);
204
+ break;
79
break;
205
+ case float_round_down:
80
206
+ if (a.sign != 0) {
81
+ case INDEX_op_extract_i64:
207
+ a.mant = int128_add(a.mant, int128_one());
82
+ if (a2 == 0 && args[3] == 32) {
208
+ }
83
+ tcg_out_ext32u(s, a0, a1);
209
+ break;
210
+ default:
211
+ if (a.round || a.sticky) {
212
+ /* round up if guard is 1, down if guard is zero */
213
+ a.mant = int128_add(a.mant, int128_make64(a.guard));
214
+ } else if (a.guard) {
215
+ /* exactly .5, round up if odd */
216
+ a.mant = int128_add(a.mant, int128_and(a.mant, int128_one()));
217
+ }
218
+ break;
84
+ break;
219
+ }
85
+ }
220
+ }
86
+ /* FALLTHRU */
221
+ /*
87
+ case INDEX_op_extract_i32:
222
+ * OK, now we might have carried all the way up.
88
+ if (a2 == 0 && args[3] == 16) {
223
+ * So we might need to shr once
89
+ tcg_out_ext16u(s, a0, a1);
224
+ * at least we know that the lsb should be zero if we rounded and
90
+ } else {
225
+ * got a carry out...
91
+ g_assert_not_reached();
226
+ */
227
+ if ((int128_getlo(a.mant) >> (DF_MANTBITS + 1)) != 0) {
228
+ a = accum_norm_right(a, 1);
229
+ }
230
+ /* Overflow? */
231
+ if (a.exp >= DF_INF_EXP) {
232
+ /* Yep, inf result */
233
+ float_raise(float_flag_overflow, fp_status);
234
+ float_raise(float_flag_inexact, fp_status);
235
+ switch (fp_status->float_rounding_mode) {
236
+ case float_round_to_zero:
237
+ return maxfinite_float64(a.sign);
238
+ case float_round_up:
239
+ if (a.sign == 0) {
240
+ return infinite_float64(a.sign);
241
+ } else {
242
+ return maxfinite_float64(a.sign);
243
+ }
244
+ case float_round_down:
245
+ if (a.sign != 0) {
246
+ return infinite_float64(a.sign);
247
+ } else {
248
+ return maxfinite_float64(a.sign);
249
+ }
250
+ default:
251
+ return infinite_float64(a.sign);
252
+ }
92
+ }
253
+ }
93
+ break;
254
+ /* Underflow? */
94
+
255
+ if (int128_getlo(a.mant) & (1ULL << DF_MANTBITS)) {
95
+ case INDEX_op_sextract_i64:
256
+ /* Leading one means: No, we're normal. So, we should be done... */
96
+ if (a2 == 0 && args[3] == 32) {
257
+ Double ret;
97
+ tcg_out_ext32s(s, a0, a1);
258
+ ret.i = 0;
98
+ break;
259
+ ret.sign = a.sign;
99
+ }
260
+ ret.exp = a.exp;
100
+ /* FALLTHRU */
261
+ ret.mant = int128_getlo(a.mant);
101
+ case INDEX_op_sextract_i32:
262
+ return ret.i;
102
+ if (a2 == 0 && args[3] == 8) {
263
+ }
103
+ tcg_out_ext8s(s, TCG_TYPE_REG, a0, a1);
264
+ assert(a.exp == 1);
104
+ } else if (a2 == 0 && args[3] == 16) {
265
+ Double ret;
105
+ tcg_out_ext16s(s, TCG_TYPE_REG, a0, a1);
266
+ ret.i = 0;
106
+ } else {
267
+ ret.sign = a.sign;
107
+ g_assert_not_reached();
268
+ ret.exp = 0;
108
+ }
269
+ ret.mant = int128_getlo(a.mant);
109
+ break;
270
+ return ret.i;
110
+
271
}
111
case INDEX_op_mov_i32: /* Always emitted via tcg_out_mov. */
272
112
case INDEX_op_mov_i64:
273
-GEN_XF_ROUND(float64, DF_MANTBITS, DF_INF_EXP, Double)
113
case INDEX_op_call: /* Always emitted via tcg_out_call. */
274
-
114
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
275
float64 internal_mpyhh(float64 a, float64 b,
115
case INDEX_op_extrl_i64_i32:
276
unsigned long long int accumulated,
116
case INDEX_op_extrh_i64_i32:
277
float_status *fp_status)
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:
278
--
125
--
279
2.43.0
126
2.43.0
127
128
diff view generated by jsdifflib
1
Call them directly from the opcode switch statement in tcg_optimize,
1
Extracts which abut bit 32 may use 32-bit shifts.
2
rather than in finish_folding based on opcode flags. Adjust folding
3
of conditional branches to match.
4
2
5
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@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
tcg/optimize.c | 47 +++++++++++++++++++++++++++++++----------------
6
tcg/riscv/tcg-target-has.h | 24 +++++++-----------------
9
1 file changed, 31 insertions(+), 16 deletions(-)
7
tcg/riscv/tcg-target.c.inc | 16 ++++++++++++----
8
2 files changed, 19 insertions(+), 21 deletions(-)
10
9
11
diff --git a/tcg/optimize.c b/tcg/optimize.c
10
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
12
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/optimize.c
12
--- a/tcg/riscv/tcg-target-has.h
14
+++ b/tcg/optimize.c
13
+++ b/tcg/riscv/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@ static void copy_propagate(OptContext *ctx, TCGOp *op,
14
@@ -XXX,XX +XXX,XX @@
16
}
15
static inline bool
17
}
16
tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
18
19
+static void finish_bb(OptContext *ctx)
20
+{
21
+ /* We only optimize memory barriers across basic blocks. */
22
+ ctx->prev_mb = NULL;
23
+}
24
+
25
+static void finish_ebb(OptContext *ctx)
26
+{
27
+ finish_bb(ctx);
28
+ /* We only optimize across extended basic blocks. */
29
+ memset(&ctx->temps_used, 0, sizeof(ctx->temps_used));
30
+ remove_mem_copy_all(ctx);
31
+}
32
+
33
static void finish_folding(OptContext *ctx, TCGOp *op)
34
{
17
{
35
const TCGOpDef *def = &tcg_op_defs[op->opc];
18
- if (ofs == 0) {
36
int i, nb_oargs;
19
- switch (len) {
37
20
- case 16:
38
- /*
21
- return cpuinfo & CPUINFO_ZBB;
39
- * We only optimize extended basic blocks. If the opcode ends a BB
22
- case 32:
40
- * and is not a conditional branch, reset all temp data.
23
- return (cpuinfo & CPUINFO_ZBA) && type == TCG_TYPE_I64;
41
- */
42
- if (def->flags & TCG_OPF_BB_END) {
43
- ctx->prev_mb = NULL;
44
- if (!(def->flags & TCG_OPF_COND_BRANCH)) {
45
- memset(&ctx->temps_used, 0, sizeof(ctx->temps_used));
46
- remove_mem_copy_all(ctx);
47
- }
24
- }
48
- return;
25
+ if (type == TCG_TYPE_I64 && ofs + len == 32) {
49
- }
26
+ /* ofs > 0 uses SRLIW; ofs == 0 uses add.uw. */
50
-
27
+ return ofs || (cpuinfo & CPUINFO_ZBA);
51
nb_oargs = def->nb_oargs;
52
for (i = 0; i < nb_oargs; i++) {
53
TCGTemp *ts = arg_temp(op->args[i]);
54
@@ -XXX,XX +XXX,XX @@ static bool fold_brcond(OptContext *ctx, TCGOp *op)
55
if (i > 0) {
56
op->opc = INDEX_op_br;
57
op->args[0] = op->args[3];
58
+ finish_ebb(ctx);
59
+ } else {
60
+ finish_bb(ctx);
61
}
28
}
62
- return false;
29
- return false;
63
+ return true;
30
+ return (cpuinfo & CPUINFO_ZBB) && ofs == 0 && len == 16;
64
}
31
}
65
32
#define TCG_TARGET_extract_valid tcg_target_extract_valid
66
static bool fold_brcond2(OptContext *ctx, TCGOp *op)
33
67
@@ -XXX,XX +XXX,XX @@ static bool fold_brcond2(OptContext *ctx, TCGOp *op)
34
static inline bool
68
}
35
tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
69
op->opc = INDEX_op_br;
36
{
70
op->args[0] = label;
37
- if (ofs == 0) {
71
- break;
38
- switch (len) {
72
+ finish_ebb(ctx);
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) {
73
+ return true;
46
+ return true;
74
}
47
}
75
- return false;
48
- return false;
76
+
49
+ return (cpuinfo & CPUINFO_ZBB) && ofs == 0 && (len == 8 || len == 16);
77
+ finish_bb(ctx);
78
+ return true;
79
}
50
}
80
51
#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
81
static bool fold_bswap(OptContext *ctx, TCGOp *op)
52
82
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
53
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
83
CASE_OP_32_64_VEC(xor):
54
index XXXXXXX..XXXXXXX 100644
84
done = fold_xor(&ctx, op);
55
--- a/tcg/riscv/tcg-target.c.inc
85
break;
56
+++ b/tcg/riscv/tcg-target.c.inc
86
+ case INDEX_op_set_label:
57
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
87
+ case INDEX_op_br:
58
break;
88
+ case INDEX_op_exit_tb:
59
89
+ case INDEX_op_goto_tb:
60
case INDEX_op_extract_i64:
90
+ case INDEX_op_goto_ptr:
61
- if (a2 == 0 && args[3] == 32) {
91
+ finish_ebb(&ctx);
62
- tcg_out_ext32u(s, a0, a1);
92
+ done = true;
63
+ if (a2 + args[3] == 32) {
93
+ break;
64
+ if (a2 == 0) {
94
default:
65
+ tcg_out_ext32u(s, a0, a1);
66
+ } else {
67
+ tcg_out_opc_imm(s, OPC_SRLIW, a0, a1, a2);
68
+ }
95
break;
69
break;
96
}
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 */
97
--
87
--
98
2.43.0
88
2.43.0
89
90
diff view generated by jsdifflib
1
Add a routine to which masks can be passed directly, rather than
1
Accept byte and word extensions with the extract opcodes.
2
storing them into OptContext. To be used in upcoming patches.
2
This is preparatory to removing the specialized extracts.
3
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@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
tcg/optimize.c | 15 ++++++++++++---
7
tcg/s390x/tcg-target-has.h | 22 ++++++++++++++++++++--
8
1 file changed, 12 insertions(+), 3 deletions(-)
8
tcg/s390x/tcg-target.c.inc | 37 +++++++++++++++++++++++++++++++++++++
9
2 files changed, 57 insertions(+), 2 deletions(-)
9
10
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
diff --git a/tcg/s390x/tcg-target-has.h b/tcg/s390x/tcg-target-has.h
11
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
13
--- a/tcg/s390x/tcg-target-has.h
13
+++ b/tcg/optimize.c
14
+++ b/tcg/s390x/tcg-target-has.h
14
@@ -XXX,XX +XXX,XX @@ static bool fold_const2_commutative(OptContext *ctx, TCGOp *op)
15
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
15
return fold_const2(ctx, op);
16
#define TCG_TARGET_HAS_ctpop_i32 1
17
#define TCG_TARGET_HAS_deposit_i32 1
18
#define TCG_TARGET_HAS_extract_i32 1
19
-#define TCG_TARGET_HAS_sextract_i32 0
20
+#define TCG_TARGET_HAS_sextract_i32 1
21
#define TCG_TARGET_HAS_extract2_i32 0
22
#define TCG_TARGET_HAS_negsetcond_i32 1
23
#define TCG_TARGET_HAS_add2_i32 1
24
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
25
#define TCG_TARGET_HAS_ctpop_i64 1
26
#define TCG_TARGET_HAS_deposit_i64 1
27
#define TCG_TARGET_HAS_extract_i64 1
28
-#define TCG_TARGET_HAS_sextract_i64 0
29
+#define TCG_TARGET_HAS_sextract_i64 1
30
#define TCG_TARGET_HAS_extract2_i64 0
31
#define TCG_TARGET_HAS_negsetcond_i64 1
32
#define TCG_TARGET_HAS_add2_i64 1
33
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
34
#define TCG_TARGET_HAS_cmpsel_vec 1
35
#define TCG_TARGET_HAS_tst_vec 0
36
37
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
38
+
39
+static inline bool
40
+tcg_target_sextract_valid(TCGType type, unsigned ofs, unsigned len)
41
+{
42
+ if (ofs == 0) {
43
+ switch (len) {
44
+ case 8:
45
+ case 16:
46
+ return true;
47
+ case 32:
48
+ return type == TCG_TYPE_I64;
49
+ }
50
+ }
51
+ return false;
52
+}
53
+#define TCG_TARGET_sextract_valid tcg_target_sextract_valid
54
+
55
#endif
56
diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc
57
index XXXXXXX..XXXXXXX 100644
58
--- a/tcg/s390x/tcg-target.c.inc
59
+++ b/tcg/s390x/tcg-target.c.inc
60
@@ -XXX,XX +XXX,XX @@ static void tgen_deposit(TCGContext *s, TCGReg dest, TCGReg src,
61
static void tgen_extract(TCGContext *s, TCGReg dest, TCGReg src,
62
int ofs, int len)
63
{
64
+ if (ofs == 0) {
65
+ switch (len) {
66
+ case 8:
67
+ tcg_out_ext8u(s, dest, src);
68
+ return;
69
+ case 16:
70
+ tcg_out_ext16u(s, dest, src);
71
+ return;
72
+ case 32:
73
+ tcg_out_ext32u(s, dest, src);
74
+ return;
75
+ }
76
+ }
77
tcg_out_risbg(s, dest, src, 64 - len, 63, 64 - ofs, 1);
16
}
78
}
17
79
18
-static bool fold_masks(OptContext *ctx, TCGOp *op)
80
+static void tgen_sextract(TCGContext *s, TCGReg dest, TCGReg src,
19
+/*
81
+ int ofs, int len)
20
+ * Record "zero" and "sign" masks for the single output of @op.
21
+ * See TempOptInfo definition of z_mask and s_mask.
22
+ * If z_mask allows, fold the output to constant zero.
23
+ */
24
+static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
25
+ uint64_t z_mask, uint64_t s_mask)
26
{
27
- uint64_t z_mask = ctx->z_mask;
28
- uint64_t s_mask = ctx->s_mask;
29
const TCGOpDef *def = &tcg_op_defs[op->opc];
30
TCGTemp *ts;
31
TempOptInfo *ti;
32
@@ -XXX,XX +XXX,XX @@ static bool fold_masks(OptContext *ctx, TCGOp *op)
33
return true;
34
}
35
36
+static bool fold_masks(OptContext *ctx, TCGOp *op)
37
+{
82
+{
38
+ return fold_masks_zs(ctx, op, ctx->z_mask, ctx->s_mask);
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();
39
+}
97
+}
40
+
98
+
41
/*
99
static void tgen_gotoi(TCGContext *s, int cc, const tcg_insn_unit *dest)
42
* An "affected" mask bit is 0 if and only if the result is identical
100
{
43
* to the first input. Thus if the entire mask is 0, the operation
101
ptrdiff_t off = tcg_pcrel_diff(s, dest) >> 1;
102
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
103
OP_32_64(extract):
104
tgen_extract(s, args[0], args[1], args[2], args[3]);
105
break;
106
+ OP_32_64(sextract):
107
+ tgen_sextract(s, args[0], args[1], args[2], args[3]);
108
+ break;
109
110
case INDEX_op_clz_i64:
111
tgen_clz(s, args[0], args[1], args[2], const_args[2]);
112
@@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags)
113
case INDEX_op_extu_i32_i64:
114
case INDEX_op_extract_i32:
115
case INDEX_op_extract_i64:
116
+ case INDEX_op_sextract_i32:
117
+ case INDEX_op_sextract_i64:
118
case INDEX_op_ctpop_i32:
119
case INDEX_op_ctpop_i64:
120
return C_O1_I1(r, r);
44
--
121
--
45
2.43.0
122
2.43.0
123
124
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
1
Extracts which abut bit 32 may use 32-bit shifts.
2
Explicitly sign-extend z_mask instead of doing that manually.
3
2
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
5
---
7
tcg/optimize.c | 29 ++++++++++++-----------------
6
tcg/sparc64/tcg-target-has.h | 13 +++++++++----
8
1 file changed, 12 insertions(+), 17 deletions(-)
7
tcg/sparc64/tcg-target.c.inc | 11 +++++++++++
8
2 files changed, 20 insertions(+), 4 deletions(-)
9
9
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
10
diff --git a/tcg/sparc64/tcg-target-has.h b/tcg/sparc64/tcg-target-has.h
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
12
--- a/tcg/sparc64/tcg-target-has.h
13
+++ b/tcg/optimize.c
13
+++ b/tcg/sparc64/tcg-target-has.h
14
@@ -XXX,XX +XXX,XX @@ static bool fold_extract2(OptContext *ctx, TCGOp *op)
14
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
15
15
#define TCG_TARGET_HAS_ctz_i32 0
16
static bool fold_exts(OptContext *ctx, TCGOp *op)
16
#define TCG_TARGET_HAS_ctpop_i32 0
17
{
17
#define TCG_TARGET_HAS_deposit_i32 0
18
- uint64_t s_mask_old, s_mask, z_mask, sign;
18
-#define TCG_TARGET_HAS_extract_i32 0
19
+ uint64_t s_mask_old, s_mask, z_mask;
19
-#define TCG_TARGET_HAS_sextract_i32 0
20
bool type_change = false;
20
+#define TCG_TARGET_HAS_extract_i32 1
21
+ TempOptInfo *t1;
21
+#define TCG_TARGET_HAS_sextract_i32 1
22
22
#define TCG_TARGET_HAS_extract2_i32 0
23
if (fold_const1(ctx, op)) {
23
#define TCG_TARGET_HAS_negsetcond_i32 1
24
return true;
24
#define TCG_TARGET_HAS_add2_i32 1
25
}
25
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
26
26
#define TCG_TARGET_HAS_ctz_i64 0
27
- z_mask = arg_info(op->args[1])->z_mask;
27
#define TCG_TARGET_HAS_ctpop_i64 0
28
- s_mask = arg_info(op->args[1])->s_mask;
28
#define TCG_TARGET_HAS_deposit_i64 0
29
+ t1 = arg_info(op->args[1]);
29
-#define TCG_TARGET_HAS_extract_i64 0
30
+ z_mask = t1->z_mask;
30
-#define TCG_TARGET_HAS_sextract_i64 0
31
+ s_mask = t1->s_mask;
31
+#define TCG_TARGET_HAS_extract_i64 1
32
s_mask_old = s_mask;
32
+#define TCG_TARGET_HAS_sextract_i64 1
33
33
#define TCG_TARGET_HAS_extract2_i64 0
34
switch (op->opc) {
34
#define TCG_TARGET_HAS_negsetcond_i64 1
35
CASE_OP_32_64(ext8s):
35
#define TCG_TARGET_HAS_add2_i64 1
36
- sign = INT8_MIN;
36
@@ -XXX,XX +XXX,XX @@ extern bool use_vis3_instructions;
37
- z_mask = (uint8_t)z_mask;
37
38
+ s_mask |= INT8_MIN;
38
#define TCG_TARGET_HAS_tst 1
39
+ z_mask = (int8_t)z_mask;
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);
40
break;
52
break;
41
CASE_OP_32_64(ext16s):
53
42
- sign = INT16_MIN;
54
+ case INDEX_op_extract_i64:
43
- z_mask = (uint16_t)z_mask;
55
+ tcg_debug_assert(a2 + args[3] == 32);
44
+ s_mask |= INT16_MIN;
56
+ tcg_out_arithi(s, a0, a1, a2, SHIFT_SRL);
45
+ z_mask = (int16_t)z_mask;
57
+ break;
46
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:
47
case INDEX_op_ext_i32_i64:
68
case INDEX_op_ext_i32_i64:
48
type_change = true;
69
case INDEX_op_extu_i32_i64:
49
QEMU_FALLTHROUGH;
70
+ case INDEX_op_extract_i64:
50
case INDEX_op_ext32s_i64:
71
+ case INDEX_op_sextract_i64:
51
- sign = INT32_MIN;
72
case INDEX_op_qemu_ld_a32_i32:
52
- z_mask = (uint32_t)z_mask;
73
case INDEX_op_qemu_ld_a64_i32:
53
+ s_mask |= INT32_MIN;
74
case INDEX_op_qemu_ld_a32_i64:
54
+ z_mask = (int32_t)z_mask;
55
break;
56
default:
57
g_assert_not_reached();
58
}
59
60
- if (z_mask & sign) {
61
- z_mask |= sign;
62
- }
63
- s_mask |= sign << 1;
64
-
65
- ctx->z_mask = z_mask;
66
- ctx->s_mask = s_mask;
67
if (0 && !type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
68
return true;
69
}
70
71
- return fold_masks(ctx, op);
72
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
73
}
74
75
static bool fold_extu(OptContext *ctx, TCGOp *op)
76
--
75
--
77
2.43.0
76
2.43.0
77
78
diff view generated by jsdifflib
1
This structure, with bitfields, is incorrect for big-endian.
1
Trivially mirrors TCG_TARGET_HAS_{s}extract_*.
2
Use extract64 and deposit64 instead.
3
2
4
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
5
---
7
target/hexagon/fma_emu.c | 46 ++++++++++++++--------------------------
6
tcg/tci/tcg-target-has.h | 3 +++
8
1 file changed, 16 insertions(+), 30 deletions(-)
7
1 file changed, 3 insertions(+)
9
8
10
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
9
diff --git a/tcg/tci/tcg-target-has.h b/tcg/tci/tcg-target-has.h
11
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
12
--- a/target/hexagon/fma_emu.c
11
--- a/tcg/tci/tcg-target-has.h
13
+++ b/target/hexagon/fma_emu.c
12
+++ b/tcg/tci/tcg-target-has.h
14
@@ -XXX,XX +XXX,XX @@
13
@@ -XXX,XX +XXX,XX @@
15
14
16
#define WAY_BIG_EXP 4096
15
#define TCG_TARGET_HAS_tst 1
17
16
18
-typedef union {
17
+#define TCG_TARGET_extract_valid(type, ofs, len) 1
19
- double f;
18
+#define TCG_TARGET_sextract_valid(type, ofs, len) 1
20
- uint64_t i;
21
- struct {
22
- uint64_t mant:52;
23
- uint64_t exp:11;
24
- uint64_t sign:1;
25
- };
26
-} Double;
27
-
28
static uint64_t float64_getmant(float64 f64)
29
{
30
- Double a = { .i = f64 };
31
+ uint64_t mant = extract64(f64, 0, 52);
32
if (float64_is_normal(f64)) {
33
- return a.mant | 1ULL << 52;
34
+ return mant | 1ULL << 52;
35
}
36
if (float64_is_zero(f64)) {
37
return 0;
38
}
39
if (float64_is_denormal(f64)) {
40
- return a.mant;
41
+ return mant;
42
}
43
return ~0ULL;
44
}
45
46
int32_t float64_getexp(float64 f64)
47
{
48
- Double a = { .i = f64 };
49
+ int exp = extract64(f64, 52, 11);
50
if (float64_is_normal(f64)) {
51
- return a.exp;
52
+ return exp;
53
}
54
if (float64_is_denormal(f64)) {
55
- return a.exp + 1;
56
+ return exp + 1;
57
}
58
return -1;
59
}
60
@@ -XXX,XX +XXX,XX @@ float32 infinite_float32(uint8_t sign)
61
/* Return a maximum finite value with the requested sign */
62
static float64 accum_round_float64(Accum a, float_status *fp_status)
63
{
64
+ uint64_t ret;
65
+
19
+
66
if ((int128_gethi(a.mant) == 0) && (int128_getlo(a.mant) == 0)
20
#endif
67
&& ((a.guard | a.round | a.sticky) == 0)) {
68
/* result zero */
69
@@ -XXX,XX +XXX,XX @@ static float64 accum_round_float64(Accum a, float_status *fp_status)
70
}
71
}
72
/* Underflow? */
73
- if (int128_getlo(a.mant) & (1ULL << DF_MANTBITS)) {
74
+ ret = int128_getlo(a.mant);
75
+ if (ret & (1ULL << DF_MANTBITS)) {
76
/* Leading one means: No, we're normal. So, we should be done... */
77
- Double ret;
78
- ret.i = 0;
79
- ret.sign = a.sign;
80
- ret.exp = a.exp;
81
- ret.mant = int128_getlo(a.mant);
82
- return ret.i;
83
+ ret = deposit64(ret, 52, 11, a.exp);
84
+ } else {
85
+ assert(a.exp == 1);
86
+ ret = deposit64(ret, 52, 11, 0);
87
}
88
- assert(a.exp == 1);
89
- Double ret;
90
- ret.i = 0;
91
- ret.sign = a.sign;
92
- ret.exp = 0;
93
- ret.mant = int128_getlo(a.mant);
94
- return ret.i;
95
+ ret = deposit64(ret, 63, 1, a.sign);
96
+ return ret;
97
}
98
99
float64 internal_mpyhh(float64 a, float64 b,
100
--
21
--
101
2.43.0
22
2.43.0
23
24
diff view generated by jsdifflib
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
We already have these assertions during opcode creation.
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
tcg/optimize.c | 2 +-
6
tcg/tci/tcg-target.c.inc | 20 ++------------------
5
1 file changed, 1 insertion(+), 1 deletion(-)
7
1 file changed, 2 insertions(+), 18 deletions(-)
6
8
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
8
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/optimize.c
11
--- a/tcg/tci/tcg-target.c.inc
10
+++ b/tcg/optimize.c
12
+++ b/tcg/tci/tcg-target.c.inc
11
@@ -XXX,XX +XXX,XX @@ static bool fold_extract2(OptContext *ctx, TCGOp *op)
13
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
12
}
14
break;
13
return tcg_opt_gen_movi(ctx, op, op->args[0], v1 | v2);
15
14
}
16
CASE_32_64(deposit) /* Optional (TCG_TARGET_HAS_deposit_*). */
15
- return false;
17
- {
16
+ return finish_folding(ctx, op);
18
- TCGArg pos = args[3], len = args[4];
17
}
19
- TCGArg max = opc == INDEX_op_deposit_i32 ? 32 : 64;
18
20
-
19
static bool fold_exts(OptContext *ctx, TCGOp *op)
21
- tcg_debug_assert(pos < max);
22
- tcg_debug_assert(pos + len <= max);
23
-
24
- tcg_out_op_rrrbb(s, opc, args[0], args[1], args[2], pos, len);
25
- }
26
+ tcg_out_op_rrrbb(s, opc, args[0], args[1], args[2], args[3], args[4]);
27
break;
28
29
CASE_32_64(extract) /* Optional (TCG_TARGET_HAS_extract_*). */
30
CASE_32_64(sextract) /* Optional (TCG_TARGET_HAS_sextract_*). */
31
- {
32
- TCGArg pos = args[2], len = args[3];
33
- TCGArg max = type == TCG_TYPE_I32 ? 32 : 64;
34
-
35
- tcg_debug_assert(pos < max);
36
- tcg_debug_assert(pos + len <= max);
37
-
38
- tcg_out_op_rrbb(s, opc, args[0], args[1], pos, len);
39
- }
40
+ tcg_out_op_rrbb(s, opc, args[0], args[1], args[2], args[3]);
41
break;
42
43
CASE_32_64(brcond)
20
--
44
--
21
2.43.0
45
2.43.0
46
47
diff view generated by jsdifflib
1
The input which overlaps the sign bit of the output can
1
Make extract and sextract "unconditional" in the sense
2
have its input s_mask propagated to the output s_mask.
2
that the opcodes are always present. Rely instead on
3
TCG_TARGET_HAS_{s}extract_valid, now always defined.
3
4
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@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/optimize.c | 14 ++++++++++++--
8
tcg/aarch64/tcg-target-has.h | 4 ----
8
1 file changed, 12 insertions(+), 2 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(-)
9
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
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
265
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
266
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
267
--- a/tcg/optimize.c
13
+++ b/tcg/optimize.c
268
+++ b/tcg/optimize.c
14
@@ -XXX,XX +XXX,XX @@ static bool fold_deposit(OptContext *ctx, TCGOp *op)
269
@@ -XXX,XX +XXX,XX @@ static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
15
TempOptInfo *t2 = arg_info(op->args[2]);
270
shr_opc = INDEX_op_shr_i32;
16
int ofs = op->args[3];
271
neg_opc = INDEX_op_neg_i32;
17
int len = op->args[4];
272
if (TCG_TARGET_extract_valid(TCG_TYPE_I32, sh, 1)) {
18
+ int width;
273
- uext_opc = TCG_TARGET_HAS_extract_i32 ? INDEX_op_extract_i32 : 0;
19
TCGOpcode and_opc;
274
+ uext_opc = INDEX_op_extract_i32;
20
- uint64_t z_mask;
275
}
21
+ uint64_t z_mask, s_mask;
276
if (TCG_TARGET_sextract_valid(TCG_TYPE_I32, sh, 1)) {
22
277
- sext_opc = TCG_TARGET_HAS_sextract_i32 ? INDEX_op_sextract_i32 : 0;
23
if (ti_is_const(t1) && ti_is_const(t2)) {
278
+ sext_opc = INDEX_op_sextract_i32;
24
return tcg_opt_gen_movi(ctx, op, op->args[0],
279
}
25
@@ -XXX,XX +XXX,XX @@ static bool fold_deposit(OptContext *ctx, TCGOp *op)
26
switch (ctx->type) {
27
case TCG_TYPE_I32:
28
and_opc = INDEX_op_and_i32;
29
+ width = 32;
30
break;
280
break;
31
case TCG_TYPE_I64:
281
case TCG_TYPE_I64:
32
and_opc = INDEX_op_and_i64;
282
@@ -XXX,XX +XXX,XX @@ static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
33
+ width = 64;
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
}
34
break;
293
break;
35
default:
294
default:
36
g_assert_not_reached();
295
diff --git a/tcg/tcg.c b/tcg/tcg.c
37
@@ -XXX,XX +XXX,XX @@ static bool fold_deposit(OptContext *ctx, TCGOp *op)
296
index XXXXXXX..XXXXXXX 100644
38
return fold_and(ctx, op);
297
--- a/tcg/tcg.c
39
}
298
+++ b/tcg/tcg.c
40
299
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
41
+ /* The s_mask from the top portion of the deposit is still valid. */
300
case INDEX_op_shl_i32:
42
+ if (ofs + len == width) {
301
case INDEX_op_shr_i32:
43
+ s_mask = t2->s_mask << ofs;
302
case INDEX_op_sar_i32:
44
+ } else {
303
+ case INDEX_op_extract_i32:
45
+ s_mask = t1->s_mask & ~MAKE_64BIT_MASK(0, ofs + len);
304
+ case INDEX_op_sextract_i32:
46
+ }
305
return true;
47
+
306
48
z_mask = deposit64(t1->z_mask, ofs, len, t2->z_mask);
307
case INDEX_op_negsetcond_i32:
49
- return fold_masks_z(ctx, op, z_mask);
308
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
50
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
309
return TCG_TARGET_HAS_rot_i32;
51
}
310
case INDEX_op_deposit_i32:
52
311
return TCG_TARGET_HAS_deposit_i32;
53
static bool fold_divide(OptContext *ctx, TCGOp *op)
312
- case INDEX_op_extract_i32:
313
- return TCG_TARGET_HAS_extract_i32;
314
- case INDEX_op_sextract_i32:
315
- return TCG_TARGET_HAS_sextract_i32;
316
case INDEX_op_extract2_i32:
317
return TCG_TARGET_HAS_extract2_i32;
318
case INDEX_op_add2_i32:
319
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
320
case INDEX_op_sar_i64:
321
case INDEX_op_ext_i32_i64:
322
case INDEX_op_extu_i32_i64:
323
+ case INDEX_op_extract_i64:
324
+ case INDEX_op_sextract_i64:
325
return TCG_TARGET_REG_BITS == 64;
326
327
case INDEX_op_negsetcond_i64:
328
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
329
return TCG_TARGET_HAS_rot_i64;
330
case INDEX_op_deposit_i64:
331
return TCG_TARGET_HAS_deposit_i64;
332
- case INDEX_op_extract_i64:
333
- return TCG_TARGET_HAS_extract_i64;
334
- case INDEX_op_sextract_i64:
335
- return TCG_TARGET_HAS_sextract_i64;
336
case INDEX_op_extract2_i64:
337
return TCG_TARGET_HAS_extract2_i64;
338
case INDEX_op_extrl_i64_i32:
339
diff --git a/tcg/tci.c b/tcg/tci.c
340
index XXXXXXX..XXXXXXX 100644
341
--- a/tcg/tci.c
342
+++ b/tcg/tci.c
343
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
344
regs[r0] = deposit32(regs[r1], pos, len, regs[r2]);
345
break;
346
#endif
347
-#if TCG_TARGET_HAS_extract_i32
348
case INDEX_op_extract_i32:
349
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
350
regs[r0] = extract32(regs[r1], pos, len);
351
break;
352
-#endif
353
-#if TCG_TARGET_HAS_sextract_i32
354
case INDEX_op_sextract_i32:
355
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
356
regs[r0] = sextract32(regs[r1], pos, len);
357
break;
358
-#endif
359
case INDEX_op_brcond_i32:
360
tci_args_rl(insn, tb_ptr, &r0, &ptr);
361
if ((uint32_t)regs[r0]) {
362
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
363
regs[r0] = deposit64(regs[r1], pos, len, regs[r2]);
364
break;
365
#endif
366
-#if TCG_TARGET_HAS_extract_i64
367
case INDEX_op_extract_i64:
368
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
369
regs[r0] = extract64(regs[r1], pos, len);
370
break;
371
-#endif
372
-#if TCG_TARGET_HAS_sextract_i64
373
case INDEX_op_sextract_i64:
374
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
375
regs[r0] = sextract64(regs[r1], pos, len);
376
break;
377
-#endif
378
case INDEX_op_brcond_i64:
379
tci_args_rl(insn, tb_ptr, &r0, &ptr);
380
if (regs[r0]) {
54
--
381
--
55
2.43.0
382
2.43.0
383
384
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
1
Make deposit "unconditional" in the sense that the opcode is
2
always present. Rely instead on TCG_TARGET_deposit_valid,
3
now always defined.
2
4
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
7
---
6
tcg/optimize.c | 15 ++++++---------
8
tcg/aarch64/tcg-target-has.h | 3 +--
7
1 file changed, 6 insertions(+), 9 deletions(-)
9
tcg/arm/tcg-target-has.h | 2 +-
10
tcg/i386/tcg-target-has.h | 5 +----
11
tcg/loongarch64/tcg-target-has.h | 3 +--
12
tcg/mips/tcg-target-has.h | 3 +--
13
tcg/ppc/tcg-target-has.h | 3 +--
14
tcg/riscv/tcg-target-has.h | 4 ++--
15
tcg/s390x/tcg-target-has.h | 3 +--
16
tcg/sparc64/tcg-target-has.h | 4 ++--
17
tcg/tcg-has.h | 8 --------
18
tcg/tci/tcg-target-has.h | 3 +--
19
tcg/tcg-op.c | 22 +++++++++++-----------
20
tcg/tcg.c | 31 +++++++++++--------------------
21
tcg/tci.c | 4 ----
22
tcg/tci/tcg-target.c.inc | 2 +-
23
15 files changed, 35 insertions(+), 65 deletions(-)
8
24
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
25
diff --git a/tcg/aarch64/tcg-target-has.h b/tcg/aarch64/tcg-target-has.h
10
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
27
--- a/tcg/aarch64/tcg-target-has.h
12
+++ b/tcg/optimize.c
28
+++ b/tcg/aarch64/tcg-target-has.h
13
@@ -XXX,XX +XXX,XX @@ static bool fold_eqv(OptContext *ctx, TCGOp *op)
29
@@ -XXX,XX +XXX,XX @@
14
static bool fold_extract(OptContext *ctx, TCGOp *op)
30
#define TCG_TARGET_HAS_clz_i32 1
31
#define TCG_TARGET_HAS_ctz_i32 1
32
#define TCG_TARGET_HAS_ctpop_i32 0
33
-#define TCG_TARGET_HAS_deposit_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_clz_i64 1
39
#define TCG_TARGET_HAS_ctz_i64 1
40
#define TCG_TARGET_HAS_ctpop_i64 0
41
-#define TCG_TARGET_HAS_deposit_i64 1
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);
384
diff --git a/tcg/tcg.c b/tcg/tcg.c
385
index XXXXXXX..XXXXXXX 100644
386
--- a/tcg/tcg.c
387
+++ b/tcg/tcg.c
388
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
389
case INDEX_op_sar_i32:
390
case INDEX_op_extract_i32:
391
case INDEX_op_sextract_i32:
392
+ case INDEX_op_deposit_i32:
393
return true;
394
395
case INDEX_op_negsetcond_i32:
396
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
397
case INDEX_op_rotl_i32:
398
case INDEX_op_rotr_i32:
399
return TCG_TARGET_HAS_rot_i32;
400
- case INDEX_op_deposit_i32:
401
- return TCG_TARGET_HAS_deposit_i32;
402
case INDEX_op_extract2_i32:
403
return TCG_TARGET_HAS_extract2_i32;
404
case INDEX_op_add2_i32:
405
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
406
case INDEX_op_extu_i32_i64:
407
case INDEX_op_extract_i64:
408
case INDEX_op_sextract_i64:
409
+ case INDEX_op_deposit_i64:
410
return TCG_TARGET_REG_BITS == 64;
411
412
case INDEX_op_negsetcond_i64:
413
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
414
case INDEX_op_rotl_i64:
415
case INDEX_op_rotr_i64:
416
return TCG_TARGET_HAS_rot_i64;
417
- case INDEX_op_deposit_i64:
418
- return TCG_TARGET_HAS_deposit_i64;
419
case INDEX_op_extract2_i64:
420
return TCG_TARGET_HAS_extract2_i64;
421
case INDEX_op_extrl_i64_i32:
422
@@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags)
423
424
bool tcg_op_deposit_valid(TCGType type, unsigned ofs, unsigned len)
15
{
425
{
16
uint64_t z_mask_old, z_mask;
426
+ unsigned width;
17
+ TempOptInfo *t1 = arg_info(op->args[1]);
427
+
18
int pos = op->args[2];
428
+ tcg_debug_assert(type == TCG_TYPE_I32 || type == TCG_TYPE_I64);
19
int len = op->args[3];
429
+ width = (type == TCG_TYPE_I32 ? 32 : 64);
20
430
+
21
- if (arg_is_const(op->args[1])) {
431
+ tcg_debug_assert(ofs < width);
22
- uint64_t t;
432
tcg_debug_assert(len > 0);
23
-
433
- switch (type) {
24
- t = arg_info(op->args[1])->val;
434
- case TCG_TYPE_I32:
25
- t = extract64(t, pos, len);
435
- tcg_debug_assert(ofs < 32);
26
- return tcg_opt_gen_movi(ctx, op, op->args[0], t);
436
- tcg_debug_assert(len <= 32);
27
+ if (ti_is_const(t1)) {
437
- tcg_debug_assert(ofs + len <= 32);
28
+ return tcg_opt_gen_movi(ctx, op, op->args[0],
438
- return TCG_TARGET_HAS_deposit_i32 &&
29
+ extract64(ti_const_val(t1), pos, len));
439
- TCG_TARGET_deposit_i32_valid(ofs, len);
30
}
440
- case TCG_TYPE_I64:
31
441
- tcg_debug_assert(ofs < 64);
32
- z_mask_old = arg_info(op->args[1])->z_mask;
442
- tcg_debug_assert(len <= 64);
33
+ z_mask_old = t1->z_mask;
443
- tcg_debug_assert(ofs + len <= 64);
34
z_mask = extract64(z_mask_old, pos, len);
444
- return TCG_TARGET_HAS_deposit_i64 &&
35
if (pos == 0 && fold_affected_mask(ctx, op, z_mask_old ^ z_mask)) {
445
- TCG_TARGET_deposit_i64_valid(ofs, len);
36
return true;
446
- default:
37
}
447
- g_assert_not_reached();
38
- ctx->z_mask = z_mask;
448
- }
39
449
+ tcg_debug_assert(len <= width - ofs);
40
- return fold_masks(ctx, op);
450
+
41
+ return fold_masks_z(ctx, op, z_mask);
451
+ return TCG_TARGET_deposit_valid(type, ofs, len);
42
}
452
}
43
453
44
static bool fold_extract2(OptContext *ctx, TCGOp *op)
454
static TCGOp *tcg_op_alloc(TCGOpcode opc, unsigned nargs);
455
diff --git a/tcg/tci.c b/tcg/tci.c
456
index XXXXXXX..XXXXXXX 100644
457
--- a/tcg/tci.c
458
+++ b/tcg/tci.c
459
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
460
regs[r0] = ror32(regs[r1], regs[r2] & 31);
461
break;
462
#endif
463
-#if TCG_TARGET_HAS_deposit_i32
464
case INDEX_op_deposit_i32:
465
tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len);
466
regs[r0] = deposit32(regs[r1], pos, len, regs[r2]);
467
break;
468
-#endif
469
case INDEX_op_extract_i32:
470
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
471
regs[r0] = extract32(regs[r1], pos, len);
472
@@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env,
473
regs[r0] = ror64(regs[r1], regs[r2] & 63);
474
break;
475
#endif
476
-#if TCG_TARGET_HAS_deposit_i64
477
case INDEX_op_deposit_i64:
478
tci_args_rrrbb(insn, &r0, &r1, &r2, &pos, &len);
479
regs[r0] = deposit64(regs[r1], pos, len, regs[r2]);
480
break;
481
-#endif
482
case INDEX_op_extract_i64:
483
tci_args_rrbb(insn, &r0, &r1, &pos, &len);
484
regs[r0] = extract64(regs[r1], pos, len);
485
diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc
486
index XXXXXXX..XXXXXXX 100644
487
--- a/tcg/tci/tcg-target.c.inc
488
+++ b/tcg/tci/tcg-target.c.inc
489
@@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type,
490
tcg_out_op_rrr(s, opc, args[0], args[1], args[2]);
491
break;
492
493
- CASE_32_64(deposit) /* Optional (TCG_TARGET_HAS_deposit_*). */
494
+ CASE_32_64(deposit)
495
tcg_out_op_rrrbb(s, opc, args[0], args[1], args[2], args[3], args[4]);
496
break;
497
45
--
498
--
46
2.43.0
499
2.43.0
500
501
diff view generated by jsdifflib
1
All mask setting is now done with parameters via fold_masks_*.
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(-)
2
9
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
10
diff --git a/host/include/riscv/host/cpuinfo.h b/host/include/riscv/host/cpuinfo.h
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
tcg/optimize.c | 13 -------------
7
1 file changed, 13 deletions(-)
8
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
10
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
12
--- a/host/include/riscv/host/cpuinfo.h
12
+++ b/tcg/optimize.c
13
+++ b/host/include/riscv/host/cpuinfo.h
13
@@ -XXX,XX +XXX,XX @@ typedef struct OptContext {
14
@@ -XXX,XX +XXX,XX @@
14
QSIMPLEQ_HEAD(, MemCopyInfo) mem_free;
15
#define CPUINFO_ALWAYS (1u << 0) /* so cpuinfo is nonzero */
15
16
#define CPUINFO_ZBA (1u << 1)
16
/* In flight values from optimization. */
17
#define CPUINFO_ZBB (1u << 2)
17
- uint64_t z_mask; /* mask bit is 0 iff value bit is 0 */
18
-#define CPUINFO_ZICOND (1u << 3)
18
- uint64_t s_mask; /* mask bit is 1 if value bit matches msb */
19
-#define CPUINFO_ZVE64X (1u << 4)
19
TCGType type;
20
+#define CPUINFO_ZBS (1u << 3)
20
} OptContext;
21
+#define CPUINFO_ZICOND (1u << 4)
21
22
+#define CPUINFO_ZVE64X (1u << 5)
22
@@ -XXX,XX +XXX,XX @@ static bool finish_folding(OptContext *ctx, TCGOp *op)
23
23
for (i = 0; i < nb_oargs; i++) {
24
/* Initialized with a constructor. */
24
TCGTemp *ts = arg_temp(op->args[i]);
25
extern unsigned cpuinfo;
25
reset_ts(ctx, ts);
26
diff --git a/util/cpuinfo-riscv.c b/util/cpuinfo-riscv.c
26
- /*
27
index XXXXXXX..XXXXXXX 100644
27
- * Save the corresponding known-zero/sign bits mask for the
28
--- a/util/cpuinfo-riscv.c
28
- * first output argument (only one supported so far).
29
+++ b/util/cpuinfo-riscv.c
29
- */
30
@@ -XXX,XX +XXX,XX @@ static void sigill_handler(int signo, siginfo_t *si, void *data)
30
- if (i == 0) {
31
/* Called both as constructor and (possibly) via other constructors. */
31
- ts_info(ts)->z_mask = ctx->z_mask;
32
unsigned __attribute__((constructor)) cpuinfo_init(void)
32
- }
33
{
33
}
34
- unsigned left = CPUINFO_ZBA | CPUINFO_ZBB | CPUINFO_ZICOND | CPUINFO_ZVE64X;
34
return true;
35
+ unsigned left = CPUINFO_ZBA | CPUINFO_ZBB | CPUINFO_ZBS
35
}
36
+ | CPUINFO_ZICOND | CPUINFO_ZVE64X;
36
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
37
unsigned info = cpuinfo;
37
ctx.type = TCG_TYPE_I32;
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;
38
}
62
}
39
63
40
- /* Assume all bits affected, no bits known zero, no sign reps. */
64
+ if (left & CPUINFO_ZBS) {
41
- ctx.z_mask = -1;
65
+ /* Probe for Zbs: bext zero,zero,zero. */
42
- ctx.s_mask = 0;
66
+ got_sigill = 0;
43
-
67
+ asm volatile(".insn r 0x33, 5, 0x24, zero, zero, zero"
44
/*
68
+ : : : "memory");
45
* Process each opcode.
69
+ info |= got_sigill ? 0 : CPUINFO_ZBS;
46
* Sorted alphabetically by opcode as much as possible.
70
+ left &= ~CPUINFO_ZBS;
71
+ }
72
+
73
if (left & CPUINFO_ZICOND) {
74
/* Probe for Zicond: czero.eqz zero,zero,zero. */
75
got_sigill = 0;
47
--
76
--
48
2.43.0
77
2.43.0
78
79
diff view generated by jsdifflib
1
Merge the two conditions, sign != 0 && !(z_mask & sign),
1
Acked-by: Alistair Francis <alistair.francis@wdc.com>
2
by testing ~z_mask & sign. If sign == 0, the logical and
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
will produce false.
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(-)
4
8
5
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
9
diff --git a/tcg/riscv/tcg-target-has.h b/tcg/riscv/tcg-target-has.h
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
8
tcg/optimize.c | 5 ++---
9
1 file changed, 2 insertions(+), 3 deletions(-)
10
11
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/optimize.c
11
--- a/tcg/riscv/tcg-target-has.h
14
+++ b/tcg/optimize.c
12
+++ b/tcg/riscv/tcg-target-has.h
15
@@ -XXX,XX +XXX,XX @@ static bool fold_sextract(OptContext *ctx, TCGOp *op)
13
@@ -XXX,XX +XXX,XX @@ tcg_target_extract_valid(TCGType type, unsigned ofs, unsigned len)
16
14
/* ofs > 0 uses SRLIW; ofs == 0 uses add.uw. */
17
static bool fold_shift(OptContext *ctx, TCGOp *op)
15
return ofs || (cpuinfo & CPUINFO_ZBA);
18
{
16
}
19
- uint64_t s_mask, z_mask, sign;
17
- return (cpuinfo & CPUINFO_ZBB) && ofs == 0 && len == 16;
20
+ uint64_t s_mask, z_mask;
18
+ switch (len) {
21
TempOptInfo *t1, *t2;
19
+ case 1:
22
20
+ return (cpuinfo & CPUINFO_ZBS) && ofs != 0;
23
if (fold_const2(ctx, op) ||
21
+ case 16:
24
@@ -XXX,XX +XXX,XX @@ static bool fold_shift(OptContext *ctx, TCGOp *op)
22
+ return (cpuinfo & CPUINFO_ZBB) && ofs == 0;
25
* If the sign bit is known zero, then logical right shift
23
+ }
26
* will not reduce the number of input sign repetitions.
24
+ return false;
27
*/
25
}
28
- sign = -s_mask;
26
#define TCG_TARGET_extract_valid tcg_target_extract_valid
29
- if (sign && !(z_mask & sign)) {
27
30
+ if (~z_mask & -s_mask) {
28
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
31
return fold_masks_s(ctx, op, s_mask);
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();
32
}
56
}
33
break;
57
break;
34
--
58
--
35
2.43.0
59
2.43.0
diff view generated by jsdifflib
1
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
From: Helge Deller <deller@kernel.org>
2
2
3
When running with a single vcpu, we can return a constant instead of a
3
Add some missing fields which may be parsed by userspace applications.
4
load when accessing cpu_index.
5
A side effect is that all tcg operations using it are optimized, most
6
notably scoreboard access.
7
When running a simple loop in user-mode, the speedup is around 20%.
8
4
9
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Signed-off-by: Helge Deller <deller@gmx.de>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-ID: <20241128213843.1023080-1-pierrick.bouvier@linaro.org>
8
Message-ID: <Z39B1wzNNpndmOxZ@p100>
13
---
9
---
14
accel/tcg/plugin-gen.c | 9 +++++++++
10
linux-user/sparc/target_proc.h | 20 +++++++++++++++++++-
15
1 file changed, 9 insertions(+)
11
1 file changed, 19 insertions(+), 1 deletion(-)
16
12
17
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
13
diff --git a/linux-user/sparc/target_proc.h b/linux-user/sparc/target_proc.h
18
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
19
--- a/accel/tcg/plugin-gen.c
15
--- a/linux-user/sparc/target_proc.h
20
+++ b/accel/tcg/plugin-gen.c
16
+++ b/linux-user/sparc/target_proc.h
21
@@ -XXX,XX +XXX,XX @@ static void gen_disable_mem_helper(void)
17
@@ -XXX,XX +XXX,XX @@
22
18
23
static TCGv_i32 gen_cpu_index(void)
19
static int open_cpuinfo(CPUArchState *cpu_env, int fd)
24
{
20
{
25
+ /*
21
- dprintf(fd, "type\t\t: sun4u\n");
26
+ * Optimize when we run with a single vcpu. All values using cpu_index,
22
+ int i, num_cpus;
27
+ * including scoreboard index, will be optimized out.
23
+ const char *cpu_type;
28
+ * User-mode calls tb_flush when setting this flag. In system-mode, all
24
+
29
+ * vcpus are created before generating code.
25
+ num_cpus = sysconf(_SC_NPROCESSORS_ONLN);
30
+ */
26
+ if (cpu_env->def.features & CPU_FEATURE_HYPV) {
31
+ if (!tcg_cflags_has(current_cpu, CF_PARALLEL)) {
27
+ cpu_type = "sun4v";
32
+ return tcg_constant_i32(current_cpu->cpu_index);
28
+ } else {
29
+ cpu_type = "sun4u";
33
+ }
30
+ }
34
TCGv_i32 cpu_index = tcg_temp_ebb_new_i32();
31
+
35
tcg_gen_ld_i32(cpu_index, tcg_env,
32
+ dprintf(fd, "cpu\t\t: %s (QEMU)\n", cpu_env->def.name);
36
-offsetof(ArchCPU, env) + offsetof(CPUState, cpu_index));
33
+ dprintf(fd, "type\t\t: %s\n", cpu_type);
34
+ dprintf(fd, "ncpus probed\t: %d\n", num_cpus);
35
+ dprintf(fd, "ncpus active\t: %d\n", num_cpus);
36
+ dprintf(fd, "State:\n");
37
+ for (i = 0; i < num_cpus; i++) {
38
+ dprintf(fd, "CPU%d:\t\t: online\n", i);
39
+ }
40
+
41
return 0;
42
}
43
#define HAVE_ARCH_PROC_CPUINFO
37
--
44
--
38
2.43.0
45
2.43.0
diff view generated by jsdifflib
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
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>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Message-ID: <20250116213214.5695-1-iii@linux.ibm.com>
3
---
12
---
4
tcg/optimize.c | 2 +-
13
include/tcg/tcg.h | 41 +++++++++++++++++++++++++++++++++++++++++
5
1 file changed, 1 insertion(+), 1 deletion(-)
14
accel/tcg/cpu-exec.c | 15 ++++++++++++++-
15
2 files changed, 55 insertions(+), 1 deletion(-)
6
16
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
17
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
8
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/optimize.c
19
--- a/include/tcg/tcg.h
10
+++ b/tcg/optimize.c
20
+++ b/include/tcg/tcg.h
11
@@ -XXX,XX +XXX,XX @@ static bool fold_divide(OptContext *ctx, TCGOp *op)
21
@@ -XXX,XX +XXX,XX @@ void tcg_region_reset_all(void);
12
fold_xi_to_x(ctx, op, 1)) {
22
size_t tcg_code_size(void);
13
return true;
23
size_t tcg_code_capacity(void);
14
}
24
15
- return false;
25
+/**
16
+ return finish_folding(ctx, op);
26
+ * tcg_tb_insert:
27
+ * @tb: translation block to insert
28
+ *
29
+ * Insert @tb into the region trees.
30
+ */
31
void tcg_tb_insert(TranslationBlock *tb);
32
+
33
+/**
34
+ * tcg_tb_remove:
35
+ * @tb: translation block to remove
36
+ *
37
+ * Remove @tb from the region trees.
38
+ */
39
void tcg_tb_remove(TranslationBlock *tb);
40
+
41
+/**
42
+ * tcg_tb_lookup:
43
+ * @tc_ptr: host PC to look up
44
+ *
45
+ * Look up a translation block inside the region trees by @tc_ptr. This is
46
+ * useful for exception handling, but must not be used for the purposes of
47
+ * executing the returned translation block. See struct tb_tc for more
48
+ * information.
49
+ *
50
+ * Returns: a translation block previously inserted into the region trees,
51
+ * such that @tc_ptr points anywhere inside the code generated for it, or
52
+ * NULL.
53
+ */
54
TranslationBlock *tcg_tb_lookup(uintptr_t tc_ptr);
55
+
56
+/**
57
+ * tcg_tb_foreach:
58
+ * @func: callback
59
+ * @user_data: opaque value to pass to @callback
60
+ *
61
+ * Call @func for each translation block inserted into the region trees.
62
+ */
63
void tcg_tb_foreach(GTraverseFunc func, gpointer user_data);
64
+
65
+/**
66
+ * tcg_nb_tbs:
67
+ *
68
+ * Returns: the number of translation blocks inserted into the region trees.
69
+ */
70
size_t tcg_nb_tbs(void);
71
72
/* user-mode: Called with mmap_lock held. */
73
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
74
index XXXXXXX..XXXXXXX 100644
75
--- a/accel/tcg/cpu-exec.c
76
+++ b/accel/tcg/cpu-exec.c
77
@@ -XXX,XX +XXX,XX @@ static TranslationBlock *tb_htable_lookup(CPUState *cpu, vaddr pc,
78
return qht_lookup_custom(&tb_ctx.htable, &desc, h, tb_lookup_cmp);
17
}
79
}
18
80
19
static bool fold_dup(OptContext *ctx, TCGOp *op)
81
-/* Might cause an exception, so have a longjmp destination ready */
82
+/**
83
+ * tb_lookup:
84
+ * @cpu: CPU that will execute the returned translation block
85
+ * @pc: guest PC
86
+ * @cs_base: arch-specific value associated with translation block
87
+ * @flags: arch-specific translation block flags
88
+ * @cflags: CF_* flags
89
+ *
90
+ * Look up a translation block inside the QHT using @pc, @cs_base, @flags and
91
+ * @cflags. Uses @cpu's tb_jmp_cache. Might cause an exception, so have a
92
+ * longjmp destination ready.
93
+ *
94
+ * Returns: an existing translation block or NULL.
95
+ */
96
static inline TranslationBlock *tb_lookup(CPUState *cpu, vaddr pc,
97
uint64_t cs_base, uint32_t flags,
98
uint32_t cflags)
20
--
99
--
21
2.43.0
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
make check-tcg fails on Fedora with the following error message:
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
5
alpha-linux-gnu-gcc [...] qemu/tests/tcg/multiarch/system/memory.c -o memory [...]
7
For x86 this is not a problem, because x86_restore_state_to_opc() only
6
qemu/tests/tcg/multiarch/system/memory.c:17:10: fatal error: inttypes.h: No such file or directory
8
restores pc and cc, which already have the correct values if the first
7
17 | #include <inttypes.h>
9
TB instruction causes an exception. However, on several other
8
| ^~~~~~~~~~~~
10
architectures, restore_state_to_opc() is not stricly limited to state
9
compilation terminated.
11
restoration and affects some exception-related registers, where guests
12
can notice incorrect values, for example:
10
13
11
The reason is that Fedora has cross-compilers, but no cross-glibc
14
- arm's exception.syndrome;
12
headers. Fix by hardcoding the format specifiers and dropping the
15
- hppa's unwind_breg;
13
include.
16
- riscv's excp_uw2;
17
- s390x's int_pgm_ilen.
14
18
15
An alternative fix would be to introduce a configure check for
19
Fix by always calling tcg_tb_insert(). This may increase the size of
16
inttypes.h. But this would make it impossible to use Fedora
20
region_trees, but tcg_region_reset_all() clears it once code_gen_buffer
17
cross-compilers for softmmu tests, which used to work so far.
21
fills up, so it will not grow uncontrollably.
18
22
19
Fixes: ecbcc9ead2f8 ("tests/tcg: add a system test to check memory instrumentation")
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>
20
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
30
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
21
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
31
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
22
Message-ID: <20241010085906.226249-1-iii@linux.ibm.com>
23
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>
24
---
34
---
25
tests/tcg/multiarch/system/memory.c | 9 ++++-----
35
accel/tcg/translate-all.c | 29 +++++++++++++++++++----------
26
1 file changed, 4 insertions(+), 5 deletions(-)
36
1 file changed, 19 insertions(+), 10 deletions(-)
27
37
28
diff --git a/tests/tcg/multiarch/system/memory.c b/tests/tcg/multiarch/system/memory.c
38
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
29
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
30
--- a/tests/tcg/multiarch/system/memory.c
40
--- a/accel/tcg/translate-all.c
31
+++ b/tests/tcg/multiarch/system/memory.c
41
+++ b/accel/tcg/translate-all.c
32
@@ -XXX,XX +XXX,XX @@
42
@@ -XXX,XX +XXX,XX @@ TranslationBlock *tb_gen_code(CPUState *cpu,
33
43
tb_reset_jump(tb, 1);
34
#include <stdint.h>
35
#include <stdbool.h>
36
-#include <inttypes.h>
37
#include <minilib.h>
38
39
#ifndef CHECK_UNALIGNED
40
@@ -XXX,XX +XXX,XX @@ int main(void)
41
int i;
42
bool ok = true;
43
44
- ml_printf("Test data start: 0x%"PRIxPTR"\n", &test_data[0]);
45
- ml_printf("Test data end: 0x%"PRIxPTR"\n", &test_data[TEST_SIZE]);
46
+ ml_printf("Test data start: 0x%lx\n", (unsigned long)&test_data[0]);
47
+ ml_printf("Test data end: 0x%lx\n", (unsigned long)&test_data[TEST_SIZE]);
48
49
/* Run through the unsigned tests first */
50
for (i = 0; i < ARRAY_SIZE(init_ufns) && ok; i++) {
51
@@ -XXX,XX +XXX,XX @@ int main(void)
52
ok = do_signed_reads(true);
53
}
44
}
54
45
55
- ml_printf("Test data read: %"PRId32"\n", test_read_count);
46
- /*
56
- ml_printf("Test data write: %"PRId32"\n", test_write_count);
47
- * If the TB is not associated with a physical RAM page then it must be
57
+ ml_printf("Test data read: %lu\n", (unsigned long)test_read_count);
48
- * a temporary one-insn TB, and we have nothing left to do. Return early
58
+ ml_printf("Test data write: %lu\n", (unsigned long)test_write_count);
49
- * before attempting to link to other TBs or add to the lookup table.
59
ml_printf("Test complete: %s\n", ok ? "PASSED" : "FAILED");
50
- */
60
return ok ? 0 : -1;
51
- if (tb_page_addr0(tb) == -1) {
61
}
52
- assert_no_pages_locked();
53
- return tb;
54
- }
55
-
56
/*
57
* Insert TB into the corresponding region tree before publishing it
58
* through QHT. Otherwise rewinding happened in the TB might fail to
59
@@ -XXX,XX +XXX,XX @@ TranslationBlock *tb_gen_code(CPUState *cpu,
60
*/
61
tcg_tb_insert(tb);
62
63
+ /*
64
+ * If the TB is not associated with a physical RAM page then it must be
65
+ * a temporary one-insn TB.
66
+ *
67
+ * Such TBs must be added to region trees in order to make sure that
68
+ * restore_state_to_opc() - which on some architectures is not limited to
69
+ * rewinding, but also affects exception handling! - is called when such a
70
+ * TB causes an exception.
71
+ *
72
+ * At the same time, temporary one-insn TBs must be executed at most once,
73
+ * because subsequent reads from, e.g., I/O memory may return different
74
+ * values. So return early before attempting to link to other TBs or add
75
+ * to the QHT.
76
+ */
77
+ if (tb_page_addr0(tb) == -1) {
78
+ assert_no_pages_locked();
79
+ return tb;
80
+ }
81
+
82
/*
83
* No explicit memory barrier is required -- tb_link_page() makes the
84
* TB visible in a consistent state.
62
--
85
--
63
2.43.0
86
2.43.0
87
88
diff view generated by jsdifflib
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
From: 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>
2
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>
3
---
9
---
4
tcg/optimize.c | 9 +++++----
10
include/fpu/softfloat-helpers.h | 25 ++++++++++++++-----------
5
1 file changed, 5 insertions(+), 4 deletions(-)
11
1 file changed, 14 insertions(+), 11 deletions(-)
6
12
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
13
diff --git a/include/fpu/softfloat-helpers.h b/include/fpu/softfloat-helpers.h
8
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/optimize.c
15
--- a/include/fpu/softfloat-helpers.h
10
+++ b/tcg/optimize.c
16
+++ b/include/fpu/softfloat-helpers.h
11
@@ -XXX,XX +XXX,XX @@ static void finish_ebb(OptContext *ctx)
17
@@ -XXX,XX +XXX,XX @@ static inline void set_no_signaling_nans(bool val, float_status *status)
12
remove_mem_copy_all(ctx);
18
status->no_signaling_nans = val;
13
}
19
}
14
20
15
-static void finish_folding(OptContext *ctx, TCGOp *op)
21
-static inline bool get_float_detect_tininess(float_status *status)
16
+static bool finish_folding(OptContext *ctx, TCGOp *op)
22
+static inline bool get_float_detect_tininess(const float_status *status)
17
{
23
{
18
const TCGOpDef *def = &tcg_op_defs[op->opc];
24
return status->tininess_before_rounding;
19
int i, nb_oargs;
20
@@ -XXX,XX +XXX,XX @@ static void finish_folding(OptContext *ctx, TCGOp *op)
21
ts_info(ts)->z_mask = ctx->z_mask;
22
}
23
}
24
+ return true;
25
}
25
}
26
26
27
/*
27
-static inline FloatRoundMode get_float_rounding_mode(float_status *status)
28
@@ -XXX,XX +XXX,XX @@ static bool fold_add(OptContext *ctx, TCGOp *op)
28
+static inline FloatRoundMode get_float_rounding_mode(const float_status *status)
29
fold_xi_to_x(ctx, op, 0)) {
29
{
30
return true;
30
return status->float_rounding_mode;
31
}
32
- return false;
33
+ return finish_folding(ctx, op);
34
}
31
}
35
32
36
/* We cannot as yet do_constant_folding with vectors. */
33
-static inline int get_float_exception_flags(float_status *status)
37
@@ -XXX,XX +XXX,XX @@ static bool fold_add_vec(OptContext *ctx, TCGOp *op)
34
+static inline int get_float_exception_flags(const float_status *status)
38
fold_xi_to_x(ctx, op, 0)) {
35
{
39
return true;
36
return status->float_exception_flags;
40
}
41
- return false;
42
+ return finish_folding(ctx, op);
43
}
37
}
44
38
45
static bool fold_addsub2(OptContext *ctx, TCGOp *op, bool add)
39
static inline FloatX80RoundPrec
46
@@ -XXX,XX +XXX,XX @@ static bool fold_addsub2(OptContext *ctx, TCGOp *op, bool add)
40
-get_floatx80_rounding_precision(float_status *status)
47
op->args[4] = arg_new_constant(ctx, bl);
41
+get_floatx80_rounding_precision(const float_status *status)
48
op->args[5] = arg_new_constant(ctx, bh);
42
{
49
}
43
return status->floatx80_rounding_precision;
50
- return false;
51
+ return finish_folding(ctx, op);
52
}
44
}
53
45
54
static bool fold_add2(OptContext *ctx, TCGOp *op)
46
-static inline Float2NaNPropRule get_float_2nan_prop_rule(float_status *status)
47
+static inline Float2NaNPropRule
48
+get_float_2nan_prop_rule(const float_status *status)
49
{
50
return status->float_2nan_prop_rule;
51
}
52
53
-static inline Float3NaNPropRule get_float_3nan_prop_rule(float_status *status)
54
+static inline Float3NaNPropRule
55
+get_float_3nan_prop_rule(const float_status *status)
56
{
57
return status->float_3nan_prop_rule;
58
}
59
60
-static inline FloatInfZeroNaNRule get_float_infzeronan_rule(float_status *status)
61
+static inline FloatInfZeroNaNRule
62
+get_float_infzeronan_rule(const float_status *status)
63
{
64
return status->float_infzeronan_rule;
65
}
66
67
-static inline uint8_t get_float_default_nan_pattern(float_status *status)
68
+static inline uint8_t get_float_default_nan_pattern(const float_status *status)
69
{
70
return status->default_nan_pattern;
71
}
72
73
-static inline bool get_flush_to_zero(float_status *status)
74
+static inline bool get_flush_to_zero(const float_status *status)
75
{
76
return status->flush_to_zero;
77
}
78
79
-static inline bool get_flush_inputs_to_zero(float_status *status)
80
+static inline bool get_flush_inputs_to_zero(const float_status *status)
81
{
82
return status->flush_inputs_to_zero;
83
}
84
85
-static inline bool get_default_nan_mode(float_status *status)
86
+static inline bool get_default_nan_mode(const float_status *status)
87
{
88
return status->default_nan_mode;
89
}
55
--
90
--
56
2.43.0
91
2.43.0
92
93
diff view generated by jsdifflib
Deleted patch
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
Sink mask computation below fold_affected_mask early exit.
3
1
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/optimize.c | 30 ++++++++++++++++--------------
8
1 file changed, 16 insertions(+), 14 deletions(-)
9
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
13
+++ b/tcg/optimize.c
14
@@ -XXX,XX +XXX,XX @@ static bool fold_add2(OptContext *ctx, TCGOp *op)
15
16
static bool fold_and(OptContext *ctx, TCGOp *op)
17
{
18
- uint64_t z1, z2;
19
+ uint64_t z1, z2, z_mask, s_mask;
20
+ TempOptInfo *t1, *t2;
21
22
if (fold_const2_commutative(ctx, op) ||
23
fold_xi_to_i(ctx, op, 0) ||
24
@@ -XXX,XX +XXX,XX @@ static bool fold_and(OptContext *ctx, TCGOp *op)
25
return true;
26
}
27
28
- z1 = arg_info(op->args[1])->z_mask;
29
- z2 = arg_info(op->args[2])->z_mask;
30
- ctx->z_mask = z1 & z2;
31
-
32
- /*
33
- * Sign repetitions are perforce all identical, whether they are 1 or 0.
34
- * Bitwise operations preserve the relative quantity of the repetitions.
35
- */
36
- ctx->s_mask = arg_info(op->args[1])->s_mask
37
- & arg_info(op->args[2])->s_mask;
38
+ t1 = arg_info(op->args[1]);
39
+ t2 = arg_info(op->args[2]);
40
+ z1 = t1->z_mask;
41
+ z2 = t2->z_mask;
42
43
/*
44
* Known-zeros does not imply known-ones. Therefore unless
45
* arg2 is constant, we can't infer affected bits from it.
46
*/
47
- if (arg_is_const(op->args[2]) &&
48
- fold_affected_mask(ctx, op, z1 & ~z2)) {
49
+ if (ti_is_const(t2) && fold_affected_mask(ctx, op, z1 & ~z2)) {
50
return true;
51
}
52
53
- return fold_masks(ctx, op);
54
+ z_mask = z1 & z2;
55
+
56
+ /*
57
+ * Sign repetitions are perforce all identical, whether they are 1 or 0.
58
+ * Bitwise operations preserve the relative quantity of the repetitions.
59
+ */
60
+ s_mask = t1->s_mask & t2->s_mask;
61
+
62
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
63
}
64
65
static bool fold_andc(OptContext *ctx, TCGOp *op)
66
--
67
2.43.0
diff view generated by jsdifflib
Deleted patch
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
Avoid double inversion of the value of second const operand.
3
1
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/optimize.c | 21 +++++++++++----------
8
1 file changed, 11 insertions(+), 10 deletions(-)
9
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
13
+++ b/tcg/optimize.c
14
@@ -XXX,XX +XXX,XX @@ static bool fold_and(OptContext *ctx, TCGOp *op)
15
16
static bool fold_andc(OptContext *ctx, TCGOp *op)
17
{
18
- uint64_t z1;
19
+ uint64_t z_mask, s_mask;
20
+ TempOptInfo *t1, *t2;
21
22
if (fold_const2(ctx, op) ||
23
fold_xx_to_i(ctx, op, 0) ||
24
@@ -XXX,XX +XXX,XX @@ static bool fold_andc(OptContext *ctx, TCGOp *op)
25
return true;
26
}
27
28
- z1 = arg_info(op->args[1])->z_mask;
29
+ t1 = arg_info(op->args[1]);
30
+ t2 = arg_info(op->args[2]);
31
+ z_mask = t1->z_mask;
32
33
/*
34
* Known-zeros does not imply known-ones. Therefore unless
35
* arg2 is constant, we can't infer anything from it.
36
*/
37
- if (arg_is_const(op->args[2])) {
38
- uint64_t z2 = ~arg_info(op->args[2])->z_mask;
39
- if (fold_affected_mask(ctx, op, z1 & ~z2)) {
40
+ if (ti_is_const(t2)) {
41
+ uint64_t v2 = ti_const_val(t2);
42
+ if (fold_affected_mask(ctx, op, z_mask & v2)) {
43
return true;
44
}
45
- z1 &= z2;
46
+ z_mask &= ~v2;
47
}
48
- ctx->z_mask = z1;
49
50
- ctx->s_mask = arg_info(op->args[1])->s_mask
51
- & arg_info(op->args[2])->s_mask;
52
- return fold_masks(ctx, op);
53
+ s_mask = t1->s_mask & t2->s_mask;
54
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
55
}
56
57
static bool fold_brcond(OptContext *ctx, TCGOp *op)
58
--
59
2.43.0
diff view generated by jsdifflib
Deleted patch
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
Compute s_mask from the union of the maximum count and the
3
op2 fallback for op1 being zero.
4
1
5
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
8
tcg/optimize.c | 15 ++++++++++-----
9
1 file changed, 10 insertions(+), 5 deletions(-)
10
11
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/optimize.c
14
+++ b/tcg/optimize.c
15
@@ -XXX,XX +XXX,XX @@ static bool fold_call(OptContext *ctx, TCGOp *op)
16
17
static bool fold_count_zeros(OptContext *ctx, TCGOp *op)
18
{
19
- uint64_t z_mask;
20
+ uint64_t z_mask, s_mask;
21
+ TempOptInfo *t1 = arg_info(op->args[1]);
22
+ TempOptInfo *t2 = arg_info(op->args[2]);
23
24
- if (arg_is_const(op->args[1])) {
25
- uint64_t t = arg_info(op->args[1])->val;
26
+ if (ti_is_const(t1)) {
27
+ uint64_t t = ti_const_val(t1);
28
29
if (t != 0) {
30
t = do_constant_folding(op->opc, ctx->type, t, 0);
31
@@ -XXX,XX +XXX,XX @@ static bool fold_count_zeros(OptContext *ctx, TCGOp *op)
32
default:
33
g_assert_not_reached();
34
}
35
- ctx->z_mask = arg_info(op->args[2])->z_mask | z_mask;
36
- return false;
37
+ s_mask = ~z_mask;
38
+ z_mask |= t2->z_mask;
39
+ s_mask &= t2->s_mask;
40
+
41
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
42
}
43
44
static bool fold_ctpop(OptContext *ctx, TCGOp *op)
45
--
46
2.43.0
diff view generated by jsdifflib
Deleted patch
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
When we fold to and, use fold_and.
3
1
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/optimize.c | 35 +++++++++++++++++------------------
8
1 file changed, 17 insertions(+), 18 deletions(-)
9
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
13
+++ b/tcg/optimize.c
14
@@ -XXX,XX +XXX,XX @@ static bool fold_ctpop(OptContext *ctx, TCGOp *op)
15
16
static bool fold_deposit(OptContext *ctx, TCGOp *op)
17
{
18
+ TempOptInfo *t1 = arg_info(op->args[1]);
19
+ TempOptInfo *t2 = arg_info(op->args[2]);
20
+ int ofs = op->args[3];
21
+ int len = op->args[4];
22
TCGOpcode and_opc;
23
+ uint64_t z_mask;
24
25
- if (arg_is_const(op->args[1]) && arg_is_const(op->args[2])) {
26
- uint64_t t1 = arg_info(op->args[1])->val;
27
- uint64_t t2 = arg_info(op->args[2])->val;
28
-
29
- t1 = deposit64(t1, op->args[3], op->args[4], t2);
30
- return tcg_opt_gen_movi(ctx, op, op->args[0], t1);
31
+ if (ti_is_const(t1) && ti_is_const(t2)) {
32
+ return tcg_opt_gen_movi(ctx, op, op->args[0],
33
+ deposit64(ti_const_val(t1), ofs, len,
34
+ ti_const_val(t2)));
35
}
36
37
switch (ctx->type) {
38
@@ -XXX,XX +XXX,XX @@ static bool fold_deposit(OptContext *ctx, TCGOp *op)
39
}
40
41
/* Inserting a value into zero at offset 0. */
42
- if (arg_is_const_val(op->args[1], 0) && op->args[3] == 0) {
43
- uint64_t mask = MAKE_64BIT_MASK(0, op->args[4]);
44
+ if (ti_is_const_val(t1, 0) && ofs == 0) {
45
+ uint64_t mask = MAKE_64BIT_MASK(0, len);
46
47
op->opc = and_opc;
48
op->args[1] = op->args[2];
49
op->args[2] = arg_new_constant(ctx, mask);
50
- ctx->z_mask = mask & arg_info(op->args[1])->z_mask;
51
- return false;
52
+ return fold_and(ctx, op);
53
}
54
55
/* Inserting zero into a value. */
56
- if (arg_is_const_val(op->args[2], 0)) {
57
- uint64_t mask = deposit64(-1, op->args[3], op->args[4], 0);
58
+ if (ti_is_const_val(t2, 0)) {
59
+ uint64_t mask = deposit64(-1, ofs, len, 0);
60
61
op->opc = and_opc;
62
op->args[2] = arg_new_constant(ctx, mask);
63
- ctx->z_mask = mask & arg_info(op->args[1])->z_mask;
64
- return false;
65
+ return fold_and(ctx, op);
66
}
67
68
- ctx->z_mask = deposit64(arg_info(op->args[1])->z_mask,
69
- op->args[3], op->args[4],
70
- arg_info(op->args[2])->z_mask);
71
- return false;
72
+ z_mask = deposit64(t1->z_mask, ofs, len, t2->z_mask);
73
+ return fold_masks_z(ctx, op, z_mask);
74
}
75
76
static bool fold_divide(OptContext *ctx, TCGOp *op)
77
--
78
2.43.0
diff view generated by jsdifflib