1 | The following changes since commit 2946e1af2704bf6584f57d4e3aec49d1d5f3ecc0: | 1 | With a couple of linux-user and target/sparc patches thrown in for good measure. |
---|---|---|---|
2 | 2 | ||
3 | configure: Disable thread-safety warnings on macOS (2023-03-04 14:03:46 +0000) | 3 | r~ |
4 | |||
5 | |||
6 | The following changes since commit 495de0fd82d8bb2d7035f82d9869cfeb48de2f9e: | ||
7 | |||
8 | Merge tag 'pull-trivial-patches' of https://gitlab.com/mjt0k/qemu into staging (2025-02-14 08:19:05 -0500) | ||
4 | 9 | ||
5 | are available in the Git repository at: | 10 | are available in the Git repository at: |
6 | 11 | ||
7 | https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20230305 | 12 | https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20250215 |
8 | 13 | ||
9 | for you to fetch changes up to b6611d8d5c265c138a4a0cc36a2c02d84a768976: | 14 | for you to fetch changes up to 2132751069134114814c7e1609e9cf644f077aad: |
10 | 15 | ||
11 | target/xtensa: Avoid tcg_const_i32 (2023-03-05 13:47:25 -0800) | 16 | target/sparc: fake UltraSPARC T1 PCR and PIC registers (2025-02-15 12:04:13 -0800) |
12 | 17 | ||
13 | ---------------------------------------------------------------- | 18 | ---------------------------------------------------------------- |
14 | tcg: Merge two sequential labels | 19 | tcg: Remove last traces of TCG_TARGET_NEED_POOL_LABELS |
15 | accel/tcg: Retain prot flags from tlb_fill | 20 | tcg: Cleanups after disallowing 64-on-32 |
16 | accel/tcg: Honor TLB_DISCARD_WRITE in atomic_mmu_lookup | 21 | tcg: Introduce constraint for zero register |
17 | accel/tcg: Honor TLB_WATCHPOINTS in atomic_mmu_lookup | 22 | linux-user: Move TARGET_SA_RESTORER out of generic/signal.h |
18 | target/sparc: Use tlb_set_page_full | 23 | linux-user: Fix alignment when unmapping excess reservation |
19 | include/qemu/cpuid: Introduce xgetbv_low | 24 | target/sparc: Fix register selection for all F*TOx and FxTO* instructions |
20 | tcg/i386: Mark Win64 call-saved vector regs as reserved | 25 | target/sparc: Fix gdbstub incorrectly handling registers f32-f62 |
21 | tcg: Decode the operand to INDEX_op_mb in dumps | 26 | target/sparc: fake UltraSPARC T1 PCR and PIC registers |
22 | |||
23 | Portion of the target/ patchset which eliminates use of tcg_temp_free* | ||
24 | Portion of the target/ patchset which eliminates use of tcg_const* | ||
25 | 27 | ||
26 | ---------------------------------------------------------------- | 28 | ---------------------------------------------------------------- |
27 | Richard Henderson (83): | 29 | Andreas Schwab (1): |
28 | tcg: Link branches to the labels | 30 | linux-user: Move TARGET_SA_RESTORER out of generic/signal.h |
29 | tcg: Merge two sequential labels | ||
30 | target/sparc: Use tlb_set_page_full | ||
31 | accel/tcg: Retain prot flags from tlb_fill | ||
32 | accel/tcg: Honor TLB_DISCARD_WRITE in atomic_mmu_lookup | ||
33 | softmmu: Check watchpoints for read+write at once | ||
34 | accel/tcg: Trigger watchpoints from atomic_mmu_lookup | ||
35 | include/qemu/cpuid: Introduce xgetbv_low | ||
36 | tcg/i386: Mark Win64 call-saved vector regs as reserved | ||
37 | tcg: Decode the operand to INDEX_op_mb in dumps | ||
38 | tcg: Remove tcg_check_temp_count, tcg_clear_temp_count | ||
39 | accel/tcg: Remove translator_loop_temp_check | ||
40 | target/alpha: Drop tcg_temp_free | ||
41 | target/arm: Remove arm_free_cc, a64_free_cc | ||
42 | target/arm: Remove value_global from DisasCompare | ||
43 | target/arm: Drop tcg_temp_free from translator.c | ||
44 | target/arm: Drop DisasContext.tmp_a64 | ||
45 | target/arm: Drop new_tmp_a64 | ||
46 | target/arm: Drop new_tmp_a64_zero | ||
47 | target/arm: Drop tcg_temp_free from translator-a64.c | ||
48 | target/arm: Drop tcg_temp_free from translator-m-nocp.c | ||
49 | target/arm: Drop tcg_temp_free from translator-mve.c | ||
50 | target/arm: Drop tcg_temp_free from translator-neon.c | ||
51 | target/arm: Drop tcg_temp_free from translator-sme.c | ||
52 | target/arm: Drop tcg_temp_free from translator-sve.c | ||
53 | target/arm: Drop tcg_temp_free from translator-vfp.c | ||
54 | target/arm: Drop tcg_temp_free from translator.h | ||
55 | target/avr: Drop DisasContext.free_skip_var0 | ||
56 | target/avr: Drop R from trans_COM | ||
57 | target/avr: Drop tcg_temp_free | ||
58 | target/cris: Drop cris_alu_free_temps | ||
59 | target/cris: Drop cris_alu_m_free_temps | ||
60 | target/cris: Drop addr from dec10_ind_move_m_pr | ||
61 | target/cris: Drop tcg_temp_free | ||
62 | target/hexagon: Drop tcg_temp_free from C code | ||
63 | target/hexagon: Drop tcg_temp_free from gen_tcg_funcs.py | ||
64 | target/hexagon/idef-parser: Drop tcg_temp_free | ||
65 | target/hexagon/idef-parser: Drop HexValue.is_manual | ||
66 | target/hppa: Drop tcg_temp_free | ||
67 | target/loongarch: Drop temp_new | ||
68 | target/loongarch: Drop tcg_temp_free | ||
69 | target/m68k: Drop mark_to_release | ||
70 | target/m68k: Drop free_cond | ||
71 | target/m68k: Drop tcg_temp_free | ||
72 | target/microblaze: Drop tcg_temp_free | ||
73 | target/nios2: Drop tcg_temp_free | ||
74 | target/openrisc: Drop tcg_temp_free | ||
75 | target/ppc: Drop tcg_temp_free | ||
76 | target/riscv: Drop ftemp_new | ||
77 | target/riscv: Drop temp_new | ||
78 | target/riscv: Drop tcg_temp_free | ||
79 | target/rx: Drop tcg_temp_free | ||
80 | target/sh4: Drop tcg_temp_free | ||
81 | target/sparc: Drop get_temp_tl | ||
82 | target/sparc: Drop get_temp_i32 | ||
83 | target/sparc: Remove egress label in disas_sparc_context | ||
84 | target/sparc: Drop free_compare | ||
85 | target/sparc: Drop tcg_temp_free | ||
86 | target/xtensa: Drop reset_sar_tracker | ||
87 | target/xtensa: Drop tcg_temp_free | ||
88 | target/i386: Drop tcg_temp_free | ||
89 | target/mips: Drop tcg_temp_free from mips16e_translate.c.inc | ||
90 | target/mips: Fix trans_mult_acc return | ||
91 | target/tricore: Drop tcg_temp_free | ||
92 | include/exec/gen-icount: Drop tcg_temp_free in gen_tb_start | ||
93 | tracing: remove transform.py | ||
94 | docs/devel/tcg-ops: Drop recommendation to free temps | ||
95 | target/hexagon: Use tcg_constant_* for gen_constant_from_imm | ||
96 | target/hexagon/idef-parser: Use gen_tmp for LPCFG | ||
97 | target/hexagon/idef-parser: Use gen_tmp for gen_pred_assign | ||
98 | target/hexagon/idef-parser: Use gen_tmp for gen_rvalue_pred | ||
99 | target/hexagon/idef-parser: Use gen_constant for gen_extend_tcg_width_op | ||
100 | target/i386: Simplify POPF | ||
101 | target/microblaze: Avoid tcg_const_* throughout | ||
102 | target/riscv: Avoid tcg_const_* | ||
103 | target/s390x: Split out gen_ri2 | ||
104 | target/sparc: Avoid tcg_const_{tl,i32} | ||
105 | target/xtensa: Tidy translate_bb | ||
106 | target/xtensa: Tidy translate_clamps | ||
107 | target/xtensa: Avoid tcg_const_i32 in translate_l32r | ||
108 | target/xtensa: Use tcg_gen_subfi_i32 in translate_sll | ||
109 | target/xtensa: Split constant in bit shift | ||
110 | target/xtensa: Avoid tcg_const_i32 | ||
111 | 31 | ||
112 | Richard W.M. Jones (1): | 32 | Artyom Tarasenko (1): |
113 | tcg: Include "qemu/timer.h" for profile_getclock | 33 | target/sparc: fake UltraSPARC T1 PCR and PIC registers |
114 | 34 | ||
115 | docs/devel/tcg-ops.rst | 4 - | 35 | Fabiano Rosas (1): |
116 | target/hexagon/idef-parser/README.rst | 8 - | 36 | elfload: Fix alignment when unmapping excess reservation |
117 | meson.build | 1 - | 37 | |
118 | include/exec/gen-icount.h | 2 - | 38 | Mikael Szreder (2): |
119 | include/exec/translator.h | 2 - | 39 | target/sparc: Fix register selection for all F*TOx and FxTO* instructions |
120 | include/hw/core/cpu.h | 7 +- | 40 | target/sparc: Fix gdbstub incorrectly handling registers f32-f62 |
121 | include/qemu/cpuid.h | 7 + | 41 | |
122 | include/tcg/tcg-op.h | 7 +- | 42 | Richard Henderson (19): |
123 | include/tcg/tcg.h | 33 +- | 43 | tcg: Remove last traces of TCG_TARGET_NEED_POOL_LABELS |
124 | target/arm/tcg/translate-a64.h | 2 - | 44 | tcg: Remove TCG_OVERSIZED_GUEST |
125 | target/arm/tcg/translate.h | 7 - | 45 | tcg: Drop support for two address registers in gen_ldst |
126 | target/hexagon/gen_tcg.h | 29 - | 46 | tcg: Merge INDEX_op_qemu_*_{a32,a64}_* |
127 | target/hexagon/gen_tcg_hvx.h | 15 - | 47 | tcg/arm: Drop addrhi from prepare_host_addr |
128 | target/hexagon/idef-parser/idef-parser.h | 1 - | 48 | tcg/i386: Drop addrhi from prepare_host_addr |
129 | target/hexagon/idef-parser/parser-helpers.h | 10 - | 49 | tcg/mips: Drop addrhi from prepare_host_addr |
130 | target/hexagon/macros.h | 7 - | 50 | tcg/ppc: Drop addrhi from prepare_host_addr |
131 | target/loongarch/translate.h | 3 - | 51 | tcg: Replace addr{lo,hi}_reg with addr_reg in TCGLabelQemuLdst |
132 | accel/tcg/cputlb.c | 43 +- | 52 | plugins: Fix qemu_plugin_read_memory_vaddr parameters |
133 | accel/tcg/tcg-accel-ops.c | 1 + | 53 | accel/tcg: Fix tlb_set_page_with_attrs, tlb_set_page |
134 | accel/tcg/translate-all.c | 1 + | 54 | include/exec: Change vaddr to uintptr_t |
135 | accel/tcg/translator.c | 16 - | 55 | include/exec: Use uintptr_t in CPUTLBEntry |
136 | softmmu/runstate.c | 1 + | 56 | tcg: Introduce the 'z' constraint for a hardware zero register |
137 | softmmu/watchpoint.c | 19 +- | 57 | tcg/aarch64: Use 'z' constraint |
138 | target/alpha/translate.c | 71 --- | 58 | tcg/loongarch64: Use 'z' constraint |
139 | target/arm/tcg/translate-a64.c | 594 ++------------------- | 59 | tcg/mips: Use 'z' constraint |
140 | target/arm/tcg/translate-m-nocp.c | 20 - | 60 | tcg/riscv: Use 'z' constraint |
141 | target/arm/tcg/translate-mve.c | 52 -- | 61 | tcg/sparc64: Use 'z' constraint |
142 | target/arm/tcg/translate-neon.c | 131 +---- | 62 | |
143 | target/arm/tcg/translate-sme.c | 28 - | 63 | include/exec/tlb-common.h | 10 +- |
144 | target/arm/tcg/translate-sve.c | 206 +------ | 64 | include/exec/vaddr.h | 16 ++-- |
145 | target/arm/tcg/translate-vfp.c | 193 ------- | 65 | include/qemu/atomic.h | 18 +--- |
146 | target/arm/tcg/translate.c | 281 +--------- | 66 | include/tcg/oversized-guest.h | 23 ----- |
147 | target/avr/translate.c | 251 --------- | 67 | include/tcg/tcg-opc.h | 28 ++---- |
148 | target/cris/translate.c | 113 ---- | 68 | include/tcg/tcg.h | 3 +- |
149 | target/hexagon/genptr.c | 58 -- | 69 | linux-user/aarch64/target_signal.h | 2 + |
150 | target/hexagon/idef-parser/parser-helpers.c | 206 +------ | 70 | linux-user/arm/target_signal.h | 2 + |
151 | target/hexagon/translate.c | 7 - | 71 | linux-user/generic/signal.h | 1 - |
152 | target/hppa/translate.c | 93 +--- | 72 | linux-user/i386/target_signal.h | 2 + |
153 | target/i386/tcg/translate.c | 96 +--- | 73 | linux-user/m68k/target_signal.h | 1 + |
154 | target/loongarch/translate.c | 21 +- | 74 | linux-user/microblaze/target_signal.h | 2 + |
155 | target/m68k/translate.c | 276 +--------- | 75 | linux-user/ppc/target_signal.h | 2 + |
156 | target/microblaze/translate.c | 89 +-- | 76 | linux-user/s390x/target_signal.h | 2 + |
157 | target/mips/tcg/vr54xx_translate.c | 2 +- | 77 | linux-user/sh4/target_signal.h | 2 + |
158 | target/nios2/translate.c | 15 - | 78 | linux-user/x86_64/target_signal.h | 2 + |
159 | target/openrisc/translate.c | 39 -- | 79 | linux-user/xtensa/target_signal.h | 2 + |
160 | target/ppc/translate.c | 285 ---------- | 80 | tcg/aarch64/tcg-target-con-set.h | 12 +-- |
161 | target/riscv/translate.c | 65 +-- | 81 | tcg/aarch64/tcg-target.h | 2 + |
162 | target/rx/translate.c | 84 --- | 82 | tcg/loongarch64/tcg-target-con-set.h | 15 ++- |
163 | target/s390x/tcg/translate.c | 23 +- | 83 | tcg/loongarch64/tcg-target-con-str.h | 1 - |
164 | target/sh4/translate.c | 110 ---- | 84 | tcg/loongarch64/tcg-target.h | 2 + |
165 | target/sparc/mmu_helper.c | 121 ++--- | 85 | tcg/mips/tcg-target-con-set.h | 26 +++--- |
166 | target/sparc/translate.c | 339 +++--------- | 86 | tcg/mips/tcg-target-con-str.h | 1 - |
167 | target/tricore/translate.c | 540 +------------------ | 87 | tcg/mips/tcg-target.h | 2 + |
168 | target/xtensa/translate.c | 171 +----- | 88 | tcg/riscv/tcg-target-con-set.h | 10 +- |
169 | tcg/tcg-op.c | 22 +- | 89 | tcg/riscv/tcg-target-con-str.h | 1 - |
170 | tcg/tcg.c | 208 ++++++-- | 90 | tcg/riscv/tcg-target.h | 2 + |
171 | util/bufferiszero.c | 3 +- | 91 | tcg/sparc64/tcg-target-con-set.h | 12 +-- |
172 | target/cris/translate_v10.c.inc | 49 +- | 92 | tcg/sparc64/tcg-target-con-str.h | 1 - |
173 | target/i386/tcg/decode-new.c.inc | 15 - | 93 | tcg/sparc64/tcg-target.h | 3 +- |
174 | target/i386/tcg/emit.c.inc | 6 - | 94 | tcg/tci/tcg-target.h | 1 - |
175 | target/loongarch/insn_trans/trans_arith.c.inc | 12 - | 95 | accel/tcg/cputlb.c | 32 ++----- |
176 | target/loongarch/insn_trans/trans_atomic.c.inc | 3 - | 96 | accel/tcg/tcg-all.c | 9 +- |
177 | target/loongarch/insn_trans/trans_bit.c.inc | 12 - | 97 | linux-user/elfload.c | 4 +- |
178 | target/loongarch/insn_trans/trans_fcmp.c.inc | 3 - | 98 | plugins/api.c | 2 +- |
179 | target/loongarch/insn_trans/trans_fmemory.c.inc | 20 +- | 99 | target/arm/ptw.c | 34 ------- |
180 | target/loongarch/insn_trans/trans_fmov.c.inc | 6 - | 100 | target/riscv/cpu_helper.c | 13 +-- |
181 | target/loongarch/insn_trans/trans_memory.c.inc | 34 +- | 101 | target/sparc/gdbstub.c | 18 +++- |
182 | target/loongarch/insn_trans/trans_privileged.c.inc | 6 +- | 102 | target/sparc/translate.c | 19 ++++ |
183 | target/loongarch/insn_trans/trans_shift.c.inc | 11 - | 103 | tcg/optimize.c | 21 ++--- |
184 | target/mips/tcg/mips16e_translate.c.inc | 6 - | 104 | tcg/tcg-op-ldst.c | 103 +++++---------------- |
185 | target/ppc/power8-pmu-regs.c.inc | 16 - | 105 | tcg/tcg.c | 97 +++++++++---------- |
186 | target/ppc/translate/dfp-impl.c.inc | 20 - | 106 | tcg/tci.c | 119 +++++------------------- |
187 | target/ppc/translate/fixedpoint-impl.c.inc | 16 - | 107 | docs/devel/multi-thread-tcg.rst | 1 - |
188 | target/ppc/translate/fp-impl.c.inc | 122 +---- | 108 | docs/devel/tcg-ops.rst | 4 +- |
189 | target/ppc/translate/spe-impl.c.inc | 59 -- | 109 | target/sparc/insns.decode | 19 ++-- |
190 | target/ppc/translate/storage-ctrl-impl.c.inc | 2 - | 110 | tcg/aarch64/tcg-target.c.inc | 86 +++++++---------- |
191 | target/ppc/translate/vmx-impl.c.inc | 296 +--------- | 111 | tcg/arm/tcg-target.c.inc | 104 ++++++--------------- |
192 | target/ppc/translate/vsx-impl.c.inc | 287 +--------- | 112 | tcg/i386/tcg-target.c.inc | 125 +++++++------------------ |
193 | target/riscv/insn_trans/trans_rvb.c.inc | 24 - | 113 | tcg/loongarch64/tcg-target.c.inc | 72 ++++++--------- |
194 | target/riscv/insn_trans/trans_rvd.c.inc | 2 - | 114 | tcg/mips/tcg-target.c.inc | 169 +++++++++++----------------------- |
195 | target/riscv/insn_trans/trans_rvf.c.inc | 9 - | 115 | tcg/ppc/tcg-target.c.inc | 164 ++++++++------------------------- |
196 | target/riscv/insn_trans/trans_rvi.c.inc | 37 -- | 116 | tcg/riscv/tcg-target.c.inc | 56 +++++------ |
197 | target/riscv/insn_trans/trans_rvk.c.inc | 15 - | 117 | tcg/s390x/tcg-target.c.inc | 40 +++----- |
198 | target/riscv/insn_trans/trans_rvm.c.inc | 33 -- | 118 | tcg/sparc64/tcg-target.c.inc | 45 ++++----- |
199 | target/riscv/insn_trans/trans_rvv.c.inc | 59 +- | 119 | tcg/tci/tcg-target.c.inc | 60 +++--------- |
200 | target/riscv/insn_trans/trans_rvzfh.c.inc | 14 +- | 120 | 57 files changed, 536 insertions(+), 1089 deletions(-) |
201 | target/riscv/insn_trans/trans_xthead.c.inc | 24 +- | 121 | delete mode 100644 include/tcg/oversized-guest.h |
202 | tcg/i386/tcg-target.c.inc | 24 +- | ||
203 | scripts/tracetool/__init__.py | 23 - | ||
204 | scripts/tracetool/transform.py | 168 ------ | ||
205 | target/hexagon/README | 5 - | ||
206 | target/hexagon/gen_tcg_funcs.py | 79 +-- | ||
207 | target/hexagon/idef-parser/idef-parser.y | 14 +- | ||
208 | 93 files changed, 579 insertions(+), 5991 deletions(-) | ||
209 | delete mode 100644 scripts/tracetool/transform.py | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | From: "Richard W.M. Jones" <rjones@redhat.com> | ||
2 | 1 | ||
3 | When CONFIG_PROFILER is set there are various undefined references to | ||
4 | profile_getclock. Include the header which defines this function. | ||
5 | |||
6 | For example: | ||
7 | |||
8 | ../tcg/tcg.c: In function ‘tcg_gen_code’: | ||
9 | ../tcg/tcg.c:4905:51: warning: implicit declaration of function ‘profile_getclock’ [-Wimplicit-function-declaration] | ||
10 | 4905 | qatomic_set(&prof->opt_time, prof->opt_time - profile_getclock()); | ||
11 | | ^~~~~~~~~~~~~~~~ | ||
12 | |||
13 | Signed-off-by: Richard W.M. Jones <rjones@redhat.com> | ||
14 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
15 | Reviewed-by: Richard Henderson <richard.henderson@linaro.org> | ||
16 | Message-Id: <20230303084948.3351546-1-rjones@redhat.com> | ||
17 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
18 | --- | ||
19 | accel/tcg/tcg-accel-ops.c | 1 + | ||
20 | accel/tcg/translate-all.c | 1 + | ||
21 | softmmu/runstate.c | 1 + | ||
22 | tcg/tcg.c | 1 + | ||
23 | 4 files changed, 4 insertions(+) | ||
24 | |||
25 | diff --git a/accel/tcg/tcg-accel-ops.c b/accel/tcg/tcg-accel-ops.c | ||
26 | index XXXXXXX..XXXXXXX 100644 | ||
27 | --- a/accel/tcg/tcg-accel-ops.c | ||
28 | +++ b/accel/tcg/tcg-accel-ops.c | ||
29 | @@ -XXX,XX +XXX,XX @@ | ||
30 | #include "sysemu/cpu-timers.h" | ||
31 | #include "qemu/main-loop.h" | ||
32 | #include "qemu/guest-random.h" | ||
33 | +#include "qemu/timer.h" | ||
34 | #include "exec/exec-all.h" | ||
35 | #include "exec/hwaddr.h" | ||
36 | #include "exec/gdbstub.h" | ||
37 | diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c | ||
38 | index XXXXXXX..XXXXXXX 100644 | ||
39 | --- a/accel/tcg/translate-all.c | ||
40 | +++ b/accel/tcg/translate-all.c | ||
41 | @@ -XXX,XX +XXX,XX @@ | ||
42 | #include "qemu/qemu-print.h" | ||
43 | #include "qemu/main-loop.h" | ||
44 | #include "qemu/cacheinfo.h" | ||
45 | +#include "qemu/timer.h" | ||
46 | #include "exec/log.h" | ||
47 | #include "sysemu/cpus.h" | ||
48 | #include "sysemu/cpu-timers.h" | ||
49 | diff --git a/softmmu/runstate.c b/softmmu/runstate.c | ||
50 | index XXXXXXX..XXXXXXX 100644 | ||
51 | --- a/softmmu/runstate.c | ||
52 | +++ b/softmmu/runstate.c | ||
53 | @@ -XXX,XX +XXX,XX @@ | ||
54 | #include "qemu/module.h" | ||
55 | #include "qemu/plugin.h" | ||
56 | #include "qemu/sockets.h" | ||
57 | +#include "qemu/timer.h" | ||
58 | #include "qemu/thread.h" | ||
59 | #include "qom/object.h" | ||
60 | #include "qom/object_interfaces.h" | ||
61 | diff --git a/tcg/tcg.c b/tcg/tcg.c | ||
62 | index XXXXXXX..XXXXXXX 100644 | ||
63 | --- a/tcg/tcg.c | ||
64 | +++ b/tcg/tcg.c | ||
65 | @@ -XXX,XX +XXX,XX @@ | ||
66 | #include "qemu/qemu-print.h" | ||
67 | #include "qemu/cacheflush.h" | ||
68 | #include "qemu/cacheinfo.h" | ||
69 | +#include "qemu/timer.h" | ||
70 | |||
71 | /* Note: the long term plan is to reduce the dependencies on the QEMU | ||
72 | CPU definitions. Currently they are used for qemu_ld/st | ||
73 | -- | ||
74 | 2.34.1 | ||
75 | |||
76 | diff view generated by jsdifflib |
1 | Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> | 1 | These should have been removed with the rest. There are |
---|---|---|---|
2 | a couple of hosts which can emit guest_base into the | ||
3 | constant pool: aarch64, mips64, ppc64, riscv64. | ||
4 | |||
5 | Fixes: a417ef835058 ("tcg: Remove TCG_TARGET_NEED_LDST_LABELS and TCG_TARGET_NEED_POOL_LABELS") | ||
2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
3 | --- | 7 | --- |
4 | tcg/tcg.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ | 8 | tcg/tci/tcg-target.h | 1 - |
5 | 1 file changed, 79 insertions(+) | 9 | tcg/tcg.c | 4 ---- |
10 | 2 files changed, 5 deletions(-) | ||
6 | 11 | ||
12 | diff --git a/tcg/tci/tcg-target.h b/tcg/tci/tcg-target.h | ||
13 | index XXXXXXX..XXXXXXX 100644 | ||
14 | --- a/tcg/tci/tcg-target.h | ||
15 | +++ b/tcg/tci/tcg-target.h | ||
16 | @@ -XXX,XX +XXX,XX @@ typedef enum { | ||
17 | } TCGReg; | ||
18 | |||
19 | #define HAVE_TCG_QEMU_TB_EXEC | ||
20 | -#define TCG_TARGET_NEED_POOL_LABELS | ||
21 | |||
22 | #endif /* TCG_TARGET_H */ | ||
7 | diff --git a/tcg/tcg.c b/tcg/tcg.c | 23 | diff --git a/tcg/tcg.c b/tcg/tcg.c |
8 | index XXXXXXX..XXXXXXX 100644 | 24 | index XXXXXXX..XXXXXXX 100644 |
9 | --- a/tcg/tcg.c | 25 | --- a/tcg/tcg.c |
10 | +++ b/tcg/tcg.c | 26 | +++ b/tcg/tcg.c |
11 | @@ -XXX,XX +XXX,XX @@ static void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs) | 27 | @@ -XXX,XX +XXX,XX @@ void tcg_prologue_init(void) |
12 | arg_label(op->args[k])->id); | 28 | tcg_qemu_tb_exec = (tcg_prologue_fn *)tcg_splitwx_to_rx(s->code_ptr); |
13 | i++, k++; | 29 | #endif |
14 | break; | 30 | |
15 | + case INDEX_op_mb: | 31 | -#ifdef TCG_TARGET_NEED_POOL_LABELS |
16 | + { | 32 | s->pool_labels = NULL; |
17 | + TCGBar membar = op->args[k]; | 33 | -#endif |
18 | + const char *b_op, *m_op; | 34 | |
19 | + | 35 | qemu_thread_jit_write(); |
20 | + switch (membar & TCG_BAR_SC) { | 36 | /* Generate the prologue. */ |
21 | + case 0: | 37 | tcg_target_qemu_prologue(s); |
22 | + b_op = "none"; | 38 | |
23 | + break; | 39 | -#ifdef TCG_TARGET_NEED_POOL_LABELS |
24 | + case TCG_BAR_LDAQ: | 40 | /* Allow the prologue to put e.g. guest_base into a pool entry. */ |
25 | + b_op = "acq"; | 41 | { |
26 | + break; | 42 | int result = tcg_out_pool_finalize(s); |
27 | + case TCG_BAR_STRL: | 43 | tcg_debug_assert(result == 0); |
28 | + b_op = "rel"; | 44 | } |
29 | + break; | 45 | -#endif |
30 | + case TCG_BAR_SC: | 46 | |
31 | + b_op = "seq"; | 47 | prologue_size = tcg_current_code_size(s); |
32 | + break; | 48 | perf_report_prologue(s->code_gen_ptr, prologue_size); |
33 | + default: | ||
34 | + g_assert_not_reached(); | ||
35 | + } | ||
36 | + | ||
37 | + switch (membar & TCG_MO_ALL) { | ||
38 | + case 0: | ||
39 | + m_op = "none"; | ||
40 | + break; | ||
41 | + case TCG_MO_LD_LD: | ||
42 | + m_op = "rr"; | ||
43 | + break; | ||
44 | + case TCG_MO_LD_ST: | ||
45 | + m_op = "rw"; | ||
46 | + break; | ||
47 | + case TCG_MO_ST_LD: | ||
48 | + m_op = "wr"; | ||
49 | + break; | ||
50 | + case TCG_MO_ST_ST: | ||
51 | + m_op = "ww"; | ||
52 | + break; | ||
53 | + case TCG_MO_LD_LD | TCG_MO_LD_ST: | ||
54 | + m_op = "rr+rw"; | ||
55 | + break; | ||
56 | + case TCG_MO_LD_LD | TCG_MO_ST_LD: | ||
57 | + m_op = "rr+wr"; | ||
58 | + break; | ||
59 | + case TCG_MO_LD_LD | TCG_MO_ST_ST: | ||
60 | + m_op = "rr+ww"; | ||
61 | + break; | ||
62 | + case TCG_MO_LD_ST | TCG_MO_ST_LD: | ||
63 | + m_op = "rw+wr"; | ||
64 | + break; | ||
65 | + case TCG_MO_LD_ST | TCG_MO_ST_ST: | ||
66 | + m_op = "rw+ww"; | ||
67 | + break; | ||
68 | + case TCG_MO_ST_LD | TCG_MO_ST_ST: | ||
69 | + m_op = "wr+ww"; | ||
70 | + break; | ||
71 | + case TCG_MO_LD_LD | TCG_MO_LD_ST | TCG_MO_ST_LD: | ||
72 | + m_op = "rr+rw+wr"; | ||
73 | + break; | ||
74 | + case TCG_MO_LD_LD | TCG_MO_LD_ST | TCG_MO_ST_ST: | ||
75 | + m_op = "rr+rw+ww"; | ||
76 | + break; | ||
77 | + case TCG_MO_LD_LD | TCG_MO_ST_LD | TCG_MO_ST_ST: | ||
78 | + m_op = "rr+wr+ww"; | ||
79 | + break; | ||
80 | + case TCG_MO_LD_ST | TCG_MO_ST_LD | TCG_MO_ST_ST: | ||
81 | + m_op = "rw+wr+ww"; | ||
82 | + break; | ||
83 | + case TCG_MO_ALL: | ||
84 | + m_op = "all"; | ||
85 | + break; | ||
86 | + default: | ||
87 | + g_assert_not_reached(); | ||
88 | + } | ||
89 | + | ||
90 | + col += ne_fprintf(f, "%s%s:%s", (k ? "," : ""), b_op, m_op); | ||
91 | + i++, k++; | ||
92 | + } | ||
93 | + break; | ||
94 | default: | ||
95 | break; | ||
96 | } | ||
97 | -- | 49 | -- |
98 | 2.34.1 | 50 | 2.43.0 |
99 | |||
100 | diff view generated by jsdifflib |
1 | Fixes a bug in that we weren't reporting these changes. | 1 | This is now prohibited in configuration. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | 3 | Reviewed-by: Alex Bennée <alex.bennee@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 | accel/tcg/cputlb.c | 40 +++++++++++++++++++++++++++++----------- | 6 | include/qemu/atomic.h | 18 +++-------------- |
7 | 1 file changed, 29 insertions(+), 11 deletions(-) | 7 | include/tcg/oversized-guest.h | 23 ---------------------- |
8 | 8 | accel/tcg/cputlb.c | 7 ------- | |
9 | accel/tcg/tcg-all.c | 9 ++++----- | ||
10 | target/arm/ptw.c | 34 --------------------------------- | ||
11 | target/riscv/cpu_helper.c | 13 +------------ | ||
12 | docs/devel/multi-thread-tcg.rst | 1 - | ||
13 | 7 files changed, 8 insertions(+), 97 deletions(-) | ||
14 | delete mode 100644 include/tcg/oversized-guest.h | ||
15 | |||
16 | diff --git a/include/qemu/atomic.h b/include/qemu/atomic.h | ||
17 | index XXXXXXX..XXXXXXX 100644 | ||
18 | --- a/include/qemu/atomic.h | ||
19 | +++ b/include/qemu/atomic.h | ||
20 | @@ -XXX,XX +XXX,XX @@ | ||
21 | */ | ||
22 | #define signal_barrier() __atomic_signal_fence(__ATOMIC_SEQ_CST) | ||
23 | |||
24 | -/* Sanity check that the size of an atomic operation isn't "overly large". | ||
25 | +/* | ||
26 | + * Sanity check that the size of an atomic operation isn't "overly large". | ||
27 | * Despite the fact that e.g. i686 has 64-bit atomic operations, we do not | ||
28 | * want to use them because we ought not need them, and this lets us do a | ||
29 | * bit of sanity checking that other 32-bit hosts might build. | ||
30 | - * | ||
31 | - * That said, we have a problem on 64-bit ILP32 hosts in that in order to | ||
32 | - * sync with TCG_OVERSIZED_GUEST, this must match TCG_TARGET_REG_BITS. | ||
33 | - * We'd prefer not want to pull in everything else TCG related, so handle | ||
34 | - * those few cases by hand. | ||
35 | - * | ||
36 | - * Note that x32 is fully detected with __x86_64__ + _ILP32, and that for | ||
37 | - * Sparc we always force the use of sparcv9 in configure. MIPS n32 (ILP32) & | ||
38 | - * n64 (LP64) ABIs are both detected using __mips64. | ||
39 | */ | ||
40 | -#if defined(__x86_64__) || defined(__sparc__) || defined(__mips64) | ||
41 | -# define ATOMIC_REG_SIZE 8 | ||
42 | -#else | ||
43 | -# define ATOMIC_REG_SIZE sizeof(void *) | ||
44 | -#endif | ||
45 | +#define ATOMIC_REG_SIZE sizeof(void *) | ||
46 | |||
47 | /* Weak atomic operations prevent the compiler moving other | ||
48 | * loads/stores past the atomic operation load/store. However there is | ||
49 | diff --git a/include/tcg/oversized-guest.h b/include/tcg/oversized-guest.h | ||
50 | deleted file mode 100644 | ||
51 | index XXXXXXX..XXXXXXX | ||
52 | --- a/include/tcg/oversized-guest.h | ||
53 | +++ /dev/null | ||
54 | @@ -XXX,XX +XXX,XX @@ | ||
55 | -/* SPDX-License-Identifier: MIT */ | ||
56 | -/* | ||
57 | - * Define TCG_OVERSIZED_GUEST | ||
58 | - * Copyright (c) 2008 Fabrice Bellard | ||
59 | - */ | ||
60 | - | ||
61 | -#ifndef EXEC_TCG_OVERSIZED_GUEST_H | ||
62 | -#define EXEC_TCG_OVERSIZED_GUEST_H | ||
63 | - | ||
64 | -#include "tcg-target-reg-bits.h" | ||
65 | -#include "cpu-param.h" | ||
66 | - | ||
67 | -/* | ||
68 | - * Oversized TCG guests make things like MTTCG hard | ||
69 | - * as we can't use atomics for cputlb updates. | ||
70 | - */ | ||
71 | -#if TARGET_LONG_BITS > TCG_TARGET_REG_BITS | ||
72 | -#define TCG_OVERSIZED_GUEST 1 | ||
73 | -#else | ||
74 | -#define TCG_OVERSIZED_GUEST 0 | ||
75 | -#endif | ||
76 | - | ||
77 | -#endif | ||
9 | diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c | 78 | diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c |
10 | index XXXXXXX..XXXXXXX 100644 | 79 | index XXXXXXX..XXXXXXX 100644 |
11 | --- a/accel/tcg/cputlb.c | 80 | --- a/accel/tcg/cputlb.c |
12 | +++ b/accel/tcg/cputlb.c | 81 | +++ b/accel/tcg/cputlb.c |
13 | @@ -XXX,XX +XXX,XX @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr, | 82 | @@ -XXX,XX +XXX,XX @@ |
14 | CPUTLBEntry *tlbe; | 83 | #include "qemu/plugin-memory.h" |
15 | target_ulong tlb_addr; | 84 | #endif |
16 | void *hostaddr; | 85 | #include "tcg/tcg-ldst.h" |
17 | + CPUTLBEntryFull *full; | 86 | -#include "tcg/oversized-guest.h" |
18 | 87 | ||
19 | tcg_debug_assert(mmu_idx < NB_MMU_MODES); | 88 | /* DEBUG defines, enable DEBUG_TLB_LOG to log to the CPU_LOG_MMU target */ |
20 | 89 | /* #define DEBUG_TLB */ | |
21 | @@ -XXX,XX +XXX,XX @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr, | 90 | @@ -XXX,XX +XXX,XX @@ static inline uint64_t tlb_read_idx(const CPUTLBEntry *entry, |
22 | tlb_addr = tlb_addr_write(tlbe) & ~TLB_INVALID_MASK; | 91 | return qatomic_read(ptr); |
23 | } | 92 | #else |
24 | 93 | const uint64_t *ptr = &entry->addr_idx[access_type]; | |
25 | - /* Let the guest notice RMW on a write-only page. */ | 94 | -# if TCG_OVERSIZED_GUEST |
26 | - if ((prot & PAGE_READ) && | 95 | - return *ptr; |
27 | - unlikely(tlbe->addr_read != (tlb_addr & ~TLB_NOTDIRTY))) { | 96 | -# else |
28 | - tlb_fill(env_cpu(env), addr, size, | 97 | /* ofs might correspond to .addr_write, so use qatomic_read */ |
29 | - MMU_DATA_LOAD, mmu_idx, retaddr); | 98 | return qatomic_read(ptr); |
30 | + if (prot & PAGE_READ) { | 99 | -# endif |
100 | #endif | ||
101 | } | ||
102 | |||
103 | @@ -XXX,XX +XXX,XX @@ static void tlb_reset_dirty_range_locked(CPUTLBEntry *tlb_entry, | ||
104 | uint32_t *ptr_write = (uint32_t *)&tlb_entry->addr_write; | ||
105 | ptr_write += HOST_BIG_ENDIAN; | ||
106 | qatomic_set(ptr_write, *ptr_write | TLB_NOTDIRTY); | ||
107 | -#elif TCG_OVERSIZED_GUEST | ||
108 | - tlb_entry->addr_write |= TLB_NOTDIRTY; | ||
109 | #else | ||
110 | qatomic_set(&tlb_entry->addr_write, | ||
111 | tlb_entry->addr_write | TLB_NOTDIRTY); | ||
112 | diff --git a/accel/tcg/tcg-all.c b/accel/tcg/tcg-all.c | ||
113 | index XXXXXXX..XXXXXXX 100644 | ||
114 | --- a/accel/tcg/tcg-all.c | ||
115 | +++ b/accel/tcg/tcg-all.c | ||
116 | @@ -XXX,XX +XXX,XX @@ | ||
117 | #include "exec/replay-core.h" | ||
118 | #include "system/cpu-timers.h" | ||
119 | #include "tcg/startup.h" | ||
120 | -#include "tcg/oversized-guest.h" | ||
121 | #include "qapi/error.h" | ||
122 | #include "qemu/error-report.h" | ||
123 | #include "qemu/accel.h" | ||
124 | @@ -XXX,XX +XXX,XX @@ | ||
125 | #include "hw/boards.h" | ||
126 | #endif | ||
127 | #include "internal-common.h" | ||
128 | +#include "cpu-param.h" | ||
129 | + | ||
130 | |||
131 | struct TCGState { | ||
132 | AccelState parent_obj; | ||
133 | @@ -XXX,XX +XXX,XX @@ DECLARE_INSTANCE_CHECKER(TCGState, TCG_STATE, | ||
134 | |||
135 | static bool default_mttcg_enabled(void) | ||
136 | { | ||
137 | - if (icount_enabled() || TCG_OVERSIZED_GUEST) { | ||
138 | + if (icount_enabled()) { | ||
139 | return false; | ||
140 | } | ||
141 | #ifdef TARGET_SUPPORTS_MTTCG | ||
142 | @@ -XXX,XX +XXX,XX @@ static void tcg_set_thread(Object *obj, const char *value, Error **errp) | ||
143 | TCGState *s = TCG_STATE(obj); | ||
144 | |||
145 | if (strcmp(value, "multi") == 0) { | ||
146 | - if (TCG_OVERSIZED_GUEST) { | ||
147 | - error_setg(errp, "No MTTCG when guest word size > hosts"); | ||
148 | - } else if (icount_enabled()) { | ||
149 | + if (icount_enabled()) { | ||
150 | error_setg(errp, "No MTTCG when icount is enabled"); | ||
151 | } else { | ||
152 | #ifndef TARGET_SUPPORTS_MTTCG | ||
153 | diff --git a/target/arm/ptw.c b/target/arm/ptw.c | ||
154 | index XXXXXXX..XXXXXXX 100644 | ||
155 | --- a/target/arm/ptw.c | ||
156 | +++ b/target/arm/ptw.c | ||
157 | @@ -XXX,XX +XXX,XX @@ | ||
158 | #include "internals.h" | ||
159 | #include "cpu-features.h" | ||
160 | #include "idau.h" | ||
161 | -#ifdef CONFIG_TCG | ||
162 | -# include "tcg/oversized-guest.h" | ||
163 | -#endif | ||
164 | |||
165 | typedef struct S1Translate { | ||
166 | /* | ||
167 | @@ -XXX,XX +XXX,XX @@ static uint64_t arm_casq_ptw(CPUARMState *env, uint64_t old_val, | ||
168 | ptw->out_rw = true; | ||
169 | } | ||
170 | |||
171 | -#ifdef CONFIG_ATOMIC64 | ||
172 | if (ptw->out_be) { | ||
173 | old_val = cpu_to_be64(old_val); | ||
174 | new_val = cpu_to_be64(new_val); | ||
175 | @@ -XXX,XX +XXX,XX @@ static uint64_t arm_casq_ptw(CPUARMState *env, uint64_t old_val, | ||
176 | cur_val = qatomic_cmpxchg__nocheck((uint64_t *)host, old_val, new_val); | ||
177 | cur_val = le64_to_cpu(cur_val); | ||
178 | } | ||
179 | -#else | ||
180 | - /* | ||
181 | - * We can't support the full 64-bit atomic cmpxchg on the host. | ||
182 | - * Because this is only used for FEAT_HAFDBS, which is only for AA64, | ||
183 | - * we know that TCG_OVERSIZED_GUEST is set, which means that we are | ||
184 | - * running in round-robin mode and could only race with dma i/o. | ||
185 | - */ | ||
186 | -#if !TCG_OVERSIZED_GUEST | ||
187 | -# error "Unexpected configuration" | ||
188 | -#endif | ||
189 | - bool locked = bql_locked(); | ||
190 | - if (!locked) { | ||
191 | - bql_lock(); | ||
192 | - } | ||
193 | - if (ptw->out_be) { | ||
194 | - cur_val = ldq_be_p(host); | ||
195 | - if (cur_val == old_val) { | ||
196 | - stq_be_p(host, new_val); | ||
197 | - } | ||
198 | - } else { | ||
199 | - cur_val = ldq_le_p(host); | ||
200 | - if (cur_val == old_val) { | ||
201 | - stq_le_p(host, new_val); | ||
202 | - } | ||
203 | - } | ||
204 | - if (!locked) { | ||
205 | - bql_unlock(); | ||
206 | - } | ||
207 | -#endif | ||
208 | - | ||
209 | return cur_val; | ||
210 | #else | ||
211 | /* AArch32 does not have FEAT_HADFS; non-TCG guests only use debug-mode. */ | ||
212 | diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c | ||
213 | index XXXXXXX..XXXXXXX 100644 | ||
214 | --- a/target/riscv/cpu_helper.c | ||
215 | +++ b/target/riscv/cpu_helper.c | ||
216 | @@ -XXX,XX +XXX,XX @@ | ||
217 | #include "system/cpu-timers.h" | ||
218 | #include "cpu_bits.h" | ||
219 | #include "debug.h" | ||
220 | -#include "tcg/oversized-guest.h" | ||
221 | #include "pmp.h" | ||
222 | |||
223 | int riscv_env_mmu_index(CPURISCVState *env, bool ifetch) | ||
224 | @@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPURISCVState *env, hwaddr *physical, | ||
225 | hwaddr pte_addr; | ||
226 | int i; | ||
227 | |||
228 | -#if !TCG_OVERSIZED_GUEST | ||
229 | -restart: | ||
230 | -#endif | ||
231 | + restart: | ||
232 | for (i = 0; i < levels; i++, ptshift -= ptidxbits) { | ||
233 | target_ulong idx; | ||
234 | if (i == 0) { | ||
235 | @@ -XXX,XX +XXX,XX @@ restart: | ||
236 | false, MEMTXATTRS_UNSPECIFIED); | ||
237 | if (memory_region_is_ram(mr)) { | ||
238 | target_ulong *pte_pa = qemu_map_ram_ptr(mr->ram_block, addr1); | ||
239 | -#if TCG_OVERSIZED_GUEST | ||
240 | - /* | ||
241 | - * MTTCG is not enabled on oversized TCG guests so | ||
242 | - * page table updates do not need to be atomic | ||
243 | - */ | ||
244 | - *pte_pa = pte = updated_pte; | ||
245 | -#else | ||
246 | target_ulong old_pte; | ||
247 | if (riscv_cpu_sxl(env) == MXL_RV32) { | ||
248 | old_pte = qatomic_cmpxchg((uint32_t *)pte_pa, pte, updated_pte); | ||
249 | @@ -XXX,XX +XXX,XX @@ restart: | ||
250 | goto restart; | ||
251 | } | ||
252 | pte = updated_pte; | ||
253 | -#endif | ||
254 | } else { | ||
31 | /* | 255 | /* |
32 | - * Since we don't support reads and writes to different addresses, | 256 | * Misconfigured PTE in ROM (AD bits are not preset) or |
33 | - * and we do have the proper page loaded for write, this shouldn't | 257 | diff --git a/docs/devel/multi-thread-tcg.rst b/docs/devel/multi-thread-tcg.rst |
34 | - * ever return. But just in case, handle via stop-the-world. | 258 | index XXXXXXX..XXXXXXX 100644 |
35 | + * Let the guest notice RMW on a write-only page. | 259 | --- a/docs/devel/multi-thread-tcg.rst |
36 | + * We have just verified that the page is writable. | 260 | +++ b/docs/devel/multi-thread-tcg.rst |
37 | + * Subpage lookups may have left TLB_INVALID_MASK set, | 261 | @@ -XXX,XX +XXX,XX @@ if: |
38 | + * but addr_read will only be -1 if PAGE_READ was unset. | 262 | |
39 | */ | 263 | * forced by --accel tcg,thread=single |
40 | - goto stop_the_world; | 264 | * enabling --icount mode |
41 | + if (unlikely(tlbe->addr_read == -1)) { | 265 | -* 64 bit guests on 32 bit hosts (TCG_OVERSIZED_GUEST) |
42 | + tlb_fill(env_cpu(env), addr, size, | 266 | |
43 | + MMU_DATA_LOAD, mmu_idx, retaddr); | 267 | In the general case of running translated code there should be no |
44 | + /* | 268 | inter-vCPU dependencies and all vCPUs should be able to run at full |
45 | + * Since we don't support reads and writes to different | ||
46 | + * addresses, and we do have the proper page loaded for | ||
47 | + * write, this shouldn't ever return. But just in case, | ||
48 | + * handle via stop-the-world. | ||
49 | + */ | ||
50 | + goto stop_the_world; | ||
51 | + } | ||
52 | + /* Collect TLB_WATCHPOINT for read. */ | ||
53 | + tlb_addr |= tlbe->addr_read; | ||
54 | } | ||
55 | } else /* if (prot & PAGE_READ) */ { | ||
56 | tlb_addr = tlbe->addr_read; | ||
57 | @@ -XXX,XX +XXX,XX @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr, | ||
58 | } | ||
59 | |||
60 | hostaddr = (void *)((uintptr_t)addr + tlbe->addend); | ||
61 | + full = &env_tlb(env)->d[mmu_idx].fulltlb[index]; | ||
62 | |||
63 | if (unlikely(tlb_addr & TLB_NOTDIRTY)) { | ||
64 | - notdirty_write(env_cpu(env), addr, size, | ||
65 | - &env_tlb(env)->d[mmu_idx].fulltlb[index], retaddr); | ||
66 | + notdirty_write(env_cpu(env), addr, size, full, retaddr); | ||
67 | + } | ||
68 | + | ||
69 | + if (unlikely(tlb_addr & TLB_WATCHPOINT)) { | ||
70 | + QEMU_BUILD_BUG_ON(PAGE_READ != BP_MEM_READ); | ||
71 | + QEMU_BUILD_BUG_ON(PAGE_WRITE != BP_MEM_WRITE); | ||
72 | + /* therefore prot == watchpoint bits */ | ||
73 | + cpu_check_watchpoint(env_cpu(env), addr, size, | ||
74 | + full->attrs, prot, retaddr); | ||
75 | } | ||
76 | |||
77 | return hostaddr; | ||
78 | -- | 269 | -- |
79 | 2.34.1 | 270 | 2.43.0 |
271 | |||
272 | diff view generated by jsdifflib |
1 | This allows us to easily find all branches that use a label. | 1 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> |
---|---|---|---|
2 | Since 'refs' is only tested vs zero, remove it and test for | ||
3 | an empty list instead. Drop the use of bitfields, which had | ||
4 | been used to pack refs into a single 32-bit word. | ||
5 | |||
6 | Reviewed-by: Taylor Simpson <tsimpson@quicinc.com> | ||
7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
8 | --- | 3 | --- |
9 | include/tcg/tcg-op.h | 7 +------ | 4 | tcg/tcg-op-ldst.c | 21 +++------------------ |
10 | include/tcg/tcg.h | 19 +++++++++++++------ | 5 | tcg/tcg.c | 4 +--- |
11 | tcg/tcg-op.c | 22 +++++++++++++++++++--- | 6 | 2 files changed, 4 insertions(+), 21 deletions(-) |
12 | tcg/tcg.c | 30 ++++++++++++++++++++---------- | ||
13 | 4 files changed, 53 insertions(+), 25 deletions(-) | ||
14 | 7 | ||
15 | diff --git a/include/tcg/tcg-op.h b/include/tcg/tcg-op.h | 8 | diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c |
16 | index XXXXXXX..XXXXXXX 100644 | 9 | index XXXXXXX..XXXXXXX 100644 |
17 | --- a/include/tcg/tcg-op.h | 10 | --- a/tcg/tcg-op-ldst.c |
18 | +++ b/include/tcg/tcg-op.h | 11 | +++ b/tcg/tcg-op-ldst.c |
19 | @@ -XXX,XX +XXX,XX @@ static inline void gen_set_label(TCGLabel *l) | 12 | @@ -XXX,XX +XXX,XX @@ static MemOp tcg_canonicalize_memop(MemOp op, bool is64, bool st) |
20 | tcg_gen_op1(INDEX_op_set_label, label_arg(l)); | 13 | static void gen_ldst(TCGOpcode opc, TCGType type, TCGTemp *vl, TCGTemp *vh, |
21 | } | 14 | TCGTemp *addr, MemOpIdx oi) |
22 | 15 | { | |
23 | -static inline void tcg_gen_br(TCGLabel *l) | 16 | - if (TCG_TARGET_REG_BITS == 64 || tcg_ctx->addr_type == TCG_TYPE_I32) { |
24 | -{ | 17 | - if (vh) { |
25 | - l->refs++; | 18 | - tcg_gen_op4(opc, type, temp_arg(vl), temp_arg(vh), |
26 | - tcg_gen_op1(INDEX_op_br, label_arg(l)); | 19 | - temp_arg(addr), oi); |
27 | -} | 20 | - } else { |
21 | - tcg_gen_op3(opc, type, temp_arg(vl), temp_arg(addr), oi); | ||
22 | - } | ||
23 | + if (vh) { | ||
24 | + tcg_gen_op4(opc, type, temp_arg(vl), temp_arg(vh), temp_arg(addr), oi); | ||
25 | } else { | ||
26 | - /* See TCGV_LOW/HIGH. */ | ||
27 | - TCGTemp *al = addr + HOST_BIG_ENDIAN; | ||
28 | - TCGTemp *ah = addr + !HOST_BIG_ENDIAN; | ||
28 | - | 29 | - |
29 | +void tcg_gen_br(TCGLabel *l); | 30 | - if (vh) { |
30 | void tcg_gen_mb(TCGBar); | 31 | - tcg_gen_op5(opc, type, temp_arg(vl), temp_arg(vh), |
31 | 32 | - temp_arg(al), temp_arg(ah), oi); | |
32 | /* Helper calls. */ | 33 | - } else { |
33 | diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h | 34 | - tcg_gen_op4(opc, type, temp_arg(vl), |
34 | index XXXXXXX..XXXXXXX 100644 | 35 | - temp_arg(al), temp_arg(ah), oi); |
35 | --- a/include/tcg/tcg.h | 36 | - } |
36 | +++ b/include/tcg/tcg.h | 37 | + tcg_gen_op3(opc, type, temp_arg(vl), temp_arg(addr), oi); |
37 | @@ -XXX,XX +XXX,XX @@ struct TCGRelocation { | ||
38 | int type; | ||
39 | }; | ||
40 | |||
41 | +typedef struct TCGOp TCGOp; | ||
42 | +typedef struct TCGLabelUse TCGLabelUse; | ||
43 | +struct TCGLabelUse { | ||
44 | + QSIMPLEQ_ENTRY(TCGLabelUse) next; | ||
45 | + TCGOp *op; | ||
46 | +}; | ||
47 | + | ||
48 | typedef struct TCGLabel TCGLabel; | ||
49 | struct TCGLabel { | ||
50 | - unsigned present : 1; | ||
51 | - unsigned has_value : 1; | ||
52 | - unsigned id : 14; | ||
53 | - unsigned refs : 16; | ||
54 | + bool present; | ||
55 | + bool has_value; | ||
56 | + uint16_t id; | ||
57 | union { | ||
58 | uintptr_t value; | ||
59 | const tcg_insn_unit *value_ptr; | ||
60 | } u; | ||
61 | + QSIMPLEQ_HEAD(, TCGLabelUse) branches; | ||
62 | QSIMPLEQ_HEAD(, TCGRelocation) relocs; | ||
63 | QSIMPLEQ_ENTRY(TCGLabel) next; | ||
64 | }; | ||
65 | @@ -XXX,XX +XXX,XX @@ typedef struct TCGTempSet { | ||
66 | #define SYNC_ARG (1 << 0) | ||
67 | typedef uint32_t TCGLifeData; | ||
68 | |||
69 | -typedef struct TCGOp { | ||
70 | +struct TCGOp { | ||
71 | TCGOpcode opc : 8; | ||
72 | unsigned nargs : 8; | ||
73 | |||
74 | @@ -XXX,XX +XXX,XX @@ typedef struct TCGOp { | ||
75 | |||
76 | /* Arguments for the opcode. */ | ||
77 | TCGArg args[]; | ||
78 | -} TCGOp; | ||
79 | +}; | ||
80 | |||
81 | #define TCGOP_CALLI(X) (X)->param1 | ||
82 | #define TCGOP_CALLO(X) (X)->param2 | ||
83 | diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c | ||
84 | index XXXXXXX..XXXXXXX 100644 | ||
85 | --- a/tcg/tcg-op.c | ||
86 | +++ b/tcg/tcg-op.c | ||
87 | @@ -XXX,XX +XXX,XX @@ void tcg_gen_op6(TCGOpcode opc, TCGArg a1, TCGArg a2, TCGArg a3, | ||
88 | op->args[5] = a6; | ||
89 | } | ||
90 | |||
91 | +/* Generic ops. */ | ||
92 | + | ||
93 | +static void add_last_as_label_use(TCGLabel *l) | ||
94 | +{ | ||
95 | + TCGLabelUse *u = tcg_malloc(sizeof(TCGLabelUse)); | ||
96 | + | ||
97 | + u->op = tcg_last_op(); | ||
98 | + QSIMPLEQ_INSERT_TAIL(&l->branches, u, next); | ||
99 | +} | ||
100 | + | ||
101 | +void tcg_gen_br(TCGLabel *l) | ||
102 | +{ | ||
103 | + tcg_gen_op1(INDEX_op_br, label_arg(l)); | ||
104 | + add_last_as_label_use(l); | ||
105 | +} | ||
106 | + | ||
107 | void tcg_gen_mb(TCGBar mb_type) | ||
108 | { | ||
109 | if (tcg_ctx->gen_tb->cflags & CF_PARALLEL) { | ||
110 | @@ -XXX,XX +XXX,XX @@ void tcg_gen_brcond_i32(TCGCond cond, TCGv_i32 arg1, TCGv_i32 arg2, TCGLabel *l) | ||
111 | if (cond == TCG_COND_ALWAYS) { | ||
112 | tcg_gen_br(l); | ||
113 | } else if (cond != TCG_COND_NEVER) { | ||
114 | - l->refs++; | ||
115 | tcg_gen_op4ii_i32(INDEX_op_brcond_i32, arg1, arg2, cond, label_arg(l)); | ||
116 | + add_last_as_label_use(l); | ||
117 | } | 38 | } |
118 | } | 39 | } |
119 | |||
120 | @@ -XXX,XX +XXX,XX @@ void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1, TCGv_i64 arg2, TCGLabel *l) | ||
121 | if (cond == TCG_COND_ALWAYS) { | ||
122 | tcg_gen_br(l); | ||
123 | } else if (cond != TCG_COND_NEVER) { | ||
124 | - l->refs++; | ||
125 | if (TCG_TARGET_REG_BITS == 32) { | ||
126 | tcg_gen_op6ii_i32(INDEX_op_brcond2_i32, TCGV_LOW(arg1), | ||
127 | TCGV_HIGH(arg1), TCGV_LOW(arg2), | ||
128 | @@ -XXX,XX +XXX,XX @@ void tcg_gen_brcond_i64(TCGCond cond, TCGv_i64 arg1, TCGv_i64 arg2, TCGLabel *l) | ||
129 | tcg_gen_op4ii_i64(INDEX_op_brcond_i64, arg1, arg2, cond, | ||
130 | label_arg(l)); | ||
131 | } | ||
132 | + add_last_as_label_use(l); | ||
133 | } | ||
134 | } | ||
135 | |||
136 | @@ -XXX,XX +XXX,XX @@ void tcg_gen_brcondi_i64(TCGCond cond, TCGv_i64 arg1, int64_t arg2, TCGLabel *l) | ||
137 | } else if (cond == TCG_COND_ALWAYS) { | ||
138 | tcg_gen_br(l); | ||
139 | } else if (cond != TCG_COND_NEVER) { | ||
140 | - l->refs++; | ||
141 | tcg_gen_op6ii_i32(INDEX_op_brcond2_i32, | ||
142 | TCGV_LOW(arg1), TCGV_HIGH(arg1), | ||
143 | tcg_constant_i32(arg2), | ||
144 | tcg_constant_i32(arg2 >> 32), | ||
145 | cond, label_arg(l)); | ||
146 | + add_last_as_label_use(l); | ||
147 | } | ||
148 | } | ||
149 | 40 | ||
150 | diff --git a/tcg/tcg.c b/tcg/tcg.c | 41 | diff --git a/tcg/tcg.c b/tcg/tcg.c |
151 | index XXXXXXX..XXXXXXX 100644 | 42 | index XXXXXXX..XXXXXXX 100644 |
152 | --- a/tcg/tcg.c | 43 | --- a/tcg/tcg.c |
153 | +++ b/tcg/tcg.c | 44 | +++ b/tcg/tcg.c |
154 | @@ -XXX,XX +XXX,XX @@ TCGLabel *gen_new_label(void) | 45 | @@ -XXX,XX +XXX,XX @@ void tcg_func_start(TCGContext *s) |
155 | 46 | s->emit_before_op = NULL; | |
156 | memset(l, 0, sizeof(TCGLabel)); | 47 | QSIMPLEQ_INIT(&s->labels); |
157 | l->id = s->nb_labels++; | 48 | |
158 | + QSIMPLEQ_INIT(&l->branches); | 49 | - tcg_debug_assert(s->addr_type == TCG_TYPE_I32 || |
159 | QSIMPLEQ_INIT(&l->relocs); | 50 | - s->addr_type == TCG_TYPE_I64); |
160 | 51 | - | |
161 | QSIMPLEQ_INSERT_TAIL(&s->labels, l, next); | 52 | + tcg_debug_assert(s->addr_type <= TCG_TYPE_REG); |
162 | @@ -XXX,XX +XXX,XX @@ static void process_op_defs(TCGContext *s) | 53 | tcg_debug_assert(s->insn_start_words > 0); |
163 | } | ||
164 | } | 54 | } |
165 | 55 | ||
166 | +static void remove_label_use(TCGOp *op, int idx) | ||
167 | +{ | ||
168 | + TCGLabel *label = arg_label(op->args[idx]); | ||
169 | + TCGLabelUse *use; | ||
170 | + | ||
171 | + QSIMPLEQ_FOREACH(use, &label->branches, next) { | ||
172 | + if (use->op == op) { | ||
173 | + QSIMPLEQ_REMOVE(&label->branches, use, TCGLabelUse, next); | ||
174 | + return; | ||
175 | + } | ||
176 | + } | ||
177 | + g_assert_not_reached(); | ||
178 | +} | ||
179 | + | ||
180 | void tcg_op_remove(TCGContext *s, TCGOp *op) | ||
181 | { | ||
182 | - TCGLabel *label; | ||
183 | - | ||
184 | switch (op->opc) { | ||
185 | case INDEX_op_br: | ||
186 | - label = arg_label(op->args[0]); | ||
187 | - label->refs--; | ||
188 | + remove_label_use(op, 0); | ||
189 | break; | ||
190 | case INDEX_op_brcond_i32: | ||
191 | case INDEX_op_brcond_i64: | ||
192 | - label = arg_label(op->args[3]); | ||
193 | - label->refs--; | ||
194 | + remove_label_use(op, 3); | ||
195 | break; | ||
196 | case INDEX_op_brcond2_i32: | ||
197 | - label = arg_label(op->args[5]); | ||
198 | - label->refs--; | ||
199 | + remove_label_use(op, 5); | ||
200 | break; | ||
201 | default: | ||
202 | break; | ||
203 | @@ -XXX,XX +XXX,XX @@ reachable_code_pass(TCGContext *s) | ||
204 | dead = false; | ||
205 | } | ||
206 | |||
207 | - if (label->refs == 0) { | ||
208 | + if (QSIMPLEQ_EMPTY(&label->branches)) { | ||
209 | /* | ||
210 | * While there is an occasional backward branch, virtually | ||
211 | * all branches generated by the translators are forward. | ||
212 | @@ -XXX,XX +XXX,XX @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, target_ulong pc_start) | ||
213 | bool error = false; | ||
214 | |||
215 | QSIMPLEQ_FOREACH(l, &s->labels, next) { | ||
216 | - if (unlikely(!l->present) && l->refs) { | ||
217 | + if (unlikely(!l->present) && !QSIMPLEQ_EMPTY(&l->branches)) { | ||
218 | qemu_log_mask(CPU_LOG_TB_OP, | ||
219 | "$L%d referenced but not present.\n", l->id); | ||
220 | error = true; | ||
221 | -- | 56 | -- |
222 | 2.34.1 | 57 | 2.43.0 |
58 | |||
59 | diff view generated by jsdifflib |
1 | Remove the first label and redirect all uses to the second. | 1 | Since 64-on-32 is now unsupported, guest addresses always |
---|---|---|---|
2 | fit in one host register. Drop the replication of opcodes. | ||
2 | 3 | ||
3 | Tested-by: Taylor Simpson <tsimpson@quicinc.com> | ||
4 | Reviewed-by: Taylor Simpson <tsimpson@quicinc.com> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
6 | --- | 5 | --- |
7 | tcg/tcg.c | 44 +++++++++++++++++++++++++++++++++++++++++++- | 6 | include/tcg/tcg-opc.h | 28 ++------ |
8 | 1 file changed, 43 insertions(+), 1 deletion(-) | 7 | tcg/optimize.c | 21 ++---- |
8 | tcg/tcg-op-ldst.c | 82 +++++---------------- | ||
9 | tcg/tcg.c | 42 ++++------- | ||
10 | tcg/tci.c | 119 ++++++------------------------- | ||
11 | tcg/aarch64/tcg-target.c.inc | 36 ++++------ | ||
12 | tcg/arm/tcg-target.c.inc | 40 +++-------- | ||
13 | tcg/i386/tcg-target.c.inc | 69 ++++-------------- | ||
14 | tcg/loongarch64/tcg-target.c.inc | 36 ++++------ | ||
15 | tcg/mips/tcg-target.c.inc | 51 +++---------- | ||
16 | tcg/ppc/tcg-target.c.inc | 68 ++++-------------- | ||
17 | tcg/riscv/tcg-target.c.inc | 24 +++---- | ||
18 | tcg/s390x/tcg-target.c.inc | 36 ++++------ | ||
19 | tcg/sparc64/tcg-target.c.inc | 24 +++---- | ||
20 | tcg/tci/tcg-target.c.inc | 60 ++++------------ | ||
21 | 15 files changed, 177 insertions(+), 559 deletions(-) | ||
9 | 22 | ||
23 | diff --git a/include/tcg/tcg-opc.h b/include/tcg/tcg-opc.h | ||
24 | index XXXXXXX..XXXXXXX 100644 | ||
25 | --- a/include/tcg/tcg-opc.h | ||
26 | +++ b/include/tcg/tcg-opc.h | ||
27 | @@ -XXX,XX +XXX,XX @@ DEF(goto_ptr, 0, 1, 0, TCG_OPF_BB_EXIT | TCG_OPF_BB_END) | ||
28 | DEF(plugin_cb, 0, 0, 1, TCG_OPF_NOT_PRESENT) | ||
29 | DEF(plugin_mem_cb, 0, 1, 1, TCG_OPF_NOT_PRESENT) | ||
30 | |||
31 | -/* Replicate ld/st ops for 32 and 64-bit guest addresses. */ | ||
32 | -DEF(qemu_ld_a32_i32, 1, 1, 1, | ||
33 | +DEF(qemu_ld_i32, 1, 1, 1, | ||
34 | TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
35 | -DEF(qemu_st_a32_i32, 0, 1 + 1, 1, | ||
36 | +DEF(qemu_st_i32, 0, 1 + 1, 1, | ||
37 | TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
38 | -DEF(qemu_ld_a32_i64, DATA64_ARGS, 1, 1, | ||
39 | +DEF(qemu_ld_i64, DATA64_ARGS, 1, 1, | ||
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) | ||
43 | - | ||
44 | -DEF(qemu_ld_a64_i32, 1, DATA64_ARGS, 1, | ||
45 | - TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
46 | -DEF(qemu_st_a64_i32, 0, 1 + DATA64_ARGS, 1, | ||
47 | - TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
48 | -DEF(qemu_ld_a64_i64, DATA64_ARGS, DATA64_ARGS, 1, | ||
49 | - TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
50 | -DEF(qemu_st_a64_i64, 0, DATA64_ARGS + DATA64_ARGS, 1, | ||
51 | +DEF(qemu_st_i64, 0, DATA64_ARGS + 1, 1, | ||
52 | TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
53 | |||
54 | /* Only used by i386 to cope with stupid register constraints. */ | ||
55 | -DEF(qemu_st8_a32_i32, 0, 1 + 1, 1, | ||
56 | - TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
57 | -DEF(qemu_st8_a64_i32, 0, 1 + DATA64_ARGS, 1, | ||
58 | +DEF(qemu_st8_i32, 0, 1 + 1, 1, | ||
59 | TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
60 | |||
61 | /* Only for 64-bit hosts at the moment. */ | ||
62 | -DEF(qemu_ld_a32_i128, 2, 1, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
63 | -DEF(qemu_ld_a64_i128, 2, 1, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
64 | -DEF(qemu_st_a32_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
65 | -DEF(qemu_st_a64_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
66 | +DEF(qemu_ld_i128, 2, 1, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
67 | +DEF(qemu_st_i128, 0, 3, 1, TCG_OPF_CALL_CLOBBER | TCG_OPF_SIDE_EFFECTS) | ||
68 | |||
69 | /* Host vector support. */ | ||
70 | |||
71 | diff --git a/tcg/optimize.c b/tcg/optimize.c | ||
72 | index XXXXXXX..XXXXXXX 100644 | ||
73 | --- a/tcg/optimize.c | ||
74 | +++ b/tcg/optimize.c | ||
75 | @@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s) | ||
76 | CASE_OP_32_64_VEC(orc): | ||
77 | done = fold_orc(&ctx, op); | ||
78 | break; | ||
79 | - case INDEX_op_qemu_ld_a32_i32: | ||
80 | - case INDEX_op_qemu_ld_a64_i32: | ||
81 | + case INDEX_op_qemu_ld_i32: | ||
82 | done = fold_qemu_ld_1reg(&ctx, op); | ||
83 | break; | ||
84 | - case INDEX_op_qemu_ld_a32_i64: | ||
85 | - case INDEX_op_qemu_ld_a64_i64: | ||
86 | + case INDEX_op_qemu_ld_i64: | ||
87 | if (TCG_TARGET_REG_BITS == 64) { | ||
88 | done = fold_qemu_ld_1reg(&ctx, op); | ||
89 | break; | ||
90 | } | ||
91 | QEMU_FALLTHROUGH; | ||
92 | - case INDEX_op_qemu_ld_a32_i128: | ||
93 | - case INDEX_op_qemu_ld_a64_i128: | ||
94 | + case INDEX_op_qemu_ld_i128: | ||
95 | done = fold_qemu_ld_2reg(&ctx, op); | ||
96 | break; | ||
97 | - case INDEX_op_qemu_st8_a32_i32: | ||
98 | - case INDEX_op_qemu_st8_a64_i32: | ||
99 | - case INDEX_op_qemu_st_a32_i32: | ||
100 | - case INDEX_op_qemu_st_a64_i32: | ||
101 | - case INDEX_op_qemu_st_a32_i64: | ||
102 | - case INDEX_op_qemu_st_a64_i64: | ||
103 | - case INDEX_op_qemu_st_a32_i128: | ||
104 | - case INDEX_op_qemu_st_a64_i128: | ||
105 | + case INDEX_op_qemu_st8_i32: | ||
106 | + case INDEX_op_qemu_st_i32: | ||
107 | + case INDEX_op_qemu_st_i64: | ||
108 | + case INDEX_op_qemu_st_i128: | ||
109 | done = fold_qemu_st(&ctx, op); | ||
110 | break; | ||
111 | CASE_OP_32_64(rem): | ||
112 | diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c | ||
113 | index XXXXXXX..XXXXXXX 100644 | ||
114 | --- a/tcg/tcg-op-ldst.c | ||
115 | +++ b/tcg/tcg-op-ldst.c | ||
116 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i32_int(TCGv_i32 val, TCGTemp *addr, | ||
117 | MemOp orig_memop; | ||
118 | MemOpIdx orig_oi, oi; | ||
119 | TCGv_i64 copy_addr; | ||
120 | - TCGOpcode opc; | ||
121 | |||
122 | tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD); | ||
123 | orig_memop = memop = tcg_canonicalize_memop(memop, 0, 0); | ||
124 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i32_int(TCGv_i32 val, TCGTemp *addr, | ||
125 | } | ||
126 | |||
127 | copy_addr = plugin_maybe_preserve_addr(addr); | ||
128 | - if (tcg_ctx->addr_type == TCG_TYPE_I32) { | ||
129 | - opc = INDEX_op_qemu_ld_a32_i32; | ||
130 | - } else { | ||
131 | - opc = INDEX_op_qemu_ld_a64_i32; | ||
132 | - } | ||
133 | - gen_ldst(opc, TCG_TYPE_I32, tcgv_i32_temp(val), NULL, addr, oi); | ||
134 | + gen_ldst(INDEX_op_qemu_ld_i32, TCG_TYPE_I32, | ||
135 | + tcgv_i32_temp(val), NULL, addr, oi); | ||
136 | plugin_gen_mem_callbacks_i32(val, copy_addr, addr, orig_oi, | ||
137 | QEMU_PLUGIN_MEM_R); | ||
138 | |||
139 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i32_int(TCGv_i32 val, TCGTemp *addr, | ||
140 | } | ||
141 | |||
142 | if (TCG_TARGET_HAS_qemu_st8_i32 && (memop & MO_SIZE) == MO_8) { | ||
143 | - if (tcg_ctx->addr_type == TCG_TYPE_I32) { | ||
144 | - opc = INDEX_op_qemu_st8_a32_i32; | ||
145 | - } else { | ||
146 | - opc = INDEX_op_qemu_st8_a64_i32; | ||
147 | - } | ||
148 | + opc = INDEX_op_qemu_st8_i32; | ||
149 | } else { | ||
150 | - if (tcg_ctx->addr_type == TCG_TYPE_I32) { | ||
151 | - opc = INDEX_op_qemu_st_a32_i32; | ||
152 | - } else { | ||
153 | - opc = INDEX_op_qemu_st_a64_i32; | ||
154 | - } | ||
155 | + opc = INDEX_op_qemu_st_i32; | ||
156 | } | ||
157 | gen_ldst(opc, TCG_TYPE_I32, tcgv_i32_temp(val), NULL, addr, oi); | ||
158 | plugin_gen_mem_callbacks_i32(val, NULL, addr, orig_oi, QEMU_PLUGIN_MEM_W); | ||
159 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i64_int(TCGv_i64 val, TCGTemp *addr, | ||
160 | MemOp orig_memop; | ||
161 | MemOpIdx orig_oi, oi; | ||
162 | TCGv_i64 copy_addr; | ||
163 | - TCGOpcode opc; | ||
164 | |||
165 | if (TCG_TARGET_REG_BITS == 32 && (memop & MO_SIZE) < MO_64) { | ||
166 | tcg_gen_qemu_ld_i32_int(TCGV_LOW(val), addr, idx, memop); | ||
167 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i64_int(TCGv_i64 val, TCGTemp *addr, | ||
168 | } | ||
169 | |||
170 | copy_addr = plugin_maybe_preserve_addr(addr); | ||
171 | - if (tcg_ctx->addr_type == TCG_TYPE_I32) { | ||
172 | - opc = INDEX_op_qemu_ld_a32_i64; | ||
173 | - } else { | ||
174 | - opc = INDEX_op_qemu_ld_a64_i64; | ||
175 | - } | ||
176 | - gen_ldst_i64(opc, val, addr, oi); | ||
177 | + gen_ldst_i64(INDEX_op_qemu_ld_i64, val, addr, oi); | ||
178 | plugin_gen_mem_callbacks_i64(val, copy_addr, addr, orig_oi, | ||
179 | QEMU_PLUGIN_MEM_R); | ||
180 | |||
181 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i64_int(TCGv_i64 val, TCGTemp *addr, | ||
182 | { | ||
183 | TCGv_i64 swap = NULL; | ||
184 | MemOpIdx orig_oi, oi; | ||
185 | - TCGOpcode opc; | ||
186 | |||
187 | if (TCG_TARGET_REG_BITS == 32 && (memop & MO_SIZE) < MO_64) { | ||
188 | tcg_gen_qemu_st_i32_int(TCGV_LOW(val), addr, idx, memop); | ||
189 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i64_int(TCGv_i64 val, TCGTemp *addr, | ||
190 | oi = make_memop_idx(memop, idx); | ||
191 | } | ||
192 | |||
193 | - if (tcg_ctx->addr_type == TCG_TYPE_I32) { | ||
194 | - opc = INDEX_op_qemu_st_a32_i64; | ||
195 | - } else { | ||
196 | - opc = INDEX_op_qemu_st_a64_i64; | ||
197 | - } | ||
198 | - gen_ldst_i64(opc, val, addr, oi); | ||
199 | + gen_ldst_i64(INDEX_op_qemu_st_i64, val, addr, oi); | ||
200 | plugin_gen_mem_callbacks_i64(val, NULL, addr, orig_oi, QEMU_PLUGIN_MEM_W); | ||
201 | |||
202 | if (swap) { | ||
203 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr, | ||
204 | { | ||
205 | MemOpIdx orig_oi; | ||
206 | TCGv_i64 ext_addr = NULL; | ||
207 | - TCGOpcode opc; | ||
208 | |||
209 | check_max_alignment(memop_alignment_bits(memop)); | ||
210 | tcg_gen_req_mo(TCG_MO_LD_LD | TCG_MO_ST_LD); | ||
211 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr, | ||
212 | hi = TCGV128_HIGH(val); | ||
213 | } | ||
214 | |||
215 | - if (tcg_ctx->addr_type == TCG_TYPE_I32) { | ||
216 | - opc = INDEX_op_qemu_ld_a32_i128; | ||
217 | - } else { | ||
218 | - opc = INDEX_op_qemu_ld_a64_i128; | ||
219 | - } | ||
220 | - gen_ldst(opc, TCG_TYPE_I128, tcgv_i64_temp(lo), | ||
221 | + gen_ldst(INDEX_op_qemu_ld_i128, TCG_TYPE_I128, tcgv_i64_temp(lo), | ||
222 | tcgv_i64_temp(hi), addr, oi); | ||
223 | |||
224 | if (need_bswap) { | ||
225 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr, | ||
226 | canonicalize_memop_i128_as_i64(mop, memop); | ||
227 | need_bswap = (mop[0] ^ memop) & MO_BSWAP; | ||
228 | |||
229 | - if (tcg_ctx->addr_type == TCG_TYPE_I32) { | ||
230 | - opc = INDEX_op_qemu_ld_a32_i64; | ||
231 | - } else { | ||
232 | - opc = INDEX_op_qemu_ld_a64_i64; | ||
233 | - } | ||
234 | - | ||
235 | /* | ||
236 | * Since there are no global TCGv_i128, there is no visible state | ||
237 | * changed if the second load faults. Load directly into the two | ||
238 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr, | ||
239 | y = TCGV128_LOW(val); | ||
240 | } | ||
241 | |||
242 | - gen_ldst_i64(opc, x, addr, make_memop_idx(mop[0], idx)); | ||
243 | + gen_ldst_i64(INDEX_op_qemu_ld_i64, x, addr, | ||
244 | + make_memop_idx(mop[0], idx)); | ||
245 | |||
246 | if (need_bswap) { | ||
247 | tcg_gen_bswap64_i64(x, x); | ||
248 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_ld_i128_int(TCGv_i128 val, TCGTemp *addr, | ||
249 | addr_p8 = tcgv_i64_temp(t); | ||
250 | } | ||
251 | |||
252 | - gen_ldst_i64(opc, y, addr_p8, make_memop_idx(mop[1], idx)); | ||
253 | + gen_ldst_i64(INDEX_op_qemu_ld_i64, y, addr_p8, | ||
254 | + make_memop_idx(mop[1], idx)); | ||
255 | tcg_temp_free_internal(addr_p8); | ||
256 | |||
257 | if (need_bswap) { | ||
258 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr, | ||
259 | { | ||
260 | MemOpIdx orig_oi; | ||
261 | TCGv_i64 ext_addr = NULL; | ||
262 | - TCGOpcode opc; | ||
263 | |||
264 | check_max_alignment(memop_alignment_bits(memop)); | ||
265 | tcg_gen_req_mo(TCG_MO_ST_LD | TCG_MO_ST_ST); | ||
266 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr, | ||
267 | hi = TCGV128_HIGH(val); | ||
268 | } | ||
269 | |||
270 | - if (tcg_ctx->addr_type == TCG_TYPE_I32) { | ||
271 | - opc = INDEX_op_qemu_st_a32_i128; | ||
272 | - } else { | ||
273 | - opc = INDEX_op_qemu_st_a64_i128; | ||
274 | - } | ||
275 | - gen_ldst(opc, TCG_TYPE_I128, tcgv_i64_temp(lo), | ||
276 | - tcgv_i64_temp(hi), addr, oi); | ||
277 | + gen_ldst(INDEX_op_qemu_st_i128, TCG_TYPE_I128, | ||
278 | + tcgv_i64_temp(lo), tcgv_i64_temp(hi), addr, oi); | ||
279 | |||
280 | if (need_bswap) { | ||
281 | tcg_temp_free_i64(lo); | ||
282 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr, | ||
283 | |||
284 | canonicalize_memop_i128_as_i64(mop, memop); | ||
285 | |||
286 | - if (tcg_ctx->addr_type == TCG_TYPE_I32) { | ||
287 | - opc = INDEX_op_qemu_st_a32_i64; | ||
288 | - } else { | ||
289 | - opc = INDEX_op_qemu_st_a64_i64; | ||
290 | - } | ||
291 | - | ||
292 | if ((memop & MO_BSWAP) == MO_LE) { | ||
293 | x = TCGV128_LOW(val); | ||
294 | y = TCGV128_HIGH(val); | ||
295 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr, | ||
296 | x = b; | ||
297 | } | ||
298 | |||
299 | - gen_ldst_i64(opc, x, addr, make_memop_idx(mop[0], idx)); | ||
300 | + gen_ldst_i64(INDEX_op_qemu_st_i64, x, addr, | ||
301 | + make_memop_idx(mop[0], idx)); | ||
302 | |||
303 | if (tcg_ctx->addr_type == TCG_TYPE_I32) { | ||
304 | TCGv_i32 t = tcg_temp_ebb_new_i32(); | ||
305 | @@ -XXX,XX +XXX,XX @@ static void tcg_gen_qemu_st_i128_int(TCGv_i128 val, TCGTemp *addr, | ||
306 | |||
307 | if (b) { | ||
308 | tcg_gen_bswap64_i64(b, y); | ||
309 | - gen_ldst_i64(opc, b, addr_p8, make_memop_idx(mop[1], idx)); | ||
310 | + gen_ldst_i64(INDEX_op_qemu_st_i64, b, addr_p8, | ||
311 | + make_memop_idx(mop[1], idx)); | ||
312 | tcg_temp_free_i64(b); | ||
313 | } else { | ||
314 | - gen_ldst_i64(opc, y, addr_p8, make_memop_idx(mop[1], idx)); | ||
315 | + gen_ldst_i64(INDEX_op_qemu_st_i64, y, addr_p8, | ||
316 | + make_memop_idx(mop[1], idx)); | ||
317 | } | ||
318 | tcg_temp_free_internal(addr_p8); | ||
319 | } else { | ||
10 | diff --git a/tcg/tcg.c b/tcg/tcg.c | 320 | diff --git a/tcg/tcg.c b/tcg/tcg.c |
11 | index XXXXXXX..XXXXXXX 100644 | 321 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/tcg/tcg.c | 322 | --- a/tcg/tcg.c |
13 | +++ b/tcg/tcg.c | 323 | +++ b/tcg/tcg.c |
14 | @@ -XXX,XX +XXX,XX @@ TCGOp *tcg_op_insert_after(TCGContext *s, TCGOp *old_op, | 324 | @@ -XXX,XX +XXX,XX @@ bool tcg_op_supported(TCGOpcode op, TCGType type, unsigned flags) |
15 | return new_op; | 325 | case INDEX_op_exit_tb: |
326 | case INDEX_op_goto_tb: | ||
327 | case INDEX_op_goto_ptr: | ||
328 | - case INDEX_op_qemu_ld_a32_i32: | ||
329 | - case INDEX_op_qemu_ld_a64_i32: | ||
330 | - case INDEX_op_qemu_st_a32_i32: | ||
331 | - case INDEX_op_qemu_st_a64_i32: | ||
332 | - case INDEX_op_qemu_ld_a32_i64: | ||
333 | - case INDEX_op_qemu_ld_a64_i64: | ||
334 | - case INDEX_op_qemu_st_a32_i64: | ||
335 | - case INDEX_op_qemu_st_a64_i64: | ||
336 | + case INDEX_op_qemu_ld_i32: | ||
337 | + case INDEX_op_qemu_st_i32: | ||
338 | + case INDEX_op_qemu_ld_i64: | ||
339 | + case INDEX_op_qemu_st_i64: | ||
340 | return true; | ||
341 | |||
342 | - case INDEX_op_qemu_st8_a32_i32: | ||
343 | - case INDEX_op_qemu_st8_a64_i32: | ||
344 | + case INDEX_op_qemu_st8_i32: | ||
345 | return TCG_TARGET_HAS_qemu_st8_i32; | ||
346 | |||
347 | - case INDEX_op_qemu_ld_a32_i128: | ||
348 | - case INDEX_op_qemu_ld_a64_i128: | ||
349 | - case INDEX_op_qemu_st_a32_i128: | ||
350 | - case INDEX_op_qemu_st_a64_i128: | ||
351 | + case INDEX_op_qemu_ld_i128: | ||
352 | + case INDEX_op_qemu_st_i128: | ||
353 | return TCG_TARGET_HAS_qemu_ldst_i128; | ||
354 | |||
355 | case INDEX_op_mov_i32: | ||
356 | @@ -XXX,XX +XXX,XX @@ void tcg_dump_ops(TCGContext *s, FILE *f, bool have_prefs) | ||
357 | } | ||
358 | i = 1; | ||
359 | break; | ||
360 | - case INDEX_op_qemu_ld_a32_i32: | ||
361 | - case INDEX_op_qemu_ld_a64_i32: | ||
362 | - case INDEX_op_qemu_st_a32_i32: | ||
363 | - case INDEX_op_qemu_st_a64_i32: | ||
364 | - case INDEX_op_qemu_st8_a32_i32: | ||
365 | - case INDEX_op_qemu_st8_a64_i32: | ||
366 | - case INDEX_op_qemu_ld_a32_i64: | ||
367 | - case INDEX_op_qemu_ld_a64_i64: | ||
368 | - case INDEX_op_qemu_st_a32_i64: | ||
369 | - case INDEX_op_qemu_st_a64_i64: | ||
370 | - case INDEX_op_qemu_ld_a32_i128: | ||
371 | - case INDEX_op_qemu_ld_a64_i128: | ||
372 | - case INDEX_op_qemu_st_a32_i128: | ||
373 | - case INDEX_op_qemu_st_a64_i128: | ||
374 | + case INDEX_op_qemu_ld_i32: | ||
375 | + case INDEX_op_qemu_st_i32: | ||
376 | + case INDEX_op_qemu_st8_i32: | ||
377 | + case INDEX_op_qemu_ld_i64: | ||
378 | + case INDEX_op_qemu_st_i64: | ||
379 | + case INDEX_op_qemu_ld_i128: | ||
380 | + case INDEX_op_qemu_st_i128: | ||
381 | { | ||
382 | const char *s_al, *s_op, *s_at; | ||
383 | MemOpIdx oi = op->args[k++]; | ||
384 | diff --git a/tcg/tci.c b/tcg/tci.c | ||
385 | index XXXXXXX..XXXXXXX 100644 | ||
386 | --- a/tcg/tci.c | ||
387 | +++ b/tcg/tci.c | ||
388 | @@ -XXX,XX +XXX,XX @@ static void tci_args_rrrbb(uint32_t insn, TCGReg *r0, TCGReg *r1, | ||
389 | *i4 = extract32(insn, 26, 6); | ||
16 | } | 390 | } |
17 | 391 | ||
18 | +static void move_label_uses(TCGLabel *to, TCGLabel *from) | 392 | -static void tci_args_rrrrr(uint32_t insn, TCGReg *r0, TCGReg *r1, |
19 | +{ | 393 | - TCGReg *r2, TCGReg *r3, TCGReg *r4) |
20 | + TCGLabelUse *u; | 394 | -{ |
21 | + | 395 | - *r0 = extract32(insn, 8, 4); |
22 | + QSIMPLEQ_FOREACH(u, &from->branches, next) { | 396 | - *r1 = extract32(insn, 12, 4); |
23 | + TCGOp *op = u->op; | 397 | - *r2 = extract32(insn, 16, 4); |
24 | + switch (op->opc) { | 398 | - *r3 = extract32(insn, 20, 4); |
25 | + case INDEX_op_br: | 399 | - *r4 = extract32(insn, 24, 4); |
26 | + op->args[0] = label_arg(to); | 400 | -} |
401 | - | ||
402 | static void tci_args_rrrr(uint32_t insn, | ||
403 | TCGReg *r0, TCGReg *r1, TCGReg *r2, TCGReg *r3) | ||
404 | { | ||
405 | @@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env, | ||
406 | tb_ptr = ptr; | ||
407 | break; | ||
408 | |||
409 | - case INDEX_op_qemu_ld_a32_i32: | ||
410 | + case INDEX_op_qemu_ld_i32: | ||
411 | tci_args_rrm(insn, &r0, &r1, &oi); | ||
412 | - taddr = (uint32_t)regs[r1]; | ||
413 | - goto do_ld_i32; | ||
414 | - case INDEX_op_qemu_ld_a64_i32: | ||
415 | - if (TCG_TARGET_REG_BITS == 64) { | ||
416 | - tci_args_rrm(insn, &r0, &r1, &oi); | ||
417 | - taddr = regs[r1]; | ||
418 | - } else { | ||
419 | - tci_args_rrrr(insn, &r0, &r1, &r2, &r3); | ||
420 | - taddr = tci_uint64(regs[r2], regs[r1]); | ||
421 | - oi = regs[r3]; | ||
422 | - } | ||
423 | - do_ld_i32: | ||
424 | + taddr = regs[r1]; | ||
425 | regs[r0] = tci_qemu_ld(env, taddr, oi, tb_ptr); | ||
426 | break; | ||
427 | |||
428 | - case INDEX_op_qemu_ld_a32_i64: | ||
429 | - if (TCG_TARGET_REG_BITS == 64) { | ||
430 | - tci_args_rrm(insn, &r0, &r1, &oi); | ||
431 | - taddr = (uint32_t)regs[r1]; | ||
432 | - } else { | ||
433 | - tci_args_rrrr(insn, &r0, &r1, &r2, &r3); | ||
434 | - taddr = (uint32_t)regs[r2]; | ||
435 | - oi = regs[r3]; | ||
436 | - } | ||
437 | - goto do_ld_i64; | ||
438 | - case INDEX_op_qemu_ld_a64_i64: | ||
439 | + case INDEX_op_qemu_ld_i64: | ||
440 | if (TCG_TARGET_REG_BITS == 64) { | ||
441 | tci_args_rrm(insn, &r0, &r1, &oi); | ||
442 | taddr = regs[r1]; | ||
443 | } else { | ||
444 | - tci_args_rrrrr(insn, &r0, &r1, &r2, &r3, &r4); | ||
445 | - taddr = tci_uint64(regs[r3], regs[r2]); | ||
446 | - oi = regs[r4]; | ||
447 | + tci_args_rrrr(insn, &r0, &r1, &r2, &r3); | ||
448 | + taddr = regs[r2]; | ||
449 | + oi = regs[r3]; | ||
450 | } | ||
451 | - do_ld_i64: | ||
452 | tmp64 = tci_qemu_ld(env, taddr, oi, tb_ptr); | ||
453 | if (TCG_TARGET_REG_BITS == 32) { | ||
454 | tci_write_reg64(regs, r1, r0, tmp64); | ||
455 | @@ -XXX,XX +XXX,XX @@ uintptr_t QEMU_DISABLE_CFI tcg_qemu_tb_exec(CPUArchState *env, | ||
456 | } | ||
457 | break; | ||
458 | |||
459 | - case INDEX_op_qemu_st_a32_i32: | ||
460 | + case INDEX_op_qemu_st_i32: | ||
461 | tci_args_rrm(insn, &r0, &r1, &oi); | ||
462 | - taddr = (uint32_t)regs[r1]; | ||
463 | - goto do_st_i32; | ||
464 | - case INDEX_op_qemu_st_a64_i32: | ||
465 | - if (TCG_TARGET_REG_BITS == 64) { | ||
466 | - tci_args_rrm(insn, &r0, &r1, &oi); | ||
467 | - taddr = regs[r1]; | ||
468 | - } else { | ||
469 | - tci_args_rrrr(insn, &r0, &r1, &r2, &r3); | ||
470 | - taddr = tci_uint64(regs[r2], regs[r1]); | ||
471 | - oi = regs[r3]; | ||
472 | - } | ||
473 | - do_st_i32: | ||
474 | + taddr = regs[r1]; | ||
475 | tci_qemu_st(env, taddr, regs[r0], oi, tb_ptr); | ||
476 | break; | ||
477 | |||
478 | - case INDEX_op_qemu_st_a32_i64: | ||
479 | - if (TCG_TARGET_REG_BITS == 64) { | ||
480 | - tci_args_rrm(insn, &r0, &r1, &oi); | ||
481 | - tmp64 = regs[r0]; | ||
482 | - taddr = (uint32_t)regs[r1]; | ||
483 | - } else { | ||
484 | - tci_args_rrrr(insn, &r0, &r1, &r2, &r3); | ||
485 | - tmp64 = tci_uint64(regs[r1], regs[r0]); | ||
486 | - taddr = (uint32_t)regs[r2]; | ||
487 | - oi = regs[r3]; | ||
488 | - } | ||
489 | - goto do_st_i64; | ||
490 | - case INDEX_op_qemu_st_a64_i64: | ||
491 | + case INDEX_op_qemu_st_i64: | ||
492 | if (TCG_TARGET_REG_BITS == 64) { | ||
493 | tci_args_rrm(insn, &r0, &r1, &oi); | ||
494 | tmp64 = regs[r0]; | ||
495 | taddr = regs[r1]; | ||
496 | } else { | ||
497 | - tci_args_rrrrr(insn, &r0, &r1, &r2, &r3, &r4); | ||
498 | + tci_args_rrrr(insn, &r0, &r1, &r2, &r3); | ||
499 | tmp64 = tci_uint64(regs[r1], regs[r0]); | ||
500 | - taddr = tci_uint64(regs[r3], regs[r2]); | ||
501 | - oi = regs[r4]; | ||
502 | + taddr = regs[r2]; | ||
503 | + oi = regs[r3]; | ||
504 | } | ||
505 | - do_st_i64: | ||
506 | tci_qemu_st(env, taddr, tmp64, oi, tb_ptr); | ||
507 | break; | ||
508 | |||
509 | @@ -XXX,XX +XXX,XX @@ int print_insn_tci(bfd_vma addr, disassemble_info *info) | ||
510 | str_r(r3), str_r(r4), str_r(r5)); | ||
511 | break; | ||
512 | |||
513 | - case INDEX_op_qemu_ld_a32_i32: | ||
514 | - case INDEX_op_qemu_st_a32_i32: | ||
515 | - len = 1 + 1; | ||
516 | - goto do_qemu_ldst; | ||
517 | - case INDEX_op_qemu_ld_a32_i64: | ||
518 | - case INDEX_op_qemu_st_a32_i64: | ||
519 | - case INDEX_op_qemu_ld_a64_i32: | ||
520 | - case INDEX_op_qemu_st_a64_i32: | ||
521 | - len = 1 + DIV_ROUND_UP(64, TCG_TARGET_REG_BITS); | ||
522 | - goto do_qemu_ldst; | ||
523 | - case INDEX_op_qemu_ld_a64_i64: | ||
524 | - case INDEX_op_qemu_st_a64_i64: | ||
525 | - len = 2 * DIV_ROUND_UP(64, TCG_TARGET_REG_BITS); | ||
526 | - goto do_qemu_ldst; | ||
527 | - do_qemu_ldst: | ||
528 | - switch (len) { | ||
529 | - case 2: | ||
530 | - tci_args_rrm(insn, &r0, &r1, &oi); | ||
531 | - info->fprintf_func(info->stream, "%-12s %s, %s, %x", | ||
532 | - op_name, str_r(r0), str_r(r1), oi); | ||
533 | - break; | ||
534 | - case 3: | ||
535 | + case INDEX_op_qemu_ld_i64: | ||
536 | + case INDEX_op_qemu_st_i64: | ||
537 | + if (TCG_TARGET_REG_BITS == 32) { | ||
538 | tci_args_rrrr(insn, &r0, &r1, &r2, &r3); | ||
539 | info->fprintf_func(info->stream, "%-12s %s, %s, %s, %s", | ||
540 | op_name, str_r(r0), str_r(r1), | ||
541 | str_r(r2), str_r(r3)); | ||
542 | break; | ||
543 | - case 4: | ||
544 | - tci_args_rrrrr(insn, &r0, &r1, &r2, &r3, &r4); | ||
545 | - info->fprintf_func(info->stream, "%-12s %s, %s, %s, %s, %s", | ||
546 | - op_name, str_r(r0), str_r(r1), | ||
547 | - str_r(r2), str_r(r3), str_r(r4)); | ||
548 | - break; | ||
549 | - default: | ||
550 | - g_assert_not_reached(); | ||
551 | } | ||
552 | + /* fall through */ | ||
553 | + case INDEX_op_qemu_ld_i32: | ||
554 | + case INDEX_op_qemu_st_i32: | ||
555 | + tci_args_rrm(insn, &r0, &r1, &oi); | ||
556 | + info->fprintf_func(info->stream, "%-12s %s, %s, %x", | ||
557 | + op_name, str_r(r0), str_r(r1), oi); | ||
558 | break; | ||
559 | |||
560 | case 0: | ||
561 | diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc | ||
562 | index XXXXXXX..XXXXXXX 100644 | ||
563 | --- a/tcg/aarch64/tcg-target.c.inc | ||
564 | +++ b/tcg/aarch64/tcg-target.c.inc | ||
565 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext, | ||
566 | tcg_out_insn(s, 3506, CSEL, ext, a0, REG0(3), REG0(4), args[5]); | ||
567 | break; | ||
568 | |||
569 | - case INDEX_op_qemu_ld_a32_i32: | ||
570 | - case INDEX_op_qemu_ld_a64_i32: | ||
571 | - case INDEX_op_qemu_ld_a32_i64: | ||
572 | - case INDEX_op_qemu_ld_a64_i64: | ||
573 | + case INDEX_op_qemu_ld_i32: | ||
574 | + case INDEX_op_qemu_ld_i64: | ||
575 | tcg_out_qemu_ld(s, a0, a1, a2, ext); | ||
576 | break; | ||
577 | - case INDEX_op_qemu_st_a32_i32: | ||
578 | - case INDEX_op_qemu_st_a64_i32: | ||
579 | - case INDEX_op_qemu_st_a32_i64: | ||
580 | - case INDEX_op_qemu_st_a64_i64: | ||
581 | + case INDEX_op_qemu_st_i32: | ||
582 | + case INDEX_op_qemu_st_i64: | ||
583 | tcg_out_qemu_st(s, REG0(0), a1, a2, ext); | ||
584 | break; | ||
585 | - case INDEX_op_qemu_ld_a32_i128: | ||
586 | - case INDEX_op_qemu_ld_a64_i128: | ||
587 | + case INDEX_op_qemu_ld_i128: | ||
588 | tcg_out_qemu_ldst_i128(s, a0, a1, a2, args[3], true); | ||
589 | break; | ||
590 | - case INDEX_op_qemu_st_a32_i128: | ||
591 | - case INDEX_op_qemu_st_a64_i128: | ||
592 | + case INDEX_op_qemu_st_i128: | ||
593 | tcg_out_qemu_ldst_i128(s, REG0(0), REG0(1), a2, args[3], false); | ||
594 | break; | ||
595 | |||
596 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
597 | case INDEX_op_movcond_i64: | ||
598 | return C_O1_I4(r, r, rC, rZ, rZ); | ||
599 | |||
600 | - case INDEX_op_qemu_ld_a32_i32: | ||
601 | - case INDEX_op_qemu_ld_a64_i32: | ||
602 | - case INDEX_op_qemu_ld_a32_i64: | ||
603 | - case INDEX_op_qemu_ld_a64_i64: | ||
604 | + case INDEX_op_qemu_ld_i32: | ||
605 | + case INDEX_op_qemu_ld_i64: | ||
606 | return C_O1_I1(r, r); | ||
607 | - case INDEX_op_qemu_ld_a32_i128: | ||
608 | - case INDEX_op_qemu_ld_a64_i128: | ||
609 | + case INDEX_op_qemu_ld_i128: | ||
610 | return C_O2_I1(r, r, r); | ||
611 | - case INDEX_op_qemu_st_a32_i32: | ||
612 | - case INDEX_op_qemu_st_a64_i32: | ||
613 | - case INDEX_op_qemu_st_a32_i64: | ||
614 | - case INDEX_op_qemu_st_a64_i64: | ||
615 | + case INDEX_op_qemu_st_i32: | ||
616 | + case INDEX_op_qemu_st_i64: | ||
617 | return C_O0_I2(rZ, r); | ||
618 | - case INDEX_op_qemu_st_a32_i128: | ||
619 | - case INDEX_op_qemu_st_a64_i128: | ||
620 | + case INDEX_op_qemu_st_i128: | ||
621 | return C_O0_I3(rZ, rZ, r); | ||
622 | |||
623 | case INDEX_op_deposit_i32: | ||
624 | diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc | ||
625 | index XXXXXXX..XXXXXXX 100644 | ||
626 | --- a/tcg/arm/tcg-target.c.inc | ||
627 | +++ b/tcg/arm/tcg-target.c.inc | ||
628 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
629 | ARITH_MOV, args[0], 0, 0); | ||
630 | break; | ||
631 | |||
632 | - case INDEX_op_qemu_ld_a32_i32: | ||
633 | + case INDEX_op_qemu_ld_i32: | ||
634 | tcg_out_qemu_ld(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32); | ||
635 | break; | ||
636 | - case INDEX_op_qemu_ld_a64_i32: | ||
637 | - tcg_out_qemu_ld(s, args[0], -1, args[1], args[2], | ||
638 | - args[3], TCG_TYPE_I32); | ||
639 | - break; | ||
640 | - case INDEX_op_qemu_ld_a32_i64: | ||
641 | + case INDEX_op_qemu_ld_i64: | ||
642 | tcg_out_qemu_ld(s, args[0], args[1], args[2], -1, | ||
643 | args[3], TCG_TYPE_I64); | ||
644 | break; | ||
645 | - case INDEX_op_qemu_ld_a64_i64: | ||
646 | - tcg_out_qemu_ld(s, args[0], args[1], args[2], args[3], | ||
647 | - args[4], TCG_TYPE_I64); | ||
648 | - break; | ||
649 | |||
650 | - case INDEX_op_qemu_st_a32_i32: | ||
651 | + case INDEX_op_qemu_st_i32: | ||
652 | tcg_out_qemu_st(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32); | ||
653 | break; | ||
654 | - case INDEX_op_qemu_st_a64_i32: | ||
655 | - tcg_out_qemu_st(s, args[0], -1, args[1], args[2], | ||
656 | - args[3], TCG_TYPE_I32); | ||
657 | - break; | ||
658 | - case INDEX_op_qemu_st_a32_i64: | ||
659 | + case INDEX_op_qemu_st_i64: | ||
660 | tcg_out_qemu_st(s, args[0], args[1], args[2], -1, | ||
661 | args[3], TCG_TYPE_I64); | ||
662 | break; | ||
663 | - case INDEX_op_qemu_st_a64_i64: | ||
664 | - tcg_out_qemu_st(s, args[0], args[1], args[2], args[3], | ||
665 | - args[4], TCG_TYPE_I64); | ||
666 | - break; | ||
667 | |||
668 | case INDEX_op_bswap16_i32: | ||
669 | tcg_out_bswap16(s, COND_AL, args[0], args[1], args[2]); | ||
670 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
671 | case INDEX_op_setcond2_i32: | ||
672 | return C_O1_I4(r, r, r, rI, rI); | ||
673 | |||
674 | - case INDEX_op_qemu_ld_a32_i32: | ||
675 | + case INDEX_op_qemu_ld_i32: | ||
676 | return C_O1_I1(r, q); | ||
677 | - case INDEX_op_qemu_ld_a64_i32: | ||
678 | - return C_O1_I2(r, q, q); | ||
679 | - case INDEX_op_qemu_ld_a32_i64: | ||
680 | + case INDEX_op_qemu_ld_i64: | ||
681 | return C_O2_I1(e, p, q); | ||
682 | - case INDEX_op_qemu_ld_a64_i64: | ||
683 | - return C_O2_I2(e, p, q, q); | ||
684 | - case INDEX_op_qemu_st_a32_i32: | ||
685 | + case INDEX_op_qemu_st_i32: | ||
686 | return C_O0_I2(q, q); | ||
687 | - case INDEX_op_qemu_st_a64_i32: | ||
688 | - return C_O0_I3(q, q, q); | ||
689 | - case INDEX_op_qemu_st_a32_i64: | ||
690 | + case INDEX_op_qemu_st_i64: | ||
691 | return C_O0_I3(Q, p, q); | ||
692 | - case INDEX_op_qemu_st_a64_i64: | ||
693 | - return C_O0_I4(Q, p, q, q); | ||
694 | |||
695 | case INDEX_op_st_vec: | ||
696 | return C_O0_I2(w, r); | ||
697 | diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc | ||
698 | index XXXXXXX..XXXXXXX 100644 | ||
699 | --- a/tcg/i386/tcg-target.c.inc | ||
700 | +++ b/tcg/i386/tcg-target.c.inc | ||
701 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
702 | tcg_out_modrm(s, OPC_GRP3_Ev + rexw, EXT3_NOT, a0); | ||
703 | break; | ||
704 | |||
705 | - case INDEX_op_qemu_ld_a64_i32: | ||
706 | - if (TCG_TARGET_REG_BITS == 32) { | ||
707 | - tcg_out_qemu_ld(s, a0, -1, a1, a2, args[3], TCG_TYPE_I32); | ||
708 | - break; | ||
709 | - } | ||
710 | - /* fall through */ | ||
711 | - case INDEX_op_qemu_ld_a32_i32: | ||
712 | + case INDEX_op_qemu_ld_i32: | ||
713 | tcg_out_qemu_ld(s, a0, -1, a1, -1, a2, TCG_TYPE_I32); | ||
714 | break; | ||
715 | - case INDEX_op_qemu_ld_a32_i64: | ||
716 | + case INDEX_op_qemu_ld_i64: | ||
717 | if (TCG_TARGET_REG_BITS == 64) { | ||
718 | tcg_out_qemu_ld(s, a0, -1, a1, -1, a2, TCG_TYPE_I64); | ||
719 | } else { | ||
720 | tcg_out_qemu_ld(s, a0, a1, a2, -1, args[3], TCG_TYPE_I64); | ||
721 | } | ||
722 | break; | ||
723 | - case INDEX_op_qemu_ld_a64_i64: | ||
724 | - if (TCG_TARGET_REG_BITS == 64) { | ||
725 | - tcg_out_qemu_ld(s, a0, -1, a1, -1, a2, TCG_TYPE_I64); | ||
726 | - } else { | ||
727 | - tcg_out_qemu_ld(s, a0, a1, a2, args[3], args[4], TCG_TYPE_I64); | ||
728 | - } | ||
729 | - break; | ||
730 | - case INDEX_op_qemu_ld_a32_i128: | ||
731 | - case INDEX_op_qemu_ld_a64_i128: | ||
732 | + case INDEX_op_qemu_ld_i128: | ||
733 | tcg_debug_assert(TCG_TARGET_REG_BITS == 64); | ||
734 | tcg_out_qemu_ld(s, a0, a1, a2, -1, args[3], TCG_TYPE_I128); | ||
735 | break; | ||
736 | |||
737 | - case INDEX_op_qemu_st_a64_i32: | ||
738 | - case INDEX_op_qemu_st8_a64_i32: | ||
739 | - if (TCG_TARGET_REG_BITS == 32) { | ||
740 | - tcg_out_qemu_st(s, a0, -1, a1, a2, args[3], TCG_TYPE_I32); | ||
741 | - break; | ||
742 | - } | ||
743 | - /* fall through */ | ||
744 | - case INDEX_op_qemu_st_a32_i32: | ||
745 | - case INDEX_op_qemu_st8_a32_i32: | ||
746 | + case INDEX_op_qemu_st_i32: | ||
747 | + case INDEX_op_qemu_st8_i32: | ||
748 | tcg_out_qemu_st(s, a0, -1, a1, -1, a2, TCG_TYPE_I32); | ||
749 | break; | ||
750 | - case INDEX_op_qemu_st_a32_i64: | ||
751 | + case INDEX_op_qemu_st_i64: | ||
752 | if (TCG_TARGET_REG_BITS == 64) { | ||
753 | tcg_out_qemu_st(s, a0, -1, a1, -1, a2, TCG_TYPE_I64); | ||
754 | } else { | ||
755 | tcg_out_qemu_st(s, a0, a1, a2, -1, args[3], TCG_TYPE_I64); | ||
756 | } | ||
757 | break; | ||
758 | - case INDEX_op_qemu_st_a64_i64: | ||
759 | - if (TCG_TARGET_REG_BITS == 64) { | ||
760 | - tcg_out_qemu_st(s, a0, -1, a1, -1, a2, TCG_TYPE_I64); | ||
761 | - } else { | ||
762 | - tcg_out_qemu_st(s, a0, a1, a2, args[3], args[4], TCG_TYPE_I64); | ||
763 | - } | ||
764 | - break; | ||
765 | - case INDEX_op_qemu_st_a32_i128: | ||
766 | - case INDEX_op_qemu_st_a64_i128: | ||
767 | + case INDEX_op_qemu_st_i128: | ||
768 | tcg_debug_assert(TCG_TARGET_REG_BITS == 64); | ||
769 | tcg_out_qemu_st(s, a0, a1, a2, -1, args[3], TCG_TYPE_I128); | ||
770 | break; | ||
771 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
772 | case INDEX_op_clz_i64: | ||
773 | return have_lzcnt ? C_N1_I2(r, r, rW) : C_N1_I2(r, r, r); | ||
774 | |||
775 | - case INDEX_op_qemu_ld_a32_i32: | ||
776 | + case INDEX_op_qemu_ld_i32: | ||
777 | return C_O1_I1(r, L); | ||
778 | - case INDEX_op_qemu_ld_a64_i32: | ||
779 | - return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, L) : C_O1_I2(r, L, L); | ||
780 | |||
781 | - case INDEX_op_qemu_st_a32_i32: | ||
782 | + case INDEX_op_qemu_st_i32: | ||
783 | return C_O0_I2(L, L); | ||
784 | - case INDEX_op_qemu_st_a64_i32: | ||
785 | - return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(L, L) : C_O0_I3(L, L, L); | ||
786 | - case INDEX_op_qemu_st8_a32_i32: | ||
787 | + case INDEX_op_qemu_st8_i32: | ||
788 | return C_O0_I2(s, L); | ||
789 | - case INDEX_op_qemu_st8_a64_i32: | ||
790 | - return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(s, L) : C_O0_I3(s, L, L); | ||
791 | |||
792 | - case INDEX_op_qemu_ld_a32_i64: | ||
793 | + case INDEX_op_qemu_ld_i64: | ||
794 | return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, L) : C_O2_I1(r, r, L); | ||
795 | - case INDEX_op_qemu_ld_a64_i64: | ||
796 | - return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, L) : C_O2_I2(r, r, L, L); | ||
797 | |||
798 | - case INDEX_op_qemu_st_a32_i64: | ||
799 | + case INDEX_op_qemu_st_i64: | ||
800 | return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(L, L) : C_O0_I3(L, L, L); | ||
801 | - case INDEX_op_qemu_st_a64_i64: | ||
802 | - return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(L, L) : C_O0_I4(L, L, L, L); | ||
803 | |||
804 | - case INDEX_op_qemu_ld_a32_i128: | ||
805 | - case INDEX_op_qemu_ld_a64_i128: | ||
806 | + case INDEX_op_qemu_ld_i128: | ||
807 | tcg_debug_assert(TCG_TARGET_REG_BITS == 64); | ||
808 | return C_O2_I1(r, r, L); | ||
809 | - case INDEX_op_qemu_st_a32_i128: | ||
810 | - case INDEX_op_qemu_st_a64_i128: | ||
811 | + case INDEX_op_qemu_st_i128: | ||
812 | tcg_debug_assert(TCG_TARGET_REG_BITS == 64); | ||
813 | return C_O0_I3(L, L, L); | ||
814 | |||
815 | diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc | ||
816 | index XXXXXXX..XXXXXXX 100644 | ||
817 | --- a/tcg/loongarch64/tcg-target.c.inc | ||
818 | +++ b/tcg/loongarch64/tcg-target.c.inc | ||
819 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
820 | tcg_out_ldst(s, OPC_ST_D, a0, a1, a2); | ||
821 | break; | ||
822 | |||
823 | - case INDEX_op_qemu_ld_a32_i32: | ||
824 | - case INDEX_op_qemu_ld_a64_i32: | ||
825 | + case INDEX_op_qemu_ld_i32: | ||
826 | tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I32); | ||
827 | break; | ||
828 | - case INDEX_op_qemu_ld_a32_i64: | ||
829 | - case INDEX_op_qemu_ld_a64_i64: | ||
830 | + case INDEX_op_qemu_ld_i64: | ||
831 | tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I64); | ||
832 | break; | ||
833 | - case INDEX_op_qemu_ld_a32_i128: | ||
834 | - case INDEX_op_qemu_ld_a64_i128: | ||
835 | + case INDEX_op_qemu_ld_i128: | ||
836 | tcg_out_qemu_ldst_i128(s, a0, a1, a2, a3, true); | ||
837 | break; | ||
838 | - case INDEX_op_qemu_st_a32_i32: | ||
839 | - case INDEX_op_qemu_st_a64_i32: | ||
840 | + case INDEX_op_qemu_st_i32: | ||
841 | tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I32); | ||
842 | break; | ||
843 | - case INDEX_op_qemu_st_a32_i64: | ||
844 | - case INDEX_op_qemu_st_a64_i64: | ||
845 | + case INDEX_op_qemu_st_i64: | ||
846 | tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I64); | ||
847 | break; | ||
848 | - case INDEX_op_qemu_st_a32_i128: | ||
849 | - case INDEX_op_qemu_st_a64_i128: | ||
850 | + case INDEX_op_qemu_st_i128: | ||
851 | tcg_out_qemu_ldst_i128(s, a0, a1, a2, a3, false); | ||
852 | break; | ||
853 | |||
854 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
855 | case INDEX_op_st32_i64: | ||
856 | case INDEX_op_st_i32: | ||
857 | case INDEX_op_st_i64: | ||
858 | - case INDEX_op_qemu_st_a32_i32: | ||
859 | - case INDEX_op_qemu_st_a64_i32: | ||
860 | - case INDEX_op_qemu_st_a32_i64: | ||
861 | - case INDEX_op_qemu_st_a64_i64: | ||
862 | + case INDEX_op_qemu_st_i32: | ||
863 | + case INDEX_op_qemu_st_i64: | ||
864 | return C_O0_I2(rZ, r); | ||
865 | |||
866 | - case INDEX_op_qemu_ld_a32_i128: | ||
867 | - case INDEX_op_qemu_ld_a64_i128: | ||
868 | + case INDEX_op_qemu_ld_i128: | ||
869 | return C_N2_I1(r, r, r); | ||
870 | |||
871 | - case INDEX_op_qemu_st_a32_i128: | ||
872 | - case INDEX_op_qemu_st_a64_i128: | ||
873 | + case INDEX_op_qemu_st_i128: | ||
874 | return C_O0_I3(r, r, r); | ||
875 | |||
876 | case INDEX_op_brcond_i32: | ||
877 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
878 | case INDEX_op_ld32u_i64: | ||
879 | case INDEX_op_ld_i32: | ||
880 | case INDEX_op_ld_i64: | ||
881 | - case INDEX_op_qemu_ld_a32_i32: | ||
882 | - case INDEX_op_qemu_ld_a64_i32: | ||
883 | - case INDEX_op_qemu_ld_a32_i64: | ||
884 | - case INDEX_op_qemu_ld_a64_i64: | ||
885 | + case INDEX_op_qemu_ld_i32: | ||
886 | + case INDEX_op_qemu_ld_i64: | ||
887 | return C_O1_I1(r, r); | ||
888 | |||
889 | case INDEX_op_andc_i32: | ||
890 | diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc | ||
891 | index XXXXXXX..XXXXXXX 100644 | ||
892 | --- a/tcg/mips/tcg-target.c.inc | ||
893 | +++ b/tcg/mips/tcg-target.c.inc | ||
894 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
895 | tcg_out_setcond2(s, args[5], a0, a1, a2, args[3], args[4]); | ||
896 | break; | ||
897 | |||
898 | - case INDEX_op_qemu_ld_a64_i32: | ||
899 | - if (TCG_TARGET_REG_BITS == 32) { | ||
900 | - tcg_out_qemu_ld(s, a0, 0, a1, a2, args[3], TCG_TYPE_I32); | ||
901 | - break; | ||
902 | - } | ||
903 | - /* fall through */ | ||
904 | - case INDEX_op_qemu_ld_a32_i32: | ||
905 | + case INDEX_op_qemu_ld_i32: | ||
906 | tcg_out_qemu_ld(s, a0, 0, a1, 0, a2, TCG_TYPE_I32); | ||
907 | break; | ||
908 | - case INDEX_op_qemu_ld_a32_i64: | ||
909 | + case INDEX_op_qemu_ld_i64: | ||
910 | if (TCG_TARGET_REG_BITS == 64) { | ||
911 | tcg_out_qemu_ld(s, a0, 0, a1, 0, a2, TCG_TYPE_I64); | ||
912 | } else { | ||
913 | tcg_out_qemu_ld(s, a0, a1, a2, 0, args[3], TCG_TYPE_I64); | ||
914 | } | ||
915 | break; | ||
916 | - case INDEX_op_qemu_ld_a64_i64: | ||
917 | - if (TCG_TARGET_REG_BITS == 64) { | ||
918 | - tcg_out_qemu_ld(s, a0, 0, a1, 0, a2, TCG_TYPE_I64); | ||
919 | - } else { | ||
920 | - tcg_out_qemu_ld(s, a0, a1, a2, args[3], args[4], TCG_TYPE_I64); | ||
921 | - } | ||
922 | - break; | ||
923 | |||
924 | - case INDEX_op_qemu_st_a64_i32: | ||
925 | - if (TCG_TARGET_REG_BITS == 32) { | ||
926 | - tcg_out_qemu_st(s, a0, 0, a1, a2, args[3], TCG_TYPE_I32); | ||
927 | - break; | ||
928 | - } | ||
929 | - /* fall through */ | ||
930 | - case INDEX_op_qemu_st_a32_i32: | ||
931 | + case INDEX_op_qemu_st_i32: | ||
932 | tcg_out_qemu_st(s, a0, 0, a1, 0, a2, TCG_TYPE_I32); | ||
933 | break; | ||
934 | - case INDEX_op_qemu_st_a32_i64: | ||
935 | + case INDEX_op_qemu_st_i64: | ||
936 | if (TCG_TARGET_REG_BITS == 64) { | ||
937 | tcg_out_qemu_st(s, a0, 0, a1, 0, a2, TCG_TYPE_I64); | ||
938 | } else { | ||
939 | tcg_out_qemu_st(s, a0, a1, a2, 0, args[3], TCG_TYPE_I64); | ||
940 | } | ||
941 | break; | ||
942 | - case INDEX_op_qemu_st_a64_i64: | ||
943 | - if (TCG_TARGET_REG_BITS == 64) { | ||
944 | - tcg_out_qemu_st(s, a0, 0, a1, 0, a2, TCG_TYPE_I64); | ||
945 | - } else { | ||
946 | - tcg_out_qemu_st(s, a0, a1, a2, args[3], args[4], TCG_TYPE_I64); | ||
947 | - } | ||
948 | - break; | ||
949 | |||
950 | case INDEX_op_add2_i32: | ||
951 | tcg_out_addsub2(s, a0, a1, a2, args[3], args[4], args[5], | ||
952 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
953 | case INDEX_op_brcond2_i32: | ||
954 | return C_O0_I4(rZ, rZ, rZ, rZ); | ||
955 | |||
956 | - case INDEX_op_qemu_ld_a32_i32: | ||
957 | + case INDEX_op_qemu_ld_i32: | ||
958 | return C_O1_I1(r, r); | ||
959 | - case INDEX_op_qemu_ld_a64_i32: | ||
960 | - return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O1_I2(r, r, r); | ||
961 | - case INDEX_op_qemu_st_a32_i32: | ||
962 | + case INDEX_op_qemu_st_i32: | ||
963 | return C_O0_I2(rZ, r); | ||
964 | - case INDEX_op_qemu_st_a64_i32: | ||
965 | - return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(rZ, r) : C_O0_I3(rZ, r, r); | ||
966 | - case INDEX_op_qemu_ld_a32_i64: | ||
967 | + case INDEX_op_qemu_ld_i64: | ||
968 | return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I1(r, r, r); | ||
969 | - case INDEX_op_qemu_ld_a64_i64: | ||
970 | - return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I2(r, r, r, r); | ||
971 | - case INDEX_op_qemu_st_a32_i64: | ||
972 | + case INDEX_op_qemu_st_i64: | ||
973 | return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(rZ, r) : C_O0_I3(rZ, rZ, r); | ||
974 | - case INDEX_op_qemu_st_a64_i64: | ||
975 | - return (TCG_TARGET_REG_BITS == 64 ? C_O0_I2(rZ, r) | ||
976 | - : C_O0_I4(rZ, rZ, r, r)); | ||
977 | |||
978 | default: | ||
979 | return C_NotImplemented; | ||
980 | diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc | ||
981 | index XXXXXXX..XXXXXXX 100644 | ||
982 | --- a/tcg/ppc/tcg-target.c.inc | ||
983 | +++ b/tcg/ppc/tcg-target.c.inc | ||
984 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
985 | tcg_out32(s, MODUD | TAB(args[0], args[1], args[2])); | ||
986 | break; | ||
987 | |||
988 | - case INDEX_op_qemu_ld_a64_i32: | ||
989 | - if (TCG_TARGET_REG_BITS == 32) { | ||
990 | - tcg_out_qemu_ld(s, args[0], -1, args[1], args[2], | ||
991 | - args[3], TCG_TYPE_I32); | ||
992 | - break; | ||
993 | - } | ||
994 | - /* fall through */ | ||
995 | - case INDEX_op_qemu_ld_a32_i32: | ||
996 | + case INDEX_op_qemu_ld_i32: | ||
997 | tcg_out_qemu_ld(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32); | ||
998 | break; | ||
999 | - case INDEX_op_qemu_ld_a32_i64: | ||
1000 | + case INDEX_op_qemu_ld_i64: | ||
1001 | if (TCG_TARGET_REG_BITS == 64) { | ||
1002 | tcg_out_qemu_ld(s, args[0], -1, args[1], -1, | ||
1003 | args[2], TCG_TYPE_I64); | ||
1004 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
1005 | args[3], TCG_TYPE_I64); | ||
1006 | } | ||
1007 | break; | ||
1008 | - case INDEX_op_qemu_ld_a64_i64: | ||
1009 | - if (TCG_TARGET_REG_BITS == 64) { | ||
1010 | - tcg_out_qemu_ld(s, args[0], -1, args[1], -1, | ||
1011 | - args[2], TCG_TYPE_I64); | ||
1012 | - } else { | ||
1013 | - tcg_out_qemu_ld(s, args[0], args[1], args[2], args[3], | ||
1014 | - args[4], TCG_TYPE_I64); | ||
1015 | - } | ||
1016 | - break; | ||
1017 | - case INDEX_op_qemu_ld_a32_i128: | ||
1018 | - case INDEX_op_qemu_ld_a64_i128: | ||
1019 | + case INDEX_op_qemu_ld_i128: | ||
1020 | tcg_debug_assert(TCG_TARGET_REG_BITS == 64); | ||
1021 | tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], true); | ||
1022 | break; | ||
1023 | |||
1024 | - case INDEX_op_qemu_st_a64_i32: | ||
1025 | - if (TCG_TARGET_REG_BITS == 32) { | ||
1026 | - tcg_out_qemu_st(s, args[0], -1, args[1], args[2], | ||
1027 | - args[3], TCG_TYPE_I32); | ||
1028 | - break; | ||
1029 | - } | ||
1030 | - /* fall through */ | ||
1031 | - case INDEX_op_qemu_st_a32_i32: | ||
1032 | + case INDEX_op_qemu_st_i32: | ||
1033 | tcg_out_qemu_st(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32); | ||
1034 | break; | ||
1035 | - case INDEX_op_qemu_st_a32_i64: | ||
1036 | + case INDEX_op_qemu_st_i64: | ||
1037 | if (TCG_TARGET_REG_BITS == 64) { | ||
1038 | tcg_out_qemu_st(s, args[0], -1, args[1], -1, | ||
1039 | args[2], TCG_TYPE_I64); | ||
1040 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
1041 | args[3], TCG_TYPE_I64); | ||
1042 | } | ||
1043 | break; | ||
1044 | - case INDEX_op_qemu_st_a64_i64: | ||
1045 | - if (TCG_TARGET_REG_BITS == 64) { | ||
1046 | - tcg_out_qemu_st(s, args[0], -1, args[1], -1, | ||
1047 | - args[2], TCG_TYPE_I64); | ||
1048 | - } else { | ||
1049 | - tcg_out_qemu_st(s, args[0], args[1], args[2], args[3], | ||
1050 | - args[4], TCG_TYPE_I64); | ||
1051 | - } | ||
1052 | - break; | ||
1053 | - case INDEX_op_qemu_st_a32_i128: | ||
1054 | - case INDEX_op_qemu_st_a64_i128: | ||
1055 | + case INDEX_op_qemu_st_i128: | ||
1056 | tcg_debug_assert(TCG_TARGET_REG_BITS == 64); | ||
1057 | tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], false); | ||
1058 | break; | ||
1059 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
1060 | case INDEX_op_sub2_i32: | ||
1061 | return C_O2_I4(r, r, rI, rZM, r, r); | ||
1062 | |||
1063 | - case INDEX_op_qemu_ld_a32_i32: | ||
1064 | + case INDEX_op_qemu_ld_i32: | ||
1065 | return C_O1_I1(r, r); | ||
1066 | - case INDEX_op_qemu_ld_a64_i32: | ||
1067 | - return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O1_I2(r, r, r); | ||
1068 | - case INDEX_op_qemu_ld_a32_i64: | ||
1069 | + case INDEX_op_qemu_ld_i64: | ||
1070 | return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I1(r, r, r); | ||
1071 | - case INDEX_op_qemu_ld_a64_i64: | ||
1072 | - return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I2(r, r, r, r); | ||
1073 | |||
1074 | - case INDEX_op_qemu_st_a32_i32: | ||
1075 | + case INDEX_op_qemu_st_i32: | ||
1076 | return C_O0_I2(r, r); | ||
1077 | - case INDEX_op_qemu_st_a64_i32: | ||
1078 | + case INDEX_op_qemu_st_i64: | ||
1079 | return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I3(r, r, r); | ||
1080 | - case INDEX_op_qemu_st_a32_i64: | ||
1081 | - return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I3(r, r, r); | ||
1082 | - case INDEX_op_qemu_st_a64_i64: | ||
1083 | - return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I4(r, r, r, r); | ||
1084 | |||
1085 | - case INDEX_op_qemu_ld_a32_i128: | ||
1086 | - case INDEX_op_qemu_ld_a64_i128: | ||
1087 | + case INDEX_op_qemu_ld_i128: | ||
1088 | return C_N1O1_I1(o, m, r); | ||
1089 | - case INDEX_op_qemu_st_a32_i128: | ||
1090 | - case INDEX_op_qemu_st_a64_i128: | ||
1091 | + case INDEX_op_qemu_st_i128: | ||
1092 | return C_O0_I3(o, m, r); | ||
1093 | |||
1094 | case INDEX_op_add_vec: | ||
1095 | diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc | ||
1096 | index XXXXXXX..XXXXXXX 100644 | ||
1097 | --- a/tcg/riscv/tcg-target.c.inc | ||
1098 | +++ b/tcg/riscv/tcg-target.c.inc | ||
1099 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
1100 | args[3], const_args[3], args[4], const_args[4]); | ||
1101 | break; | ||
1102 | |||
1103 | - case INDEX_op_qemu_ld_a32_i32: | ||
1104 | - case INDEX_op_qemu_ld_a64_i32: | ||
1105 | + case INDEX_op_qemu_ld_i32: | ||
1106 | tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I32); | ||
1107 | break; | ||
1108 | - case INDEX_op_qemu_ld_a32_i64: | ||
1109 | - case INDEX_op_qemu_ld_a64_i64: | ||
1110 | + case INDEX_op_qemu_ld_i64: | ||
1111 | tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I64); | ||
1112 | break; | ||
1113 | - case INDEX_op_qemu_st_a32_i32: | ||
1114 | - case INDEX_op_qemu_st_a64_i32: | ||
1115 | + case INDEX_op_qemu_st_i32: | ||
1116 | tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I32); | ||
1117 | break; | ||
1118 | - case INDEX_op_qemu_st_a32_i64: | ||
1119 | - case INDEX_op_qemu_st_a64_i64: | ||
1120 | + case INDEX_op_qemu_st_i64: | ||
1121 | tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I64); | ||
1122 | break; | ||
1123 | |||
1124 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
1125 | case INDEX_op_sub2_i64: | ||
1126 | return C_O2_I4(r, r, rZ, rZ, rM, rM); | ||
1127 | |||
1128 | - case INDEX_op_qemu_ld_a32_i32: | ||
1129 | - case INDEX_op_qemu_ld_a64_i32: | ||
1130 | - case INDEX_op_qemu_ld_a32_i64: | ||
1131 | - case INDEX_op_qemu_ld_a64_i64: | ||
1132 | + case INDEX_op_qemu_ld_i32: | ||
1133 | + case INDEX_op_qemu_ld_i64: | ||
1134 | return C_O1_I1(r, r); | ||
1135 | - case INDEX_op_qemu_st_a32_i32: | ||
1136 | - case INDEX_op_qemu_st_a64_i32: | ||
1137 | - case INDEX_op_qemu_st_a32_i64: | ||
1138 | - case INDEX_op_qemu_st_a64_i64: | ||
1139 | + case INDEX_op_qemu_st_i32: | ||
1140 | + case INDEX_op_qemu_st_i64: | ||
1141 | return C_O0_I2(rZ, r); | ||
1142 | |||
1143 | case INDEX_op_st_vec: | ||
1144 | diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc | ||
1145 | index XXXXXXX..XXXXXXX 100644 | ||
1146 | --- a/tcg/s390x/tcg-target.c.inc | ||
1147 | +++ b/tcg/s390x/tcg-target.c.inc | ||
1148 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
1149 | args[2], const_args[2], args[3], const_args[3], args[4]); | ||
1150 | break; | ||
1151 | |||
1152 | - case INDEX_op_qemu_ld_a32_i32: | ||
1153 | - case INDEX_op_qemu_ld_a64_i32: | ||
1154 | + case INDEX_op_qemu_ld_i32: | ||
1155 | tcg_out_qemu_ld(s, args[0], args[1], args[2], TCG_TYPE_I32); | ||
1156 | break; | ||
1157 | - case INDEX_op_qemu_ld_a32_i64: | ||
1158 | - case INDEX_op_qemu_ld_a64_i64: | ||
1159 | + case INDEX_op_qemu_ld_i64: | ||
1160 | tcg_out_qemu_ld(s, args[0], args[1], args[2], TCG_TYPE_I64); | ||
1161 | break; | ||
1162 | - case INDEX_op_qemu_st_a32_i32: | ||
1163 | - case INDEX_op_qemu_st_a64_i32: | ||
1164 | + case INDEX_op_qemu_st_i32: | ||
1165 | tcg_out_qemu_st(s, args[0], args[1], args[2], TCG_TYPE_I32); | ||
1166 | break; | ||
1167 | - case INDEX_op_qemu_st_a32_i64: | ||
1168 | - case INDEX_op_qemu_st_a64_i64: | ||
1169 | + case INDEX_op_qemu_st_i64: | ||
1170 | tcg_out_qemu_st(s, args[0], args[1], args[2], TCG_TYPE_I64); | ||
1171 | break; | ||
1172 | - case INDEX_op_qemu_ld_a32_i128: | ||
1173 | - case INDEX_op_qemu_ld_a64_i128: | ||
1174 | + case INDEX_op_qemu_ld_i128: | ||
1175 | tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], true); | ||
1176 | break; | ||
1177 | - case INDEX_op_qemu_st_a32_i128: | ||
1178 | - case INDEX_op_qemu_st_a64_i128: | ||
1179 | + case INDEX_op_qemu_st_i128: | ||
1180 | tcg_out_qemu_ldst_i128(s, args[0], args[1], args[2], args[3], false); | ||
1181 | break; | ||
1182 | |||
1183 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
1184 | case INDEX_op_ctpop_i64: | ||
1185 | return C_O1_I1(r, r); | ||
1186 | |||
1187 | - case INDEX_op_qemu_ld_a32_i32: | ||
1188 | - case INDEX_op_qemu_ld_a64_i32: | ||
1189 | - case INDEX_op_qemu_ld_a32_i64: | ||
1190 | - case INDEX_op_qemu_ld_a64_i64: | ||
1191 | + case INDEX_op_qemu_ld_i32: | ||
1192 | + case INDEX_op_qemu_ld_i64: | ||
1193 | return C_O1_I1(r, r); | ||
1194 | - case INDEX_op_qemu_st_a32_i64: | ||
1195 | - case INDEX_op_qemu_st_a64_i64: | ||
1196 | - case INDEX_op_qemu_st_a32_i32: | ||
1197 | - case INDEX_op_qemu_st_a64_i32: | ||
1198 | + case INDEX_op_qemu_st_i64: | ||
1199 | + case INDEX_op_qemu_st_i32: | ||
1200 | return C_O0_I2(r, r); | ||
1201 | - case INDEX_op_qemu_ld_a32_i128: | ||
1202 | - case INDEX_op_qemu_ld_a64_i128: | ||
1203 | + case INDEX_op_qemu_ld_i128: | ||
1204 | return C_O2_I1(o, m, r); | ||
1205 | - case INDEX_op_qemu_st_a32_i128: | ||
1206 | - case INDEX_op_qemu_st_a64_i128: | ||
1207 | + case INDEX_op_qemu_st_i128: | ||
1208 | return C_O0_I3(o, m, r); | ||
1209 | |||
1210 | case INDEX_op_deposit_i32: | ||
1211 | diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc | ||
1212 | index XXXXXXX..XXXXXXX 100644 | ||
1213 | --- a/tcg/sparc64/tcg-target.c.inc | ||
1214 | +++ b/tcg/sparc64/tcg-target.c.inc | ||
1215 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
1216 | tcg_out_arithi(s, a1, a0, 32, SHIFT_SRLX); | ||
1217 | break; | ||
1218 | |||
1219 | - case INDEX_op_qemu_ld_a32_i32: | ||
1220 | - case INDEX_op_qemu_ld_a64_i32: | ||
1221 | + case INDEX_op_qemu_ld_i32: | ||
1222 | tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I32); | ||
1223 | break; | ||
1224 | - case INDEX_op_qemu_ld_a32_i64: | ||
1225 | - case INDEX_op_qemu_ld_a64_i64: | ||
1226 | + case INDEX_op_qemu_ld_i64: | ||
1227 | tcg_out_qemu_ld(s, a0, a1, a2, TCG_TYPE_I64); | ||
1228 | break; | ||
1229 | - case INDEX_op_qemu_st_a32_i32: | ||
1230 | - case INDEX_op_qemu_st_a64_i32: | ||
1231 | + case INDEX_op_qemu_st_i32: | ||
1232 | tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I32); | ||
1233 | break; | ||
1234 | - case INDEX_op_qemu_st_a32_i64: | ||
1235 | - case INDEX_op_qemu_st_a64_i64: | ||
1236 | + case INDEX_op_qemu_st_i64: | ||
1237 | tcg_out_qemu_st(s, a0, a1, a2, TCG_TYPE_I64); | ||
1238 | break; | ||
1239 | |||
1240 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
1241 | case INDEX_op_extu_i32_i64: | ||
1242 | case INDEX_op_extract_i64: | ||
1243 | case INDEX_op_sextract_i64: | ||
1244 | - case INDEX_op_qemu_ld_a32_i32: | ||
1245 | - case INDEX_op_qemu_ld_a64_i32: | ||
1246 | - case INDEX_op_qemu_ld_a32_i64: | ||
1247 | - case INDEX_op_qemu_ld_a64_i64: | ||
1248 | + case INDEX_op_qemu_ld_i32: | ||
1249 | + case INDEX_op_qemu_ld_i64: | ||
1250 | return C_O1_I1(r, r); | ||
1251 | |||
1252 | case INDEX_op_st8_i32: | ||
1253 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
1254 | case INDEX_op_st_i32: | ||
1255 | case INDEX_op_st32_i64: | ||
1256 | case INDEX_op_st_i64: | ||
1257 | - case INDEX_op_qemu_st_a32_i32: | ||
1258 | - case INDEX_op_qemu_st_a64_i32: | ||
1259 | - case INDEX_op_qemu_st_a32_i64: | ||
1260 | - case INDEX_op_qemu_st_a64_i64: | ||
1261 | + case INDEX_op_qemu_st_i32: | ||
1262 | + case INDEX_op_qemu_st_i64: | ||
1263 | return C_O0_I2(rZ, r); | ||
1264 | |||
1265 | case INDEX_op_add_i32: | ||
1266 | diff --git a/tcg/tci/tcg-target.c.inc b/tcg/tci/tcg-target.c.inc | ||
1267 | index XXXXXXX..XXXXXXX 100644 | ||
1268 | --- a/tcg/tci/tcg-target.c.inc | ||
1269 | +++ b/tcg/tci/tcg-target.c.inc | ||
1270 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
1271 | case INDEX_op_setcond2_i32: | ||
1272 | return C_O1_I4(r, r, r, r, r); | ||
1273 | |||
1274 | - case INDEX_op_qemu_ld_a32_i32: | ||
1275 | + case INDEX_op_qemu_ld_i32: | ||
1276 | return C_O1_I1(r, r); | ||
1277 | - case INDEX_op_qemu_ld_a64_i32: | ||
1278 | - return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O1_I2(r, r, r); | ||
1279 | - case INDEX_op_qemu_ld_a32_i64: | ||
1280 | + case INDEX_op_qemu_ld_i64: | ||
1281 | return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I1(r, r, r); | ||
1282 | - case INDEX_op_qemu_ld_a64_i64: | ||
1283 | - return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I2(r, r, r, r); | ||
1284 | - case INDEX_op_qemu_st_a32_i32: | ||
1285 | + case INDEX_op_qemu_st_i32: | ||
1286 | return C_O0_I2(r, r); | ||
1287 | - case INDEX_op_qemu_st_a64_i32: | ||
1288 | + case INDEX_op_qemu_st_i64: | ||
1289 | return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I3(r, r, r); | ||
1290 | - case INDEX_op_qemu_st_a32_i64: | ||
1291 | - return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I3(r, r, r); | ||
1292 | - case INDEX_op_qemu_st_a64_i64: | ||
1293 | - return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(r, r) : C_O0_I4(r, r, r, r); | ||
1294 | |||
1295 | default: | ||
1296 | return C_NotImplemented; | ||
1297 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op_rrrbb(TCGContext *s, TCGOpcode op, TCGReg r0, | ||
1298 | tcg_out32(s, insn); | ||
1299 | } | ||
1300 | |||
1301 | -static void tcg_out_op_rrrrr(TCGContext *s, TCGOpcode op, TCGReg r0, | ||
1302 | - TCGReg r1, TCGReg r2, TCGReg r3, TCGReg r4) | ||
1303 | -{ | ||
1304 | - tcg_insn_unit insn = 0; | ||
1305 | - | ||
1306 | - insn = deposit32(insn, 0, 8, op); | ||
1307 | - insn = deposit32(insn, 8, 4, r0); | ||
1308 | - insn = deposit32(insn, 12, 4, r1); | ||
1309 | - insn = deposit32(insn, 16, 4, r2); | ||
1310 | - insn = deposit32(insn, 20, 4, r3); | ||
1311 | - insn = deposit32(insn, 24, 4, r4); | ||
1312 | - tcg_out32(s, insn); | ||
1313 | -} | ||
1314 | - | ||
1315 | static void tcg_out_op_rrrr(TCGContext *s, TCGOpcode op, | ||
1316 | TCGReg r0, TCGReg r1, TCGReg r2, TCGReg r3) | ||
1317 | { | ||
1318 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
1319 | tcg_out_op_rrrr(s, opc, args[0], args[1], args[2], args[3]); | ||
1320 | break; | ||
1321 | |||
1322 | - case INDEX_op_qemu_ld_a32_i32: | ||
1323 | - case INDEX_op_qemu_st_a32_i32: | ||
1324 | - tcg_out_op_rrm(s, opc, args[0], args[1], args[2]); | ||
1325 | - break; | ||
1326 | - case INDEX_op_qemu_ld_a64_i32: | ||
1327 | - case INDEX_op_qemu_st_a64_i32: | ||
1328 | - case INDEX_op_qemu_ld_a32_i64: | ||
1329 | - case INDEX_op_qemu_st_a32_i64: | ||
1330 | - if (TCG_TARGET_REG_BITS == 64) { | ||
1331 | - tcg_out_op_rrm(s, opc, args[0], args[1], args[2]); | ||
1332 | - } else { | ||
1333 | + case INDEX_op_qemu_ld_i64: | ||
1334 | + case INDEX_op_qemu_st_i64: | ||
1335 | + if (TCG_TARGET_REG_BITS == 32) { | ||
1336 | tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_TMP, args[3]); | ||
1337 | tcg_out_op_rrrr(s, opc, args[0], args[1], args[2], TCG_REG_TMP); | ||
27 | + break; | 1338 | + break; |
28 | + case INDEX_op_brcond_i32: | 1339 | } |
29 | + case INDEX_op_brcond_i64: | 1340 | - break; |
30 | + op->args[3] = label_arg(to); | 1341 | - case INDEX_op_qemu_ld_a64_i64: |
31 | + break; | 1342 | - case INDEX_op_qemu_st_a64_i64: |
32 | + case INDEX_op_brcond2_i32: | 1343 | - if (TCG_TARGET_REG_BITS == 64) { |
33 | + op->args[5] = label_arg(to); | 1344 | - tcg_out_op_rrm(s, opc, args[0], args[1], args[2]); |
34 | + break; | 1345 | + /* fall through */ |
35 | + default: | 1346 | + case INDEX_op_qemu_ld_i32: |
36 | + g_assert_not_reached(); | 1347 | + case INDEX_op_qemu_st_i32: |
37 | + } | 1348 | + if (TCG_TARGET_REG_BITS == 64 && s->addr_type == TCG_TYPE_I32) { |
38 | + } | 1349 | + tcg_out_ext32u(s, TCG_REG_TMP, args[1]); |
39 | + | 1350 | + tcg_out_op_rrm(s, opc, args[0], TCG_REG_TMP, args[2]); |
40 | + QSIMPLEQ_CONCAT(&to->branches, &from->branches); | 1351 | } else { |
41 | +} | 1352 | - tcg_out_movi(s, TCG_TYPE_I32, TCG_REG_TMP, args[4]); |
42 | + | 1353 | - tcg_out_op_rrrrr(s, opc, args[0], args[1], |
43 | /* Reachable analysis : remove unreachable code. */ | 1354 | - args[2], args[3], TCG_REG_TMP); |
44 | static void __attribute__((noinline)) | 1355 | + tcg_out_op_rrm(s, opc, args[0], args[1], args[2]); |
45 | reachable_code_pass(TCGContext *s) | 1356 | } |
46 | @@ -XXX,XX +XXX,XX @@ reachable_code_pass(TCGContext *s) | 1357 | break; |
47 | case INDEX_op_set_label: | 1358 | |
48 | label = arg_label(op->args[0]); | ||
49 | |||
50 | + /* | ||
51 | + * Note that the first op in the TB is always a load, | ||
52 | + * so there is always something before a label. | ||
53 | + */ | ||
54 | + op_prev = QTAILQ_PREV(op, link); | ||
55 | + | ||
56 | + /* | ||
57 | + * If we find two sequential labels, move all branches to | ||
58 | + * reference the second label and remove the first label. | ||
59 | + * Do this before branch to next optimization, so that the | ||
60 | + * middle label is out of the way. | ||
61 | + */ | ||
62 | + if (op_prev->opc == INDEX_op_set_label) { | ||
63 | + move_label_uses(label, arg_label(op_prev->args[0])); | ||
64 | + tcg_op_remove(s, op_prev); | ||
65 | + op_prev = QTAILQ_PREV(op, link); | ||
66 | + } | ||
67 | + | ||
68 | /* | ||
69 | * Optimization can fold conditional branches to unconditional. | ||
70 | * If we find a label which is preceded by an unconditional | ||
71 | @@ -XXX,XX +XXX,XX @@ reachable_code_pass(TCGContext *s) | ||
72 | * processing the branch because any dead code between the branch | ||
73 | * and label had not yet been removed. | ||
74 | */ | ||
75 | - op_prev = QTAILQ_PREV(op, link); | ||
76 | if (op_prev->opc == INDEX_op_br && | ||
77 | label == arg_label(op_prev->args[0])) { | ||
78 | tcg_op_remove(s, op_prev); | ||
79 | -- | 1359 | -- |
80 | 2.34.1 | 1360 | 2.43.0 | diff view generated by jsdifflib |
1 | Translators are no longer required to free tcg temporaries. | 1 | The guest address will now always be TCG_TYPE_I32. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 4 | --- |
6 | target/arm/tcg/translate-a64.c | 468 +-------------------------------- | 5 | tcg/arm/tcg-target.c.inc | 63 ++++++++++++++-------------------------- |
7 | 1 file changed, 11 insertions(+), 457 deletions(-) | 6 | 1 file changed, 21 insertions(+), 42 deletions(-) |
8 | 7 | ||
9 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | 8 | diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc |
10 | index XXXXXXX..XXXXXXX 100644 | 9 | index XXXXXXX..XXXXXXX 100644 |
11 | --- a/target/arm/tcg/translate-a64.c | 10 | --- a/tcg/arm/tcg-target.c.inc |
12 | +++ b/target/arm/tcg/translate-a64.c | 11 | +++ b/tcg/arm/tcg-target.c.inc |
13 | @@ -XXX,XX +XXX,XX @@ static void write_fp_sreg(DisasContext *s, int reg, TCGv_i32 v) | 12 | @@ -XXX,XX +XXX,XX @@ static bool tcg_out_qemu_st_slow_path(TCGContext *s, TCGLabelQemuLdst *lb) |
14 | 13 | #define MIN_TLB_MASK_TABLE_OFS -256 | |
15 | tcg_gen_extu_i32_i64(tmp, v); | 14 | |
16 | write_fp_dreg(s, reg, tmp); | 15 | static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
17 | - tcg_temp_free_i64(tmp); | 16 | - TCGReg addrlo, TCGReg addrhi, |
18 | } | 17 | - MemOpIdx oi, bool is_ld) |
19 | 18 | + TCGReg addr, MemOpIdx oi, bool is_ld) | |
20 | /* Expand a 2-operand AdvSIMD vector operation using an expander function. */ | 19 | { |
21 | @@ -XXX,XX +XXX,XX @@ static void gen_gvec_op3_fpst(DisasContext *s, bool is_q, int rd, int rn, | 20 | TCGLabelQemuLdst *ldst = NULL; |
22 | vec_full_reg_offset(s, rn), | 21 | MemOp opc = get_memop(oi); |
23 | vec_full_reg_offset(s, rm), fpst, | 22 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
24 | is_q ? 16 : 8, vec_full_reg_size(s), data, fn); | 23 | if (tcg_use_softmmu) { |
25 | - tcg_temp_free_ptr(fpst); | 24 | *h = (HostAddress){ |
26 | } | 25 | .cond = COND_AL, |
27 | 26 | - .base = addrlo, | |
28 | /* Expand a 3-operand + qc + operation using an out-of-line helper. */ | 27 | + .base = addr, |
29 | @@ -XXX,XX +XXX,XX @@ static void gen_gvec_op3_qc(DisasContext *s, bool is_q, int rd, int rn, | 28 | .index = TCG_REG_R1, |
30 | vec_full_reg_offset(s, rn), | 29 | .index_scratch = true, |
31 | vec_full_reg_offset(s, rm), qc_ptr, | 30 | }; |
32 | is_q ? 16 : 8, vec_full_reg_size(s), 0, fn); | ||
33 | - tcg_temp_free_ptr(qc_ptr); | ||
34 | } | ||
35 | |||
36 | /* Expand a 4-operand operation using an out-of-line helper. */ | ||
37 | @@ -XXX,XX +XXX,XX @@ static void gen_gvec_op4_fpst(DisasContext *s, bool is_q, int rd, int rn, | ||
38 | vec_full_reg_offset(s, rm), | ||
39 | vec_full_reg_offset(s, ra), fpst, | ||
40 | is_q ? 16 : 8, vec_full_reg_size(s), data, fn); | ||
41 | - tcg_temp_free_ptr(fpst); | ||
42 | } | ||
43 | |||
44 | /* Set ZF and NF based on a 64 bit result. This is alas fiddlier | ||
45 | @@ -XXX,XX +XXX,XX @@ static void gen_add_CC(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1) | ||
46 | tcg_gen_xor_i64(flag, result, t0); | ||
47 | tcg_gen_xor_i64(tmp, t0, t1); | ||
48 | tcg_gen_andc_i64(flag, flag, tmp); | ||
49 | - tcg_temp_free_i64(tmp); | ||
50 | tcg_gen_extrh_i64_i32(cpu_VF, flag); | ||
51 | |||
52 | tcg_gen_mov_i64(dest, result); | ||
53 | - tcg_temp_free_i64(result); | ||
54 | - tcg_temp_free_i64(flag); | ||
55 | } else { | 31 | } else { |
56 | /* 32 bit arithmetic */ | 32 | *h = (HostAddress){ |
57 | TCGv_i32 t0_32 = tcg_temp_new_i32(); | 33 | .cond = COND_AL, |
58 | @@ -XXX,XX +XXX,XX @@ static void gen_add_CC(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1) | 34 | - .base = addrlo, |
59 | tcg_gen_xor_i32(tmp, t0_32, t1_32); | 35 | + .base = addr, |
60 | tcg_gen_andc_i32(cpu_VF, cpu_VF, tmp); | 36 | .index = guest_base ? TCG_REG_GUEST_BASE : -1, |
61 | tcg_gen_extu_i32_i64(dest, cpu_NF); | 37 | .index_scratch = false, |
62 | - | 38 | }; |
63 | - tcg_temp_free_i32(tmp); | 39 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
64 | - tcg_temp_free_i32(t0_32); | 40 | ldst = new_ldst_label(s); |
65 | - tcg_temp_free_i32(t1_32); | 41 | ldst->is_ld = is_ld; |
66 | } | 42 | ldst->oi = oi; |
67 | } | 43 | - ldst->addrlo_reg = addrlo; |
68 | 44 | - ldst->addrhi_reg = addrhi; | |
69 | @@ -XXX,XX +XXX,XX @@ static void gen_sub_CC(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1) | 45 | + ldst->addrlo_reg = addr; |
70 | tmp = tcg_temp_new_i64(); | 46 | |
71 | tcg_gen_xor_i64(tmp, t0, t1); | 47 | /* Load cpu->neg.tlb.f[mmu_idx].{mask,table} into {r0,r1}. */ |
72 | tcg_gen_and_i64(flag, flag, tmp); | 48 | QEMU_BUILD_BUG_ON(offsetof(CPUTLBDescFast, mask) != 0); |
73 | - tcg_temp_free_i64(tmp); | 49 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
74 | tcg_gen_extrh_i64_i32(cpu_VF, flag); | 50 | tcg_out_ldrd_8(s, COND_AL, TCG_REG_R0, TCG_AREG0, fast_off); |
75 | tcg_gen_mov_i64(dest, result); | 51 | |
76 | - tcg_temp_free_i64(flag); | 52 | /* Extract the tlb index from the address into R0. */ |
77 | - tcg_temp_free_i64(result); | 53 | - tcg_out_dat_reg(s, COND_AL, ARITH_AND, TCG_REG_R0, TCG_REG_R0, addrlo, |
78 | } else { | 54 | + tcg_out_dat_reg(s, COND_AL, ARITH_AND, TCG_REG_R0, TCG_REG_R0, addr, |
79 | /* 32 bit arithmetic */ | 55 | SHIFT_IMM_LSR(s->page_bits - CPU_TLB_ENTRY_BITS)); |
80 | TCGv_i32 t0_32 = tcg_temp_new_i32(); | 56 | |
81 | @@ -XXX,XX +XXX,XX @@ static void gen_sub_CC(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1) | 57 | /* |
82 | tcg_gen_xor_i32(cpu_VF, cpu_NF, t0_32); | 58 | * Add the tlb_table pointer, creating the CPUTLBEntry address in R1. |
83 | tmp = tcg_temp_new_i32(); | 59 | - * Load the tlb comparator into R2/R3 and the fast path addend into R1. |
84 | tcg_gen_xor_i32(tmp, t0_32, t1_32); | 60 | + * Load the tlb comparator into R2 and the fast path addend into R1. |
85 | - tcg_temp_free_i32(t0_32); | 61 | */ |
86 | - tcg_temp_free_i32(t1_32); | 62 | QEMU_BUILD_BUG_ON(HOST_BIG_ENDIAN); |
87 | tcg_gen_and_i32(cpu_VF, cpu_VF, tmp); | 63 | if (cmp_off == 0) { |
88 | - tcg_temp_free_i32(tmp); | 64 | - if (s->addr_type == TCG_TYPE_I32) { |
89 | tcg_gen_extu_i32_i64(dest, cpu_NF); | 65 | - tcg_out_ld32_rwb(s, COND_AL, TCG_REG_R2, |
90 | } | 66 | - TCG_REG_R1, TCG_REG_R0); |
91 | } | 67 | - } else { |
92 | @@ -XXX,XX +XXX,XX @@ static void gen_adc(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1) | 68 | - tcg_out_ldrd_rwb(s, COND_AL, TCG_REG_R2, |
93 | tcg_gen_extu_i32_i64(flag, cpu_CF); | 69 | - TCG_REG_R1, TCG_REG_R0); |
94 | tcg_gen_add_i64(dest, t0, t1); | 70 | - } |
95 | tcg_gen_add_i64(dest, dest, flag); | 71 | + tcg_out_ld32_rwb(s, COND_AL, TCG_REG_R2, TCG_REG_R1, TCG_REG_R0); |
96 | - tcg_temp_free_i64(flag); | ||
97 | |||
98 | if (!sf) { | ||
99 | tcg_gen_ext32u_i64(dest, dest); | ||
100 | @@ -XXX,XX +XXX,XX @@ static void gen_adc_CC(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1) | ||
101 | tcg_gen_extrh_i64_i32(cpu_VF, vf_64); | ||
102 | |||
103 | tcg_gen_mov_i64(dest, result); | ||
104 | - | ||
105 | - tcg_temp_free_i64(tmp); | ||
106 | - tcg_temp_free_i64(vf_64); | ||
107 | - tcg_temp_free_i64(cf_64); | ||
108 | - tcg_temp_free_i64(result); | ||
109 | } else { | ||
110 | TCGv_i32 t0_32 = tcg_temp_new_i32(); | ||
111 | TCGv_i32 t1_32 = tcg_temp_new_i32(); | ||
112 | @@ -XXX,XX +XXX,XX @@ static void gen_adc_CC(int sf, TCGv_i64 dest, TCGv_i64 t0, TCGv_i64 t1) | ||
113 | tcg_gen_xor_i32(tmp, t0_32, t1_32); | ||
114 | tcg_gen_andc_i32(cpu_VF, cpu_VF, tmp); | ||
115 | tcg_gen_extu_i32_i64(dest, cpu_NF); | ||
116 | - | ||
117 | - tcg_temp_free_i32(tmp); | ||
118 | - tcg_temp_free_i32(t1_32); | ||
119 | - tcg_temp_free_i32(t0_32); | ||
120 | } | ||
121 | } | ||
122 | |||
123 | @@ -XXX,XX +XXX,XX @@ static void do_fp_st(DisasContext *s, int srcidx, TCGv_i64 tcg_addr, int size) | ||
124 | tcg_gen_addi_i64(tcg_hiaddr, tcg_addr, 8); | ||
125 | tcg_gen_qemu_st_i64(be ? tmplo : tmphi, tcg_hiaddr, | ||
126 | get_mem_index(s), mop); | ||
127 | - | ||
128 | - tcg_temp_free_i64(tcg_hiaddr); | ||
129 | - tcg_temp_free_i64(tmphi); | ||
130 | } | ||
131 | - | ||
132 | - tcg_temp_free_i64(tmplo); | ||
133 | } | ||
134 | |||
135 | /* | ||
136 | @@ -XXX,XX +XXX,XX @@ static void do_fp_ld(DisasContext *s, int destidx, TCGv_i64 tcg_addr, int size) | ||
137 | tcg_gen_addi_i64(tcg_hiaddr, tcg_addr, 8); | ||
138 | tcg_gen_qemu_ld_i64(be ? tmplo : tmphi, tcg_hiaddr, | ||
139 | get_mem_index(s), mop); | ||
140 | - tcg_temp_free_i64(tcg_hiaddr); | ||
141 | } | ||
142 | |||
143 | tcg_gen_st_i64(tmplo, cpu_env, fp_reg_offset(s, destidx, MO_64)); | ||
144 | - tcg_temp_free_i64(tmplo); | ||
145 | |||
146 | if (tmphi) { | ||
147 | tcg_gen_st_i64(tmphi, cpu_env, fp_reg_hi_offset(s, destidx)); | ||
148 | - tcg_temp_free_i64(tmphi); | ||
149 | } | ||
150 | clear_vec_high(s, tmphi != NULL, destidx); | ||
151 | } | ||
152 | @@ -XXX,XX +XXX,XX @@ static void do_vec_st(DisasContext *s, int srcidx, int element, | ||
153 | |||
154 | read_vec_element(s, tcg_tmp, srcidx, element, mop & MO_SIZE); | ||
155 | tcg_gen_qemu_st_i64(tcg_tmp, tcg_addr, get_mem_index(s), mop); | ||
156 | - | ||
157 | - tcg_temp_free_i64(tcg_tmp); | ||
158 | } | ||
159 | |||
160 | /* Load from memory to vector register */ | ||
161 | @@ -XXX,XX +XXX,XX @@ static void do_vec_ld(DisasContext *s, int destidx, int element, | ||
162 | |||
163 | tcg_gen_qemu_ld_i64(tcg_tmp, tcg_addr, get_mem_index(s), mop); | ||
164 | write_vec_element(s, tcg_tmp, destidx, element, mop & MO_SIZE); | ||
165 | - | ||
166 | - tcg_temp_free_i64(tcg_tmp); | ||
167 | } | ||
168 | |||
169 | /* Check that FP/Neon access is enabled. If it is, return | ||
170 | @@ -XXX,XX +XXX,XX @@ static void disas_test_b_imm(DisasContext *s, uint32_t insn) | ||
171 | match = gen_disas_label(s); | ||
172 | tcg_gen_brcondi_i64(op ? TCG_COND_NE : TCG_COND_EQ, | ||
173 | tcg_cmp, 0, match.label); | ||
174 | - tcg_temp_free_i64(tcg_cmp); | ||
175 | gen_goto_tb(s, 0, 4); | ||
176 | set_disas_label(s, match); | ||
177 | gen_goto_tb(s, 1, diff); | ||
178 | @@ -XXX,XX +XXX,XX @@ static void gen_xaflag(void) | ||
179 | |||
180 | /* C | Z */ | ||
181 | tcg_gen_or_i32(cpu_CF, cpu_CF, z); | ||
182 | - | ||
183 | - tcg_temp_free_i32(z); | ||
184 | } | ||
185 | |||
186 | static void gen_axflag(void) | ||
187 | @@ -XXX,XX +XXX,XX @@ static void gen_get_nzcv(TCGv_i64 tcg_rt) | ||
188 | tcg_gen_deposit_i32(nzcv, nzcv, tmp, 28, 1); | ||
189 | /* generate result */ | ||
190 | tcg_gen_extu_i32_i64(tcg_rt, nzcv); | ||
191 | - | ||
192 | - tcg_temp_free_i32(nzcv); | ||
193 | - tcg_temp_free_i32(tmp); | ||
194 | } | ||
195 | |||
196 | static void gen_set_nzcv(TCGv_i64 tcg_rt) | ||
197 | @@ -XXX,XX +XXX,XX @@ static void gen_set_nzcv(TCGv_i64 tcg_rt) | ||
198 | /* bit 28, V */ | ||
199 | tcg_gen_andi_i32(cpu_VF, nzcv, (1 << 28)); | ||
200 | tcg_gen_shli_i32(cpu_VF, cpu_VF, 3); | ||
201 | - tcg_temp_free_i32(nzcv); | ||
202 | } | ||
203 | |||
204 | static void gen_sysreg_undef(DisasContext *s, bool isread, | ||
205 | @@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread, | ||
206 | case 0: | ||
207 | break; | ||
208 | case ARM_CP_NOP: | ||
209 | - goto exit; | ||
210 | + return; | ||
211 | case ARM_CP_NZCV: | ||
212 | tcg_rt = cpu_reg(s, rt); | ||
213 | if (isread) { | ||
214 | @@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread, | ||
215 | } else { | 72 | } else { |
216 | gen_set_nzcv(tcg_rt); | 73 | tcg_out_dat_reg(s, COND_AL, ARITH_ADD, |
74 | TCG_REG_R1, TCG_REG_R1, TCG_REG_R0, 0); | ||
75 | - if (s->addr_type == TCG_TYPE_I32) { | ||
76 | - tcg_out_ld32_12(s, COND_AL, TCG_REG_R2, TCG_REG_R1, cmp_off); | ||
77 | - } else { | ||
78 | - tcg_out_ldrd_8(s, COND_AL, TCG_REG_R2, TCG_REG_R1, cmp_off); | ||
79 | - } | ||
80 | + tcg_out_ld32_12(s, COND_AL, TCG_REG_R2, TCG_REG_R1, cmp_off); | ||
217 | } | 81 | } |
218 | - goto exit; | 82 | |
219 | + return; | 83 | /* Load the tlb addend. */ |
220 | case ARM_CP_CURRENTEL: | 84 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
221 | /* Reads as current EL value from pstate, which is | 85 | * This leaves the least significant alignment bits unchanged, and of |
222 | * guaranteed to be constant by the tb flags. | 86 | * course must be zero. |
223 | */ | 87 | */ |
224 | tcg_rt = cpu_reg(s, rt); | 88 | - t_addr = addrlo; |
225 | tcg_gen_movi_i64(tcg_rt, s->current_el << 2); | 89 | + t_addr = addr; |
226 | - goto exit; | 90 | if (a_mask < s_mask) { |
227 | + return; | 91 | t_addr = TCG_REG_R0; |
228 | case ARM_CP_DC_ZVA: | 92 | tcg_out_dat_imm(s, COND_AL, ARITH_ADD, t_addr, |
229 | /* Writes clear the aligned block of memory which rt points into. */ | 93 | - addrlo, s_mask - a_mask); |
230 | if (s->mte_active[0]) { | 94 | + addr, s_mask - a_mask); |
231 | @@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread, | ||
232 | tcg_rt = clean_data_tbi(s, cpu_reg(s, rt)); | ||
233 | } | 95 | } |
234 | gen_helper_dc_zva(cpu_env, tcg_rt); | 96 | if (use_armv7_instructions && s->page_bits <= 16) { |
235 | - goto exit; | 97 | tcg_out_movi32(s, COND_AL, TCG_REG_TMP, ~(s->page_mask | a_mask)); |
236 | + return; | 98 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
237 | case ARM_CP_DC_GVA: | 99 | } else { |
238 | { | 100 | if (a_mask) { |
239 | TCGv_i64 clean_addr, tag; | 101 | tcg_debug_assert(a_mask <= 0xff); |
240 | @@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread, | 102 | - tcg_out_dat_imm(s, COND_AL, ARITH_TST, 0, addrlo, a_mask); |
241 | tag = tcg_temp_new_i64(); | 103 | + tcg_out_dat_imm(s, COND_AL, ARITH_TST, 0, addr, a_mask); |
242 | tcg_gen_shri_i64(tag, tcg_rt, 56); | ||
243 | gen_helper_stzgm_tags(cpu_env, clean_addr, tag); | ||
244 | - tcg_temp_free_i64(tag); | ||
245 | } | 104 | } |
246 | } | 105 | tcg_out_dat_reg(s, COND_AL, ARITH_MOV, TCG_REG_TMP, 0, t_addr, |
247 | - goto exit; | 106 | SHIFT_IMM_LSR(s->page_bits)); |
248 | + return; | 107 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
249 | case ARM_CP_DC_GZVA: | 108 | 0, TCG_REG_R2, TCG_REG_TMP, |
250 | { | 109 | SHIFT_IMM_LSL(s->page_bits)); |
251 | TCGv_i64 clean_addr, tag; | ||
252 | @@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread, | ||
253 | tag = tcg_temp_new_i64(); | ||
254 | tcg_gen_shri_i64(tag, tcg_rt, 56); | ||
255 | gen_helper_stzgm_tags(cpu_env, clean_addr, tag); | ||
256 | - tcg_temp_free_i64(tag); | ||
257 | } | ||
258 | } | ||
259 | - goto exit; | ||
260 | + return; | ||
261 | default: | ||
262 | g_assert_not_reached(); | ||
263 | } | ||
264 | if ((ri->type & ARM_CP_FPU) && !fp_access_check_only(s)) { | ||
265 | - goto exit; | ||
266 | + return; | ||
267 | } else if ((ri->type & ARM_CP_SVE) && !sve_access_check(s)) { | ||
268 | - goto exit; | ||
269 | + return; | ||
270 | } else if ((ri->type & ARM_CP_SME) && !sme_access_check(s)) { | ||
271 | - goto exit; | ||
272 | + return; | ||
273 | } | ||
274 | |||
275 | if ((tb_cflags(s->base.tb) & CF_USE_ICOUNT) && (ri->type & ARM_CP_IO)) { | ||
276 | @@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread, | ||
277 | } else { | ||
278 | if (ri->type & ARM_CP_CONST) { | ||
279 | /* If not forbidden by access permissions, treat as WI */ | ||
280 | - goto exit; | ||
281 | + return; | ||
282 | } else if (ri->writefn) { | ||
283 | if (!tcg_ri) { | ||
284 | tcg_ri = gen_lookup_cp_reg(key); | ||
285 | @@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread, | ||
286 | */ | ||
287 | s->base.is_jmp = DISAS_UPDATE_EXIT; | ||
288 | } | ||
289 | - | ||
290 | - exit: | ||
291 | - if (tcg_ri) { | ||
292 | - tcg_temp_free_ptr(tcg_ri); | ||
293 | - } | ||
294 | } | ||
295 | |||
296 | /* System | ||
297 | @@ -XXX,XX +XXX,XX @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) | ||
298 | } | ||
299 | |||
300 | gen_helper_exception_return(cpu_env, dst); | ||
301 | - tcg_temp_free_i64(dst); | ||
302 | /* Must exit loop to check un-masked IRQs */ | ||
303 | s->base.is_jmp = DISAS_EXIT; | ||
304 | return; | ||
305 | @@ -XXX,XX +XXX,XX @@ static void gen_load_exclusive(DisasContext *s, int rt, int rt2, | ||
306 | TCGv_i64 addr2 = tcg_temp_new_i64(); | ||
307 | tcg_gen_addi_i64(addr2, addr, 8); | ||
308 | tcg_gen_qemu_ld_i64(cpu_exclusive_high, addr2, idx, memop); | ||
309 | - tcg_temp_free_i64(addr2); | ||
310 | |||
311 | tcg_gen_mov_i64(cpu_reg(s, rt), cpu_exclusive_val); | ||
312 | tcg_gen_mov_i64(cpu_reg(s, rt2), cpu_exclusive_high); | ||
313 | @@ -XXX,XX +XXX,XX @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2, | ||
314 | tcg_gen_atomic_cmpxchg_i128(t16, cpu_exclusive_addr, c16, t16, | ||
315 | get_mem_index(s), | ||
316 | MO_128 | MO_ALIGN | s->be_data); | ||
317 | - tcg_temp_free_i128(c16); | ||
318 | |||
319 | a = tcg_temp_new_i64(); | ||
320 | b = tcg_temp_new_i64(); | ||
321 | @@ -XXX,XX +XXX,XX @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2, | ||
322 | tcg_gen_xor_i64(a, a, cpu_exclusive_val); | ||
323 | tcg_gen_xor_i64(b, b, cpu_exclusive_high); | ||
324 | tcg_gen_or_i64(tmp, a, b); | ||
325 | - tcg_temp_free_i64(a); | ||
326 | - tcg_temp_free_i64(b); | ||
327 | - tcg_temp_free_i128(t16); | ||
328 | |||
329 | tcg_gen_setcondi_i64(TCG_COND_NE, tmp, tmp, 0); | ||
330 | } | ||
331 | @@ -XXX,XX +XXX,XX @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2, | ||
332 | tcg_gen_setcond_i64(TCG_COND_NE, tmp, tmp, cpu_exclusive_val); | ||
333 | } | ||
334 | tcg_gen_mov_i64(cpu_reg(s, rd), tmp); | ||
335 | - tcg_temp_free_i64(tmp); | ||
336 | tcg_gen_br(done_label); | ||
337 | |||
338 | gen_set_label(fail_label); | ||
339 | @@ -XXX,XX +XXX,XX @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt, | ||
340 | |||
341 | tcg_gen_atomic_cmpxchg_i64(cmp, clean_addr, cmp, val, memidx, | ||
342 | MO_64 | MO_ALIGN | s->be_data); | ||
343 | - tcg_temp_free_i64(val); | ||
344 | |||
345 | if (s->be_data == MO_LE) { | ||
346 | tcg_gen_extr32_i64(s1, s2, cmp); | ||
347 | } else { | ||
348 | tcg_gen_extr32_i64(s2, s1, cmp); | ||
349 | } | ||
350 | - tcg_temp_free_i64(cmp); | ||
351 | } else { | ||
352 | TCGv_i128 cmp = tcg_temp_new_i128(); | ||
353 | TCGv_i128 val = tcg_temp_new_i128(); | ||
354 | @@ -XXX,XX +XXX,XX @@ static void gen_compare_and_swap_pair(DisasContext *s, int rs, int rt, | ||
355 | |||
356 | tcg_gen_atomic_cmpxchg_i128(cmp, clean_addr, cmp, val, memidx, | ||
357 | MO_128 | MO_ALIGN | s->be_data); | ||
358 | - tcg_temp_free_i128(val); | ||
359 | |||
360 | if (s->be_data == MO_LE) { | ||
361 | tcg_gen_extr_i128_i64(s1, s2, cmp); | ||
362 | } else { | ||
363 | tcg_gen_extr_i128_i64(s2, s1, cmp); | ||
364 | } | ||
365 | - tcg_temp_free_i128(cmp); | ||
366 | } | ||
367 | } | ||
368 | |||
369 | @@ -XXX,XX +XXX,XX @@ static void disas_ldst_pair(DisasContext *s, uint32_t insn) | ||
370 | false, false, 0, false, false); | ||
371 | |||
372 | tcg_gen_mov_i64(tcg_rt, tmp); | ||
373 | - tcg_temp_free_i64(tmp); | ||
374 | } else { | ||
375 | do_gpr_st(s, tcg_rt, clean_addr, size, | ||
376 | false, 0, false, false); | ||
377 | @@ -XXX,XX +XXX,XX @@ static void disas_ldst_single_struct(DisasContext *s, uint32_t insn) | ||
378 | tcg_gen_gvec_dup_i64(scale, vec_full_reg_offset(s, rt), | ||
379 | (is_q + 1) * 8, vec_full_reg_size(s), | ||
380 | tcg_tmp); | ||
381 | - tcg_temp_free_i64(tcg_tmp); | ||
382 | } else { | ||
383 | /* Load/store one element per register */ | ||
384 | if (is_load) { | ||
385 | @@ -XXX,XX +XXX,XX @@ static void disas_add_sub_imm(DisasContext *s, uint32_t insn) | ||
386 | } else { | ||
387 | tcg_gen_ext32u_i64(tcg_rd, tcg_result); | ||
388 | } | ||
389 | - | ||
390 | - tcg_temp_free_i64(tcg_result); | ||
391 | } | ||
392 | |||
393 | /* | ||
394 | @@ -XXX,XX +XXX,XX @@ static void disas_extract(DisasContext *s, uint32_t insn) | ||
395 | TCGv_i32 t1 = tcg_temp_new_i32(); | ||
396 | tcg_gen_extrl_i64_i32(t1, tcg_rn); | ||
397 | tcg_gen_extract2_i32(t0, t0, t1, imm); | ||
398 | - tcg_temp_free_i32(t1); | ||
399 | } | ||
400 | tcg_gen_extu_i32_i64(tcg_rd, t0); | ||
401 | - tcg_temp_free_i32(t0); | ||
402 | } | ||
403 | } | ||
404 | } | ||
405 | @@ -XXX,XX +XXX,XX @@ static void shift_reg(TCGv_i64 dst, TCGv_i64 src, int sf, | ||
406 | tcg_gen_extrl_i64_i32(t1, shift_amount); | ||
407 | tcg_gen_rotr_i32(t0, t0, t1); | ||
408 | tcg_gen_extu_i32_i64(dst, t0); | ||
409 | - tcg_temp_free_i32(t0); | ||
410 | - tcg_temp_free_i32(t1); | ||
411 | } | ||
412 | break; | ||
413 | default: | ||
414 | @@ -XXX,XX +XXX,XX @@ static void disas_add_sub_ext_reg(DisasContext *s, uint32_t insn) | ||
415 | } else { | ||
416 | tcg_gen_ext32u_i64(tcg_rd, tcg_result); | ||
417 | } | ||
418 | - | ||
419 | - tcg_temp_free_i64(tcg_result); | ||
420 | } | ||
421 | |||
422 | /* | ||
423 | @@ -XXX,XX +XXX,XX @@ static void disas_add_sub_reg(DisasContext *s, uint32_t insn) | ||
424 | } else { | ||
425 | tcg_gen_ext32u_i64(tcg_rd, tcg_result); | ||
426 | } | ||
427 | - | ||
428 | - tcg_temp_free_i64(tcg_result); | ||
429 | } | ||
430 | |||
431 | /* Data-processing (3 source) | ||
432 | @@ -XXX,XX +XXX,XX @@ static void disas_data_proc_3src(DisasContext *s, uint32_t insn) | ||
433 | } else { | ||
434 | tcg_gen_mulu2_i64(low_bits, tcg_rd, tcg_rn, tcg_rm); | ||
435 | } | 110 | } |
436 | - | 111 | - |
437 | - tcg_temp_free_i64(low_bits); | 112 | - if (s->addr_type != TCG_TYPE_I32) { |
438 | return; | 113 | - tcg_out_dat_reg(s, COND_EQ, ARITH_CMP, 0, TCG_REG_R3, addrhi, 0); |
114 | - } | ||
115 | } else if (a_mask) { | ||
116 | ldst = new_ldst_label(s); | ||
117 | ldst->is_ld = is_ld; | ||
118 | ldst->oi = oi; | ||
119 | - ldst->addrlo_reg = addrlo; | ||
120 | - ldst->addrhi_reg = addrhi; | ||
121 | + ldst->addrlo_reg = addr; | ||
122 | |||
123 | /* We are expecting alignment to max out at 7 */ | ||
124 | tcg_debug_assert(a_mask <= 0xff); | ||
125 | /* tst addr, #mask */ | ||
126 | - tcg_out_dat_imm(s, COND_AL, ARITH_TST, 0, addrlo, a_mask); | ||
127 | + tcg_out_dat_imm(s, COND_AL, ARITH_TST, 0, addr, a_mask); | ||
439 | } | 128 | } |
440 | 129 | ||
441 | @@ -XXX,XX +XXX,XX @@ static void disas_data_proc_3src(DisasContext *s, uint32_t insn) | 130 | return ldst; |
442 | if (!sf) { | 131 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_ld_direct(TCGContext *s, MemOp opc, TCGReg datalo, |
443 | tcg_gen_ext32u_i64(cpu_reg(s, rd), cpu_reg(s, rd)); | ||
444 | } | ||
445 | - | ||
446 | - tcg_temp_free_i64(tcg_op1); | ||
447 | - tcg_temp_free_i64(tcg_op2); | ||
448 | - tcg_temp_free_i64(tcg_tmp); | ||
449 | } | 132 | } |
450 | 133 | ||
451 | /* Add/subtract (with carry) | 134 | static void tcg_out_qemu_ld(TCGContext *s, TCGReg datalo, TCGReg datahi, |
452 | @@ -XXX,XX +XXX,XX @@ static void disas_rotate_right_into_flags(DisasContext *s, uint32_t insn) | 135 | - TCGReg addrlo, TCGReg addrhi, |
453 | if (mask & 1) { /* V */ | 136 | - MemOpIdx oi, TCGType data_type) |
454 | tcg_gen_shli_i32(cpu_VF, nzcv, 31 - 0); | 137 | + TCGReg addr, MemOpIdx oi, TCGType data_type) |
455 | } | 138 | { |
456 | - | 139 | MemOp opc = get_memop(oi); |
457 | - tcg_temp_free_i32(nzcv); | 140 | TCGLabelQemuLdst *ldst; |
141 | HostAddress h; | ||
142 | |||
143 | - ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, true); | ||
144 | + ldst = prepare_host_addr(s, &h, addr, oi, true); | ||
145 | if (ldst) { | ||
146 | ldst->type = data_type; | ||
147 | ldst->datalo_reg = datalo; | ||
148 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_st_direct(TCGContext *s, MemOp opc, TCGReg datalo, | ||
458 | } | 149 | } |
459 | 150 | ||
460 | /* | 151 | static void tcg_out_qemu_st(TCGContext *s, TCGReg datalo, TCGReg datahi, |
461 | @@ -XXX,XX +XXX,XX @@ static void disas_evaluate_into_flags(DisasContext *s, uint32_t insn) | 152 | - TCGReg addrlo, TCGReg addrhi, |
462 | tcg_gen_shli_i32(cpu_VF, tmp, shift - 1); | 153 | - MemOpIdx oi, TCGType data_type) |
463 | tcg_gen_mov_i32(cpu_ZF, cpu_NF); | 154 | + TCGReg addr, MemOpIdx oi, TCGType data_type) |
464 | tcg_gen_xor_i32(cpu_VF, cpu_VF, cpu_NF); | 155 | { |
465 | - tcg_temp_free_i32(tmp); | 156 | MemOp opc = get_memop(oi); |
466 | } | 157 | TCGLabelQemuLdst *ldst; |
467 | 158 | HostAddress h; | |
468 | /* Conditional compare (immediate / register) | 159 | |
469 | @@ -XXX,XX +XXX,XX @@ static void disas_cc(DisasContext *s, uint32_t insn) | 160 | - ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, false); |
470 | } else { | 161 | + ldst = prepare_host_addr(s, &h, addr, oi, false); |
471 | gen_add_CC(sf, tcg_tmp, tcg_rn, tcg_y); | 162 | if (ldst) { |
472 | } | 163 | ldst->type = data_type; |
473 | - tcg_temp_free_i64(tcg_tmp); | 164 | ldst->datalo_reg = datalo; |
474 | 165 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | |
475 | /* If COND was false, force the flags to #nzcv. Compute two masks | ||
476 | * to help with this: T1 = (COND ? 0 : -1), T2 = (COND ? -1 : 0). | ||
477 | @@ -XXX,XX +XXX,XX @@ static void disas_cc(DisasContext *s, uint32_t insn) | ||
478 | tcg_gen_and_i32(cpu_VF, cpu_VF, tcg_t2); | ||
479 | } | ||
480 | } | ||
481 | - tcg_temp_free_i32(tcg_t0); | ||
482 | - tcg_temp_free_i32(tcg_t1); | ||
483 | - tcg_temp_free_i32(tcg_t2); | ||
484 | } | ||
485 | |||
486 | /* Conditional select | ||
487 | @@ -XXX,XX +XXX,XX @@ static void handle_clz(DisasContext *s, unsigned int sf, | ||
488 | tcg_gen_extrl_i64_i32(tcg_tmp32, tcg_rn); | ||
489 | tcg_gen_clzi_i32(tcg_tmp32, tcg_tmp32, 32); | ||
490 | tcg_gen_extu_i32_i64(tcg_rd, tcg_tmp32); | ||
491 | - tcg_temp_free_i32(tcg_tmp32); | ||
492 | } | ||
493 | } | ||
494 | |||
495 | @@ -XXX,XX +XXX,XX @@ static void handle_cls(DisasContext *s, unsigned int sf, | ||
496 | tcg_gen_extrl_i64_i32(tcg_tmp32, tcg_rn); | ||
497 | tcg_gen_clrsb_i32(tcg_tmp32, tcg_tmp32); | ||
498 | tcg_gen_extu_i32_i64(tcg_rd, tcg_tmp32); | ||
499 | - tcg_temp_free_i32(tcg_tmp32); | ||
500 | } | ||
501 | } | ||
502 | |||
503 | @@ -XXX,XX +XXX,XX @@ static void handle_rbit(DisasContext *s, unsigned int sf, | ||
504 | tcg_gen_extrl_i64_i32(tcg_tmp32, tcg_rn); | ||
505 | gen_helper_rbit(tcg_tmp32, tcg_tmp32); | ||
506 | tcg_gen_extu_i32_i64(tcg_rd, tcg_tmp32); | ||
507 | - tcg_temp_free_i32(tcg_tmp32); | ||
508 | } | ||
509 | } | ||
510 | |||
511 | @@ -XXX,XX +XXX,XX @@ static void handle_rev16(DisasContext *s, unsigned int sf, | ||
512 | tcg_gen_and_i64(tcg_tmp, tcg_tmp, mask); | ||
513 | tcg_gen_shli_i64(tcg_rd, tcg_rd, 8); | ||
514 | tcg_gen_or_i64(tcg_rd, tcg_rd, tcg_tmp); | ||
515 | - | ||
516 | - tcg_temp_free_i64(tcg_tmp); | ||
517 | } | ||
518 | |||
519 | /* Data-processing (1 source) | ||
520 | @@ -XXX,XX +XXX,XX @@ static void handle_shift_reg(DisasContext *s, | ||
521 | |||
522 | tcg_gen_andi_i64(tcg_shift, cpu_reg(s, rm), sf ? 63 : 31); | ||
523 | shift_reg(tcg_rd, tcg_rn, sf, shift_type, tcg_shift); | ||
524 | - tcg_temp_free_i64(tcg_shift); | ||
525 | } | ||
526 | |||
527 | /* CRC32[BHWX], CRC32C[BHWX] */ | ||
528 | @@ -XXX,XX +XXX,XX @@ static void disas_data_proc_2src(DisasContext *s, uint32_t insn) | ||
529 | tcg_gen_extract_i64(t, cpu_reg_sp(s, rn), 56, 4); | ||
530 | tcg_gen_shl_i64(t, tcg_constant_i64(1), t); | ||
531 | tcg_gen_or_i64(cpu_reg(s, rd), cpu_reg(s, rm), t); | ||
532 | - | ||
533 | - tcg_temp_free_i64(t); | ||
534 | } | ||
535 | break; | 166 | break; |
536 | case 8: /* LSLV */ | 167 | |
537 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_compare(DisasContext *s, int size, | 168 | case INDEX_op_qemu_ld_i32: |
538 | } else { | 169 | - tcg_out_qemu_ld(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32); |
539 | gen_helper_vfp_cmpd_a64(tcg_flags, tcg_vn, tcg_vm, fpst); | 170 | + tcg_out_qemu_ld(s, args[0], -1, args[1], args[2], TCG_TYPE_I32); |
540 | } | ||
541 | - tcg_temp_free_i64(tcg_vn); | ||
542 | - tcg_temp_free_i64(tcg_vm); | ||
543 | } else { | ||
544 | TCGv_i32 tcg_vn = tcg_temp_new_i32(); | ||
545 | TCGv_i32 tcg_vm = tcg_temp_new_i32(); | ||
546 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_compare(DisasContext *s, int size, | ||
547 | default: | ||
548 | g_assert_not_reached(); | ||
549 | } | ||
550 | - | ||
551 | - tcg_temp_free_i32(tcg_vn); | ||
552 | - tcg_temp_free_i32(tcg_vm); | ||
553 | } | ||
554 | |||
555 | - tcg_temp_free_ptr(fpst); | ||
556 | - | ||
557 | gen_set_nzcv(tcg_flags); | ||
558 | - | ||
559 | - tcg_temp_free_i64(tcg_flags); | ||
560 | } | ||
561 | |||
562 | /* Floating point compare | ||
563 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn) | ||
564 | a64_test_cc(&c, cond); | ||
565 | tcg_gen_movcond_i64(c.cond, t_true, c.value, tcg_constant_i64(0), | ||
566 | t_true, t_false); | ||
567 | - tcg_temp_free_i64(t_false); | ||
568 | |||
569 | /* Note that sregs & hregs write back zeros to the high bits, | ||
570 | and we've already done the zero-extension. */ | ||
571 | write_fp_dreg(s, rd, t_true); | ||
572 | - tcg_temp_free_i64(t_true); | ||
573 | } | ||
574 | |||
575 | /* Floating-point data-processing (1 source) - half precision */ | ||
576 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn) | ||
577 | gen_helper_advsimd_rinth(tcg_res, tcg_op, fpst); | ||
578 | |||
579 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst); | ||
580 | - tcg_temp_free_i32(tcg_rmode); | ||
581 | break; | 171 | break; |
582 | } | 172 | case INDEX_op_qemu_ld_i64: |
583 | case 0xe: /* FRINTX */ | 173 | - tcg_out_qemu_ld(s, args[0], args[1], args[2], -1, |
584 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_half(DisasContext *s, int opcode, int rd, int rn) | 174 | - args[3], TCG_TYPE_I64); |
585 | } | 175 | + tcg_out_qemu_ld(s, args[0], args[1], args[2], args[3], TCG_TYPE_I64); |
586 | |||
587 | write_fp_sreg(s, rd, tcg_res); | ||
588 | - | ||
589 | - if (fpst) { | ||
590 | - tcg_temp_free_ptr(fpst); | ||
591 | - } | ||
592 | - tcg_temp_free_i32(tcg_op); | ||
593 | - tcg_temp_free_i32(tcg_res); | ||
594 | } | ||
595 | |||
596 | /* Floating-point data-processing (1 source) - single precision */ | ||
597 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_single(DisasContext *s, int opcode, int rd, int rn) | ||
598 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst); | ||
599 | gen_fpst(tcg_res, tcg_op, fpst); | ||
600 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst); | ||
601 | - tcg_temp_free_i32(tcg_rmode); | ||
602 | } else { | ||
603 | gen_fpst(tcg_res, tcg_op, fpst); | ||
604 | } | ||
605 | - tcg_temp_free_ptr(fpst); | ||
606 | |||
607 | done: | ||
608 | write_fp_sreg(s, rd, tcg_res); | ||
609 | - tcg_temp_free_i32(tcg_op); | ||
610 | - tcg_temp_free_i32(tcg_res); | ||
611 | } | ||
612 | |||
613 | /* Floating-point data-processing (1 source) - double precision */ | ||
614 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_1src_double(DisasContext *s, int opcode, int rd, int rn) | ||
615 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst); | ||
616 | gen_fpst(tcg_res, tcg_op, fpst); | ||
617 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst); | ||
618 | - tcg_temp_free_i32(tcg_rmode); | ||
619 | } else { | ||
620 | gen_fpst(tcg_res, tcg_op, fpst); | ||
621 | } | ||
622 | - tcg_temp_free_ptr(fpst); | ||
623 | |||
624 | done: | ||
625 | write_fp_dreg(s, rd, tcg_res); | ||
626 | - tcg_temp_free_i64(tcg_op); | ||
627 | - tcg_temp_free_i64(tcg_res); | ||
628 | } | ||
629 | |||
630 | static void handle_fp_fcvt(DisasContext *s, int opcode, | ||
631 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_fcvt(DisasContext *s, int opcode, | ||
632 | TCGv_i64 tcg_rd = tcg_temp_new_i64(); | ||
633 | gen_helper_vfp_fcvtds(tcg_rd, tcg_rn, cpu_env); | ||
634 | write_fp_dreg(s, rd, tcg_rd); | ||
635 | - tcg_temp_free_i64(tcg_rd); | ||
636 | } else { | ||
637 | /* Single to half */ | ||
638 | TCGv_i32 tcg_rd = tcg_temp_new_i32(); | ||
639 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_fcvt(DisasContext *s, int opcode, | ||
640 | gen_helper_vfp_fcvt_f32_to_f16(tcg_rd, tcg_rn, fpst, ahp); | ||
641 | /* write_fp_sreg is OK here because top half of tcg_rd is zero */ | ||
642 | write_fp_sreg(s, rd, tcg_rd); | ||
643 | - tcg_temp_free_i32(tcg_rd); | ||
644 | - tcg_temp_free_i32(ahp); | ||
645 | - tcg_temp_free_ptr(fpst); | ||
646 | } | ||
647 | - tcg_temp_free_i32(tcg_rn); | ||
648 | break; | 176 | break; |
649 | } | 177 | |
650 | case 0x1: | 178 | case INDEX_op_qemu_st_i32: |
651 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_fcvt(DisasContext *s, int opcode, | 179 | - tcg_out_qemu_st(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32); |
652 | /* Double to half */ | 180 | + tcg_out_qemu_st(s, args[0], -1, args[1], args[2], TCG_TYPE_I32); |
653 | gen_helper_vfp_fcvt_f64_to_f16(tcg_rd, tcg_rn, fpst, ahp); | ||
654 | /* write_fp_sreg is OK here because top half of tcg_rd is zero */ | ||
655 | - tcg_temp_free_ptr(fpst); | ||
656 | - tcg_temp_free_i32(ahp); | ||
657 | } | ||
658 | write_fp_sreg(s, rd, tcg_rd); | ||
659 | - tcg_temp_free_i32(tcg_rd); | ||
660 | - tcg_temp_free_i64(tcg_rn); | ||
661 | break; | 181 | break; |
662 | } | 182 | case INDEX_op_qemu_st_i64: |
663 | case 0x3: | 183 | - tcg_out_qemu_st(s, args[0], args[1], args[2], -1, |
664 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_fcvt(DisasContext *s, int opcode, | 184 | - args[3], TCG_TYPE_I64); |
665 | TCGv_i32 tcg_rd = tcg_temp_new_i32(); | 185 | + tcg_out_qemu_st(s, args[0], args[1], args[2], args[3], TCG_TYPE_I64); |
666 | gen_helper_vfp_fcvt_f16_to_f32(tcg_rd, tcg_rn, tcg_fpst, tcg_ahp); | ||
667 | write_fp_sreg(s, rd, tcg_rd); | ||
668 | - tcg_temp_free_i32(tcg_rd); | ||
669 | } else { | ||
670 | /* Half to double */ | ||
671 | TCGv_i64 tcg_rd = tcg_temp_new_i64(); | ||
672 | gen_helper_vfp_fcvt_f16_to_f64(tcg_rd, tcg_rn, tcg_fpst, tcg_ahp); | ||
673 | write_fp_dreg(s, rd, tcg_rd); | ||
674 | - tcg_temp_free_i64(tcg_rd); | ||
675 | } | ||
676 | - tcg_temp_free_i32(tcg_rn); | ||
677 | - tcg_temp_free_ptr(tcg_fpst); | ||
678 | - tcg_temp_free_i32(tcg_ahp); | ||
679 | break; | 186 | break; |
680 | } | 187 | |
681 | default: | 188 | case INDEX_op_bswap16_i32: |
682 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_2src_single(DisasContext *s, int opcode, | ||
683 | } | ||
684 | |||
685 | write_fp_sreg(s, rd, tcg_res); | ||
686 | - | ||
687 | - tcg_temp_free_ptr(fpst); | ||
688 | - tcg_temp_free_i32(tcg_op1); | ||
689 | - tcg_temp_free_i32(tcg_op2); | ||
690 | - tcg_temp_free_i32(tcg_res); | ||
691 | } | ||
692 | |||
693 | /* Floating-point data-processing (2 source) - double precision */ | ||
694 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_2src_double(DisasContext *s, int opcode, | ||
695 | } | ||
696 | |||
697 | write_fp_dreg(s, rd, tcg_res); | ||
698 | - | ||
699 | - tcg_temp_free_ptr(fpst); | ||
700 | - tcg_temp_free_i64(tcg_op1); | ||
701 | - tcg_temp_free_i64(tcg_op2); | ||
702 | - tcg_temp_free_i64(tcg_res); | ||
703 | } | ||
704 | |||
705 | /* Floating-point data-processing (2 source) - half precision */ | ||
706 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_2src_half(DisasContext *s, int opcode, | ||
707 | } | ||
708 | |||
709 | write_fp_sreg(s, rd, tcg_res); | ||
710 | - | ||
711 | - tcg_temp_free_ptr(fpst); | ||
712 | - tcg_temp_free_i32(tcg_op1); | ||
713 | - tcg_temp_free_i32(tcg_op2); | ||
714 | - tcg_temp_free_i32(tcg_res); | ||
715 | } | ||
716 | |||
717 | /* Floating point data-processing (2 source) | ||
718 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_3src_single(DisasContext *s, bool o0, bool o1, | ||
719 | gen_helper_vfp_muladds(tcg_res, tcg_op1, tcg_op2, tcg_op3, fpst); | ||
720 | |||
721 | write_fp_sreg(s, rd, tcg_res); | ||
722 | - | ||
723 | - tcg_temp_free_ptr(fpst); | ||
724 | - tcg_temp_free_i32(tcg_op1); | ||
725 | - tcg_temp_free_i32(tcg_op2); | ||
726 | - tcg_temp_free_i32(tcg_op3); | ||
727 | - tcg_temp_free_i32(tcg_res); | ||
728 | } | ||
729 | |||
730 | /* Floating-point data-processing (3 source) - double precision */ | ||
731 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_3src_double(DisasContext *s, bool o0, bool o1, | ||
732 | gen_helper_vfp_muladdd(tcg_res, tcg_op1, tcg_op2, tcg_op3, fpst); | ||
733 | |||
734 | write_fp_dreg(s, rd, tcg_res); | ||
735 | - | ||
736 | - tcg_temp_free_ptr(fpst); | ||
737 | - tcg_temp_free_i64(tcg_op1); | ||
738 | - tcg_temp_free_i64(tcg_op2); | ||
739 | - tcg_temp_free_i64(tcg_op3); | ||
740 | - tcg_temp_free_i64(tcg_res); | ||
741 | } | ||
742 | |||
743 | /* Floating-point data-processing (3 source) - half precision */ | ||
744 | @@ -XXX,XX +XXX,XX @@ static void handle_fp_3src_half(DisasContext *s, bool o0, bool o1, | ||
745 | gen_helper_advsimd_muladdh(tcg_res, tcg_op1, tcg_op2, tcg_op3, fpst); | ||
746 | |||
747 | write_fp_sreg(s, rd, tcg_res); | ||
748 | - | ||
749 | - tcg_temp_free_ptr(fpst); | ||
750 | - tcg_temp_free_i32(tcg_op1); | ||
751 | - tcg_temp_free_i32(tcg_op2); | ||
752 | - tcg_temp_free_i32(tcg_op3); | ||
753 | - tcg_temp_free_i32(tcg_res); | ||
754 | } | ||
755 | |||
756 | /* Floating point data-processing (3 source) | ||
757 | @@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode, | ||
758 | tcg_shift, tcg_fpstatus); | ||
759 | } | ||
760 | write_fp_dreg(s, rd, tcg_double); | ||
761 | - tcg_temp_free_i64(tcg_double); | ||
762 | break; | ||
763 | |||
764 | case 0: /* float32 */ | ||
765 | @@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode, | ||
766 | tcg_shift, tcg_fpstatus); | ||
767 | } | ||
768 | write_fp_sreg(s, rd, tcg_single); | ||
769 | - tcg_temp_free_i32(tcg_single); | ||
770 | break; | ||
771 | |||
772 | case 3: /* float16 */ | ||
773 | @@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode, | ||
774 | tcg_shift, tcg_fpstatus); | ||
775 | } | ||
776 | write_fp_sreg(s, rd, tcg_single); | ||
777 | - tcg_temp_free_i32(tcg_single); | ||
778 | break; | ||
779 | |||
780 | default: | ||
781 | @@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode, | ||
782 | if (!sf) { | ||
783 | tcg_gen_ext32u_i64(tcg_int, tcg_int); | ||
784 | } | ||
785 | - tcg_temp_free_i64(tcg_double); | ||
786 | break; | ||
787 | |||
788 | case 0: /* float32 */ | ||
789 | @@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode, | ||
790 | tcg_shift, tcg_fpstatus); | ||
791 | } | ||
792 | tcg_gen_extu_i32_i64(tcg_int, tcg_dest); | ||
793 | - tcg_temp_free_i32(tcg_dest); | ||
794 | } | ||
795 | - tcg_temp_free_i32(tcg_single); | ||
796 | break; | ||
797 | |||
798 | case 3: /* float16 */ | ||
799 | @@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode, | ||
800 | tcg_shift, tcg_fpstatus); | ||
801 | } | ||
802 | tcg_gen_extu_i32_i64(tcg_int, tcg_dest); | ||
803 | - tcg_temp_free_i32(tcg_dest); | ||
804 | } | ||
805 | - tcg_temp_free_i32(tcg_single); | ||
806 | break; | ||
807 | |||
808 | default: | ||
809 | @@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode, | ||
810 | } | ||
811 | |||
812 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus); | ||
813 | - tcg_temp_free_i32(tcg_rmode); | ||
814 | } | ||
815 | - | ||
816 | - tcg_temp_free_ptr(tcg_fpstatus); | ||
817 | } | ||
818 | |||
819 | /* Floating point <-> fixed point conversions | ||
820 | @@ -XXX,XX +XXX,XX @@ static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof) | ||
821 | tmp = tcg_temp_new_i64(); | ||
822 | tcg_gen_ext32u_i64(tmp, tcg_rn); | ||
823 | write_fp_dreg(s, rd, tmp); | ||
824 | - tcg_temp_free_i64(tmp); | ||
825 | break; | ||
826 | case 1: | ||
827 | /* 64 bit */ | ||
828 | @@ -XXX,XX +XXX,XX @@ static void handle_fmov(DisasContext *s, int rd, int rn, int type, bool itof) | ||
829 | tmp = tcg_temp_new_i64(); | ||
830 | tcg_gen_ext16u_i64(tmp, tcg_rn); | ||
831 | write_fp_dreg(s, rd, tmp); | ||
832 | - tcg_temp_free_i64(tmp); | ||
833 | break; | ||
834 | default: | ||
835 | g_assert_not_reached(); | ||
836 | @@ -XXX,XX +XXX,XX @@ static void handle_fjcvtzs(DisasContext *s, int rd, int rn) | ||
837 | |||
838 | gen_helper_fjcvtzs(t, t, fpstatus); | ||
839 | |||
840 | - tcg_temp_free_ptr(fpstatus); | ||
841 | - | ||
842 | tcg_gen_ext32u_i64(cpu_reg(s, rd), t); | ||
843 | tcg_gen_extrh_i64_i32(cpu_ZF, t); | ||
844 | tcg_gen_movi_i32(cpu_CF, 0); | ||
845 | tcg_gen_movi_i32(cpu_NF, 0); | ||
846 | tcg_gen_movi_i32(cpu_VF, 0); | ||
847 | - | ||
848 | - tcg_temp_free_i64(t); | ||
849 | } | ||
850 | |||
851 | /* Floating point <-> integer conversions | ||
852 | @@ -XXX,XX +XXX,XX @@ static void do_ext64(DisasContext *s, TCGv_i64 tcg_left, TCGv_i64 tcg_right, | ||
853 | tcg_gen_shri_i64(tcg_right, tcg_right, pos); | ||
854 | tcg_gen_shli_i64(tcg_tmp, tcg_left, 64 - pos); | ||
855 | tcg_gen_or_i64(tcg_right, tcg_right, tcg_tmp); | ||
856 | - | ||
857 | - tcg_temp_free_i64(tcg_tmp); | ||
858 | } | ||
859 | |||
860 | /* EXT | ||
861 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_ext(DisasContext *s, uint32_t insn) | ||
862 | tcg_hh = tcg_temp_new_i64(); | ||
863 | read_vec_element(s, tcg_hh, elt->reg, elt->elt, MO_64); | ||
864 | do_ext64(s, tcg_hh, tcg_resh, pos); | ||
865 | - tcg_temp_free_i64(tcg_hh); | ||
866 | } | ||
867 | } | ||
868 | |||
869 | write_vec_element(s, tcg_resl, rd, 0, MO_64); | ||
870 | - tcg_temp_free_i64(tcg_resl); | ||
871 | if (is_q) { | ||
872 | write_vec_element(s, tcg_resh, rd, 1, MO_64); | ||
873 | } | ||
874 | - tcg_temp_free_i64(tcg_resh); | ||
875 | clear_vec_high(s, is_q, rd); | ||
876 | } | ||
877 | |||
878 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_zip_trn(DisasContext *s, uint32_t insn) | ||
879 | } | ||
880 | } | ||
881 | |||
882 | - tcg_temp_free_i64(tcg_res); | ||
883 | - | ||
884 | write_vec_element(s, tcg_resl, rd, 0, MO_64); | ||
885 | - tcg_temp_free_i64(tcg_resl); | ||
886 | - | ||
887 | if (is_q) { | ||
888 | write_vec_element(s, tcg_resh, rd, 1, MO_64); | ||
889 | - tcg_temp_free_i64(tcg_resh); | ||
890 | } | ||
891 | clear_vec_high(s, is_q, rd); | ||
892 | } | ||
893 | @@ -XXX,XX +XXX,XX @@ static TCGv_i32 do_reduction_op(DisasContext *s, int fpopcode, int rn, | ||
894 | default: | ||
895 | g_assert_not_reached(); | ||
896 | } | ||
897 | - | ||
898 | - tcg_temp_free_i32(tcg_hi); | ||
899 | - tcg_temp_free_i32(tcg_lo); | ||
900 | return tcg_res; | ||
901 | } | ||
902 | } | ||
903 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_across_lanes(DisasContext *s, uint32_t insn) | ||
904 | TCGv_i32 tcg_res32 = do_reduction_op(s, fpopcode, rn, esize, | ||
905 | (is_q ? 128 : 64), vmap, fpst); | ||
906 | tcg_gen_extu_i32_i64(tcg_res, tcg_res32); | ||
907 | - tcg_temp_free_i32(tcg_res32); | ||
908 | - tcg_temp_free_ptr(fpst); | ||
909 | } | ||
910 | |||
911 | - tcg_temp_free_i64(tcg_elt); | ||
912 | - | ||
913 | /* Now truncate the result to the width required for the final output */ | ||
914 | if (opcode == 0x03) { | ||
915 | /* SADDLV, UADDLV: result is 2*esize */ | ||
916 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_across_lanes(DisasContext *s, uint32_t insn) | ||
917 | } | ||
918 | |||
919 | write_fp_dreg(s, rd, tcg_res); | ||
920 | - tcg_temp_free_i64(tcg_res); | ||
921 | } | ||
922 | |||
923 | /* DUP (Element, Vector) | ||
924 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_dupes(DisasContext *s, int rd, int rn, | ||
925 | tmp = tcg_temp_new_i64(); | ||
926 | read_vec_element(s, tmp, rn, index, size); | ||
927 | write_fp_dreg(s, rd, tmp); | ||
928 | - tcg_temp_free_i64(tmp); | ||
929 | } | ||
930 | |||
931 | /* DUP (General) | ||
932 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_inse(DisasContext *s, int rd, int rn, | ||
933 | read_vec_element(s, tmp, rn, src_index, size); | ||
934 | write_vec_element(s, tmp, rd, dst_index, size); | ||
935 | |||
936 | - tcg_temp_free_i64(tmp); | ||
937 | - | ||
938 | /* INS is considered a 128-bit write for SVE. */ | ||
939 | clear_vec_high(s, true, rd); | ||
940 | } | ||
941 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_pairwise(DisasContext *s, uint32_t insn) | ||
942 | } | ||
943 | |||
944 | write_fp_dreg(s, rd, tcg_res); | ||
945 | - | ||
946 | - tcg_temp_free_i64(tcg_op1); | ||
947 | - tcg_temp_free_i64(tcg_op2); | ||
948 | - tcg_temp_free_i64(tcg_res); | ||
949 | } else { | ||
950 | TCGv_i32 tcg_op1 = tcg_temp_new_i32(); | ||
951 | TCGv_i32 tcg_op2 = tcg_temp_new_i32(); | ||
952 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_pairwise(DisasContext *s, uint32_t insn) | ||
953 | } | ||
954 | |||
955 | write_fp_sreg(s, rd, tcg_res); | ||
956 | - | ||
957 | - tcg_temp_free_i32(tcg_op1); | ||
958 | - tcg_temp_free_i32(tcg_op2); | ||
959 | - tcg_temp_free_i32(tcg_res); | ||
960 | - } | ||
961 | - | ||
962 | - if (fpst) { | ||
963 | - tcg_temp_free_ptr(fpst); | ||
964 | } | ||
965 | } | ||
966 | |||
967 | @@ -XXX,XX +XXX,XX @@ static void handle_shri_with_rndacc(TCGv_i64 tcg_res, TCGv_i64 tcg_src, | ||
968 | } else { | ||
969 | tcg_gen_mov_i64(tcg_res, tcg_src); | ||
970 | } | ||
971 | - | ||
972 | - if (extended_result) { | ||
973 | - tcg_temp_free_i64(tcg_src_hi); | ||
974 | - } | ||
975 | } | ||
976 | |||
977 | /* SSHR[RA]/USHR[RA] - Scalar shift right (optional rounding/accumulate) */ | ||
978 | @@ -XXX,XX +XXX,XX @@ static void handle_scalar_simd_shri(DisasContext *s, | ||
979 | } | ||
980 | |||
981 | write_fp_dreg(s, rd, tcg_rd); | ||
982 | - | ||
983 | - tcg_temp_free_i64(tcg_rn); | ||
984 | - tcg_temp_free_i64(tcg_rd); | ||
985 | } | ||
986 | |||
987 | /* SHL/SLI - Scalar shift left */ | ||
988 | @@ -XXX,XX +XXX,XX @@ static void handle_scalar_simd_shli(DisasContext *s, bool insert, | ||
989 | } | ||
990 | |||
991 | write_fp_dreg(s, rd, tcg_rd); | ||
992 | - | ||
993 | - tcg_temp_free_i64(tcg_rn); | ||
994 | - tcg_temp_free_i64(tcg_rd); | ||
995 | } | ||
996 | |||
997 | /* SQSHRN/SQSHRUN - Saturating (signed/unsigned) shift right with | ||
998 | @@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_sqshrn(DisasContext *s, bool is_scalar, bool is_q, | ||
999 | } else { | ||
1000 | write_vec_element(s, tcg_final, rd, 1, MO_64); | ||
1001 | } | ||
1002 | - | ||
1003 | - tcg_temp_free_i64(tcg_rn); | ||
1004 | - tcg_temp_free_i64(tcg_rd); | ||
1005 | - tcg_temp_free_i32(tcg_rd_narrowed); | ||
1006 | - tcg_temp_free_i64(tcg_final); | ||
1007 | - | ||
1008 | clear_vec_high(s, is_q, rd); | ||
1009 | } | ||
1010 | |||
1011 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q, | ||
1012 | read_vec_element(s, tcg_op, rn, pass, MO_64); | ||
1013 | genfn(tcg_op, cpu_env, tcg_op, tcg_shift); | ||
1014 | write_vec_element(s, tcg_op, rd, pass, MO_64); | ||
1015 | - | ||
1016 | - tcg_temp_free_i64(tcg_op); | ||
1017 | } | ||
1018 | clear_vec_high(s, is_q, rd); | ||
1019 | } else { | ||
1020 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_qshl(DisasContext *s, bool scalar, bool is_q, | ||
1021 | } else { | ||
1022 | write_vec_element_i32(s, tcg_op, rd, pass, MO_32); | ||
1023 | } | ||
1024 | - | ||
1025 | - tcg_temp_free_i32(tcg_op); | ||
1026 | } | ||
1027 | |||
1028 | if (!scalar) { | ||
1029 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn, | ||
1030 | write_vec_element(s, tcg_double, rd, pass, MO_64); | ||
1031 | } | ||
1032 | } | ||
1033 | - | ||
1034 | - tcg_temp_free_i64(tcg_int64); | ||
1035 | - tcg_temp_free_i64(tcg_double); | ||
1036 | - | ||
1037 | } else { | ||
1038 | TCGv_i32 tcg_int32 = tcg_temp_new_i32(); | ||
1039 | TCGv_i32 tcg_float = tcg_temp_new_i32(); | ||
1040 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_intfp_conv(DisasContext *s, int rd, int rn, | ||
1041 | write_vec_element_i32(s, tcg_float, rd, pass, size); | ||
1042 | } | ||
1043 | } | ||
1044 | - | ||
1045 | - tcg_temp_free_i32(tcg_int32); | ||
1046 | - tcg_temp_free_i32(tcg_float); | ||
1047 | } | ||
1048 | |||
1049 | - tcg_temp_free_ptr(tcg_fpst); | ||
1050 | - | ||
1051 | clear_vec_high(s, elements << size == 16, rd); | ||
1052 | } | ||
1053 | |||
1054 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar, | ||
1055 | gen_helper_vfp_tosqd(tcg_op, tcg_op, tcg_shift, tcg_fpstatus); | ||
1056 | } | ||
1057 | write_vec_element(s, tcg_op, rd, pass, MO_64); | ||
1058 | - tcg_temp_free_i64(tcg_op); | ||
1059 | } | ||
1060 | clear_vec_high(s, is_q, rd); | ||
1061 | } else { | ||
1062 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar, | ||
1063 | } else { | ||
1064 | write_vec_element_i32(s, tcg_op, rd, pass, size); | ||
1065 | } | ||
1066 | - tcg_temp_free_i32(tcg_op); | ||
1067 | } | ||
1068 | if (!is_scalar) { | ||
1069 | clear_vec_high(s, is_q, rd); | ||
1070 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_shift_fpint_conv(DisasContext *s, bool is_scalar, | ||
1071 | } | ||
1072 | |||
1073 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus); | ||
1074 | - tcg_temp_free_ptr(tcg_fpstatus); | ||
1075 | - tcg_temp_free_i32(tcg_rmode); | ||
1076 | } | ||
1077 | |||
1078 | /* AdvSIMD scalar shift by immediate | ||
1079 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_diff(DisasContext *s, uint32_t insn) | ||
1080 | } | ||
1081 | |||
1082 | write_fp_dreg(s, rd, tcg_res); | ||
1083 | - | ||
1084 | - tcg_temp_free_i64(tcg_op1); | ||
1085 | - tcg_temp_free_i64(tcg_op2); | ||
1086 | - tcg_temp_free_i64(tcg_res); | ||
1087 | } else { | ||
1088 | TCGv_i32 tcg_op1 = read_fp_hreg(s, rn); | ||
1089 | TCGv_i32 tcg_op2 = read_fp_hreg(s, rm); | ||
1090 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_diff(DisasContext *s, uint32_t insn) | ||
1091 | read_vec_element(s, tcg_op3, rd, 0, MO_32); | ||
1092 | gen_helper_neon_addl_saturate_s32(tcg_res, cpu_env, | ||
1093 | tcg_res, tcg_op3); | ||
1094 | - tcg_temp_free_i64(tcg_op3); | ||
1095 | break; | ||
1096 | } | ||
1097 | default: | ||
1098 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_diff(DisasContext *s, uint32_t insn) | ||
1099 | |||
1100 | tcg_gen_ext32u_i64(tcg_res, tcg_res); | ||
1101 | write_fp_dreg(s, rd, tcg_res); | ||
1102 | - | ||
1103 | - tcg_temp_free_i32(tcg_op1); | ||
1104 | - tcg_temp_free_i32(tcg_op2); | ||
1105 | - tcg_temp_free_i64(tcg_res); | ||
1106 | } | ||
1107 | } | ||
1108 | |||
1109 | @@ -XXX,XX +XXX,XX @@ static void handle_3same_float(DisasContext *s, int size, int elements, | ||
1110 | } | ||
1111 | |||
1112 | write_vec_element(s, tcg_res, rd, pass, MO_64); | ||
1113 | - | ||
1114 | - tcg_temp_free_i64(tcg_res); | ||
1115 | - tcg_temp_free_i64(tcg_op1); | ||
1116 | - tcg_temp_free_i64(tcg_op2); | ||
1117 | } else { | ||
1118 | /* Single */ | ||
1119 | TCGv_i32 tcg_op1 = tcg_temp_new_i32(); | ||
1120 | @@ -XXX,XX +XXX,XX @@ static void handle_3same_float(DisasContext *s, int size, int elements, | ||
1121 | |||
1122 | tcg_gen_extu_i32_i64(tcg_tmp, tcg_res); | ||
1123 | write_vec_element(s, tcg_tmp, rd, pass, MO_64); | ||
1124 | - tcg_temp_free_i64(tcg_tmp); | ||
1125 | } else { | ||
1126 | write_vec_element_i32(s, tcg_res, rd, pass, MO_32); | ||
1127 | } | ||
1128 | - | ||
1129 | - tcg_temp_free_i32(tcg_res); | ||
1130 | - tcg_temp_free_i32(tcg_op1); | ||
1131 | - tcg_temp_free_i32(tcg_op2); | ||
1132 | } | ||
1133 | } | ||
1134 | |||
1135 | - tcg_temp_free_ptr(fpst); | ||
1136 | - | ||
1137 | clear_vec_high(s, elements * (size ? 8 : 4) > 8, rd); | ||
1138 | } | ||
1139 | |||
1140 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_same(DisasContext *s, uint32_t insn) | ||
1141 | TCGv_i64 tcg_rm = read_fp_dreg(s, rm); | ||
1142 | |||
1143 | handle_3same_64(s, opcode, u, tcg_rd, tcg_rn, tcg_rm); | ||
1144 | - tcg_temp_free_i64(tcg_rn); | ||
1145 | - tcg_temp_free_i64(tcg_rm); | ||
1146 | } else { | ||
1147 | /* Do a single operation on the lowest element in the vector. | ||
1148 | * We use the standard Neon helpers and rely on 0 OP 0 == 0 with | ||
1149 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_same(DisasContext *s, uint32_t insn) | ||
1150 | |||
1151 | genenvfn(tcg_rd32, cpu_env, tcg_rn, tcg_rm); | ||
1152 | tcg_gen_extu_i32_i64(tcg_rd, tcg_rd32); | ||
1153 | - tcg_temp_free_i32(tcg_rd32); | ||
1154 | - tcg_temp_free_i32(tcg_rn); | ||
1155 | - tcg_temp_free_i32(tcg_rm); | ||
1156 | } | ||
1157 | |||
1158 | write_fp_dreg(s, rd, tcg_rd); | ||
1159 | - | ||
1160 | - tcg_temp_free_i64(tcg_rd); | ||
1161 | } | ||
1162 | |||
1163 | /* AdvSIMD scalar three same FP16 | ||
1164 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_same_fp16(DisasContext *s, | ||
1165 | } | ||
1166 | |||
1167 | write_fp_sreg(s, rd, tcg_res); | ||
1168 | - | ||
1169 | - | ||
1170 | - tcg_temp_free_i32(tcg_res); | ||
1171 | - tcg_temp_free_i32(tcg_op1); | ||
1172 | - tcg_temp_free_i32(tcg_op2); | ||
1173 | - tcg_temp_free_ptr(fpst); | ||
1174 | } | ||
1175 | |||
1176 | /* AdvSIMD scalar three same extra | ||
1177 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_three_reg_same_extra(DisasContext *s, | ||
1178 | default: | ||
1179 | g_assert_not_reached(); | ||
1180 | } | ||
1181 | - tcg_temp_free_i32(ele1); | ||
1182 | - tcg_temp_free_i32(ele2); | ||
1183 | |||
1184 | res = tcg_temp_new_i64(); | ||
1185 | tcg_gen_extu_i32_i64(res, ele3); | ||
1186 | - tcg_temp_free_i32(ele3); | ||
1187 | - | ||
1188 | write_fp_dreg(s, rd, res); | ||
1189 | - tcg_temp_free_i64(res); | ||
1190 | } | ||
1191 | |||
1192 | static void handle_2misc_64(DisasContext *s, int opcode, bool u, | ||
1193 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode, | ||
1194 | } | ||
1195 | write_vec_element(s, tcg_res, rd, pass, MO_64); | ||
1196 | } | ||
1197 | - tcg_temp_free_i64(tcg_res); | ||
1198 | - tcg_temp_free_i64(tcg_op); | ||
1199 | |||
1200 | clear_vec_high(s, !is_scalar, rd); | ||
1201 | } else { | ||
1202 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_fcmp_zero(DisasContext *s, int opcode, | ||
1203 | write_vec_element_i32(s, tcg_res, rd, pass, size); | ||
1204 | } | ||
1205 | } | ||
1206 | - tcg_temp_free_i32(tcg_res); | ||
1207 | - tcg_temp_free_i32(tcg_op); | ||
1208 | + | ||
1209 | if (!is_scalar) { | ||
1210 | clear_vec_high(s, is_q, rd); | ||
1211 | } | ||
1212 | } | ||
1213 | - | ||
1214 | - tcg_temp_free_ptr(fpst); | ||
1215 | } | ||
1216 | |||
1217 | static void handle_2misc_reciprocal(DisasContext *s, int opcode, | ||
1218 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_reciprocal(DisasContext *s, int opcode, | ||
1219 | } | ||
1220 | write_vec_element(s, tcg_res, rd, pass, MO_64); | ||
1221 | } | ||
1222 | - tcg_temp_free_i64(tcg_res); | ||
1223 | - tcg_temp_free_i64(tcg_op); | ||
1224 | clear_vec_high(s, !is_scalar, rd); | ||
1225 | } else { | ||
1226 | TCGv_i32 tcg_op = tcg_temp_new_i32(); | ||
1227 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_reciprocal(DisasContext *s, int opcode, | ||
1228 | write_vec_element_i32(s, tcg_res, rd, pass, MO_32); | ||
1229 | } | ||
1230 | } | ||
1231 | - tcg_temp_free_i32(tcg_res); | ||
1232 | - tcg_temp_free_i32(tcg_op); | ||
1233 | if (!is_scalar) { | ||
1234 | clear_vec_high(s, is_q, rd); | ||
1235 | } | ||
1236 | } | ||
1237 | - tcg_temp_free_ptr(fpst); | ||
1238 | } | ||
1239 | |||
1240 | static void handle_2misc_narrow(DisasContext *s, bool scalar, | ||
1241 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_narrow(DisasContext *s, bool scalar, | ||
1242 | gen_helper_vfp_fcvt_f32_to_f16(tcg_lo, tcg_lo, fpst, ahp); | ||
1243 | gen_helper_vfp_fcvt_f32_to_f16(tcg_hi, tcg_hi, fpst, ahp); | ||
1244 | tcg_gen_deposit_i32(tcg_res[pass], tcg_lo, tcg_hi, 16, 16); | ||
1245 | - tcg_temp_free_i32(tcg_lo); | ||
1246 | - tcg_temp_free_i32(tcg_hi); | ||
1247 | - tcg_temp_free_ptr(fpst); | ||
1248 | - tcg_temp_free_i32(ahp); | ||
1249 | } | ||
1250 | break; | ||
1251 | case 0x36: /* BFCVTN, BFCVTN2 */ | ||
1252 | { | ||
1253 | TCGv_ptr fpst = fpstatus_ptr(FPST_FPCR); | ||
1254 | gen_helper_bfcvt_pair(tcg_res[pass], tcg_op, fpst); | ||
1255 | - tcg_temp_free_ptr(fpst); | ||
1256 | } | ||
1257 | break; | ||
1258 | case 0x56: /* FCVTXN, FCVTXN2 */ | ||
1259 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_narrow(DisasContext *s, bool scalar, | ||
1260 | } else if (genenvfn) { | ||
1261 | genenvfn(tcg_res[pass], cpu_env, tcg_op); | ||
1262 | } | ||
1263 | - | ||
1264 | - tcg_temp_free_i64(tcg_op); | ||
1265 | } | ||
1266 | |||
1267 | for (pass = 0; pass < 2; pass++) { | ||
1268 | write_vec_element_i32(s, tcg_res[pass], rd, destelt + pass, MO_32); | ||
1269 | - tcg_temp_free_i32(tcg_res[pass]); | ||
1270 | } | ||
1271 | clear_vec_high(s, is_q, rd); | ||
1272 | } | ||
1273 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_satacc(DisasContext *s, bool is_scalar, bool is_u, | ||
1274 | } | ||
1275 | write_vec_element(s, tcg_rd, rd, pass, MO_64); | ||
1276 | } | ||
1277 | - tcg_temp_free_i64(tcg_rd); | ||
1278 | - tcg_temp_free_i64(tcg_rn); | ||
1279 | clear_vec_high(s, !is_scalar, rd); | ||
1280 | } else { | ||
1281 | TCGv_i32 tcg_rn = tcg_temp_new_i32(); | ||
1282 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_satacc(DisasContext *s, bool is_scalar, bool is_u, | ||
1283 | } | ||
1284 | write_vec_element_i32(s, tcg_rd, rd, pass, MO_32); | ||
1285 | } | ||
1286 | - tcg_temp_free_i32(tcg_rd); | ||
1287 | - tcg_temp_free_i32(tcg_rn); | ||
1288 | clear_vec_high(s, is_q, rd); | ||
1289 | } | ||
1290 | } | ||
1291 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn) | ||
1292 | |||
1293 | handle_2misc_64(s, opcode, u, tcg_rd, tcg_rn, tcg_rmode, tcg_fpstatus); | ||
1294 | write_fp_dreg(s, rd, tcg_rd); | ||
1295 | - tcg_temp_free_i64(tcg_rd); | ||
1296 | - tcg_temp_free_i64(tcg_rn); | ||
1297 | } else { | ||
1298 | TCGv_i32 tcg_rn = tcg_temp_new_i32(); | ||
1299 | TCGv_i32 tcg_rd = tcg_temp_new_i32(); | ||
1300 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_scalar_two_reg_misc(DisasContext *s, uint32_t insn) | ||
1301 | } | ||
1302 | |||
1303 | write_fp_sreg(s, rd, tcg_rd); | ||
1304 | - tcg_temp_free_i32(tcg_rd); | ||
1305 | - tcg_temp_free_i32(tcg_rn); | ||
1306 | } | ||
1307 | |||
1308 | if (is_fcvt) { | ||
1309 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus); | ||
1310 | - tcg_temp_free_i32(tcg_rmode); | ||
1311 | - tcg_temp_free_ptr(tcg_fpstatus); | ||
1312 | } | ||
1313 | } | ||
1314 | |||
1315 | @@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_shrn(DisasContext *s, bool is_q, | ||
1316 | } else { | ||
1317 | write_vec_element(s, tcg_final, rd, 1, MO_64); | ||
1318 | } | ||
1319 | - tcg_temp_free_i64(tcg_rn); | ||
1320 | - tcg_temp_free_i64(tcg_rd); | ||
1321 | - tcg_temp_free_i64(tcg_final); | ||
1322 | |||
1323 | clear_vec_high(s, is_q, rd); | ||
1324 | } | ||
1325 | @@ -XXX,XX +XXX,XX @@ static void handle_3rd_widening(DisasContext *s, int is_q, int is_u, int size, | ||
1326 | tcg_gen_movcond_i64(is_u ? TCG_COND_GEU : TCG_COND_GE, | ||
1327 | tcg_passres, | ||
1328 | tcg_op1, tcg_op2, tcg_tmp1, tcg_tmp2); | ||
1329 | - tcg_temp_free_i64(tcg_tmp1); | ||
1330 | - tcg_temp_free_i64(tcg_tmp2); | ||
1331 | break; | ||
1332 | } | ||
1333 | case 8: /* SMLAL, SMLAL2, UMLAL, UMLAL2 */ | ||
1334 | @@ -XXX,XX +XXX,XX @@ static void handle_3rd_widening(DisasContext *s, int is_q, int is_u, int size, | ||
1335 | } else if (accop < 0) { | ||
1336 | tcg_gen_sub_i64(tcg_res[pass], tcg_res[pass], tcg_passres); | ||
1337 | } | ||
1338 | - | ||
1339 | - if (accop != 0) { | ||
1340 | - tcg_temp_free_i64(tcg_passres); | ||
1341 | - } | ||
1342 | - | ||
1343 | - tcg_temp_free_i64(tcg_op1); | ||
1344 | - tcg_temp_free_i64(tcg_op2); | ||
1345 | } | ||
1346 | } else { | ||
1347 | /* size 0 or 1, generally helper functions */ | ||
1348 | @@ -XXX,XX +XXX,XX @@ static void handle_3rd_widening(DisasContext *s, int is_q, int is_u, int size, | ||
1349 | widenfn(tcg_passres, tcg_op1); | ||
1350 | gen_neon_addl(size, (opcode == 2), tcg_passres, | ||
1351 | tcg_passres, tcg_op2_64); | ||
1352 | - tcg_temp_free_i64(tcg_op2_64); | ||
1353 | break; | ||
1354 | } | ||
1355 | case 5: /* SABAL, SABAL2, UABAL, UABAL2 */ | ||
1356 | @@ -XXX,XX +XXX,XX @@ static void handle_3rd_widening(DisasContext *s, int is_q, int is_u, int size, | ||
1357 | default: | ||
1358 | g_assert_not_reached(); | ||
1359 | } | ||
1360 | - tcg_temp_free_i32(tcg_op1); | ||
1361 | - tcg_temp_free_i32(tcg_op2); | ||
1362 | |||
1363 | if (accop != 0) { | ||
1364 | if (opcode == 9 || opcode == 11) { | ||
1365 | @@ -XXX,XX +XXX,XX @@ static void handle_3rd_widening(DisasContext *s, int is_q, int is_u, int size, | ||
1366 | gen_neon_addl(size, (accop < 0), tcg_res[pass], | ||
1367 | tcg_res[pass], tcg_passres); | ||
1368 | } | ||
1369 | - tcg_temp_free_i64(tcg_passres); | ||
1370 | } | ||
1371 | } | ||
1372 | } | ||
1373 | |||
1374 | write_vec_element(s, tcg_res[0], rd, 0, MO_64); | ||
1375 | write_vec_element(s, tcg_res[1], rd, 1, MO_64); | ||
1376 | - tcg_temp_free_i64(tcg_res[0]); | ||
1377 | - tcg_temp_free_i64(tcg_res[1]); | ||
1378 | } | ||
1379 | |||
1380 | static void handle_3rd_wide(DisasContext *s, int is_q, int is_u, int size, | ||
1381 | @@ -XXX,XX +XXX,XX @@ static void handle_3rd_wide(DisasContext *s, int is_q, int is_u, int size, | ||
1382 | read_vec_element(s, tcg_op1, rn, pass, MO_64); | ||
1383 | read_vec_element_i32(s, tcg_op2, rm, part + pass, MO_32); | ||
1384 | widenfn(tcg_op2_wide, tcg_op2); | ||
1385 | - tcg_temp_free_i32(tcg_op2); | ||
1386 | tcg_res[pass] = tcg_temp_new_i64(); | ||
1387 | gen_neon_addl(size, (opcode == 3), | ||
1388 | tcg_res[pass], tcg_op1, tcg_op2_wide); | ||
1389 | - tcg_temp_free_i64(tcg_op1); | ||
1390 | - tcg_temp_free_i64(tcg_op2_wide); | ||
1391 | } | ||
1392 | |||
1393 | for (pass = 0; pass < 2; pass++) { | ||
1394 | write_vec_element(s, tcg_res[pass], rd, pass, MO_64); | ||
1395 | - tcg_temp_free_i64(tcg_res[pass]); | ||
1396 | } | ||
1397 | } | ||
1398 | |||
1399 | @@ -XXX,XX +XXX,XX @@ static void handle_3rd_narrowing(DisasContext *s, int is_q, int is_u, int size, | ||
1400 | |||
1401 | gen_neon_addl(size, (opcode == 6), tcg_wideres, tcg_op1, tcg_op2); | ||
1402 | |||
1403 | - tcg_temp_free_i64(tcg_op1); | ||
1404 | - tcg_temp_free_i64(tcg_op2); | ||
1405 | - | ||
1406 | tcg_res[pass] = tcg_temp_new_i32(); | ||
1407 | gennarrow(tcg_res[pass], tcg_wideres); | ||
1408 | - tcg_temp_free_i64(tcg_wideres); | ||
1409 | } | ||
1410 | |||
1411 | for (pass = 0; pass < 2; pass++) { | ||
1412 | write_vec_element_i32(s, tcg_res[pass], rd, pass + part, MO_32); | ||
1413 | - tcg_temp_free_i32(tcg_res[pass]); | ||
1414 | } | ||
1415 | clear_vec_high(s, is_q, rd); | ||
1416 | } | ||
1417 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_3same_pair(DisasContext *s, int is_q, int u, int opcode, | ||
1418 | default: | ||
1419 | g_assert_not_reached(); | ||
1420 | } | ||
1421 | - | ||
1422 | - tcg_temp_free_i64(tcg_op1); | ||
1423 | - tcg_temp_free_i64(tcg_op2); | ||
1424 | } | ||
1425 | |||
1426 | for (pass = 0; pass < 2; pass++) { | ||
1427 | write_vec_element(s, tcg_res[pass], rd, pass, MO_64); | ||
1428 | - tcg_temp_free_i64(tcg_res[pass]); | ||
1429 | } | ||
1430 | } else { | ||
1431 | int maxpass = is_q ? 4 : 2; | ||
1432 | @@ -XXX,XX +XXX,XX @@ static void handle_simd_3same_pair(DisasContext *s, int is_q, int u, int opcode, | ||
1433 | if (genfn) { | ||
1434 | genfn(tcg_res[pass], tcg_op1, tcg_op2); | ||
1435 | } | ||
1436 | - | ||
1437 | - tcg_temp_free_i32(tcg_op1); | ||
1438 | - tcg_temp_free_i32(tcg_op2); | ||
1439 | } | ||
1440 | |||
1441 | for (pass = 0; pass < maxpass; pass++) { | ||
1442 | write_vec_element_i32(s, tcg_res[pass], rd, pass, MO_32); | ||
1443 | - tcg_temp_free_i32(tcg_res[pass]); | ||
1444 | } | ||
1445 | clear_vec_high(s, is_q, rd); | ||
1446 | } | ||
1447 | - | ||
1448 | - if (fpst) { | ||
1449 | - tcg_temp_free_ptr(fpst); | ||
1450 | - } | ||
1451 | } | ||
1452 | |||
1453 | /* Floating point op subgroup of C3.6.16. */ | ||
1454 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_3same_int(DisasContext *s, uint32_t insn) | ||
1455 | handle_3same_64(s, opcode, u, tcg_res, tcg_op1, tcg_op2); | ||
1456 | |||
1457 | write_vec_element(s, tcg_res, rd, pass, MO_64); | ||
1458 | - | ||
1459 | - tcg_temp_free_i64(tcg_res); | ||
1460 | - tcg_temp_free_i64(tcg_op1); | ||
1461 | - tcg_temp_free_i64(tcg_op2); | ||
1462 | } | ||
1463 | } else { | ||
1464 | for (pass = 0; pass < (is_q ? 4 : 2); pass++) { | ||
1465 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_3same_int(DisasContext *s, uint32_t insn) | ||
1466 | } | ||
1467 | |||
1468 | write_vec_element_i32(s, tcg_res, rd, pass, MO_32); | ||
1469 | - | ||
1470 | - tcg_temp_free_i32(tcg_res); | ||
1471 | - tcg_temp_free_i32(tcg_op1); | ||
1472 | - tcg_temp_free_i32(tcg_op2); | ||
1473 | } | ||
1474 | } | ||
1475 | clear_vec_high(s, is_q, rd); | ||
1476 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_fp16(DisasContext *s, uint32_t insn) | ||
1477 | |||
1478 | for (pass = 0; pass < maxpass; pass++) { | ||
1479 | write_vec_element_i32(s, tcg_res[pass], rd, pass, MO_16); | ||
1480 | - tcg_temp_free_i32(tcg_res[pass]); | ||
1481 | } | ||
1482 | - | ||
1483 | - tcg_temp_free_i32(tcg_op1); | ||
1484 | - tcg_temp_free_i32(tcg_op2); | ||
1485 | - | ||
1486 | } else { | ||
1487 | for (pass = 0; pass < elements; pass++) { | ||
1488 | TCGv_i32 tcg_op1 = tcg_temp_new_i32(); | ||
1489 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_three_reg_same_fp16(DisasContext *s, uint32_t insn) | ||
1490 | } | ||
1491 | |||
1492 | write_vec_element_i32(s, tcg_res, rd, pass, MO_16); | ||
1493 | - tcg_temp_free_i32(tcg_res); | ||
1494 | - tcg_temp_free_i32(tcg_op1); | ||
1495 | - tcg_temp_free_i32(tcg_op2); | ||
1496 | } | ||
1497 | } | ||
1498 | |||
1499 | - tcg_temp_free_ptr(fpst); | ||
1500 | - | ||
1501 | clear_vec_high(s, is_q, rd); | ||
1502 | } | ||
1503 | |||
1504 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q, | ||
1505 | |||
1506 | read_vec_element_i32(s, tcg_op, rn, srcelt + pass, MO_32); | ||
1507 | gen_helper_vfp_fcvtds(tcg_res[pass], tcg_op, cpu_env); | ||
1508 | - tcg_temp_free_i32(tcg_op); | ||
1509 | } | ||
1510 | for (pass = 0; pass < 2; pass++) { | ||
1511 | write_vec_element(s, tcg_res[pass], rd, pass, MO_64); | ||
1512 | - tcg_temp_free_i64(tcg_res[pass]); | ||
1513 | } | ||
1514 | } else { | ||
1515 | /* 16 -> 32 bit fp conversion */ | ||
1516 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_widening(DisasContext *s, int opcode, bool is_q, | ||
1517 | } | ||
1518 | for (pass = 0; pass < 4; pass++) { | ||
1519 | write_vec_element_i32(s, tcg_res[pass], rd, pass, MO_32); | ||
1520 | - tcg_temp_free_i32(tcg_res[pass]); | ||
1521 | } | ||
1522 | - | ||
1523 | - tcg_temp_free_ptr(fpst); | ||
1524 | - tcg_temp_free_i32(ahp); | ||
1525 | } | ||
1526 | } | ||
1527 | |||
1528 | @@ -XXX,XX +XXX,XX @@ static void handle_rev(DisasContext *s, int opcode, bool u, | ||
1529 | g_assert_not_reached(); | ||
1530 | } | ||
1531 | write_vec_element(s, tcg_tmp, rd, i, grp_size); | ||
1532 | - tcg_temp_free_i64(tcg_tmp); | ||
1533 | } | ||
1534 | clear_vec_high(s, is_q, rd); | ||
1535 | } else { | ||
1536 | @@ -XXX,XX +XXX,XX @@ static void handle_rev(DisasContext *s, int opcode, bool u, | ||
1537 | } | ||
1538 | write_vec_element(s, tcg_rd, rd, 0, MO_64); | ||
1539 | write_vec_element(s, tcg_rd_hi, rd, 1, MO_64); | ||
1540 | - | ||
1541 | - tcg_temp_free_i64(tcg_rd_hi); | ||
1542 | - tcg_temp_free_i64(tcg_rd); | ||
1543 | - tcg_temp_free_i64(tcg_rn); | ||
1544 | } | ||
1545 | } | ||
1546 | |||
1547 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_pairwise(DisasContext *s, int opcode, bool u, | ||
1548 | read_vec_element(s, tcg_op1, rd, pass, MO_64); | ||
1549 | tcg_gen_add_i64(tcg_res[pass], tcg_res[pass], tcg_op1); | ||
1550 | } | ||
1551 | - | ||
1552 | - tcg_temp_free_i64(tcg_op1); | ||
1553 | - tcg_temp_free_i64(tcg_op2); | ||
1554 | } | ||
1555 | } else { | ||
1556 | for (pass = 0; pass < maxpass; pass++) { | ||
1557 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_pairwise(DisasContext *s, int opcode, bool u, | ||
1558 | tcg_res[pass], tcg_op); | ||
1559 | } | ||
1560 | } | ||
1561 | - tcg_temp_free_i64(tcg_op); | ||
1562 | } | ||
1563 | } | ||
1564 | if (!is_q) { | ||
1565 | @@ -XXX,XX +XXX,XX @@ static void handle_2misc_pairwise(DisasContext *s, int opcode, bool u, | ||
1566 | } | ||
1567 | for (pass = 0; pass < 2; pass++) { | ||
1568 | write_vec_element(s, tcg_res[pass], rd, pass, MO_64); | ||
1569 | - tcg_temp_free_i64(tcg_res[pass]); | ||
1570 | } | ||
1571 | } | ||
1572 | |||
1573 | @@ -XXX,XX +XXX,XX @@ static void handle_shll(DisasContext *s, bool is_q, int size, int rn, int rd) | ||
1574 | tcg_res[pass] = tcg_temp_new_i64(); | ||
1575 | widenfn(tcg_res[pass], tcg_op); | ||
1576 | tcg_gen_shli_i64(tcg_res[pass], tcg_res[pass], 8 << size); | ||
1577 | - | ||
1578 | - tcg_temp_free_i32(tcg_op); | ||
1579 | } | ||
1580 | |||
1581 | for (pass = 0; pass < 2; pass++) { | ||
1582 | write_vec_element(s, tcg_res[pass], rd, pass, MO_64); | ||
1583 | - tcg_temp_free_i64(tcg_res[pass]); | ||
1584 | } | ||
1585 | } | ||
1586 | |||
1587 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | ||
1588 | tcg_rmode, tcg_fpstatus); | ||
1589 | |||
1590 | write_vec_element(s, tcg_res, rd, pass, MO_64); | ||
1591 | - | ||
1592 | - tcg_temp_free_i64(tcg_res); | ||
1593 | - tcg_temp_free_i64(tcg_op); | ||
1594 | } | ||
1595 | } else { | ||
1596 | int pass; | ||
1597 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc(DisasContext *s, uint32_t insn) | ||
1598 | } | ||
1599 | |||
1600 | write_vec_element_i32(s, tcg_res, rd, pass, MO_32); | ||
1601 | - | ||
1602 | - tcg_temp_free_i32(tcg_res); | ||
1603 | - tcg_temp_free_i32(tcg_op); | ||
1604 | } | ||
1605 | } | ||
1606 | clear_vec_high(s, is_q, rd); | ||
1607 | |||
1608 | if (need_rmode) { | ||
1609 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus); | ||
1610 | - tcg_temp_free_i32(tcg_rmode); | ||
1611 | - } | ||
1612 | - if (need_fpstatus) { | ||
1613 | - tcg_temp_free_ptr(tcg_fpstatus); | ||
1614 | } | ||
1615 | } | ||
1616 | |||
1617 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | ||
1618 | /* limit any sign extension going on */ | ||
1619 | tcg_gen_andi_i32(tcg_res, tcg_res, 0xffff); | ||
1620 | write_fp_sreg(s, rd, tcg_res); | ||
1621 | - | ||
1622 | - tcg_temp_free_i32(tcg_res); | ||
1623 | - tcg_temp_free_i32(tcg_op); | ||
1624 | } else { | ||
1625 | for (pass = 0; pass < (is_q ? 8 : 4); pass++) { | ||
1626 | TCGv_i32 tcg_op = tcg_temp_new_i32(); | ||
1627 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | ||
1628 | } | ||
1629 | |||
1630 | write_vec_element_i32(s, tcg_res, rd, pass, MO_16); | ||
1631 | - | ||
1632 | - tcg_temp_free_i32(tcg_res); | ||
1633 | - tcg_temp_free_i32(tcg_op); | ||
1634 | } | ||
1635 | |||
1636 | clear_vec_high(s, is_q, rd); | ||
1637 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_two_reg_misc_fp16(DisasContext *s, uint32_t insn) | ||
1638 | |||
1639 | if (tcg_rmode) { | ||
1640 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, tcg_fpstatus); | ||
1641 | - tcg_temp_free_i32(tcg_rmode); | ||
1642 | - } | ||
1643 | - | ||
1644 | - if (tcg_fpstatus) { | ||
1645 | - tcg_temp_free_ptr(tcg_fpstatus); | ||
1646 | } | ||
1647 | } | ||
1648 | |||
1649 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn) | ||
1650 | size == MO_64 | ||
1651 | ? gen_helper_gvec_fcmlas_idx | ||
1652 | : gen_helper_gvec_fcmlah_idx); | ||
1653 | - tcg_temp_free_ptr(fpst); | ||
1654 | } | ||
1655 | return; | ||
1656 | |||
1657 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn) | ||
1658 | } | ||
1659 | |||
1660 | write_vec_element(s, tcg_res, rd, pass, MO_64); | ||
1661 | - tcg_temp_free_i64(tcg_op); | ||
1662 | - tcg_temp_free_i64(tcg_res); | ||
1663 | } | ||
1664 | |||
1665 | - tcg_temp_free_i64(tcg_idx); | ||
1666 | clear_vec_high(s, !is_scalar, rd); | ||
1667 | } else if (!is_long) { | ||
1668 | /* 32 bit floating point, or 16 or 32 bit integer. | ||
1669 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn) | ||
1670 | } else { | ||
1671 | write_vec_element_i32(s, tcg_res, rd, pass, MO_32); | ||
1672 | } | ||
1673 | - | ||
1674 | - tcg_temp_free_i32(tcg_op); | ||
1675 | - tcg_temp_free_i32(tcg_res); | ||
1676 | } | ||
1677 | |||
1678 | - tcg_temp_free_i32(tcg_idx); | ||
1679 | clear_vec_high(s, is_q, rd); | ||
1680 | } else { | ||
1681 | /* long ops: 16x16->32 or 32x32->64 */ | ||
1682 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn) | ||
1683 | } | ||
1684 | |||
1685 | tcg_gen_mul_i64(tcg_passres, tcg_op, tcg_idx); | ||
1686 | - tcg_temp_free_i64(tcg_op); | ||
1687 | |||
1688 | if (satop) { | ||
1689 | /* saturating, doubling */ | ||
1690 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn) | ||
1691 | default: | ||
1692 | g_assert_not_reached(); | ||
1693 | } | ||
1694 | - tcg_temp_free_i64(tcg_passres); | ||
1695 | } | ||
1696 | - tcg_temp_free_i64(tcg_idx); | ||
1697 | |||
1698 | clear_vec_high(s, !is_scalar, rd); | ||
1699 | } else { | ||
1700 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn) | ||
1701 | gen_helper_neon_addl_saturate_s32(tcg_passres, cpu_env, | ||
1702 | tcg_passres, tcg_passres); | ||
1703 | } | ||
1704 | - tcg_temp_free_i32(tcg_op); | ||
1705 | |||
1706 | if (opcode == 0xa || opcode == 0xb) { | ||
1707 | continue; | ||
1708 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn) | ||
1709 | default: | ||
1710 | g_assert_not_reached(); | ||
1711 | } | ||
1712 | - tcg_temp_free_i64(tcg_passres); | ||
1713 | } | ||
1714 | - tcg_temp_free_i32(tcg_idx); | ||
1715 | |||
1716 | if (is_scalar) { | ||
1717 | tcg_gen_ext32u_i64(tcg_res[0], tcg_res[0]); | ||
1718 | @@ -XXX,XX +XXX,XX @@ static void disas_simd_indexed(DisasContext *s, uint32_t insn) | ||
1719 | |||
1720 | for (pass = 0; pass < 2; pass++) { | ||
1721 | write_vec_element(s, tcg_res[pass], rd, pass, MO_64); | ||
1722 | - tcg_temp_free_i64(tcg_res[pass]); | ||
1723 | } | ||
1724 | } | ||
1725 | - | ||
1726 | - if (fpst) { | ||
1727 | - tcg_temp_free_ptr(fpst); | ||
1728 | - } | ||
1729 | } | ||
1730 | |||
1731 | /* Crypto AES | ||
1732 | @@ -XXX,XX +XXX,XX @@ static void disas_crypto_four_reg(DisasContext *s, uint32_t insn) | ||
1733 | } | ||
1734 | write_vec_element(s, tcg_res[0], rd, 0, MO_64); | ||
1735 | write_vec_element(s, tcg_res[1], rd, 1, MO_64); | ||
1736 | - | ||
1737 | - tcg_temp_free_i64(tcg_op1); | ||
1738 | - tcg_temp_free_i64(tcg_op2); | ||
1739 | - tcg_temp_free_i64(tcg_op3); | ||
1740 | - tcg_temp_free_i64(tcg_res[0]); | ||
1741 | - tcg_temp_free_i64(tcg_res[1]); | ||
1742 | } else { | ||
1743 | TCGv_i32 tcg_op1, tcg_op2, tcg_op3, tcg_res, tcg_zero; | ||
1744 | |||
1745 | @@ -XXX,XX +XXX,XX @@ static void disas_crypto_four_reg(DisasContext *s, uint32_t insn) | ||
1746 | write_vec_element_i32(s, tcg_zero, rd, 1, MO_32); | ||
1747 | write_vec_element_i32(s, tcg_zero, rd, 2, MO_32); | ||
1748 | write_vec_element_i32(s, tcg_res, rd, 3, MO_32); | ||
1749 | - | ||
1750 | - tcg_temp_free_i32(tcg_op1); | ||
1751 | - tcg_temp_free_i32(tcg_op2); | ||
1752 | - tcg_temp_free_i32(tcg_op3); | ||
1753 | - tcg_temp_free_i32(tcg_res); | ||
1754 | } | ||
1755 | } | ||
1756 | |||
1757 | -- | 189 | -- |
1758 | 2.34.1 | 190 | 2.43.0 | diff view generated by jsdifflib |
1 | While we do not include these in tcg_target_reg_alloc_order, | 1 | The guest address will now always fit in one register. |
---|---|---|---|
2 | and therefore they ought never be allocated, it seems safer | ||
3 | to mark them reserved as well. | ||
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 | tcg/i386/tcg-target.c.inc | 13 +++++++++++++ | 6 | tcg/i386/tcg-target.c.inc | 56 ++++++++++++++------------------------- |
9 | 1 file changed, 13 insertions(+) | 7 | 1 file changed, 20 insertions(+), 36 deletions(-) |
10 | 8 | ||
11 | diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc | 9 | diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc |
12 | index XXXXXXX..XXXXXXX 100644 | 10 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/tcg/i386/tcg-target.c.inc | 11 | --- a/tcg/i386/tcg-target.c.inc |
14 | +++ b/tcg/i386/tcg-target.c.inc | 12 | +++ b/tcg/i386/tcg-target.c.inc |
15 | @@ -XXX,XX +XXX,XX @@ static void tcg_target_init(TCGContext *s) | 13 | @@ -XXX,XX +XXX,XX @@ static inline int setup_guest_base_seg(void) |
16 | 14 | * is required and fill in @h with the host address for the fast path. | |
17 | s->reserved_regs = 0; | 15 | */ |
18 | tcg_regset_set_reg(s->reserved_regs, TCG_REG_CALL_STACK); | 16 | static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
19 | +#ifdef _WIN64 | 17 | - TCGReg addrlo, TCGReg addrhi, |
20 | + /* These are call saved, and we don't save them, so don't use them. */ | 18 | - MemOpIdx oi, bool is_ld) |
21 | + tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM6); | 19 | + TCGReg addr, MemOpIdx oi, bool is_ld) |
22 | + tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM7); | 20 | { |
23 | + tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM8); | 21 | TCGLabelQemuLdst *ldst = NULL; |
24 | + tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM9); | 22 | MemOp opc = get_memop(oi); |
25 | + tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM10); | 23 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
26 | + tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM11); | 24 | } else { |
27 | + tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM12); | 25 | *h = x86_guest_base; |
28 | + tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM13); | 26 | } |
29 | + tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM14); | 27 | - h->base = addrlo; |
30 | + tcg_regset_set_reg(s->reserved_regs, TCG_REG_XMM15); | 28 | + h->base = addr; |
31 | +#endif | 29 | h->aa = atom_and_align_for_opc(s, opc, MO_ATOM_IFALIGN, s_bits == MO_128); |
30 | a_mask = (1 << h->aa.align) - 1; | ||
31 | |||
32 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
33 | ldst = new_ldst_label(s); | ||
34 | ldst->is_ld = is_ld; | ||
35 | ldst->oi = oi; | ||
36 | - ldst->addrlo_reg = addrlo; | ||
37 | - ldst->addrhi_reg = addrhi; | ||
38 | + ldst->addrlo_reg = addr; | ||
39 | |||
40 | if (TCG_TARGET_REG_BITS == 64) { | ||
41 | ttype = s->addr_type; | ||
42 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
43 | } | ||
44 | } | ||
45 | |||
46 | - tcg_out_mov(s, tlbtype, TCG_REG_L0, addrlo); | ||
47 | + tcg_out_mov(s, tlbtype, TCG_REG_L0, addr); | ||
48 | tcg_out_shifti(s, SHIFT_SHR + tlbrexw, TCG_REG_L0, | ||
49 | s->page_bits - CPU_TLB_ENTRY_BITS); | ||
50 | |||
51 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
52 | * check that we don't cross pages for the complete access. | ||
53 | */ | ||
54 | if (a_mask >= s_mask) { | ||
55 | - tcg_out_mov(s, ttype, TCG_REG_L1, addrlo); | ||
56 | + tcg_out_mov(s, ttype, TCG_REG_L1, addr); | ||
57 | } else { | ||
58 | tcg_out_modrm_offset(s, OPC_LEA + trexw, TCG_REG_L1, | ||
59 | - addrlo, s_mask - a_mask); | ||
60 | + addr, s_mask - a_mask); | ||
61 | } | ||
62 | tlb_mask = s->page_mask | a_mask; | ||
63 | tgen_arithi(s, ARITH_AND + trexw, TCG_REG_L1, tlb_mask, 0); | ||
64 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
65 | ldst->label_ptr[0] = s->code_ptr; | ||
66 | s->code_ptr += 4; | ||
67 | |||
68 | - if (TCG_TARGET_REG_BITS == 32 && s->addr_type == TCG_TYPE_I64) { | ||
69 | - /* cmp 4(TCG_REG_L0), addrhi */ | ||
70 | - tcg_out_modrm_offset(s, OPC_CMP_GvEv, addrhi, | ||
71 | - TCG_REG_L0, cmp_ofs + 4); | ||
72 | - | ||
73 | - /* jne slow_path */ | ||
74 | - tcg_out_opc(s, OPC_JCC_long + JCC_JNE, 0, 0, 0); | ||
75 | - ldst->label_ptr[1] = s->code_ptr; | ||
76 | - s->code_ptr += 4; | ||
77 | - } | ||
78 | - | ||
79 | /* TLB Hit. */ | ||
80 | tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_L0, TCG_REG_L0, | ||
81 | offsetof(CPUTLBEntry, addend)); | ||
82 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
83 | ldst = new_ldst_label(s); | ||
84 | ldst->is_ld = is_ld; | ||
85 | ldst->oi = oi; | ||
86 | - ldst->addrlo_reg = addrlo; | ||
87 | - ldst->addrhi_reg = addrhi; | ||
88 | + ldst->addrlo_reg = addr; | ||
89 | |||
90 | /* jne slow_path */ | ||
91 | - jcc = tcg_out_cmp(s, TCG_COND_TSTNE, addrlo, a_mask, true, false); | ||
92 | + jcc = tcg_out_cmp(s, TCG_COND_TSTNE, addr, a_mask, true, false); | ||
93 | tcg_out_opc(s, OPC_JCC_long + jcc, 0, 0, 0); | ||
94 | ldst->label_ptr[0] = s->code_ptr; | ||
95 | s->code_ptr += 4; | ||
96 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_ld_direct(TCGContext *s, TCGReg datalo, TCGReg datahi, | ||
32 | } | 97 | } |
33 | 98 | ||
34 | typedef struct { | 99 | static void tcg_out_qemu_ld(TCGContext *s, TCGReg datalo, TCGReg datahi, |
100 | - TCGReg addrlo, TCGReg addrhi, | ||
101 | - MemOpIdx oi, TCGType data_type) | ||
102 | + TCGReg addr, MemOpIdx oi, TCGType data_type) | ||
103 | { | ||
104 | TCGLabelQemuLdst *ldst; | ||
105 | HostAddress h; | ||
106 | |||
107 | - ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, true); | ||
108 | + ldst = prepare_host_addr(s, &h, addr, oi, true); | ||
109 | tcg_out_qemu_ld_direct(s, datalo, datahi, h, data_type, get_memop(oi)); | ||
110 | |||
111 | if (ldst) { | ||
112 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_st_direct(TCGContext *s, TCGReg datalo, TCGReg datahi, | ||
113 | } | ||
114 | |||
115 | static void tcg_out_qemu_st(TCGContext *s, TCGReg datalo, TCGReg datahi, | ||
116 | - TCGReg addrlo, TCGReg addrhi, | ||
117 | - MemOpIdx oi, TCGType data_type) | ||
118 | + TCGReg addr, MemOpIdx oi, TCGType data_type) | ||
119 | { | ||
120 | TCGLabelQemuLdst *ldst; | ||
121 | HostAddress h; | ||
122 | |||
123 | - ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, false); | ||
124 | + ldst = prepare_host_addr(s, &h, addr, oi, false); | ||
125 | tcg_out_qemu_st_direct(s, datalo, datahi, h, get_memop(oi)); | ||
126 | |||
127 | if (ldst) { | ||
128 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, | ||
129 | break; | ||
130 | |||
131 | case INDEX_op_qemu_ld_i32: | ||
132 | - tcg_out_qemu_ld(s, a0, -1, a1, -1, a2, TCG_TYPE_I32); | ||
133 | + tcg_out_qemu_ld(s, a0, -1, a1, a2, TCG_TYPE_I32); | ||
134 | break; | ||
135 | case INDEX_op_qemu_ld_i64: | ||
136 | if (TCG_TARGET_REG_BITS == 64) { | ||
137 | - tcg_out_qemu_ld(s, a0, -1, a1, -1, a2, TCG_TYPE_I64); | ||
138 | + tcg_out_qemu_ld(s, a0, -1, a1, a2, TCG_TYPE_I64); | ||
139 | } else { | ||
140 | - tcg_out_qemu_ld(s, a0, a1, a2, -1, args[3], TCG_TYPE_I64); | ||
141 | + tcg_out_qemu_ld(s, a0, a1, a2, args[3], TCG_TYPE_I64); | ||
142 | } | ||
143 | break; | ||
144 | case INDEX_op_qemu_ld_i128: | ||
145 | tcg_debug_assert(TCG_TARGET_REG_BITS == 64); | ||
146 | - tcg_out_qemu_ld(s, a0, a1, a2, -1, args[3], TCG_TYPE_I128); | ||
147 | + tcg_out_qemu_ld(s, a0, a1, a2, args[3], TCG_TYPE_I128); | ||
148 | break; | ||
149 | |||
150 | case INDEX_op_qemu_st_i32: | ||
151 | case INDEX_op_qemu_st8_i32: | ||
152 | - tcg_out_qemu_st(s, a0, -1, a1, -1, a2, TCG_TYPE_I32); | ||
153 | + tcg_out_qemu_st(s, a0, -1, a1, a2, TCG_TYPE_I32); | ||
154 | break; | ||
155 | case INDEX_op_qemu_st_i64: | ||
156 | if (TCG_TARGET_REG_BITS == 64) { | ||
157 | - tcg_out_qemu_st(s, a0, -1, a1, -1, a2, TCG_TYPE_I64); | ||
158 | + tcg_out_qemu_st(s, a0, -1, a1, a2, TCG_TYPE_I64); | ||
159 | } else { | ||
160 | - tcg_out_qemu_st(s, a0, a1, a2, -1, args[3], TCG_TYPE_I64); | ||
161 | + tcg_out_qemu_st(s, a0, a1, a2, args[3], TCG_TYPE_I64); | ||
162 | } | ||
163 | break; | ||
164 | case INDEX_op_qemu_st_i128: | ||
165 | tcg_debug_assert(TCG_TARGET_REG_BITS == 64); | ||
166 | - tcg_out_qemu_st(s, a0, a1, a2, -1, args[3], TCG_TYPE_I128); | ||
167 | + tcg_out_qemu_st(s, a0, a1, a2, args[3], TCG_TYPE_I128); | ||
168 | break; | ||
169 | |||
170 | OP_32_64(mulu2): | ||
35 | -- | 171 | -- |
36 | 2.34.1 | 172 | 2.43.0 |
37 | 173 | ||
38 | 174 | diff view generated by jsdifflib |
1 | Translators are no longer required to free tcg temporaries. | 1 | The guest address will now always fit in one register. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@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/m68k/translate.c | 181 ---------------------------------------- | 6 | tcg/mips/tcg-target.c.inc | 62 ++++++++++++++------------------------- |
7 | 1 file changed, 181 deletions(-) | 7 | 1 file changed, 22 insertions(+), 40 deletions(-) |
8 | 8 | ||
9 | diff --git a/target/m68k/translate.c b/target/m68k/translate.c | 9 | diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc |
10 | index XXXXXXX..XXXXXXX 100644 | 10 | index XXXXXXX..XXXXXXX 100644 |
11 | --- a/target/m68k/translate.c | 11 | --- a/tcg/mips/tcg-target.c.inc |
12 | +++ b/target/m68k/translate.c | 12 | +++ b/tcg/mips/tcg-target.c.inc |
13 | @@ -XXX,XX +XXX,XX @@ static void delay_set_areg(DisasContext *s, unsigned regno, | 13 | @@ -XXX,XX +XXX,XX @@ bool tcg_target_has_memory_bswap(MemOp memop) |
14 | * is required and fill in @h with the host address for the fast path. | ||
15 | */ | ||
16 | static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
17 | - TCGReg addrlo, TCGReg addrhi, | ||
18 | - MemOpIdx oi, bool is_ld) | ||
19 | + TCGReg addr, MemOpIdx oi, bool is_ld) | ||
14 | { | 20 | { |
15 | if (s->writeback_mask & (1 << regno)) { | 21 | TCGType addr_type = s->addr_type; |
16 | if (give_temp) { | 22 | TCGLabelQemuLdst *ldst = NULL; |
17 | - tcg_temp_free(s->writeback[regno]); | 23 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
18 | s->writeback[regno] = val; | 24 | ldst = new_ldst_label(s); |
25 | ldst->is_ld = is_ld; | ||
26 | ldst->oi = oi; | ||
27 | - ldst->addrlo_reg = addrlo; | ||
28 | - ldst->addrhi_reg = addrhi; | ||
29 | + ldst->addrlo_reg = addr; | ||
30 | |||
31 | /* Load tlb_mask[mmu_idx] and tlb_table[mmu_idx]. */ | ||
32 | tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP0, TCG_AREG0, mask_off); | ||
33 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
34 | |||
35 | /* Extract the TLB index from the address into TMP3. */ | ||
36 | if (TCG_TARGET_REG_BITS == 32 || addr_type == TCG_TYPE_I32) { | ||
37 | - tcg_out_opc_sa(s, OPC_SRL, TCG_TMP3, addrlo, | ||
38 | + tcg_out_opc_sa(s, OPC_SRL, TCG_TMP3, addr, | ||
39 | s->page_bits - CPU_TLB_ENTRY_BITS); | ||
19 | } else { | 40 | } else { |
20 | tcg_gen_mov_i32(s->writeback[regno], val); | 41 | - tcg_out_dsrl(s, TCG_TMP3, addrlo, |
21 | @@ -XXX,XX +XXX,XX @@ static void do_writebacks(DisasContext *s) | 42 | - s->page_bits - CPU_TLB_ENTRY_BITS); |
22 | do { | 43 | + tcg_out_dsrl(s, TCG_TMP3, addr, s->page_bits - CPU_TLB_ENTRY_BITS); |
23 | unsigned regno = ctz32(mask); | ||
24 | tcg_gen_mov_i32(cpu_aregs[regno], s->writeback[regno]); | ||
25 | - tcg_temp_free(s->writeback[regno]); | ||
26 | mask &= mask - 1; | ||
27 | } while (mask); | ||
28 | } | ||
29 | @@ -XXX,XX +XXX,XX @@ static void gen_raise_exception(int nr) | ||
30 | |||
31 | tmp = tcg_const_i32(nr); | ||
32 | gen_helper_raise_exception(cpu_env, tmp); | ||
33 | - tcg_temp_free_i32(tmp); | ||
34 | } | ||
35 | |||
36 | static void gen_raise_exception_format2(DisasContext *s, int nr, | ||
37 | @@ -XXX,XX +XXX,XX @@ static void gen_flush_flags(DisasContext *s) | ||
38 | gen_ext(t0, t0, s->cc_op - CC_OP_ADDB, 1); | ||
39 | tcg_gen_xor_i32(t1, QREG_CC_N, QREG_CC_V); | ||
40 | tcg_gen_xor_i32(QREG_CC_V, QREG_CC_V, t0); | ||
41 | - tcg_temp_free(t0); | ||
42 | tcg_gen_andc_i32(QREG_CC_V, t1, QREG_CC_V); | ||
43 | - tcg_temp_free(t1); | ||
44 | break; | ||
45 | |||
46 | case CC_OP_SUBB: | ||
47 | @@ -XXX,XX +XXX,XX @@ static void gen_flush_flags(DisasContext *s) | ||
48 | gen_ext(t0, t0, s->cc_op - CC_OP_SUBB, 1); | ||
49 | tcg_gen_xor_i32(t1, QREG_CC_N, t0); | ||
50 | tcg_gen_xor_i32(QREG_CC_V, QREG_CC_V, t0); | ||
51 | - tcg_temp_free(t0); | ||
52 | tcg_gen_and_i32(QREG_CC_V, QREG_CC_V, t1); | ||
53 | - tcg_temp_free(t1); | ||
54 | break; | ||
55 | |||
56 | case CC_OP_CMPB: | ||
57 | @@ -XXX,XX +XXX,XX @@ static void gen_flush_flags(DisasContext *s) | ||
58 | tcg_gen_xor_i32(t0, QREG_CC_Z, QREG_CC_N); | ||
59 | tcg_gen_xor_i32(QREG_CC_V, QREG_CC_V, QREG_CC_N); | ||
60 | tcg_gen_and_i32(QREG_CC_V, QREG_CC_V, t0); | ||
61 | - tcg_temp_free(t0); | ||
62 | tcg_gen_mov_i32(QREG_CC_N, QREG_CC_Z); | ||
63 | break; | ||
64 | |||
65 | @@ -XXX,XX +XXX,XX @@ static void gen_flush_flags(DisasContext *s) | ||
66 | default: | ||
67 | t0 = tcg_const_i32(s->cc_op); | ||
68 | gen_helper_flush_flags(cpu_env, t0); | ||
69 | - tcg_temp_free(t0); | ||
70 | s->cc_op_synced = 1; | ||
71 | break; | ||
72 | } | ||
73 | @@ -XXX,XX +XXX,XX @@ static void gen_partset_reg(int opsize, TCGv reg, TCGv val) | ||
74 | tmp = tcg_temp_new(); | ||
75 | tcg_gen_ext8u_i32(tmp, val); | ||
76 | tcg_gen_or_i32(reg, reg, tmp); | ||
77 | - tcg_temp_free(tmp); | ||
78 | break; | ||
79 | case OS_WORD: | ||
80 | tcg_gen_andi_i32(reg, reg, 0xffff0000); | ||
81 | tmp = tcg_temp_new(); | ||
82 | tcg_gen_ext16u_i32(tmp, val); | ||
83 | tcg_gen_or_i32(reg, reg, tmp); | ||
84 | - tcg_temp_free(tmp); | ||
85 | break; | ||
86 | case OS_LONG: | ||
87 | case OS_SINGLE: | ||
88 | @@ -XXX,XX +XXX,XX @@ static void gen_fp_move(TCGv_ptr dest, TCGv_ptr src) | ||
89 | t32 = tcg_temp_new(); | ||
90 | tcg_gen_ld16u_i32(t32, src, offsetof(FPReg, l.upper)); | ||
91 | tcg_gen_st16_i32(t32, dest, offsetof(FPReg, l.upper)); | ||
92 | - tcg_temp_free(t32); | ||
93 | |||
94 | t64 = tcg_temp_new_i64(); | ||
95 | tcg_gen_ld_i64(t64, src, offsetof(FPReg, l.lower)); | ||
96 | tcg_gen_st_i64(t64, dest, offsetof(FPReg, l.lower)); | ||
97 | - tcg_temp_free_i64(t64); | ||
98 | } | ||
99 | |||
100 | static void gen_load_fp(DisasContext *s, int opsize, TCGv addr, TCGv_ptr fp, | ||
101 | @@ -XXX,XX +XXX,XX @@ static void gen_load_fp(DisasContext *s, int opsize, TCGv addr, TCGv_ptr fp, | ||
102 | default: | ||
103 | g_assert_not_reached(); | ||
104 | } | ||
105 | - tcg_temp_free(tmp); | ||
106 | - tcg_temp_free_i64(t64); | ||
107 | } | ||
108 | |||
109 | static void gen_store_fp(DisasContext *s, int opsize, TCGv addr, TCGv_ptr fp, | ||
110 | @@ -XXX,XX +XXX,XX @@ static void gen_store_fp(DisasContext *s, int opsize, TCGv addr, TCGv_ptr fp, | ||
111 | default: | ||
112 | g_assert_not_reached(); | ||
113 | } | ||
114 | - tcg_temp_free(tmp); | ||
115 | - tcg_temp_free_i64(t64); | ||
116 | } | ||
117 | |||
118 | static void gen_ldst_fp(DisasContext *s, int opsize, TCGv addr, | ||
119 | @@ -XXX,XX +XXX,XX @@ static int gen_ea_mode_fp(CPUM68KState *env, DisasContext *s, int mode, | ||
120 | default: | ||
121 | g_assert_not_reached(); | ||
122 | } | ||
123 | - tcg_temp_free(tmp); | ||
124 | } | 44 | } |
125 | return 0; | 45 | tcg_out_opc_reg(s, OPC_AND, TCG_TMP3, TCG_TMP3, TCG_TMP0); |
126 | case 1: /* Address register direct. */ | 46 | |
127 | @@ -XXX,XX +XXX,XX @@ static int gen_ea_mode_fp(CPUM68KState *env, DisasContext *s, int mode, | 47 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
128 | case OS_BYTE: | 48 | tcg_out_opc_imm(s, (TCG_TARGET_REG_BITS == 32 |
129 | tmp = tcg_const_i32((int8_t)read_im8(env, s)); | 49 | || addr_type == TCG_TYPE_I32 |
130 | gen_helper_exts32(cpu_env, fp, tmp); | 50 | ? OPC_ADDIU : OPC_DADDIU), |
131 | - tcg_temp_free(tmp); | 51 | - TCG_TMP2, addrlo, s_mask - a_mask); |
132 | break; | 52 | + TCG_TMP2, addr, s_mask - a_mask); |
133 | case OS_WORD: | 53 | tcg_out_opc_reg(s, OPC_AND, TCG_TMP1, TCG_TMP1, TCG_TMP2); |
134 | tmp = tcg_const_i32((int16_t)read_im16(env, s)); | 54 | } else { |
135 | gen_helper_exts32(cpu_env, fp, tmp); | 55 | - tcg_out_opc_reg(s, OPC_AND, TCG_TMP1, TCG_TMP1, addrlo); |
136 | - tcg_temp_free(tmp); | 56 | + tcg_out_opc_reg(s, OPC_AND, TCG_TMP1, TCG_TMP1, addr); |
137 | break; | 57 | } |
138 | case OS_LONG: | 58 | |
139 | tmp = tcg_const_i32(read_im32(env, s)); | 59 | /* Zero extend a 32-bit guest address for a 64-bit host. */ |
140 | gen_helper_exts32(cpu_env, fp, tmp); | 60 | if (TCG_TARGET_REG_BITS == 64 && addr_type == TCG_TYPE_I32) { |
141 | - tcg_temp_free(tmp); | 61 | - tcg_out_ext32u(s, TCG_TMP2, addrlo); |
142 | break; | 62 | - addrlo = TCG_TMP2; |
143 | case OS_SINGLE: | 63 | + tcg_out_ext32u(s, TCG_TMP2, addr); |
144 | tmp = tcg_const_i32(read_im32(env, s)); | 64 | + addr = TCG_TMP2; |
145 | gen_helper_extf32(cpu_env, fp, tmp); | 65 | } |
146 | - tcg_temp_free(tmp); | 66 | |
147 | break; | 67 | ldst->label_ptr[0] = s->code_ptr; |
148 | case OS_DOUBLE: | 68 | tcg_out_opc_br(s, OPC_BNE, TCG_TMP1, TCG_TMP0); |
149 | t64 = tcg_const_i64(read_im64(env, s)); | 69 | |
150 | gen_helper_extf64(cpu_env, fp, t64); | 70 | - /* Load and test the high half tlb comparator. */ |
151 | - tcg_temp_free_i64(t64); | 71 | - if (TCG_TARGET_REG_BITS == 32 && addr_type != TCG_TYPE_I32) { |
152 | break; | 72 | - /* delay slot */ |
153 | case OS_EXTENDED: | 73 | - tcg_out_ldst(s, OPC_LW, TCG_TMP0, TCG_TMP3, cmp_off + HI_OFF); |
154 | if (m68k_feature(s->env, M68K_FEATURE_CF_FPU)) { | ||
155 | @@ -XXX,XX +XXX,XX @@ static int gen_ea_mode_fp(CPUM68KState *env, DisasContext *s, int mode, | ||
156 | } | ||
157 | tmp = tcg_const_i32(read_im32(env, s) >> 16); | ||
158 | tcg_gen_st16_i32(tmp, fp, offsetof(FPReg, l.upper)); | ||
159 | - tcg_temp_free(tmp); | ||
160 | t64 = tcg_const_i64(read_im64(env, s)); | ||
161 | tcg_gen_st_i64(t64, fp, offsetof(FPReg, l.lower)); | ||
162 | - tcg_temp_free_i64(t64); | ||
163 | break; | ||
164 | case OS_PACKED: | ||
165 | /* | ||
166 | @@ -XXX,XX +XXX,XX @@ static void gen_cc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
167 | tmp2 = tcg_temp_new(); | ||
168 | tcg_gen_xor_i32(tmp2, QREG_CC_N, QREG_CC_V); | ||
169 | tcg_gen_or_i32(tmp, tmp, tmp2); | ||
170 | - tcg_temp_free(tmp2); | ||
171 | tcond = TCG_COND_LT; | ||
172 | break; | ||
173 | } | ||
174 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(scc) | ||
175 | |||
176 | tcg_gen_neg_i32(tmp, tmp); | ||
177 | DEST_EA(env, insn, OS_BYTE, tmp, NULL); | ||
178 | - tcg_temp_free(tmp); | ||
179 | } | ||
180 | |||
181 | DISAS_INSN(dbcc) | ||
182 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(mulw) | ||
183 | tcg_gen_mul_i32(tmp, tmp, src); | ||
184 | tcg_gen_mov_i32(reg, tmp); | ||
185 | gen_logic_cc(s, tmp, OS_LONG); | ||
186 | - tcg_temp_free(tmp); | ||
187 | } | ||
188 | |||
189 | DISAS_INSN(divw) | ||
190 | @@ -XXX,XX +XXX,XX @@ static void bcd_add(TCGv dest, TCGv src) | ||
191 | tcg_gen_andi_i32(t0, t0, 0x22); | ||
192 | tcg_gen_add_i32(dest, t0, t0); | ||
193 | tcg_gen_add_i32(dest, dest, t0); | ||
194 | - tcg_temp_free(t0); | ||
195 | |||
196 | /* | ||
197 | * remove the exceeding 0x6 | ||
198 | @@ -XXX,XX +XXX,XX @@ static void bcd_add(TCGv dest, TCGv src) | ||
199 | */ | ||
200 | |||
201 | tcg_gen_sub_i32(dest, t1, dest); | ||
202 | - tcg_temp_free(t1); | ||
203 | } | ||
204 | |||
205 | static void bcd_sub(TCGv dest, TCGv src) | ||
206 | @@ -XXX,XX +XXX,XX @@ static void bcd_sub(TCGv dest, TCGv src) | ||
207 | tcg_gen_andi_i32(t2, t2, 0x22); | ||
208 | tcg_gen_add_i32(t0, t2, t2); | ||
209 | tcg_gen_add_i32(t0, t0, t2); | ||
210 | - tcg_temp_free(t2); | ||
211 | |||
212 | /* return t1 - t0 */ | ||
213 | |||
214 | tcg_gen_sub_i32(dest, t1, t0); | ||
215 | - tcg_temp_free(t0); | ||
216 | - tcg_temp_free(t1); | ||
217 | } | ||
218 | |||
219 | static void bcd_flags(TCGv val) | ||
220 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(nbcd) | ||
221 | DEST_EA(env, insn, OS_BYTE, dest, &addr); | ||
222 | |||
223 | bcd_flags(dest); | ||
224 | - | 74 | - |
225 | - tcg_temp_free(dest); | 75 | - /* Load the tlb addend for the fast path. */ |
226 | } | 76 | - tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP3, TCG_TMP3, add_off); |
227 | 77 | - | |
228 | DISAS_INSN(addsub) | 78 | - ldst->label_ptr[1] = s->code_ptr; |
229 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(addsub) | 79 | - tcg_out_opc_br(s, OPC_BNE, addrhi, TCG_TMP0); |
80 | - } | ||
81 | - | ||
82 | /* delay slot */ | ||
83 | base = TCG_TMP3; | ||
84 | - tcg_out_opc_reg(s, ALIAS_PADD, base, TCG_TMP3, addrlo); | ||
85 | + tcg_out_opc_reg(s, ALIAS_PADD, base, TCG_TMP3, addr); | ||
230 | } else { | 86 | } else { |
231 | gen_partset_reg(opsize, DREG(insn, 9), dest); | 87 | if (a_mask && (use_mips32r6_instructions || a_bits != s_bits)) { |
232 | } | 88 | ldst = new_ldst_label(s); |
233 | - tcg_temp_free(dest); | 89 | |
234 | } | 90 | ldst->is_ld = is_ld; |
235 | 91 | ldst->oi = oi; | |
236 | /* Reverse the order of the bits in REG. */ | 92 | - ldst->addrlo_reg = addrlo; |
237 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bitop_reg) | 93 | - ldst->addrhi_reg = addrhi; |
238 | 94 | + ldst->addrlo_reg = addr; | |
239 | tmp = tcg_const_i32(1); | 95 | |
240 | tcg_gen_shl_i32(tmp, tmp, src2); | 96 | /* We are expecting a_bits to max out at 7, much lower than ANDI. */ |
241 | - tcg_temp_free(src2); | 97 | tcg_debug_assert(a_bits < 16); |
242 | 98 | - tcg_out_opc_imm(s, OPC_ANDI, TCG_TMP0, addrlo, a_mask); | |
243 | tcg_gen_and_i32(QREG_CC_Z, src1, tmp); | 99 | + tcg_out_opc_imm(s, OPC_ANDI, TCG_TMP0, addr, a_mask); |
244 | 100 | ||
245 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bitop_reg) | 101 | ldst->label_ptr[0] = s->code_ptr; |
246 | default: /* btst */ | 102 | if (use_mips32r6_instructions) { |
247 | break; | 103 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
248 | } | ||
249 | - tcg_temp_free(tmp); | ||
250 | if (op) { | ||
251 | DEST_EA(env, insn, opsize, dest, &addr); | ||
252 | } | ||
253 | - tcg_temp_free(dest); | ||
254 | } | ||
255 | |||
256 | DISAS_INSN(sats) | ||
257 | @@ -XXX,XX +XXX,XX @@ static void gen_push(DisasContext *s, TCGv val) | ||
258 | tcg_gen_subi_i32(tmp, QREG_SP, 4); | ||
259 | gen_store(s, OS_LONG, tmp, val, IS_USER(s)); | ||
260 | tcg_gen_mov_i32(QREG_SP, tmp); | ||
261 | - tcg_temp_free(tmp); | ||
262 | } | ||
263 | |||
264 | static TCGv mreg(int reg) | ||
265 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(movem) | ||
266 | for (i = 0; i < 16; i++) { | ||
267 | if (mask & (1 << i)) { | ||
268 | tcg_gen_mov_i32(mreg(i), r[i]); | ||
269 | - tcg_temp_free(r[i]); | ||
270 | } | 104 | } |
271 | } | 105 | } |
272 | if (mode == 3) { | 106 | |
273 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(movem) | 107 | - base = addrlo; |
274 | tmp = tcg_temp_new(); | 108 | + base = addr; |
275 | tcg_gen_sub_i32(tmp, cpu_aregs[reg0], incr); | 109 | if (TCG_TARGET_REG_BITS == 64 && addr_type == TCG_TYPE_I32) { |
276 | gen_store(s, opsize, addr, tmp, IS_USER(s)); | 110 | tcg_out_ext32u(s, TCG_REG_A0, base); |
277 | - tcg_temp_free(tmp); | 111 | base = TCG_REG_A0; |
278 | } else { | 112 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_ld_unalign(TCGContext *s, TCGReg lo, TCGReg hi, |
279 | gen_store(s, opsize, addr, mreg(i), IS_USER(s)); | ||
280 | } | ||
281 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(movem) | ||
282 | } | ||
283 | } | ||
284 | } | ||
285 | - | ||
286 | - tcg_temp_free(incr); | ||
287 | - tcg_temp_free(addr); | ||
288 | } | 113 | } |
289 | 114 | ||
290 | DISAS_INSN(movep) | 115 | static void tcg_out_qemu_ld(TCGContext *s, TCGReg datalo, TCGReg datahi, |
291 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(movep) | 116 | - TCGReg addrlo, TCGReg addrhi, |
292 | } | 117 | - MemOpIdx oi, TCGType data_type) |
293 | } | 118 | + TCGReg addr, MemOpIdx oi, TCGType data_type) |
294 | } | 119 | { |
295 | - tcg_temp_free(abuf); | 120 | MemOp opc = get_memop(oi); |
296 | - tcg_temp_free(dbuf); | 121 | TCGLabelQemuLdst *ldst; |
122 | HostAddress h; | ||
123 | |||
124 | - ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, true); | ||
125 | + ldst = prepare_host_addr(s, &h, addr, oi, true); | ||
126 | |||
127 | if (use_mips32r6_instructions || h.aa.align >= (opc & MO_SIZE)) { | ||
128 | tcg_out_qemu_ld_direct(s, datalo, datahi, h.base, opc, data_type); | ||
129 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_st_unalign(TCGContext *s, TCGReg lo, TCGReg hi, | ||
297 | } | 130 | } |
298 | 131 | ||
299 | DISAS_INSN(bitop_im) | 132 | static void tcg_out_qemu_st(TCGContext *s, TCGReg datalo, TCGReg datahi, |
300 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bitop_im) | 133 | - TCGReg addrlo, TCGReg addrhi, |
301 | break; | 134 | - MemOpIdx oi, TCGType data_type) |
302 | } | 135 | + TCGReg addr, MemOpIdx oi, TCGType data_type) |
303 | DEST_EA(env, insn, opsize, tmp, &addr); | 136 | { |
304 | - tcg_temp_free(tmp); | 137 | MemOp opc = get_memop(oi); |
305 | } | 138 | TCGLabelQemuLdst *ldst; |
306 | } | 139 | HostAddress h; |
307 | 140 | ||
308 | @@ -XXX,XX +XXX,XX @@ static TCGv gen_get_sr(DisasContext *s) | 141 | - ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, false); |
309 | sr = tcg_temp_new(); | 142 | + ldst = prepare_host_addr(s, &h, addr, oi, false); |
310 | tcg_gen_andi_i32(sr, QREG_SR, 0xffe0); | 143 | |
311 | tcg_gen_or_i32(sr, sr, ccr); | 144 | if (use_mips32r6_instructions || h.aa.align >= (opc & MO_SIZE)) { |
312 | - tcg_temp_free(ccr); | 145 | tcg_out_qemu_st_direct(s, datalo, datahi, h.base, opc); |
313 | return sr; | 146 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, |
314 | } | 147 | break; |
315 | 148 | ||
316 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(arith_im) | 149 | case INDEX_op_qemu_ld_i32: |
317 | default: | 150 | - tcg_out_qemu_ld(s, a0, 0, a1, 0, a2, TCG_TYPE_I32); |
318 | abort(); | 151 | + tcg_out_qemu_ld(s, a0, 0, a1, a2, TCG_TYPE_I32); |
319 | } | 152 | break; |
320 | - tcg_temp_free(im); | 153 | case INDEX_op_qemu_ld_i64: |
321 | - tcg_temp_free(dest); | 154 | if (TCG_TARGET_REG_BITS == 64) { |
322 | } | 155 | - tcg_out_qemu_ld(s, a0, 0, a1, 0, a2, TCG_TYPE_I64); |
323 | 156 | + tcg_out_qemu_ld(s, a0, 0, a1, a2, TCG_TYPE_I64); | |
324 | DISAS_INSN(cas) | ||
325 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(cas) | ||
326 | gen_update_cc_cmp(s, load, cmp, opsize); | ||
327 | gen_partset_reg(opsize, DREG(ext, 0), load); | ||
328 | |||
329 | - tcg_temp_free(load); | ||
330 | - | ||
331 | switch (extract32(insn, 3, 3)) { | ||
332 | case 3: /* Indirect postincrement. */ | ||
333 | tcg_gen_addi_i32(AREG(insn, 0), addr, opsize_bytes(opsize)); | ||
334 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(cas2w) | ||
335 | } else { | ||
336 | gen_helper_cas2w(cpu_env, regs, addr1, addr2); | ||
337 | } | ||
338 | - tcg_temp_free(regs); | ||
339 | |||
340 | /* Note that cas2w also assigned to env->cc_op. */ | ||
341 | s->cc_op = CC_OP_CMPW; | ||
342 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(cas2l) | ||
343 | } else { | ||
344 | gen_helper_cas2l(cpu_env, regs, addr1, addr2); | ||
345 | } | ||
346 | - tcg_temp_free(regs); | ||
347 | |||
348 | /* Note that cas2l also assigned to env->cc_op. */ | ||
349 | s->cc_op = CC_OP_CMPL; | ||
350 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(negx) | ||
351 | z = tcg_const_i32(0); | ||
352 | tcg_gen_add2_i32(QREG_CC_N, QREG_CC_X, src, z, QREG_CC_X, z); | ||
353 | tcg_gen_sub2_i32(QREG_CC_N, QREG_CC_X, z, z, QREG_CC_N, QREG_CC_X); | ||
354 | - tcg_temp_free(z); | ||
355 | gen_ext(QREG_CC_N, QREG_CC_N, opsize, 1); | ||
356 | |||
357 | tcg_gen_andi_i32(QREG_CC_X, QREG_CC_X, 1); | ||
358 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(clr) | ||
359 | opsize = insn_opsize(insn); | ||
360 | DEST_EA(env, insn, opsize, zero, NULL); | ||
361 | gen_logic_cc(s, zero, opsize); | ||
362 | - tcg_temp_free(zero); | ||
363 | } | ||
364 | |||
365 | DISAS_INSN(move_from_ccr) | ||
366 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(neg) | ||
367 | gen_update_cc_add(dest, src1, opsize); | ||
368 | tcg_gen_setcondi_i32(TCG_COND_NE, QREG_CC_X, dest, 0); | ||
369 | DEST_EA(env, insn, opsize, dest, &addr); | ||
370 | - tcg_temp_free(dest); | ||
371 | } | ||
372 | |||
373 | DISAS_INSN(move_to_ccr) | ||
374 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(swap) | ||
375 | tcg_gen_shli_i32(src1, reg, 16); | ||
376 | tcg_gen_shri_i32(src2, reg, 16); | ||
377 | tcg_gen_or_i32(reg, src1, src2); | ||
378 | - tcg_temp_free(src2); | ||
379 | - tcg_temp_free(src1); | ||
380 | gen_logic_cc(s, reg, OS_LONG); | ||
381 | } | ||
382 | |||
383 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(ext) | ||
384 | else | ||
385 | tcg_gen_mov_i32(reg, tmp); | ||
386 | gen_logic_cc(s, tmp, OS_LONG); | ||
387 | - tcg_temp_free(tmp); | ||
388 | } | ||
389 | |||
390 | DISAS_INSN(tst) | ||
391 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(tas) | ||
392 | tcg_gen_atomic_fetch_or_tl(src1, addr, tcg_constant_tl(0x80), | ||
393 | IS_USER(s), MO_SB); | ||
394 | gen_logic_cc(s, src1, OS_BYTE); | ||
395 | - tcg_temp_free(src1); | ||
396 | |||
397 | switch (mode) { | ||
398 | case 3: /* Indirect postincrement. */ | ||
399 | @@ -XXX,XX +XXX,XX @@ static void gen_link(DisasContext *s, uint16_t insn, int32_t offset) | ||
400 | tcg_gen_mov_i32(reg, tmp); | ||
401 | } | ||
402 | tcg_gen_addi_i32(QREG_SP, tmp, offset); | ||
403 | - tcg_temp_free(tmp); | ||
404 | } | ||
405 | |||
406 | DISAS_INSN(link) | ||
407 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(unlk) | ||
408 | tmp = gen_load(s, OS_LONG, src, 0, IS_USER(s)); | ||
409 | tcg_gen_mov_i32(reg, tmp); | ||
410 | tcg_gen_addi_i32(QREG_SP, src, 4); | ||
411 | - tcg_temp_free(src); | ||
412 | - tcg_temp_free(tmp); | ||
413 | } | ||
414 | |||
415 | #if defined(CONFIG_SOFTMMU) | ||
416 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(rtr) | ||
417 | tcg_gen_addi_i32(sp, QREG_SP, 2); | ||
418 | tmp = gen_load(s, OS_LONG, sp, 0, IS_USER(s)); | ||
419 | tcg_gen_addi_i32(QREG_SP, sp, 4); | ||
420 | - tcg_temp_free(sp); | ||
421 | |||
422 | gen_set_sr(s, ccr, true); | ||
423 | - tcg_temp_free(ccr); | ||
424 | |||
425 | gen_jmp(s, tmp); | ||
426 | } | ||
427 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(addsubq) | ||
428 | } | ||
429 | gen_update_cc_add(dest, val, opsize); | ||
430 | } | ||
431 | - tcg_temp_free(val); | ||
432 | DEST_EA(env, insn, opsize, dest, &addr); | ||
433 | - tcg_temp_free(dest); | ||
434 | } | ||
435 | |||
436 | DISAS_INSN(branch) | ||
437 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(or) | ||
438 | gen_partset_reg(opsize, DREG(insn, 9), dest); | ||
439 | } | ||
440 | gen_logic_cc(s, dest, opsize); | ||
441 | - tcg_temp_free(dest); | ||
442 | } | ||
443 | |||
444 | DISAS_INSN(suba) | ||
445 | @@ -XXX,XX +XXX,XX @@ static inline void gen_subx(DisasContext *s, TCGv src, TCGv dest, int opsize) | ||
446 | tcg_gen_xor_i32(QREG_CC_V, QREG_CC_N, dest); | ||
447 | tcg_gen_xor_i32(tmp, dest, src); | ||
448 | tcg_gen_and_i32(QREG_CC_V, QREG_CC_V, tmp); | ||
449 | - tcg_temp_free(tmp); | ||
450 | |||
451 | /* Copy the rest of the results into place. */ | ||
452 | tcg_gen_or_i32(QREG_CC_Z, QREG_CC_Z, QREG_CC_N); /* !Z is sticky */ | ||
453 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(subx_mem) | ||
454 | gen_subx(s, src, dest, opsize); | ||
455 | |||
456 | gen_store(s, opsize, addr_dest, QREG_CC_N, IS_USER(s)); | ||
457 | - | ||
458 | - tcg_temp_free(dest); | ||
459 | - tcg_temp_free(src); | ||
460 | } | ||
461 | |||
462 | DISAS_INSN(mov3q) | ||
463 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(mov3q) | ||
464 | src = tcg_const_i32(val); | ||
465 | gen_logic_cc(s, src, OS_LONG); | ||
466 | DEST_EA(env, insn, OS_LONG, src, NULL); | ||
467 | - tcg_temp_free(src); | ||
468 | } | ||
469 | |||
470 | DISAS_INSN(cmp) | ||
471 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(eor) | ||
472 | tcg_gen_xor_i32(dest, src, DREG(insn, 9)); | ||
473 | gen_logic_cc(s, dest, opsize); | ||
474 | DEST_EA(env, insn, opsize, dest, &addr); | ||
475 | - tcg_temp_free(dest); | ||
476 | } | ||
477 | |||
478 | static void do_exg(TCGv reg1, TCGv reg2) | ||
479 | @@ -XXX,XX +XXX,XX @@ static void do_exg(TCGv reg1, TCGv reg2) | ||
480 | tcg_gen_mov_i32(temp, reg1); | ||
481 | tcg_gen_mov_i32(reg1, reg2); | ||
482 | tcg_gen_mov_i32(reg2, temp); | ||
483 | - tcg_temp_free(temp); | ||
484 | } | ||
485 | |||
486 | DISAS_INSN(exg_dd) | ||
487 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(and) | ||
488 | gen_partset_reg(opsize, reg, dest); | ||
489 | } | ||
490 | gen_logic_cc(s, dest, opsize); | ||
491 | - tcg_temp_free(dest); | ||
492 | } | ||
493 | |||
494 | DISAS_INSN(adda) | ||
495 | @@ -XXX,XX +XXX,XX @@ static inline void gen_addx(DisasContext *s, TCGv src, TCGv dest, int opsize) | ||
496 | tcg_gen_xor_i32(QREG_CC_V, QREG_CC_N, src); | ||
497 | tcg_gen_xor_i32(tmp, dest, src); | ||
498 | tcg_gen_andc_i32(QREG_CC_V, QREG_CC_V, tmp); | ||
499 | - tcg_temp_free(tmp); | ||
500 | |||
501 | /* Copy the rest of the results into place. */ | ||
502 | tcg_gen_or_i32(QREG_CC_Z, QREG_CC_Z, QREG_CC_N); /* !Z is sticky */ | ||
503 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(addx_mem) | ||
504 | gen_addx(s, src, dest, opsize); | ||
505 | |||
506 | gen_store(s, opsize, addr_dest, QREG_CC_N, IS_USER(s)); | ||
507 | - | ||
508 | - tcg_temp_free(dest); | ||
509 | - tcg_temp_free(src); | ||
510 | } | ||
511 | |||
512 | static inline void shift_im(DisasContext *s, uint16_t insn, int opsize) | ||
513 | @@ -XXX,XX +XXX,XX @@ static inline void shift_im(DisasContext *s, uint16_t insn, int opsize) | ||
514 | tcg_gen_sari_i32(QREG_CC_V, reg, bits - 1); | ||
515 | tcg_gen_sari_i32(t0, reg, bits - count - 1); | ||
516 | tcg_gen_setcond_i32(TCG_COND_NE, QREG_CC_V, QREG_CC_V, t0); | ||
517 | - tcg_temp_free(t0); | ||
518 | } | ||
519 | tcg_gen_neg_i32(QREG_CC_V, QREG_CC_V); | ||
520 | } | ||
521 | @@ -XXX,XX +XXX,XX @@ static inline void shift_reg(DisasContext *s, uint16_t insn, int opsize) | ||
522 | tcg_gen_shri_i32(QREG_CC_C, QREG_CC_N, bits); | ||
523 | tcg_gen_movcond_i32(TCG_COND_EQ, QREG_CC_C, | ||
524 | s32, zero, zero, QREG_CC_C); | ||
525 | - tcg_temp_free(zero); | ||
526 | } | ||
527 | tcg_gen_andi_i32(QREG_CC_C, QREG_CC_C, 1); | ||
528 | |||
529 | @@ -XXX,XX +XXX,XX @@ static inline void shift_reg(DisasContext *s, uint16_t insn, int opsize) | ||
530 | TCGv_i64 tt = tcg_const_i64(32); | ||
531 | /* if shift is greater than 32, use 32 */ | ||
532 | tcg_gen_movcond_i64(TCG_COND_GT, s64, s64, tt, tt, s64); | ||
533 | - tcg_temp_free_i64(tt); | ||
534 | /* Sign extend the input to 64 bits; re-do the shift. */ | ||
535 | tcg_gen_ext_i32_i64(t64, reg); | ||
536 | tcg_gen_shl_i64(s64, t64, s64); | ||
537 | @@ -XXX,XX +XXX,XX @@ static inline void shift_reg(DisasContext *s, uint16_t insn, int opsize) | ||
538 | gen_ext(QREG_CC_N, QREG_CC_N, opsize, 1); | ||
539 | tcg_gen_mov_i32(QREG_CC_Z, QREG_CC_N); | ||
540 | |||
541 | - tcg_temp_free(s32); | ||
542 | - tcg_temp_free_i64(s64); | ||
543 | - tcg_temp_free_i64(t64); | ||
544 | - | ||
545 | /* Write back the result. */ | ||
546 | gen_partset_reg(opsize, DREG(insn, 0), QREG_CC_N); | ||
547 | set_cc_op(s, CC_OP_FLAGS); | ||
548 | @@ -XXX,XX +XXX,XX @@ static TCGv rotate_x(TCGv reg, TCGv shift, int left, int size) | ||
549 | /* shx = shx < 0 ? size : shx; */ | ||
550 | zero = tcg_const_i32(0); | ||
551 | tcg_gen_movcond_i32(TCG_COND_LT, shx, shx, zero, sz, shx); | ||
552 | - tcg_temp_free(zero); | ||
553 | } else { | ||
554 | tcg_gen_mov_i32(shr, shift); /* shr = shift */ | ||
555 | tcg_gen_movi_i32(shl, size + 1); | ||
556 | tcg_gen_sub_i32(shl, shl, shift); /* shl = size + 1 - shift */ | ||
557 | tcg_gen_sub_i32(shx, sz, shift); /* shx = size - shift */ | ||
558 | } | ||
559 | - tcg_temp_free_i32(sz); | ||
560 | |||
561 | /* reg = (reg << shl) | (reg >> shr) | (x << shx); */ | ||
562 | |||
563 | tcg_gen_shl_i32(shl, reg, shl); | ||
564 | tcg_gen_shr_i32(shr, reg, shr); | ||
565 | tcg_gen_or_i32(reg, shl, shr); | ||
566 | - tcg_temp_free(shl); | ||
567 | - tcg_temp_free(shr); | ||
568 | tcg_gen_shl_i32(shx, QREG_CC_X, shx); | ||
569 | tcg_gen_or_i32(reg, reg, shx); | ||
570 | - tcg_temp_free(shx); | ||
571 | |||
572 | /* X = (reg >> size) & 1 */ | ||
573 | |||
574 | @@ -XXX,XX +XXX,XX @@ static TCGv rotate32_x(TCGv reg, TCGv shift, int left) | ||
575 | /* rotate */ | ||
576 | |||
577 | tcg_gen_rotl_i64(t0, t0, shift64); | ||
578 | - tcg_temp_free_i64(shift64); | ||
579 | |||
580 | /* result is [reg:..:reg:X] */ | ||
581 | |||
582 | @@ -XXX,XX +XXX,XX @@ static TCGv rotate32_x(TCGv reg, TCGv shift, int left) | ||
583 | tcg_gen_concat_i32_i64(t0, reg, QREG_CC_X); | ||
584 | |||
585 | tcg_gen_rotr_i64(t0, t0, shift64); | ||
586 | - tcg_temp_free_i64(shift64); | ||
587 | |||
588 | /* result is value: [X:reg:..:reg] */ | ||
589 | |||
590 | @@ -XXX,XX +XXX,XX @@ static TCGv rotate32_x(TCGv reg, TCGv shift, int left) | ||
591 | |||
592 | tcg_gen_shli_i32(hi, hi, 1); | ||
593 | } | ||
594 | - tcg_temp_free_i64(t0); | ||
595 | tcg_gen_or_i32(lo, lo, hi); | ||
596 | - tcg_temp_free(hi); | ||
597 | |||
598 | /* if shift == 0, register and X are not affected */ | ||
599 | |||
600 | zero = tcg_const_i32(0); | ||
601 | tcg_gen_movcond_i32(TCG_COND_EQ, X, shift, zero, QREG_CC_X, X); | ||
602 | tcg_gen_movcond_i32(TCG_COND_EQ, reg, shift, zero, reg, lo); | ||
603 | - tcg_temp_free(zero); | ||
604 | - tcg_temp_free(lo); | ||
605 | |||
606 | return X; | ||
607 | } | ||
608 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(rotate_im) | ||
609 | } else { | ||
610 | TCGv X = rotate32_x(DREG(insn, 0), shift, left); | ||
611 | rotate_x_flags(DREG(insn, 0), X, 32); | ||
612 | - tcg_temp_free(X); | ||
613 | } | ||
614 | - tcg_temp_free(shift); | ||
615 | |||
616 | set_cc_op(s, CC_OP_FLAGS); | ||
617 | } | ||
618 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(rotate8_im) | ||
619 | } else { | ||
620 | TCGv X = rotate_x(reg, shift, left, 8); | ||
621 | rotate_x_flags(reg, X, 8); | ||
622 | - tcg_temp_free(X); | ||
623 | } | ||
624 | - tcg_temp_free(shift); | ||
625 | gen_partset_reg(OS_BYTE, DREG(insn, 0), reg); | ||
626 | set_cc_op(s, CC_OP_FLAGS); | ||
627 | } | ||
628 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(rotate16_im) | ||
629 | } else { | ||
630 | TCGv X = rotate_x(reg, shift, left, 16); | ||
631 | rotate_x_flags(reg, X, 16); | ||
632 | - tcg_temp_free(X); | ||
633 | } | ||
634 | - tcg_temp_free(shift); | ||
635 | gen_partset_reg(OS_WORD, DREG(insn, 0), reg); | ||
636 | set_cc_op(s, CC_OP_FLAGS); | ||
637 | } | ||
638 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(rotate_reg) | ||
639 | tcg_gen_remu_i32(t1, t0, t1); | ||
640 | X = rotate32_x(DREG(insn, 0), t1, left); | ||
641 | rotate_x_flags(DREG(insn, 0), X, 32); | ||
642 | - tcg_temp_free(X); | ||
643 | } | ||
644 | - tcg_temp_free(t1); | ||
645 | - tcg_temp_free(t0); | ||
646 | set_cc_op(s, CC_OP_FLAGS); | ||
647 | } | ||
648 | |||
649 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(rotate8_reg) | ||
650 | tcg_gen_remu_i32(t1, t0, t1); | ||
651 | X = rotate_x(reg, t1, left, 8); | ||
652 | rotate_x_flags(reg, X, 8); | ||
653 | - tcg_temp_free(X); | ||
654 | } | ||
655 | - tcg_temp_free(t1); | ||
656 | - tcg_temp_free(t0); | ||
657 | gen_partset_reg(OS_BYTE, DREG(insn, 0), reg); | ||
658 | set_cc_op(s, CC_OP_FLAGS); | ||
659 | } | ||
660 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(rotate16_reg) | ||
661 | tcg_gen_remu_i32(t1, t0, t1); | ||
662 | X = rotate_x(reg, t1, left, 16); | ||
663 | rotate_x_flags(reg, X, 16); | ||
664 | - tcg_temp_free(X); | ||
665 | } | ||
666 | - tcg_temp_free(t1); | ||
667 | - tcg_temp_free(t0); | ||
668 | gen_partset_reg(OS_WORD, DREG(insn, 0), reg); | ||
669 | set_cc_op(s, CC_OP_FLAGS); | ||
670 | } | ||
671 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(rotate_mem) | ||
672 | } else { | ||
673 | TCGv X = rotate_x(src, shift, left, 16); | ||
674 | rotate_x_flags(src, X, 16); | ||
675 | - tcg_temp_free(X); | ||
676 | } | ||
677 | - tcg_temp_free(shift); | ||
678 | DEST_EA(env, insn, OS_WORD, src, &addr); | ||
679 | set_cc_op(s, CC_OP_FLAGS); | ||
680 | } | ||
681 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bfext_reg) | ||
682 | } else { | 157 | } else { |
683 | tcg_gen_shr_i32(dst, tmp, shift); | 158 | - tcg_out_qemu_ld(s, a0, a1, a2, 0, args[3], TCG_TYPE_I64); |
684 | } | 159 | + tcg_out_qemu_ld(s, a0, a1, a2, args[3], TCG_TYPE_I64); |
685 | - tcg_temp_free(shift); | ||
686 | } else { | ||
687 | /* Immediate width. */ | ||
688 | if (ext & 0x800) { | ||
689 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bfext_reg) | ||
690 | } | ||
691 | } | ||
692 | |||
693 | - tcg_temp_free(tmp); | ||
694 | set_cc_op(s, CC_OP_LOGIC); | ||
695 | } | ||
696 | |||
697 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bfext_mem) | ||
698 | TCGv_i64 tmp = tcg_temp_new_i64(); | ||
699 | gen_helper_bfextu_mem(tmp, cpu_env, addr, ofs, len); | ||
700 | tcg_gen_extr_i64_i32(dest, QREG_CC_N, tmp); | ||
701 | - tcg_temp_free_i64(tmp); | ||
702 | } | ||
703 | set_cc_op(s, CC_OP_LOGIC); | ||
704 | - | ||
705 | - if (!(ext & 0x20)) { | ||
706 | - tcg_temp_free(len); | ||
707 | - } | ||
708 | - if (!(ext & 0x800)) { | ||
709 | - tcg_temp_free(ofs); | ||
710 | - } | ||
711 | } | ||
712 | |||
713 | DISAS_INSN(bfop_reg) | ||
714 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bfop_reg) | ||
715 | tcg_gen_movi_i32(tofs, ofs); | ||
716 | } | ||
717 | } | ||
718 | - tcg_temp_free(tmp); | ||
719 | } | ||
720 | set_cc_op(s, CC_OP_LOGIC); | ||
721 | |||
722 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bfop_reg) | ||
723 | break; | ||
724 | case 0x0d00: /* bfffo */ | ||
725 | gen_helper_bfffo_reg(DREG(ext, 12), QREG_CC_N, tofs, tlen); | ||
726 | - tcg_temp_free(tlen); | ||
727 | - tcg_temp_free(tofs); | ||
728 | break; | ||
729 | case 0x0e00: /* bfset */ | ||
730 | tcg_gen_orc_i32(src, src, mask); | ||
731 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bfop_reg) | ||
732 | default: | ||
733 | g_assert_not_reached(); | ||
734 | } | ||
735 | - tcg_temp_free(mask); | ||
736 | } | ||
737 | |||
738 | DISAS_INSN(bfop_mem) | ||
739 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bfop_mem) | ||
740 | t64 = tcg_temp_new_i64(); | ||
741 | gen_helper_bfffo_mem(t64, cpu_env, addr, ofs, len); | ||
742 | tcg_gen_extr_i64_i32(DREG(ext, 12), QREG_CC_N, t64); | ||
743 | - tcg_temp_free_i64(t64); | ||
744 | break; | ||
745 | case 0x0e00: /* bfset */ | ||
746 | gen_helper_bfset_mem(QREG_CC_N, cpu_env, addr, ofs, len); | ||
747 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bfop_mem) | ||
748 | g_assert_not_reached(); | ||
749 | } | ||
750 | set_cc_op(s, CC_OP_LOGIC); | ||
751 | - | ||
752 | - if (!(ext & 0x20)) { | ||
753 | - tcg_temp_free(len); | ||
754 | - } | ||
755 | - if (!(ext & 0x800)) { | ||
756 | - tcg_temp_free(ofs); | ||
757 | - } | ||
758 | } | ||
759 | |||
760 | DISAS_INSN(bfins_reg) | ||
761 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bfins_reg) | ||
762 | tcg_gen_rotr_i32(tmp, tmp, rot); | ||
763 | tcg_gen_and_i32(dst, dst, mask); | ||
764 | tcg_gen_or_i32(dst, dst, tmp); | ||
765 | - | ||
766 | - tcg_temp_free(rot); | ||
767 | - tcg_temp_free(mask); | ||
768 | } | ||
769 | - tcg_temp_free(tmp); | ||
770 | } | ||
771 | |||
772 | DISAS_INSN(bfins_mem) | ||
773 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(bfins_mem) | ||
774 | |||
775 | gen_helper_bfins_mem(QREG_CC_N, cpu_env, addr, src, ofs, len); | ||
776 | set_cc_op(s, CC_OP_LOGIC); | ||
777 | - | ||
778 | - if (!(ext & 0x20)) { | ||
779 | - tcg_temp_free(len); | ||
780 | - } | ||
781 | - if (!(ext & 0x800)) { | ||
782 | - tcg_temp_free(ofs); | ||
783 | - } | ||
784 | } | ||
785 | |||
786 | DISAS_INSN(ff1) | ||
787 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(chk2) | ||
788 | tcg_gen_addi_i32(addr2, addr1, opsize_bytes(opsize)); | ||
789 | |||
790 | bound1 = gen_load(s, opsize, addr1, 1, IS_USER(s)); | ||
791 | - tcg_temp_free(addr1); | ||
792 | bound2 = gen_load(s, opsize, addr2, 1, IS_USER(s)); | ||
793 | - tcg_temp_free(addr2); | ||
794 | |||
795 | reg = tcg_temp_new(); | ||
796 | if (ext & 0x8000) { | ||
797 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(chk2) | ||
798 | |||
799 | gen_flush_flags(s); | ||
800 | gen_helper_chk2(cpu_env, reg, bound1, bound2); | ||
801 | - tcg_temp_free(reg); | ||
802 | - tcg_temp_free(bound1); | ||
803 | - tcg_temp_free(bound2); | ||
804 | } | ||
805 | |||
806 | static void m68k_copy_line(TCGv dst, TCGv src, int index) | ||
807 | @@ -XXX,XX +XXX,XX @@ static void m68k_copy_line(TCGv dst, TCGv src, int index) | ||
808 | tcg_gen_qemu_st64(t0, addr, index); | ||
809 | tcg_gen_addi_i32(addr, addr, 8); | ||
810 | tcg_gen_qemu_st64(t1, addr, index); | ||
811 | - | ||
812 | - tcg_temp_free_i64(t0); | ||
813 | - tcg_temp_free_i64(t1); | ||
814 | - tcg_temp_free(addr); | ||
815 | } | ||
816 | |||
817 | DISAS_INSN(move16_reg) | ||
818 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(move16_reg) | ||
819 | tcg_gen_mov_i32(tmp, AREG(ext, 12)); | ||
820 | tcg_gen_addi_i32(AREG(insn, 0), AREG(insn, 0), 16); | ||
821 | tcg_gen_addi_i32(AREG(ext, 12), tmp, 16); | ||
822 | - tcg_temp_free(tmp); | ||
823 | } | ||
824 | |||
825 | DISAS_INSN(move16_mem) | ||
826 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(move16_mem) | ||
827 | m68k_copy_line(addr, reg, index); | ||
828 | } | ||
829 | |||
830 | - tcg_temp_free(addr); | ||
831 | - | ||
832 | if (((insn >> 3) & 2) == 0) { | ||
833 | /* (Ay)+ */ | ||
834 | tcg_gen_addi_i32(reg, reg, 16); | ||
835 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(moves) | ||
836 | } else { | ||
837 | gen_partset_reg(opsize, reg, tmp); | ||
838 | } | ||
839 | - tcg_temp_free(tmp); | ||
840 | } | ||
841 | switch (extract32(insn, 3, 3)) { | ||
842 | case 3: /* Indirect postincrement. */ | ||
843 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(pflush) | ||
844 | |||
845 | opmode = tcg_const_i32((insn >> 3) & 3); | ||
846 | gen_helper_pflush(cpu_env, AREG(insn, 0), opmode); | ||
847 | - tcg_temp_free(opmode); | ||
848 | } | ||
849 | |||
850 | DISAS_INSN(ptest) | ||
851 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(ptest) | ||
852 | } | ||
853 | is_read = tcg_const_i32((insn >> 5) & 1); | ||
854 | gen_helper_ptest(cpu_env, AREG(insn, 0), is_read); | ||
855 | - tcg_temp_free(is_read); | ||
856 | } | ||
857 | #endif | ||
858 | |||
859 | @@ -XXX,XX +XXX,XX @@ static void gen_qemu_store_fcr(DisasContext *s, TCGv addr, int reg) | ||
860 | tmp = tcg_temp_new(); | ||
861 | gen_load_fcr(s, tmp, reg); | ||
862 | tcg_gen_qemu_st32(tmp, addr, index); | ||
863 | - tcg_temp_free(tmp); | ||
864 | } | ||
865 | |||
866 | static void gen_qemu_load_fcr(DisasContext *s, TCGv addr, int reg) | ||
867 | @@ -XXX,XX +XXX,XX @@ static void gen_qemu_load_fcr(DisasContext *s, TCGv addr, int reg) | ||
868 | tmp = tcg_temp_new(); | ||
869 | tcg_gen_qemu_ld32u(tmp, addr, index); | ||
870 | gen_store_fcr(s, tmp, reg); | ||
871 | - tcg_temp_free(tmp); | ||
872 | } | ||
873 | |||
874 | |||
875 | @@ -XXX,XX +XXX,XX @@ static void gen_op_fmove_fcr(CPUM68KState *env, DisasContext *s, | ||
876 | } | ||
877 | tmp = tcg_const_i32(read_im32(env, s)); | ||
878 | gen_store_fcr(s, tmp, mask); | ||
879 | - tcg_temp_free(tmp); | ||
880 | return; | ||
881 | } | 160 | } |
882 | break; | 161 | break; |
883 | @@ -XXX,XX +XXX,XX @@ static void gen_op_fmove_fcr(CPUM68KState *env, DisasContext *s, | 162 | |
884 | tcg_gen_mov_i32(AREG(insn, 0), addr); | 163 | case INDEX_op_qemu_st_i32: |
885 | } | 164 | - tcg_out_qemu_st(s, a0, 0, a1, 0, a2, TCG_TYPE_I32); |
886 | } | 165 | + tcg_out_qemu_st(s, a0, 0, a1, a2, TCG_TYPE_I32); |
887 | - tcg_temp_free_i32(addr); | 166 | break; |
888 | } | 167 | case INDEX_op_qemu_st_i64: |
889 | 168 | if (TCG_TARGET_REG_BITS == 64) { | |
890 | static void gen_op_fmovem(CPUM68KState *env, DisasContext *s, | 169 | - tcg_out_qemu_st(s, a0, 0, a1, 0, a2, TCG_TYPE_I64); |
891 | @@ -XXX,XX +XXX,XX @@ static void gen_op_fmovem(CPUM68KState *env, DisasContext *s, | 170 | + tcg_out_qemu_st(s, a0, 0, a1, a2, TCG_TYPE_I64); |
892 | if ((insn & 070) == 030 || (insn & 070) == 040) { | 171 | } else { |
893 | tcg_gen_mov_i32(AREG(insn, 0), tmp); | 172 | - tcg_out_qemu_st(s, a0, a1, a2, 0, args[3], TCG_TYPE_I64); |
894 | } | 173 | + tcg_out_qemu_st(s, a0, a1, a2, args[3], TCG_TYPE_I64); |
895 | - tcg_temp_free(tmp); | ||
896 | } | ||
897 | |||
898 | /* | ||
899 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(fpu) | ||
900 | TCGv rom_offset = tcg_const_i32(opmode); | ||
901 | cpu_dest = gen_fp_ptr(REG(ext, 7)); | ||
902 | gen_helper_fconst(cpu_env, cpu_dest, rom_offset); | ||
903 | - tcg_temp_free_ptr(cpu_dest); | ||
904 | - tcg_temp_free(rom_offset); | ||
905 | return; | ||
906 | } | 174 | } |
907 | break; | 175 | break; |
908 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(fpu) | ||
909 | gen_addr_fault(s); | ||
910 | } | ||
911 | gen_helper_ftst(cpu_env, cpu_src); | ||
912 | - tcg_temp_free_ptr(cpu_src); | ||
913 | return; | ||
914 | case 4: /* fmove to control register. */ | ||
915 | case 5: /* fmove from control register. */ | ||
916 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(fpu) | ||
917 | case 0x36: case 0x37: { | ||
918 | TCGv_ptr cpu_dest2 = gen_fp_ptr(REG(ext, 0)); | ||
919 | gen_helper_fsincos(cpu_env, cpu_dest, cpu_dest2, cpu_src); | ||
920 | - tcg_temp_free_ptr(cpu_dest2); | ||
921 | } | ||
922 | break; | ||
923 | case 0x38: /* fcmp */ | ||
924 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(fpu) | ||
925 | default: | ||
926 | goto undef; | ||
927 | } | ||
928 | - tcg_temp_free_ptr(cpu_src); | ||
929 | gen_helper_ftst(cpu_env, cpu_dest); | ||
930 | - tcg_temp_free_ptr(cpu_dest); | ||
931 | return; | ||
932 | undef: | ||
933 | /* FIXME: Is this right for offset addressing modes? */ | ||
934 | @@ -XXX,XX +XXX,XX @@ static void gen_fcc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
935 | c->tcond = TCG_COND_ALWAYS; | ||
936 | break; | ||
937 | } | ||
938 | - tcg_temp_free(fpsr); | ||
939 | } | ||
940 | |||
941 | static void gen_fjmpcc(DisasContext *s, int cond, TCGLabel *l1) | ||
942 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(fscc) | ||
943 | |||
944 | tcg_gen_neg_i32(tmp, tmp); | ||
945 | DEST_EA(env, insn, OS_BYTE, tmp, NULL); | ||
946 | - tcg_temp_free(tmp); | ||
947 | } | ||
948 | |||
949 | DISAS_INSN(ftrapcc) | ||
950 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(fsave) | ||
951 | /* always write IDLE */ | ||
952 | TCGv idle = tcg_const_i32(0x41000000); | ||
953 | DEST_EA(env, insn, OS_LONG, idle, NULL); | ||
954 | - tcg_temp_free(idle); | ||
955 | } else { | ||
956 | disas_undef(env, s, insn); | ||
957 | } | ||
958 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(mac) | ||
959 | case 4: /* Pre-decrement. */ | ||
960 | tcg_gen_mov_i32(AREG(insn, 0), addr); | ||
961 | } | ||
962 | - tcg_temp_free(loadval); | ||
963 | } | ||
964 | } | ||
965 | |||
966 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(macsr_to_ccr) | ||
967 | /* Note that X and C are always cleared. */ | ||
968 | tcg_gen_andi_i32(tmp, QREG_MACSR, CCF_N | CCF_Z | CCF_V); | ||
969 | gen_helper_set_ccr(cpu_env, tmp); | ||
970 | - tcg_temp_free(tmp); | ||
971 | set_cc_op(s, CC_OP_FLAGS); | ||
972 | } | ||
973 | 176 | ||
974 | -- | 177 | -- |
975 | 2.34.1 | 178 | 2.43.0 |
179 | |||
180 | diff view generated by jsdifflib |
1 | Translators are no longer required to free tcg temporaries. | 1 | The guest address will now always fit in one register. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@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/translate-vfp.c | 193 --------------------------------- | 6 | tcg/ppc/tcg-target.c.inc | 75 ++++++++++++---------------------------- |
7 | 1 file changed, 193 deletions(-) | 7 | 1 file changed, 23 insertions(+), 52 deletions(-) |
8 | 8 | ||
9 | diff --git a/target/arm/tcg/translate-vfp.c b/target/arm/tcg/translate-vfp.c | 9 | diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc |
10 | index XXXXXXX..XXXXXXX 100644 | 10 | index XXXXXXX..XXXXXXX 100644 |
11 | --- a/target/arm/tcg/translate-vfp.c | 11 | --- a/tcg/ppc/tcg-target.c.inc |
12 | +++ b/target/arm/tcg/translate-vfp.c | 12 | +++ b/tcg/ppc/tcg-target.c.inc |
13 | @@ -XXX,XX +XXX,XX @@ static void gen_update_fp_context(DisasContext *s) | 13 | @@ -XXX,XX +XXX,XX @@ bool tcg_target_has_memory_bswap(MemOp memop) |
14 | 14 | * is required and fill in @h with the host address for the fast path. | |
15 | fpscr = load_cpu_field(v7m.fpdscr[s->v8m_secure]); | 15 | */ |
16 | gen_helper_vfp_set_fpscr(cpu_env, fpscr); | 16 | static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
17 | - tcg_temp_free_i32(fpscr); | 17 | - TCGReg addrlo, TCGReg addrhi, |
18 | if (dc_isar_feature(aa32_mve, s)) { | 18 | - MemOpIdx oi, bool is_ld) |
19 | store_cpu_field(tcg_constant_i32(0), v7m.vpr); | 19 | + TCGReg addr, MemOpIdx oi, bool is_ld) |
20 | } | 20 | { |
21 | @@ -XXX,XX +XXX,XX @@ static bool trans_VSEL(DisasContext *s, arg_VSEL *a) | 21 | TCGType addr_type = s->addr_type; |
22 | tmp = tcg_temp_new_i64(); | 22 | TCGLabelQemuLdst *ldst = NULL; |
23 | tcg_gen_xor_i64(tmp, vf, nf); | 23 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
24 | tcg_gen_movcond_i64(TCG_COND_GE, dest, tmp, zero, frn, frm); | 24 | ldst = new_ldst_label(s); |
25 | - tcg_temp_free_i64(tmp); | 25 | ldst->is_ld = is_ld; |
26 | break; | 26 | ldst->oi = oi; |
27 | case 3: /* gt: !Z && N == V */ | 27 | - ldst->addrlo_reg = addrlo; |
28 | tcg_gen_movcond_i64(TCG_COND_NE, dest, zf, zero, frn, frm); | 28 | - ldst->addrhi_reg = addrhi; |
29 | tmp = tcg_temp_new_i64(); | 29 | + ldst->addrlo_reg = addr; |
30 | tcg_gen_xor_i64(tmp, vf, nf); | 30 | |
31 | tcg_gen_movcond_i64(TCG_COND_GE, dest, tmp, zero, dest, frm); | 31 | /* Load tlb_mask[mmu_idx] and tlb_table[mmu_idx]. */ |
32 | - tcg_temp_free_i64(tmp); | 32 | tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP1, TCG_AREG0, mask_off); |
33 | break; | 33 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
34 | } | 34 | |
35 | vfp_store_reg64(dest, rd); | 35 | /* Extract the page index, shifted into place for tlb index. */ |
36 | - tcg_temp_free_i64(frn); | 36 | if (TCG_TARGET_REG_BITS == 32) { |
37 | - tcg_temp_free_i64(frm); | 37 | - tcg_out_shri32(s, TCG_REG_R0, addrlo, |
38 | - tcg_temp_free_i64(dest); | 38 | + tcg_out_shri32(s, TCG_REG_R0, addr, |
39 | - | 39 | s->page_bits - CPU_TLB_ENTRY_BITS); |
40 | - tcg_temp_free_i64(zf); | 40 | } else { |
41 | - tcg_temp_free_i64(nf); | 41 | - tcg_out_shri64(s, TCG_REG_R0, addrlo, |
42 | - tcg_temp_free_i64(vf); | 42 | + tcg_out_shri64(s, TCG_REG_R0, addr, |
43 | s->page_bits - CPU_TLB_ENTRY_BITS); | ||
44 | } | ||
45 | tcg_out32(s, AND | SAB(TCG_REG_TMP1, TCG_REG_TMP1, TCG_REG_R0)); | ||
46 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
47 | if (a_bits < s_bits) { | ||
48 | a_bits = s_bits; | ||
49 | } | ||
50 | - tcg_out_rlw(s, RLWINM, TCG_REG_R0, addrlo, 0, | ||
51 | + tcg_out_rlw(s, RLWINM, TCG_REG_R0, addr, 0, | ||
52 | (32 - a_bits) & 31, 31 - s->page_bits); | ||
53 | } else { | ||
54 | - TCGReg t = addrlo; | ||
55 | + TCGReg t = addr; | ||
56 | |||
57 | /* | ||
58 | * If the access is unaligned, we need to make sure we fail if we | ||
59 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
60 | } | ||
61 | } | ||
62 | |||
63 | - if (TCG_TARGET_REG_BITS == 32 && addr_type != TCG_TYPE_I32) { | ||
64 | - /* Low part comparison into cr7. */ | ||
65 | - tcg_out_cmp(s, TCG_COND_EQ, TCG_REG_R0, TCG_REG_TMP2, | ||
66 | - 0, 7, TCG_TYPE_I32); | ||
67 | - | ||
68 | - /* Load the high part TLB comparator into TMP2. */ | ||
69 | - tcg_out_ld(s, TCG_TYPE_I32, TCG_REG_TMP2, TCG_REG_TMP1, | ||
70 | - cmp_off + 4 * !HOST_BIG_ENDIAN); | ||
71 | - | ||
72 | - /* Load addend, deferred for this case. */ | ||
73 | - tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP1, TCG_REG_TMP1, | ||
74 | - offsetof(CPUTLBEntry, addend)); | ||
75 | - | ||
76 | - /* High part comparison into cr6. */ | ||
77 | - tcg_out_cmp(s, TCG_COND_EQ, addrhi, TCG_REG_TMP2, | ||
78 | - 0, 6, TCG_TYPE_I32); | ||
79 | - | ||
80 | - /* Combine comparisons into cr0. */ | ||
81 | - tcg_out32(s, CRAND | BT(0, CR_EQ) | BA(6, CR_EQ) | BB(7, CR_EQ)); | ||
82 | - } else { | ||
83 | - /* Full comparison into cr0. */ | ||
84 | - tcg_out_cmp(s, TCG_COND_EQ, TCG_REG_R0, TCG_REG_TMP2, | ||
85 | - 0, 0, addr_type); | ||
86 | - } | ||
87 | + /* Full comparison into cr0. */ | ||
88 | + tcg_out_cmp(s, TCG_COND_EQ, TCG_REG_R0, TCG_REG_TMP2, 0, 0, addr_type); | ||
89 | |||
90 | /* Load a pointer into the current opcode w/conditional branch-link. */ | ||
91 | ldst->label_ptr[0] = s->code_ptr; | ||
92 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
93 | ldst = new_ldst_label(s); | ||
94 | ldst->is_ld = is_ld; | ||
95 | ldst->oi = oi; | ||
96 | - ldst->addrlo_reg = addrlo; | ||
97 | - ldst->addrhi_reg = addrhi; | ||
98 | + ldst->addrlo_reg = addr; | ||
99 | |||
100 | /* We are expecting a_bits to max out at 7, much lower than ANDI. */ | ||
101 | tcg_debug_assert(a_bits < 16); | ||
102 | - tcg_out32(s, ANDI | SAI(addrlo, TCG_REG_R0, (1 << a_bits) - 1)); | ||
103 | + tcg_out32(s, ANDI | SAI(addr, TCG_REG_R0, (1 << a_bits) - 1)); | ||
104 | |||
105 | ldst->label_ptr[0] = s->code_ptr; | ||
106 | tcg_out32(s, BC | BI(0, CR_EQ) | BO_COND_FALSE | LK); | ||
107 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
108 | |||
109 | if (TCG_TARGET_REG_BITS == 64 && addr_type == TCG_TYPE_I32) { | ||
110 | /* Zero-extend the guest address for use in the host address. */ | ||
111 | - tcg_out_ext32u(s, TCG_REG_TMP2, addrlo); | ||
112 | + tcg_out_ext32u(s, TCG_REG_TMP2, addr); | ||
113 | h->index = TCG_REG_TMP2; | ||
43 | } else { | 114 | } else { |
44 | TCGv_i32 frn, frm, dest; | 115 | - h->index = addrlo; |
45 | TCGv_i32 tmp, zero; | 116 | + h->index = addr; |
46 | @@ -XXX,XX +XXX,XX @@ static bool trans_VSEL(DisasContext *s, arg_VSEL *a) | ||
47 | tmp = tcg_temp_new_i32(); | ||
48 | tcg_gen_xor_i32(tmp, cpu_VF, cpu_NF); | ||
49 | tcg_gen_movcond_i32(TCG_COND_GE, dest, tmp, zero, frn, frm); | ||
50 | - tcg_temp_free_i32(tmp); | ||
51 | break; | ||
52 | case 3: /* gt: !Z && N == V */ | ||
53 | tcg_gen_movcond_i32(TCG_COND_NE, dest, cpu_ZF, zero, frn, frm); | ||
54 | tmp = tcg_temp_new_i32(); | ||
55 | tcg_gen_xor_i32(tmp, cpu_VF, cpu_NF); | ||
56 | tcg_gen_movcond_i32(TCG_COND_GE, dest, tmp, zero, dest, frm); | ||
57 | - tcg_temp_free_i32(tmp); | ||
58 | break; | ||
59 | } | ||
60 | /* For fp16 the top half is always zeroes */ | ||
61 | @@ -XXX,XX +XXX,XX @@ static bool trans_VSEL(DisasContext *s, arg_VSEL *a) | ||
62 | tcg_gen_andi_i32(dest, dest, 0xffff); | ||
63 | } | ||
64 | vfp_store_reg32(dest, rd); | ||
65 | - tcg_temp_free_i32(frn); | ||
66 | - tcg_temp_free_i32(frm); | ||
67 | - tcg_temp_free_i32(dest); | ||
68 | } | 117 | } |
69 | 118 | ||
70 | return true; | 119 | return ldst; |
71 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINT(DisasContext *s, arg_VRINT *a) | ||
72 | vfp_load_reg64(tcg_op, rm); | ||
73 | gen_helper_rintd(tcg_res, tcg_op, fpst); | ||
74 | vfp_store_reg64(tcg_res, rd); | ||
75 | - tcg_temp_free_i64(tcg_op); | ||
76 | - tcg_temp_free_i64(tcg_res); | ||
77 | } else { | ||
78 | TCGv_i32 tcg_op; | ||
79 | TCGv_i32 tcg_res; | ||
80 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINT(DisasContext *s, arg_VRINT *a) | ||
81 | gen_helper_rints(tcg_res, tcg_op, fpst); | ||
82 | } | ||
83 | vfp_store_reg32(tcg_res, rd); | ||
84 | - tcg_temp_free_i32(tcg_op); | ||
85 | - tcg_temp_free_i32(tcg_res); | ||
86 | } | ||
87 | |||
88 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst); | ||
89 | - tcg_temp_free_i32(tcg_rmode); | ||
90 | - | ||
91 | - tcg_temp_free_ptr(fpst); | ||
92 | return true; | ||
93 | } | 120 | } |
94 | 121 | ||
95 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT(DisasContext *s, arg_VCVT *a) | 122 | static void tcg_out_qemu_ld(TCGContext *s, TCGReg datalo, TCGReg datahi, |
96 | } | 123 | - TCGReg addrlo, TCGReg addrhi, |
97 | tcg_gen_extrl_i64_i32(tcg_tmp, tcg_res); | 124 | - MemOpIdx oi, TCGType data_type) |
98 | vfp_store_reg32(tcg_tmp, rd); | 125 | + TCGReg addr, MemOpIdx oi, TCGType data_type) |
99 | - tcg_temp_free_i32(tcg_tmp); | 126 | { |
100 | - tcg_temp_free_i64(tcg_res); | 127 | MemOp opc = get_memop(oi); |
101 | - tcg_temp_free_i64(tcg_double); | 128 | TCGLabelQemuLdst *ldst; |
102 | } else { | 129 | HostAddress h; |
103 | TCGv_i32 tcg_single, tcg_res; | 130 | |
104 | tcg_single = tcg_temp_new_i32(); | 131 | - ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, true); |
105 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT(DisasContext *s, arg_VCVT *a) | 132 | + ldst = prepare_host_addr(s, &h, addr, oi, true); |
106 | } | 133 | |
107 | } | 134 | if (TCG_TARGET_REG_BITS == 32 && (opc & MO_SIZE) == MO_64) { |
108 | vfp_store_reg32(tcg_res, rd); | 135 | if (opc & MO_BSWAP) { |
109 | - tcg_temp_free_i32(tcg_res); | 136 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_ld(TCGContext *s, TCGReg datalo, TCGReg datahi, |
110 | - tcg_temp_free_i32(tcg_single); | ||
111 | } | ||
112 | |||
113 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst); | ||
114 | - tcg_temp_free_i32(tcg_rmode); | ||
115 | - | ||
116 | - tcg_temp_free_ptr(fpst); | ||
117 | - | ||
118 | return true; | ||
119 | } | 137 | } |
120 | 138 | ||
121 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_from_gp(DisasContext *s, arg_VMOV_from_gp *a) | 139 | static void tcg_out_qemu_st(TCGContext *s, TCGReg datalo, TCGReg datahi, |
122 | if (!mve_skip_vmov(s, a->vn, a->index, a->size)) { | 140 | - TCGReg addrlo, TCGReg addrhi, |
123 | tmp = load_reg(s, a->rt); | 141 | - MemOpIdx oi, TCGType data_type) |
124 | write_neon_element32(tmp, a->vn, a->index, a->size); | 142 | + TCGReg addr, MemOpIdx oi, TCGType data_type) |
125 | - tcg_temp_free_i32(tmp); | 143 | { |
126 | } | 144 | MemOp opc = get_memop(oi); |
127 | 145 | TCGLabelQemuLdst *ldst; | |
128 | if (dc_isar_feature(aa32_mve, s)) { | 146 | HostAddress h; |
129 | @@ -XXX,XX +XXX,XX @@ static bool trans_VDUP(DisasContext *s, arg_VDUP *a) | 147 | |
130 | tmp = load_reg(s, a->rt); | 148 | - ldst = prepare_host_addr(s, &h, addrlo, addrhi, oi, false); |
131 | tcg_gen_gvec_dup_i32(size, neon_full_reg_offset(a->vn), | 149 | + ldst = prepare_host_addr(s, &h, addr, oi, false); |
132 | vec_size, vec_size, tmp); | 150 | |
133 | - tcg_temp_free_i32(tmp); | 151 | if (TCG_TARGET_REG_BITS == 32 && (opc & MO_SIZE) == MO_64) { |
134 | - | 152 | if (opc & MO_BSWAP) { |
135 | return true; | 153 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_qemu_ldst_i128(TCGContext *s, TCGReg datalo, TCGReg datahi, |
136 | } | 154 | uint32_t insn; |
137 | 155 | TCGReg index; | |
138 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMSR_VMRS(DisasContext *s, arg_VMSR_VMRS *a) | 156 | |
139 | if (a->rt == 15) { | 157 | - ldst = prepare_host_addr(s, &h, addr_reg, -1, oi, is_ld); |
140 | /* Set the 4 flag bits in the CPSR. */ | 158 | + ldst = prepare_host_addr(s, &h, addr_reg, oi, is_ld); |
141 | gen_set_nzcv(tmp); | 159 | |
142 | - tcg_temp_free_i32(tmp); | 160 | /* Compose the final address, as LQ/STQ have no indexing. */ |
143 | } else { | 161 | index = h.index; |
144 | store_reg(s, a->rt, tmp); | 162 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, |
145 | } | 163 | break; |
146 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMSR_VMRS(DisasContext *s, arg_VMSR_VMRS *a) | 164 | |
147 | case ARM_VFP_FPSCR: | 165 | case INDEX_op_qemu_ld_i32: |
148 | tmp = load_reg(s, a->rt); | 166 | - tcg_out_qemu_ld(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32); |
149 | gen_helper_vfp_set_fpscr(cpu_env, tmp); | 167 | + tcg_out_qemu_ld(s, args[0], -1, args[1], args[2], TCG_TYPE_I32); |
150 | - tcg_temp_free_i32(tmp); | 168 | break; |
151 | gen_lookup_tb(s); | 169 | case INDEX_op_qemu_ld_i64: |
152 | break; | 170 | if (TCG_TARGET_REG_BITS == 64) { |
153 | case ARM_VFP_FPEXC: | 171 | - tcg_out_qemu_ld(s, args[0], -1, args[1], -1, |
154 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_half(DisasContext *s, arg_VMOV_single *a) | 172 | - args[2], TCG_TYPE_I64); |
155 | tmp = load_reg(s, a->rt); | 173 | + tcg_out_qemu_ld(s, args[0], -1, args[1], args[2], TCG_TYPE_I64); |
156 | tcg_gen_andi_i32(tmp, tmp, 0xffff); | 174 | } else { |
157 | vfp_store_reg32(tmp, a->vn); | 175 | - tcg_out_qemu_ld(s, args[0], args[1], args[2], -1, |
158 | - tcg_temp_free_i32(tmp); | 176 | + tcg_out_qemu_ld(s, args[0], args[1], args[2], |
159 | } | 177 | args[3], TCG_TYPE_I64); |
160 | 178 | } | |
161 | return true; | 179 | break; |
162 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_single(DisasContext *s, arg_VMOV_single *a) | 180 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, |
163 | if (a->rt == 15) { | 181 | break; |
164 | /* Set the 4 flag bits in the CPSR. */ | 182 | |
165 | gen_set_nzcv(tmp); | 183 | case INDEX_op_qemu_st_i32: |
166 | - tcg_temp_free_i32(tmp); | 184 | - tcg_out_qemu_st(s, args[0], -1, args[1], -1, args[2], TCG_TYPE_I32); |
167 | } else { | 185 | + tcg_out_qemu_st(s, args[0], -1, args[1], args[2], TCG_TYPE_I32); |
168 | store_reg(s, a->rt, tmp); | 186 | break; |
169 | } | 187 | case INDEX_op_qemu_st_i64: |
170 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_single(DisasContext *s, arg_VMOV_single *a) | 188 | if (TCG_TARGET_REG_BITS == 64) { |
171 | /* general purpose register to VFP */ | 189 | - tcg_out_qemu_st(s, args[0], -1, args[1], -1, |
172 | tmp = load_reg(s, a->rt); | 190 | - args[2], TCG_TYPE_I64); |
173 | vfp_store_reg32(tmp, a->vn); | 191 | + tcg_out_qemu_st(s, args[0], -1, args[1], args[2], TCG_TYPE_I64); |
174 | - tcg_temp_free_i32(tmp); | 192 | } else { |
175 | } | 193 | - tcg_out_qemu_st(s, args[0], args[1], args[2], -1, |
176 | 194 | + tcg_out_qemu_st(s, args[0], args[1], args[2], | |
177 | return true; | 195 | args[3], TCG_TYPE_I64); |
178 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_64_sp(DisasContext *s, arg_VMOV_64_sp *a) | 196 | } |
179 | /* gpreg to fpreg */ | 197 | break; |
180 | tmp = load_reg(s, a->rt); | ||
181 | vfp_store_reg32(tmp, a->vm); | ||
182 | - tcg_temp_free_i32(tmp); | ||
183 | tmp = load_reg(s, a->rt2); | ||
184 | vfp_store_reg32(tmp, a->vm + 1); | ||
185 | - tcg_temp_free_i32(tmp); | ||
186 | } | ||
187 | |||
188 | return true; | ||
189 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_64_dp(DisasContext *s, arg_VMOV_64_dp *a) | ||
190 | /* gpreg to fpreg */ | ||
191 | tmp = load_reg(s, a->rt); | ||
192 | vfp_store_reg32(tmp, a->vm * 2); | ||
193 | - tcg_temp_free_i32(tmp); | ||
194 | tmp = load_reg(s, a->rt2); | ||
195 | vfp_store_reg32(tmp, a->vm * 2 + 1); | ||
196 | - tcg_temp_free_i32(tmp); | ||
197 | } | ||
198 | |||
199 | return true; | ||
200 | @@ -XXX,XX +XXX,XX @@ static bool trans_VLDR_VSTR_hp(DisasContext *s, arg_VLDR_VSTR_sp *a) | ||
201 | vfp_load_reg32(tmp, a->vd); | ||
202 | gen_aa32_st_i32(s, tmp, addr, get_mem_index(s), MO_UW | MO_ALIGN); | ||
203 | } | ||
204 | - tcg_temp_free_i32(tmp); | ||
205 | - tcg_temp_free_i32(addr); | ||
206 | - | ||
207 | return true; | ||
208 | } | ||
209 | |||
210 | @@ -XXX,XX +XXX,XX @@ static bool trans_VLDR_VSTR_sp(DisasContext *s, arg_VLDR_VSTR_sp *a) | ||
211 | vfp_load_reg32(tmp, a->vd); | ||
212 | gen_aa32_st_i32(s, tmp, addr, get_mem_index(s), MO_UL | MO_ALIGN); | ||
213 | } | ||
214 | - tcg_temp_free_i32(tmp); | ||
215 | - tcg_temp_free_i32(addr); | ||
216 | - | ||
217 | return true; | ||
218 | } | ||
219 | |||
220 | @@ -XXX,XX +XXX,XX @@ static bool trans_VLDR_VSTR_dp(DisasContext *s, arg_VLDR_VSTR_dp *a) | ||
221 | vfp_load_reg64(tmp, a->vd); | ||
222 | gen_aa32_st_i64(s, tmp, addr, get_mem_index(s), MO_UQ | MO_ALIGN_4); | ||
223 | } | ||
224 | - tcg_temp_free_i64(tmp); | ||
225 | - tcg_temp_free_i32(addr); | ||
226 | - | ||
227 | return true; | ||
228 | } | ||
229 | |||
230 | @@ -XXX,XX +XXX,XX @@ static bool trans_VLDM_VSTM_sp(DisasContext *s, arg_VLDM_VSTM_sp *a) | ||
231 | } | ||
232 | tcg_gen_addi_i32(addr, addr, offset); | ||
233 | } | ||
234 | - tcg_temp_free_i32(tmp); | ||
235 | if (a->w) { | ||
236 | /* writeback */ | ||
237 | if (a->p) { | ||
238 | @@ -XXX,XX +XXX,XX @@ static bool trans_VLDM_VSTM_sp(DisasContext *s, arg_VLDM_VSTM_sp *a) | ||
239 | tcg_gen_addi_i32(addr, addr, offset); | ||
240 | } | ||
241 | store_reg(s, a->rn, addr); | ||
242 | - } else { | ||
243 | - tcg_temp_free_i32(addr); | ||
244 | } | ||
245 | |||
246 | clear_eci_state(s); | ||
247 | @@ -XXX,XX +XXX,XX @@ static bool trans_VLDM_VSTM_dp(DisasContext *s, arg_VLDM_VSTM_dp *a) | ||
248 | } | ||
249 | tcg_gen_addi_i32(addr, addr, offset); | ||
250 | } | ||
251 | - tcg_temp_free_i64(tmp); | ||
252 | if (a->w) { | ||
253 | /* writeback */ | ||
254 | if (a->p) { | ||
255 | @@ -XXX,XX +XXX,XX @@ static bool trans_VLDM_VSTM_dp(DisasContext *s, arg_VLDM_VSTM_dp *a) | ||
256 | tcg_gen_addi_i32(addr, addr, offset); | ||
257 | } | ||
258 | store_reg(s, a->rn, addr); | ||
259 | - } else { | ||
260 | - tcg_temp_free_i32(addr); | ||
261 | } | ||
262 | |||
263 | clear_eci_state(s); | ||
264 | @@ -XXX,XX +XXX,XX @@ static bool do_vfp_3op_sp(DisasContext *s, VFPGen3OpSPFn *fn, | ||
265 | vfp_load_reg32(f1, vm); | ||
266 | } | ||
267 | } | ||
268 | - | ||
269 | - tcg_temp_free_i32(f0); | ||
270 | - tcg_temp_free_i32(f1); | ||
271 | - tcg_temp_free_i32(fd); | ||
272 | - tcg_temp_free_ptr(fpst); | ||
273 | - | ||
274 | return true; | ||
275 | } | ||
276 | |||
277 | @@ -XXX,XX +XXX,XX @@ static bool do_vfp_3op_hp(DisasContext *s, VFPGen3OpSPFn *fn, | ||
278 | } | ||
279 | fn(fd, f0, f1, fpst); | ||
280 | vfp_store_reg32(fd, vd); | ||
281 | - | ||
282 | - tcg_temp_free_i32(f0); | ||
283 | - tcg_temp_free_i32(f1); | ||
284 | - tcg_temp_free_i32(fd); | ||
285 | - tcg_temp_free_ptr(fpst); | ||
286 | - | ||
287 | return true; | ||
288 | } | ||
289 | |||
290 | @@ -XXX,XX +XXX,XX @@ static bool do_vfp_3op_dp(DisasContext *s, VFPGen3OpDPFn *fn, | ||
291 | vfp_load_reg64(f1, vm); | ||
292 | } | ||
293 | } | ||
294 | - | ||
295 | - tcg_temp_free_i64(f0); | ||
296 | - tcg_temp_free_i64(f1); | ||
297 | - tcg_temp_free_i64(fd); | ||
298 | - tcg_temp_free_ptr(fpst); | ||
299 | - | ||
300 | return true; | ||
301 | } | ||
302 | |||
303 | @@ -XXX,XX +XXX,XX @@ static bool do_vfp_2op_sp(DisasContext *s, VFPGen2OpSPFn *fn, int vd, int vm) | ||
304 | vm = vfp_advance_sreg(vm, delta_m); | ||
305 | vfp_load_reg32(f0, vm); | ||
306 | } | ||
307 | - | ||
308 | - tcg_temp_free_i32(f0); | ||
309 | - tcg_temp_free_i32(fd); | ||
310 | - | ||
311 | return true; | ||
312 | } | ||
313 | |||
314 | @@ -XXX,XX +XXX,XX @@ static bool do_vfp_2op_hp(DisasContext *s, VFPGen2OpSPFn *fn, int vd, int vm) | ||
315 | vfp_load_reg32(f0, vm); | ||
316 | fn(f0, f0); | ||
317 | vfp_store_reg32(f0, vd); | ||
318 | - tcg_temp_free_i32(f0); | ||
319 | |||
320 | return true; | ||
321 | } | ||
322 | @@ -XXX,XX +XXX,XX @@ static bool do_vfp_2op_dp(DisasContext *s, VFPGen2OpDPFn *fn, int vd, int vm) | ||
323 | vd = vfp_advance_dreg(vm, delta_m); | ||
324 | vfp_load_reg64(f0, vm); | ||
325 | } | ||
326 | - | ||
327 | - tcg_temp_free_i64(f0); | ||
328 | - tcg_temp_free_i64(fd); | ||
329 | - | ||
330 | return true; | ||
331 | } | ||
332 | |||
333 | @@ -XXX,XX +XXX,XX @@ static void gen_VMLA_hp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst) | ||
334 | |||
335 | gen_helper_vfp_mulh(tmp, vn, vm, fpst); | ||
336 | gen_helper_vfp_addh(vd, vd, tmp, fpst); | ||
337 | - tcg_temp_free_i32(tmp); | ||
338 | } | ||
339 | |||
340 | static bool trans_VMLA_hp(DisasContext *s, arg_VMLA_sp *a) | ||
341 | @@ -XXX,XX +XXX,XX @@ static void gen_VMLA_sp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst) | ||
342 | |||
343 | gen_helper_vfp_muls(tmp, vn, vm, fpst); | ||
344 | gen_helper_vfp_adds(vd, vd, tmp, fpst); | ||
345 | - tcg_temp_free_i32(tmp); | ||
346 | } | ||
347 | |||
348 | static bool trans_VMLA_sp(DisasContext *s, arg_VMLA_sp *a) | ||
349 | @@ -XXX,XX +XXX,XX @@ static void gen_VMLA_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst) | ||
350 | |||
351 | gen_helper_vfp_muld(tmp, vn, vm, fpst); | ||
352 | gen_helper_vfp_addd(vd, vd, tmp, fpst); | ||
353 | - tcg_temp_free_i64(tmp); | ||
354 | } | ||
355 | |||
356 | static bool trans_VMLA_dp(DisasContext *s, arg_VMLA_dp *a) | ||
357 | @@ -XXX,XX +XXX,XX @@ static void gen_VMLS_hp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst) | ||
358 | gen_helper_vfp_mulh(tmp, vn, vm, fpst); | ||
359 | gen_helper_vfp_negh(tmp, tmp); | ||
360 | gen_helper_vfp_addh(vd, vd, tmp, fpst); | ||
361 | - tcg_temp_free_i32(tmp); | ||
362 | } | ||
363 | |||
364 | static bool trans_VMLS_hp(DisasContext *s, arg_VMLS_sp *a) | ||
365 | @@ -XXX,XX +XXX,XX @@ static void gen_VMLS_sp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst) | ||
366 | gen_helper_vfp_muls(tmp, vn, vm, fpst); | ||
367 | gen_helper_vfp_negs(tmp, tmp); | ||
368 | gen_helper_vfp_adds(vd, vd, tmp, fpst); | ||
369 | - tcg_temp_free_i32(tmp); | ||
370 | } | ||
371 | |||
372 | static bool trans_VMLS_sp(DisasContext *s, arg_VMLS_sp *a) | ||
373 | @@ -XXX,XX +XXX,XX @@ static void gen_VMLS_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst) | ||
374 | gen_helper_vfp_muld(tmp, vn, vm, fpst); | ||
375 | gen_helper_vfp_negd(tmp, tmp); | ||
376 | gen_helper_vfp_addd(vd, vd, tmp, fpst); | ||
377 | - tcg_temp_free_i64(tmp); | ||
378 | } | ||
379 | |||
380 | static bool trans_VMLS_dp(DisasContext *s, arg_VMLS_dp *a) | ||
381 | @@ -XXX,XX +XXX,XX @@ static void gen_VNMLS_hp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst) | ||
382 | gen_helper_vfp_mulh(tmp, vn, vm, fpst); | ||
383 | gen_helper_vfp_negh(vd, vd); | ||
384 | gen_helper_vfp_addh(vd, vd, tmp, fpst); | ||
385 | - tcg_temp_free_i32(tmp); | ||
386 | } | ||
387 | |||
388 | static bool trans_VNMLS_hp(DisasContext *s, arg_VNMLS_sp *a) | ||
389 | @@ -XXX,XX +XXX,XX @@ static void gen_VNMLS_sp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst) | ||
390 | gen_helper_vfp_muls(tmp, vn, vm, fpst); | ||
391 | gen_helper_vfp_negs(vd, vd); | ||
392 | gen_helper_vfp_adds(vd, vd, tmp, fpst); | ||
393 | - tcg_temp_free_i32(tmp); | ||
394 | } | ||
395 | |||
396 | static bool trans_VNMLS_sp(DisasContext *s, arg_VNMLS_sp *a) | ||
397 | @@ -XXX,XX +XXX,XX @@ static void gen_VNMLS_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst) | ||
398 | gen_helper_vfp_muld(tmp, vn, vm, fpst); | ||
399 | gen_helper_vfp_negd(vd, vd); | ||
400 | gen_helper_vfp_addd(vd, vd, tmp, fpst); | ||
401 | - tcg_temp_free_i64(tmp); | ||
402 | } | ||
403 | |||
404 | static bool trans_VNMLS_dp(DisasContext *s, arg_VNMLS_dp *a) | ||
405 | @@ -XXX,XX +XXX,XX @@ static void gen_VNMLA_hp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst) | ||
406 | gen_helper_vfp_negh(tmp, tmp); | ||
407 | gen_helper_vfp_negh(vd, vd); | ||
408 | gen_helper_vfp_addh(vd, vd, tmp, fpst); | ||
409 | - tcg_temp_free_i32(tmp); | ||
410 | } | ||
411 | |||
412 | static bool trans_VNMLA_hp(DisasContext *s, arg_VNMLA_sp *a) | ||
413 | @@ -XXX,XX +XXX,XX @@ static void gen_VNMLA_sp(TCGv_i32 vd, TCGv_i32 vn, TCGv_i32 vm, TCGv_ptr fpst) | ||
414 | gen_helper_vfp_negs(tmp, tmp); | ||
415 | gen_helper_vfp_negs(vd, vd); | ||
416 | gen_helper_vfp_adds(vd, vd, tmp, fpst); | ||
417 | - tcg_temp_free_i32(tmp); | ||
418 | } | ||
419 | |||
420 | static bool trans_VNMLA_sp(DisasContext *s, arg_VNMLA_sp *a) | ||
421 | @@ -XXX,XX +XXX,XX @@ static void gen_VNMLA_dp(TCGv_i64 vd, TCGv_i64 vn, TCGv_i64 vm, TCGv_ptr fpst) | ||
422 | gen_helper_vfp_negd(tmp, tmp); | ||
423 | gen_helper_vfp_negd(vd, vd); | ||
424 | gen_helper_vfp_addd(vd, vd, tmp, fpst); | ||
425 | - tcg_temp_free_i64(tmp); | ||
426 | } | ||
427 | |||
428 | static bool trans_VNMLA_dp(DisasContext *s, arg_VNMLA_dp *a) | ||
429 | @@ -XXX,XX +XXX,XX @@ static bool do_vfm_hp(DisasContext *s, arg_VFMA_sp *a, bool neg_n, bool neg_d) | ||
430 | fpst = fpstatus_ptr(FPST_FPCR_F16); | ||
431 | gen_helper_vfp_muladdh(vd, vn, vm, vd, fpst); | ||
432 | vfp_store_reg32(vd, a->vd); | ||
433 | - | ||
434 | - tcg_temp_free_ptr(fpst); | ||
435 | - tcg_temp_free_i32(vn); | ||
436 | - tcg_temp_free_i32(vm); | ||
437 | - tcg_temp_free_i32(vd); | ||
438 | - | ||
439 | return true; | ||
440 | } | ||
441 | |||
442 | @@ -XXX,XX +XXX,XX @@ static bool do_vfm_sp(DisasContext *s, arg_VFMA_sp *a, bool neg_n, bool neg_d) | ||
443 | fpst = fpstatus_ptr(FPST_FPCR); | ||
444 | gen_helper_vfp_muladds(vd, vn, vm, vd, fpst); | ||
445 | vfp_store_reg32(vd, a->vd); | ||
446 | - | ||
447 | - tcg_temp_free_ptr(fpst); | ||
448 | - tcg_temp_free_i32(vn); | ||
449 | - tcg_temp_free_i32(vm); | ||
450 | - tcg_temp_free_i32(vd); | ||
451 | - | ||
452 | return true; | ||
453 | } | ||
454 | |||
455 | @@ -XXX,XX +XXX,XX @@ static bool do_vfm_dp(DisasContext *s, arg_VFMA_dp *a, bool neg_n, bool neg_d) | ||
456 | fpst = fpstatus_ptr(FPST_FPCR); | ||
457 | gen_helper_vfp_muladdd(vd, vn, vm, vd, fpst); | ||
458 | vfp_store_reg64(vd, a->vd); | ||
459 | - | ||
460 | - tcg_temp_free_ptr(fpst); | ||
461 | - tcg_temp_free_i64(vn); | ||
462 | - tcg_temp_free_i64(vm); | ||
463 | - tcg_temp_free_i64(vd); | ||
464 | - | ||
465 | return true; | ||
466 | } | ||
467 | |||
468 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCMP_hp(DisasContext *s, arg_VCMP_sp *a) | ||
469 | } else { | ||
470 | gen_helper_vfp_cmph(vd, vm, cpu_env); | ||
471 | } | ||
472 | - | ||
473 | - tcg_temp_free_i32(vd); | ||
474 | - tcg_temp_free_i32(vm); | ||
475 | - | ||
476 | return true; | ||
477 | } | ||
478 | |||
479 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCMP_sp(DisasContext *s, arg_VCMP_sp *a) | ||
480 | } else { | ||
481 | gen_helper_vfp_cmps(vd, vm, cpu_env); | ||
482 | } | ||
483 | - | ||
484 | - tcg_temp_free_i32(vd); | ||
485 | - tcg_temp_free_i32(vm); | ||
486 | - | ||
487 | return true; | ||
488 | } | ||
489 | |||
490 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCMP_dp(DisasContext *s, arg_VCMP_dp *a) | ||
491 | } else { | ||
492 | gen_helper_vfp_cmpd(vd, vm, cpu_env); | ||
493 | } | ||
494 | - | ||
495 | - tcg_temp_free_i64(vd); | ||
496 | - tcg_temp_free_i64(vm); | ||
497 | - | ||
498 | return true; | ||
499 | } | ||
500 | |||
501 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f32_f16(DisasContext *s, arg_VCVT_f32_f16 *a) | ||
502 | tcg_gen_ld16u_i32(tmp, cpu_env, vfp_f16_offset(a->vm, a->t)); | ||
503 | gen_helper_vfp_fcvt_f16_to_f32(tmp, tmp, fpst, ahp_mode); | ||
504 | vfp_store_reg32(tmp, a->vd); | ||
505 | - tcg_temp_free_i32(ahp_mode); | ||
506 | - tcg_temp_free_ptr(fpst); | ||
507 | - tcg_temp_free_i32(tmp); | ||
508 | return true; | ||
509 | } | ||
510 | |||
511 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f64_f16(DisasContext *s, arg_VCVT_f64_f16 *a) | ||
512 | vd = tcg_temp_new_i64(); | ||
513 | gen_helper_vfp_fcvt_f16_to_f64(vd, tmp, fpst, ahp_mode); | ||
514 | vfp_store_reg64(vd, a->vd); | ||
515 | - tcg_temp_free_i32(ahp_mode); | ||
516 | - tcg_temp_free_ptr(fpst); | ||
517 | - tcg_temp_free_i32(tmp); | ||
518 | - tcg_temp_free_i64(vd); | ||
519 | return true; | ||
520 | } | ||
521 | |||
522 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_b16_f32(DisasContext *s, arg_VCVT_b16_f32 *a) | ||
523 | vfp_load_reg32(tmp, a->vm); | ||
524 | gen_helper_bfcvt(tmp, tmp, fpst); | ||
525 | tcg_gen_st16_i32(tmp, cpu_env, vfp_f16_offset(a->vd, a->t)); | ||
526 | - tcg_temp_free_ptr(fpst); | ||
527 | - tcg_temp_free_i32(tmp); | ||
528 | return true; | ||
529 | } | ||
530 | |||
531 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f16_f32(DisasContext *s, arg_VCVT_f16_f32 *a) | ||
532 | vfp_load_reg32(tmp, a->vm); | ||
533 | gen_helper_vfp_fcvt_f32_to_f16(tmp, tmp, fpst, ahp_mode); | ||
534 | tcg_gen_st16_i32(tmp, cpu_env, vfp_f16_offset(a->vd, a->t)); | ||
535 | - tcg_temp_free_i32(ahp_mode); | ||
536 | - tcg_temp_free_ptr(fpst); | ||
537 | - tcg_temp_free_i32(tmp); | ||
538 | return true; | ||
539 | } | ||
540 | |||
541 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_f16_f64(DisasContext *s, arg_VCVT_f16_f64 *a) | ||
542 | |||
543 | vfp_load_reg64(vm, a->vm); | ||
544 | gen_helper_vfp_fcvt_f64_to_f16(tmp, vm, fpst, ahp_mode); | ||
545 | - tcg_temp_free_i64(vm); | ||
546 | tcg_gen_st16_i32(tmp, cpu_env, vfp_f16_offset(a->vd, a->t)); | ||
547 | - tcg_temp_free_i32(ahp_mode); | ||
548 | - tcg_temp_free_ptr(fpst); | ||
549 | - tcg_temp_free_i32(tmp); | ||
550 | return true; | ||
551 | } | ||
552 | |||
553 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINTR_hp(DisasContext *s, arg_VRINTR_sp *a) | ||
554 | fpst = fpstatus_ptr(FPST_FPCR_F16); | ||
555 | gen_helper_rinth(tmp, tmp, fpst); | ||
556 | vfp_store_reg32(tmp, a->vd); | ||
557 | - tcg_temp_free_ptr(fpst); | ||
558 | - tcg_temp_free_i32(tmp); | ||
559 | return true; | ||
560 | } | ||
561 | |||
562 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINTR_sp(DisasContext *s, arg_VRINTR_sp *a) | ||
563 | fpst = fpstatus_ptr(FPST_FPCR); | ||
564 | gen_helper_rints(tmp, tmp, fpst); | ||
565 | vfp_store_reg32(tmp, a->vd); | ||
566 | - tcg_temp_free_ptr(fpst); | ||
567 | - tcg_temp_free_i32(tmp); | ||
568 | return true; | ||
569 | } | ||
570 | |||
571 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINTR_dp(DisasContext *s, arg_VRINTR_dp *a) | ||
572 | fpst = fpstatus_ptr(FPST_FPCR); | ||
573 | gen_helper_rintd(tmp, tmp, fpst); | ||
574 | vfp_store_reg64(tmp, a->vd); | ||
575 | - tcg_temp_free_ptr(fpst); | ||
576 | - tcg_temp_free_i64(tmp); | ||
577 | return true; | ||
578 | } | ||
579 | |||
580 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINTZ_hp(DisasContext *s, arg_VRINTZ_sp *a) | ||
581 | gen_helper_rinth(tmp, tmp, fpst); | ||
582 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst); | ||
583 | vfp_store_reg32(tmp, a->vd); | ||
584 | - tcg_temp_free_ptr(fpst); | ||
585 | - tcg_temp_free_i32(tcg_rmode); | ||
586 | - tcg_temp_free_i32(tmp); | ||
587 | return true; | ||
588 | } | ||
589 | |||
590 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINTZ_sp(DisasContext *s, arg_VRINTZ_sp *a) | ||
591 | gen_helper_rints(tmp, tmp, fpst); | ||
592 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst); | ||
593 | vfp_store_reg32(tmp, a->vd); | ||
594 | - tcg_temp_free_ptr(fpst); | ||
595 | - tcg_temp_free_i32(tcg_rmode); | ||
596 | - tcg_temp_free_i32(tmp); | ||
597 | return true; | ||
598 | } | ||
599 | |||
600 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINTZ_dp(DisasContext *s, arg_VRINTZ_dp *a) | ||
601 | gen_helper_rintd(tmp, tmp, fpst); | ||
602 | gen_helper_set_rmode(tcg_rmode, tcg_rmode, fpst); | ||
603 | vfp_store_reg64(tmp, a->vd); | ||
604 | - tcg_temp_free_ptr(fpst); | ||
605 | - tcg_temp_free_i64(tmp); | ||
606 | - tcg_temp_free_i32(tcg_rmode); | ||
607 | return true; | ||
608 | } | ||
609 | |||
610 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINTX_hp(DisasContext *s, arg_VRINTX_sp *a) | ||
611 | fpst = fpstatus_ptr(FPST_FPCR_F16); | ||
612 | gen_helper_rinth_exact(tmp, tmp, fpst); | ||
613 | vfp_store_reg32(tmp, a->vd); | ||
614 | - tcg_temp_free_ptr(fpst); | ||
615 | - tcg_temp_free_i32(tmp); | ||
616 | return true; | ||
617 | } | ||
618 | |||
619 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINTX_sp(DisasContext *s, arg_VRINTX_sp *a) | ||
620 | fpst = fpstatus_ptr(FPST_FPCR); | ||
621 | gen_helper_rints_exact(tmp, tmp, fpst); | ||
622 | vfp_store_reg32(tmp, a->vd); | ||
623 | - tcg_temp_free_ptr(fpst); | ||
624 | - tcg_temp_free_i32(tmp); | ||
625 | return true; | ||
626 | } | ||
627 | |||
628 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINTX_dp(DisasContext *s, arg_VRINTX_dp *a) | ||
629 | fpst = fpstatus_ptr(FPST_FPCR); | ||
630 | gen_helper_rintd_exact(tmp, tmp, fpst); | ||
631 | vfp_store_reg64(tmp, a->vd); | ||
632 | - tcg_temp_free_ptr(fpst); | ||
633 | - tcg_temp_free_i64(tmp); | ||
634 | return true; | ||
635 | } | ||
636 | |||
637 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_sp(DisasContext *s, arg_VCVT_sp *a) | ||
638 | vfp_load_reg32(vm, a->vm); | ||
639 | gen_helper_vfp_fcvtds(vd, vm, cpu_env); | ||
640 | vfp_store_reg64(vd, a->vd); | ||
641 | - tcg_temp_free_i32(vm); | ||
642 | - tcg_temp_free_i64(vd); | ||
643 | return true; | ||
644 | } | ||
645 | |||
646 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_dp(DisasContext *s, arg_VCVT_dp *a) | ||
647 | vfp_load_reg64(vm, a->vm); | ||
648 | gen_helper_vfp_fcvtsd(vd, vm, cpu_env); | ||
649 | vfp_store_reg32(vd, a->vd); | ||
650 | - tcg_temp_free_i32(vd); | ||
651 | - tcg_temp_free_i64(vm); | ||
652 | return true; | ||
653 | } | ||
654 | |||
655 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_int_hp(DisasContext *s, arg_VCVT_int_sp *a) | ||
656 | gen_helper_vfp_uitoh(vm, vm, fpst); | ||
657 | } | ||
658 | vfp_store_reg32(vm, a->vd); | ||
659 | - tcg_temp_free_i32(vm); | ||
660 | - tcg_temp_free_ptr(fpst); | ||
661 | return true; | ||
662 | } | ||
663 | |||
664 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_int_sp(DisasContext *s, arg_VCVT_int_sp *a) | ||
665 | gen_helper_vfp_uitos(vm, vm, fpst); | ||
666 | } | ||
667 | vfp_store_reg32(vm, a->vd); | ||
668 | - tcg_temp_free_i32(vm); | ||
669 | - tcg_temp_free_ptr(fpst); | ||
670 | return true; | ||
671 | } | ||
672 | |||
673 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_int_dp(DisasContext *s, arg_VCVT_int_dp *a) | ||
674 | gen_helper_vfp_uitod(vd, vm, fpst); | ||
675 | } | ||
676 | vfp_store_reg64(vd, a->vd); | ||
677 | - tcg_temp_free_i32(vm); | ||
678 | - tcg_temp_free_i64(vd); | ||
679 | - tcg_temp_free_ptr(fpst); | ||
680 | return true; | ||
681 | } | ||
682 | |||
683 | @@ -XXX,XX +XXX,XX @@ static bool trans_VJCVT(DisasContext *s, arg_VJCVT *a) | ||
684 | vfp_load_reg64(vm, a->vm); | ||
685 | gen_helper_vjcvt(vd, vm, cpu_env); | ||
686 | vfp_store_reg32(vd, a->vd); | ||
687 | - tcg_temp_free_i64(vm); | ||
688 | - tcg_temp_free_i32(vd); | ||
689 | return true; | ||
690 | } | ||
691 | |||
692 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_fix_hp(DisasContext *s, arg_VCVT_fix_sp *a) | ||
693 | } | ||
694 | |||
695 | vfp_store_reg32(vd, a->vd); | ||
696 | - tcg_temp_free_i32(vd); | ||
697 | - tcg_temp_free_ptr(fpst); | ||
698 | return true; | ||
699 | } | ||
700 | |||
701 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_fix_sp(DisasContext *s, arg_VCVT_fix_sp *a) | ||
702 | } | ||
703 | |||
704 | vfp_store_reg32(vd, a->vd); | ||
705 | - tcg_temp_free_i32(vd); | ||
706 | - tcg_temp_free_ptr(fpst); | ||
707 | return true; | ||
708 | } | ||
709 | |||
710 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_fix_dp(DisasContext *s, arg_VCVT_fix_dp *a) | ||
711 | } | ||
712 | |||
713 | vfp_store_reg64(vd, a->vd); | ||
714 | - tcg_temp_free_i64(vd); | ||
715 | - tcg_temp_free_ptr(fpst); | ||
716 | return true; | ||
717 | } | ||
718 | |||
719 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_hp_int(DisasContext *s, arg_VCVT_sp_int *a) | ||
720 | } | ||
721 | } | ||
722 | vfp_store_reg32(vm, a->vd); | ||
723 | - tcg_temp_free_i32(vm); | ||
724 | - tcg_temp_free_ptr(fpst); | ||
725 | return true; | ||
726 | } | ||
727 | |||
728 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_sp_int(DisasContext *s, arg_VCVT_sp_int *a) | ||
729 | } | ||
730 | } | ||
731 | vfp_store_reg32(vm, a->vd); | ||
732 | - tcg_temp_free_i32(vm); | ||
733 | - tcg_temp_free_ptr(fpst); | ||
734 | return true; | ||
735 | } | ||
736 | |||
737 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_dp_int(DisasContext *s, arg_VCVT_dp_int *a) | ||
738 | } | ||
739 | } | ||
740 | vfp_store_reg32(vd, a->vd); | ||
741 | - tcg_temp_free_i32(vd); | ||
742 | - tcg_temp_free_i64(vm); | ||
743 | - tcg_temp_free_ptr(fpst); | ||
744 | return true; | ||
745 | } | ||
746 | |||
747 | @@ -XXX,XX +XXX,XX @@ static bool trans_VINS(DisasContext *s, arg_VINS *a) | ||
748 | vfp_load_reg32(rd, a->vd); | ||
749 | tcg_gen_deposit_i32(rd, rd, rm, 16, 16); | ||
750 | vfp_store_reg32(rd, a->vd); | ||
751 | - tcg_temp_free_i32(rm); | ||
752 | - tcg_temp_free_i32(rd); | ||
753 | return true; | ||
754 | } | ||
755 | |||
756 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMOVX(DisasContext *s, arg_VINS *a) | ||
757 | vfp_load_reg32(rm, a->vm); | ||
758 | tcg_gen_shri_i32(rm, rm, 16); | ||
759 | vfp_store_reg32(rm, a->vd); | ||
760 | - tcg_temp_free_i32(rm); | ||
761 | return true; | ||
762 | } | ||
763 | -- | 198 | -- |
764 | 2.34.1 | 199 | 2.43.0 |
200 | |||
201 | diff view generated by jsdifflib |
1 | Replace the two uses of asm to expand xgetbv with an inline function. | 1 | There is now always only one guest address register. |
---|---|---|---|
2 | Since one of the two has been using the mnemonic, assume that the | ||
3 | comment about "older versions of the assember" is obsolete, as even | ||
4 | that is 4 years old. | ||
5 | 2 | ||
6 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | 3 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> |
7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
8 | --- | 5 | --- |
9 | include/qemu/cpuid.h | 7 +++++++ | 6 | tcg/tcg.c | 18 +++++++++--------- |
10 | util/bufferiszero.c | 3 +-- | 7 | tcg/aarch64/tcg-target.c.inc | 4 ++-- |
11 | tcg/i386/tcg-target.c.inc | 11 ++++------- | 8 | tcg/arm/tcg-target.c.inc | 4 ++-- |
12 | 3 files changed, 12 insertions(+), 9 deletions(-) | 9 | tcg/i386/tcg-target.c.inc | 4 ++-- |
13 | 10 | tcg/loongarch64/tcg-target.c.inc | 4 ++-- | |
14 | diff --git a/include/qemu/cpuid.h b/include/qemu/cpuid.h | 11 | tcg/mips/tcg-target.c.inc | 4 ++-- |
15 | index XXXXXXX..XXXXXXX 100644 | 12 | tcg/ppc/tcg-target.c.inc | 4 ++-- |
16 | --- a/include/qemu/cpuid.h | 13 | tcg/riscv/tcg-target.c.inc | 4 ++-- |
17 | +++ b/include/qemu/cpuid.h | 14 | tcg/s390x/tcg-target.c.inc | 4 ++-- |
18 | @@ -XXX,XX +XXX,XX @@ | 15 | tcg/sparc64/tcg-target.c.inc | 4 ++-- |
19 | #define bit_LZCNT (1 << 5) | 16 | 10 files changed, 27 insertions(+), 27 deletions(-) |
20 | #endif | 17 | |
21 | 18 | diff --git a/tcg/tcg.c b/tcg/tcg.c | |
22 | +static inline unsigned xgetbv_low(unsigned c) | 19 | index XXXXXXX..XXXXXXX 100644 |
23 | +{ | 20 | --- a/tcg/tcg.c |
24 | + unsigned a, d; | 21 | +++ b/tcg/tcg.c |
25 | + asm("xgetbv" : "=a"(a), "=d"(d) : "c"(c)); | 22 | @@ -XXX,XX +XXX,XX @@ struct TCGLabelQemuLdst { |
26 | + return a; | 23 | bool is_ld; /* qemu_ld: true, qemu_st: false */ |
27 | +} | 24 | MemOpIdx oi; |
28 | + | 25 | TCGType type; /* result type of a load */ |
29 | #endif /* QEMU_CPUID_H */ | 26 | - TCGReg addrlo_reg; /* reg index for low word of guest virtual addr */ |
30 | diff --git a/util/bufferiszero.c b/util/bufferiszero.c | 27 | - TCGReg addrhi_reg; /* reg index for high word of guest virtual addr */ |
31 | index XXXXXXX..XXXXXXX 100644 | 28 | + TCGReg addr_reg; /* reg index for guest virtual addr */ |
32 | --- a/util/bufferiszero.c | 29 | TCGReg datalo_reg; /* reg index for low word to be loaded or stored */ |
33 | +++ b/util/bufferiszero.c | 30 | TCGReg datahi_reg; /* reg index for high word to be loaded or stored */ |
34 | @@ -XXX,XX +XXX,XX @@ static void __attribute__((constructor)) init_cpuid_cache(void) | 31 | const tcg_insn_unit *raddr; /* addr of the next IR of qemu_ld/st IR */ |
35 | 32 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_ld_helper_args(TCGContext *s, const TCGLabelQemuLdst *ldst, | |
36 | /* We must check that AVX is not just available, but usable. */ | 33 | */ |
37 | if ((c & bit_OSXSAVE) && (c & bit_AVX) && max >= 7) { | 34 | tcg_out_helper_add_mov(mov, loc + HOST_BIG_ENDIAN, |
38 | - int bv; | 35 | TCG_TYPE_I32, TCG_TYPE_I32, |
39 | - __asm("xgetbv" : "=a"(bv), "=d"(d) : "c"(0)); | 36 | - ldst->addrlo_reg, -1); |
40 | + unsigned bv = xgetbv_low(0); | 37 | + ldst->addr_reg, -1); |
41 | __cpuid_count(7, 0, a, b, c, d); | 38 | tcg_out_helper_load_slots(s, 1, mov, parm); |
42 | if ((bv & 0x6) == 0x6 && (b & bit_AVX2)) { | 39 | |
43 | cache |= CACHE_AVX2; | 40 | tcg_out_helper_load_imm(s, loc[!HOST_BIG_ENDIAN].arg_slot, |
41 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_ld_helper_args(TCGContext *s, const TCGLabelQemuLdst *ldst, | ||
42 | next_arg += 2; | ||
43 | } else { | ||
44 | nmov = tcg_out_helper_add_mov(mov, loc, TCG_TYPE_I64, s->addr_type, | ||
45 | - ldst->addrlo_reg, ldst->addrhi_reg); | ||
46 | + ldst->addr_reg, -1); | ||
47 | tcg_out_helper_load_slots(s, nmov, mov, parm); | ||
48 | next_arg += nmov; | ||
49 | } | ||
50 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_st_helper_args(TCGContext *s, const TCGLabelQemuLdst *ldst, | ||
51 | |||
52 | /* Handle addr argument. */ | ||
53 | loc = &info->in[next_arg]; | ||
54 | - if (TCG_TARGET_REG_BITS == 32 && s->addr_type == TCG_TYPE_I32) { | ||
55 | + tcg_debug_assert(s->addr_type <= TCG_TYPE_REG); | ||
56 | + if (TCG_TARGET_REG_BITS == 32) { | ||
57 | /* | ||
58 | - * 32-bit host with 32-bit guest: zero-extend the guest address | ||
59 | + * 32-bit host (and thus 32-bit guest): zero-extend the guest address | ||
60 | * to 64-bits for the helper by storing the low part. Later, | ||
61 | * after we have processed the register inputs, we will load a | ||
62 | * zero for the high part. | ||
63 | */ | ||
64 | tcg_out_helper_add_mov(mov, loc + HOST_BIG_ENDIAN, | ||
65 | TCG_TYPE_I32, TCG_TYPE_I32, | ||
66 | - ldst->addrlo_reg, -1); | ||
67 | + ldst->addr_reg, -1); | ||
68 | next_arg += 2; | ||
69 | nmov += 1; | ||
70 | } else { | ||
71 | n = tcg_out_helper_add_mov(mov, loc, TCG_TYPE_I64, s->addr_type, | ||
72 | - ldst->addrlo_reg, ldst->addrhi_reg); | ||
73 | + ldst->addr_reg, -1); | ||
74 | next_arg += n; | ||
75 | nmov += n; | ||
76 | } | ||
77 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_st_helper_args(TCGContext *s, const TCGLabelQemuLdst *ldst, | ||
78 | g_assert_not_reached(); | ||
79 | } | ||
80 | |||
81 | - if (TCG_TARGET_REG_BITS == 32 && s->addr_type == TCG_TYPE_I32) { | ||
82 | + if (TCG_TARGET_REG_BITS == 32) { | ||
83 | /* Zero extend the address by loading a zero for the high part. */ | ||
84 | loc = &info->in[1 + !HOST_BIG_ENDIAN]; | ||
85 | tcg_out_helper_load_imm(s, loc->arg_slot, TCG_TYPE_I32, 0, parm); | ||
86 | diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc | ||
87 | index XXXXXXX..XXXXXXX 100644 | ||
88 | --- a/tcg/aarch64/tcg-target.c.inc | ||
89 | +++ b/tcg/aarch64/tcg-target.c.inc | ||
90 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
91 | ldst = new_ldst_label(s); | ||
92 | ldst->is_ld = is_ld; | ||
93 | ldst->oi = oi; | ||
94 | - ldst->addrlo_reg = addr_reg; | ||
95 | + ldst->addr_reg = addr_reg; | ||
96 | |||
97 | mask_type = (s->page_bits + s->tlb_dyn_max_bits > 32 | ||
98 | ? TCG_TYPE_I64 : TCG_TYPE_I32); | ||
99 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
100 | |||
101 | ldst->is_ld = is_ld; | ||
102 | ldst->oi = oi; | ||
103 | - ldst->addrlo_reg = addr_reg; | ||
104 | + ldst->addr_reg = addr_reg; | ||
105 | |||
106 | /* tst addr, #mask */ | ||
107 | tcg_out_logicali(s, I3404_ANDSI, 0, TCG_REG_XZR, addr_reg, a_mask); | ||
108 | diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc | ||
109 | index XXXXXXX..XXXXXXX 100644 | ||
110 | --- a/tcg/arm/tcg-target.c.inc | ||
111 | +++ b/tcg/arm/tcg-target.c.inc | ||
112 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
113 | ldst = new_ldst_label(s); | ||
114 | ldst->is_ld = is_ld; | ||
115 | ldst->oi = oi; | ||
116 | - ldst->addrlo_reg = addr; | ||
117 | + ldst->addr_reg = addr; | ||
118 | |||
119 | /* Load cpu->neg.tlb.f[mmu_idx].{mask,table} into {r0,r1}. */ | ||
120 | QEMU_BUILD_BUG_ON(offsetof(CPUTLBDescFast, mask) != 0); | ||
121 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
122 | ldst = new_ldst_label(s); | ||
123 | ldst->is_ld = is_ld; | ||
124 | ldst->oi = oi; | ||
125 | - ldst->addrlo_reg = addr; | ||
126 | + ldst->addr_reg = addr; | ||
127 | |||
128 | /* We are expecting alignment to max out at 7 */ | ||
129 | tcg_debug_assert(a_mask <= 0xff); | ||
44 | diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc | 130 | diff --git a/tcg/i386/tcg-target.c.inc b/tcg/i386/tcg-target.c.inc |
45 | index XXXXXXX..XXXXXXX 100644 | 131 | index XXXXXXX..XXXXXXX 100644 |
46 | --- a/tcg/i386/tcg-target.c.inc | 132 | --- a/tcg/i386/tcg-target.c.inc |
47 | +++ b/tcg/i386/tcg-target.c.inc | 133 | +++ b/tcg/i386/tcg-target.c.inc |
48 | @@ -XXX,XX +XXX,XX @@ static void tcg_target_init(TCGContext *s) | 134 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
49 | /* There are a number of things we must check before we can be | 135 | ldst = new_ldst_label(s); |
50 | sure of not hitting invalid opcode. */ | 136 | ldst->is_ld = is_ld; |
51 | if (c & bit_OSXSAVE) { | 137 | ldst->oi = oi; |
52 | - unsigned xcrl, xcrh; | 138 | - ldst->addrlo_reg = addr; |
53 | - /* The xgetbv instruction is not available to older versions of | 139 | + ldst->addr_reg = addr; |
54 | - * the assembler, so we encode the instruction manually. | 140 | |
55 | - */ | 141 | if (TCG_TARGET_REG_BITS == 64) { |
56 | - asm(".byte 0x0f, 0x01, 0xd0" : "=a" (xcrl), "=d" (xcrh) : "c" (0)); | 142 | ttype = s->addr_type; |
57 | - if ((xcrl & 6) == 6) { | 143 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
58 | + unsigned bv = xgetbv_low(0); | 144 | ldst = new_ldst_label(s); |
59 | + | 145 | ldst->is_ld = is_ld; |
60 | + if ((bv & 6) == 6) { | 146 | ldst->oi = oi; |
61 | have_avx1 = (c & bit_AVX) != 0; | 147 | - ldst->addrlo_reg = addr; |
62 | have_avx2 = (b7 & bit_AVX2) != 0; | 148 | + ldst->addr_reg = addr; |
63 | 149 | ||
64 | @@ -XXX,XX +XXX,XX @@ static void tcg_target_init(TCGContext *s) | 150 | /* jne slow_path */ |
65 | * check that OPMASK and all extended ZMM state are enabled | 151 | jcc = tcg_out_cmp(s, TCG_COND_TSTNE, addr, a_mask, true, false); |
66 | * even if we're not using them -- the insns will fault. | 152 | diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc |
67 | */ | 153 | index XXXXXXX..XXXXXXX 100644 |
68 | - if ((xcrl & 0xe0) == 0xe0 | 154 | --- a/tcg/loongarch64/tcg-target.c.inc |
69 | + if ((bv & 0xe0) == 0xe0 | 155 | +++ b/tcg/loongarch64/tcg-target.c.inc |
70 | && (b7 & bit_AVX512F) | 156 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, |
71 | && (b7 & bit_AVX512VL)) { | 157 | ldst = new_ldst_label(s); |
72 | have_avx512vl = true; | 158 | ldst->is_ld = is_ld; |
159 | ldst->oi = oi; | ||
160 | - ldst->addrlo_reg = addr_reg; | ||
161 | + ldst->addr_reg = addr_reg; | ||
162 | |||
163 | tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP0, TCG_AREG0, mask_ofs); | ||
164 | tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP1, TCG_AREG0, table_ofs); | ||
165 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
166 | |||
167 | ldst->is_ld = is_ld; | ||
168 | ldst->oi = oi; | ||
169 | - ldst->addrlo_reg = addr_reg; | ||
170 | + ldst->addr_reg = addr_reg; | ||
171 | |||
172 | /* | ||
173 | * Without micro-architecture details, we don't know which of | ||
174 | diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc | ||
175 | index XXXXXXX..XXXXXXX 100644 | ||
176 | --- a/tcg/mips/tcg-target.c.inc | ||
177 | +++ b/tcg/mips/tcg-target.c.inc | ||
178 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
179 | ldst = new_ldst_label(s); | ||
180 | ldst->is_ld = is_ld; | ||
181 | ldst->oi = oi; | ||
182 | - ldst->addrlo_reg = addr; | ||
183 | + ldst->addr_reg = addr; | ||
184 | |||
185 | /* Load tlb_mask[mmu_idx] and tlb_table[mmu_idx]. */ | ||
186 | tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP0, TCG_AREG0, mask_off); | ||
187 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
188 | |||
189 | ldst->is_ld = is_ld; | ||
190 | ldst->oi = oi; | ||
191 | - ldst->addrlo_reg = addr; | ||
192 | + ldst->addr_reg = addr; | ||
193 | |||
194 | /* We are expecting a_bits to max out at 7, much lower than ANDI. */ | ||
195 | tcg_debug_assert(a_bits < 16); | ||
196 | diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc | ||
197 | index XXXXXXX..XXXXXXX 100644 | ||
198 | --- a/tcg/ppc/tcg-target.c.inc | ||
199 | +++ b/tcg/ppc/tcg-target.c.inc | ||
200 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
201 | ldst = new_ldst_label(s); | ||
202 | ldst->is_ld = is_ld; | ||
203 | ldst->oi = oi; | ||
204 | - ldst->addrlo_reg = addr; | ||
205 | + ldst->addr_reg = addr; | ||
206 | |||
207 | /* Load tlb_mask[mmu_idx] and tlb_table[mmu_idx]. */ | ||
208 | tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP1, TCG_AREG0, mask_off); | ||
209 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
210 | ldst = new_ldst_label(s); | ||
211 | ldst->is_ld = is_ld; | ||
212 | ldst->oi = oi; | ||
213 | - ldst->addrlo_reg = addr; | ||
214 | + ldst->addr_reg = addr; | ||
215 | |||
216 | /* We are expecting a_bits to max out at 7, much lower than ANDI. */ | ||
217 | tcg_debug_assert(a_bits < 16); | ||
218 | diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc | ||
219 | index XXXXXXX..XXXXXXX 100644 | ||
220 | --- a/tcg/riscv/tcg-target.c.inc | ||
221 | +++ b/tcg/riscv/tcg-target.c.inc | ||
222 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, TCGReg *pbase, | ||
223 | ldst = new_ldst_label(s); | ||
224 | ldst->is_ld = is_ld; | ||
225 | ldst->oi = oi; | ||
226 | - ldst->addrlo_reg = addr_reg; | ||
227 | + ldst->addr_reg = addr_reg; | ||
228 | |||
229 | init_setting_vtype(s); | ||
230 | |||
231 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, TCGReg *pbase, | ||
232 | ldst = new_ldst_label(s); | ||
233 | ldst->is_ld = is_ld; | ||
234 | ldst->oi = oi; | ||
235 | - ldst->addrlo_reg = addr_reg; | ||
236 | + ldst->addr_reg = addr_reg; | ||
237 | |||
238 | init_setting_vtype(s); | ||
239 | |||
240 | diff --git a/tcg/s390x/tcg-target.c.inc b/tcg/s390x/tcg-target.c.inc | ||
241 | index XXXXXXX..XXXXXXX 100644 | ||
242 | --- a/tcg/s390x/tcg-target.c.inc | ||
243 | +++ b/tcg/s390x/tcg-target.c.inc | ||
244 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
245 | ldst = new_ldst_label(s); | ||
246 | ldst->is_ld = is_ld; | ||
247 | ldst->oi = oi; | ||
248 | - ldst->addrlo_reg = addr_reg; | ||
249 | + ldst->addr_reg = addr_reg; | ||
250 | |||
251 | tcg_out_sh64(s, RSY_SRLG, TCG_TMP0, addr_reg, TCG_REG_NONE, | ||
252 | s->page_bits - CPU_TLB_ENTRY_BITS); | ||
253 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
254 | ldst = new_ldst_label(s); | ||
255 | ldst->is_ld = is_ld; | ||
256 | ldst->oi = oi; | ||
257 | - ldst->addrlo_reg = addr_reg; | ||
258 | + ldst->addr_reg = addr_reg; | ||
259 | |||
260 | tcg_debug_assert(a_mask <= 0xffff); | ||
261 | tcg_out_insn(s, RI, TMLL, addr_reg, a_mask); | ||
262 | diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc | ||
263 | index XXXXXXX..XXXXXXX 100644 | ||
264 | --- a/tcg/sparc64/tcg-target.c.inc | ||
265 | +++ b/tcg/sparc64/tcg-target.c.inc | ||
266 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
267 | ldst = new_ldst_label(s); | ||
268 | ldst->is_ld = is_ld; | ||
269 | ldst->oi = oi; | ||
270 | - ldst->addrlo_reg = addr_reg; | ||
271 | + ldst->addr_reg = addr_reg; | ||
272 | ldst->label_ptr[0] = s->code_ptr; | ||
273 | |||
274 | /* bne,pn %[xi]cc, label0 */ | ||
275 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
276 | ldst = new_ldst_label(s); | ||
277 | ldst->is_ld = is_ld; | ||
278 | ldst->oi = oi; | ||
279 | - ldst->addrlo_reg = addr_reg; | ||
280 | + ldst->addr_reg = addr_reg; | ||
281 | ldst->label_ptr[0] = s->code_ptr; | ||
282 | |||
283 | /* bne,pn %icc, label0 */ | ||
73 | -- | 284 | -- |
74 | 2.34.1 | 285 | 2.43.0 |
75 | 286 | ||
76 | 287 | diff view generated by jsdifflib |
1 | Success from trans_* subroutines should be true. | 1 | The declaration uses uint64_t for addr. |
---|---|---|---|
2 | 2 | ||
3 | Fixes: 5fa38eedbd ("target/mips: Convert Vr54xx MACC* opcodes to decodetree") | 3 | Fixes: 595cd9ce2ec ("plugins: add plugin API to read guest memory") |
4 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | 4 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> |
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
6 | --- | 6 | --- |
7 | target/mips/tcg/vr54xx_translate.c | 2 +- | 7 | plugins/api.c | 2 +- |
8 | 1 file changed, 1 insertion(+), 1 deletion(-) | 8 | 1 file changed, 1 insertion(+), 1 deletion(-) |
9 | 9 | ||
10 | diff --git a/target/mips/tcg/vr54xx_translate.c b/target/mips/tcg/vr54xx_translate.c | 10 | diff --git a/plugins/api.c b/plugins/api.c |
11 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/target/mips/tcg/vr54xx_translate.c | 12 | --- a/plugins/api.c |
13 | +++ b/target/mips/tcg/vr54xx_translate.c | 13 | +++ b/plugins/api.c |
14 | @@ -XXX,XX +XXX,XX @@ static bool trans_mult_acc(DisasContext *ctx, arg_r *a, | 14 | @@ -XXX,XX +XXX,XX @@ GArray *qemu_plugin_get_registers(void) |
15 | tcg_temp_free(t0); | 15 | return create_register_handles(regs); |
16 | tcg_temp_free(t1); | ||
17 | |||
18 | - return false; | ||
19 | + return true; | ||
20 | } | 16 | } |
21 | 17 | ||
22 | TRANS(MACC, trans_mult_acc, gen_helper_macc); | 18 | -bool qemu_plugin_read_memory_vaddr(vaddr addr, GByteArray *data, size_t len) |
19 | +bool qemu_plugin_read_memory_vaddr(uint64_t addr, GByteArray *data, size_t len) | ||
20 | { | ||
21 | g_assert(current_cpu); | ||
22 | |||
23 | -- | 23 | -- |
24 | 2.34.1 | 24 | 2.43.0 |
25 | 25 | ||
26 | 26 | diff view generated by jsdifflib |
1 | While changes are made to prot within tlb_set_page_full, they are | 1 | The declarations use vaddr for size. |
---|---|---|---|
2 | an implementation detail of softmmu. Retain the original for any | ||
3 | target use of probe_access_full. | ||
4 | 2 | ||
5 | Fixes: 4047368938f6 ("accel/tcg: Introduce tlb_set_page_full") | ||
6 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
8 | --- | 4 | --- |
9 | accel/tcg/cputlb.c | 1 - | 5 | accel/tcg/cputlb.c | 4 ++-- |
10 | 1 file changed, 1 deletion(-) | 6 | 1 file changed, 2 insertions(+), 2 deletions(-) |
11 | 7 | ||
12 | diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c | 8 | diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c |
13 | index XXXXXXX..XXXXXXX 100644 | 9 | index XXXXXXX..XXXXXXX 100644 |
14 | --- a/accel/tcg/cputlb.c | 10 | --- a/accel/tcg/cputlb.c |
15 | +++ b/accel/tcg/cputlb.c | 11 | +++ b/accel/tcg/cputlb.c |
16 | @@ -XXX,XX +XXX,XX @@ void tlb_set_page_full(CPUState *cpu, int mmu_idx, | 12 | @@ -XXX,XX +XXX,XX @@ void tlb_set_page_full(CPUState *cpu, int mmu_idx, |
17 | desc->fulltlb[index] = *full; | 13 | |
18 | desc->fulltlb[index].xlat_section = iotlb - vaddr_page; | 14 | void tlb_set_page_with_attrs(CPUState *cpu, vaddr addr, |
19 | desc->fulltlb[index].phys_addr = paddr_page; | 15 | hwaddr paddr, MemTxAttrs attrs, int prot, |
20 | - desc->fulltlb[index].prot = prot; | 16 | - int mmu_idx, uint64_t size) |
21 | 17 | + int mmu_idx, vaddr size) | |
22 | /* Now calculate the new entry */ | 18 | { |
23 | tn.addend = addend - vaddr_page; | 19 | CPUTLBEntryFull full = { |
20 | .phys_addr = paddr, | ||
21 | @@ -XXX,XX +XXX,XX @@ void tlb_set_page_with_attrs(CPUState *cpu, vaddr addr, | ||
22 | |||
23 | void tlb_set_page(CPUState *cpu, vaddr addr, | ||
24 | hwaddr paddr, int prot, | ||
25 | - int mmu_idx, uint64_t size) | ||
26 | + int mmu_idx, vaddr size) | ||
27 | { | ||
28 | tlb_set_page_with_attrs(cpu, addr, paddr, MEMTXATTRS_UNSPECIFIED, | ||
29 | prot, mmu_idx, size); | ||
24 | -- | 30 | -- |
25 | 2.34.1 | 31 | 2.43.0 | diff view generated by jsdifflib |
1 | All uses are strictly read-only. | 1 | Since we no longer support 64-bit guests on 32-bit hosts, |
---|---|---|---|
2 | we can use a 32-bit type on a 32-bit host. | ||
2 | 3 | ||
3 | Reviewed-by: Philippe Mathieu-Daudé <philmd@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 | target/riscv/translate.c | 4 ++-- | 7 | include/exec/vaddr.h | 16 +++++++++------- |
7 | target/riscv/insn_trans/trans_rvv.c.inc | 4 ++-- | 8 | 1 file changed, 9 insertions(+), 7 deletions(-) |
8 | target/riscv/insn_trans/trans_rvzfh.c.inc | 2 +- | ||
9 | 3 files changed, 5 insertions(+), 5 deletions(-) | ||
10 | 9 | ||
11 | diff --git a/target/riscv/translate.c b/target/riscv/translate.c | 10 | diff --git a/include/exec/vaddr.h b/include/exec/vaddr.h |
12 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/target/riscv/translate.c | 12 | --- a/include/exec/vaddr.h |
14 | +++ b/target/riscv/translate.c | 13 | +++ b/include/exec/vaddr.h |
15 | @@ -XXX,XX +XXX,XX @@ static void gen_nanbox_h(TCGv_i64 out, TCGv_i64 in) | 14 | @@ -XXX,XX +XXX,XX @@ |
15 | /** | ||
16 | * vaddr: | ||
17 | * Type wide enough to contain any #target_ulong virtual address. | ||
18 | + * We do not support 64-bit guest on 32-host and detect at configure time. | ||
19 | + * Therefore, a host pointer width will always fit a guest pointer. | ||
16 | */ | 20 | */ |
17 | static void gen_check_nanbox_h(TCGv_i64 out, TCGv_i64 in) | 21 | -typedef uint64_t vaddr; |
18 | { | 22 | -#define VADDR_PRId PRId64 |
19 | - TCGv_i64 t_max = tcg_const_i64(0xffffffffffff0000ull); | 23 | -#define VADDR_PRIu PRIu64 |
20 | - TCGv_i64 t_nan = tcg_const_i64(0xffffffffffff7e00ull); | 24 | -#define VADDR_PRIo PRIo64 |
21 | + TCGv_i64 t_max = tcg_constant_i64(0xffffffffffff0000ull); | 25 | -#define VADDR_PRIx PRIx64 |
22 | + TCGv_i64 t_nan = tcg_constant_i64(0xffffffffffff7e00ull); | 26 | -#define VADDR_PRIX PRIX64 |
23 | 27 | -#define VADDR_MAX UINT64_MAX | |
24 | tcg_gen_movcond_i64(TCG_COND_GEU, out, in, t_max, in, t_nan); | 28 | +typedef uintptr_t vaddr; |
25 | } | 29 | +#define VADDR_PRId PRIdPTR |
26 | diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc | 30 | +#define VADDR_PRIu PRIuPTR |
27 | index XXXXXXX..XXXXXXX 100644 | 31 | +#define VADDR_PRIo PRIoPTR |
28 | --- a/target/riscv/insn_trans/trans_rvv.c.inc | 32 | +#define VADDR_PRIx PRIxPTR |
29 | +++ b/target/riscv/insn_trans/trans_rvv.c.inc | 33 | +#define VADDR_PRIX PRIXPTR |
30 | @@ -XXX,XX +XXX,XX @@ static bool trans_vsetvli(DisasContext *s, arg_vsetvli *a) | 34 | +#define VADDR_MAX UINTPTR_MAX |
31 | 35 | ||
32 | static bool trans_vsetivli(DisasContext *s, arg_vsetivli *a) | 36 | #endif |
33 | { | ||
34 | - TCGv s1 = tcg_const_tl(a->rs1); | ||
35 | - TCGv s2 = tcg_const_tl(a->zimm); | ||
36 | + TCGv s1 = tcg_constant_tl(a->rs1); | ||
37 | + TCGv s2 = tcg_constant_tl(a->zimm); | ||
38 | return do_vsetivli(s, a->rd, s1, s2); | ||
39 | } | ||
40 | |||
41 | diff --git a/target/riscv/insn_trans/trans_rvzfh.c.inc b/target/riscv/insn_trans/trans_rvzfh.c.inc | ||
42 | index XXXXXXX..XXXXXXX 100644 | ||
43 | --- a/target/riscv/insn_trans/trans_rvzfh.c.inc | ||
44 | +++ b/target/riscv/insn_trans/trans_rvzfh.c.inc | ||
45 | @@ -XXX,XX +XXX,XX @@ static bool trans_fsgnjn_h(DisasContext *ctx, arg_fsgnjn_h *a) | ||
46 | * Replace bit 15 in rs1 with inverse in rs2. | ||
47 | * This formulation retains the nanboxing of rs1. | ||
48 | */ | ||
49 | - mask = tcg_const_i64(~MAKE_64BIT_MASK(15, 1)); | ||
50 | + mask = tcg_constant_i64(~MAKE_64BIT_MASK(15, 1)); | ||
51 | tcg_gen_not_i64(rs2, rs2); | ||
52 | tcg_gen_andc_i64(rs2, rs2, mask); | ||
53 | tcg_gen_and_i64(dest, mask, rs1); | ||
54 | -- | 37 | -- |
55 | 2.34.1 | 38 | 2.43.0 |
56 | 39 | ||
57 | 40 | diff view generated by jsdifflib |
1 | Compute the eflags write mask separately, leaving one call | 1 | Since we no longer support 64-bit guests on 32-bit hosts, |
---|---|---|---|
2 | to the helper. Use tcg_constant_i32. | 2 | we can use a 32-bit type on a 32-bit host. This shrinks |
3 | the size of the structure to 16 bytes on a 32-bit host. | ||
3 | 4 | ||
4 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | 5 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> |
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
6 | --- | 7 | --- |
7 | target/i386/tcg/translate.c | 55 ++++++++----------------------------- | 8 | include/exec/tlb-common.h | 10 +++++----- |
8 | 1 file changed, 11 insertions(+), 44 deletions(-) | 9 | accel/tcg/cputlb.c | 21 ++++----------------- |
10 | tcg/arm/tcg-target.c.inc | 1 - | ||
11 | tcg/mips/tcg-target.c.inc | 12 +++++------- | ||
12 | tcg/ppc/tcg-target.c.inc | 21 +++++---------------- | ||
13 | 5 files changed, 19 insertions(+), 46 deletions(-) | ||
9 | 14 | ||
10 | diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c | 15 | diff --git a/include/exec/tlb-common.h b/include/exec/tlb-common.h |
11 | index XXXXXXX..XXXXXXX 100644 | 16 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/target/i386/tcg/translate.c | 17 | --- a/include/exec/tlb-common.h |
13 | +++ b/target/i386/tcg/translate.c | 18 | +++ b/include/exec/tlb-common.h |
14 | @@ -XXX,XX +XXX,XX @@ static bool disas_insn(DisasContext *s, CPUState *cpu) | 19 | @@ -XXX,XX +XXX,XX @@ |
15 | case 0x9d: /* popf */ | 20 | #ifndef EXEC_TLB_COMMON_H |
16 | gen_svm_check_intercept(s, SVM_EXIT_POPF); | 21 | #define EXEC_TLB_COMMON_H 1 |
17 | if (check_vm86_iopl(s)) { | 22 | |
18 | - ot = gen_pop_T0(s); | 23 | -#define CPU_TLB_ENTRY_BITS 5 |
19 | + int mask = TF_MASK | AC_MASK | ID_MASK | NT_MASK; | 24 | +#define CPU_TLB_ENTRY_BITS (HOST_LONG_BITS == 32 ? 4 : 5) |
20 | + | 25 | |
21 | if (CPL(s) == 0) { | 26 | /* Minimalized TLB entry for use by TCG fast path. */ |
22 | - if (dflag != MO_16) { | 27 | typedef union CPUTLBEntry { |
23 | - gen_helper_write_eflags(cpu_env, s->T0, | 28 | struct { |
24 | - tcg_const_i32((TF_MASK | AC_MASK | | 29 | - uint64_t addr_read; |
25 | - ID_MASK | NT_MASK | | 30 | - uint64_t addr_write; |
26 | - IF_MASK | | 31 | - uint64_t addr_code; |
27 | - IOPL_MASK))); | 32 | + uintptr_t addr_read; |
28 | - } else { | 33 | + uintptr_t addr_write; |
29 | - gen_helper_write_eflags(cpu_env, s->T0, | 34 | + uintptr_t addr_code; |
30 | - tcg_const_i32((TF_MASK | AC_MASK | | 35 | /* |
31 | - ID_MASK | NT_MASK | | 36 | * Addend to virtual address to get host address. IO accesses |
32 | - IF_MASK | IOPL_MASK) | 37 | * use the corresponding iotlb value. |
33 | - & 0xffff)); | 38 | @@ -XXX,XX +XXX,XX @@ typedef union CPUTLBEntry { |
34 | - } | 39 | * Padding to get a power of two size, as well as index |
40 | * access to addr_{read,write,code}. | ||
41 | */ | ||
42 | - uint64_t addr_idx[(1 << CPU_TLB_ENTRY_BITS) / sizeof(uint64_t)]; | ||
43 | + uintptr_t addr_idx[(1 << CPU_TLB_ENTRY_BITS) / sizeof(uintptr_t)]; | ||
44 | } CPUTLBEntry; | ||
45 | |||
46 | QEMU_BUILD_BUG_ON(sizeof(CPUTLBEntry) != (1 << CPU_TLB_ENTRY_BITS)); | ||
47 | diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c | ||
48 | index XXXXXXX..XXXXXXX 100644 | ||
49 | --- a/accel/tcg/cputlb.c | ||
50 | +++ b/accel/tcg/cputlb.c | ||
51 | @@ -XXX,XX +XXX,XX @@ static inline uint64_t tlb_read_idx(const CPUTLBEntry *entry, | ||
52 | { | ||
53 | /* Do not rearrange the CPUTLBEntry structure members. */ | ||
54 | QEMU_BUILD_BUG_ON(offsetof(CPUTLBEntry, addr_read) != | ||
55 | - MMU_DATA_LOAD * sizeof(uint64_t)); | ||
56 | + MMU_DATA_LOAD * sizeof(uintptr_t)); | ||
57 | QEMU_BUILD_BUG_ON(offsetof(CPUTLBEntry, addr_write) != | ||
58 | - MMU_DATA_STORE * sizeof(uint64_t)); | ||
59 | + MMU_DATA_STORE * sizeof(uintptr_t)); | ||
60 | QEMU_BUILD_BUG_ON(offsetof(CPUTLBEntry, addr_code) != | ||
61 | - MMU_INST_FETCH * sizeof(uint64_t)); | ||
62 | + MMU_INST_FETCH * sizeof(uintptr_t)); | ||
63 | |||
64 | -#if TARGET_LONG_BITS == 32 | ||
65 | - /* Use qatomic_read, in case of addr_write; only care about low bits. */ | ||
66 | - const uint32_t *ptr = (uint32_t *)&entry->addr_idx[access_type]; | ||
67 | - ptr += HOST_BIG_ENDIAN; | ||
68 | - return qatomic_read(ptr); | ||
69 | -#else | ||
70 | - const uint64_t *ptr = &entry->addr_idx[access_type]; | ||
71 | + const uintptr_t *ptr = &entry->addr_idx[access_type]; | ||
72 | /* ofs might correspond to .addr_write, so use qatomic_read */ | ||
73 | return qatomic_read(ptr); | ||
74 | -#endif | ||
75 | } | ||
76 | |||
77 | static inline uint64_t tlb_addr_write(const CPUTLBEntry *entry) | ||
78 | @@ -XXX,XX +XXX,XX @@ static void tlb_reset_dirty_range_locked(CPUTLBEntry *tlb_entry, | ||
79 | addr &= TARGET_PAGE_MASK; | ||
80 | addr += tlb_entry->addend; | ||
81 | if ((addr - start) < length) { | ||
82 | -#if TARGET_LONG_BITS == 32 | ||
83 | - uint32_t *ptr_write = (uint32_t *)&tlb_entry->addr_write; | ||
84 | - ptr_write += HOST_BIG_ENDIAN; | ||
85 | - qatomic_set(ptr_write, *ptr_write | TLB_NOTDIRTY); | ||
86 | -#else | ||
87 | qatomic_set(&tlb_entry->addr_write, | ||
88 | tlb_entry->addr_write | TLB_NOTDIRTY); | ||
89 | -#endif | ||
90 | } | ||
91 | } | ||
92 | } | ||
93 | diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc | ||
94 | index XXXXXXX..XXXXXXX 100644 | ||
95 | --- a/tcg/arm/tcg-target.c.inc | ||
96 | +++ b/tcg/arm/tcg-target.c.inc | ||
97 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
98 | * Add the tlb_table pointer, creating the CPUTLBEntry address in R1. | ||
99 | * Load the tlb comparator into R2 and the fast path addend into R1. | ||
100 | */ | ||
101 | - QEMU_BUILD_BUG_ON(HOST_BIG_ENDIAN); | ||
102 | if (cmp_off == 0) { | ||
103 | tcg_out_ld32_rwb(s, COND_AL, TCG_REG_R2, TCG_REG_R1, TCG_REG_R0); | ||
104 | } else { | ||
105 | diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc | ||
106 | index XXXXXXX..XXXXXXX 100644 | ||
107 | --- a/tcg/mips/tcg-target.c.inc | ||
108 | +++ b/tcg/mips/tcg-target.c.inc | ||
109 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
110 | /* Add the tlb_table pointer, creating the CPUTLBEntry address. */ | ||
111 | tcg_out_opc_reg(s, ALIAS_PADD, TCG_TMP3, TCG_TMP3, TCG_TMP1); | ||
112 | |||
113 | - if (TCG_TARGET_REG_BITS == 32 || addr_type == TCG_TYPE_I32) { | ||
114 | - /* Load the (low half) tlb comparator. */ | ||
115 | + /* Load the tlb comparator. */ | ||
116 | + if (TCG_TARGET_REG_BITS == 64 && addr_type == TCG_TYPE_I32) { | ||
117 | tcg_out_ld(s, TCG_TYPE_I32, TCG_TMP0, TCG_TMP3, | ||
118 | cmp_off + HOST_BIG_ENDIAN * 4); | ||
119 | } else { | ||
120 | - tcg_out_ld(s, TCG_TYPE_I64, TCG_TMP0, TCG_TMP3, cmp_off); | ||
121 | + tcg_out_ld(s, TCG_TYPE_REG, TCG_TMP0, TCG_TMP3, cmp_off); | ||
122 | } | ||
123 | |||
124 | - if (TCG_TARGET_REG_BITS == 64 || addr_type == TCG_TYPE_I32) { | ||
125 | - /* Load the tlb addend for the fast path. */ | ||
126 | - tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP3, TCG_TMP3, add_off); | ||
127 | - } | ||
128 | + /* Load the tlb addend for the fast path. */ | ||
129 | + tcg_out_ld(s, TCG_TYPE_PTR, TCG_TMP3, TCG_TMP3, add_off); | ||
130 | |||
131 | /* | ||
132 | * Mask the page bits, keeping the alignment bits to compare against. | ||
133 | diff --git a/tcg/ppc/tcg-target.c.inc b/tcg/ppc/tcg-target.c.inc | ||
134 | index XXXXXXX..XXXXXXX 100644 | ||
135 | --- a/tcg/ppc/tcg-target.c.inc | ||
136 | +++ b/tcg/ppc/tcg-target.c.inc | ||
137 | @@ -XXX,XX +XXX,XX @@ static TCGLabelQemuLdst *prepare_host_addr(TCGContext *s, HostAddress *h, | ||
138 | tcg_out32(s, AND | SAB(TCG_REG_TMP1, TCG_REG_TMP1, TCG_REG_R0)); | ||
139 | |||
140 | /* | ||
141 | - * Load the (low part) TLB comparator into TMP2. | ||
142 | + * Load the TLB comparator into TMP2. | ||
143 | * For 64-bit host, always load the entire 64-bit slot for simplicity. | ||
144 | * We will ignore the high bits with tcg_out_cmp(..., addr_type). | ||
145 | */ | ||
146 | - if (TCG_TARGET_REG_BITS == 64) { | ||
147 | - if (cmp_off == 0) { | ||
148 | - tcg_out32(s, LDUX | TAB(TCG_REG_TMP2, | ||
149 | - TCG_REG_TMP1, TCG_REG_TMP2)); | ||
35 | - } else { | 150 | - } else { |
36 | - if (CPL(s) <= IOPL(s)) { | 151 | - tcg_out32(s, ADD | TAB(TCG_REG_TMP1, |
37 | - if (dflag != MO_16) { | 152 | - TCG_REG_TMP1, TCG_REG_TMP2)); |
38 | - gen_helper_write_eflags(cpu_env, s->T0, | 153 | - tcg_out_ld(s, TCG_TYPE_I64, TCG_REG_TMP2, |
39 | - tcg_const_i32((TF_MASK | | 154 | - TCG_REG_TMP1, cmp_off); |
40 | - AC_MASK | | 155 | - } |
41 | - ID_MASK | | 156 | - } else if (cmp_off == 0 && !HOST_BIG_ENDIAN) { |
42 | - NT_MASK | | 157 | - tcg_out32(s, LWZUX | TAB(TCG_REG_TMP2, |
43 | - IF_MASK))); | 158 | - TCG_REG_TMP1, TCG_REG_TMP2)); |
44 | - } else { | 159 | + if (cmp_off == 0) { |
45 | - gen_helper_write_eflags(cpu_env, s->T0, | 160 | + tcg_out32(s, (TCG_TARGET_REG_BITS == 64 ? LDUX : LWZUX) |
46 | - tcg_const_i32((TF_MASK | | 161 | + | TAB(TCG_REG_TMP2, TCG_REG_TMP1, TCG_REG_TMP2)); |
47 | - AC_MASK | | 162 | } else { |
48 | - ID_MASK | | 163 | tcg_out32(s, ADD | TAB(TCG_REG_TMP1, TCG_REG_TMP1, TCG_REG_TMP2)); |
49 | - NT_MASK | | 164 | - tcg_out_ld(s, TCG_TYPE_I32, TCG_REG_TMP2, TCG_REG_TMP1, |
50 | - IF_MASK) | 165 | - cmp_off + 4 * HOST_BIG_ENDIAN); |
51 | - & 0xffff)); | 166 | + tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP2, TCG_REG_TMP1, cmp_off); |
52 | - } | 167 | } |
53 | - } else { | 168 | |
54 | - if (dflag != MO_16) { | 169 | /* |
55 | - gen_helper_write_eflags(cpu_env, s->T0, | ||
56 | - tcg_const_i32((TF_MASK | AC_MASK | | ||
57 | - ID_MASK | NT_MASK))); | ||
58 | - } else { | ||
59 | - gen_helper_write_eflags(cpu_env, s->T0, | ||
60 | - tcg_const_i32((TF_MASK | AC_MASK | | ||
61 | - ID_MASK | NT_MASK) | ||
62 | - & 0xffff)); | ||
63 | - } | ||
64 | - } | ||
65 | + mask |= IF_MASK | IOPL_MASK; | ||
66 | + } else if (CPL(s) <= IOPL(s)) { | ||
67 | + mask |= IF_MASK; | ||
68 | } | ||
69 | + if (dflag == MO_16) { | ||
70 | + mask &= 0xffff; | ||
71 | + } | ||
72 | + | ||
73 | + ot = gen_pop_T0(s); | ||
74 | + gen_helper_write_eflags(cpu_env, s->T0, tcg_constant_i32(mask)); | ||
75 | gen_pop_update(s, ot); | ||
76 | set_cc_op(s, CC_OP_EFLAGS); | ||
77 | /* abort translation because TF/AC flag may change */ | ||
78 | -- | 170 | -- |
79 | 2.34.1 | 171 | 2.43.0 |
80 | 172 | ||
81 | 173 | diff view generated by jsdifflib |
1 | Since all temps allocated by guest front-ends are now TEMP_TB, | 1 | For loongarch, mips, riscv and sparc, a zero register is |
---|---|---|---|
2 | and we don't recycle TEMP_TB, there's no point in requiring | 2 | available all the time. For aarch64, register index 31 |
3 | that the front-ends free the temps at all. Begin by dropping | 3 | depends on context: sometimes it is the stack pointer, |
4 | the inner-most checks that all temps have been freed. | 4 | and sometimes it is the zero register. |
5 | 5 | ||
6 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | 6 | Introduce a new general-purpose constraint which maps 0 |
7 | to TCG_REG_ZERO, if defined. This differs from existing | ||
8 | constant constraints in that const_arg[*] is recorded as | ||
9 | false, indicating that the value is in a register. | ||
10 | |||
11 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | ||
7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 12 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
8 | --- | 13 | --- |
9 | include/tcg/tcg.h | 14 ----------- | 14 | include/tcg/tcg.h | 3 ++- |
10 | accel/tcg/translator.c | 12 ---------- | 15 | tcg/aarch64/tcg-target.h | 2 ++ |
11 | tcg/tcg.c | 54 +++++++----------------------------------- | 16 | tcg/loongarch64/tcg-target.h | 2 ++ |
12 | 3 files changed, 8 insertions(+), 72 deletions(-) | 17 | tcg/mips/tcg-target.h | 2 ++ |
18 | tcg/riscv/tcg-target.h | 2 ++ | ||
19 | tcg/sparc64/tcg-target.h | 3 ++- | ||
20 | tcg/tcg.c | 29 ++++++++++++++++++++++------- | ||
21 | docs/devel/tcg-ops.rst | 4 +++- | ||
22 | 8 files changed, 37 insertions(+), 10 deletions(-) | ||
13 | 23 | ||
14 | diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h | 24 | diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h |
15 | index XXXXXXX..XXXXXXX 100644 | 25 | index XXXXXXX..XXXXXXX 100644 |
16 | --- a/include/tcg/tcg.h | 26 | --- a/include/tcg/tcg.h |
17 | +++ b/include/tcg/tcg.h | 27 | +++ b/include/tcg/tcg.h |
18 | @@ -XXX,XX +XXX,XX @@ struct TCGContext { | 28 | @@ -XXX,XX +XXX,XX @@ void tb_target_set_jmp_target(const TranslationBlock *, int, |
29 | |||
30 | void tcg_set_frame(TCGContext *s, TCGReg reg, intptr_t start, intptr_t size); | ||
31 | |||
32 | -#define TCG_CT_CONST 1 /* any constant of register size */ | ||
33 | +#define TCG_CT_CONST 1 /* any constant of register size */ | ||
34 | +#define TCG_CT_REG_ZERO 2 /* zero, in TCG_REG_ZERO */ | ||
35 | |||
36 | typedef struct TCGArgConstraint { | ||
37 | unsigned ct : 16; | ||
38 | diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h | ||
39 | index XXXXXXX..XXXXXXX 100644 | ||
40 | --- a/tcg/aarch64/tcg-target.h | ||
41 | +++ b/tcg/aarch64/tcg-target.h | ||
42 | @@ -XXX,XX +XXX,XX @@ typedef enum { | ||
43 | TCG_AREG0 = TCG_REG_X19, | ||
44 | } TCGReg; | ||
45 | |||
46 | +#define TCG_REG_ZERO TCG_REG_XZR | ||
47 | + | ||
48 | #define TCG_TARGET_NB_REGS 64 | ||
49 | |||
50 | #endif /* AARCH64_TCG_TARGET_H */ | ||
51 | diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h | ||
52 | index XXXXXXX..XXXXXXX 100644 | ||
53 | --- a/tcg/loongarch64/tcg-target.h | ||
54 | +++ b/tcg/loongarch64/tcg-target.h | ||
55 | @@ -XXX,XX +XXX,XX @@ typedef enum { | ||
56 | TCG_VEC_TMP0 = TCG_REG_V23, | ||
57 | } TCGReg; | ||
58 | |||
59 | +#define TCG_REG_ZERO TCG_REG_ZERO | ||
60 | + | ||
61 | #endif /* LOONGARCH_TCG_TARGET_H */ | ||
62 | diff --git a/tcg/mips/tcg-target.h b/tcg/mips/tcg-target.h | ||
63 | index XXXXXXX..XXXXXXX 100644 | ||
64 | --- a/tcg/mips/tcg-target.h | ||
65 | +++ b/tcg/mips/tcg-target.h | ||
66 | @@ -XXX,XX +XXX,XX @@ typedef enum { | ||
67 | TCG_AREG0 = TCG_REG_S8, | ||
68 | } TCGReg; | ||
69 | |||
70 | +#define TCG_REG_ZERO TCG_REG_ZERO | ||
71 | + | ||
19 | #endif | 72 | #endif |
20 | 73 | diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h | |
21 | #ifdef CONFIG_DEBUG_TCG | 74 | index XXXXXXX..XXXXXXX 100644 |
22 | - int temps_in_use; | 75 | --- a/tcg/riscv/tcg-target.h |
23 | int goto_tb_issue_mask; | 76 | +++ b/tcg/riscv/tcg-target.h |
24 | const TCGOpcode *vecop_list; | 77 | @@ -XXX,XX +XXX,XX @@ typedef enum { |
78 | TCG_REG_TMP2 = TCG_REG_T4, | ||
79 | } TCGReg; | ||
80 | |||
81 | +#define TCG_REG_ZERO TCG_REG_ZERO | ||
82 | + | ||
25 | #endif | 83 | #endif |
26 | @@ -XXX,XX +XXX,XX @@ static inline TCGv_ptr tcg_temp_new_ptr(void) | 84 | diff --git a/tcg/sparc64/tcg-target.h b/tcg/sparc64/tcg-target.h |
27 | return temp_tcgv_ptr(t); | ||
28 | } | ||
29 | |||
30 | -#if defined(CONFIG_DEBUG_TCG) | ||
31 | -/* If you call tcg_clear_temp_count() at the start of a section of | ||
32 | - * code which is not supposed to leak any TCG temporaries, then | ||
33 | - * calling tcg_check_temp_count() at the end of the section will | ||
34 | - * return 1 if the section did in fact leak a temporary. | ||
35 | - */ | ||
36 | -void tcg_clear_temp_count(void); | ||
37 | -int tcg_check_temp_count(void); | ||
38 | -#else | ||
39 | -#define tcg_clear_temp_count() do { } while (0) | ||
40 | -#define tcg_check_temp_count() 0 | ||
41 | -#endif | ||
42 | - | ||
43 | int64_t tcg_cpu_exec_time(void); | ||
44 | void tcg_dump_info(GString *buf); | ||
45 | void tcg_dump_op_count(GString *buf); | ||
46 | diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c | ||
47 | index XXXXXXX..XXXXXXX 100644 | 85 | index XXXXXXX..XXXXXXX 100644 |
48 | --- a/accel/tcg/translator.c | 86 | --- a/tcg/sparc64/tcg-target.h |
49 | +++ b/accel/tcg/translator.c | 87 | +++ b/tcg/sparc64/tcg-target.h |
50 | @@ -XXX,XX +XXX,XX @@ | 88 | @@ -XXX,XX +XXX,XX @@ typedef enum { |
51 | #include "exec/plugin-gen.h" | 89 | TCG_REG_I7, |
52 | #include "exec/replay-core.h" | 90 | } TCGReg; |
53 | 91 | ||
54 | -/* Pairs with tcg_clear_temp_count. | 92 | -#define TCG_AREG0 TCG_REG_I0 |
55 | - To be called by #TranslatorOps.{translate_insn,tb_stop} if | 93 | +#define TCG_AREG0 TCG_REG_I0 |
56 | - (1) the target is sufficiently clean to support reporting, | 94 | +#define TCG_REG_ZERO TCG_REG_G0 |
57 | - (2) as and when all temporaries are known to be consumed. | 95 | |
58 | - For most targets, (2) is at the end of translate_insn. */ | 96 | #endif |
59 | void translator_loop_temp_check(DisasContextBase *db) | ||
60 | { | ||
61 | - if (tcg_check_temp_count()) { | ||
62 | - qemu_log("warning: TCG temporary leaks before " | ||
63 | - TARGET_FMT_lx "\n", db->pc_next); | ||
64 | - } | ||
65 | } | ||
66 | |||
67 | bool translator_use_goto_tb(DisasContextBase *db, target_ulong dest) | ||
68 | @@ -XXX,XX +XXX,XX @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns, | ||
69 | ops->init_disas_context(db, cpu); | ||
70 | tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */ | ||
71 | |||
72 | - /* Reset the temp count so that we can identify leaks */ | ||
73 | - tcg_clear_temp_count(); | ||
74 | - | ||
75 | /* Start translating. */ | ||
76 | gen_tb_start(db->tb); | ||
77 | ops->tb_start(db, cpu); | ||
78 | diff --git a/tcg/tcg.c b/tcg/tcg.c | 97 | diff --git a/tcg/tcg.c b/tcg/tcg.c |
79 | index XXXXXXX..XXXXXXX 100644 | 98 | index XXXXXXX..XXXXXXX 100644 |
80 | --- a/tcg/tcg.c | 99 | --- a/tcg/tcg.c |
81 | +++ b/tcg/tcg.c | 100 | +++ b/tcg/tcg.c |
82 | @@ -XXX,XX +XXX,XX @@ TCGTemp *tcg_temp_new_internal(TCGType type, TCGTempKind kind) | 101 | @@ -XXX,XX +XXX,XX @@ static void process_constraint_sets(void) |
83 | ts->temp_allocated = 1; | 102 | case 'i': |
84 | tcg_debug_assert(ts->base_type == type); | 103 | args_ct[i].ct |= TCG_CT_CONST; |
85 | tcg_debug_assert(ts->kind == kind); | 104 | break; |
86 | - goto done; | 105 | +#ifdef TCG_REG_ZERO |
87 | + return ts; | 106 | + case 'z': |
107 | + args_ct[i].ct |= TCG_CT_REG_ZERO; | ||
108 | + break; | ||
109 | +#endif | ||
110 | |||
111 | /* Include all of the target-specific constraints. */ | ||
112 | |||
113 | @@ -XXX,XX +XXX,XX @@ static void tcg_reg_alloc_op(TCGContext *s, const TCGOp *op) | ||
114 | arg_ct = &args_ct[i]; | ||
115 | ts = arg_temp(arg); | ||
116 | |||
117 | - if (ts->val_type == TEMP_VAL_CONST | ||
118 | - && tcg_target_const_match(ts->val, arg_ct->ct, ts->type, | ||
119 | - op_cond, TCGOP_VECE(op))) { | ||
120 | - /* constant is OK for instruction */ | ||
121 | - const_args[i] = 1; | ||
122 | - new_args[i] = ts->val; | ||
123 | - continue; | ||
124 | + if (ts->val_type == TEMP_VAL_CONST) { | ||
125 | +#ifdef TCG_REG_ZERO | ||
126 | + if (ts->val == 0 && (arg_ct->ct & TCG_CT_REG_ZERO)) { | ||
127 | + /* Hardware zero register: indicate register via non-const. */ | ||
128 | + const_args[i] = 0; | ||
129 | + new_args[i] = TCG_REG_ZERO; | ||
130 | + continue; | ||
131 | + } | ||
132 | +#endif | ||
133 | + | ||
134 | + if (tcg_target_const_match(ts->val, arg_ct->ct, ts->type, | ||
135 | + op_cond, TCGOP_VECE(op))) { | ||
136 | + /* constant is OK for instruction */ | ||
137 | + const_args[i] = 1; | ||
138 | + new_args[i] = ts->val; | ||
139 | + continue; | ||
140 | + } | ||
88 | } | 141 | } |
89 | } else { | 142 | |
90 | tcg_debug_assert(kind == TEMP_TB); | 143 | reg = ts->reg; |
91 | @@ -XXX,XX +XXX,XX @@ TCGTemp *tcg_temp_new_internal(TCGType type, TCGTempKind kind) | 144 | diff --git a/docs/devel/tcg-ops.rst b/docs/devel/tcg-ops.rst |
92 | ts2->kind = kind; | 145 | index XXXXXXX..XXXXXXX 100644 |
93 | } | 146 | --- a/docs/devel/tcg-ops.rst |
94 | } | 147 | +++ b/docs/devel/tcg-ops.rst |
95 | - | 148 | @@ -XXX,XX +XXX,XX @@ operation uses a constant input constraint which does not allow all |
96 | - done: | 149 | constants, it must also accept registers in order to have a fallback. |
97 | -#if defined(CONFIG_DEBUG_TCG) | 150 | The constraint '``i``' is defined generically to accept any constant. |
98 | - s->temps_in_use++; | 151 | The constraint '``r``' is not defined generically, but is consistently |
99 | -#endif | 152 | -used by each backend to indicate all registers. |
100 | return ts; | 153 | +used by each backend to indicate all registers. If ``TCG_REG_ZERO`` |
101 | } | 154 | +is defined by the backend, the constraint '``z``' is defined generically |
102 | 155 | +to map constant 0 to the hardware zero register. | |
103 | @@ -XXX,XX +XXX,XX @@ void tcg_temp_free_internal(TCGTemp *ts) | 156 | |
104 | 157 | The movi_i32 and movi_i64 operations must accept any constants. | |
105 | switch (ts->kind) { | 158 | |
106 | case TEMP_CONST: | ||
107 | - /* | ||
108 | - * In order to simplify users of tcg_constant_*, | ||
109 | - * silently ignore free. | ||
110 | - */ | ||
111 | - return; | ||
112 | - case TEMP_EBB: | ||
113 | case TEMP_TB: | ||
114 | + /* Silently ignore free. */ | ||
115 | + break; | ||
116 | + case TEMP_EBB: | ||
117 | + tcg_debug_assert(ts->temp_allocated != 0); | ||
118 | + ts->temp_allocated = 0; | ||
119 | + set_bit(temp_idx(ts), s->free_temps[ts->base_type].l); | ||
120 | break; | ||
121 | default: | ||
122 | + /* It never made sense to free TEMP_FIXED or TEMP_GLOBAL. */ | ||
123 | g_assert_not_reached(); | ||
124 | } | ||
125 | - | ||
126 | - tcg_debug_assert(ts->temp_allocated != 0); | ||
127 | - ts->temp_allocated = 0; | ||
128 | - | ||
129 | -#if defined(CONFIG_DEBUG_TCG) | ||
130 | - assert(s->temps_in_use > 0); | ||
131 | - s->temps_in_use--; | ||
132 | -#endif | ||
133 | - | ||
134 | - if (ts->kind == TEMP_EBB) { | ||
135 | - int idx = temp_idx(ts); | ||
136 | - set_bit(idx, s->free_temps[ts->base_type].l); | ||
137 | - } | ||
138 | } | ||
139 | |||
140 | TCGTemp *tcg_constant_internal(TCGType type, int64_t val) | ||
141 | @@ -XXX,XX +XXX,XX @@ TCGv_i64 tcg_const_i64(int64_t val) | ||
142 | return t0; | ||
143 | } | ||
144 | |||
145 | -#if defined(CONFIG_DEBUG_TCG) | ||
146 | -void tcg_clear_temp_count(void) | ||
147 | -{ | ||
148 | - TCGContext *s = tcg_ctx; | ||
149 | - s->temps_in_use = 0; | ||
150 | -} | ||
151 | - | ||
152 | -int tcg_check_temp_count(void) | ||
153 | -{ | ||
154 | - TCGContext *s = tcg_ctx; | ||
155 | - if (s->temps_in_use) { | ||
156 | - /* Clear the count so that we don't give another | ||
157 | - * warning immediately next time around. | ||
158 | - */ | ||
159 | - s->temps_in_use = 0; | ||
160 | - return 1; | ||
161 | - } | ||
162 | - return 0; | ||
163 | -} | ||
164 | -#endif | ||
165 | - | ||
166 | /* Return true if OP may appear in the opcode stream. | ||
167 | Test the runtime variable that controls each opcode. */ | ||
168 | bool tcg_op_supported(TCGOpcode op) | ||
169 | -- | 159 | -- |
170 | 2.34.1 | 160 | 2.43.0 |
161 | |||
162 | diff view generated by jsdifflib |
1 | Translators are no longer required to free tcg temporaries. | 1 | Note that 'Z' is still used for addsub2. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
5 | --- | 4 | --- |
6 | target/arm/tcg/translate-sve.c | 186 +-------------------------------- | 5 | tcg/aarch64/tcg-target-con-set.h | 12 ++++----- |
7 | 1 file changed, 2 insertions(+), 184 deletions(-) | 6 | tcg/aarch64/tcg-target.c.inc | 46 ++++++++++++++------------------ |
7 | 2 files changed, 26 insertions(+), 32 deletions(-) | ||
8 | 8 | ||
9 | diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c | 9 | diff --git a/tcg/aarch64/tcg-target-con-set.h b/tcg/aarch64/tcg-target-con-set.h |
10 | index XXXXXXX..XXXXXXX 100644 | 10 | index XXXXXXX..XXXXXXX 100644 |
11 | --- a/target/arm/tcg/translate-sve.c | 11 | --- a/tcg/aarch64/tcg-target-con-set.h |
12 | +++ b/target/arm/tcg/translate-sve.c | 12 | +++ b/tcg/aarch64/tcg-target-con-set.h |
13 | @@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fpst_zz(DisasContext *s, gen_helper_gvec_2_ptr *fn, | 13 | @@ -XXX,XX +XXX,XX @@ |
14 | tcg_gen_gvec_2_ptr(vec_full_reg_offset(s, rd), | 14 | */ |
15 | vec_full_reg_offset(s, rn), | 15 | C_O0_I1(r) |
16 | status, vsz, vsz, data, fn); | 16 | C_O0_I2(r, rC) |
17 | - tcg_temp_free_ptr(status); | 17 | -C_O0_I2(rZ, r) |
18 | } | 18 | +C_O0_I2(rz, r) |
19 | return true; | 19 | C_O0_I2(w, r) |
20 | } | 20 | -C_O0_I3(rZ, rZ, r) |
21 | @@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fpst_zzz(DisasContext *s, gen_helper_gvec_3_ptr *fn, | 21 | +C_O0_I3(rz, rz, r) |
22 | vec_full_reg_offset(s, rn), | 22 | C_O1_I1(r, r) |
23 | vec_full_reg_offset(s, rm), | 23 | C_O1_I1(w, r) |
24 | status, vsz, vsz, data, fn); | 24 | C_O1_I1(w, w) |
25 | C_O1_I1(w, wr) | ||
26 | -C_O1_I2(r, 0, rZ) | ||
27 | +C_O1_I2(r, 0, rz) | ||
28 | C_O1_I2(r, r, r) | ||
29 | C_O1_I2(r, r, rA) | ||
30 | C_O1_I2(r, r, rAL) | ||
31 | C_O1_I2(r, r, rC) | ||
32 | C_O1_I2(r, r, ri) | ||
33 | C_O1_I2(r, r, rL) | ||
34 | -C_O1_I2(r, rZ, rZ) | ||
35 | +C_O1_I2(r, rz, rz) | ||
36 | C_O1_I2(w, 0, w) | ||
37 | C_O1_I2(w, w, w) | ||
38 | C_O1_I2(w, w, wN) | ||
39 | C_O1_I2(w, w, wO) | ||
40 | C_O1_I2(w, w, wZ) | ||
41 | C_O1_I3(w, w, w, w) | ||
42 | -C_O1_I4(r, r, rC, rZ, rZ) | ||
43 | +C_O1_I4(r, r, rC, rz, rz) | ||
44 | C_O2_I1(r, r, r) | ||
45 | -C_O2_I4(r, r, rZ, rZ, rA, rMZ) | ||
46 | +C_O2_I4(r, r, rz, rz, rA, rMZ) | ||
47 | diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc | ||
48 | index XXXXXXX..XXXXXXX 100644 | ||
49 | --- a/tcg/aarch64/tcg-target.c.inc | ||
50 | +++ b/tcg/aarch64/tcg-target.c.inc | ||
51 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext, | ||
52 | TCGArg a2 = args[2]; | ||
53 | int c2 = const_args[2]; | ||
54 | |||
55 | - /* Some operands are defined with "rZ" constraint, a register or | ||
56 | - the zero register. These need not actually test args[I] == 0. */ | ||
57 | -#define REG0(I) (const_args[I] ? TCG_REG_XZR : (TCGReg)args[I]) | ||
25 | - | 58 | - |
26 | - tcg_temp_free_ptr(status); | 59 | switch (opc) { |
27 | } | 60 | case INDEX_op_goto_ptr: |
28 | return true; | 61 | tcg_out_insn(s, 3207, BR, a0); |
29 | } | 62 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext, |
30 | @@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fpst_zzzz(DisasContext *s, gen_helper_gvec_4_ptr *fn, | 63 | |
31 | { | 64 | case INDEX_op_st8_i32: |
32 | TCGv_ptr status = fpstatus_ptr(flavour); | 65 | case INDEX_op_st8_i64: |
33 | bool ret = gen_gvec_ptr_zzzz(s, fn, rd, rn, rm, ra, data, status); | 66 | - tcg_out_ldst(s, I3312_STRB, REG0(0), a1, a2, 0); |
34 | - tcg_temp_free_ptr(status); | 67 | + tcg_out_ldst(s, I3312_STRB, a0, a1, a2, 0); |
35 | return ret; | 68 | break; |
36 | } | 69 | case INDEX_op_st16_i32: |
37 | 70 | case INDEX_op_st16_i64: | |
38 | @@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fpst_zzzzp(DisasContext *s, gen_helper_gvec_5_ptr *fn, | 71 | - tcg_out_ldst(s, I3312_STRH, REG0(0), a1, a2, 1); |
39 | vec_full_reg_offset(s, ra), | 72 | + tcg_out_ldst(s, I3312_STRH, a0, a1, a2, 1); |
40 | pred_full_reg_offset(s, pg), | 73 | break; |
41 | status, vsz, vsz, data, fn); | 74 | case INDEX_op_st_i32: |
42 | - | 75 | case INDEX_op_st32_i64: |
43 | - tcg_temp_free_ptr(status); | 76 | - tcg_out_ldst(s, I3312_STRW, REG0(0), a1, a2, 2); |
44 | } | 77 | + tcg_out_ldst(s, I3312_STRW, a0, a1, a2, 2); |
45 | return true; | 78 | break; |
46 | } | 79 | case INDEX_op_st_i64: |
47 | @@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fpst_zzp(DisasContext *s, gen_helper_gvec_3_ptr *fn, | 80 | - tcg_out_ldst(s, I3312_STRX, REG0(0), a1, a2, 3); |
48 | vec_full_reg_offset(s, rn), | 81 | + tcg_out_ldst(s, I3312_STRX, a0, a1, a2, 3); |
49 | pred_full_reg_offset(s, pg), | 82 | break; |
50 | status, vsz, vsz, data, fn); | 83 | |
51 | - tcg_temp_free_ptr(status); | 84 | case INDEX_op_add_i32: |
52 | } | 85 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext, |
53 | return true; | 86 | /* FALLTHRU */ |
54 | } | 87 | case INDEX_op_movcond_i64: |
55 | @@ -XXX,XX +XXX,XX @@ static bool gen_gvec_fpst_zzzp(DisasContext *s, gen_helper_gvec_4_ptr *fn, | 88 | tcg_out_cmp(s, ext, args[5], a1, a2, c2); |
56 | vec_full_reg_offset(s, rm), | 89 | - tcg_out_insn(s, 3506, CSEL, ext, a0, REG0(3), REG0(4), args[5]); |
57 | pred_full_reg_offset(s, pg), | 90 | + tcg_out_insn(s, 3506, CSEL, ext, a0, args[3], args[4], args[5]); |
58 | status, vsz, vsz, data, fn); | 91 | break; |
59 | - tcg_temp_free_ptr(status); | 92 | |
60 | } | 93 | case INDEX_op_qemu_ld_i32: |
61 | return true; | 94 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext, |
62 | } | 95 | break; |
63 | @@ -XXX,XX +XXX,XX @@ static void do_predtest1(TCGv_i64 d, TCGv_i64 g) | 96 | case INDEX_op_qemu_st_i32: |
64 | 97 | case INDEX_op_qemu_st_i64: | |
65 | gen_helper_sve_predtest1(t, d, g); | 98 | - tcg_out_qemu_st(s, REG0(0), a1, a2, ext); |
66 | do_pred_flags(t); | 99 | + tcg_out_qemu_st(s, a0, a1, a2, ext); |
67 | - tcg_temp_free_i32(t); | 100 | break; |
68 | } | 101 | case INDEX_op_qemu_ld_i128: |
69 | 102 | tcg_out_qemu_ldst_i128(s, a0, a1, a2, args[3], true); | |
70 | static void do_predtest(DisasContext *s, int dofs, int gofs, int words) | 103 | break; |
71 | @@ -XXX,XX +XXX,XX @@ static void do_predtest(DisasContext *s, int dofs, int gofs, int words) | 104 | case INDEX_op_qemu_st_i128: |
72 | tcg_gen_addi_ptr(gptr, cpu_env, gofs); | 105 | - tcg_out_qemu_ldst_i128(s, REG0(0), REG0(1), a2, args[3], false); |
73 | 106 | + tcg_out_qemu_ldst_i128(s, a0, a1, a2, args[3], false); | |
74 | gen_helper_sve_predtest(t, dptr, gptr, tcg_constant_i32(words)); | 107 | break; |
75 | - tcg_temp_free_ptr(dptr); | 108 | |
76 | - tcg_temp_free_ptr(gptr); | 109 | case INDEX_op_bswap64_i64: |
77 | 110 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext, | |
78 | do_pred_flags(t); | 111 | |
79 | - tcg_temp_free_i32(t); | 112 | case INDEX_op_deposit_i64: |
80 | } | 113 | case INDEX_op_deposit_i32: |
81 | 114 | - tcg_out_dep(s, ext, a0, REG0(2), args[3], args[4]); | |
82 | /* For each element size, the bits within a predicate word that are active. */ | 115 | + tcg_out_dep(s, ext, a0, a2, args[3], args[4]); |
83 | @@ -XXX,XX +XXX,XX @@ static void gen_xar8_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, int64_t sh) | 116 | break; |
84 | tcg_gen_andi_i64(d, d, mask); | 117 | |
85 | tcg_gen_andi_i64(t, t, ~mask); | 118 | case INDEX_op_extract_i64: |
86 | tcg_gen_or_i64(d, d, t); | 119 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext, |
87 | - tcg_temp_free_i64(t); | 120 | |
88 | } | 121 | case INDEX_op_extract2_i64: |
89 | 122 | case INDEX_op_extract2_i32: | |
90 | static void gen_xar16_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, int64_t sh) | 123 | - tcg_out_extr(s, ext, a0, REG0(2), REG0(1), args[3]); |
91 | @@ -XXX,XX +XXX,XX @@ static void gen_xar16_i64(TCGv_i64 d, TCGv_i64 n, TCGv_i64 m, int64_t sh) | 124 | + tcg_out_extr(s, ext, a0, a2, a1, args[3]); |
92 | tcg_gen_andi_i64(d, d, mask); | 125 | break; |
93 | tcg_gen_andi_i64(t, t, ~mask); | 126 | |
94 | tcg_gen_or_i64(d, d, t); | 127 | case INDEX_op_add2_i32: |
95 | - tcg_temp_free_i64(t); | 128 | - tcg_out_addsub2(s, TCG_TYPE_I32, a0, a1, REG0(2), REG0(3), |
96 | } | 129 | + tcg_out_addsub2(s, TCG_TYPE_I32, a0, a1, a2, args[3], |
97 | 130 | (int32_t)args[4], args[5], const_args[4], | |
98 | static void gen_xar_i32(TCGv_i32 d, TCGv_i32 n, TCGv_i32 m, int32_t sh) | 131 | const_args[5], false); |
99 | @@ -XXX,XX +XXX,XX @@ static bool do_vpz_ool(DisasContext *s, arg_rpr_esz *a, | 132 | break; |
100 | tcg_gen_addi_ptr(t_zn, cpu_env, vec_full_reg_offset(s, a->rn)); | 133 | case INDEX_op_add2_i64: |
101 | tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, a->pg)); | 134 | - tcg_out_addsub2(s, TCG_TYPE_I64, a0, a1, REG0(2), REG0(3), args[4], |
102 | fn(temp, t_zn, t_pg, desc); | 135 | + tcg_out_addsub2(s, TCG_TYPE_I64, a0, a1, a2, args[3], args[4], |
103 | - tcg_temp_free_ptr(t_zn); | 136 | args[5], const_args[4], const_args[5], false); |
104 | - tcg_temp_free_ptr(t_pg); | 137 | break; |
105 | 138 | case INDEX_op_sub2_i32: | |
106 | write_fp_dreg(s, a->rd, temp); | 139 | - tcg_out_addsub2(s, TCG_TYPE_I32, a0, a1, REG0(2), REG0(3), |
107 | - tcg_temp_free_i64(temp); | 140 | + tcg_out_addsub2(s, TCG_TYPE_I32, a0, a1, a2, args[3], |
108 | return true; | 141 | (int32_t)args[4], args[5], const_args[4], |
109 | } | 142 | const_args[5], true); |
110 | 143 | break; | |
111 | @@ -XXX,XX +XXX,XX @@ static bool do_index(DisasContext *s, int esz, int rd, | 144 | case INDEX_op_sub2_i64: |
112 | tcg_gen_extrl_i64_i32(s32, start); | 145 | - tcg_out_addsub2(s, TCG_TYPE_I64, a0, a1, REG0(2), REG0(3), args[4], |
113 | tcg_gen_extrl_i64_i32(i32, incr); | 146 | + tcg_out_addsub2(s, TCG_TYPE_I64, a0, a1, a2, args[3], args[4], |
114 | fns[esz](t_zd, s32, i32, desc); | 147 | args[5], const_args[4], const_args[5], true); |
115 | - | 148 | break; |
116 | - tcg_temp_free_i32(s32); | 149 | |
117 | - tcg_temp_free_i32(i32); | 150 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType ext, |
118 | } | ||
119 | - tcg_temp_free_ptr(t_zd); | ||
120 | return true; | ||
121 | } | ||
122 | |||
123 | @@ -XXX,XX +XXX,XX @@ static bool do_pppp_flags(DisasContext *s, arg_rprr_s *a, | ||
124 | tcg_gen_st_i64(pd, cpu_env, dofs); | ||
125 | |||
126 | do_predtest1(pd, pg); | ||
127 | - | ||
128 | - tcg_temp_free_i64(pd); | ||
129 | - tcg_temp_free_i64(pn); | ||
130 | - tcg_temp_free_i64(pm); | ||
131 | - tcg_temp_free_i64(pg); | ||
132 | } else { | ||
133 | /* The operation and flags generation is large. The computation | ||
134 | * of the flags depends on the original contents of the guarding | ||
135 | @@ -XXX,XX +XXX,XX @@ static bool trans_PTEST(DisasContext *s, arg_PTEST *a) | ||
136 | tcg_gen_ld_i64(pn, cpu_env, nofs); | ||
137 | tcg_gen_ld_i64(pg, cpu_env, gofs); | ||
138 | do_predtest1(pn, pg); | ||
139 | - | ||
140 | - tcg_temp_free_i64(pn); | ||
141 | - tcg_temp_free_i64(pg); | ||
142 | } else { | ||
143 | do_predtest(s, nofs, gofs, words); | ||
144 | } | ||
145 | @@ -XXX,XX +XXX,XX @@ static bool do_predset(DisasContext *s, int esz, int rd, int pat, bool setflag) | ||
146 | } | ||
147 | |||
148 | done: | ||
149 | - tcg_temp_free_i64(t); | ||
150 | - | ||
151 | /* PTRUES */ | ||
152 | if (setflag) { | ||
153 | tcg_gen_movi_i32(cpu_NF, -(word != 0)); | ||
154 | @@ -XXX,XX +XXX,XX @@ static bool do_pfirst_pnext(DisasContext *s, arg_rr_esz *a, | ||
155 | t = tcg_temp_new_i32(); | ||
156 | |||
157 | gen_fn(t, t_pd, t_pg, tcg_constant_i32(desc)); | ||
158 | - tcg_temp_free_ptr(t_pd); | ||
159 | - tcg_temp_free_ptr(t_pg); | ||
160 | |||
161 | do_pred_flags(t); | ||
162 | - tcg_temp_free_i32(t); | ||
163 | return true; | ||
164 | } | ||
165 | |||
166 | @@ -XXX,XX +XXX,XX @@ static void do_sat_addsub_64(TCGv_i64 reg, TCGv_i64 val, bool u, bool d) | ||
167 | t2 = tcg_constant_i64(0); | ||
168 | tcg_gen_movcond_i64(TCG_COND_LT, reg, t0, t2, t1, reg); | ||
169 | } | ||
170 | - tcg_temp_free_i64(t1); | ||
171 | } | ||
172 | - tcg_temp_free_i64(t0); | ||
173 | } | ||
174 | |||
175 | /* Similarly with a vector and a scalar operand. */ | ||
176 | @@ -XXX,XX +XXX,XX @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn, | ||
177 | } else { | ||
178 | gen_helper_sve_sqaddi_b(dptr, nptr, t32, desc); | ||
179 | } | ||
180 | - tcg_temp_free_i32(t32); | ||
181 | break; | ||
182 | |||
183 | case MO_16: | ||
184 | @@ -XXX,XX +XXX,XX @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn, | ||
185 | } else { | ||
186 | gen_helper_sve_sqaddi_h(dptr, nptr, t32, desc); | ||
187 | } | ||
188 | - tcg_temp_free_i32(t32); | ||
189 | break; | ||
190 | |||
191 | case MO_32: | ||
192 | @@ -XXX,XX +XXX,XX @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn, | ||
193 | } else { | ||
194 | gen_helper_sve_sqaddi_s(dptr, nptr, t64, desc); | ||
195 | } | ||
196 | - tcg_temp_free_i64(t64); | ||
197 | break; | ||
198 | |||
199 | case MO_64: | ||
200 | @@ -XXX,XX +XXX,XX @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn, | ||
201 | t64 = tcg_temp_new_i64(); | ||
202 | tcg_gen_neg_i64(t64, val); | ||
203 | gen_helper_sve_sqaddi_d(dptr, nptr, t64, desc); | ||
204 | - tcg_temp_free_i64(t64); | ||
205 | } else { | ||
206 | gen_helper_sve_sqaddi_d(dptr, nptr, val, desc); | ||
207 | } | ||
208 | @@ -XXX,XX +XXX,XX @@ static void do_sat_addsub_vec(DisasContext *s, int esz, int rd, int rn, | ||
209 | default: | 151 | default: |
210 | g_assert_not_reached(); | 152 | g_assert_not_reached(); |
211 | } | 153 | } |
212 | - | 154 | - |
213 | - tcg_temp_free_ptr(dptr); | 155 | -#undef REG0 |
214 | - tcg_temp_free_ptr(nptr); | ||
215 | } | 156 | } |
216 | 157 | ||
217 | static bool trans_CNT_r(DisasContext *s, arg_CNT_r *a) | 158 | static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc, |
218 | @@ -XXX,XX +XXX,XX @@ static void do_cpy_m(DisasContext *s, int esz, int rd, int rn, int pg, | 159 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) |
219 | tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg)); | 160 | case INDEX_op_st16_i64: |
220 | 161 | case INDEX_op_st32_i64: | |
221 | fns[esz](t_zd, t_zn, t_pg, val, desc); | 162 | case INDEX_op_st_i64: |
222 | - | 163 | - return C_O0_I2(rZ, r); |
223 | - tcg_temp_free_ptr(t_zd); | 164 | + return C_O0_I2(rz, r); |
224 | - tcg_temp_free_ptr(t_zn); | 165 | |
225 | - tcg_temp_free_ptr(t_pg); | 166 | case INDEX_op_add_i32: |
226 | } | 167 | case INDEX_op_add_i64: |
227 | 168 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | |
228 | static bool trans_FCPY(DisasContext *s, arg_FCPY *a) | 169 | |
229 | @@ -XXX,XX +XXX,XX @@ static void do_insr_i64(DisasContext *s, arg_rrr_esz *a, TCGv_i64 val) | 170 | case INDEX_op_movcond_i32: |
230 | tcg_gen_addi_ptr(t_zn, cpu_env, vec_full_reg_offset(s, a->rn)); | 171 | case INDEX_op_movcond_i64: |
231 | 172 | - return C_O1_I4(r, r, rC, rZ, rZ); | |
232 | fns[a->esz](t_zd, t_zn, val, desc); | 173 | + return C_O1_I4(r, r, rC, rz, rz); |
233 | - | 174 | |
234 | - tcg_temp_free_ptr(t_zd); | 175 | case INDEX_op_qemu_ld_i32: |
235 | - tcg_temp_free_ptr(t_zn); | 176 | case INDEX_op_qemu_ld_i64: |
236 | } | 177 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) |
237 | 178 | return C_O2_I1(r, r, r); | |
238 | static bool trans_INSR_f(DisasContext *s, arg_rrr_esz *a) | 179 | case INDEX_op_qemu_st_i32: |
239 | @@ -XXX,XX +XXX,XX @@ static bool trans_INSR_f(DisasContext *s, arg_rrr_esz *a) | 180 | case INDEX_op_qemu_st_i64: |
240 | TCGv_i64 t = tcg_temp_new_i64(); | 181 | - return C_O0_I2(rZ, r); |
241 | tcg_gen_ld_i64(t, cpu_env, vec_reg_offset(s, a->rm, 0, MO_64)); | 182 | + return C_O0_I2(rz, r); |
242 | do_insr_i64(s, a, t); | 183 | case INDEX_op_qemu_st_i128: |
243 | - tcg_temp_free_i64(t); | 184 | - return C_O0_I3(rZ, rZ, r); |
244 | } | 185 | + return C_O0_I3(rz, rz, r); |
245 | return true; | 186 | |
246 | } | 187 | case INDEX_op_deposit_i32: |
247 | @@ -XXX,XX +XXX,XX @@ static bool do_perm_pred3(DisasContext *s, arg_rrr_esz *a, bool high_odd, | 188 | case INDEX_op_deposit_i64: |
248 | tcg_gen_addi_ptr(t_m, cpu_env, pred_full_reg_offset(s, a->rm)); | 189 | - return C_O1_I2(r, 0, rZ); |
249 | 190 | + return C_O1_I2(r, 0, rz); | |
250 | fn(t_d, t_n, t_m, tcg_constant_i32(desc)); | 191 | |
251 | - | 192 | case INDEX_op_extract2_i32: |
252 | - tcg_temp_free_ptr(t_d); | 193 | case INDEX_op_extract2_i64: |
253 | - tcg_temp_free_ptr(t_n); | 194 | - return C_O1_I2(r, rZ, rZ); |
254 | - tcg_temp_free_ptr(t_m); | 195 | + return C_O1_I2(r, rz, rz); |
255 | return true; | 196 | |
256 | } | 197 | case INDEX_op_add2_i32: |
257 | 198 | case INDEX_op_add2_i64: | |
258 | @@ -XXX,XX +XXX,XX @@ static bool do_perm_pred2(DisasContext *s, arg_rr_esz *a, bool high_odd, | 199 | case INDEX_op_sub2_i32: |
259 | desc = FIELD_DP32(desc, PREDDESC, DATA, high_odd); | 200 | case INDEX_op_sub2_i64: |
260 | 201 | - return C_O2_I4(r, r, rZ, rZ, rA, rMZ); | |
261 | fn(t_d, t_n, tcg_constant_i32(desc)); | 202 | + return C_O2_I4(r, r, rz, rz, rA, rMZ); |
262 | - | 203 | |
263 | - tcg_temp_free_ptr(t_d); | 204 | case INDEX_op_add_vec: |
264 | - tcg_temp_free_ptr(t_n); | 205 | case INDEX_op_sub_vec: |
265 | return true; | ||
266 | } | ||
267 | |||
268 | @@ -XXX,XX +XXX,XX @@ static void find_last_active(DisasContext *s, TCGv_i32 ret, int esz, int pg) | ||
269 | tcg_gen_addi_ptr(t_p, cpu_env, pred_full_reg_offset(s, pg)); | ||
270 | |||
271 | gen_helper_sve_last_active_element(ret, t_p, tcg_constant_i32(desc)); | ||
272 | - | ||
273 | - tcg_temp_free_ptr(t_p); | ||
274 | } | ||
275 | |||
276 | /* Increment LAST to the offset of the next element in the vector, | ||
277 | @@ -XXX,XX +XXX,XX @@ static TCGv_i64 load_last_active(DisasContext *s, TCGv_i32 last, | ||
278 | int rm, int esz) | ||
279 | { | ||
280 | TCGv_ptr p = tcg_temp_new_ptr(); | ||
281 | - TCGv_i64 r; | ||
282 | |||
283 | /* Convert offset into vector into offset into ENV. | ||
284 | * The final adjustment for the vector register base | ||
285 | @@ -XXX,XX +XXX,XX @@ static TCGv_i64 load_last_active(DisasContext *s, TCGv_i32 last, | ||
286 | tcg_gen_ext_i32_ptr(p, last); | ||
287 | tcg_gen_add_ptr(p, p, cpu_env); | ||
288 | |||
289 | - r = load_esz(p, vec_full_reg_offset(s, rm), esz); | ||
290 | - tcg_temp_free_ptr(p); | ||
291 | - | ||
292 | - return r; | ||
293 | + return load_esz(p, vec_full_reg_offset(s, rm), esz); | ||
294 | } | ||
295 | |||
296 | /* Compute CLAST for a Zreg. */ | ||
297 | @@ -XXX,XX +XXX,XX @@ static bool do_clast_vector(DisasContext *s, arg_rprr_esz *a, bool before) | ||
298 | } | ||
299 | |||
300 | ele = load_last_active(s, last, a->rm, esz); | ||
301 | - tcg_temp_free_i32(last); | ||
302 | |||
303 | vsz = vec_full_reg_size(s); | ||
304 | tcg_gen_gvec_dup_i64(esz, vec_full_reg_offset(s, a->rd), vsz, vsz, ele); | ||
305 | - tcg_temp_free_i64(ele); | ||
306 | |||
307 | /* If this insn used MOVPRFX, we may need a second move. */ | ||
308 | if (a->rd != a->rn) { | ||
309 | @@ -XXX,XX +XXX,XX @@ static void do_clast_scalar(DisasContext *s, int esz, int pg, int rm, | ||
310 | * a conditional move. | ||
311 | */ | ||
312 | ele = load_last_active(s, last, rm, esz); | ||
313 | - tcg_temp_free_i32(last); | ||
314 | |||
315 | tcg_gen_movcond_i64(TCG_COND_GE, reg_val, cmp, tcg_constant_i64(0), | ||
316 | ele, reg_val); | ||
317 | - | ||
318 | - tcg_temp_free_i64(cmp); | ||
319 | - tcg_temp_free_i64(ele); | ||
320 | } | ||
321 | |||
322 | /* Compute CLAST for a Vreg. */ | ||
323 | @@ -XXX,XX +XXX,XX @@ static bool do_clast_fp(DisasContext *s, arg_rpr_esz *a, bool before) | ||
324 | |||
325 | do_clast_scalar(s, esz, a->pg, a->rn, before, reg); | ||
326 | write_fp_dreg(s, a->rd, reg); | ||
327 | - tcg_temp_free_i64(reg); | ||
328 | } | ||
329 | return true; | ||
330 | } | ||
331 | @@ -XXX,XX +XXX,XX @@ static TCGv_i64 do_last_scalar(DisasContext *s, int esz, | ||
332 | int pg, int rm, bool before) | ||
333 | { | ||
334 | TCGv_i32 last = tcg_temp_new_i32(); | ||
335 | - TCGv_i64 ret; | ||
336 | |||
337 | find_last_active(s, last, esz, pg); | ||
338 | if (before) { | ||
339 | @@ -XXX,XX +XXX,XX @@ static TCGv_i64 do_last_scalar(DisasContext *s, int esz, | ||
340 | incr_last_active(s, last, esz); | ||
341 | } | ||
342 | |||
343 | - ret = load_last_active(s, last, rm, esz); | ||
344 | - tcg_temp_free_i32(last); | ||
345 | - return ret; | ||
346 | + return load_last_active(s, last, rm, esz); | ||
347 | } | ||
348 | |||
349 | /* Compute LAST for a Vreg. */ | ||
350 | @@ -XXX,XX +XXX,XX @@ static bool do_last_fp(DisasContext *s, arg_rpr_esz *a, bool before) | ||
351 | if (sve_access_check(s)) { | ||
352 | TCGv_i64 val = do_last_scalar(s, a->esz, a->pg, a->rn, before); | ||
353 | write_fp_dreg(s, a->rd, val); | ||
354 | - tcg_temp_free_i64(val); | ||
355 | } | ||
356 | return true; | ||
357 | } | ||
358 | @@ -XXX,XX +XXX,XX @@ static bool do_last_general(DisasContext *s, arg_rpr_esz *a, bool before) | ||
359 | if (sve_access_check(s)) { | ||
360 | TCGv_i64 val = do_last_scalar(s, a->esz, a->pg, a->rn, before); | ||
361 | tcg_gen_mov_i64(cpu_reg(s, a->rd), val); | ||
362 | - tcg_temp_free_i64(val); | ||
363 | } | ||
364 | return true; | ||
365 | } | ||
366 | @@ -XXX,XX +XXX,XX @@ static bool trans_CPY_m_v(DisasContext *s, arg_rpr_esz *a) | ||
367 | int ofs = vec_reg_offset(s, a->rn, 0, a->esz); | ||
368 | TCGv_i64 t = load_esz(cpu_env, ofs, a->esz); | ||
369 | do_cpy_m(s, a->esz, a->rd, a->rd, a->pg, t); | ||
370 | - tcg_temp_free_i64(t); | ||
371 | } | ||
372 | return true; | ||
373 | } | ||
374 | @@ -XXX,XX +XXX,XX @@ static bool do_ppzz_flags(DisasContext *s, arg_rprr_esz *a, | ||
375 | |||
376 | gen_fn(t, pd, zn, zm, pg, tcg_constant_i32(simd_desc(vsz, vsz, 0))); | ||
377 | |||
378 | - tcg_temp_free_ptr(pd); | ||
379 | - tcg_temp_free_ptr(zn); | ||
380 | - tcg_temp_free_ptr(zm); | ||
381 | - tcg_temp_free_ptr(pg); | ||
382 | - | ||
383 | do_pred_flags(t); | ||
384 | - | ||
385 | - tcg_temp_free_i32(t); | ||
386 | return true; | ||
387 | } | ||
388 | |||
389 | @@ -XXX,XX +XXX,XX @@ static bool do_ppzi_flags(DisasContext *s, arg_rpri_esz *a, | ||
390 | |||
391 | gen_fn(t, pd, zn, pg, tcg_constant_i32(simd_desc(vsz, vsz, a->imm))); | ||
392 | |||
393 | - tcg_temp_free_ptr(pd); | ||
394 | - tcg_temp_free_ptr(zn); | ||
395 | - tcg_temp_free_ptr(pg); | ||
396 | - | ||
397 | do_pred_flags(t); | ||
398 | - | ||
399 | - tcg_temp_free_i32(t); | ||
400 | return true; | ||
401 | } | ||
402 | |||
403 | @@ -XXX,XX +XXX,XX @@ static bool do_brk3(DisasContext *s, arg_rprr_s *a, | ||
404 | TCGv_i32 t = tcg_temp_new_i32(); | ||
405 | fn_s(t, d, n, m, g, desc); | ||
406 | do_pred_flags(t); | ||
407 | - tcg_temp_free_i32(t); | ||
408 | } else { | ||
409 | fn(d, n, m, g, desc); | ||
410 | } | ||
411 | - tcg_temp_free_ptr(d); | ||
412 | - tcg_temp_free_ptr(n); | ||
413 | - tcg_temp_free_ptr(m); | ||
414 | - tcg_temp_free_ptr(g); | ||
415 | return true; | ||
416 | } | ||
417 | |||
418 | @@ -XXX,XX +XXX,XX @@ static bool do_brk2(DisasContext *s, arg_rpr_s *a, | ||
419 | TCGv_i32 t = tcg_temp_new_i32(); | ||
420 | fn_s(t, d, n, g, desc); | ||
421 | do_pred_flags(t); | ||
422 | - tcg_temp_free_i32(t); | ||
423 | } else { | ||
424 | fn(d, n, g, desc); | ||
425 | } | ||
426 | - tcg_temp_free_ptr(d); | ||
427 | - tcg_temp_free_ptr(n); | ||
428 | - tcg_temp_free_ptr(g); | ||
429 | return true; | ||
430 | } | ||
431 | |||
432 | @@ -XXX,XX +XXX,XX @@ static void do_cntp(DisasContext *s, TCGv_i64 val, int esz, int pn, int pg) | ||
433 | TCGv_i64 g = tcg_temp_new_i64(); | ||
434 | tcg_gen_ld_i64(g, cpu_env, pred_full_reg_offset(s, pg)); | ||
435 | tcg_gen_and_i64(val, val, g); | ||
436 | - tcg_temp_free_i64(g); | ||
437 | } | ||
438 | |||
439 | /* Reduce the pred_esz_masks value simply to reduce the | ||
440 | @@ -XXX,XX +XXX,XX @@ static void do_cntp(DisasContext *s, TCGv_i64 val, int esz, int pn, int pg) | ||
441 | tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg)); | ||
442 | |||
443 | gen_helper_sve_cntp(val, t_pn, t_pg, tcg_constant_i32(desc)); | ||
444 | - tcg_temp_free_ptr(t_pn); | ||
445 | - tcg_temp_free_ptr(t_pg); | ||
446 | } | ||
447 | } | ||
448 | |||
449 | @@ -XXX,XX +XXX,XX @@ static bool trans_INCDECP_r(DisasContext *s, arg_incdec_pred *a) | ||
450 | } else { | ||
451 | tcg_gen_add_i64(reg, reg, val); | ||
452 | } | ||
453 | - tcg_temp_free_i64(val); | ||
454 | } | ||
455 | return true; | ||
456 | } | ||
457 | @@ -XXX,XX +XXX,XX @@ static bool trans_CTERM(DisasContext *s, arg_CTERM *a) | ||
458 | |||
459 | tcg_gen_setcond_i64(cond, cmp, rn, rm); | ||
460 | tcg_gen_extrl_i64_i32(cpu_NF, cmp); | ||
461 | - tcg_temp_free_i64(cmp); | ||
462 | |||
463 | /* VF = !NF & !CF. */ | ||
464 | tcg_gen_xori_i32(cpu_VF, cpu_NF, 1); | ||
465 | @@ -XXX,XX +XXX,XX @@ static bool trans_WHILE(DisasContext *s, arg_WHILE *a) | ||
466 | /* Set the count to zero if the condition is false. */ | ||
467 | tcg_gen_movi_i64(t1, 0); | ||
468 | tcg_gen_movcond_i64(cond, t0, op0, op1, t0, t1); | ||
469 | - tcg_temp_free_i64(t1); | ||
470 | |||
471 | /* Since we're bounded, pass as a 32-bit type. */ | ||
472 | t2 = tcg_temp_new_i32(); | ||
473 | tcg_gen_extrl_i64_i32(t2, t0); | ||
474 | - tcg_temp_free_i64(t0); | ||
475 | |||
476 | /* Scale elements to bits. */ | ||
477 | tcg_gen_shli_i32(t2, t2, a->esz); | ||
478 | @@ -XXX,XX +XXX,XX @@ static bool trans_WHILE(DisasContext *s, arg_WHILE *a) | ||
479 | gen_helper_sve_whileg(t2, ptr, t2, tcg_constant_i32(desc)); | ||
480 | } | ||
481 | do_pred_flags(t2); | ||
482 | - | ||
483 | - tcg_temp_free_ptr(ptr); | ||
484 | - tcg_temp_free_i32(t2); | ||
485 | return true; | ||
486 | } | ||
487 | |||
488 | @@ -XXX,XX +XXX,XX @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a) | ||
489 | tcg_gen_sub_i64(diff, op0, op1); | ||
490 | tcg_gen_sub_i64(t1, op1, op0); | ||
491 | tcg_gen_movcond_i64(TCG_COND_GEU, diff, op0, op1, diff, t1); | ||
492 | - tcg_temp_free_i64(t1); | ||
493 | /* Round down to a multiple of ESIZE. */ | ||
494 | tcg_gen_andi_i64(diff, diff, -1 << a->esz); | ||
495 | /* If op1 == op0, diff == 0, and the condition is always true. */ | ||
496 | @@ -XXX,XX +XXX,XX @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a) | ||
497 | /* Since we're bounded, pass as a 32-bit type. */ | ||
498 | t2 = tcg_temp_new_i32(); | ||
499 | tcg_gen_extrl_i64_i32(t2, diff); | ||
500 | - tcg_temp_free_i64(diff); | ||
501 | |||
502 | desc = FIELD_DP32(desc, PREDDESC, OPRSZ, vsz / 8); | ||
503 | desc = FIELD_DP32(desc, PREDDESC, ESZ, a->esz); | ||
504 | @@ -XXX,XX +XXX,XX @@ static bool trans_WHILE_ptr(DisasContext *s, arg_WHILE_ptr *a) | ||
505 | |||
506 | gen_helper_sve_whilel(t2, ptr, t2, tcg_constant_i32(desc)); | ||
507 | do_pred_flags(t2); | ||
508 | - | ||
509 | - tcg_temp_free_ptr(ptr); | ||
510 | - tcg_temp_free_i32(t2); | ||
511 | return true; | ||
512 | } | ||
513 | |||
514 | @@ -XXX,XX +XXX,XX @@ static bool do_reduce(DisasContext *s, arg_rpr_esz *a, | ||
515 | status = fpstatus_ptr(a->esz == MO_16 ? FPST_FPCR_F16 : FPST_FPCR); | ||
516 | |||
517 | fn(temp, t_zn, t_pg, status, t_desc); | ||
518 | - tcg_temp_free_ptr(t_zn); | ||
519 | - tcg_temp_free_ptr(t_pg); | ||
520 | - tcg_temp_free_ptr(status); | ||
521 | |||
522 | write_fp_dreg(s, a->rd, temp); | ||
523 | - tcg_temp_free_i64(temp); | ||
524 | return true; | ||
525 | } | ||
526 | |||
527 | @@ -XXX,XX +XXX,XX @@ static bool do_ppz_fp(DisasContext *s, arg_rpr_esz *a, | ||
528 | vec_full_reg_offset(s, a->rn), | ||
529 | pred_full_reg_offset(s, a->pg), | ||
530 | status, vsz, vsz, 0, fn); | ||
531 | - tcg_temp_free_ptr(status); | ||
532 | } | ||
533 | return true; | ||
534 | } | ||
535 | @@ -XXX,XX +XXX,XX @@ static bool trans_FADDA(DisasContext *s, arg_rprr_esz *a) | ||
536 | |||
537 | fns[a->esz - 1](t_val, t_val, t_rm, t_pg, t_fpst, t_desc); | ||
538 | |||
539 | - tcg_temp_free_ptr(t_fpst); | ||
540 | - tcg_temp_free_ptr(t_pg); | ||
541 | - tcg_temp_free_ptr(t_rm); | ||
542 | - | ||
543 | write_fp_dreg(s, a->rd, t_val); | ||
544 | - tcg_temp_free_i64(t_val); | ||
545 | return true; | ||
546 | } | ||
547 | |||
548 | @@ -XXX,XX +XXX,XX @@ static void do_fp_scalar(DisasContext *s, int zd, int zn, int pg, bool is_fp16, | ||
549 | status = fpstatus_ptr(is_fp16 ? FPST_FPCR_F16 : FPST_FPCR); | ||
550 | desc = tcg_constant_i32(simd_desc(vsz, vsz, 0)); | ||
551 | fn(t_zd, t_zn, t_pg, scalar, status, desc); | ||
552 | - | ||
553 | - tcg_temp_free_ptr(status); | ||
554 | - tcg_temp_free_ptr(t_pg); | ||
555 | - tcg_temp_free_ptr(t_zn); | ||
556 | - tcg_temp_free_ptr(t_zd); | ||
557 | } | ||
558 | |||
559 | static bool do_fp_imm(DisasContext *s, arg_rpri_esz *a, uint64_t imm, | ||
560 | @@ -XXX,XX +XXX,XX @@ static bool do_fp_cmp(DisasContext *s, arg_rprr_esz *a, | ||
561 | vec_full_reg_offset(s, a->rm), | ||
562 | pred_full_reg_offset(s, a->pg), | ||
563 | status, vsz, vsz, 0, fn); | ||
564 | - tcg_temp_free_ptr(status); | ||
565 | } | ||
566 | return true; | ||
567 | } | ||
568 | @@ -XXX,XX +XXX,XX @@ static bool do_frint_mode(DisasContext *s, arg_rpr_esz *a, | ||
569 | status, vsz, vsz, 0, fn); | ||
570 | |||
571 | gen_helper_set_rmode(tmode, tmode, status); | ||
572 | - tcg_temp_free_i32(tmode); | ||
573 | - tcg_temp_free_ptr(status); | ||
574 | return true; | ||
575 | } | ||
576 | |||
577 | @@ -XXX,XX +XXX,XX @@ void gen_sve_ldr(DisasContext *s, TCGv_ptr base, int vofs, | ||
578 | dirty_addr = tcg_temp_new_i64(); | ||
579 | tcg_gen_addi_i64(dirty_addr, cpu_reg_sp(s, rn), imm); | ||
580 | clean_addr = gen_mte_checkN(s, dirty_addr, false, rn != 31, len); | ||
581 | - tcg_temp_free_i64(dirty_addr); | ||
582 | |||
583 | /* | ||
584 | * Note that unpredicated load/store of vector/predicate registers | ||
585 | @@ -XXX,XX +XXX,XX @@ void gen_sve_ldr(DisasContext *s, TCGv_ptr base, int vofs, | ||
586 | tcg_gen_st_i64(t0, base, vofs + i); | ||
587 | tcg_gen_addi_i64(clean_addr, clean_addr, 8); | ||
588 | } | ||
589 | - tcg_temp_free_i64(t0); | ||
590 | } else { | ||
591 | TCGLabel *loop = gen_new_label(); | ||
592 | TCGv_ptr tp, i = tcg_const_ptr(0); | ||
593 | @@ -XXX,XX +XXX,XX @@ void gen_sve_ldr(DisasContext *s, TCGv_ptr base, int vofs, | ||
594 | tcg_gen_add_ptr(tp, base, i); | ||
595 | tcg_gen_addi_ptr(i, i, 8); | ||
596 | tcg_gen_st_i64(t0, tp, vofs); | ||
597 | - tcg_temp_free_ptr(tp); | ||
598 | - tcg_temp_free_i64(t0); | ||
599 | |||
600 | tcg_gen_brcondi_ptr(TCG_COND_LTU, i, len_align, loop); | ||
601 | - tcg_temp_free_ptr(i); | ||
602 | } | ||
603 | |||
604 | /* | ||
605 | @@ -XXX,XX +XXX,XX @@ void gen_sve_ldr(DisasContext *s, TCGv_ptr base, int vofs, | ||
606 | tcg_gen_addi_i64(clean_addr, clean_addr, 4); | ||
607 | tcg_gen_qemu_ld_i64(t1, clean_addr, midx, MO_LEUW); | ||
608 | tcg_gen_deposit_i64(t0, t0, t1, 32, 32); | ||
609 | - tcg_temp_free_i64(t1); | ||
610 | break; | ||
611 | |||
612 | default: | ||
613 | g_assert_not_reached(); | ||
614 | } | ||
615 | tcg_gen_st_i64(t0, base, vofs + len_align); | ||
616 | - tcg_temp_free_i64(t0); | ||
617 | } | ||
618 | } | ||
619 | |||
620 | @@ -XXX,XX +XXX,XX @@ void gen_sve_str(DisasContext *s, TCGv_ptr base, int vofs, | ||
621 | dirty_addr = tcg_temp_new_i64(); | ||
622 | tcg_gen_addi_i64(dirty_addr, cpu_reg_sp(s, rn), imm); | ||
623 | clean_addr = gen_mte_checkN(s, dirty_addr, false, rn != 31, len); | ||
624 | - tcg_temp_free_i64(dirty_addr); | ||
625 | |||
626 | /* Note that unpredicated load/store of vector/predicate registers | ||
627 | * are defined as a stream of bytes, which equates to little-endian | ||
628 | @@ -XXX,XX +XXX,XX @@ void gen_sve_str(DisasContext *s, TCGv_ptr base, int vofs, | ||
629 | tcg_gen_qemu_st_i64(t0, clean_addr, midx, MO_LEUQ); | ||
630 | tcg_gen_addi_i64(clean_addr, clean_addr, 8); | ||
631 | } | ||
632 | - tcg_temp_free_i64(t0); | ||
633 | } else { | ||
634 | TCGLabel *loop = gen_new_label(); | ||
635 | TCGv_ptr tp, i = tcg_const_ptr(0); | ||
636 | @@ -XXX,XX +XXX,XX @@ void gen_sve_str(DisasContext *s, TCGv_ptr base, int vofs, | ||
637 | tcg_gen_add_ptr(tp, base, i); | ||
638 | tcg_gen_ld_i64(t0, tp, vofs); | ||
639 | tcg_gen_addi_ptr(i, i, 8); | ||
640 | - tcg_temp_free_ptr(tp); | ||
641 | |||
642 | tcg_gen_qemu_st_i64(t0, clean_addr, midx, MO_LEUQ); | ||
643 | tcg_gen_addi_i64(clean_addr, clean_addr, 8); | ||
644 | - tcg_temp_free_i64(t0); | ||
645 | |||
646 | tcg_gen_brcondi_ptr(TCG_COND_LTU, i, len_align, loop); | ||
647 | - tcg_temp_free_ptr(i); | ||
648 | } | ||
649 | |||
650 | /* Predicate register stores can be any multiple of 2. */ | ||
651 | @@ -XXX,XX +XXX,XX @@ void gen_sve_str(DisasContext *s, TCGv_ptr base, int vofs, | ||
652 | default: | ||
653 | g_assert_not_reached(); | ||
654 | } | ||
655 | - tcg_temp_free_i64(t0); | ||
656 | } | ||
657 | } | ||
658 | |||
659 | @@ -XXX,XX +XXX,XX @@ static void do_mem_zpa(DisasContext *s, int zt, int pg, TCGv_i64 addr, | ||
660 | |||
661 | tcg_gen_addi_ptr(t_pg, cpu_env, pred_full_reg_offset(s, pg)); | ||
662 | fn(cpu_env, t_pg, addr, tcg_constant_i32(desc)); | ||
663 | - | ||
664 | - tcg_temp_free_ptr(t_pg); | ||
665 | } | ||
666 | |||
667 | /* Indexed by [mte][be][dtype][nreg] */ | ||
668 | @@ -XXX,XX +XXX,XX @@ static void do_ldrq(DisasContext *s, int zt, int pg, TCGv_i64 addr, int dtype) | ||
669 | |||
670 | poff = offsetof(CPUARMState, vfp.preg_tmp); | ||
671 | tcg_gen_st_i64(tmp, cpu_env, poff); | ||
672 | - tcg_temp_free_i64(tmp); | ||
673 | } | ||
674 | |||
675 | t_pg = tcg_temp_new_ptr(); | ||
676 | @@ -XXX,XX +XXX,XX @@ static void do_ldrq(DisasContext *s, int zt, int pg, TCGv_i64 addr, int dtype) | ||
677 | = ldr_fns[s->mte_active[0]][s->be_data == MO_BE][dtype][0]; | ||
678 | fn(cpu_env, t_pg, addr, tcg_constant_i32(simd_desc(16, 16, zt))); | ||
679 | |||
680 | - tcg_temp_free_ptr(t_pg); | ||
681 | - | ||
682 | /* Replicate that first quadword. */ | ||
683 | if (vsz > 16) { | ||
684 | int doff = vec_full_reg_offset(s, zt); | ||
685 | @@ -XXX,XX +XXX,XX @@ static void do_ldro(DisasContext *s, int zt, int pg, TCGv_i64 addr, int dtype) | ||
686 | |||
687 | poff = offsetof(CPUARMState, vfp.preg_tmp); | ||
688 | tcg_gen_st_i64(tmp, cpu_env, poff); | ||
689 | - tcg_temp_free_i64(tmp); | ||
690 | } | ||
691 | |||
692 | t_pg = tcg_temp_new_ptr(); | ||
693 | @@ -XXX,XX +XXX,XX @@ static void do_ldro(DisasContext *s, int zt, int pg, TCGv_i64 addr, int dtype) | ||
694 | = ldr_fns[s->mte_active[0]][s->be_data == MO_BE][dtype][0]; | ||
695 | fn(cpu_env, t_pg, addr, tcg_constant_i32(simd_desc(32, 32, zt))); | ||
696 | |||
697 | - tcg_temp_free_ptr(t_pg); | ||
698 | - | ||
699 | /* | ||
700 | * Replicate that first octaword. | ||
701 | * The replication happens in units of 32; if the full vector size | ||
702 | @@ -XXX,XX +XXX,XX @@ static bool trans_LD1R_zpri(DisasContext *s, arg_rpri_load *a) | ||
703 | tcg_gen_ld_i64(temp, cpu_env, pred_full_reg_offset(s, a->pg)); | ||
704 | tcg_gen_andi_i64(temp, temp, pred_esz_masks[esz] & psz_mask); | ||
705 | tcg_gen_brcondi_i64(TCG_COND_EQ, temp, 0, over); | ||
706 | - tcg_temp_free_i64(temp); | ||
707 | } else { | ||
708 | TCGv_i32 t32 = tcg_temp_new_i32(); | ||
709 | find_last_active(s, t32, esz, a->pg); | ||
710 | tcg_gen_brcondi_i32(TCG_COND_LT, t32, 0, over); | ||
711 | - tcg_temp_free_i32(t32); | ||
712 | } | ||
713 | |||
714 | /* Load the data. */ | ||
715 | @@ -XXX,XX +XXX,XX @@ static bool trans_LD1R_zpri(DisasContext *s, arg_rpri_load *a) | ||
716 | /* Broadcast to *all* elements. */ | ||
717 | tcg_gen_gvec_dup_i64(esz, vec_full_reg_offset(s, a->rd), | ||
718 | vsz, vsz, temp); | ||
719 | - tcg_temp_free_i64(temp); | ||
720 | |||
721 | /* Zero the inactive elements. */ | ||
722 | gen_set_label(over); | ||
723 | @@ -XXX,XX +XXX,XX @@ static void do_mem_zpz(DisasContext *s, int zt, int pg, int zm, | ||
724 | tcg_gen_addi_ptr(t_zm, cpu_env, vec_full_reg_offset(s, zm)); | ||
725 | tcg_gen_addi_ptr(t_zt, cpu_env, vec_full_reg_offset(s, zt)); | ||
726 | fn(cpu_env, t_zt, t_pg, t_zm, scalar, tcg_constant_i32(desc)); | ||
727 | - | ||
728 | - tcg_temp_free_ptr(t_zt); | ||
729 | - tcg_temp_free_ptr(t_zm); | ||
730 | - tcg_temp_free_ptr(t_pg); | ||
731 | } | ||
732 | |||
733 | /* Indexed by [mte][be][ff][xs][u][msz]. */ | ||
734 | @@ -XXX,XX +XXX,XX @@ static void gen_sshll_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t imm) | ||
735 | TCGv_vec t = tcg_temp_new_vec_matching(d); | ||
736 | tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(halfbits, halfbits)); | ||
737 | tcg_gen_and_vec(vece, d, n, t); | ||
738 | - tcg_temp_free_vec(t); | ||
739 | } else { | ||
740 | tcg_gen_sari_vec(vece, d, n, halfbits); | ||
741 | tcg_gen_shli_vec(vece, d, d, shl); | ||
742 | @@ -XXX,XX +XXX,XX @@ static void gen_ushll_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t imm) | ||
743 | TCGv_vec t = tcg_temp_new_vec_matching(d); | ||
744 | tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(halfbits, halfbits)); | ||
745 | tcg_gen_and_vec(vece, d, n, t); | ||
746 | - tcg_temp_free_vec(t); | ||
747 | } else { | ||
748 | tcg_gen_shri_vec(vece, d, n, halfbits); | ||
749 | tcg_gen_shli_vec(vece, d, d, shl); | ||
750 | @@ -XXX,XX +XXX,XX @@ static void gen_ushll_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t imm) | ||
751 | TCGv_vec t = tcg_temp_new_vec_matching(d); | ||
752 | tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(0, halfbits)); | ||
753 | tcg_gen_and_vec(vece, d, n, t); | ||
754 | - tcg_temp_free_vec(t); | ||
755 | } else { | ||
756 | tcg_gen_shli_vec(vece, d, n, halfbits); | ||
757 | tcg_gen_shri_vec(vece, d, d, halfbits - shl); | ||
758 | @@ -XXX,XX +XXX,XX @@ static void gen_sqxtnb_vec(unsigned vece, TCGv_vec d, TCGv_vec n) | ||
759 | tcg_gen_smin_vec(vece, d, d, t); | ||
760 | tcg_gen_dupi_vec(vece, t, mask); | ||
761 | tcg_gen_and_vec(vece, d, d, t); | ||
762 | - tcg_temp_free_vec(t); | ||
763 | } | ||
764 | |||
765 | static const GVecGen2 sqxtnb_ops[3] = { | ||
766 | @@ -XXX,XX +XXX,XX @@ static void gen_sqxtnt_vec(unsigned vece, TCGv_vec d, TCGv_vec n) | ||
767 | tcg_gen_shli_vec(vece, n, n, halfbits); | ||
768 | tcg_gen_dupi_vec(vece, t, mask); | ||
769 | tcg_gen_bitsel_vec(vece, d, t, d, n); | ||
770 | - tcg_temp_free_vec(t); | ||
771 | } | ||
772 | |||
773 | static const GVecGen2 sqxtnt_ops[3] = { | ||
774 | @@ -XXX,XX +XXX,XX @@ static void gen_uqxtnb_vec(unsigned vece, TCGv_vec d, TCGv_vec n) | ||
775 | |||
776 | tcg_gen_dupi_vec(vece, t, max); | ||
777 | tcg_gen_umin_vec(vece, d, n, t); | ||
778 | - tcg_temp_free_vec(t); | ||
779 | } | ||
780 | |||
781 | static const GVecGen2 uqxtnb_ops[3] = { | ||
782 | @@ -XXX,XX +XXX,XX @@ static void gen_uqxtnt_vec(unsigned vece, TCGv_vec d, TCGv_vec n) | ||
783 | tcg_gen_umin_vec(vece, n, n, t); | ||
784 | tcg_gen_shli_vec(vece, n, n, halfbits); | ||
785 | tcg_gen_bitsel_vec(vece, d, t, d, n); | ||
786 | - tcg_temp_free_vec(t); | ||
787 | } | ||
788 | |||
789 | static const GVecGen2 uqxtnt_ops[3] = { | ||
790 | @@ -XXX,XX +XXX,XX @@ static void gen_sqxtunb_vec(unsigned vece, TCGv_vec d, TCGv_vec n) | ||
791 | tcg_gen_smax_vec(vece, d, n, t); | ||
792 | tcg_gen_dupi_vec(vece, t, max); | ||
793 | tcg_gen_umin_vec(vece, d, d, t); | ||
794 | - tcg_temp_free_vec(t); | ||
795 | } | ||
796 | |||
797 | static const GVecGen2 sqxtunb_ops[3] = { | ||
798 | @@ -XXX,XX +XXX,XX @@ static void gen_sqxtunt_vec(unsigned vece, TCGv_vec d, TCGv_vec n) | ||
799 | tcg_gen_umin_vec(vece, n, n, t); | ||
800 | tcg_gen_shli_vec(vece, n, n, halfbits); | ||
801 | tcg_gen_bitsel_vec(vece, d, t, d, n); | ||
802 | - tcg_temp_free_vec(t); | ||
803 | } | ||
804 | |||
805 | static const GVecGen2 sqxtunt_ops[3] = { | ||
806 | @@ -XXX,XX +XXX,XX @@ static void gen_shrnb_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t shr) | ||
807 | tcg_gen_shri_vec(vece, n, n, shr); | ||
808 | tcg_gen_dupi_vec(vece, t, mask); | ||
809 | tcg_gen_and_vec(vece, d, n, t); | ||
810 | - tcg_temp_free_vec(t); | ||
811 | } | ||
812 | |||
813 | static const TCGOpcode shrnb_vec_list[] = { INDEX_op_shri_vec, 0 }; | ||
814 | @@ -XXX,XX +XXX,XX @@ static void gen_shrnt_vec(unsigned vece, TCGv_vec d, TCGv_vec n, int64_t shr) | ||
815 | tcg_gen_shli_vec(vece, n, n, halfbits - shr); | ||
816 | tcg_gen_dupi_vec(vece, t, mask); | ||
817 | tcg_gen_bitsel_vec(vece, d, t, d, n); | ||
818 | - tcg_temp_free_vec(t); | ||
819 | } | ||
820 | |||
821 | static const TCGOpcode shrnt_vec_list[] = { INDEX_op_shli_vec, 0 }; | ||
822 | @@ -XXX,XX +XXX,XX @@ static void gen_sqshrunb_vec(unsigned vece, TCGv_vec d, | ||
823 | tcg_gen_smax_vec(vece, n, n, t); | ||
824 | tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(0, halfbits)); | ||
825 | tcg_gen_umin_vec(vece, d, n, t); | ||
826 | - tcg_temp_free_vec(t); | ||
827 | } | ||
828 | |||
829 | static const TCGOpcode sqshrunb_vec_list[] = { | ||
830 | @@ -XXX,XX +XXX,XX @@ static void gen_sqshrunt_vec(unsigned vece, TCGv_vec d, | ||
831 | tcg_gen_umin_vec(vece, n, n, t); | ||
832 | tcg_gen_shli_vec(vece, n, n, halfbits); | ||
833 | tcg_gen_bitsel_vec(vece, d, t, d, n); | ||
834 | - tcg_temp_free_vec(t); | ||
835 | } | ||
836 | |||
837 | static const TCGOpcode sqshrunt_vec_list[] = { | ||
838 | @@ -XXX,XX +XXX,XX @@ static void gen_sqshrnb_vec(unsigned vece, TCGv_vec d, | ||
839 | tcg_gen_smin_vec(vece, n, n, t); | ||
840 | tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(0, halfbits)); | ||
841 | tcg_gen_and_vec(vece, d, n, t); | ||
842 | - tcg_temp_free_vec(t); | ||
843 | } | ||
844 | |||
845 | static const TCGOpcode sqshrnb_vec_list[] = { | ||
846 | @@ -XXX,XX +XXX,XX @@ static void gen_sqshrnt_vec(unsigned vece, TCGv_vec d, | ||
847 | tcg_gen_shli_vec(vece, n, n, halfbits); | ||
848 | tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(0, halfbits)); | ||
849 | tcg_gen_bitsel_vec(vece, d, t, d, n); | ||
850 | - tcg_temp_free_vec(t); | ||
851 | } | ||
852 | |||
853 | static const TCGOpcode sqshrnt_vec_list[] = { | ||
854 | @@ -XXX,XX +XXX,XX @@ static void gen_uqshrnb_vec(unsigned vece, TCGv_vec d, | ||
855 | tcg_gen_shri_vec(vece, n, n, shr); | ||
856 | tcg_gen_dupi_vec(vece, t, MAKE_64BIT_MASK(0, halfbits)); | ||
857 | tcg_gen_umin_vec(vece, d, n, t); | ||
858 | - tcg_temp_free_vec(t); | ||
859 | } | ||
860 | |||
861 | static const TCGOpcode uqshrnb_vec_list[] = { | ||
862 | @@ -XXX,XX +XXX,XX @@ static void gen_uqshrnt_vec(unsigned vece, TCGv_vec d, | ||
863 | tcg_gen_umin_vec(vece, n, n, t); | ||
864 | tcg_gen_shli_vec(vece, n, n, halfbits); | ||
865 | tcg_gen_bitsel_vec(vece, d, t, d, n); | ||
866 | - tcg_temp_free_vec(t); | ||
867 | } | ||
868 | |||
869 | static const TCGOpcode uqshrnt_vec_list[] = { | ||
870 | @@ -XXX,XX +XXX,XX @@ static bool trans_PSEL(DisasContext *s, arg_psel *a) | ||
871 | /* Apply to either copy the source, or write zeros. */ | ||
872 | tcg_gen_gvec_ands(MO_64, pred_full_reg_offset(s, a->pd), | ||
873 | pred_full_reg_offset(s, a->pn), tmp, pl, pl); | ||
874 | - | ||
875 | - tcg_temp_free_i64(tmp); | ||
876 | - tcg_temp_free_i64(dbit); | ||
877 | - tcg_temp_free_i64(didx); | ||
878 | - tcg_temp_free_ptr(ptr); | ||
879 | return true; | ||
880 | } | ||
881 | |||
882 | -- | 206 | -- |
883 | 2.34.1 | 207 | 2.43.0 | diff view generated by jsdifflib |
1 | Pass CPUTLBEntryFull to get_physical_address instead | 1 | Replace target-specific 'Z' with generic 'z'. |
---|---|---|---|
2 | of a collection of pointers. | ||
3 | 2 | ||
4 | Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | ||
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 | target/sparc/mmu_helper.c | 121 +++++++++++++++++--------------------- | 6 | tcg/loongarch64/tcg-target-con-set.h | 15 ++++++------- |
9 | 1 file changed, 54 insertions(+), 67 deletions(-) | 7 | tcg/loongarch64/tcg-target-con-str.h | 1 - |
8 | tcg/loongarch64/tcg-target.c.inc | 32 ++++++++++++---------------- | ||
9 | 3 files changed, 21 insertions(+), 27 deletions(-) | ||
10 | 10 | ||
11 | diff --git a/target/sparc/mmu_helper.c b/target/sparc/mmu_helper.c | 11 | diff --git a/tcg/loongarch64/tcg-target-con-set.h b/tcg/loongarch64/tcg-target-con-set.h |
12 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/target/sparc/mmu_helper.c | 13 | --- a/tcg/loongarch64/tcg-target-con-set.h |
14 | +++ b/target/sparc/mmu_helper.c | 14 | +++ b/tcg/loongarch64/tcg-target-con-set.h |
15 | @@ -XXX,XX +XXX,XX @@ static const int perm_table[2][8] = { | 15 | @@ -XXX,XX +XXX,XX @@ |
16 | } | 16 | * tcg-target-con-str.h; the constraint combination is inclusive or. |
17 | }; | 17 | */ |
18 | 18 | C_O0_I1(r) | |
19 | -static int get_physical_address(CPUSPARCState *env, hwaddr *physical, | 19 | -C_O0_I2(rZ, r) |
20 | - int *prot, int *access_index, MemTxAttrs *attrs, | 20 | -C_O0_I2(rZ, rZ) |
21 | - target_ulong address, int rw, int mmu_idx, | 21 | +C_O0_I2(rz, r) |
22 | - target_ulong *page_size) | 22 | +C_O0_I2(rz, rz) |
23 | +static int get_physical_address(CPUSPARCState *env, CPUTLBEntryFull *full, | 23 | C_O0_I2(w, r) |
24 | + int *access_index, target_ulong address, | 24 | C_O0_I3(r, r, r) |
25 | + int rw, int mmu_idx) | 25 | C_O1_I1(r, r) |
26 | { | 26 | @@ -XXX,XX +XXX,XX @@ C_O1_I2(r, r, rI) |
27 | int access_perms = 0; | 27 | C_O1_I2(r, r, rJ) |
28 | hwaddr pde_ptr; | 28 | C_O1_I2(r, r, rU) |
29 | @@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPUSPARCState *env, hwaddr *physical, | 29 | C_O1_I2(r, r, rW) |
30 | is_user = mmu_idx == MMU_USER_IDX; | 30 | -C_O1_I2(r, r, rZ) |
31 | 31 | -C_O1_I2(r, 0, rZ) | |
32 | if (mmu_idx == MMU_PHYS_IDX) { | 32 | -C_O1_I2(r, rZ, ri) |
33 | - *page_size = TARGET_PAGE_SIZE; | 33 | -C_O1_I2(r, rZ, rJ) |
34 | + full->lg_page_size = TARGET_PAGE_BITS; | 34 | -C_O1_I2(r, rZ, rZ) |
35 | /* Boot mode: instruction fetches are taken from PROM */ | 35 | +C_O1_I2(r, 0, rz) |
36 | if (rw == 2 && (env->mmuregs[0] & env->def.mmu_bm)) { | 36 | +C_O1_I2(r, rz, ri) |
37 | - *physical = env->prom_addr | (address & 0x7ffffULL); | 37 | +C_O1_I2(r, rz, rJ) |
38 | - *prot = PAGE_READ | PAGE_EXEC; | 38 | +C_O1_I2(r, rz, rz) |
39 | + full->phys_addr = env->prom_addr | (address & 0x7ffffULL); | 39 | C_O1_I2(w, w, w) |
40 | + full->prot = PAGE_READ | PAGE_EXEC; | 40 | C_O1_I2(w, w, wM) |
41 | return 0; | 41 | C_O1_I2(w, w, wA) |
42 | } | 42 | C_O1_I3(w, w, w, w) |
43 | - *physical = address; | 43 | -C_O1_I4(r, rZ, rJ, rZ, rZ) |
44 | - *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; | 44 | +C_O1_I4(r, rz, rJ, rz, rz) |
45 | + full->phys_addr = address; | 45 | C_N2_I1(r, r, r) |
46 | + full->prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; | 46 | diff --git a/tcg/loongarch64/tcg-target-con-str.h b/tcg/loongarch64/tcg-target-con-str.h |
47 | return 0; | 47 | index XXXXXXX..XXXXXXX 100644 |
48 | } | 48 | --- a/tcg/loongarch64/tcg-target-con-str.h |
49 | 49 | +++ b/tcg/loongarch64/tcg-target-con-str.h | |
50 | *access_index = ((rw & 1) << 2) | (rw & 2) | (is_user ? 0 : 1); | 50 | @@ -XXX,XX +XXX,XX @@ REGS('w', ALL_VECTOR_REGS) |
51 | - *physical = 0xffffffffffff0000ULL; | 51 | CONST('I', TCG_CT_CONST_S12) |
52 | + full->phys_addr = 0xffffffffffff0000ULL; | 52 | CONST('J', TCG_CT_CONST_S32) |
53 | 53 | CONST('U', TCG_CT_CONST_U12) | |
54 | /* SPARC reference MMU table walk: Context table->L1->L2->PTE */ | 54 | -CONST('Z', TCG_CT_CONST_ZERO) |
55 | /* Context base + context number */ | 55 | CONST('C', TCG_CT_CONST_C12) |
56 | @@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPUSPARCState *env, hwaddr *physical, | 56 | CONST('W', TCG_CT_CONST_WSZ) |
57 | case 2: /* L3 PTE */ | 57 | CONST('M', TCG_CT_CONST_VCMP) |
58 | page_offset = 0; | 58 | diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc |
59 | } | 59 | index XXXXXXX..XXXXXXX 100644 |
60 | - *page_size = TARGET_PAGE_SIZE; | 60 | --- a/tcg/loongarch64/tcg-target.c.inc |
61 | + full->lg_page_size = TARGET_PAGE_BITS; | 61 | +++ b/tcg/loongarch64/tcg-target.c.inc |
62 | break; | 62 | @@ -XXX,XX +XXX,XX @@ static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot) |
63 | case 2: /* L2 PTE */ | 63 | |
64 | page_offset = address & 0x3f000; | 64 | #define TCG_GUEST_BASE_REG TCG_REG_S1 |
65 | - *page_size = 0x40000; | 65 | |
66 | + full->lg_page_size = 18; | 66 | -#define TCG_CT_CONST_ZERO 0x100 |
67 | } | 67 | -#define TCG_CT_CONST_S12 0x200 |
68 | break; | 68 | -#define TCG_CT_CONST_S32 0x400 |
69 | case 2: /* L1 PTE */ | 69 | -#define TCG_CT_CONST_U12 0x800 |
70 | page_offset = address & 0xfff000; | 70 | -#define TCG_CT_CONST_C12 0x1000 |
71 | - *page_size = 0x1000000; | 71 | -#define TCG_CT_CONST_WSZ 0x2000 |
72 | + full->lg_page_size = 24; | 72 | -#define TCG_CT_CONST_VCMP 0x4000 |
73 | + break; | 73 | -#define TCG_CT_CONST_VADD 0x8000 |
74 | } | 74 | +#define TCG_CT_CONST_S12 0x100 |
75 | } | 75 | +#define TCG_CT_CONST_S32 0x200 |
76 | 76 | +#define TCG_CT_CONST_U12 0x400 | |
77 | @@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPUSPARCState *env, hwaddr *physical, | 77 | +#define TCG_CT_CONST_C12 0x800 |
78 | } | 78 | +#define TCG_CT_CONST_WSZ 0x1000 |
79 | 79 | +#define TCG_CT_CONST_VCMP 0x2000 | |
80 | /* the page can be put in the TLB */ | 80 | +#define TCG_CT_CONST_VADD 0x4000 |
81 | - *prot = perm_table[is_user][access_perms]; | 81 | |
82 | + full->prot = perm_table[is_user][access_perms]; | 82 | #define ALL_GENERAL_REGS MAKE_64BIT_MASK(0, 32) |
83 | if (!(pde & PG_MODIFIED_MASK)) { | 83 | #define ALL_VECTOR_REGS MAKE_64BIT_MASK(32, 32) |
84 | /* only set write access if already dirty... otherwise wait | 84 | @@ -XXX,XX +XXX,XX @@ static bool tcg_target_const_match(int64_t val, int ct, |
85 | for dirty access */ | 85 | if (ct & TCG_CT_CONST) { |
86 | - *prot &= ~PAGE_WRITE; | ||
87 | + full->prot &= ~PAGE_WRITE; | ||
88 | } | ||
89 | |||
90 | /* Even if large ptes, we map only one 4KB page in the cache to | ||
91 | avoid filling it too fast */ | ||
92 | - *physical = ((hwaddr)(pde & PTE_ADDR_MASK) << 4) + page_offset; | ||
93 | + full->phys_addr = ((hwaddr)(pde & PTE_ADDR_MASK) << 4) + page_offset; | ||
94 | return error_code; | ||
95 | } | ||
96 | |||
97 | @@ -XXX,XX +XXX,XX @@ bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, int size, | ||
98 | { | ||
99 | SPARCCPU *cpu = SPARC_CPU(cs); | ||
100 | CPUSPARCState *env = &cpu->env; | ||
101 | - hwaddr paddr; | ||
102 | + CPUTLBEntryFull full = {}; | ||
103 | target_ulong vaddr; | ||
104 | - target_ulong page_size; | ||
105 | - int error_code = 0, prot, access_index; | ||
106 | - MemTxAttrs attrs = {}; | ||
107 | + int error_code = 0, access_index; | ||
108 | |||
109 | /* | ||
110 | * TODO: If we ever need tlb_vaddr_to_host for this target, | ||
111 | @@ -XXX,XX +XXX,XX @@ bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, int size, | ||
112 | assert(!probe); | ||
113 | |||
114 | address &= TARGET_PAGE_MASK; | ||
115 | - error_code = get_physical_address(env, &paddr, &prot, &access_index, &attrs, | ||
116 | - address, access_type, | ||
117 | - mmu_idx, &page_size); | ||
118 | + error_code = get_physical_address(env, &full, &access_index, | ||
119 | + address, access_type, mmu_idx); | ||
120 | vaddr = address; | ||
121 | if (likely(error_code == 0)) { | ||
122 | qemu_log_mask(CPU_LOG_MMU, | ||
123 | "Translate at %" VADDR_PRIx " -> " | ||
124 | HWADDR_FMT_plx ", vaddr " TARGET_FMT_lx "\n", | ||
125 | - address, paddr, vaddr); | ||
126 | - tlb_set_page(cs, vaddr, paddr, prot, mmu_idx, page_size); | ||
127 | + address, full.phys_addr, vaddr); | ||
128 | + tlb_set_page_full(cs, mmu_idx, vaddr, &full); | ||
129 | return true; | 86 | return true; |
130 | } | 87 | } |
131 | 88 | - if ((ct & TCG_CT_CONST_ZERO) && val == 0) { | |
132 | @@ -XXX,XX +XXX,XX @@ bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, int size, | 89 | - return true; |
133 | permissions. If no mapping is available, redirect accesses to | 90 | - } |
134 | neverland. Fake/overridden mappings will be flushed when | 91 | if ((ct & TCG_CT_CONST_S12) && val == sextreg(val, 0, 12)) { |
135 | switching to normal mode. */ | ||
136 | - prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; | ||
137 | - tlb_set_page(cs, vaddr, paddr, prot, mmu_idx, TARGET_PAGE_SIZE); | ||
138 | + full.prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; | ||
139 | + tlb_set_page_full(cs, mmu_idx, vaddr, &full); | ||
140 | return true; | ||
141 | } else { | ||
142 | if (access_type == MMU_INST_FETCH) { | ||
143 | @@ -XXX,XX +XXX,XX @@ static uint64_t build_sfsr(CPUSPARCState *env, int mmu_idx, int rw) | ||
144 | return sfsr; | ||
145 | } | ||
146 | |||
147 | -static int get_physical_address_data(CPUSPARCState *env, hwaddr *physical, | ||
148 | - int *prot, MemTxAttrs *attrs, | ||
149 | +static int get_physical_address_data(CPUSPARCState *env, CPUTLBEntryFull *full, | ||
150 | target_ulong address, int rw, int mmu_idx) | ||
151 | { | ||
152 | CPUState *cs = env_cpu(env); | ||
153 | @@ -XXX,XX +XXX,XX @@ static int get_physical_address_data(CPUSPARCState *env, hwaddr *physical, | ||
154 | |||
155 | for (i = 0; i < 64; i++) { | ||
156 | /* ctx match, vaddr match, valid? */ | ||
157 | - if (ultrasparc_tag_match(&env->dtlb[i], address, context, physical)) { | ||
158 | + if (ultrasparc_tag_match(&env->dtlb[i], address, context, | ||
159 | + &full->phys_addr)) { | ||
160 | int do_fault = 0; | ||
161 | |||
162 | if (TTE_IS_IE(env->dtlb[i].tte)) { | ||
163 | - attrs->byte_swap = true; | ||
164 | + full->attrs.byte_swap = true; | ||
165 | } | ||
166 | |||
167 | /* access ok? */ | ||
168 | @@ -XXX,XX +XXX,XX @@ static int get_physical_address_data(CPUSPARCState *env, hwaddr *physical, | ||
169 | } | ||
170 | |||
171 | if (!do_fault) { | ||
172 | - *prot = PAGE_READ; | ||
173 | + full->prot = PAGE_READ; | ||
174 | if (TTE_IS_W_OK(env->dtlb[i].tte)) { | ||
175 | - *prot |= PAGE_WRITE; | ||
176 | + full->prot |= PAGE_WRITE; | ||
177 | } | ||
178 | |||
179 | TTE_SET_USED(env->dtlb[i].tte); | ||
180 | @@ -XXX,XX +XXX,XX @@ static int get_physical_address_data(CPUSPARCState *env, hwaddr *physical, | ||
181 | return 1; | ||
182 | } | ||
183 | |||
184 | -static int get_physical_address_code(CPUSPARCState *env, hwaddr *physical, | ||
185 | - int *prot, MemTxAttrs *attrs, | ||
186 | +static int get_physical_address_code(CPUSPARCState *env, CPUTLBEntryFull *full, | ||
187 | target_ulong address, int mmu_idx) | ||
188 | { | ||
189 | CPUState *cs = env_cpu(env); | ||
190 | @@ -XXX,XX +XXX,XX @@ static int get_physical_address_code(CPUSPARCState *env, hwaddr *physical, | ||
191 | for (i = 0; i < 64; i++) { | ||
192 | /* ctx match, vaddr match, valid? */ | ||
193 | if (ultrasparc_tag_match(&env->itlb[i], | ||
194 | - address, context, physical)) { | ||
195 | + address, context, &full->phys_addr)) { | ||
196 | /* access ok? */ | ||
197 | if (TTE_IS_PRIV(env->itlb[i].tte) && is_user) { | ||
198 | /* Fault status register */ | ||
199 | @@ -XXX,XX +XXX,XX @@ static int get_physical_address_code(CPUSPARCState *env, hwaddr *physical, | ||
200 | |||
201 | return 1; | ||
202 | } | ||
203 | - *prot = PAGE_EXEC; | ||
204 | + full->prot = PAGE_EXEC; | ||
205 | TTE_SET_USED(env->itlb[i].tte); | ||
206 | return 0; | ||
207 | } | ||
208 | @@ -XXX,XX +XXX,XX @@ static int get_physical_address_code(CPUSPARCState *env, hwaddr *physical, | ||
209 | return 1; | ||
210 | } | ||
211 | |||
212 | -static int get_physical_address(CPUSPARCState *env, hwaddr *physical, | ||
213 | - int *prot, int *access_index, MemTxAttrs *attrs, | ||
214 | - target_ulong address, int rw, int mmu_idx, | ||
215 | - target_ulong *page_size) | ||
216 | +static int get_physical_address(CPUSPARCState *env, CPUTLBEntryFull *full, | ||
217 | + int *access_index, target_ulong address, | ||
218 | + int rw, int mmu_idx) | ||
219 | { | ||
220 | /* ??? We treat everything as a small page, then explicitly flush | ||
221 | everything when an entry is evicted. */ | ||
222 | - *page_size = TARGET_PAGE_SIZE; | ||
223 | + full->lg_page_size = TARGET_PAGE_BITS; | ||
224 | |||
225 | /* safety net to catch wrong softmmu index use from dynamic code */ | ||
226 | if (env->tl > 0 && mmu_idx != MMU_NUCLEUS_IDX) { | ||
227 | @@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPUSPARCState *env, hwaddr *physical, | ||
228 | } | ||
229 | |||
230 | if (mmu_idx == MMU_PHYS_IDX) { | ||
231 | - *physical = ultrasparc_truncate_physical(address); | ||
232 | - *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; | ||
233 | + full->phys_addr = ultrasparc_truncate_physical(address); | ||
234 | + full->prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; | ||
235 | return 0; | ||
236 | } | ||
237 | |||
238 | if (rw == 2) { | ||
239 | - return get_physical_address_code(env, physical, prot, attrs, address, | ||
240 | - mmu_idx); | ||
241 | + return get_physical_address_code(env, full, address, mmu_idx); | ||
242 | } else { | ||
243 | - return get_physical_address_data(env, physical, prot, attrs, address, | ||
244 | - rw, mmu_idx); | ||
245 | + return get_physical_address_data(env, full, address, rw, mmu_idx); | ||
246 | } | ||
247 | } | ||
248 | |||
249 | @@ -XXX,XX +XXX,XX @@ bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, int size, | ||
250 | { | ||
251 | SPARCCPU *cpu = SPARC_CPU(cs); | ||
252 | CPUSPARCState *env = &cpu->env; | ||
253 | - target_ulong vaddr; | ||
254 | - hwaddr paddr; | ||
255 | - target_ulong page_size; | ||
256 | - MemTxAttrs attrs = {}; | ||
257 | - int error_code = 0, prot, access_index; | ||
258 | + CPUTLBEntryFull full = {}; | ||
259 | + int error_code = 0, access_index; | ||
260 | |||
261 | address &= TARGET_PAGE_MASK; | ||
262 | - error_code = get_physical_address(env, &paddr, &prot, &access_index, &attrs, | ||
263 | - address, access_type, | ||
264 | - mmu_idx, &page_size); | ||
265 | + error_code = get_physical_address(env, &full, &access_index, | ||
266 | + address, access_type, mmu_idx); | ||
267 | if (likely(error_code == 0)) { | ||
268 | - vaddr = address; | ||
269 | - | ||
270 | - trace_mmu_helper_mmu_fault(address, paddr, mmu_idx, env->tl, | ||
271 | + trace_mmu_helper_mmu_fault(address, full.phys_addr, mmu_idx, env->tl, | ||
272 | env->dmmu.mmu_primary_context, | ||
273 | env->dmmu.mmu_secondary_context); | ||
274 | - | ||
275 | - tlb_set_page_with_attrs(cs, vaddr, paddr, attrs, prot, mmu_idx, | ||
276 | - page_size); | ||
277 | + tlb_set_page_full(cs, mmu_idx, address, &full); | ||
278 | return true; | 92 | return true; |
279 | } | 93 | } |
280 | if (probe) { | 94 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) |
281 | @@ -XXX,XX +XXX,XX @@ void dump_mmu(CPUSPARCState *env) | 95 | case INDEX_op_st_i64: |
282 | static int cpu_sparc_get_phys_page(CPUSPARCState *env, hwaddr *phys, | 96 | case INDEX_op_qemu_st_i32: |
283 | target_ulong addr, int rw, int mmu_idx) | 97 | case INDEX_op_qemu_st_i64: |
284 | { | 98 | - return C_O0_I2(rZ, r); |
285 | - target_ulong page_size; | 99 | + return C_O0_I2(rz, r); |
286 | - int prot, access_index; | 100 | |
287 | - MemTxAttrs attrs = {}; | 101 | case INDEX_op_qemu_ld_i128: |
288 | + CPUTLBEntryFull full = {}; | 102 | return C_N2_I1(r, r, r); |
289 | + int access_index, ret; | 103 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) |
290 | 104 | ||
291 | - return get_physical_address(env, phys, &prot, &access_index, &attrs, addr, | 105 | case INDEX_op_brcond_i32: |
292 | - rw, mmu_idx, &page_size); | 106 | case INDEX_op_brcond_i64: |
293 | + ret = get_physical_address(env, &full, &access_index, addr, rw, mmu_idx); | 107 | - return C_O0_I2(rZ, rZ); |
294 | + if (ret == 0) { | 108 | + return C_O0_I2(rz, rz); |
295 | + *phys = full.phys_addr; | 109 | |
296 | + } | 110 | case INDEX_op_ext8s_i32: |
297 | + return ret; | 111 | case INDEX_op_ext8s_i64: |
298 | } | 112 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) |
299 | 113 | case INDEX_op_deposit_i32: | |
300 | #if defined(TARGET_SPARC64) | 114 | case INDEX_op_deposit_i64: |
115 | /* Must deposit into the same register as input */ | ||
116 | - return C_O1_I2(r, 0, rZ); | ||
117 | + return C_O1_I2(r, 0, rz); | ||
118 | |||
119 | case INDEX_op_sub_i32: | ||
120 | case INDEX_op_setcond_i32: | ||
121 | - return C_O1_I2(r, rZ, ri); | ||
122 | + return C_O1_I2(r, rz, ri); | ||
123 | case INDEX_op_sub_i64: | ||
124 | case INDEX_op_setcond_i64: | ||
125 | - return C_O1_I2(r, rZ, rJ); | ||
126 | + return C_O1_I2(r, rz, rJ); | ||
127 | |||
128 | case INDEX_op_mul_i32: | ||
129 | case INDEX_op_mul_i64: | ||
130 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
131 | case INDEX_op_rem_i64: | ||
132 | case INDEX_op_remu_i32: | ||
133 | case INDEX_op_remu_i64: | ||
134 | - return C_O1_I2(r, rZ, rZ); | ||
135 | + return C_O1_I2(r, rz, rz); | ||
136 | |||
137 | case INDEX_op_movcond_i32: | ||
138 | case INDEX_op_movcond_i64: | ||
139 | - return C_O1_I4(r, rZ, rJ, rZ, rZ); | ||
140 | + return C_O1_I4(r, rz, rJ, rz, rz); | ||
141 | |||
142 | case INDEX_op_ld_vec: | ||
143 | case INDEX_op_dupm_vec: | ||
301 | -- | 144 | -- |
302 | 2.34.1 | 145 | 2.43.0 |
303 | 146 | ||
304 | 147 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Using an atomic write or read-write insn on ROM is basically | ||
2 | a happens-never case. Handle it via stop-the-world, which | ||
3 | will generate non-atomic serial code, where we can correctly | ||
4 | ignore the write while producing the correct read result. | ||
5 | 1 | ||
6 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
8 | --- | ||
9 | accel/tcg/cputlb.c | 2 +- | ||
10 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
11 | |||
12 | diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c | ||
13 | index XXXXXXX..XXXXXXX 100644 | ||
14 | --- a/accel/tcg/cputlb.c | ||
15 | +++ b/accel/tcg/cputlb.c | ||
16 | @@ -XXX,XX +XXX,XX @@ static void *atomic_mmu_lookup(CPUArchState *env, target_ulong addr, | ||
17 | } | ||
18 | |||
19 | /* Notice an IO access or a needs-MMU-lookup access */ | ||
20 | - if (unlikely(tlb_addr & TLB_MMIO)) { | ||
21 | + if (unlikely(tlb_addr & (TLB_MMIO | TLB_DISCARD_WRITE))) { | ||
22 | /* There's really nothing that can be done to | ||
23 | support this apart from stop-the-world. */ | ||
24 | goto stop_the_world; | ||
25 | -- | ||
26 | 2.34.1 | diff view generated by jsdifflib |
1 | Atomic operations are read-modify-write, and we'd like to | 1 | Replace target-specific 'Z' with generic 'z'. |
---|---|---|---|
2 | be able to test both read and write with one call. This is | ||
3 | easy enough, with BP_MEM_READ | BP_MEM_WRITE. | ||
4 | |||
5 | Add BP_HIT_SHIFT to make it easy to set BP_WATCHPOINT_HIT_*. | ||
6 | 2 | ||
7 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> | 3 | Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> |
8 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
9 | --- | 5 | --- |
10 | include/hw/core/cpu.h | 7 ++++--- | 6 | tcg/mips/tcg-target-con-set.h | 26 ++++++++++----------- |
11 | softmmu/watchpoint.c | 19 ++++++++++--------- | 7 | tcg/mips/tcg-target-con-str.h | 1 - |
12 | 2 files changed, 14 insertions(+), 12 deletions(-) | 8 | tcg/mips/tcg-target.c.inc | 44 ++++++++++++++--------------------- |
9 | 3 files changed, 31 insertions(+), 40 deletions(-) | ||
13 | 10 | ||
14 | diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h | 11 | diff --git a/tcg/mips/tcg-target-con-set.h b/tcg/mips/tcg-target-con-set.h |
15 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
16 | --- a/include/hw/core/cpu.h | 13 | --- a/tcg/mips/tcg-target-con-set.h |
17 | +++ b/include/hw/core/cpu.h | 14 | +++ b/tcg/mips/tcg-target-con-set.h |
18 | @@ -XXX,XX +XXX,XX @@ void cpu_single_step(CPUState *cpu, int enabled); | 15 | @@ -XXX,XX +XXX,XX @@ |
19 | #define BP_GDB 0x10 | 16 | * tcg-target-con-str.h; the constraint combination is inclusive or. |
20 | #define BP_CPU 0x20 | 17 | */ |
21 | #define BP_ANY (BP_GDB | BP_CPU) | 18 | C_O0_I1(r) |
22 | -#define BP_WATCHPOINT_HIT_READ 0x40 | 19 | -C_O0_I2(rZ, r) |
23 | -#define BP_WATCHPOINT_HIT_WRITE 0x80 | 20 | -C_O0_I2(rZ, rZ) |
24 | -#define BP_WATCHPOINT_HIT (BP_WATCHPOINT_HIT_READ | BP_WATCHPOINT_HIT_WRITE) | 21 | -C_O0_I3(rZ, r, r) |
25 | +#define BP_HIT_SHIFT 6 | 22 | -C_O0_I3(rZ, rZ, r) |
26 | +#define BP_WATCHPOINT_HIT_READ (BP_MEM_READ << BP_HIT_SHIFT) | 23 | -C_O0_I4(rZ, rZ, rZ, rZ) |
27 | +#define BP_WATCHPOINT_HIT_WRITE (BP_MEM_WRITE << BP_HIT_SHIFT) | 24 | -C_O0_I4(rZ, rZ, r, r) |
28 | +#define BP_WATCHPOINT_HIT (BP_MEM_ACCESS << BP_HIT_SHIFT) | 25 | +C_O0_I2(rz, r) |
29 | 26 | +C_O0_I2(rz, rz) | |
30 | int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags, | 27 | +C_O0_I3(rz, r, r) |
31 | CPUBreakpoint **breakpoint); | 28 | +C_O0_I3(rz, rz, r) |
32 | diff --git a/softmmu/watchpoint.c b/softmmu/watchpoint.c | 29 | +C_O0_I4(rz, rz, rz, rz) |
30 | +C_O0_I4(rz, rz, r, r) | ||
31 | C_O1_I1(r, r) | ||
32 | -C_O1_I2(r, 0, rZ) | ||
33 | +C_O1_I2(r, 0, rz) | ||
34 | C_O1_I2(r, r, r) | ||
35 | C_O1_I2(r, r, ri) | ||
36 | C_O1_I2(r, r, rI) | ||
37 | C_O1_I2(r, r, rIK) | ||
38 | C_O1_I2(r, r, rJ) | ||
39 | -C_O1_I2(r, r, rWZ) | ||
40 | -C_O1_I2(r, rZ, rN) | ||
41 | -C_O1_I2(r, rZ, rZ) | ||
42 | -C_O1_I4(r, rZ, rZ, rZ, 0) | ||
43 | -C_O1_I4(r, rZ, rZ, rZ, rZ) | ||
44 | +C_O1_I2(r, r, rzW) | ||
45 | +C_O1_I2(r, rz, rN) | ||
46 | +C_O1_I2(r, rz, rz) | ||
47 | +C_O1_I4(r, rz, rz, rz, 0) | ||
48 | +C_O1_I4(r, rz, rz, rz, rz) | ||
49 | C_O2_I1(r, r, r) | ||
50 | C_O2_I2(r, r, r, r) | ||
51 | -C_O2_I4(r, r, rZ, rZ, rN, rN) | ||
52 | +C_O2_I4(r, r, rz, rz, rN, rN) | ||
53 | diff --git a/tcg/mips/tcg-target-con-str.h b/tcg/mips/tcg-target-con-str.h | ||
33 | index XXXXXXX..XXXXXXX 100644 | 54 | index XXXXXXX..XXXXXXX 100644 |
34 | --- a/softmmu/watchpoint.c | 55 | --- a/tcg/mips/tcg-target-con-str.h |
35 | +++ b/softmmu/watchpoint.c | 56 | +++ b/tcg/mips/tcg-target-con-str.h |
36 | @@ -XXX,XX +XXX,XX @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len, | 57 | @@ -XXX,XX +XXX,XX @@ CONST('J', TCG_CT_CONST_S16) |
37 | /* this is currently used only by ARM BE32 */ | 58 | CONST('K', TCG_CT_CONST_P2M1) |
38 | addr = cc->tcg_ops->adjust_watchpoint_address(cpu, addr, len); | 59 | CONST('N', TCG_CT_CONST_N16) |
39 | } | 60 | CONST('W', TCG_CT_CONST_WSZ) |
40 | + | 61 | -CONST('Z', TCG_CT_CONST_ZERO) |
41 | + assert((flags & ~BP_MEM_ACCESS) == 0); | 62 | diff --git a/tcg/mips/tcg-target.c.inc b/tcg/mips/tcg-target.c.inc |
42 | QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) { | 63 | index XXXXXXX..XXXXXXX 100644 |
43 | - if (watchpoint_address_matches(wp, addr, len) | 64 | --- a/tcg/mips/tcg-target.c.inc |
44 | - && (wp->flags & flags)) { | 65 | +++ b/tcg/mips/tcg-target.c.inc |
45 | + int hit_flags = wp->flags & flags; | 66 | @@ -XXX,XX +XXX,XX @@ static bool patch_reloc(tcg_insn_unit *code_ptr, int type, |
46 | + | 67 | g_assert_not_reached(); |
47 | + if (hit_flags && watchpoint_address_matches(wp, addr, len)) { | 68 | } |
48 | if (replay_running_debug()) { | 69 | |
49 | /* | 70 | -#define TCG_CT_CONST_ZERO 0x100 |
50 | * replay_breakpoint reads icount. | 71 | -#define TCG_CT_CONST_U16 0x200 /* Unsigned 16-bit: 0 - 0xffff. */ |
51 | @@ -XXX,XX +XXX,XX @@ void cpu_check_watchpoint(CPUState *cpu, vaddr addr, vaddr len, | 72 | -#define TCG_CT_CONST_S16 0x400 /* Signed 16-bit: -32768 - 32767 */ |
52 | replay_breakpoint(); | 73 | -#define TCG_CT_CONST_P2M1 0x800 /* Power of 2 minus 1. */ |
53 | return; | 74 | -#define TCG_CT_CONST_N16 0x1000 /* "Negatable" 16-bit: -32767 - 32767 */ |
54 | } | 75 | -#define TCG_CT_CONST_WSZ 0x2000 /* word size */ |
55 | - if (flags == BP_MEM_READ) { | 76 | +#define TCG_CT_CONST_U16 0x100 /* Unsigned 16-bit: 0 - 0xffff. */ |
56 | - wp->flags |= BP_WATCHPOINT_HIT_READ; | 77 | +#define TCG_CT_CONST_S16 0x200 /* Signed 16-bit: -32768 - 32767 */ |
57 | - } else { | 78 | +#define TCG_CT_CONST_P2M1 0x400 /* Power of 2 minus 1. */ |
58 | - wp->flags |= BP_WATCHPOINT_HIT_WRITE; | 79 | +#define TCG_CT_CONST_N16 0x800 /* "Negatable" 16-bit: -32767 - 32767 */ |
59 | - } | 80 | +#define TCG_CT_CONST_WSZ 0x1000 /* word size */ |
60 | + | 81 | |
61 | + wp->flags |= hit_flags << BP_HIT_SHIFT; | 82 | #define ALL_GENERAL_REGS 0xffffffffu |
62 | wp->hitaddr = MAX(addr, wp->vaddr); | 83 | |
63 | wp->hitattrs = attrs; | 84 | @@ -XXX,XX +XXX,XX @@ static bool tcg_target_const_match(int64_t val, int ct, |
64 | 85 | { | |
65 | - if (wp->flags & BP_CPU && cc->tcg_ops->debug_check_watchpoint && | 86 | if (ct & TCG_CT_CONST) { |
66 | - !cc->tcg_ops->debug_check_watchpoint(cpu, wp)) { | 87 | return 1; |
67 | + if (wp->flags & BP_CPU | 88 | - } else if ((ct & TCG_CT_CONST_ZERO) && val == 0) { |
68 | + && cc->tcg_ops->debug_check_watchpoint | 89 | - return 1; |
69 | + && !cc->tcg_ops->debug_check_watchpoint(cpu, wp)) { | 90 | } else if ((ct & TCG_CT_CONST_U16) && val == (uint16_t)val) { |
70 | wp->flags &= ~BP_WATCHPOINT_HIT; | 91 | return 1; |
71 | continue; | 92 | } else if ((ct & TCG_CT_CONST_S16) && val == (int16_t)val) { |
72 | } | 93 | @@ -XXX,XX +XXX,XX @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc, TCGType type, |
94 | TCGArg a0, a1, a2; | ||
95 | int c2; | ||
96 | |||
97 | - /* | ||
98 | - * Note that many operands use the constraint set "rZ". | ||
99 | - * We make use of the fact that 0 is the ZERO register, | ||
100 | - * and hence such cases need not check for const_args. | ||
101 | - */ | ||
102 | a0 = args[0]; | ||
103 | a1 = args[1]; | ||
104 | a2 = args[2]; | ||
105 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
106 | case INDEX_op_st16_i64: | ||
107 | case INDEX_op_st32_i64: | ||
108 | case INDEX_op_st_i64: | ||
109 | - return C_O0_I2(rZ, r); | ||
110 | + return C_O0_I2(rz, r); | ||
111 | |||
112 | case INDEX_op_add_i32: | ||
113 | case INDEX_op_add_i64: | ||
114 | return C_O1_I2(r, r, rJ); | ||
115 | case INDEX_op_sub_i32: | ||
116 | case INDEX_op_sub_i64: | ||
117 | - return C_O1_I2(r, rZ, rN); | ||
118 | + return C_O1_I2(r, rz, rN); | ||
119 | case INDEX_op_mul_i32: | ||
120 | case INDEX_op_mulsh_i32: | ||
121 | case INDEX_op_muluh_i32: | ||
122 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
123 | case INDEX_op_remu_i64: | ||
124 | case INDEX_op_nor_i64: | ||
125 | case INDEX_op_setcond_i64: | ||
126 | - return C_O1_I2(r, rZ, rZ); | ||
127 | + return C_O1_I2(r, rz, rz); | ||
128 | case INDEX_op_muls2_i32: | ||
129 | case INDEX_op_mulu2_i32: | ||
130 | case INDEX_op_muls2_i64: | ||
131 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
132 | return C_O1_I2(r, r, ri); | ||
133 | case INDEX_op_clz_i32: | ||
134 | case INDEX_op_clz_i64: | ||
135 | - return C_O1_I2(r, r, rWZ); | ||
136 | + return C_O1_I2(r, r, rzW); | ||
137 | |||
138 | case INDEX_op_deposit_i32: | ||
139 | case INDEX_op_deposit_i64: | ||
140 | - return C_O1_I2(r, 0, rZ); | ||
141 | + return C_O1_I2(r, 0, rz); | ||
142 | case INDEX_op_brcond_i32: | ||
143 | case INDEX_op_brcond_i64: | ||
144 | - return C_O0_I2(rZ, rZ); | ||
145 | + return C_O0_I2(rz, rz); | ||
146 | case INDEX_op_movcond_i32: | ||
147 | case INDEX_op_movcond_i64: | ||
148 | return (use_mips32r6_instructions | ||
149 | - ? C_O1_I4(r, rZ, rZ, rZ, rZ) | ||
150 | - : C_O1_I4(r, rZ, rZ, rZ, 0)); | ||
151 | + ? C_O1_I4(r, rz, rz, rz, rz) | ||
152 | + : C_O1_I4(r, rz, rz, rz, 0)); | ||
153 | case INDEX_op_add2_i32: | ||
154 | case INDEX_op_sub2_i32: | ||
155 | - return C_O2_I4(r, r, rZ, rZ, rN, rN); | ||
156 | + return C_O2_I4(r, r, rz, rz, rN, rN); | ||
157 | case INDEX_op_setcond2_i32: | ||
158 | - return C_O1_I4(r, rZ, rZ, rZ, rZ); | ||
159 | + return C_O1_I4(r, rz, rz, rz, rz); | ||
160 | case INDEX_op_brcond2_i32: | ||
161 | - return C_O0_I4(rZ, rZ, rZ, rZ); | ||
162 | + return C_O0_I4(rz, rz, rz, rz); | ||
163 | |||
164 | case INDEX_op_qemu_ld_i32: | ||
165 | return C_O1_I1(r, r); | ||
166 | case INDEX_op_qemu_st_i32: | ||
167 | - return C_O0_I2(rZ, r); | ||
168 | + return C_O0_I2(rz, r); | ||
169 | case INDEX_op_qemu_ld_i64: | ||
170 | return TCG_TARGET_REG_BITS == 64 ? C_O1_I1(r, r) : C_O2_I1(r, r, r); | ||
171 | case INDEX_op_qemu_st_i64: | ||
172 | - return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(rZ, r) : C_O0_I3(rZ, rZ, r); | ||
173 | + return TCG_TARGET_REG_BITS == 64 ? C_O0_I2(rz, r) : C_O0_I3(rz, rz, r); | ||
174 | |||
175 | default: | ||
176 | return C_NotImplemented; | ||
73 | -- | 177 | -- |
74 | 2.34.1 | 178 | 2.43.0 |
75 | 179 | ||
76 | 180 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Finish removing tcg temp free accounting interfaces. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | include/exec/translator.h | 2 -- | ||
7 | accel/tcg/translator.c | 4 ---- | ||
8 | target/alpha/translate.c | 1 - | ||
9 | target/arm/tcg/translate-a64.c | 2 -- | ||
10 | target/arm/tcg/translate.c | 1 - | ||
11 | target/ppc/translate.c | 2 -- | ||
12 | 6 files changed, 12 deletions(-) | ||
13 | |||
14 | diff --git a/include/exec/translator.h b/include/exec/translator.h | ||
15 | index XXXXXXX..XXXXXXX 100644 | ||
16 | --- a/include/exec/translator.h | ||
17 | +++ b/include/exec/translator.h | ||
18 | @@ -XXX,XX +XXX,XX @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns, | ||
19 | target_ulong pc, void *host_pc, | ||
20 | const TranslatorOps *ops, DisasContextBase *db); | ||
21 | |||
22 | -void translator_loop_temp_check(DisasContextBase *db); | ||
23 | - | ||
24 | /** | ||
25 | * translator_use_goto_tb | ||
26 | * @db: Disassembly context | ||
27 | diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c | ||
28 | index XXXXXXX..XXXXXXX 100644 | ||
29 | --- a/accel/tcg/translator.c | ||
30 | +++ b/accel/tcg/translator.c | ||
31 | @@ -XXX,XX +XXX,XX @@ | ||
32 | #include "exec/plugin-gen.h" | ||
33 | #include "exec/replay-core.h" | ||
34 | |||
35 | -void translator_loop_temp_check(DisasContextBase *db) | ||
36 | -{ | ||
37 | -} | ||
38 | - | ||
39 | bool translator_use_goto_tb(DisasContextBase *db, target_ulong dest) | ||
40 | { | ||
41 | /* Suppress goto_tb if requested. */ | ||
42 | diff --git a/target/alpha/translate.c b/target/alpha/translate.c | ||
43 | index XXXXXXX..XXXXXXX 100644 | ||
44 | --- a/target/alpha/translate.c | ||
45 | +++ b/target/alpha/translate.c | ||
46 | @@ -XXX,XX +XXX,XX @@ static void alpha_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) | ||
47 | ctx->base.is_jmp = translate_one(ctx, insn); | ||
48 | |||
49 | free_context_temps(ctx); | ||
50 | - translator_loop_temp_check(&ctx->base); | ||
51 | } | ||
52 | |||
53 | static void alpha_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu) | ||
54 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | ||
55 | index XXXXXXX..XXXXXXX 100644 | ||
56 | --- a/target/arm/tcg/translate-a64.c | ||
57 | +++ b/target/arm/tcg/translate-a64.c | ||
58 | @@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) | ||
59 | if (s->btype > 0 && s->base.is_jmp != DISAS_NORETURN) { | ||
60 | reset_btype(s); | ||
61 | } | ||
62 | - | ||
63 | - translator_loop_temp_check(&s->base); | ||
64 | } | ||
65 | |||
66 | static void aarch64_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu) | ||
67 | diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c | ||
68 | index XXXXXXX..XXXXXXX 100644 | ||
69 | --- a/target/arm/tcg/translate.c | ||
70 | +++ b/target/arm/tcg/translate.c | ||
71 | @@ -XXX,XX +XXX,XX @@ static void arm_post_translate_insn(DisasContext *dc) | ||
72 | gen_set_label(dc->condlabel.label); | ||
73 | dc->condjmp = 0; | ||
74 | } | ||
75 | - translator_loop_temp_check(&dc->base); | ||
76 | } | ||
77 | |||
78 | static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) | ||
79 | diff --git a/target/ppc/translate.c b/target/ppc/translate.c | ||
80 | index XXXXXXX..XXXXXXX 100644 | ||
81 | --- a/target/ppc/translate.c | ||
82 | +++ b/target/ppc/translate.c | ||
83 | @@ -XXX,XX +XXX,XX @@ static void ppc_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) | ||
84 | if (ctx->base.is_jmp == DISAS_NEXT && !(pc & ~TARGET_PAGE_MASK)) { | ||
85 | ctx->base.is_jmp = DISAS_TOO_MANY; | ||
86 | } | ||
87 | - | ||
88 | - translator_loop_temp_check(&ctx->base); | ||
89 | } | ||
90 | |||
91 | static void ppc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs) | ||
92 | -- | ||
93 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/alpha/translate.c | 70 ---------------------------------------- | ||
7 | 1 file changed, 70 deletions(-) | ||
8 | |||
9 | diff --git a/target/alpha/translate.c b/target/alpha/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/alpha/translate.c | ||
12 | +++ b/target/alpha/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static void free_context_temps(DisasContext *ctx) | ||
14 | { | ||
15 | if (ctx->sink) { | ||
16 | tcg_gen_discard_i64(ctx->sink); | ||
17 | - tcg_temp_free(ctx->sink); | ||
18 | ctx->sink = NULL; | ||
19 | } | ||
20 | } | ||
21 | @@ -XXX,XX +XXX,XX @@ static void gen_ldf(DisasContext *ctx, TCGv dest, TCGv addr) | ||
22 | TCGv_i32 tmp32 = tcg_temp_new_i32(); | ||
23 | tcg_gen_qemu_ld_i32(tmp32, addr, ctx->mem_idx, MO_LEUL | UNALIGN(ctx)); | ||
24 | gen_helper_memory_to_f(dest, tmp32); | ||
25 | - tcg_temp_free_i32(tmp32); | ||
26 | } | ||
27 | |||
28 | static void gen_ldg(DisasContext *ctx, TCGv dest, TCGv addr) | ||
29 | @@ -XXX,XX +XXX,XX @@ static void gen_ldg(DisasContext *ctx, TCGv dest, TCGv addr) | ||
30 | TCGv tmp = tcg_temp_new(); | ||
31 | tcg_gen_qemu_ld_i64(tmp, addr, ctx->mem_idx, MO_LEUQ | UNALIGN(ctx)); | ||
32 | gen_helper_memory_to_g(dest, tmp); | ||
33 | - tcg_temp_free(tmp); | ||
34 | } | ||
35 | |||
36 | static void gen_lds(DisasContext *ctx, TCGv dest, TCGv addr) | ||
37 | @@ -XXX,XX +XXX,XX @@ static void gen_lds(DisasContext *ctx, TCGv dest, TCGv addr) | ||
38 | TCGv_i32 tmp32 = tcg_temp_new_i32(); | ||
39 | tcg_gen_qemu_ld_i32(tmp32, addr, ctx->mem_idx, MO_LEUL | UNALIGN(ctx)); | ||
40 | gen_helper_memory_to_s(dest, tmp32); | ||
41 | - tcg_temp_free_i32(tmp32); | ||
42 | } | ||
43 | |||
44 | static void gen_ldt(DisasContext *ctx, TCGv dest, TCGv addr) | ||
45 | @@ -XXX,XX +XXX,XX @@ static void gen_load_fp(DisasContext *ctx, int ra, int rb, int32_t disp16, | ||
46 | TCGv addr = tcg_temp_new(); | ||
47 | tcg_gen_addi_i64(addr, load_gpr(ctx, rb), disp16); | ||
48 | func(ctx, cpu_fir[ra], addr); | ||
49 | - tcg_temp_free(addr); | ||
50 | } | ||
51 | } | ||
52 | |||
53 | @@ -XXX,XX +XXX,XX @@ static void gen_load_int(DisasContext *ctx, int ra, int rb, int32_t disp16, | ||
54 | tcg_gen_mov_i64(cpu_lock_addr, addr); | ||
55 | tcg_gen_mov_i64(cpu_lock_value, dest); | ||
56 | } | ||
57 | - tcg_temp_free(addr); | ||
58 | } | ||
59 | |||
60 | static void gen_stf(DisasContext *ctx, TCGv src, TCGv addr) | ||
61 | @@ -XXX,XX +XXX,XX @@ static void gen_stf(DisasContext *ctx, TCGv src, TCGv addr) | ||
62 | TCGv_i32 tmp32 = tcg_temp_new_i32(); | ||
63 | gen_helper_f_to_memory(tmp32, addr); | ||
64 | tcg_gen_qemu_st_i32(tmp32, addr, ctx->mem_idx, MO_LEUL | UNALIGN(ctx)); | ||
65 | - tcg_temp_free_i32(tmp32); | ||
66 | } | ||
67 | |||
68 | static void gen_stg(DisasContext *ctx, TCGv src, TCGv addr) | ||
69 | @@ -XXX,XX +XXX,XX @@ static void gen_stg(DisasContext *ctx, TCGv src, TCGv addr) | ||
70 | TCGv tmp = tcg_temp_new(); | ||
71 | gen_helper_g_to_memory(tmp, src); | ||
72 | tcg_gen_qemu_st_i64(tmp, addr, ctx->mem_idx, MO_LEUQ | UNALIGN(ctx)); | ||
73 | - tcg_temp_free(tmp); | ||
74 | } | ||
75 | |||
76 | static void gen_sts(DisasContext *ctx, TCGv src, TCGv addr) | ||
77 | @@ -XXX,XX +XXX,XX @@ static void gen_sts(DisasContext *ctx, TCGv src, TCGv addr) | ||
78 | TCGv_i32 tmp32 = tcg_temp_new_i32(); | ||
79 | gen_helper_s_to_memory(tmp32, src); | ||
80 | tcg_gen_qemu_st_i32(tmp32, addr, ctx->mem_idx, MO_LEUL | UNALIGN(ctx)); | ||
81 | - tcg_temp_free_i32(tmp32); | ||
82 | } | ||
83 | |||
84 | static void gen_stt(DisasContext *ctx, TCGv src, TCGv addr) | ||
85 | @@ -XXX,XX +XXX,XX @@ static void gen_store_fp(DisasContext *ctx, int ra, int rb, int32_t disp16, | ||
86 | TCGv addr = tcg_temp_new(); | ||
87 | tcg_gen_addi_i64(addr, load_gpr(ctx, rb), disp16); | ||
88 | func(ctx, load_fpr(ctx, ra), addr); | ||
89 | - tcg_temp_free(addr); | ||
90 | } | ||
91 | |||
92 | static void gen_store_int(DisasContext *ctx, int ra, int rb, int32_t disp16, | ||
93 | @@ -XXX,XX +XXX,XX @@ static void gen_store_int(DisasContext *ctx, int ra, int rb, int32_t disp16, | ||
94 | |||
95 | src = load_gpr(ctx, ra); | ||
96 | tcg_gen_qemu_st_i64(src, addr, ctx->mem_idx, op); | ||
97 | - | ||
98 | - tcg_temp_free(addr); | ||
99 | } | ||
100 | |||
101 | static DisasJumpType gen_store_conditional(DisasContext *ctx, int ra, int rb, | ||
102 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType gen_store_conditional(DisasContext *ctx, int ra, int rb, | ||
103 | lab_fail = gen_new_label(); | ||
104 | lab_done = gen_new_label(); | ||
105 | tcg_gen_brcond_i64(TCG_COND_NE, addr, cpu_lock_addr, lab_fail); | ||
106 | - tcg_temp_free_i64(addr); | ||
107 | |||
108 | val = tcg_temp_new_i64(); | ||
109 | tcg_gen_atomic_cmpxchg_i64(val, cpu_lock_addr, cpu_lock_value, | ||
110 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType gen_store_conditional(DisasContext *ctx, int ra, int rb, | ||
111 | if (ra != 31) { | ||
112 | tcg_gen_setcond_i64(TCG_COND_EQ, ctx->ir[ra], val, cpu_lock_value); | ||
113 | } | ||
114 | - tcg_temp_free_i64(val); | ||
115 | tcg_gen_br(lab_done); | ||
116 | |||
117 | gen_set_label(lab_fail); | ||
118 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType gen_bcond(DisasContext *ctx, TCGCond cond, int ra, | ||
119 | |||
120 | tcg_gen_andi_i64(tmp, load_gpr(ctx, ra), 1); | ||
121 | ret = gen_bcond_internal(ctx, cond, tmp, disp); | ||
122 | - tcg_temp_free(tmp); | ||
123 | return ret; | ||
124 | } | ||
125 | return gen_bcond_internal(ctx, cond, load_gpr(ctx, ra), disp); | ||
126 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType gen_fbcond(DisasContext *ctx, TCGCond cond, int ra, | ||
127 | |||
128 | gen_fold_mzero(cond, cmp_tmp, load_fpr(ctx, ra)); | ||
129 | ret = gen_bcond_internal(ctx, cond, cmp_tmp, disp); | ||
130 | - tcg_temp_free(cmp_tmp); | ||
131 | return ret; | ||
132 | } | ||
133 | |||
134 | @@ -XXX,XX +XXX,XX @@ static void gen_fcmov(DisasContext *ctx, TCGCond cond, int ra, int rb, int rc) | ||
135 | gen_fold_mzero(cond, va, load_fpr(ctx, ra)); | ||
136 | |||
137 | tcg_gen_movcond_i64(cond, dest_fpr(ctx, rc), va, z, vb, load_fpr(ctx, rc)); | ||
138 | - | ||
139 | - tcg_temp_free(va); | ||
140 | } | ||
141 | |||
142 | #define QUAL_RM_N 0x080 /* Round mode nearest even */ | ||
143 | @@ -XXX,XX +XXX,XX @@ static void gen_qual_roundmode(DisasContext *ctx, int fn11) | ||
144 | #else | ||
145 | gen_helper_setroundmode(tmp); | ||
146 | #endif | ||
147 | - | ||
148 | - tcg_temp_free_i32(tmp); | ||
149 | } | ||
150 | |||
151 | static void gen_qual_flushzero(DisasContext *ctx, int fn11) | ||
152 | @@ -XXX,XX +XXX,XX @@ static void gen_qual_flushzero(DisasContext *ctx, int fn11) | ||
153 | #else | ||
154 | gen_helper_setflushzero(tmp); | ||
155 | #endif | ||
156 | - | ||
157 | - tcg_temp_free_i32(tmp); | ||
158 | } | ||
159 | |||
160 | static TCGv gen_ieee_input(DisasContext *ctx, int reg, int fn11, int is_cmp) | ||
161 | @@ -XXX,XX +XXX,XX @@ static void gen_cvtlq(TCGv vc, TCGv vb) | ||
162 | tcg_gen_shri_i64(tmp, vb, 29); | ||
163 | tcg_gen_sari_i64(vc, vb, 32); | ||
164 | tcg_gen_deposit_i64(vc, vc, tmp, 0, 30); | ||
165 | - | ||
166 | - tcg_temp_free(tmp); | ||
167 | } | ||
168 | |||
169 | static void gen_ieee_arith2(DisasContext *ctx, | ||
170 | @@ -XXX,XX +XXX,XX @@ static void gen_cpy_mask(TCGv vc, TCGv va, TCGv vb, bool inv_a, uint64_t mask) | ||
171 | |||
172 | tcg_gen_andc_i64(vc, vb, vmask); | ||
173 | tcg_gen_or_i64(vc, vc, tmp); | ||
174 | - | ||
175 | - tcg_temp_free(tmp); | ||
176 | } | ||
177 | |||
178 | static void gen_ieee_arith3(DisasContext *ctx, | ||
179 | @@ -XXX,XX +XXX,XX @@ static void gen_ext_h(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit, | ||
180 | tcg_gen_neg_i64(tmp, tmp); | ||
181 | tcg_gen_andi_i64(tmp, tmp, 0x3f); | ||
182 | tcg_gen_shl_i64(vc, va, tmp); | ||
183 | - tcg_temp_free(tmp); | ||
184 | } | ||
185 | gen_zapnoti(vc, vc, byte_mask); | ||
186 | } | ||
187 | @@ -XXX,XX +XXX,XX @@ static void gen_ext_l(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit, | ||
188 | tcg_gen_andi_i64(tmp, load_gpr(ctx, rb), 7); | ||
189 | tcg_gen_shli_i64(tmp, tmp, 3); | ||
190 | tcg_gen_shr_i64(vc, va, tmp); | ||
191 | - tcg_temp_free(tmp); | ||
192 | gen_zapnoti(vc, vc, byte_mask); | ||
193 | } | ||
194 | } | ||
195 | @@ -XXX,XX +XXX,XX @@ static void gen_ins_h(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit, | ||
196 | |||
197 | tcg_gen_shr_i64(vc, tmp, shift); | ||
198 | tcg_gen_shri_i64(vc, vc, 1); | ||
199 | - tcg_temp_free(shift); | ||
200 | - tcg_temp_free(tmp); | ||
201 | } | ||
202 | } | ||
203 | |||
204 | @@ -XXX,XX +XXX,XX @@ static void gen_ins_l(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit, | ||
205 | tcg_gen_andi_i64(shift, load_gpr(ctx, rb), 7); | ||
206 | tcg_gen_shli_i64(shift, shift, 3); | ||
207 | tcg_gen_shl_i64(vc, tmp, shift); | ||
208 | - tcg_temp_free(shift); | ||
209 | - tcg_temp_free(tmp); | ||
210 | } | ||
211 | } | ||
212 | |||
213 | @@ -XXX,XX +XXX,XX @@ static void gen_msk_h(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit, | ||
214 | tcg_gen_shri_i64(mask, mask, 1); | ||
215 | |||
216 | tcg_gen_andc_i64(vc, va, mask); | ||
217 | - | ||
218 | - tcg_temp_free(mask); | ||
219 | - tcg_temp_free(shift); | ||
220 | } | ||
221 | } | ||
222 | |||
223 | @@ -XXX,XX +XXX,XX @@ static void gen_msk_l(DisasContext *ctx, TCGv vc, TCGv va, int rb, bool islit, | ||
224 | tcg_gen_shl_i64(mask, mask, shift); | ||
225 | |||
226 | tcg_gen_andc_i64(vc, va, mask); | ||
227 | - | ||
228 | - tcg_temp_free(mask); | ||
229 | - tcg_temp_free(shift); | ||
230 | } | ||
231 | } | ||
232 | |||
233 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType gen_call_pal(DisasContext *ctx, int palcode) | ||
234 | TCGv tmp = tcg_temp_new(); | ||
235 | tcg_gen_andi_i64(tmp, ctx->ir[IR_A0], PS_INT_MASK); | ||
236 | st_flag_byte(tmp, ENV_FLAG_PS_SHIFT); | ||
237 | - tcg_temp_free(tmp); | ||
238 | } | ||
239 | |||
240 | /* Allow interrupts to be recognized right away. */ | ||
241 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType gen_call_pal(DisasContext *ctx, int palcode) | ||
242 | |||
243 | tcg_gen_movi_i64(tmp, exc_addr); | ||
244 | tcg_gen_st_i64(tmp, cpu_env, offsetof(CPUAlphaState, exc_addr)); | ||
245 | - tcg_temp_free(tmp); | ||
246 | |||
247 | entry += (palcode & 0x80 | ||
248 | ? 0x2000 + (palcode - 0x80) * 64 | ||
249 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
250 | tcg_gen_shli_i64(tmp, va, 2); | ||
251 | tcg_gen_add_i64(tmp, tmp, vb); | ||
252 | tcg_gen_ext32s_i64(vc, tmp); | ||
253 | - tcg_temp_free(tmp); | ||
254 | break; | ||
255 | case 0x09: | ||
256 | /* SUBL */ | ||
257 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
258 | tcg_gen_shli_i64(tmp, va, 2); | ||
259 | tcg_gen_sub_i64(tmp, tmp, vb); | ||
260 | tcg_gen_ext32s_i64(vc, tmp); | ||
261 | - tcg_temp_free(tmp); | ||
262 | break; | ||
263 | case 0x0F: | ||
264 | /* CMPBGE */ | ||
265 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
266 | tcg_gen_shli_i64(tmp, va, 3); | ||
267 | tcg_gen_add_i64(tmp, tmp, vb); | ||
268 | tcg_gen_ext32s_i64(vc, tmp); | ||
269 | - tcg_temp_free(tmp); | ||
270 | break; | ||
271 | case 0x1B: | ||
272 | /* S8SUBL */ | ||
273 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
274 | tcg_gen_shli_i64(tmp, va, 3); | ||
275 | tcg_gen_sub_i64(tmp, tmp, vb); | ||
276 | tcg_gen_ext32s_i64(vc, tmp); | ||
277 | - tcg_temp_free(tmp); | ||
278 | break; | ||
279 | case 0x1D: | ||
280 | /* CMPULT */ | ||
281 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
282 | tmp = tcg_temp_new(); | ||
283 | tcg_gen_shli_i64(tmp, va, 2); | ||
284 | tcg_gen_add_i64(vc, tmp, vb); | ||
285 | - tcg_temp_free(tmp); | ||
286 | break; | ||
287 | case 0x29: | ||
288 | /* SUBQ */ | ||
289 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
290 | tmp = tcg_temp_new(); | ||
291 | tcg_gen_shli_i64(tmp, va, 2); | ||
292 | tcg_gen_sub_i64(vc, tmp, vb); | ||
293 | - tcg_temp_free(tmp); | ||
294 | break; | ||
295 | case 0x2D: | ||
296 | /* CMPEQ */ | ||
297 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
298 | tmp = tcg_temp_new(); | ||
299 | tcg_gen_shli_i64(tmp, va, 3); | ||
300 | tcg_gen_add_i64(vc, tmp, vb); | ||
301 | - tcg_temp_free(tmp); | ||
302 | break; | ||
303 | case 0x3B: | ||
304 | /* S8SUBQ */ | ||
305 | tmp = tcg_temp_new(); | ||
306 | tcg_gen_shli_i64(tmp, va, 3); | ||
307 | tcg_gen_sub_i64(vc, tmp, vb); | ||
308 | - tcg_temp_free(tmp); | ||
309 | break; | ||
310 | case 0x3D: | ||
311 | /* CMPULE */ | ||
312 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
313 | tcg_gen_add_i64(tmp, tmp, vc); | ||
314 | tcg_gen_ext32s_i64(vc, tmp); | ||
315 | gen_helper_check_overflow(cpu_env, vc, tmp); | ||
316 | - tcg_temp_free(tmp); | ||
317 | break; | ||
318 | case 0x49: | ||
319 | /* SUBL/V */ | ||
320 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
321 | tcg_gen_sub_i64(tmp, tmp, vc); | ||
322 | tcg_gen_ext32s_i64(vc, tmp); | ||
323 | gen_helper_check_overflow(cpu_env, vc, tmp); | ||
324 | - tcg_temp_free(tmp); | ||
325 | break; | ||
326 | case 0x4D: | ||
327 | /* CMPLT */ | ||
328 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
329 | tcg_gen_shri_i64(tmp, tmp, 63); | ||
330 | tcg_gen_movi_i64(tmp2, 0); | ||
331 | gen_helper_check_overflow(cpu_env, tmp, tmp2); | ||
332 | - tcg_temp_free(tmp); | ||
333 | - tcg_temp_free(tmp2); | ||
334 | break; | ||
335 | case 0x69: | ||
336 | /* SUBQ/V */ | ||
337 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
338 | tcg_gen_shri_i64(tmp, tmp, 63); | ||
339 | tcg_gen_movi_i64(tmp2, 0); | ||
340 | gen_helper_check_overflow(cpu_env, tmp, tmp2); | ||
341 | - tcg_temp_free(tmp); | ||
342 | - tcg_temp_free(tmp2); | ||
343 | break; | ||
344 | case 0x6D: | ||
345 | /* CMPLE */ | ||
346 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
347 | tcg_gen_andi_i64(tmp, va, 1); | ||
348 | tcg_gen_movcond_i64(TCG_COND_NE, vc, tmp, load_zero(ctx), | ||
349 | vb, load_gpr(ctx, rc)); | ||
350 | - tcg_temp_free(tmp); | ||
351 | break; | ||
352 | case 0x16: | ||
353 | /* CMOVLBC */ | ||
354 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
355 | tcg_gen_andi_i64(tmp, va, 1); | ||
356 | tcg_gen_movcond_i64(TCG_COND_EQ, vc, tmp, load_zero(ctx), | ||
357 | vb, load_gpr(ctx, rc)); | ||
358 | - tcg_temp_free(tmp); | ||
359 | break; | ||
360 | case 0x20: | ||
361 | /* BIS */ | ||
362 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
363 | vb = load_gpr(ctx, rb); | ||
364 | tcg_gen_andi_i64(tmp, vb, 0x3f); | ||
365 | tcg_gen_shr_i64(vc, va, tmp); | ||
366 | - tcg_temp_free(tmp); | ||
367 | } | ||
368 | break; | ||
369 | case 0x36: | ||
370 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
371 | vb = load_gpr(ctx, rb); | ||
372 | tcg_gen_andi_i64(tmp, vb, 0x3f); | ||
373 | tcg_gen_shl_i64(vc, va, tmp); | ||
374 | - tcg_temp_free(tmp); | ||
375 | } | ||
376 | break; | ||
377 | case 0x3B: | ||
378 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
379 | vb = load_gpr(ctx, rb); | ||
380 | tcg_gen_andi_i64(tmp, vb, 0x3f); | ||
381 | tcg_gen_sar_i64(vc, va, tmp); | ||
382 | - tcg_temp_free(tmp); | ||
383 | } | ||
384 | break; | ||
385 | case 0x52: | ||
386 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
387 | /* UMULH */ | ||
388 | tmp = tcg_temp_new(); | ||
389 | tcg_gen_mulu2_i64(tmp, vc, va, vb); | ||
390 | - tcg_temp_free(tmp); | ||
391 | break; | ||
392 | case 0x40: | ||
393 | /* MULL/V */ | ||
394 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
395 | tcg_gen_mul_i64(tmp, tmp, vc); | ||
396 | tcg_gen_ext32s_i64(vc, tmp); | ||
397 | gen_helper_check_overflow(cpu_env, vc, tmp); | ||
398 | - tcg_temp_free(tmp); | ||
399 | break; | ||
400 | case 0x60: | ||
401 | /* MULQ/V */ | ||
402 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
403 | tcg_gen_muls2_i64(vc, tmp, va, vb); | ||
404 | tcg_gen_sari_i64(tmp2, vc, 63); | ||
405 | gen_helper_check_overflow(cpu_env, tmp, tmp2); | ||
406 | - tcg_temp_free(tmp); | ||
407 | - tcg_temp_free(tmp2); | ||
408 | break; | ||
409 | default: | ||
410 | goto invalid_opc; | ||
411 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
412 | va = load_gpr(ctx, ra); | ||
413 | tcg_gen_extrl_i64_i32(t32, va); | ||
414 | gen_helper_memory_to_s(vc, t32); | ||
415 | - tcg_temp_free_i32(t32); | ||
416 | break; | ||
417 | case 0x0A: | ||
418 | /* SQRTF */ | ||
419 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
420 | va = load_gpr(ctx, ra); | ||
421 | tcg_gen_extrl_i64_i32(t32, va); | ||
422 | gen_helper_memory_to_f(vc, t32); | ||
423 | - tcg_temp_free_i32(t32); | ||
424 | break; | ||
425 | case 0x24: | ||
426 | /* ITOFT */ | ||
427 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
428 | tcg_gen_qemu_ld_i64(va, addr, MMU_USER_IDX, MO_LEUQ); | ||
429 | break; | ||
430 | } | ||
431 | - tcg_temp_free(addr); | ||
432 | break; | ||
433 | } | ||
434 | #else | ||
435 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
436 | va = load_fpr(ctx, ra); | ||
437 | gen_helper_s_to_memory(t32, va); | ||
438 | tcg_gen_ext_i32_i64(vc, t32); | ||
439 | - tcg_temp_free_i32(t32); | ||
440 | break; | ||
441 | } | ||
442 | |||
443 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
444 | tmp = tcg_temp_new(); | ||
445 | tcg_gen_andi_i64(tmp, vb, 1); | ||
446 | st_flag_byte(tmp, ENV_FLAG_PAL_SHIFT); | ||
447 | - tcg_temp_free(tmp); | ||
448 | tcg_gen_andi_i64(cpu_pc, vb, ~3); | ||
449 | /* Allow interrupts to be recognized right away. */ | ||
450 | ret = DISAS_PC_UPDATED_NOCHAIN; | ||
451 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
452 | tmp = tcg_temp_new(); | ||
453 | tcg_gen_addi_i64(tmp, vb, disp12); | ||
454 | tcg_gen_qemu_st_i64(va, tmp, MMU_PHYS_IDX, MO_LESL); | ||
455 | - tcg_temp_free(tmp); | ||
456 | break; | ||
457 | case 0x1: | ||
458 | /* Quadword physical access */ | ||
459 | @@ -XXX,XX +XXX,XX @@ static DisasJumpType translate_one(DisasContext *ctx, uint32_t insn) | ||
460 | tmp = tcg_temp_new(); | ||
461 | tcg_gen_addi_i64(tmp, vb, disp12); | ||
462 | tcg_gen_qemu_st_i64(va, tmp, MMU_PHYS_IDX, MO_LEUQ); | ||
463 | - tcg_temp_free(tmp); | ||
464 | break; | ||
465 | case 0x2: | ||
466 | /* Longword physical access with lock */ | ||
467 | -- | ||
468 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/arm/tcg/translate.h | 1 - | ||
7 | target/arm/tcg/translate-a64.c | 17 ++++------------- | ||
8 | target/arm/tcg/translate.c | 9 --------- | ||
9 | 3 files changed, 4 insertions(+), 23 deletions(-) | ||
10 | |||
11 | diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h | ||
12 | index XXXXXXX..XXXXXXX 100644 | ||
13 | --- a/target/arm/tcg/translate.h | ||
14 | +++ b/target/arm/tcg/translate.h | ||
15 | @@ -XXX,XX +XXX,XX @@ static inline void gen_a64_update_pc(DisasContext *s, target_long diff) | ||
16 | #endif | ||
17 | |||
18 | void arm_test_cc(DisasCompare *cmp, int cc); | ||
19 | -void arm_free_cc(DisasCompare *cmp); | ||
20 | void arm_jump_cc(DisasCompare *cmp, TCGLabel *label); | ||
21 | void arm_gen_test_cc(int cc, TCGLabel *label); | ||
22 | MemOp pow2_align(unsigned i); | ||
23 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | ||
24 | index XXXXXXX..XXXXXXX 100644 | ||
25 | --- a/target/arm/tcg/translate-a64.c | ||
26 | +++ b/target/arm/tcg/translate-a64.c | ||
27 | @@ -XXX,XX +XXX,XX @@ static void a64_test_cc(DisasCompare64 *c64, int cc) | ||
28 | |||
29 | arm_test_cc(&c32, cc); | ||
30 | |||
31 | - /* Sign-extend the 32-bit value so that the GE/LT comparisons work | ||
32 | - * properly. The NE/EQ comparisons are also fine with this choice. */ | ||
33 | + /* | ||
34 | + * Sign-extend the 32-bit value so that the GE/LT comparisons work | ||
35 | + * properly. The NE/EQ comparisons are also fine with this choice. | ||
36 | + */ | ||
37 | c64->cond = c32.cond; | ||
38 | c64->value = tcg_temp_new_i64(); | ||
39 | tcg_gen_ext_i32_i64(c64->value, c32.value); | ||
40 | - | ||
41 | - arm_free_cc(&c32); | ||
42 | -} | ||
43 | - | ||
44 | -static void a64_free_cc(DisasCompare64 *c64) | ||
45 | -{ | ||
46 | - tcg_temp_free_i64(c64->value); | ||
47 | } | ||
48 | |||
49 | static void gen_rebuild_hflags(DisasContext *s) | ||
50 | @@ -XXX,XX +XXX,XX @@ static void disas_cc(DisasContext *s, uint32_t insn) | ||
51 | tcg_t0 = tcg_temp_new_i32(); | ||
52 | arm_test_cc(&c, cond); | ||
53 | tcg_gen_setcondi_i32(tcg_invert_cond(c.cond), tcg_t0, c.value, 0); | ||
54 | - arm_free_cc(&c); | ||
55 | |||
56 | /* Load the arguments for the new comparison. */ | ||
57 | if (is_imm) { | ||
58 | @@ -XXX,XX +XXX,XX @@ static void disas_cond_select(DisasContext *s, uint32_t insn) | ||
59 | tcg_gen_movcond_i64(c.cond, tcg_rd, c.value, zero, t_true, t_false); | ||
60 | } | ||
61 | |||
62 | - a64_free_cc(&c); | ||
63 | - | ||
64 | if (!sf) { | ||
65 | tcg_gen_ext32u_i64(tcg_rd, tcg_rd); | ||
66 | } | ||
67 | @@ -XXX,XX +XXX,XX @@ static void disas_fp_csel(DisasContext *s, uint32_t insn) | ||
68 | tcg_gen_movcond_i64(c.cond, t_true, c.value, tcg_constant_i64(0), | ||
69 | t_true, t_false); | ||
70 | tcg_temp_free_i64(t_false); | ||
71 | - a64_free_cc(&c); | ||
72 | |||
73 | /* Note that sregs & hregs write back zeros to the high bits, | ||
74 | and we've already done the zero-extension. */ | ||
75 | diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c | ||
76 | index XXXXXXX..XXXXXXX 100644 | ||
77 | --- a/target/arm/tcg/translate.c | ||
78 | +++ b/target/arm/tcg/translate.c | ||
79 | @@ -XXX,XX +XXX,XX @@ void arm_test_cc(DisasCompare *cmp, int cc) | ||
80 | cmp->value_global = global; | ||
81 | } | ||
82 | |||
83 | -void arm_free_cc(DisasCompare *cmp) | ||
84 | -{ | ||
85 | - if (!cmp->value_global) { | ||
86 | - tcg_temp_free_i32(cmp->value); | ||
87 | - } | ||
88 | -} | ||
89 | - | ||
90 | void arm_jump_cc(DisasCompare *cmp, TCGLabel *label) | ||
91 | { | ||
92 | tcg_gen_brcondi_i32(cmp->cond, cmp->value, 0, label); | ||
93 | @@ -XXX,XX +XXX,XX @@ void arm_gen_test_cc(int cc, TCGLabel *label) | ||
94 | DisasCompare cmp; | ||
95 | arm_test_cc(&cmp, cc); | ||
96 | arm_jump_cc(&cmp, label); | ||
97 | - arm_free_cc(&cmp); | ||
98 | } | ||
99 | |||
100 | void gen_set_condexec(DisasContext *s) | ||
101 | @@ -XXX,XX +XXX,XX @@ static bool trans_CSEL(DisasContext *s, arg_CSEL *a) | ||
102 | |||
103 | arm_test_cc(&c, a->fcond); | ||
104 | tcg_gen_movcond_i32(c.cond, rn, c.value, zero, rn, rm); | ||
105 | - arm_free_cc(&c); | ||
106 | |||
107 | store_reg(s, a->rd, rn); | ||
108 | tcg_temp_free_i32(rm); | ||
109 | -- | ||
110 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | This field was only used to avoid freeing globals. | ||
2 | Since we no longer free any temps, this is dead. | ||
3 | 1 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
6 | --- | ||
7 | target/arm/tcg/translate.h | 1 - | ||
8 | target/arm/tcg/translate.c | 5 ----- | ||
9 | 2 files changed, 6 deletions(-) | ||
10 | |||
11 | diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h | ||
12 | index XXXXXXX..XXXXXXX 100644 | ||
13 | --- a/target/arm/tcg/translate.h | ||
14 | +++ b/target/arm/tcg/translate.h | ||
15 | @@ -XXX,XX +XXX,XX @@ typedef struct DisasContext { | ||
16 | typedef struct DisasCompare { | ||
17 | TCGCond cond; | ||
18 | TCGv_i32 value; | ||
19 | - bool value_global; | ||
20 | } DisasCompare; | ||
21 | |||
22 | /* Share the TCG temporaries common between 32 and 64 bit modes. */ | ||
23 | diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c | ||
24 | index XXXXXXX..XXXXXXX 100644 | ||
25 | --- a/target/arm/tcg/translate.c | ||
26 | +++ b/target/arm/tcg/translate.c | ||
27 | @@ -XXX,XX +XXX,XX @@ void arm_test_cc(DisasCompare *cmp, int cc) | ||
28 | { | ||
29 | TCGv_i32 value; | ||
30 | TCGCond cond; | ||
31 | - bool global = true; | ||
32 | |||
33 | switch (cc) { | ||
34 | case 0: /* eq: Z */ | ||
35 | @@ -XXX,XX +XXX,XX @@ void arm_test_cc(DisasCompare *cmp, int cc) | ||
36 | case 9: /* ls: !C || Z -> !(C && !Z) */ | ||
37 | cond = TCG_COND_NE; | ||
38 | value = tcg_temp_new_i32(); | ||
39 | - global = false; | ||
40 | /* CF is 1 for C, so -CF is an all-bits-set mask for C; | ||
41 | ZF is non-zero for !Z; so AND the two subexpressions. */ | ||
42 | tcg_gen_neg_i32(value, cpu_CF); | ||
43 | @@ -XXX,XX +XXX,XX @@ void arm_test_cc(DisasCompare *cmp, int cc) | ||
44 | /* Since we're only interested in the sign bit, == 0 is >= 0. */ | ||
45 | cond = TCG_COND_GE; | ||
46 | value = tcg_temp_new_i32(); | ||
47 | - global = false; | ||
48 | tcg_gen_xor_i32(value, cpu_VF, cpu_NF); | ||
49 | break; | ||
50 | |||
51 | @@ -XXX,XX +XXX,XX @@ void arm_test_cc(DisasCompare *cmp, int cc) | ||
52 | case 13: /* le: Z || N != V */ | ||
53 | cond = TCG_COND_NE; | ||
54 | value = tcg_temp_new_i32(); | ||
55 | - global = false; | ||
56 | /* (N == V) is equal to the sign bit of ~(NF ^ VF). Propagate | ||
57 | * the sign bit then AND with ZF to yield the result. */ | ||
58 | tcg_gen_xor_i32(value, cpu_VF, cpu_NF); | ||
59 | @@ -XXX,XX +XXX,XX @@ void arm_test_cc(DisasCompare *cmp, int cc) | ||
60 | no_invert: | ||
61 | cmp->cond = cond; | ||
62 | cmp->value = value; | ||
63 | - cmp->value_global = global; | ||
64 | } | ||
65 | |||
66 | void arm_jump_cc(DisasCompare *cmp, TCGLabel *label) | ||
67 | -- | ||
68 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/arm/tcg/translate.c | 266 +------------------------------------ | ||
7 | 1 file changed, 5 insertions(+), 261 deletions(-) | ||
8 | |||
9 | diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/arm/tcg/translate.c | ||
12 | +++ b/target/arm/tcg/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ void store_cpu_offset(TCGv_i32 var, int offset, int size) | ||
14 | default: | ||
15 | g_assert_not_reached(); | ||
16 | } | ||
17 | - tcg_temp_free_i32(var); | ||
18 | } | ||
19 | |||
20 | /* Save the syndrome information for a Data Abort */ | ||
21 | @@ -XXX,XX +XXX,XX @@ void store_reg(DisasContext *s, int reg, TCGv_i32 var) | ||
22 | tcg_gen_andi_i32(var, var, ~3); | ||
23 | } | ||
24 | tcg_gen_mov_i32(cpu_R[reg], var); | ||
25 | - tcg_temp_free_i32(var); | ||
26 | } | ||
27 | |||
28 | /* | ||
29 | @@ -XXX,XX +XXX,XX @@ static void gen_smul_dual(TCGv_i32 a, TCGv_i32 b) | ||
30 | tcg_gen_ext16s_i32(tmp1, a); | ||
31 | tcg_gen_ext16s_i32(tmp2, b); | ||
32 | tcg_gen_mul_i32(tmp1, tmp1, tmp2); | ||
33 | - tcg_temp_free_i32(tmp2); | ||
34 | tcg_gen_sari_i32(a, a, 16); | ||
35 | tcg_gen_sari_i32(b, b, 16); | ||
36 | tcg_gen_mul_i32(b, b, a); | ||
37 | tcg_gen_mov_i32(a, tmp1); | ||
38 | - tcg_temp_free_i32(tmp1); | ||
39 | } | ||
40 | |||
41 | /* Byteswap each halfword. */ | ||
42 | @@ -XXX,XX +XXX,XX @@ void gen_rev16(TCGv_i32 dest, TCGv_i32 var) | ||
43 | tcg_gen_and_i32(var, var, mask); | ||
44 | tcg_gen_shli_i32(var, var, 8); | ||
45 | tcg_gen_or_i32(dest, var, tmp); | ||
46 | - tcg_temp_free_i32(tmp); | ||
47 | } | ||
48 | |||
49 | /* Byteswap low halfword and sign extend. */ | ||
50 | @@ -XXX,XX +XXX,XX @@ static void gen_add16(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) | ||
51 | tcg_gen_andi_i32(t1, t1, ~0x8000); | ||
52 | tcg_gen_add_i32(t0, t0, t1); | ||
53 | tcg_gen_xor_i32(dest, t0, tmp); | ||
54 | - tcg_temp_free_i32(tmp); | ||
55 | } | ||
56 | |||
57 | /* Set N and Z flags from var. */ | ||
58 | @@ -XXX,XX +XXX,XX @@ static void gen_add_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) | ||
59 | tcg_gen_xor_i32(cpu_VF, cpu_NF, t0); | ||
60 | tcg_gen_xor_i32(tmp, t0, t1); | ||
61 | tcg_gen_andc_i32(cpu_VF, cpu_VF, tmp); | ||
62 | - tcg_temp_free_i32(tmp); | ||
63 | tcg_gen_mov_i32(dest, cpu_NF); | ||
64 | } | ||
65 | |||
66 | @@ -XXX,XX +XXX,XX @@ static void gen_adc_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) | ||
67 | tcg_gen_extu_i32_i64(q1, cpu_CF); | ||
68 | tcg_gen_add_i64(q0, q0, q1); | ||
69 | tcg_gen_extr_i64_i32(cpu_NF, cpu_CF, q0); | ||
70 | - tcg_temp_free_i64(q0); | ||
71 | - tcg_temp_free_i64(q1); | ||
72 | } | ||
73 | tcg_gen_mov_i32(cpu_ZF, cpu_NF); | ||
74 | tcg_gen_xor_i32(cpu_VF, cpu_NF, t0); | ||
75 | tcg_gen_xor_i32(tmp, t0, t1); | ||
76 | tcg_gen_andc_i32(cpu_VF, cpu_VF, tmp); | ||
77 | - tcg_temp_free_i32(tmp); | ||
78 | tcg_gen_mov_i32(dest, cpu_NF); | ||
79 | } | ||
80 | |||
81 | @@ -XXX,XX +XXX,XX @@ static void gen_sub_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) | ||
82 | tmp = tcg_temp_new_i32(); | ||
83 | tcg_gen_xor_i32(tmp, t0, t1); | ||
84 | tcg_gen_and_i32(cpu_VF, cpu_VF, tmp); | ||
85 | - tcg_temp_free_i32(tmp); | ||
86 | tcg_gen_mov_i32(dest, cpu_NF); | ||
87 | } | ||
88 | |||
89 | @@ -XXX,XX +XXX,XX @@ static void gen_sbc_CC(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) | ||
90 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
91 | tcg_gen_not_i32(tmp, t1); | ||
92 | gen_adc_CC(dest, t0, tmp); | ||
93 | - tcg_temp_free_i32(tmp); | ||
94 | } | ||
95 | |||
96 | #define GEN_SHIFT(name) \ | ||
97 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) \ | ||
98 | tcg_gen_##name##_i32(tmpd, t0, tmp1); \ | ||
99 | tcg_gen_andi_i32(tmp1, t1, 0xe0); \ | ||
100 | tcg_gen_movcond_i32(TCG_COND_NE, dest, tmp1, zero, zero, tmpd); \ | ||
101 | - tcg_temp_free_i32(tmpd); \ | ||
102 | - tcg_temp_free_i32(tmp1); \ | ||
103 | } | ||
104 | GEN_SHIFT(shl) | ||
105 | GEN_SHIFT(shr) | ||
106 | @@ -XXX,XX +XXX,XX @@ static void gen_sar(TCGv_i32 dest, TCGv_i32 t0, TCGv_i32 t1) | ||
107 | tcg_gen_andi_i32(tmp1, t1, 0xff); | ||
108 | tcg_gen_umin_i32(tmp1, tmp1, tcg_constant_i32(31)); | ||
109 | tcg_gen_sar_i32(dest, t0, tmp1); | ||
110 | - tcg_temp_free_i32(tmp1); | ||
111 | } | ||
112 | |||
113 | static void shifter_out_im(TCGv_i32 var, int shift) | ||
114 | @@ -XXX,XX +XXX,XX @@ static inline void gen_arm_shift_im(TCGv_i32 var, int shiftop, | ||
115 | shifter_out_im(var, 0); | ||
116 | tcg_gen_shri_i32(var, var, 1); | ||
117 | tcg_gen_or_i32(var, var, tmp); | ||
118 | - tcg_temp_free_i32(tmp); | ||
119 | } | ||
120 | } | ||
121 | }; | ||
122 | @@ -XXX,XX +XXX,XX @@ static inline void gen_arm_shift_reg(TCGv_i32 var, int shiftop, | ||
123 | tcg_gen_rotr_i32(var, var, shift); break; | ||
124 | } | ||
125 | } | ||
126 | - tcg_temp_free_i32(shift); | ||
127 | } | ||
128 | |||
129 | /* | ||
130 | @@ -XXX,XX +XXX,XX @@ static inline void gen_bxns(DisasContext *s, int rm) | ||
131 | * "zeroes the IT bits" as our UNPREDICTABLE behaviour otherwise. | ||
132 | */ | ||
133 | gen_helper_v7m_bxns(cpu_env, var); | ||
134 | - tcg_temp_free_i32(var); | ||
135 | s->base.is_jmp = DISAS_EXIT; | ||
136 | } | ||
137 | |||
138 | @@ -XXX,XX +XXX,XX @@ static inline void gen_blxns(DisasContext *s, int rm) | ||
139 | */ | ||
140 | gen_update_pc(s, curr_insn_len(s)); | ||
141 | gen_helper_v7m_blxns(cpu_env, var); | ||
142 | - tcg_temp_free_i32(var); | ||
143 | s->base.is_jmp = DISAS_EXIT; | ||
144 | } | ||
145 | |||
146 | @@ -XXX,XX +XXX,XX @@ void gen_aa32_ld_internal_i32(DisasContext *s, TCGv_i32 val, | ||
147 | { | ||
148 | TCGv addr = gen_aa32_addr(s, a32, opc); | ||
149 | tcg_gen_qemu_ld_i32(val, addr, index, opc); | ||
150 | - tcg_temp_free(addr); | ||
151 | } | ||
152 | |||
153 | void gen_aa32_st_internal_i32(DisasContext *s, TCGv_i32 val, | ||
154 | @@ -XXX,XX +XXX,XX @@ void gen_aa32_st_internal_i32(DisasContext *s, TCGv_i32 val, | ||
155 | { | ||
156 | TCGv addr = gen_aa32_addr(s, a32, opc); | ||
157 | tcg_gen_qemu_st_i32(val, addr, index, opc); | ||
158 | - tcg_temp_free(addr); | ||
159 | } | ||
160 | |||
161 | void gen_aa32_ld_internal_i64(DisasContext *s, TCGv_i64 val, | ||
162 | @@ -XXX,XX +XXX,XX @@ void gen_aa32_ld_internal_i64(DisasContext *s, TCGv_i64 val, | ||
163 | if (!IS_USER_ONLY && s->sctlr_b && (opc & MO_SIZE) == MO_64) { | ||
164 | tcg_gen_rotri_i64(val, val, 32); | ||
165 | } | ||
166 | - tcg_temp_free(addr); | ||
167 | } | ||
168 | |||
169 | void gen_aa32_st_internal_i64(DisasContext *s, TCGv_i64 val, | ||
170 | @@ -XXX,XX +XXX,XX @@ void gen_aa32_st_internal_i64(DisasContext *s, TCGv_i64 val, | ||
171 | TCGv_i64 tmp = tcg_temp_new_i64(); | ||
172 | tcg_gen_rotri_i64(tmp, val, 32); | ||
173 | tcg_gen_qemu_st_i64(tmp, addr, index, opc); | ||
174 | - tcg_temp_free_i64(tmp); | ||
175 | } else { | ||
176 | tcg_gen_qemu_st_i64(val, addr, index, opc); | ||
177 | } | ||
178 | - tcg_temp_free(addr); | ||
179 | } | ||
180 | |||
181 | void gen_aa32_ld_i32(DisasContext *s, TCGv_i32 val, TCGv_i32 a32, | ||
182 | @@ -XXX,XX +XXX,XX @@ static inline TCGv_i32 iwmmxt_load_creg(int reg) | ||
183 | static inline void iwmmxt_store_creg(int reg, TCGv_i32 var) | ||
184 | { | ||
185 | tcg_gen_st_i32(var, cpu_env, offsetof(CPUARMState, iwmmxt.cregs[reg])); | ||
186 | - tcg_temp_free_i32(var); | ||
187 | } | ||
188 | |||
189 | static inline void gen_op_iwmmxt_movq_wRn_M0(int rn) | ||
190 | @@ -XXX,XX +XXX,XX @@ static inline int gen_iwmmxt_address(DisasContext *s, uint32_t insn, | ||
191 | else | ||
192 | tcg_gen_addi_i32(tmp, tmp, -offset); | ||
193 | tcg_gen_mov_i32(dest, tmp); | ||
194 | - if (insn & (1 << 21)) | ||
195 | + if (insn & (1 << 21)) { | ||
196 | store_reg(s, rd, tmp); | ||
197 | - else | ||
198 | - tcg_temp_free_i32(tmp); | ||
199 | + } | ||
200 | } else if (insn & (1 << 21)) { | ||
201 | /* Post indexed */ | ||
202 | tcg_gen_mov_i32(dest, tmp); | ||
203 | @@ -XXX,XX +XXX,XX @@ static inline int gen_iwmmxt_shift(uint32_t insn, uint32_t mask, TCGv_i32 dest) | ||
204 | } | ||
205 | tcg_gen_andi_i32(tmp, tmp, mask); | ||
206 | tcg_gen_mov_i32(dest, tmp); | ||
207 | - tcg_temp_free_i32(tmp); | ||
208 | return 0; | ||
209 | } | ||
210 | |||
211 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
212 | wrd = (insn >> 12) & 0xf; | ||
213 | addr = tcg_temp_new_i32(); | ||
214 | if (gen_iwmmxt_address(s, insn, addr)) { | ||
215 | - tcg_temp_free_i32(addr); | ||
216 | return 1; | ||
217 | } | ||
218 | if (insn & ARM_CP_RW_BIT) { | ||
219 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
220 | } | ||
221 | if (i) { | ||
222 | tcg_gen_extu_i32_i64(cpu_M0, tmp); | ||
223 | - tcg_temp_free_i32(tmp); | ||
224 | } | ||
225 | gen_op_iwmmxt_movq_wRn_M0(wrd); | ||
226 | } | ||
227 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
228 | } | ||
229 | } | ||
230 | } | ||
231 | - tcg_temp_free_i32(tmp); | ||
232 | } | ||
233 | - tcg_temp_free_i32(addr); | ||
234 | return 0; | ||
235 | } | ||
236 | |||
237 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
238 | tmp = iwmmxt_load_creg(wrd); | ||
239 | tmp2 = load_reg(s, rd); | ||
240 | tcg_gen_andc_i32(tmp, tmp, tmp2); | ||
241 | - tcg_temp_free_i32(tmp2); | ||
242 | iwmmxt_store_creg(wrd, tmp); | ||
243 | break; | ||
244 | case ARM_IWMMXT_wCGR0: | ||
245 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
246 | tcg_gen_andi_i32(tmp, tmp, 7); | ||
247 | iwmmxt_load_reg(cpu_V1, rd1); | ||
248 | gen_helper_iwmmxt_align(cpu_M0, cpu_M0, cpu_V1, tmp); | ||
249 | - tcg_temp_free_i32(tmp); | ||
250 | gen_op_iwmmxt_movq_wRn_M0(wrd); | ||
251 | gen_op_iwmmxt_set_mup(); | ||
252 | break; | ||
253 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
254 | g_assert_not_reached(); | ||
255 | } | ||
256 | gen_helper_iwmmxt_insr(cpu_M0, cpu_M0, tmp, tmp2, tmp3); | ||
257 | - tcg_temp_free_i32(tmp); | ||
258 | gen_op_iwmmxt_movq_wRn_M0(wrd); | ||
259 | gen_op_iwmmxt_set_mup(); | ||
260 | break; | ||
261 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
262 | } | ||
263 | tcg_gen_shli_i32(tmp, tmp, 28); | ||
264 | gen_set_nzcv(tmp); | ||
265 | - tcg_temp_free_i32(tmp); | ||
266 | break; | ||
267 | case 0x401: case 0x405: case 0x409: case 0x40d: /* TBCST */ | ||
268 | if (((insn >> 6) & 3) == 3) | ||
269 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
270 | gen_helper_iwmmxt_bcstl(cpu_M0, tmp); | ||
271 | break; | ||
272 | } | ||
273 | - tcg_temp_free_i32(tmp); | ||
274 | gen_op_iwmmxt_movq_wRn_M0(wrd); | ||
275 | gen_op_iwmmxt_set_mup(); | ||
276 | break; | ||
277 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
278 | break; | ||
279 | } | ||
280 | gen_set_nzcv(tmp); | ||
281 | - tcg_temp_free_i32(tmp2); | ||
282 | - tcg_temp_free_i32(tmp); | ||
283 | break; | ||
284 | case 0x01c: case 0x41c: case 0x81c: case 0xc1c: /* WACC */ | ||
285 | wrd = (insn >> 12) & 0xf; | ||
286 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
287 | break; | ||
288 | } | ||
289 | gen_set_nzcv(tmp); | ||
290 | - tcg_temp_free_i32(tmp2); | ||
291 | - tcg_temp_free_i32(tmp); | ||
292 | break; | ||
293 | case 0x103: case 0x503: case 0x903: case 0xd03: /* TMOVMSK */ | ||
294 | rd = (insn >> 12) & 0xf; | ||
295 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
296 | gen_op_iwmmxt_movq_M0_wRn(rd0); | ||
297 | tmp = tcg_temp_new_i32(); | ||
298 | if (gen_iwmmxt_shift(insn, 0xff, tmp)) { | ||
299 | - tcg_temp_free_i32(tmp); | ||
300 | return 1; | ||
301 | } | ||
302 | switch ((insn >> 22) & 3) { | ||
303 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
304 | gen_helper_iwmmxt_srlq(cpu_M0, cpu_env, cpu_M0, tmp); | ||
305 | break; | ||
306 | } | ||
307 | - tcg_temp_free_i32(tmp); | ||
308 | gen_op_iwmmxt_movq_wRn_M0(wrd); | ||
309 | gen_op_iwmmxt_set_mup(); | ||
310 | gen_op_iwmmxt_set_cup(); | ||
311 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
312 | gen_op_iwmmxt_movq_M0_wRn(rd0); | ||
313 | tmp = tcg_temp_new_i32(); | ||
314 | if (gen_iwmmxt_shift(insn, 0xff, tmp)) { | ||
315 | - tcg_temp_free_i32(tmp); | ||
316 | return 1; | ||
317 | } | ||
318 | switch ((insn >> 22) & 3) { | ||
319 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
320 | gen_helper_iwmmxt_sraq(cpu_M0, cpu_env, cpu_M0, tmp); | ||
321 | break; | ||
322 | } | ||
323 | - tcg_temp_free_i32(tmp); | ||
324 | gen_op_iwmmxt_movq_wRn_M0(wrd); | ||
325 | gen_op_iwmmxt_set_mup(); | ||
326 | gen_op_iwmmxt_set_cup(); | ||
327 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
328 | gen_op_iwmmxt_movq_M0_wRn(rd0); | ||
329 | tmp = tcg_temp_new_i32(); | ||
330 | if (gen_iwmmxt_shift(insn, 0xff, tmp)) { | ||
331 | - tcg_temp_free_i32(tmp); | ||
332 | return 1; | ||
333 | } | ||
334 | switch ((insn >> 22) & 3) { | ||
335 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
336 | gen_helper_iwmmxt_sllq(cpu_M0, cpu_env, cpu_M0, tmp); | ||
337 | break; | ||
338 | } | ||
339 | - tcg_temp_free_i32(tmp); | ||
340 | gen_op_iwmmxt_movq_wRn_M0(wrd); | ||
341 | gen_op_iwmmxt_set_mup(); | ||
342 | gen_op_iwmmxt_set_cup(); | ||
343 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
344 | switch ((insn >> 22) & 3) { | ||
345 | case 1: | ||
346 | if (gen_iwmmxt_shift(insn, 0xf, tmp)) { | ||
347 | - tcg_temp_free_i32(tmp); | ||
348 | return 1; | ||
349 | } | ||
350 | gen_helper_iwmmxt_rorw(cpu_M0, cpu_env, cpu_M0, tmp); | ||
351 | break; | ||
352 | case 2: | ||
353 | if (gen_iwmmxt_shift(insn, 0x1f, tmp)) { | ||
354 | - tcg_temp_free_i32(tmp); | ||
355 | return 1; | ||
356 | } | ||
357 | gen_helper_iwmmxt_rorl(cpu_M0, cpu_env, cpu_M0, tmp); | ||
358 | break; | ||
359 | case 3: | ||
360 | if (gen_iwmmxt_shift(insn, 0x3f, tmp)) { | ||
361 | - tcg_temp_free_i32(tmp); | ||
362 | return 1; | ||
363 | } | ||
364 | gen_helper_iwmmxt_rorq(cpu_M0, cpu_env, cpu_M0, tmp); | ||
365 | break; | ||
366 | } | ||
367 | - tcg_temp_free_i32(tmp); | ||
368 | gen_op_iwmmxt_movq_wRn_M0(wrd); | ||
369 | gen_op_iwmmxt_set_mup(); | ||
370 | gen_op_iwmmxt_set_cup(); | ||
371 | @@ -XXX,XX +XXX,XX @@ static int disas_iwmmxt_insn(DisasContext *s, uint32_t insn) | ||
372 | gen_helper_iwmmxt_muladdswl(cpu_M0, cpu_M0, tmp, tmp2); | ||
373 | break; | ||
374 | default: | ||
375 | - tcg_temp_free_i32(tmp2); | ||
376 | - tcg_temp_free_i32(tmp); | ||
377 | return 1; | ||
378 | } | ||
379 | - tcg_temp_free_i32(tmp2); | ||
380 | - tcg_temp_free_i32(tmp); | ||
381 | gen_op_iwmmxt_movq_wRn_M0(wrd); | ||
382 | gen_op_iwmmxt_set_mup(); | ||
383 | break; | ||
384 | @@ -XXX,XX +XXX,XX @@ static int disas_dsp_insn(DisasContext *s, uint32_t insn) | ||
385 | default: | ||
386 | return 1; | ||
387 | } | ||
388 | - tcg_temp_free_i32(tmp2); | ||
389 | - tcg_temp_free_i32(tmp); | ||
390 | |||
391 | gen_op_iwmmxt_movq_wRn_M0(acc); | ||
392 | return 0; | ||
393 | @@ -XXX,XX +XXX,XX @@ static int gen_set_psr(DisasContext *s, uint32_t mask, int spsr, TCGv_i32 t0) | ||
394 | } else { | ||
395 | gen_set_cpsr(t0, mask); | ||
396 | } | ||
397 | - tcg_temp_free_i32(t0); | ||
398 | gen_lookup_tb(s); | ||
399 | return 0; | ||
400 | } | ||
401 | @@ -XXX,XX +XXX,XX @@ static bool msr_banked_access_decode(DisasContext *s, int r, int sysm, int rn, | ||
402 | |||
403 | gen_exception_insn_el_v(s, 0, EXCP_UDEF, | ||
404 | syn_uncategorized(), tcg_el); | ||
405 | - tcg_temp_free_i32(tcg_el); | ||
406 | return false; | ||
407 | } | ||
408 | break; | ||
409 | @@ -XXX,XX +XXX,XX @@ static void gen_msr_banked(DisasContext *s, int r, int sysm, int rn) | ||
410 | gen_helper_msr_banked(cpu_env, tcg_reg, | ||
411 | tcg_constant_i32(tgtmode), | ||
412 | tcg_constant_i32(regno)); | ||
413 | - tcg_temp_free_i32(tcg_reg); | ||
414 | s->base.is_jmp = DISAS_UPDATE_EXIT; | ||
415 | } | ||
416 | |||
417 | @@ -XXX,XX +XXX,XX @@ static void gen_mrs_banked(DisasContext *s, int r, int sysm, int rn) | ||
418 | static void store_pc_exc_ret(DisasContext *s, TCGv_i32 pc) | ||
419 | { | ||
420 | tcg_gen_mov_i32(cpu_R[15], pc); | ||
421 | - tcg_temp_free_i32(pc); | ||
422 | } | ||
423 | |||
424 | /* Generate a v6 exception return. Marks both values as dead. */ | ||
425 | @@ -XXX,XX +XXX,XX @@ static void gen_rfe(DisasContext *s, TCGv_i32 pc, TCGv_i32 cpsr) | ||
426 | gen_io_start(); | ||
427 | } | ||
428 | gen_helper_cpsr_write_eret(cpu_env, cpsr); | ||
429 | - tcg_temp_free_i32(cpsr); | ||
430 | /* Must exit loop to check un-masked IRQs */ | ||
431 | s->base.is_jmp = DISAS_EXIT; | ||
432 | } | ||
433 | @@ -XXX,XX +XXX,XX @@ static void gen_gvec_fn3_qc(uint32_t rd_ofs, uint32_t rn_ofs, uint32_t rm_ofs, | ||
434 | tcg_gen_addi_ptr(qc_ptr, cpu_env, offsetof(CPUARMState, vfp.qc)); | ||
435 | tcg_gen_gvec_3_ptr(rd_ofs, rn_ofs, rm_ofs, qc_ptr, | ||
436 | opr_sz, max_sz, 0, fn); | ||
437 | - tcg_temp_free_ptr(qc_ptr); | ||
438 | } | ||
439 | |||
440 | void gen_gvec_sqrdmlah_qc(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
441 | @@ -XXX,XX +XXX,XX @@ static void gen_srshr8_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
442 | tcg_gen_andi_i64(t, t, dup_const(MO_8, 1)); | ||
443 | tcg_gen_vec_sar8i_i64(d, a, sh); | ||
444 | tcg_gen_vec_add8_i64(d, d, t); | ||
445 | - tcg_temp_free_i64(t); | ||
446 | } | ||
447 | |||
448 | static void gen_srshr16_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
449 | @@ -XXX,XX +XXX,XX @@ static void gen_srshr16_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
450 | tcg_gen_andi_i64(t, t, dup_const(MO_16, 1)); | ||
451 | tcg_gen_vec_sar16i_i64(d, a, sh); | ||
452 | tcg_gen_vec_add16_i64(d, d, t); | ||
453 | - tcg_temp_free_i64(t); | ||
454 | } | ||
455 | |||
456 | static void gen_srshr32_i32(TCGv_i32 d, TCGv_i32 a, int32_t sh) | ||
457 | @@ -XXX,XX +XXX,XX @@ static void gen_srshr32_i32(TCGv_i32 d, TCGv_i32 a, int32_t sh) | ||
458 | tcg_gen_extract_i32(t, a, sh - 1, 1); | ||
459 | tcg_gen_sari_i32(d, a, sh); | ||
460 | tcg_gen_add_i32(d, d, t); | ||
461 | - tcg_temp_free_i32(t); | ||
462 | } | ||
463 | |||
464 | static void gen_srshr64_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
465 | @@ -XXX,XX +XXX,XX @@ static void gen_srshr64_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
466 | tcg_gen_extract_i64(t, a, sh - 1, 1); | ||
467 | tcg_gen_sari_i64(d, a, sh); | ||
468 | tcg_gen_add_i64(d, d, t); | ||
469 | - tcg_temp_free_i64(t); | ||
470 | } | ||
471 | |||
472 | static void gen_srshr_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh) | ||
473 | @@ -XXX,XX +XXX,XX @@ static void gen_srshr_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh) | ||
474 | tcg_gen_and_vec(vece, t, t, ones); | ||
475 | tcg_gen_sari_vec(vece, d, a, sh); | ||
476 | tcg_gen_add_vec(vece, d, d, t); | ||
477 | - | ||
478 | - tcg_temp_free_vec(t); | ||
479 | - tcg_temp_free_vec(ones); | ||
480 | } | ||
481 | |||
482 | void gen_gvec_srshr(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs, | ||
483 | @@ -XXX,XX +XXX,XX @@ static void gen_srsra8_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
484 | |||
485 | gen_srshr8_i64(t, a, sh); | ||
486 | tcg_gen_vec_add8_i64(d, d, t); | ||
487 | - tcg_temp_free_i64(t); | ||
488 | } | ||
489 | |||
490 | static void gen_srsra16_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
491 | @@ -XXX,XX +XXX,XX @@ static void gen_srsra16_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
492 | |||
493 | gen_srshr16_i64(t, a, sh); | ||
494 | tcg_gen_vec_add16_i64(d, d, t); | ||
495 | - tcg_temp_free_i64(t); | ||
496 | } | ||
497 | |||
498 | static void gen_srsra32_i32(TCGv_i32 d, TCGv_i32 a, int32_t sh) | ||
499 | @@ -XXX,XX +XXX,XX @@ static void gen_srsra32_i32(TCGv_i32 d, TCGv_i32 a, int32_t sh) | ||
500 | |||
501 | gen_srshr32_i32(t, a, sh); | ||
502 | tcg_gen_add_i32(d, d, t); | ||
503 | - tcg_temp_free_i32(t); | ||
504 | } | ||
505 | |||
506 | static void gen_srsra64_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
507 | @@ -XXX,XX +XXX,XX @@ static void gen_srsra64_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
508 | |||
509 | gen_srshr64_i64(t, a, sh); | ||
510 | tcg_gen_add_i64(d, d, t); | ||
511 | - tcg_temp_free_i64(t); | ||
512 | } | ||
513 | |||
514 | static void gen_srsra_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh) | ||
515 | @@ -XXX,XX +XXX,XX @@ static void gen_srsra_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh) | ||
516 | |||
517 | gen_srshr_vec(vece, t, a, sh); | ||
518 | tcg_gen_add_vec(vece, d, d, t); | ||
519 | - tcg_temp_free_vec(t); | ||
520 | } | ||
521 | |||
522 | void gen_gvec_srsra(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs, | ||
523 | @@ -XXX,XX +XXX,XX @@ static void gen_urshr8_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
524 | tcg_gen_andi_i64(t, t, dup_const(MO_8, 1)); | ||
525 | tcg_gen_vec_shr8i_i64(d, a, sh); | ||
526 | tcg_gen_vec_add8_i64(d, d, t); | ||
527 | - tcg_temp_free_i64(t); | ||
528 | } | ||
529 | |||
530 | static void gen_urshr16_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
531 | @@ -XXX,XX +XXX,XX @@ static void gen_urshr16_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
532 | tcg_gen_andi_i64(t, t, dup_const(MO_16, 1)); | ||
533 | tcg_gen_vec_shr16i_i64(d, a, sh); | ||
534 | tcg_gen_vec_add16_i64(d, d, t); | ||
535 | - tcg_temp_free_i64(t); | ||
536 | } | ||
537 | |||
538 | static void gen_urshr32_i32(TCGv_i32 d, TCGv_i32 a, int32_t sh) | ||
539 | @@ -XXX,XX +XXX,XX @@ static void gen_urshr32_i32(TCGv_i32 d, TCGv_i32 a, int32_t sh) | ||
540 | tcg_gen_extract_i32(t, a, sh - 1, 1); | ||
541 | tcg_gen_shri_i32(d, a, sh); | ||
542 | tcg_gen_add_i32(d, d, t); | ||
543 | - tcg_temp_free_i32(t); | ||
544 | } | ||
545 | |||
546 | static void gen_urshr64_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
547 | @@ -XXX,XX +XXX,XX @@ static void gen_urshr64_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
548 | tcg_gen_extract_i64(t, a, sh - 1, 1); | ||
549 | tcg_gen_shri_i64(d, a, sh); | ||
550 | tcg_gen_add_i64(d, d, t); | ||
551 | - tcg_temp_free_i64(t); | ||
552 | } | ||
553 | |||
554 | static void gen_urshr_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t shift) | ||
555 | @@ -XXX,XX +XXX,XX @@ static void gen_urshr_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t shift) | ||
556 | tcg_gen_and_vec(vece, t, t, ones); | ||
557 | tcg_gen_shri_vec(vece, d, a, shift); | ||
558 | tcg_gen_add_vec(vece, d, d, t); | ||
559 | - | ||
560 | - tcg_temp_free_vec(t); | ||
561 | - tcg_temp_free_vec(ones); | ||
562 | } | ||
563 | |||
564 | void gen_gvec_urshr(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs, | ||
565 | @@ -XXX,XX +XXX,XX @@ static void gen_ursra8_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
566 | gen_urshr8_i64(t, a, sh); | ||
567 | } | ||
568 | tcg_gen_vec_add8_i64(d, d, t); | ||
569 | - tcg_temp_free_i64(t); | ||
570 | } | ||
571 | |||
572 | static void gen_ursra16_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
573 | @@ -XXX,XX +XXX,XX @@ static void gen_ursra16_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
574 | gen_urshr16_i64(t, a, sh); | ||
575 | } | ||
576 | tcg_gen_vec_add16_i64(d, d, t); | ||
577 | - tcg_temp_free_i64(t); | ||
578 | } | ||
579 | |||
580 | static void gen_ursra32_i32(TCGv_i32 d, TCGv_i32 a, int32_t sh) | ||
581 | @@ -XXX,XX +XXX,XX @@ static void gen_ursra32_i32(TCGv_i32 d, TCGv_i32 a, int32_t sh) | ||
582 | gen_urshr32_i32(t, a, sh); | ||
583 | } | ||
584 | tcg_gen_add_i32(d, d, t); | ||
585 | - tcg_temp_free_i32(t); | ||
586 | } | ||
587 | |||
588 | static void gen_ursra64_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
589 | @@ -XXX,XX +XXX,XX @@ static void gen_ursra64_i64(TCGv_i64 d, TCGv_i64 a, int64_t sh) | ||
590 | gen_urshr64_i64(t, a, sh); | ||
591 | } | ||
592 | tcg_gen_add_i64(d, d, t); | ||
593 | - tcg_temp_free_i64(t); | ||
594 | } | ||
595 | |||
596 | static void gen_ursra_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh) | ||
597 | @@ -XXX,XX +XXX,XX @@ static void gen_ursra_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh) | ||
598 | gen_urshr_vec(vece, t, a, sh); | ||
599 | } | ||
600 | tcg_gen_add_vec(vece, d, d, t); | ||
601 | - tcg_temp_free_vec(t); | ||
602 | } | ||
603 | |||
604 | void gen_gvec_ursra(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs, | ||
605 | @@ -XXX,XX +XXX,XX @@ static void gen_shr8_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift) | ||
606 | tcg_gen_andi_i64(t, t, mask); | ||
607 | tcg_gen_andi_i64(d, d, ~mask); | ||
608 | tcg_gen_or_i64(d, d, t); | ||
609 | - tcg_temp_free_i64(t); | ||
610 | } | ||
611 | |||
612 | static void gen_shr16_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift) | ||
613 | @@ -XXX,XX +XXX,XX @@ static void gen_shr16_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift) | ||
614 | tcg_gen_andi_i64(t, t, mask); | ||
615 | tcg_gen_andi_i64(d, d, ~mask); | ||
616 | tcg_gen_or_i64(d, d, t); | ||
617 | - tcg_temp_free_i64(t); | ||
618 | } | ||
619 | |||
620 | static void gen_shr32_ins_i32(TCGv_i32 d, TCGv_i32 a, int32_t shift) | ||
621 | @@ -XXX,XX +XXX,XX @@ static void gen_shr_ins_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh) | ||
622 | tcg_gen_shri_vec(vece, t, a, sh); | ||
623 | tcg_gen_and_vec(vece, d, d, m); | ||
624 | tcg_gen_or_vec(vece, d, d, t); | ||
625 | - | ||
626 | - tcg_temp_free_vec(t); | ||
627 | - tcg_temp_free_vec(m); | ||
628 | } | ||
629 | |||
630 | void gen_gvec_sri(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs, | ||
631 | @@ -XXX,XX +XXX,XX @@ static void gen_shl8_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift) | ||
632 | tcg_gen_andi_i64(t, t, mask); | ||
633 | tcg_gen_andi_i64(d, d, ~mask); | ||
634 | tcg_gen_or_i64(d, d, t); | ||
635 | - tcg_temp_free_i64(t); | ||
636 | } | ||
637 | |||
638 | static void gen_shl16_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift) | ||
639 | @@ -XXX,XX +XXX,XX @@ static void gen_shl16_ins_i64(TCGv_i64 d, TCGv_i64 a, int64_t shift) | ||
640 | tcg_gen_andi_i64(t, t, mask); | ||
641 | tcg_gen_andi_i64(d, d, ~mask); | ||
642 | tcg_gen_or_i64(d, d, t); | ||
643 | - tcg_temp_free_i64(t); | ||
644 | } | ||
645 | |||
646 | static void gen_shl32_ins_i32(TCGv_i32 d, TCGv_i32 a, int32_t shift) | ||
647 | @@ -XXX,XX +XXX,XX @@ static void gen_shl_ins_vec(unsigned vece, TCGv_vec d, TCGv_vec a, int64_t sh) | ||
648 | tcg_gen_dupi_vec(vece, m, MAKE_64BIT_MASK(0, sh)); | ||
649 | tcg_gen_and_vec(vece, d, d, m); | ||
650 | tcg_gen_or_vec(vece, d, d, t); | ||
651 | - | ||
652 | - tcg_temp_free_vec(t); | ||
653 | - tcg_temp_free_vec(m); | ||
654 | } | ||
655 | |||
656 | void gen_gvec_sli(unsigned vece, uint32_t rd_ofs, uint32_t rm_ofs, | ||
657 | @@ -XXX,XX +XXX,XX @@ void gen_ushl_i32(TCGv_i32 dst, TCGv_i32 src, TCGv_i32 shift) | ||
658 | tcg_gen_shr_i32(rval, src, rsh); | ||
659 | tcg_gen_movcond_i32(TCG_COND_LTU, dst, lsh, max, lval, zero); | ||
660 | tcg_gen_movcond_i32(TCG_COND_LTU, dst, rsh, max, rval, dst); | ||
661 | - | ||
662 | - tcg_temp_free_i32(lval); | ||
663 | - tcg_temp_free_i32(rval); | ||
664 | - tcg_temp_free_i32(lsh); | ||
665 | - tcg_temp_free_i32(rsh); | ||
666 | } | ||
667 | |||
668 | void gen_ushl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift) | ||
669 | @@ -XXX,XX +XXX,XX @@ void gen_ushl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift) | ||
670 | tcg_gen_shr_i64(rval, src, rsh); | ||
671 | tcg_gen_movcond_i64(TCG_COND_LTU, dst, lsh, max, lval, zero); | ||
672 | tcg_gen_movcond_i64(TCG_COND_LTU, dst, rsh, max, rval, dst); | ||
673 | - | ||
674 | - tcg_temp_free_i64(lval); | ||
675 | - tcg_temp_free_i64(rval); | ||
676 | - tcg_temp_free_i64(lsh); | ||
677 | - tcg_temp_free_i64(rsh); | ||
678 | } | ||
679 | |||
680 | static void gen_ushl_vec(unsigned vece, TCGv_vec dst, | ||
681 | @@ -XXX,XX +XXX,XX @@ static void gen_ushl_vec(unsigned vece, TCGv_vec dst, | ||
682 | tcg_gen_dupi_vec(vece, msk, 0xff); | ||
683 | tcg_gen_and_vec(vece, lsh, shift, msk); | ||
684 | tcg_gen_and_vec(vece, rsh, rsh, msk); | ||
685 | - tcg_temp_free_vec(msk); | ||
686 | } | ||
687 | |||
688 | /* | ||
689 | @@ -XXX,XX +XXX,XX @@ static void gen_ushl_vec(unsigned vece, TCGv_vec dst, | ||
690 | tcg_gen_and_vec(vece, rval, rval, rsh); | ||
691 | } | ||
692 | tcg_gen_or_vec(vece, dst, lval, rval); | ||
693 | - | ||
694 | - tcg_temp_free_vec(max); | ||
695 | - tcg_temp_free_vec(lval); | ||
696 | - tcg_temp_free_vec(rval); | ||
697 | - tcg_temp_free_vec(lsh); | ||
698 | - tcg_temp_free_vec(rsh); | ||
699 | } | ||
700 | |||
701 | void gen_gvec_ushl(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
702 | @@ -XXX,XX +XXX,XX @@ void gen_sshl_i32(TCGv_i32 dst, TCGv_i32 src, TCGv_i32 shift) | ||
703 | tcg_gen_sar_i32(rval, src, rsh); | ||
704 | tcg_gen_movcond_i32(TCG_COND_LEU, lval, lsh, max, lval, zero); | ||
705 | tcg_gen_movcond_i32(TCG_COND_LT, dst, lsh, zero, rval, lval); | ||
706 | - | ||
707 | - tcg_temp_free_i32(lval); | ||
708 | - tcg_temp_free_i32(rval); | ||
709 | - tcg_temp_free_i32(lsh); | ||
710 | - tcg_temp_free_i32(rsh); | ||
711 | } | ||
712 | |||
713 | void gen_sshl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift) | ||
714 | @@ -XXX,XX +XXX,XX @@ void gen_sshl_i64(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 shift) | ||
715 | tcg_gen_sar_i64(rval, src, rsh); | ||
716 | tcg_gen_movcond_i64(TCG_COND_LEU, lval, lsh, max, lval, zero); | ||
717 | tcg_gen_movcond_i64(TCG_COND_LT, dst, lsh, zero, rval, lval); | ||
718 | - | ||
719 | - tcg_temp_free_i64(lval); | ||
720 | - tcg_temp_free_i64(rval); | ||
721 | - tcg_temp_free_i64(lsh); | ||
722 | - tcg_temp_free_i64(rsh); | ||
723 | } | ||
724 | |||
725 | static void gen_sshl_vec(unsigned vece, TCGv_vec dst, | ||
726 | @@ -XXX,XX +XXX,XX @@ static void gen_sshl_vec(unsigned vece, TCGv_vec dst, | ||
727 | tcg_gen_dupi_vec(vece, tmp, 0x80); | ||
728 | tcg_gen_cmpsel_vec(TCG_COND_LT, vece, dst, lsh, tmp, lval, rval); | ||
729 | } | ||
730 | - | ||
731 | - tcg_temp_free_vec(lval); | ||
732 | - tcg_temp_free_vec(rval); | ||
733 | - tcg_temp_free_vec(lsh); | ||
734 | - tcg_temp_free_vec(rsh); | ||
735 | - tcg_temp_free_vec(tmp); | ||
736 | } | ||
737 | |||
738 | void gen_gvec_sshl(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
739 | @@ -XXX,XX +XXX,XX @@ static void gen_uqadd_vec(unsigned vece, TCGv_vec t, TCGv_vec sat, | ||
740 | tcg_gen_usadd_vec(vece, t, a, b); | ||
741 | tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t); | ||
742 | tcg_gen_or_vec(vece, sat, sat, x); | ||
743 | - tcg_temp_free_vec(x); | ||
744 | } | ||
745 | |||
746 | void gen_gvec_uqadd_qc(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
747 | @@ -XXX,XX +XXX,XX @@ static void gen_sqadd_vec(unsigned vece, TCGv_vec t, TCGv_vec sat, | ||
748 | tcg_gen_ssadd_vec(vece, t, a, b); | ||
749 | tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t); | ||
750 | tcg_gen_or_vec(vece, sat, sat, x); | ||
751 | - tcg_temp_free_vec(x); | ||
752 | } | ||
753 | |||
754 | void gen_gvec_sqadd_qc(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
755 | @@ -XXX,XX +XXX,XX @@ static void gen_uqsub_vec(unsigned vece, TCGv_vec t, TCGv_vec sat, | ||
756 | tcg_gen_ussub_vec(vece, t, a, b); | ||
757 | tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t); | ||
758 | tcg_gen_or_vec(vece, sat, sat, x); | ||
759 | - tcg_temp_free_vec(x); | ||
760 | } | ||
761 | |||
762 | void gen_gvec_uqsub_qc(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
763 | @@ -XXX,XX +XXX,XX @@ static void gen_sqsub_vec(unsigned vece, TCGv_vec t, TCGv_vec sat, | ||
764 | tcg_gen_sssub_vec(vece, t, a, b); | ||
765 | tcg_gen_cmp_vec(TCG_COND_NE, vece, x, x, t); | ||
766 | tcg_gen_or_vec(vece, sat, sat, x); | ||
767 | - tcg_temp_free_vec(x); | ||
768 | } | ||
769 | |||
770 | void gen_gvec_sqsub_qc(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
771 | @@ -XXX,XX +XXX,XX @@ static void gen_sabd_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b) | ||
772 | tcg_gen_sub_i32(t, a, b); | ||
773 | tcg_gen_sub_i32(d, b, a); | ||
774 | tcg_gen_movcond_i32(TCG_COND_LT, d, a, b, d, t); | ||
775 | - tcg_temp_free_i32(t); | ||
776 | } | ||
777 | |||
778 | static void gen_sabd_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b) | ||
779 | @@ -XXX,XX +XXX,XX @@ static void gen_sabd_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b) | ||
780 | tcg_gen_sub_i64(t, a, b); | ||
781 | tcg_gen_sub_i64(d, b, a); | ||
782 | tcg_gen_movcond_i64(TCG_COND_LT, d, a, b, d, t); | ||
783 | - tcg_temp_free_i64(t); | ||
784 | } | ||
785 | |||
786 | static void gen_sabd_vec(unsigned vece, TCGv_vec d, TCGv_vec a, TCGv_vec b) | ||
787 | @@ -XXX,XX +XXX,XX @@ static void gen_sabd_vec(unsigned vece, TCGv_vec d, TCGv_vec a, TCGv_vec b) | ||
788 | tcg_gen_smin_vec(vece, t, a, b); | ||
789 | tcg_gen_smax_vec(vece, d, a, b); | ||
790 | tcg_gen_sub_vec(vece, d, d, t); | ||
791 | - tcg_temp_free_vec(t); | ||
792 | } | ||
793 | |||
794 | void gen_gvec_sabd(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
795 | @@ -XXX,XX +XXX,XX @@ static void gen_uabd_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b) | ||
796 | tcg_gen_sub_i32(t, a, b); | ||
797 | tcg_gen_sub_i32(d, b, a); | ||
798 | tcg_gen_movcond_i32(TCG_COND_LTU, d, a, b, d, t); | ||
799 | - tcg_temp_free_i32(t); | ||
800 | } | ||
801 | |||
802 | static void gen_uabd_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b) | ||
803 | @@ -XXX,XX +XXX,XX @@ static void gen_uabd_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b) | ||
804 | tcg_gen_sub_i64(t, a, b); | ||
805 | tcg_gen_sub_i64(d, b, a); | ||
806 | tcg_gen_movcond_i64(TCG_COND_LTU, d, a, b, d, t); | ||
807 | - tcg_temp_free_i64(t); | ||
808 | } | ||
809 | |||
810 | static void gen_uabd_vec(unsigned vece, TCGv_vec d, TCGv_vec a, TCGv_vec b) | ||
811 | @@ -XXX,XX +XXX,XX @@ static void gen_uabd_vec(unsigned vece, TCGv_vec d, TCGv_vec a, TCGv_vec b) | ||
812 | tcg_gen_umin_vec(vece, t, a, b); | ||
813 | tcg_gen_umax_vec(vece, d, a, b); | ||
814 | tcg_gen_sub_vec(vece, d, d, t); | ||
815 | - tcg_temp_free_vec(t); | ||
816 | } | ||
817 | |||
818 | void gen_gvec_uabd(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
819 | @@ -XXX,XX +XXX,XX @@ static void gen_saba_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b) | ||
820 | TCGv_i32 t = tcg_temp_new_i32(); | ||
821 | gen_sabd_i32(t, a, b); | ||
822 | tcg_gen_add_i32(d, d, t); | ||
823 | - tcg_temp_free_i32(t); | ||
824 | } | ||
825 | |||
826 | static void gen_saba_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b) | ||
827 | @@ -XXX,XX +XXX,XX @@ static void gen_saba_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b) | ||
828 | TCGv_i64 t = tcg_temp_new_i64(); | ||
829 | gen_sabd_i64(t, a, b); | ||
830 | tcg_gen_add_i64(d, d, t); | ||
831 | - tcg_temp_free_i64(t); | ||
832 | } | ||
833 | |||
834 | static void gen_saba_vec(unsigned vece, TCGv_vec d, TCGv_vec a, TCGv_vec b) | ||
835 | @@ -XXX,XX +XXX,XX @@ static void gen_saba_vec(unsigned vece, TCGv_vec d, TCGv_vec a, TCGv_vec b) | ||
836 | TCGv_vec t = tcg_temp_new_vec_matching(d); | ||
837 | gen_sabd_vec(vece, t, a, b); | ||
838 | tcg_gen_add_vec(vece, d, d, t); | ||
839 | - tcg_temp_free_vec(t); | ||
840 | } | ||
841 | |||
842 | void gen_gvec_saba(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
843 | @@ -XXX,XX +XXX,XX @@ static void gen_uaba_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b) | ||
844 | TCGv_i32 t = tcg_temp_new_i32(); | ||
845 | gen_uabd_i32(t, a, b); | ||
846 | tcg_gen_add_i32(d, d, t); | ||
847 | - tcg_temp_free_i32(t); | ||
848 | } | ||
849 | |||
850 | static void gen_uaba_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b) | ||
851 | @@ -XXX,XX +XXX,XX @@ static void gen_uaba_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b) | ||
852 | TCGv_i64 t = tcg_temp_new_i64(); | ||
853 | gen_uabd_i64(t, a, b); | ||
854 | tcg_gen_add_i64(d, d, t); | ||
855 | - tcg_temp_free_i64(t); | ||
856 | } | ||
857 | |||
858 | static void gen_uaba_vec(unsigned vece, TCGv_vec d, TCGv_vec a, TCGv_vec b) | ||
859 | @@ -XXX,XX +XXX,XX @@ static void gen_uaba_vec(unsigned vece, TCGv_vec d, TCGv_vec a, TCGv_vec b) | ||
860 | TCGv_vec t = tcg_temp_new_vec_matching(d); | ||
861 | gen_uabd_vec(vece, t, a, b); | ||
862 | tcg_gen_add_vec(vece, d, d, t); | ||
863 | - tcg_temp_free_vec(t); | ||
864 | } | ||
865 | |||
866 | void gen_gvec_uaba(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs, | ||
867 | @@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64, | ||
868 | t = load_cpu_offset(offsetoflow32(CPUARMState, cp15.hstr_el2)); | ||
869 | tcg_gen_andi_i32(t, t, 1u << maskbit); | ||
870 | tcg_gen_brcondi_i32(TCG_COND_EQ, t, 0, over.label); | ||
871 | - tcg_temp_free_i32(t); | ||
872 | |||
873 | gen_exception_insn(s, 0, EXCP_UDEF, syndrome); | ||
874 | set_disas_label(s, over); | ||
875 | @@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64, | ||
876 | case 0: | ||
877 | break; | ||
878 | case ARM_CP_NOP: | ||
879 | - goto exit; | ||
880 | + return; | ||
881 | case ARM_CP_WFI: | ||
882 | if (isread) { | ||
883 | unallocated_encoding(s); | ||
884 | @@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64, | ||
885 | gen_update_pc(s, curr_insn_len(s)); | ||
886 | s->base.is_jmp = DISAS_WFI; | ||
887 | } | ||
888 | - goto exit; | ||
889 | + return; | ||
890 | default: | ||
891 | g_assert_not_reached(); | ||
892 | } | ||
893 | @@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64, | ||
894 | store_reg(s, rt, tmp); | ||
895 | tmp = tcg_temp_new_i32(); | ||
896 | tcg_gen_extrh_i64_i32(tmp, tmp64); | ||
897 | - tcg_temp_free_i64(tmp64); | ||
898 | store_reg(s, rt2, tmp); | ||
899 | } else { | ||
900 | TCGv_i32 tmp; | ||
901 | @@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64, | ||
902 | * the condition codes from the high 4 bits of the value | ||
903 | */ | ||
904 | gen_set_nzcv(tmp); | ||
905 | - tcg_temp_free_i32(tmp); | ||
906 | } else { | ||
907 | store_reg(s, rt, tmp); | ||
908 | } | ||
909 | @@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64, | ||
910 | /* Write */ | ||
911 | if (ri->type & ARM_CP_CONST) { | ||
912 | /* If not forbidden by access permissions, treat as WI */ | ||
913 | - goto exit; | ||
914 | + return; | ||
915 | } | ||
916 | |||
917 | if (is64) { | ||
918 | @@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64, | ||
919 | tmplo = load_reg(s, rt); | ||
920 | tmphi = load_reg(s, rt2); | ||
921 | tcg_gen_concat_i32_i64(tmp64, tmplo, tmphi); | ||
922 | - tcg_temp_free_i32(tmplo); | ||
923 | - tcg_temp_free_i32(tmphi); | ||
924 | if (ri->writefn) { | ||
925 | if (!tcg_ri) { | ||
926 | tcg_ri = gen_lookup_cp_reg(key); | ||
927 | @@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64, | ||
928 | } else { | ||
929 | tcg_gen_st_i64(tmp64, cpu_env, ri->fieldoffset); | ||
930 | } | ||
931 | - tcg_temp_free_i64(tmp64); | ||
932 | } else { | ||
933 | TCGv_i32 tmp = load_reg(s, rt); | ||
934 | if (ri->writefn) { | ||
935 | @@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64, | ||
936 | tcg_ri = gen_lookup_cp_reg(key); | ||
937 | } | ||
938 | gen_helper_set_cp_reg(cpu_env, tcg_ri, tmp); | ||
939 | - tcg_temp_free_i32(tmp); | ||
940 | } else { | ||
941 | store_cpu_offset(tmp, ri->fieldoffset, 4); | ||
942 | } | ||
943 | @@ -XXX,XX +XXX,XX @@ static void do_coproc_insn(DisasContext *s, int cpnum, int is64, | ||
944 | if (need_exit_tb) { | ||
945 | gen_lookup_tb(s); | ||
946 | } | ||
947 | - | ||
948 | - exit: | ||
949 | - if (tcg_ri) { | ||
950 | - tcg_temp_free_ptr(tcg_ri); | ||
951 | - } | ||
952 | } | ||
953 | |||
954 | /* Decode XScale DSP or iWMMXt insn (in the copro space, cp=0 or 1) */ | ||
955 | @@ -XXX,XX +XXX,XX @@ static void gen_addq(DisasContext *s, TCGv_i64 val, int rlow, int rhigh) | ||
956 | tmph = load_reg(s, rhigh); | ||
957 | tmp = tcg_temp_new_i64(); | ||
958 | tcg_gen_concat_i32_i64(tmp, tmpl, tmph); | ||
959 | - tcg_temp_free_i32(tmpl); | ||
960 | - tcg_temp_free_i32(tmph); | ||
961 | tcg_gen_add_i64(val, val, tmp); | ||
962 | - tcg_temp_free_i64(tmp); | ||
963 | } | ||
964 | |||
965 | /* Set N and Z flags from hi|lo. */ | ||
966 | @@ -XXX,XX +XXX,XX @@ static void gen_load_exclusive(DisasContext *s, int rt, int rt2, | ||
967 | TCGv taddr = gen_aa32_addr(s, addr, opc); | ||
968 | |||
969 | tcg_gen_qemu_ld_i64(t64, taddr, get_mem_index(s), opc); | ||
970 | - tcg_temp_free(taddr); | ||
971 | tcg_gen_mov_i64(cpu_exclusive_val, t64); | ||
972 | if (s->be_data == MO_BE) { | ||
973 | tcg_gen_extr_i64_i32(tmp2, tmp, t64); | ||
974 | } else { | ||
975 | tcg_gen_extr_i64_i32(tmp, tmp2, t64); | ||
976 | } | ||
977 | - tcg_temp_free_i64(t64); | ||
978 | - | ||
979 | store_reg(s, rt2, tmp2); | ||
980 | } else { | ||
981 | gen_aa32_ld_i32(s, tmp, addr, get_mem_index(s), opc); | ||
982 | @@ -XXX,XX +XXX,XX @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2, | ||
983 | extaddr = tcg_temp_new_i64(); | ||
984 | tcg_gen_extu_i32_i64(extaddr, addr); | ||
985 | tcg_gen_brcond_i64(TCG_COND_NE, extaddr, cpu_exclusive_addr, fail_label); | ||
986 | - tcg_temp_free_i64(extaddr); | ||
987 | |||
988 | taddr = gen_aa32_addr(s, addr, opc); | ||
989 | t0 = tcg_temp_new_i32(); | ||
990 | @@ -XXX,XX +XXX,XX @@ static void gen_store_exclusive(DisasContext *s, int rd, int rt, int rt2, | ||
991 | } else { | ||
992 | tcg_gen_concat_i32_i64(n64, t1, t2); | ||
993 | } | ||
994 | - tcg_temp_free_i32(t2); | ||
995 | |||
996 | tcg_gen_atomic_cmpxchg_i64(o64, taddr, cpu_exclusive_val, n64, | ||
997 | get_mem_index(s), opc); | ||
998 | - tcg_temp_free_i64(n64); | ||
999 | |||
1000 | tcg_gen_setcond_i64(TCG_COND_NE, o64, o64, cpu_exclusive_val); | ||
1001 | tcg_gen_extrl_i64_i32(t0, o64); | ||
1002 | - | ||
1003 | - tcg_temp_free_i64(o64); | ||
1004 | } else { | ||
1005 | t2 = tcg_temp_new_i32(); | ||
1006 | tcg_gen_extrl_i64_i32(t2, cpu_exclusive_val); | ||
1007 | tcg_gen_atomic_cmpxchg_i32(t0, taddr, t2, t1, get_mem_index(s), opc); | ||
1008 | tcg_gen_setcond_i32(TCG_COND_NE, t0, t0, t2); | ||
1009 | - tcg_temp_free_i32(t2); | ||
1010 | } | ||
1011 | - tcg_temp_free_i32(t1); | ||
1012 | - tcg_temp_free(taddr); | ||
1013 | tcg_gen_mov_i32(cpu_R[rd], t0); | ||
1014 | - tcg_temp_free_i32(t0); | ||
1015 | tcg_gen_br(done_label); | ||
1016 | |||
1017 | gen_set_label(fail_label); | ||
1018 | @@ -XXX,XX +XXX,XX @@ static void gen_srs(DisasContext *s, | ||
1019 | tcg_gen_addi_i32(addr, addr, offset); | ||
1020 | tmp = load_reg(s, 14); | ||
1021 | gen_aa32_st_i32(s, tmp, addr, get_mem_index(s), MO_UL | MO_ALIGN); | ||
1022 | - tcg_temp_free_i32(tmp); | ||
1023 | tmp = load_cpu_field(spsr); | ||
1024 | tcg_gen_addi_i32(addr, addr, 4); | ||
1025 | gen_aa32_st_i32(s, tmp, addr, get_mem_index(s), MO_UL | MO_ALIGN); | ||
1026 | - tcg_temp_free_i32(tmp); | ||
1027 | if (writeback) { | ||
1028 | switch (amode) { | ||
1029 | case 0: | ||
1030 | @@ -XXX,XX +XXX,XX @@ static void gen_srs(DisasContext *s, | ||
1031 | tcg_gen_addi_i32(addr, addr, offset); | ||
1032 | gen_helper_set_r13_banked(cpu_env, tcg_constant_i32(mode), addr); | ||
1033 | } | ||
1034 | - tcg_temp_free_i32(addr); | ||
1035 | s->base.is_jmp = DISAS_UPDATE_EXIT; | ||
1036 | } | ||
1037 | |||
1038 | @@ -XXX,XX +XXX,XX @@ static bool store_reg_kind(DisasContext *s, int rd, | ||
1039 | { | ||
1040 | switch (kind) { | ||
1041 | case STREG_NONE: | ||
1042 | - tcg_temp_free_i32(val); | ||
1043 | return true; | ||
1044 | case STREG_NORMAL: | ||
1045 | /* See ALUWritePC: Interworking only from a32 mode. */ | ||
1046 | @@ -XXX,XX +XXX,XX @@ static bool op_s_rrr_shi(DisasContext *s, arg_s_rrr_shi *a, | ||
1047 | tmp1 = load_reg(s, a->rn); | ||
1048 | |||
1049 | gen(tmp1, tmp1, tmp2); | ||
1050 | - tcg_temp_free_i32(tmp2); | ||
1051 | |||
1052 | if (logic_cc) { | ||
1053 | gen_logic_CC(tmp1); | ||
1054 | @@ -XXX,XX +XXX,XX @@ static bool op_s_rrr_shr(DisasContext *s, arg_s_rrr_shr *a, | ||
1055 | tmp1 = load_reg(s, a->rn); | ||
1056 | |||
1057 | gen(tmp1, tmp1, tmp2); | ||
1058 | - tcg_temp_free_i32(tmp2); | ||
1059 | |||
1060 | if (logic_cc) { | ||
1061 | gen_logic_CC(tmp1); | ||
1062 | @@ -XXX,XX +XXX,XX @@ static bool do_mve_shl_ri(DisasContext *s, arg_mve_shl_ri *a, | ||
1063 | tcg_gen_extrh_i64_i32(rdahi, rda); | ||
1064 | store_reg(s, a->rdalo, rdalo); | ||
1065 | store_reg(s, a->rdahi, rdahi); | ||
1066 | - tcg_temp_free_i64(rda); | ||
1067 | |||
1068 | return true; | ||
1069 | } | ||
1070 | @@ -XXX,XX +XXX,XX @@ static bool do_mve_shl_rr(DisasContext *s, arg_mve_shl_rr *a, WideShiftFn *fn) | ||
1071 | tcg_gen_extrh_i64_i32(rdahi, rda); | ||
1072 | store_reg(s, a->rdalo, rdalo); | ||
1073 | store_reg(s, a->rdahi, rdahi); | ||
1074 | - tcg_temp_free_i64(rda); | ||
1075 | |||
1076 | return true; | ||
1077 | } | ||
1078 | @@ -XXX,XX +XXX,XX @@ static bool op_mla(DisasContext *s, arg_s_rrrr *a, bool add) | ||
1079 | t1 = load_reg(s, a->rn); | ||
1080 | t2 = load_reg(s, a->rm); | ||
1081 | tcg_gen_mul_i32(t1, t1, t2); | ||
1082 | - tcg_temp_free_i32(t2); | ||
1083 | if (add) { | ||
1084 | t2 = load_reg(s, a->ra); | ||
1085 | tcg_gen_add_i32(t1, t1, t2); | ||
1086 | - tcg_temp_free_i32(t2); | ||
1087 | } | ||
1088 | if (a->s) { | ||
1089 | gen_logic_CC(t1); | ||
1090 | @@ -XXX,XX +XXX,XX @@ static bool trans_MLS(DisasContext *s, arg_MLS *a) | ||
1091 | t1 = load_reg(s, a->rn); | ||
1092 | t2 = load_reg(s, a->rm); | ||
1093 | tcg_gen_mul_i32(t1, t1, t2); | ||
1094 | - tcg_temp_free_i32(t2); | ||
1095 | t2 = load_reg(s, a->ra); | ||
1096 | tcg_gen_sub_i32(t1, t2, t1); | ||
1097 | - tcg_temp_free_i32(t2); | ||
1098 | store_reg(s, a->rd, t1); | ||
1099 | return true; | ||
1100 | } | ||
1101 | @@ -XXX,XX +XXX,XX @@ static bool op_mlal(DisasContext *s, arg_s_rrrr *a, bool uns, bool add) | ||
1102 | t2 = load_reg(s, a->ra); | ||
1103 | t3 = load_reg(s, a->rd); | ||
1104 | tcg_gen_add2_i32(t0, t1, t0, t1, t2, t3); | ||
1105 | - tcg_temp_free_i32(t2); | ||
1106 | - tcg_temp_free_i32(t3); | ||
1107 | } | ||
1108 | if (a->s) { | ||
1109 | gen_logicq_cc(t0, t1); | ||
1110 | @@ -XXX,XX +XXX,XX @@ static bool trans_UMAAL(DisasContext *s, arg_UMAAL *a) | ||
1111 | zero = tcg_constant_i32(0); | ||
1112 | t2 = load_reg(s, a->ra); | ||
1113 | tcg_gen_add2_i32(t0, t1, t0, t1, t2, zero); | ||
1114 | - tcg_temp_free_i32(t2); | ||
1115 | t2 = load_reg(s, a->rd); | ||
1116 | tcg_gen_add2_i32(t0, t1, t0, t1, t2, zero); | ||
1117 | - tcg_temp_free_i32(t2); | ||
1118 | store_reg(s, a->ra, t0); | ||
1119 | store_reg(s, a->rd, t1); | ||
1120 | return true; | ||
1121 | @@ -XXX,XX +XXX,XX @@ static bool op_qaddsub(DisasContext *s, arg_rrr *a, bool add, bool doub) | ||
1122 | } else { | ||
1123 | gen_helper_sub_saturate(t0, cpu_env, t0, t1); | ||
1124 | } | ||
1125 | - tcg_temp_free_i32(t1); | ||
1126 | store_reg(s, a->rd, t0); | ||
1127 | return true; | ||
1128 | } | ||
1129 | @@ -XXX,XX +XXX,XX @@ static bool op_smlaxxx(DisasContext *s, arg_rrrr *a, | ||
1130 | t0 = load_reg(s, a->rn); | ||
1131 | t1 = load_reg(s, a->rm); | ||
1132 | gen_mulxy(t0, t1, nt, mt); | ||
1133 | - tcg_temp_free_i32(t1); | ||
1134 | |||
1135 | switch (add_long) { | ||
1136 | case 0: | ||
1137 | @@ -XXX,XX +XXX,XX @@ static bool op_smlaxxx(DisasContext *s, arg_rrrr *a, | ||
1138 | case 1: | ||
1139 | t1 = load_reg(s, a->ra); | ||
1140 | gen_helper_add_setq(t0, cpu_env, t0, t1); | ||
1141 | - tcg_temp_free_i32(t1); | ||
1142 | store_reg(s, a->rd, t0); | ||
1143 | break; | ||
1144 | case 2: | ||
1145 | @@ -XXX,XX +XXX,XX @@ static bool op_smlaxxx(DisasContext *s, arg_rrrr *a, | ||
1146 | t1 = tcg_temp_new_i32(); | ||
1147 | tcg_gen_sari_i32(t1, t0, 31); | ||
1148 | tcg_gen_add2_i32(tl, th, tl, th, t0, t1); | ||
1149 | - tcg_temp_free_i32(t0); | ||
1150 | - tcg_temp_free_i32(t1); | ||
1151 | store_reg(s, a->ra, tl); | ||
1152 | store_reg(s, a->rd, th); | ||
1153 | break; | ||
1154 | @@ -XXX,XX +XXX,XX @@ static bool op_smlawx(DisasContext *s, arg_rrrr *a, bool add, bool mt) | ||
1155 | tcg_gen_shli_i32(t1, t1, 16); | ||
1156 | } | ||
1157 | tcg_gen_muls2_i32(t0, t1, t0, t1); | ||
1158 | - tcg_temp_free_i32(t0); | ||
1159 | if (add) { | ||
1160 | t0 = load_reg(s, a->ra); | ||
1161 | gen_helper_add_setq(t1, cpu_env, t1, t0); | ||
1162 | - tcg_temp_free_i32(t0); | ||
1163 | } | ||
1164 | store_reg(s, a->rd, t1); | ||
1165 | return true; | ||
1166 | @@ -XXX,XX +XXX,XX @@ static bool op_crc32(DisasContext *s, arg_rrr *a, bool c, MemOp sz) | ||
1167 | } else { | ||
1168 | gen_helper_crc32(t1, t1, t2, t3); | ||
1169 | } | ||
1170 | - tcg_temp_free_i32(t2); | ||
1171 | store_reg(s, a->rd, t1); | ||
1172 | return true; | ||
1173 | } | ||
1174 | @@ -XXX,XX +XXX,XX @@ static bool trans_MSR_v7m(DisasContext *s, arg_MSR_v7m *a) | ||
1175 | addr = tcg_constant_i32((a->mask << 10) | a->sysm); | ||
1176 | reg = load_reg(s, a->rn); | ||
1177 | gen_helper_v7m_msr(cpu_env, addr, reg); | ||
1178 | - tcg_temp_free_i32(reg); | ||
1179 | /* If we wrote to CONTROL, the EL might have changed */ | ||
1180 | gen_rebuild_hflags(s, true); | ||
1181 | gen_lookup_tb(s); | ||
1182 | @@ -XXX,XX +XXX,XX @@ static bool trans_TT(DisasContext *s, arg_TT *a) | ||
1183 | addr = load_reg(s, a->rn); | ||
1184 | tmp = tcg_temp_new_i32(); | ||
1185 | gen_helper_v7m_tt(tmp, cpu_env, addr, tcg_constant_i32((a->A << 1) | a->T)); | ||
1186 | - tcg_temp_free_i32(addr); | ||
1187 | store_reg(s, a->rd, tmp); | ||
1188 | return true; | ||
1189 | } | ||
1190 | @@ -XXX,XX +XXX,XX @@ static TCGv_i32 op_addr_rr_pre(DisasContext *s, arg_ldst_rr *a) | ||
1191 | } else { | ||
1192 | tcg_gen_sub_i32(addr, addr, ofs); | ||
1193 | } | ||
1194 | - tcg_temp_free_i32(ofs); | ||
1195 | } | ||
1196 | return addr; | ||
1197 | } | ||
1198 | @@ -XXX,XX +XXX,XX @@ static void op_addr_rr_post(DisasContext *s, arg_ldst_rr *a, | ||
1199 | } else { | ||
1200 | tcg_gen_sub_i32(addr, addr, ofs); | ||
1201 | } | ||
1202 | - tcg_temp_free_i32(ofs); | ||
1203 | } else if (!a->w) { | ||
1204 | - tcg_temp_free_i32(addr); | ||
1205 | return; | ||
1206 | } | ||
1207 | tcg_gen_addi_i32(addr, addr, address_offset); | ||
1208 | @@ -XXX,XX +XXX,XX @@ static bool op_store_rr(DisasContext *s, arg_ldst_rr *a, | ||
1209 | tmp = load_reg(s, a->rt); | ||
1210 | gen_aa32_st_i32(s, tmp, addr, mem_idx, mop); | ||
1211 | disas_set_da_iss(s, mop, issinfo); | ||
1212 | - tcg_temp_free_i32(tmp); | ||
1213 | |||
1214 | op_addr_rr_post(s, a, addr, 0); | ||
1215 | return true; | ||
1216 | @@ -XXX,XX +XXX,XX @@ static bool trans_STRD_rr(DisasContext *s, arg_ldst_rr *a) | ||
1217 | |||
1218 | tmp = load_reg(s, a->rt); | ||
1219 | gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN); | ||
1220 | - tcg_temp_free_i32(tmp); | ||
1221 | |||
1222 | tcg_gen_addi_i32(addr, addr, 4); | ||
1223 | |||
1224 | tmp = load_reg(s, a->rt + 1); | ||
1225 | gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN); | ||
1226 | - tcg_temp_free_i32(tmp); | ||
1227 | |||
1228 | op_addr_rr_post(s, a, addr, -4); | ||
1229 | return true; | ||
1230 | @@ -XXX,XX +XXX,XX @@ static TCGv_i32 op_addr_ri_pre(DisasContext *s, arg_ldst_ri *a) | ||
1231 | TCGv_i32 newsp = tcg_temp_new_i32(); | ||
1232 | tcg_gen_addi_i32(newsp, cpu_R[13], ofs); | ||
1233 | gen_helper_v8m_stackcheck(cpu_env, newsp); | ||
1234 | - tcg_temp_free_i32(newsp); | ||
1235 | } else { | ||
1236 | gen_helper_v8m_stackcheck(cpu_env, cpu_R[13]); | ||
1237 | } | ||
1238 | @@ -XXX,XX +XXX,XX @@ static void op_addr_ri_post(DisasContext *s, arg_ldst_ri *a, | ||
1239 | address_offset -= a->imm; | ||
1240 | } | ||
1241 | } else if (!a->w) { | ||
1242 | - tcg_temp_free_i32(addr); | ||
1243 | return; | ||
1244 | } | ||
1245 | tcg_gen_addi_i32(addr, addr, address_offset); | ||
1246 | @@ -XXX,XX +XXX,XX @@ static bool op_store_ri(DisasContext *s, arg_ldst_ri *a, | ||
1247 | tmp = load_reg(s, a->rt); | ||
1248 | gen_aa32_st_i32(s, tmp, addr, mem_idx, mop); | ||
1249 | disas_set_da_iss(s, mop, issinfo); | ||
1250 | - tcg_temp_free_i32(tmp); | ||
1251 | |||
1252 | op_addr_ri_post(s, a, addr, 0); | ||
1253 | return true; | ||
1254 | @@ -XXX,XX +XXX,XX @@ static bool op_strd_ri(DisasContext *s, arg_ldst_ri *a, int rt2) | ||
1255 | |||
1256 | tmp = load_reg(s, a->rt); | ||
1257 | gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN); | ||
1258 | - tcg_temp_free_i32(tmp); | ||
1259 | |||
1260 | tcg_gen_addi_i32(addr, addr, 4); | ||
1261 | |||
1262 | tmp = load_reg(s, rt2); | ||
1263 | gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN); | ||
1264 | - tcg_temp_free_i32(tmp); | ||
1265 | |||
1266 | op_addr_ri_post(s, a, addr, -4); | ||
1267 | return true; | ||
1268 | @@ -XXX,XX +XXX,XX @@ static bool op_swp(DisasContext *s, arg_SWP *a, MemOp opc) | ||
1269 | opc |= s->be_data; | ||
1270 | addr = load_reg(s, a->rn); | ||
1271 | taddr = gen_aa32_addr(s, addr, opc); | ||
1272 | - tcg_temp_free_i32(addr); | ||
1273 | |||
1274 | tmp = load_reg(s, a->rt2); | ||
1275 | tcg_gen_atomic_xchg_i32(tmp, taddr, tmp, get_mem_index(s), opc); | ||
1276 | - tcg_temp_free(taddr); | ||
1277 | |||
1278 | store_reg(s, a->rt, tmp); | ||
1279 | return true; | ||
1280 | @@ -XXX,XX +XXX,XX @@ static bool op_strex(DisasContext *s, arg_STREX *a, MemOp mop, bool rel) | ||
1281 | tcg_gen_addi_i32(addr, addr, a->imm); | ||
1282 | |||
1283 | gen_store_exclusive(s, a->rd, a->rt, a->rt2, addr, mop); | ||
1284 | - tcg_temp_free_i32(addr); | ||
1285 | return true; | ||
1286 | } | ||
1287 | |||
1288 | @@ -XXX,XX +XXX,XX @@ static bool op_stl(DisasContext *s, arg_STL *a, MemOp mop) | ||
1289 | gen_aa32_st_i32(s, tmp, addr, get_mem_index(s), mop | MO_ALIGN); | ||
1290 | disas_set_da_iss(s, mop, a->rt | ISSIsAcqRel | ISSIsWrite); | ||
1291 | |||
1292 | - tcg_temp_free_i32(tmp); | ||
1293 | - tcg_temp_free_i32(addr); | ||
1294 | return true; | ||
1295 | } | ||
1296 | |||
1297 | @@ -XXX,XX +XXX,XX @@ static bool op_ldrex(DisasContext *s, arg_LDREX *a, MemOp mop, bool acq) | ||
1298 | tcg_gen_addi_i32(addr, addr, a->imm); | ||
1299 | |||
1300 | gen_load_exclusive(s, a->rt, a->rt2, addr, mop); | ||
1301 | - tcg_temp_free_i32(addr); | ||
1302 | |||
1303 | if (acq) { | ||
1304 | tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ); | ||
1305 | @@ -XXX,XX +XXX,XX @@ static bool op_lda(DisasContext *s, arg_LDA *a, MemOp mop) | ||
1306 | tmp = tcg_temp_new_i32(); | ||
1307 | gen_aa32_ld_i32(s, tmp, addr, get_mem_index(s), mop | MO_ALIGN); | ||
1308 | disas_set_da_iss(s, mop, a->rt | ISSIsAcqRel); | ||
1309 | - tcg_temp_free_i32(addr); | ||
1310 | |||
1311 | store_reg(s, a->rt, tmp); | ||
1312 | tcg_gen_mb(TCG_MO_ALL | TCG_BAR_STRL); | ||
1313 | @@ -XXX,XX +XXX,XX @@ static bool trans_USADA8(DisasContext *s, arg_USADA8 *a) | ||
1314 | t1 = load_reg(s, a->rn); | ||
1315 | t2 = load_reg(s, a->rm); | ||
1316 | gen_helper_usad8(t1, t1, t2); | ||
1317 | - tcg_temp_free_i32(t2); | ||
1318 | if (a->ra != 15) { | ||
1319 | t2 = load_reg(s, a->ra); | ||
1320 | tcg_gen_add_i32(t1, t1, t2); | ||
1321 | - tcg_temp_free_i32(t2); | ||
1322 | } | ||
1323 | store_reg(s, a->rd, t1); | ||
1324 | return true; | ||
1325 | @@ -XXX,XX +XXX,XX @@ static bool trans_BFCI(DisasContext *s, arg_BFCI *a) | ||
1326 | if (width != 32) { | ||
1327 | TCGv_i32 tmp2 = load_reg(s, a->rd); | ||
1328 | tcg_gen_deposit_i32(tmp, tmp2, tmp, lsb, width); | ||
1329 | - tcg_temp_free_i32(tmp2); | ||
1330 | } | ||
1331 | store_reg(s, a->rd, tmp); | ||
1332 | return true; | ||
1333 | @@ -XXX,XX +XXX,XX @@ static bool op_par_addsub(DisasContext *s, arg_rrr *a, | ||
1334 | |||
1335 | gen(t0, t0, t1); | ||
1336 | |||
1337 | - tcg_temp_free_i32(t1); | ||
1338 | store_reg(s, a->rd, t0); | ||
1339 | return true; | ||
1340 | } | ||
1341 | @@ -XXX,XX +XXX,XX @@ static bool op_par_addsub_ge(DisasContext *s, arg_rrr *a, | ||
1342 | tcg_gen_addi_ptr(ge, cpu_env, offsetof(CPUARMState, GE)); | ||
1343 | gen(t0, t0, t1, ge); | ||
1344 | |||
1345 | - tcg_temp_free_ptr(ge); | ||
1346 | - tcg_temp_free_i32(t1); | ||
1347 | store_reg(s, a->rd, t0); | ||
1348 | return true; | ||
1349 | } | ||
1350 | @@ -XXX,XX +XXX,XX @@ static bool trans_PKH(DisasContext *s, arg_PKH *a) | ||
1351 | tcg_gen_shli_i32(tm, tm, shift); | ||
1352 | tcg_gen_deposit_i32(tn, tm, tn, 0, 16); | ||
1353 | } | ||
1354 | - tcg_temp_free_i32(tm); | ||
1355 | store_reg(s, a->rd, tn); | ||
1356 | return true; | ||
1357 | } | ||
1358 | @@ -XXX,XX +XXX,XX @@ static bool op_xta(DisasContext *s, arg_rrr_rot *a, | ||
1359 | if (a->rn != 15) { | ||
1360 | TCGv_i32 tmp2 = load_reg(s, a->rn); | ||
1361 | gen_add(tmp, tmp, tmp2); | ||
1362 | - tcg_temp_free_i32(tmp2); | ||
1363 | } | ||
1364 | store_reg(s, a->rd, tmp); | ||
1365 | return true; | ||
1366 | @@ -XXX,XX +XXX,XX @@ static bool trans_SEL(DisasContext *s, arg_rrr *a) | ||
1367 | t3 = tcg_temp_new_i32(); | ||
1368 | tcg_gen_ld_i32(t3, cpu_env, offsetof(CPUARMState, GE)); | ||
1369 | gen_helper_sel_flags(t1, t3, t1, t2); | ||
1370 | - tcg_temp_free_i32(t3); | ||
1371 | - tcg_temp_free_i32(t2); | ||
1372 | store_reg(s, a->rd, t1); | ||
1373 | return true; | ||
1374 | } | ||
1375 | @@ -XXX,XX +XXX,XX @@ static bool op_smlad(DisasContext *s, arg_rrrr *a, bool m_swap, bool sub) | ||
1376 | * addition of Ra. | ||
1377 | */ | ||
1378 | tcg_gen_sub_i32(t1, t1, t2); | ||
1379 | - tcg_temp_free_i32(t2); | ||
1380 | |||
1381 | if (a->ra != 15) { | ||
1382 | t2 = load_reg(s, a->ra); | ||
1383 | gen_helper_add_setq(t1, cpu_env, t1, t2); | ||
1384 | - tcg_temp_free_i32(t2); | ||
1385 | } | ||
1386 | } else if (a->ra == 15) { | ||
1387 | /* Single saturation-checking addition */ | ||
1388 | gen_helper_add_setq(t1, cpu_env, t1, t2); | ||
1389 | - tcg_temp_free_i32(t2); | ||
1390 | } else { | ||
1391 | /* | ||
1392 | * We need to add the products and Ra together and then | ||
1393 | @@ -XXX,XX +XXX,XX @@ static bool op_smlad(DisasContext *s, arg_rrrr *a, bool m_swap, bool sub) | ||
1394 | load_reg_var(s, t2, a->ra); | ||
1395 | tcg_gen_ext_i32_i64(q64, t2); | ||
1396 | tcg_gen_add_i64(p64, p64, q64); | ||
1397 | - tcg_temp_free_i64(q64); | ||
1398 | |||
1399 | tcg_gen_extr_i64_i32(t1, t2, p64); | ||
1400 | - tcg_temp_free_i64(p64); | ||
1401 | /* | ||
1402 | * t1 is the low half of the result which goes into Rd. | ||
1403 | * We have overflow and must set Q if the high half (t2) | ||
1404 | @@ -XXX,XX +XXX,XX @@ static bool op_smlad(DisasContext *s, arg_rrrr *a, bool m_swap, bool sub) | ||
1405 | one = tcg_constant_i32(1); | ||
1406 | tcg_gen_movcond_i32(TCG_COND_NE, qf, t2, t3, one, qf); | ||
1407 | store_cpu_field(qf, QF); | ||
1408 | - tcg_temp_free_i32(t3); | ||
1409 | - tcg_temp_free_i32(t2); | ||
1410 | } | ||
1411 | store_reg(s, a->rd, t1); | ||
1412 | return true; | ||
1413 | @@ -XXX,XX +XXX,XX @@ static bool op_smlald(DisasContext *s, arg_rrrr *a, bool m_swap, bool sub) | ||
1414 | l2 = tcg_temp_new_i64(); | ||
1415 | tcg_gen_ext_i32_i64(l1, t1); | ||
1416 | tcg_gen_ext_i32_i64(l2, t2); | ||
1417 | - tcg_temp_free_i32(t1); | ||
1418 | - tcg_temp_free_i32(t2); | ||
1419 | |||
1420 | if (sub) { | ||
1421 | tcg_gen_sub_i64(l1, l1, l2); | ||
1422 | } else { | ||
1423 | tcg_gen_add_i64(l1, l1, l2); | ||
1424 | } | ||
1425 | - tcg_temp_free_i64(l2); | ||
1426 | |||
1427 | gen_addq(s, l1, a->ra, a->rd); | ||
1428 | gen_storeq_reg(s, a->ra, a->rd, l1); | ||
1429 | - tcg_temp_free_i64(l1); | ||
1430 | return true; | ||
1431 | } | ||
1432 | |||
1433 | @@ -XXX,XX +XXX,XX @@ static bool op_smmla(DisasContext *s, arg_rrrr *a, bool round, bool sub) | ||
1434 | } else { | ||
1435 | tcg_gen_add_i32(t1, t1, t3); | ||
1436 | } | ||
1437 | - tcg_temp_free_i32(t3); | ||
1438 | } | ||
1439 | if (round) { | ||
1440 | /* | ||
1441 | @@ -XXX,XX +XXX,XX @@ static bool op_smmla(DisasContext *s, arg_rrrr *a, bool round, bool sub) | ||
1442 | tcg_gen_shri_i32(t2, t2, 31); | ||
1443 | tcg_gen_add_i32(t1, t1, t2); | ||
1444 | } | ||
1445 | - tcg_temp_free_i32(t2); | ||
1446 | store_reg(s, a->rd, t1); | ||
1447 | return true; | ||
1448 | } | ||
1449 | @@ -XXX,XX +XXX,XX @@ static bool op_div(DisasContext *s, arg_rrr *a, bool u) | ||
1450 | } else { | ||
1451 | gen_helper_sdiv(t1, cpu_env, t1, t2); | ||
1452 | } | ||
1453 | - tcg_temp_free_i32(t2); | ||
1454 | store_reg(s, a->rd, t1); | ||
1455 | return true; | ||
1456 | } | ||
1457 | @@ -XXX,XX +XXX,XX @@ static void op_addr_block_post(DisasContext *s, arg_ldst_block *a, | ||
1458 | tcg_gen_addi_i32(addr, addr, -((n - 1) * 4)); | ||
1459 | } | ||
1460 | store_reg(s, a->rn, addr); | ||
1461 | - } else { | ||
1462 | - tcg_temp_free_i32(addr); | ||
1463 | } | ||
1464 | } | ||
1465 | |||
1466 | @@ -XXX,XX +XXX,XX @@ static bool op_stm(DisasContext *s, arg_ldst_block *a, int min_n) | ||
1467 | tmp = load_reg(s, i); | ||
1468 | } | ||
1469 | gen_aa32_st_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN); | ||
1470 | - tcg_temp_free_i32(tmp); | ||
1471 | |||
1472 | /* No need to add after the last transfer. */ | ||
1473 | if (++j != n) { | ||
1474 | @@ -XXX,XX +XXX,XX @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n) | ||
1475 | gen_aa32_ld_i32(s, tmp, addr, mem_idx, MO_UL | MO_ALIGN); | ||
1476 | if (user) { | ||
1477 | gen_helper_set_user_reg(cpu_env, tcg_constant_i32(i), tmp); | ||
1478 | - tcg_temp_free_i32(tmp); | ||
1479 | } else if (i == a->rn) { | ||
1480 | loaded_var = tmp; | ||
1481 | loaded_base = true; | ||
1482 | @@ -XXX,XX +XXX,XX @@ static bool do_ldm(DisasContext *s, arg_ldst_block *a, int min_n) | ||
1483 | gen_io_start(); | ||
1484 | } | ||
1485 | gen_helper_cpsr_write_eret(cpu_env, tmp); | ||
1486 | - tcg_temp_free_i32(tmp); | ||
1487 | /* Must exit loop to check un-masked IRQs */ | ||
1488 | s->base.is_jmp = DISAS_EXIT; | ||
1489 | } | ||
1490 | @@ -XXX,XX +XXX,XX @@ static bool trans_LE(DisasContext *s, arg_LE *a) | ||
1491 | DisasLabel skipexc = gen_disas_label(s); | ||
1492 | tmp = load_cpu_field(v7m.ltpsize); | ||
1493 | tcg_gen_brcondi_i32(TCG_COND_EQ, tmp, 4, skipexc.label); | ||
1494 | - tcg_temp_free_i32(tmp); | ||
1495 | gen_exception_insn(s, 0, EXCP_INVSTATE, syn_uncategorized()); | ||
1496 | set_disas_label(s, skipexc); | ||
1497 | } | ||
1498 | @@ -XXX,XX +XXX,XX @@ static bool trans_LE(DisasContext *s, arg_LE *a) | ||
1499 | TCGv_i32 ltpsize = load_cpu_field(v7m.ltpsize); | ||
1500 | tcg_gen_sub_i32(decr, tcg_constant_i32(4), ltpsize); | ||
1501 | tcg_gen_shl_i32(decr, tcg_constant_i32(1), decr); | ||
1502 | - tcg_temp_free_i32(ltpsize); | ||
1503 | |||
1504 | tcg_gen_brcond_i32(TCG_COND_LEU, cpu_R[14], decr, loopend.label); | ||
1505 | |||
1506 | tcg_gen_sub_i32(cpu_R[14], cpu_R[14], decr); | ||
1507 | - tcg_temp_free_i32(decr); | ||
1508 | } | ||
1509 | /* Jump back to the loop start */ | ||
1510 | gen_jmp(s, jmp_diff(s, -a->imm)); | ||
1511 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCTP(DisasContext *s, arg_VCTP *a) | ||
1512 | masklen, tcg_constant_i32(1 << (4 - a->size)), | ||
1513 | rn_shifted, tcg_constant_i32(16)); | ||
1514 | gen_helper_mve_vctp(cpu_env, masklen); | ||
1515 | - tcg_temp_free_i32(masklen); | ||
1516 | - tcg_temp_free_i32(rn_shifted); | ||
1517 | /* This insn updates predication bits */ | ||
1518 | s->base.is_jmp = DISAS_UPDATE_NOCHAIN; | ||
1519 | mve_update_eci(s); | ||
1520 | @@ -XXX,XX +XXX,XX @@ static bool op_tbranch(DisasContext *s, arg_tbranch *a, bool half) | ||
1521 | tcg_gen_add_i32(tmp, tmp, tmp); | ||
1522 | gen_pc_plus_diff(s, addr, jmp_diff(s, 0)); | ||
1523 | tcg_gen_add_i32(tmp, tmp, addr); | ||
1524 | - tcg_temp_free_i32(addr); | ||
1525 | store_reg(s, 15, tmp); | ||
1526 | return true; | ||
1527 | } | ||
1528 | @@ -XXX,XX +XXX,XX @@ static bool trans_CBZ(DisasContext *s, arg_CBZ *a) | ||
1529 | arm_gen_condlabel(s); | ||
1530 | tcg_gen_brcondi_i32(a->nz ? TCG_COND_EQ : TCG_COND_NE, | ||
1531 | tmp, 0, s->condlabel.label); | ||
1532 | - tcg_temp_free_i32(tmp); | ||
1533 | gen_jmp(s, jmp_diff(s, a->imm)); | ||
1534 | return true; | ||
1535 | } | ||
1536 | @@ -XXX,XX +XXX,XX @@ static bool trans_RFE(DisasContext *s, arg_RFE *a) | ||
1537 | /* Base writeback. */ | ||
1538 | tcg_gen_addi_i32(addr, addr, post_offset[a->pu]); | ||
1539 | store_reg(s, a->rn, addr); | ||
1540 | - } else { | ||
1541 | - tcg_temp_free_i32(addr); | ||
1542 | } | ||
1543 | gen_rfe(s, t1, t2); | ||
1544 | return true; | ||
1545 | @@ -XXX,XX +XXX,XX @@ static bool trans_CSEL(DisasContext *s, arg_CSEL *a) | ||
1546 | tcg_gen_movcond_i32(c.cond, rn, c.value, zero, rn, rm); | ||
1547 | |||
1548 | store_reg(s, a->rd, rn); | ||
1549 | - tcg_temp_free_i32(rm); | ||
1550 | - | ||
1551 | return true; | ||
1552 | } | ||
1553 | |||
1554 | -- | ||
1555 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries, | ||
2 | therefore there's no need to record temps for later freeing. | ||
3 | 1 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
6 | --- | ||
7 | target/arm/tcg/translate.h | 3 --- | ||
8 | target/arm/tcg/translate-a64.c | 25 +------------------------ | ||
9 | 2 files changed, 1 insertion(+), 27 deletions(-) | ||
10 | |||
11 | diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h | ||
12 | index XXXXXXX..XXXXXXX 100644 | ||
13 | --- a/target/arm/tcg/translate.h | ||
14 | +++ b/target/arm/tcg/translate.h | ||
15 | @@ -XXX,XX +XXX,XX @@ typedef struct DisasContext { | ||
16 | int c15_cpar; | ||
17 | /* TCG op of the current insn_start. */ | ||
18 | TCGOp *insn_start; | ||
19 | -#define TMP_A64_MAX 16 | ||
20 | - int tmp_a64_count; | ||
21 | - TCGv_i64 tmp_a64[TMP_A64_MAX]; | ||
22 | } DisasContext; | ||
23 | |||
24 | typedef struct DisasCompare { | ||
25 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | ||
26 | index XXXXXXX..XXXXXXX 100644 | ||
27 | --- a/target/arm/tcg/translate-a64.c | ||
28 | +++ b/target/arm/tcg/translate-a64.c | ||
29 | @@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *s, int n, int64_t diff) | ||
30 | } | ||
31 | } | ||
32 | |||
33 | -static void init_tmp_a64_array(DisasContext *s) | ||
34 | -{ | ||
35 | -#ifdef CONFIG_DEBUG_TCG | ||
36 | - memset(s->tmp_a64, 0, sizeof(s->tmp_a64)); | ||
37 | -#endif | ||
38 | - s->tmp_a64_count = 0; | ||
39 | -} | ||
40 | - | ||
41 | -static void free_tmp_a64(DisasContext *s) | ||
42 | -{ | ||
43 | - int i; | ||
44 | - for (i = 0; i < s->tmp_a64_count; i++) { | ||
45 | - tcg_temp_free_i64(s->tmp_a64[i]); | ||
46 | - } | ||
47 | - init_tmp_a64_array(s); | ||
48 | -} | ||
49 | - | ||
50 | TCGv_i64 new_tmp_a64(DisasContext *s) | ||
51 | { | ||
52 | - assert(s->tmp_a64_count < TMP_A64_MAX); | ||
53 | - return s->tmp_a64[s->tmp_a64_count++] = tcg_temp_new_i64(); | ||
54 | + return tcg_temp_new_i64(); | ||
55 | } | ||
56 | |||
57 | TCGv_i64 new_tmp_a64_zero(DisasContext *s) | ||
58 | @@ -XXX,XX +XXX,XX @@ static void aarch64_tr_init_disas_context(DisasContextBase *dcbase, | ||
59 | bound = 1; | ||
60 | } | ||
61 | dc->base.max_insns = MIN(dc->base.max_insns, bound); | ||
62 | - | ||
63 | - init_tmp_a64_array(dc); | ||
64 | } | ||
65 | |||
66 | static void aarch64_tr_tb_start(DisasContextBase *db, CPUState *cpu) | ||
67 | @@ -XXX,XX +XXX,XX @@ static void aarch64_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) | ||
68 | break; | ||
69 | } | ||
70 | |||
71 | - /* if we allocated any temporaries, free them here */ | ||
72 | - free_tmp_a64(s); | ||
73 | - | ||
74 | /* | ||
75 | * After execution of most insns, btype is reset to 0. | ||
76 | * Note that we set btype == -1 when the insn sets btype. | ||
77 | -- | ||
78 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | This is now a simple wrapper for tcg_temp_new_i64. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/arm/tcg/translate-a64.h | 1 - | ||
7 | target/arm/tcg/translate-a64.c | 45 +++++++++++++++------------------- | ||
8 | target/arm/tcg/translate-sve.c | 20 +++++++-------- | ||
9 | 3 files changed, 30 insertions(+), 36 deletions(-) | ||
10 | |||
11 | diff --git a/target/arm/tcg/translate-a64.h b/target/arm/tcg/translate-a64.h | ||
12 | index XXXXXXX..XXXXXXX 100644 | ||
13 | --- a/target/arm/tcg/translate-a64.h | ||
14 | +++ b/target/arm/tcg/translate-a64.h | ||
15 | @@ -XXX,XX +XXX,XX @@ | ||
16 | #ifndef TARGET_ARM_TRANSLATE_A64_H | ||
17 | #define TARGET_ARM_TRANSLATE_A64_H | ||
18 | |||
19 | -TCGv_i64 new_tmp_a64(DisasContext *s); | ||
20 | TCGv_i64 new_tmp_a64_zero(DisasContext *s); | ||
21 | TCGv_i64 cpu_reg(DisasContext *s, int reg); | ||
22 | TCGv_i64 cpu_reg_sp(DisasContext *s, int reg); | ||
23 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | ||
24 | index XXXXXXX..XXXXXXX 100644 | ||
25 | --- a/target/arm/tcg/translate-a64.c | ||
26 | +++ b/target/arm/tcg/translate-a64.c | ||
27 | @@ -XXX,XX +XXX,XX @@ static void gen_a64_set_pc(DisasContext *s, TCGv_i64 src) | ||
28 | |||
29 | TCGv_i64 clean_data_tbi(DisasContext *s, TCGv_i64 addr) | ||
30 | { | ||
31 | - TCGv_i64 clean = new_tmp_a64(s); | ||
32 | + TCGv_i64 clean = tcg_temp_new_i64(); | ||
33 | #ifdef CONFIG_USER_ONLY | ||
34 | gen_top_byte_ignore(s, clean, addr, s->tbid); | ||
35 | #else | ||
36 | @@ -XXX,XX +XXX,XX @@ static TCGv_i64 gen_mte_check1_mmuidx(DisasContext *s, TCGv_i64 addr, | ||
37 | desc = FIELD_DP32(desc, MTEDESC, WRITE, is_write); | ||
38 | desc = FIELD_DP32(desc, MTEDESC, SIZEM1, (1 << log2_size) - 1); | ||
39 | |||
40 | - ret = new_tmp_a64(s); | ||
41 | + ret = tcg_temp_new_i64(); | ||
42 | gen_helper_mte_check(ret, cpu_env, tcg_constant_i32(desc), addr); | ||
43 | |||
44 | return ret; | ||
45 | @@ -XXX,XX +XXX,XX @@ TCGv_i64 gen_mte_checkN(DisasContext *s, TCGv_i64 addr, bool is_write, | ||
46 | desc = FIELD_DP32(desc, MTEDESC, WRITE, is_write); | ||
47 | desc = FIELD_DP32(desc, MTEDESC, SIZEM1, size - 1); | ||
48 | |||
49 | - ret = new_tmp_a64(s); | ||
50 | + ret = tcg_temp_new_i64(); | ||
51 | gen_helper_mte_check(ret, cpu_env, tcg_constant_i32(desc), addr); | ||
52 | |||
53 | return ret; | ||
54 | @@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *s, int n, int64_t diff) | ||
55 | } | ||
56 | } | ||
57 | |||
58 | -TCGv_i64 new_tmp_a64(DisasContext *s) | ||
59 | -{ | ||
60 | - return tcg_temp_new_i64(); | ||
61 | -} | ||
62 | - | ||
63 | TCGv_i64 new_tmp_a64_zero(DisasContext *s) | ||
64 | { | ||
65 | - TCGv_i64 t = new_tmp_a64(s); | ||
66 | + TCGv_i64 t = tcg_temp_new_i64(); | ||
67 | tcg_gen_movi_i64(t, 0); | ||
68 | return t; | ||
69 | } | ||
70 | @@ -XXX,XX +XXX,XX @@ TCGv_i64 cpu_reg_sp(DisasContext *s, int reg) | ||
71 | */ | ||
72 | TCGv_i64 read_cpu_reg(DisasContext *s, int reg, int sf) | ||
73 | { | ||
74 | - TCGv_i64 v = new_tmp_a64(s); | ||
75 | + TCGv_i64 v = tcg_temp_new_i64(); | ||
76 | if (reg != 31) { | ||
77 | if (sf) { | ||
78 | tcg_gen_mov_i64(v, cpu_X[reg]); | ||
79 | @@ -XXX,XX +XXX,XX @@ TCGv_i64 read_cpu_reg(DisasContext *s, int reg, int sf) | ||
80 | |||
81 | TCGv_i64 read_cpu_reg_sp(DisasContext *s, int reg, int sf) | ||
82 | { | ||
83 | - TCGv_i64 v = new_tmp_a64(s); | ||
84 | + TCGv_i64 v = tcg_temp_new_i64(); | ||
85 | if (sf) { | ||
86 | tcg_gen_mov_i64(v, cpu_X[reg]); | ||
87 | } else { | ||
88 | @@ -XXX,XX +XXX,XX @@ static void handle_sys(DisasContext *s, uint32_t insn, bool isread, | ||
89 | desc = FIELD_DP32(desc, MTEDESC, TBI, s->tbid); | ||
90 | desc = FIELD_DP32(desc, MTEDESC, TCMA, s->tcma); | ||
91 | |||
92 | - tcg_rt = new_tmp_a64(s); | ||
93 | + tcg_rt = tcg_temp_new_i64(); | ||
94 | gen_helper_mte_check_zva(tcg_rt, cpu_env, | ||
95 | tcg_constant_i32(desc), cpu_reg(s, rt)); | ||
96 | } else { | ||
97 | @@ -XXX,XX +XXX,XX @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) | ||
98 | modifier = new_tmp_a64_zero(s); | ||
99 | } | ||
100 | if (s->pauth_active) { | ||
101 | - dst = new_tmp_a64(s); | ||
102 | + dst = tcg_temp_new_i64(); | ||
103 | if (op3 == 2) { | ||
104 | gen_helper_autia(dst, cpu_env, cpu_reg(s, rn), modifier); | ||
105 | } else { | ||
106 | @@ -XXX,XX +XXX,XX @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) | ||
107 | if (opc == 1) { | ||
108 | TCGv_i64 lr = cpu_reg(s, 30); | ||
109 | if (dst == lr) { | ||
110 | - TCGv_i64 tmp = new_tmp_a64(s); | ||
111 | + TCGv_i64 tmp = tcg_temp_new_i64(); | ||
112 | tcg_gen_mov_i64(tmp, dst); | ||
113 | dst = tmp; | ||
114 | } | ||
115 | @@ -XXX,XX +XXX,XX @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) | ||
116 | } | ||
117 | btype_mod = opc & 1; | ||
118 | if (s->pauth_active) { | ||
119 | - dst = new_tmp_a64(s); | ||
120 | + dst = tcg_temp_new_i64(); | ||
121 | modifier = cpu_reg_sp(s, op4); | ||
122 | if (op3 == 2) { | ||
123 | gen_helper_autia(dst, cpu_env, cpu_reg(s, rn), modifier); | ||
124 | @@ -XXX,XX +XXX,XX @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) | ||
125 | if (opc == 9) { | ||
126 | TCGv_i64 lr = cpu_reg(s, 30); | ||
127 | if (dst == lr) { | ||
128 | - TCGv_i64 tmp = new_tmp_a64(s); | ||
129 | + TCGv_i64 tmp = tcg_temp_new_i64(); | ||
130 | tcg_gen_mov_i64(tmp, dst); | ||
131 | dst = tmp; | ||
132 | } | ||
133 | @@ -XXX,XX +XXX,XX @@ static void disas_ld_lit(DisasContext *s, uint32_t insn) | ||
134 | |||
135 | tcg_rt = cpu_reg(s, rt); | ||
136 | |||
137 | - clean_addr = new_tmp_a64(s); | ||
138 | + clean_addr = tcg_temp_new_i64(); | ||
139 | gen_pc_plus_diff(s, clean_addr, imm); | ||
140 | if (is_vector) { | ||
141 | do_fp_ld(s, rt, clean_addr, size); | ||
142 | @@ -XXX,XX +XXX,XX @@ static void disas_adc_sbc(DisasContext *s, uint32_t insn) | ||
143 | tcg_rn = cpu_reg(s, rn); | ||
144 | |||
145 | if (op) { | ||
146 | - tcg_y = new_tmp_a64(s); | ||
147 | + tcg_y = tcg_temp_new_i64(); | ||
148 | tcg_gen_not_i64(tcg_y, cpu_reg(s, rm)); | ||
149 | } else { | ||
150 | tcg_y = cpu_reg(s, rm); | ||
151 | @@ -XXX,XX +XXX,XX @@ static void disas_cc(DisasContext *s, uint32_t insn) | ||
152 | |||
153 | /* Load the arguments for the new comparison. */ | ||
154 | if (is_imm) { | ||
155 | - tcg_y = new_tmp_a64(s); | ||
156 | + tcg_y = tcg_temp_new_i64(); | ||
157 | tcg_gen_movi_i64(tcg_y, y); | ||
158 | } else { | ||
159 | tcg_y = cpu_reg(s, y); | ||
160 | @@ -XXX,XX +XXX,XX @@ static void handle_div(DisasContext *s, bool is_signed, unsigned int sf, | ||
161 | tcg_rd = cpu_reg(s, rd); | ||
162 | |||
163 | if (!sf && is_signed) { | ||
164 | - tcg_n = new_tmp_a64(s); | ||
165 | - tcg_m = new_tmp_a64(s); | ||
166 | + tcg_n = tcg_temp_new_i64(); | ||
167 | + tcg_m = tcg_temp_new_i64(); | ||
168 | tcg_gen_ext32s_i64(tcg_n, cpu_reg(s, rn)); | ||
169 | tcg_gen_ext32s_i64(tcg_m, cpu_reg(s, rm)); | ||
170 | } else { | ||
171 | @@ -XXX,XX +XXX,XX @@ static void handle_crc32(DisasContext *s, | ||
172 | default: | ||
173 | g_assert_not_reached(); | ||
174 | } | ||
175 | - tcg_val = new_tmp_a64(s); | ||
176 | + tcg_val = tcg_temp_new_i64(); | ||
177 | tcg_gen_andi_i64(tcg_val, cpu_reg(s, rm), mask); | ||
178 | } | ||
179 | |||
180 | @@ -XXX,XX +XXX,XX @@ static void handle_fpfpcvt(DisasContext *s, int rd, int rn, int opcode, | ||
181 | if (itof) { | ||
182 | TCGv_i64 tcg_int = cpu_reg(s, rn); | ||
183 | if (!sf) { | ||
184 | - TCGv_i64 tcg_extend = new_tmp_a64(s); | ||
185 | + TCGv_i64 tcg_extend = tcg_temp_new_i64(); | ||
186 | |||
187 | if (is_signed) { | ||
188 | tcg_gen_ext32s_i64(tcg_extend, tcg_int); | ||
189 | @@ -XXX,XX +XXX,XX @@ static void handle_vec_simd_wshli(DisasContext *s, bool is_q, bool is_u, | ||
190 | int dsize = 64; | ||
191 | int esize = 8 << size; | ||
192 | int elements = dsize/esize; | ||
193 | - TCGv_i64 tcg_rn = new_tmp_a64(s); | ||
194 | - TCGv_i64 tcg_rd = new_tmp_a64(s); | ||
195 | + TCGv_i64 tcg_rn = tcg_temp_new_i64(); | ||
196 | + TCGv_i64 tcg_rd = tcg_temp_new_i64(); | ||
197 | int i; | ||
198 | |||
199 | if (size >= 3) { | ||
200 | diff --git a/target/arm/tcg/translate-sve.c b/target/arm/tcg/translate-sve.c | ||
201 | index XXXXXXX..XXXXXXX 100644 | ||
202 | --- a/target/arm/tcg/translate-sve.c | ||
203 | +++ b/target/arm/tcg/translate-sve.c | ||
204 | @@ -XXX,XX +XXX,XX @@ static bool trans_LD_zprr(DisasContext *s, arg_rprr_load *a) | ||
205 | return false; | ||
206 | } | ||
207 | if (sve_access_check(s)) { | ||
208 | - TCGv_i64 addr = new_tmp_a64(s); | ||
209 | + TCGv_i64 addr = tcg_temp_new_i64(); | ||
210 | tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), dtype_msz(a->dtype)); | ||
211 | tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn)); | ||
212 | do_ld_zpa(s, a->rd, a->pg, addr, a->dtype, a->nreg); | ||
213 | @@ -XXX,XX +XXX,XX @@ static bool trans_LD_zpri(DisasContext *s, arg_rpri_load *a) | ||
214 | if (sve_access_check(s)) { | ||
215 | int vsz = vec_full_reg_size(s); | ||
216 | int elements = vsz >> dtype_esz[a->dtype]; | ||
217 | - TCGv_i64 addr = new_tmp_a64(s); | ||
218 | + TCGv_i64 addr = tcg_temp_new_i64(); | ||
219 | |||
220 | tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn), | ||
221 | (a->imm * elements * (a->nreg + 1)) | ||
222 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDFF1_zprr(DisasContext *s, arg_rprr_load *a) | ||
223 | } | ||
224 | s->is_nonstreaming = true; | ||
225 | if (sve_access_check(s)) { | ||
226 | - TCGv_i64 addr = new_tmp_a64(s); | ||
227 | + TCGv_i64 addr = tcg_temp_new_i64(); | ||
228 | tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), dtype_msz(a->dtype)); | ||
229 | tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn)); | ||
230 | do_mem_zpa(s, a->rd, a->pg, addr, a->dtype, 1, false, | ||
231 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDNF1_zpri(DisasContext *s, arg_rpri_load *a) | ||
232 | int vsz = vec_full_reg_size(s); | ||
233 | int elements = vsz >> dtype_esz[a->dtype]; | ||
234 | int off = (a->imm * elements) << dtype_msz(a->dtype); | ||
235 | - TCGv_i64 addr = new_tmp_a64(s); | ||
236 | + TCGv_i64 addr = tcg_temp_new_i64(); | ||
237 | |||
238 | tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn), off); | ||
239 | do_mem_zpa(s, a->rd, a->pg, addr, a->dtype, 1, false, | ||
240 | @@ -XXX,XX +XXX,XX @@ static bool trans_LD1RQ_zprr(DisasContext *s, arg_rprr_load *a) | ||
241 | } | ||
242 | if (sve_access_check(s)) { | ||
243 | int msz = dtype_msz(a->dtype); | ||
244 | - TCGv_i64 addr = new_tmp_a64(s); | ||
245 | + TCGv_i64 addr = tcg_temp_new_i64(); | ||
246 | tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), msz); | ||
247 | tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn)); | ||
248 | do_ldrq(s, a->rd, a->pg, addr, a->dtype); | ||
249 | @@ -XXX,XX +XXX,XX @@ static bool trans_LD1RQ_zpri(DisasContext *s, arg_rpri_load *a) | ||
250 | return false; | ||
251 | } | ||
252 | if (sve_access_check(s)) { | ||
253 | - TCGv_i64 addr = new_tmp_a64(s); | ||
254 | + TCGv_i64 addr = tcg_temp_new_i64(); | ||
255 | tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn), a->imm * 16); | ||
256 | do_ldrq(s, a->rd, a->pg, addr, a->dtype); | ||
257 | } | ||
258 | @@ -XXX,XX +XXX,XX @@ static bool trans_LD1RO_zprr(DisasContext *s, arg_rprr_load *a) | ||
259 | } | ||
260 | s->is_nonstreaming = true; | ||
261 | if (sve_access_check(s)) { | ||
262 | - TCGv_i64 addr = new_tmp_a64(s); | ||
263 | + TCGv_i64 addr = tcg_temp_new_i64(); | ||
264 | tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), dtype_msz(a->dtype)); | ||
265 | tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn)); | ||
266 | do_ldro(s, a->rd, a->pg, addr, a->dtype); | ||
267 | @@ -XXX,XX +XXX,XX @@ static bool trans_LD1RO_zpri(DisasContext *s, arg_rpri_load *a) | ||
268 | } | ||
269 | s->is_nonstreaming = true; | ||
270 | if (sve_access_check(s)) { | ||
271 | - TCGv_i64 addr = new_tmp_a64(s); | ||
272 | + TCGv_i64 addr = tcg_temp_new_i64(); | ||
273 | tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn), a->imm * 32); | ||
274 | do_ldro(s, a->rd, a->pg, addr, a->dtype); | ||
275 | } | ||
276 | @@ -XXX,XX +XXX,XX @@ static bool trans_ST_zprr(DisasContext *s, arg_rprr_store *a) | ||
277 | return false; | ||
278 | } | ||
279 | if (sve_access_check(s)) { | ||
280 | - TCGv_i64 addr = new_tmp_a64(s); | ||
281 | + TCGv_i64 addr = tcg_temp_new_i64(); | ||
282 | tcg_gen_shli_i64(addr, cpu_reg(s, a->rm), a->msz); | ||
283 | tcg_gen_add_i64(addr, addr, cpu_reg_sp(s, a->rn)); | ||
284 | do_st_zpa(s, a->rd, a->pg, addr, a->msz, a->esz, a->nreg); | ||
285 | @@ -XXX,XX +XXX,XX @@ static bool trans_ST_zpri(DisasContext *s, arg_rpri_store *a) | ||
286 | if (sve_access_check(s)) { | ||
287 | int vsz = vec_full_reg_size(s); | ||
288 | int elements = vsz >> a->esz; | ||
289 | - TCGv_i64 addr = new_tmp_a64(s); | ||
290 | + TCGv_i64 addr = tcg_temp_new_i64(); | ||
291 | |||
292 | tcg_gen_addi_i64(addr, cpu_reg_sp(s, a->rn), | ||
293 | (a->imm * elements * (a->nreg + 1)) << a->msz); | ||
294 | -- | ||
295 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Only the use within cpu_reg requires a writable temp, | ||
2 | so inline new_tmp_a64_zero there. All other uses are | ||
3 | fine with a constant temp, so use tcg_constant_i64(0). | ||
4 | 1 | ||
5 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
7 | --- | ||
8 | target/arm/tcg/translate-a64.h | 1 - | ||
9 | target/arm/tcg/translate-a64.c | 41 +++++++++++++++------------------- | ||
10 | 2 files changed, 18 insertions(+), 24 deletions(-) | ||
11 | |||
12 | diff --git a/target/arm/tcg/translate-a64.h b/target/arm/tcg/translate-a64.h | ||
13 | index XXXXXXX..XXXXXXX 100644 | ||
14 | --- a/target/arm/tcg/translate-a64.h | ||
15 | +++ b/target/arm/tcg/translate-a64.h | ||
16 | @@ -XXX,XX +XXX,XX @@ | ||
17 | #ifndef TARGET_ARM_TRANSLATE_A64_H | ||
18 | #define TARGET_ARM_TRANSLATE_A64_H | ||
19 | |||
20 | -TCGv_i64 new_tmp_a64_zero(DisasContext *s); | ||
21 | TCGv_i64 cpu_reg(DisasContext *s, int reg); | ||
22 | TCGv_i64 cpu_reg_sp(DisasContext *s, int reg); | ||
23 | TCGv_i64 read_cpu_reg(DisasContext *s, int reg, int sf); | ||
24 | diff --git a/target/arm/tcg/translate-a64.c b/target/arm/tcg/translate-a64.c | ||
25 | index XXXXXXX..XXXXXXX 100644 | ||
26 | --- a/target/arm/tcg/translate-a64.c | ||
27 | +++ b/target/arm/tcg/translate-a64.c | ||
28 | @@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *s, int n, int64_t diff) | ||
29 | } | ||
30 | } | ||
31 | |||
32 | -TCGv_i64 new_tmp_a64_zero(DisasContext *s) | ||
33 | -{ | ||
34 | - TCGv_i64 t = tcg_temp_new_i64(); | ||
35 | - tcg_gen_movi_i64(t, 0); | ||
36 | - return t; | ||
37 | -} | ||
38 | - | ||
39 | /* | ||
40 | * Register access functions | ||
41 | * | ||
42 | @@ -XXX,XX +XXX,XX @@ TCGv_i64 new_tmp_a64_zero(DisasContext *s) | ||
43 | TCGv_i64 cpu_reg(DisasContext *s, int reg) | ||
44 | { | ||
45 | if (reg == 31) { | ||
46 | - return new_tmp_a64_zero(s); | ||
47 | + TCGv_i64 t = tcg_temp_new_i64(); | ||
48 | + tcg_gen_movi_i64(t, 0); | ||
49 | + return t; | ||
50 | } else { | ||
51 | return cpu_X[reg]; | ||
52 | } | ||
53 | @@ -XXX,XX +XXX,XX @@ static void handle_hint(DisasContext *s, uint32_t insn, | ||
54 | case 0b11000: /* PACIAZ */ | ||
55 | if (s->pauth_active) { | ||
56 | gen_helper_pacia(cpu_X[30], cpu_env, cpu_X[30], | ||
57 | - new_tmp_a64_zero(s)); | ||
58 | + tcg_constant_i64(0)); | ||
59 | } | ||
60 | break; | ||
61 | case 0b11001: /* PACIASP */ | ||
62 | @@ -XXX,XX +XXX,XX @@ static void handle_hint(DisasContext *s, uint32_t insn, | ||
63 | case 0b11010: /* PACIBZ */ | ||
64 | if (s->pauth_active) { | ||
65 | gen_helper_pacib(cpu_X[30], cpu_env, cpu_X[30], | ||
66 | - new_tmp_a64_zero(s)); | ||
67 | + tcg_constant_i64(0)); | ||
68 | } | ||
69 | break; | ||
70 | case 0b11011: /* PACIBSP */ | ||
71 | @@ -XXX,XX +XXX,XX @@ static void handle_hint(DisasContext *s, uint32_t insn, | ||
72 | case 0b11100: /* AUTIAZ */ | ||
73 | if (s->pauth_active) { | ||
74 | gen_helper_autia(cpu_X[30], cpu_env, cpu_X[30], | ||
75 | - new_tmp_a64_zero(s)); | ||
76 | + tcg_constant_i64(0)); | ||
77 | } | ||
78 | break; | ||
79 | case 0b11101: /* AUTIASP */ | ||
80 | @@ -XXX,XX +XXX,XX @@ static void handle_hint(DisasContext *s, uint32_t insn, | ||
81 | case 0b11110: /* AUTIBZ */ | ||
82 | if (s->pauth_active) { | ||
83 | gen_helper_autib(cpu_X[30], cpu_env, cpu_X[30], | ||
84 | - new_tmp_a64_zero(s)); | ||
85 | + tcg_constant_i64(0)); | ||
86 | } | ||
87 | break; | ||
88 | case 0b11111: /* AUTIBSP */ | ||
89 | @@ -XXX,XX +XXX,XX @@ static void disas_uncond_b_reg(DisasContext *s, uint32_t insn) | ||
90 | if (op4 != 0x1f) { | ||
91 | goto do_unallocated; | ||
92 | } | ||
93 | - modifier = new_tmp_a64_zero(s); | ||
94 | + modifier = tcg_constant_i64(0); | ||
95 | } | ||
96 | if (s->pauth_active) { | ||
97 | dst = tcg_temp_new_i64(); | ||
98 | @@ -XXX,XX +XXX,XX @@ static void disas_ldst_pac(DisasContext *s, uint32_t insn, | ||
99 | if (s->pauth_active) { | ||
100 | if (use_key_a) { | ||
101 | gen_helper_autda(dirty_addr, cpu_env, dirty_addr, | ||
102 | - new_tmp_a64_zero(s)); | ||
103 | + tcg_constant_i64(0)); | ||
104 | } else { | ||
105 | gen_helper_autdb(dirty_addr, cpu_env, dirty_addr, | ||
106 | - new_tmp_a64_zero(s)); | ||
107 | + tcg_constant_i64(0)); | ||
108 | } | ||
109 | } | ||
110 | |||
111 | @@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn) | ||
112 | goto do_unallocated; | ||
113 | } else if (s->pauth_active) { | ||
114 | tcg_rd = cpu_reg(s, rd); | ||
115 | - gen_helper_pacia(tcg_rd, cpu_env, tcg_rd, new_tmp_a64_zero(s)); | ||
116 | + gen_helper_pacia(tcg_rd, cpu_env, tcg_rd, tcg_constant_i64(0)); | ||
117 | } | ||
118 | break; | ||
119 | case MAP(1, 0x01, 0x09): /* PACIZB */ | ||
120 | @@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn) | ||
121 | goto do_unallocated; | ||
122 | } else if (s->pauth_active) { | ||
123 | tcg_rd = cpu_reg(s, rd); | ||
124 | - gen_helper_pacib(tcg_rd, cpu_env, tcg_rd, new_tmp_a64_zero(s)); | ||
125 | + gen_helper_pacib(tcg_rd, cpu_env, tcg_rd, tcg_constant_i64(0)); | ||
126 | } | ||
127 | break; | ||
128 | case MAP(1, 0x01, 0x0a): /* PACDZA */ | ||
129 | @@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn) | ||
130 | goto do_unallocated; | ||
131 | } else if (s->pauth_active) { | ||
132 | tcg_rd = cpu_reg(s, rd); | ||
133 | - gen_helper_pacda(tcg_rd, cpu_env, tcg_rd, new_tmp_a64_zero(s)); | ||
134 | + gen_helper_pacda(tcg_rd, cpu_env, tcg_rd, tcg_constant_i64(0)); | ||
135 | } | ||
136 | break; | ||
137 | case MAP(1, 0x01, 0x0b): /* PACDZB */ | ||
138 | @@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn) | ||
139 | goto do_unallocated; | ||
140 | } else if (s->pauth_active) { | ||
141 | tcg_rd = cpu_reg(s, rd); | ||
142 | - gen_helper_pacdb(tcg_rd, cpu_env, tcg_rd, new_tmp_a64_zero(s)); | ||
143 | + gen_helper_pacdb(tcg_rd, cpu_env, tcg_rd, tcg_constant_i64(0)); | ||
144 | } | ||
145 | break; | ||
146 | case MAP(1, 0x01, 0x0c): /* AUTIZA */ | ||
147 | @@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn) | ||
148 | goto do_unallocated; | ||
149 | } else if (s->pauth_active) { | ||
150 | tcg_rd = cpu_reg(s, rd); | ||
151 | - gen_helper_autia(tcg_rd, cpu_env, tcg_rd, new_tmp_a64_zero(s)); | ||
152 | + gen_helper_autia(tcg_rd, cpu_env, tcg_rd, tcg_constant_i64(0)); | ||
153 | } | ||
154 | break; | ||
155 | case MAP(1, 0x01, 0x0d): /* AUTIZB */ | ||
156 | @@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn) | ||
157 | goto do_unallocated; | ||
158 | } else if (s->pauth_active) { | ||
159 | tcg_rd = cpu_reg(s, rd); | ||
160 | - gen_helper_autib(tcg_rd, cpu_env, tcg_rd, new_tmp_a64_zero(s)); | ||
161 | + gen_helper_autib(tcg_rd, cpu_env, tcg_rd, tcg_constant_i64(0)); | ||
162 | } | ||
163 | break; | ||
164 | case MAP(1, 0x01, 0x0e): /* AUTDZA */ | ||
165 | @@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn) | ||
166 | goto do_unallocated; | ||
167 | } else if (s->pauth_active) { | ||
168 | tcg_rd = cpu_reg(s, rd); | ||
169 | - gen_helper_autda(tcg_rd, cpu_env, tcg_rd, new_tmp_a64_zero(s)); | ||
170 | + gen_helper_autda(tcg_rd, cpu_env, tcg_rd, tcg_constant_i64(0)); | ||
171 | } | ||
172 | break; | ||
173 | case MAP(1, 0x01, 0x0f): /* AUTDZB */ | ||
174 | @@ -XXX,XX +XXX,XX @@ static void disas_data_proc_1src(DisasContext *s, uint32_t insn) | ||
175 | goto do_unallocated; | ||
176 | } else if (s->pauth_active) { | ||
177 | tcg_rd = cpu_reg(s, rd); | ||
178 | - gen_helper_autdb(tcg_rd, cpu_env, tcg_rd, new_tmp_a64_zero(s)); | ||
179 | + gen_helper_autdb(tcg_rd, cpu_env, tcg_rd, tcg_constant_i64(0)); | ||
180 | } | ||
181 | break; | ||
182 | case MAP(1, 0x01, 0x10): /* XPACI */ | ||
183 | -- | ||
184 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/arm/tcg/translate-m-nocp.c | 20 -------------------- | ||
7 | 1 file changed, 20 deletions(-) | ||
8 | |||
9 | diff --git a/target/arm/tcg/translate-m-nocp.c b/target/arm/tcg/translate-m-nocp.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/arm/tcg/translate-m-nocp.c | ||
12 | +++ b/target/arm/tcg/translate-m-nocp.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static bool trans_VLLDM_VLSTM(DisasContext *s, arg_VLLDM_VLSTM *a) | ||
14 | } else { | ||
15 | gen_helper_v7m_vlstm(cpu_env, fptr); | ||
16 | } | ||
17 | - tcg_temp_free_i32(fptr); | ||
18 | |||
19 | clear_eci_state(s); | ||
20 | |||
21 | @@ -XXX,XX +XXX,XX @@ static void gen_branch_fpInactive(DisasContext *s, TCGCond cond, | ||
22 | tcg_gen_andi_i32(fpca, fpca, R_V7M_CONTROL_FPCA_MASK); | ||
23 | tcg_gen_or_i32(fpca, fpca, aspen); | ||
24 | tcg_gen_brcondi_i32(tcg_invert_cond(cond), fpca, 0, label); | ||
25 | - tcg_temp_free_i32(aspen); | ||
26 | - tcg_temp_free_i32(fpca); | ||
27 | } | ||
28 | |||
29 | static bool gen_M_fp_sysreg_write(DisasContext *s, int regno, | ||
30 | @@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno, | ||
31 | case ARM_VFP_FPSCR: | ||
32 | tmp = loadfn(s, opaque, true); | ||
33 | gen_helper_vfp_set_fpscr(cpu_env, tmp); | ||
34 | - tcg_temp_free_i32(tmp); | ||
35 | gen_lookup_tb(s); | ||
36 | break; | ||
37 | case ARM_VFP_FPSCR_NZCVQC: | ||
38 | @@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno, | ||
39 | tcg_gen_andi_i32(fpscr, fpscr, ~FPCR_NZCV_MASK); | ||
40 | tcg_gen_or_i32(fpscr, fpscr, tmp); | ||
41 | store_cpu_field(fpscr, vfp.xregs[ARM_VFP_FPSCR]); | ||
42 | - tcg_temp_free_i32(tmp); | ||
43 | break; | ||
44 | } | ||
45 | case ARM_VFP_FPCXT_NS: | ||
46 | @@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno, | ||
47 | tcg_gen_andi_i32(tmp, tmp, ~FPCR_NZCV_MASK); | ||
48 | gen_helper_vfp_set_fpscr(cpu_env, tmp); | ||
49 | s->base.is_jmp = DISAS_UPDATE_NOCHAIN; | ||
50 | - tcg_temp_free_i32(tmp); | ||
51 | - tcg_temp_free_i32(sfpa); | ||
52 | break; | ||
53 | } | ||
54 | case ARM_VFP_VPR: | ||
55 | @@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_write(DisasContext *s, int regno, | ||
56 | R_V7M_VPR_P0_SHIFT, R_V7M_VPR_P0_LENGTH); | ||
57 | store_cpu_field(vpr, v7m.vpr); | ||
58 | s->base.is_jmp = DISAS_UPDATE_NOCHAIN; | ||
59 | - tcg_temp_free_i32(tmp); | ||
60 | break; | ||
61 | } | ||
62 | default: | ||
63 | @@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_read(DisasContext *s, int regno, | ||
64 | tcg_gen_andi_i32(sfpa, control, R_V7M_CONTROL_SFPA_MASK); | ||
65 | tcg_gen_shli_i32(sfpa, sfpa, 31 - R_V7M_CONTROL_SFPA_SHIFT); | ||
66 | tcg_gen_or_i32(tmp, tmp, sfpa); | ||
67 | - tcg_temp_free_i32(sfpa); | ||
68 | /* | ||
69 | * Store result before updating FPSCR etc, in case | ||
70 | * it is a memory write which causes an exception. | ||
71 | @@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_read(DisasContext *s, int regno, | ||
72 | store_cpu_field(control, v7m.control[M_REG_S]); | ||
73 | fpscr = load_cpu_field(v7m.fpdscr[M_REG_NS]); | ||
74 | gen_helper_vfp_set_fpscr(cpu_env, fpscr); | ||
75 | - tcg_temp_free_i32(fpscr); | ||
76 | lookup_tb = true; | ||
77 | break; | ||
78 | } | ||
79 | @@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_read(DisasContext *s, int regno, | ||
80 | tcg_gen_andi_i32(sfpa, control, R_V7M_CONTROL_SFPA_MASK); | ||
81 | tcg_gen_shli_i32(sfpa, sfpa, 31 - R_V7M_CONTROL_SFPA_SHIFT); | ||
82 | tcg_gen_or_i32(tmp, tmp, sfpa); | ||
83 | - tcg_temp_free_i32(control); | ||
84 | /* Store result before updating FPSCR, in case it faults */ | ||
85 | storefn(s, opaque, tmp, true); | ||
86 | /* If SFPA is zero then set FPSCR from FPDSCR_NS */ | ||
87 | @@ -XXX,XX +XXX,XX @@ static bool gen_M_fp_sysreg_read(DisasContext *s, int regno, | ||
88 | tcg_gen_movcond_i32(TCG_COND_EQ, fpscr, sfpa, tcg_constant_i32(0), | ||
89 | fpdscr, fpscr); | ||
90 | gen_helper_vfp_set_fpscr(cpu_env, fpscr); | ||
91 | - tcg_temp_free_i32(sfpa); | ||
92 | - tcg_temp_free_i32(fpdscr); | ||
93 | - tcg_temp_free_i32(fpscr); | ||
94 | break; | ||
95 | } | ||
96 | case ARM_VFP_VPR: | ||
97 | @@ -XXX,XX +XXX,XX @@ static void fp_sysreg_to_gpr(DisasContext *s, void *opaque, TCGv_i32 value, | ||
98 | if (a->rt == 15) { | ||
99 | /* Set the 4 flag bits in the CPSR */ | ||
100 | gen_set_nzcv(value); | ||
101 | - tcg_temp_free_i32(value); | ||
102 | } else { | ||
103 | store_reg(s, a->rt, value); | ||
104 | } | ||
105 | @@ -XXX,XX +XXX,XX @@ static void fp_sysreg_to_memory(DisasContext *s, void *opaque, TCGv_i32 value, | ||
106 | if (do_access) { | ||
107 | gen_aa32_st_i32(s, value, addr, get_mem_index(s), | ||
108 | MO_UL | MO_ALIGN | s->be_data); | ||
109 | - tcg_temp_free_i32(value); | ||
110 | } | ||
111 | |||
112 | if (a->w) { | ||
113 | @@ -XXX,XX +XXX,XX @@ static void fp_sysreg_to_memory(DisasContext *s, void *opaque, TCGv_i32 value, | ||
114 | tcg_gen_addi_i32(addr, addr, offset); | ||
115 | } | ||
116 | store_reg(s, a->rn, addr); | ||
117 | - } else { | ||
118 | - tcg_temp_free_i32(addr); | ||
119 | } | ||
120 | } | ||
121 | |||
122 | @@ -XXX,XX +XXX,XX @@ static TCGv_i32 memory_to_fp_sysreg(DisasContext *s, void *opaque, | ||
123 | tcg_gen_addi_i32(addr, addr, offset); | ||
124 | } | ||
125 | store_reg(s, a->rn, addr); | ||
126 | - } else { | ||
127 | - tcg_temp_free_i32(addr); | ||
128 | } | ||
129 | return value; | ||
130 | } | ||
131 | -- | ||
132 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/arm/tcg/translate-mve.c | 52 ---------------------------------- | ||
7 | 1 file changed, 52 deletions(-) | ||
8 | |||
9 | diff --git a/target/arm/tcg/translate-mve.c b/target/arm/tcg/translate-mve.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/arm/tcg/translate-mve.c | ||
12 | +++ b/target/arm/tcg/translate-mve.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static bool do_ldst(DisasContext *s, arg_VLDR_VSTR *a, MVEGenLdStFn *fn, | ||
14 | |||
15 | qreg = mve_qreg_ptr(a->qd); | ||
16 | fn(cpu_env, qreg, addr); | ||
17 | - tcg_temp_free_ptr(qreg); | ||
18 | |||
19 | /* | ||
20 | * Writeback always happens after the last beat of the insn, | ||
21 | @@ -XXX,XX +XXX,XX @@ static bool do_ldst(DisasContext *s, arg_VLDR_VSTR *a, MVEGenLdStFn *fn, | ||
22 | tcg_gen_addi_i32(addr, addr, offset); | ||
23 | } | ||
24 | store_reg(s, a->rn, addr); | ||
25 | - } else { | ||
26 | - tcg_temp_free_i32(addr); | ||
27 | } | ||
28 | mve_update_eci(s); | ||
29 | return true; | ||
30 | @@ -XXX,XX +XXX,XX @@ static bool do_ldst_sg(DisasContext *s, arg_vldst_sg *a, MVEGenLdStSGFn fn) | ||
31 | qd = mve_qreg_ptr(a->qd); | ||
32 | qm = mve_qreg_ptr(a->qm); | ||
33 | fn(cpu_env, qd, qm, addr); | ||
34 | - tcg_temp_free_ptr(qd); | ||
35 | - tcg_temp_free_ptr(qm); | ||
36 | - tcg_temp_free_i32(addr); | ||
37 | mve_update_eci(s); | ||
38 | return true; | ||
39 | } | ||
40 | @@ -XXX,XX +XXX,XX @@ static bool do_ldst_sg_imm(DisasContext *s, arg_vldst_sg_imm *a, | ||
41 | qd = mve_qreg_ptr(a->qd); | ||
42 | qm = mve_qreg_ptr(a->qm); | ||
43 | fn(cpu_env, qd, qm, tcg_constant_i32(offset)); | ||
44 | - tcg_temp_free_ptr(qd); | ||
45 | - tcg_temp_free_ptr(qm); | ||
46 | mve_update_eci(s); | ||
47 | return true; | ||
48 | } | ||
49 | @@ -XXX,XX +XXX,XX @@ static bool do_vldst_il(DisasContext *s, arg_vldst_il *a, MVEGenLdStIlFn *fn, | ||
50 | if (a->w) { | ||
51 | tcg_gen_addi_i32(rn, rn, addrinc); | ||
52 | store_reg(s, a->rn, rn); | ||
53 | - } else { | ||
54 | - tcg_temp_free_i32(rn); | ||
55 | } | ||
56 | mve_update_and_store_eci(s); | ||
57 | return true; | ||
58 | @@ -XXX,XX +XXX,XX @@ static bool trans_VDUP(DisasContext *s, arg_VDUP *a) | ||
59 | qd = mve_qreg_ptr(a->qd); | ||
60 | tcg_gen_dup_i32(a->size, rt, rt); | ||
61 | gen_helper_mve_vdup(cpu_env, qd, rt); | ||
62 | - tcg_temp_free_ptr(qd); | ||
63 | } | ||
64 | - tcg_temp_free_i32(rt); | ||
65 | mve_update_eci(s); | ||
66 | return true; | ||
67 | } | ||
68 | @@ -XXX,XX +XXX,XX @@ static bool do_1op_vec(DisasContext *s, arg_1op *a, MVEGenOneOpFn fn, | ||
69 | qd = mve_qreg_ptr(a->qd); | ||
70 | qm = mve_qreg_ptr(a->qm); | ||
71 | fn(cpu_env, qd, qm); | ||
72 | - tcg_temp_free_ptr(qd); | ||
73 | - tcg_temp_free_ptr(qm); | ||
74 | } | ||
75 | mve_update_eci(s); | ||
76 | return true; | ||
77 | @@ -XXX,XX +XXX,XX @@ static bool do_vcvt_rmode(DisasContext *s, arg_1op *a, | ||
78 | qd = mve_qreg_ptr(a->qd); | ||
79 | qm = mve_qreg_ptr(a->qm); | ||
80 | fn(cpu_env, qd, qm, tcg_constant_i32(arm_rmode_to_sf(rmode))); | ||
81 | - tcg_temp_free_ptr(qd); | ||
82 | - tcg_temp_free_ptr(qm); | ||
83 | mve_update_eci(s); | ||
84 | return true; | ||
85 | } | ||
86 | @@ -XXX,XX +XXX,XX @@ static bool do_2op_vec(DisasContext *s, arg_2op *a, MVEGenTwoOpFn fn, | ||
87 | qn = mve_qreg_ptr(a->qn); | ||
88 | qm = mve_qreg_ptr(a->qm); | ||
89 | fn(cpu_env, qd, qn, qm); | ||
90 | - tcg_temp_free_ptr(qd); | ||
91 | - tcg_temp_free_ptr(qn); | ||
92 | - tcg_temp_free_ptr(qm); | ||
93 | } | ||
94 | mve_update_eci(s); | ||
95 | return true; | ||
96 | @@ -XXX,XX +XXX,XX @@ static bool do_2op_scalar(DisasContext *s, arg_2scalar *a, | ||
97 | qn = mve_qreg_ptr(a->qn); | ||
98 | rm = load_reg(s, a->rm); | ||
99 | fn(cpu_env, qd, qn, rm); | ||
100 | - tcg_temp_free_i32(rm); | ||
101 | - tcg_temp_free_ptr(qd); | ||
102 | - tcg_temp_free_ptr(qn); | ||
103 | mve_update_eci(s); | ||
104 | return true; | ||
105 | } | ||
106 | @@ -XXX,XX +XXX,XX @@ static bool do_long_dual_acc(DisasContext *s, arg_vmlaldav *a, | ||
107 | rdalo = load_reg(s, a->rdalo); | ||
108 | rdahi = load_reg(s, a->rdahi); | ||
109 | tcg_gen_concat_i32_i64(rda, rdalo, rdahi); | ||
110 | - tcg_temp_free_i32(rdalo); | ||
111 | - tcg_temp_free_i32(rdahi); | ||
112 | } else { | ||
113 | rda = tcg_const_i64(0); | ||
114 | } | ||
115 | |||
116 | fn(rda, cpu_env, qn, qm, rda); | ||
117 | - tcg_temp_free_ptr(qn); | ||
118 | - tcg_temp_free_ptr(qm); | ||
119 | |||
120 | rdalo = tcg_temp_new_i32(); | ||
121 | rdahi = tcg_temp_new_i32(); | ||
122 | @@ -XXX,XX +XXX,XX @@ static bool do_long_dual_acc(DisasContext *s, arg_vmlaldav *a, | ||
123 | tcg_gen_extrh_i64_i32(rdahi, rda); | ||
124 | store_reg(s, a->rdalo, rdalo); | ||
125 | store_reg(s, a->rdahi, rdahi); | ||
126 | - tcg_temp_free_i64(rda); | ||
127 | mve_update_eci(s); | ||
128 | return true; | ||
129 | } | ||
130 | @@ -XXX,XX +XXX,XX @@ static bool do_dual_acc(DisasContext *s, arg_vmladav *a, MVEGenDualAccOpFn *fn) | ||
131 | |||
132 | fn(rda, cpu_env, qn, qm, rda); | ||
133 | store_reg(s, a->rda, rda); | ||
134 | - tcg_temp_free_ptr(qn); | ||
135 | - tcg_temp_free_ptr(qm); | ||
136 | |||
137 | mve_update_eci(s); | ||
138 | return true; | ||
139 | @@ -XXX,XX +XXX,XX @@ static bool trans_VADDV(DisasContext *s, arg_VADDV *a) | ||
140 | qm = mve_qreg_ptr(a->qm); | ||
141 | fns[a->size][a->u](rda, cpu_env, qm, rda); | ||
142 | store_reg(s, a->rda, rda); | ||
143 | - tcg_temp_free_ptr(qm); | ||
144 | |||
145 | mve_update_eci(s); | ||
146 | return true; | ||
147 | @@ -XXX,XX +XXX,XX @@ static bool trans_VADDLV(DisasContext *s, arg_VADDLV *a) | ||
148 | rdalo = load_reg(s, a->rdalo); | ||
149 | rdahi = load_reg(s, a->rdahi); | ||
150 | tcg_gen_concat_i32_i64(rda, rdalo, rdahi); | ||
151 | - tcg_temp_free_i32(rdalo); | ||
152 | - tcg_temp_free_i32(rdahi); | ||
153 | } else { | ||
154 | /* Accumulate starting at zero */ | ||
155 | rda = tcg_const_i64(0); | ||
156 | @@ -XXX,XX +XXX,XX @@ static bool trans_VADDLV(DisasContext *s, arg_VADDLV *a) | ||
157 | } else { | ||
158 | gen_helper_mve_vaddlv_s(rda, cpu_env, qm, rda); | ||
159 | } | ||
160 | - tcg_temp_free_ptr(qm); | ||
161 | |||
162 | rdalo = tcg_temp_new_i32(); | ||
163 | rdahi = tcg_temp_new_i32(); | ||
164 | @@ -XXX,XX +XXX,XX @@ static bool trans_VADDLV(DisasContext *s, arg_VADDLV *a) | ||
165 | tcg_gen_extrh_i64_i32(rdahi, rda); | ||
166 | store_reg(s, a->rdalo, rdalo); | ||
167 | store_reg(s, a->rdahi, rdahi); | ||
168 | - tcg_temp_free_i64(rda); | ||
169 | mve_update_eci(s); | ||
170 | return true; | ||
171 | } | ||
172 | @@ -XXX,XX +XXX,XX @@ static bool do_1imm(DisasContext *s, arg_1imm *a, MVEGenOneOpImmFn *fn, | ||
173 | } else { | ||
174 | qd = mve_qreg_ptr(a->qd); | ||
175 | fn(cpu_env, qd, tcg_constant_i64(imm)); | ||
176 | - tcg_temp_free_ptr(qd); | ||
177 | } | ||
178 | mve_update_eci(s); | ||
179 | return true; | ||
180 | @@ -XXX,XX +XXX,XX @@ static bool do_2shift_vec(DisasContext *s, arg_2shift *a, MVEGenTwoOpShiftFn fn, | ||
181 | qd = mve_qreg_ptr(a->qd); | ||
182 | qm = mve_qreg_ptr(a->qm); | ||
183 | fn(cpu_env, qd, qm, tcg_constant_i32(shift)); | ||
184 | - tcg_temp_free_ptr(qd); | ||
185 | - tcg_temp_free_ptr(qm); | ||
186 | } | ||
187 | mve_update_eci(s); | ||
188 | return true; | ||
189 | @@ -XXX,XX +XXX,XX @@ static bool do_2shift_scalar(DisasContext *s, arg_shl_scalar *a, | ||
190 | qda = mve_qreg_ptr(a->qda); | ||
191 | rm = load_reg(s, a->rm); | ||
192 | fn(cpu_env, qda, qda, rm); | ||
193 | - tcg_temp_free_ptr(qda); | ||
194 | - tcg_temp_free_i32(rm); | ||
195 | mve_update_eci(s); | ||
196 | return true; | ||
197 | } | ||
198 | @@ -XXX,XX +XXX,XX @@ static bool trans_VSHLC(DisasContext *s, arg_VSHLC *a) | ||
199 | rdm = load_reg(s, a->rdm); | ||
200 | gen_helper_mve_vshlc(rdm, cpu_env, qd, rdm, tcg_constant_i32(a->imm)); | ||
201 | store_reg(s, a->rdm, rdm); | ||
202 | - tcg_temp_free_ptr(qd); | ||
203 | mve_update_eci(s); | ||
204 | return true; | ||
205 | } | ||
206 | @@ -XXX,XX +XXX,XX @@ static bool do_vidup(DisasContext *s, arg_vidup *a, MVEGenVIDUPFn *fn) | ||
207 | rn = load_reg(s, a->rn); | ||
208 | fn(rn, cpu_env, qd, rn, tcg_constant_i32(a->imm)); | ||
209 | store_reg(s, a->rn, rn); | ||
210 | - tcg_temp_free_ptr(qd); | ||
211 | mve_update_eci(s); | ||
212 | return true; | ||
213 | } | ||
214 | @@ -XXX,XX +XXX,XX @@ static bool do_viwdup(DisasContext *s, arg_viwdup *a, MVEGenVIWDUPFn *fn) | ||
215 | rm = load_reg(s, a->rm); | ||
216 | fn(rn, cpu_env, qd, rn, rm, tcg_constant_i32(a->imm)); | ||
217 | store_reg(s, a->rn, rn); | ||
218 | - tcg_temp_free_ptr(qd); | ||
219 | - tcg_temp_free_i32(rm); | ||
220 | mve_update_eci(s); | ||
221 | return true; | ||
222 | } | ||
223 | @@ -XXX,XX +XXX,XX @@ static bool do_vcmp(DisasContext *s, arg_vcmp *a, MVEGenCmpFn *fn) | ||
224 | qn = mve_qreg_ptr(a->qn); | ||
225 | qm = mve_qreg_ptr(a->qm); | ||
226 | fn(cpu_env, qn, qm); | ||
227 | - tcg_temp_free_ptr(qn); | ||
228 | - tcg_temp_free_ptr(qm); | ||
229 | if (a->mask) { | ||
230 | /* VPT */ | ||
231 | gen_vpst(s, a->mask); | ||
232 | @@ -XXX,XX +XXX,XX @@ static bool do_vcmp_scalar(DisasContext *s, arg_vcmp_scalar *a, | ||
233 | rm = load_reg(s, a->rm); | ||
234 | } | ||
235 | fn(cpu_env, qn, rm); | ||
236 | - tcg_temp_free_ptr(qn); | ||
237 | - tcg_temp_free_i32(rm); | ||
238 | if (a->mask) { | ||
239 | /* VPT */ | ||
240 | gen_vpst(s, a->mask); | ||
241 | @@ -XXX,XX +XXX,XX @@ static bool do_vmaxv(DisasContext *s, arg_vmaxv *a, MVEGenVADDVFn fn) | ||
242 | rda = load_reg(s, a->rda); | ||
243 | fn(rda, cpu_env, qm, rda); | ||
244 | store_reg(s, a->rda, rda); | ||
245 | - tcg_temp_free_ptr(qm); | ||
246 | mve_update_eci(s); | ||
247 | return true; | ||
248 | } | ||
249 | @@ -XXX,XX +XXX,XX @@ static bool do_vabav(DisasContext *s, arg_vabav *a, MVEGenVABAVFn *fn) | ||
250 | rda = load_reg(s, a->rda); | ||
251 | fn(rda, cpu_env, qn, qm, rda); | ||
252 | store_reg(s, a->rda, rda); | ||
253 | - tcg_temp_free_ptr(qm); | ||
254 | - tcg_temp_free_ptr(qn); | ||
255 | mve_update_eci(s); | ||
256 | return true; | ||
257 | } | ||
258 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMOV_from_2gp(DisasContext *s, arg_VMOV_to_2gp *a) | ||
259 | if (!mve_skip_vmov(s, vd, a->idx, MO_32)) { | ||
260 | tmp = load_reg(s, a->rt); | ||
261 | write_neon_element32(tmp, vd, a->idx, MO_32); | ||
262 | - tcg_temp_free_i32(tmp); | ||
263 | } | ||
264 | if (!mve_skip_vmov(s, vd + 1, a->idx, MO_32)) { | ||
265 | tmp = load_reg(s, a->rt2); | ||
266 | write_neon_element32(tmp, vd + 1, a->idx, MO_32); | ||
267 | - tcg_temp_free_i32(tmp); | ||
268 | } | ||
269 | |||
270 | mve_update_and_store_eci(s); | ||
271 | -- | ||
272 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/arm/tcg/translate-neon.c | 131 +------------------------------- | ||
7 | 1 file changed, 1 insertion(+), 130 deletions(-) | ||
8 | |||
9 | diff --git a/target/arm/tcg/translate-neon.c b/target/arm/tcg/translate-neon.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/arm/tcg/translate-neon.c | ||
12 | +++ b/target/arm/tcg/translate-neon.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static bool do_neon_ddda_fpst(DisasContext *s, int q, int vd, int vn, int vm, | ||
14 | vfp_reg_offset(1, vm), | ||
15 | vfp_reg_offset(1, vd), | ||
16 | fpst, opr_sz, opr_sz, data, fn_gvec_ptr); | ||
17 | - tcg_temp_free_ptr(fpst); | ||
18 | return true; | ||
19 | } | ||
20 | |||
21 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCADD(DisasContext *s, arg_VCADD *a) | ||
22 | vfp_reg_offset(1, a->vm), | ||
23 | fpst, opr_sz, opr_sz, a->rot, | ||
24 | fn_gvec_ptr); | ||
25 | - tcg_temp_free_ptr(fpst); | ||
26 | return true; | ||
27 | } | ||
28 | |||
29 | @@ -XXX,XX +XXX,XX @@ static void gen_neon_ldst_base_update(DisasContext *s, int rm, int rn, | ||
30 | TCGv_i32 index; | ||
31 | index = load_reg(s, rm); | ||
32 | tcg_gen_add_i32(base, base, index); | ||
33 | - tcg_temp_free_i32(index); | ||
34 | } | ||
35 | store_reg(s, rn, base); | ||
36 | } | ||
37 | @@ -XXX,XX +XXX,XX @@ static bool trans_VLDST_multiple(DisasContext *s, arg_VLDST_multiple *a) | ||
38 | } | ||
39 | } | ||
40 | } | ||
41 | - tcg_temp_free_i32(addr); | ||
42 | - tcg_temp_free_i64(tmp64); | ||
43 | |||
44 | gen_neon_ldst_base_update(s, a->rm, a->rn, nregs * interleave * 8); | ||
45 | return true; | ||
46 | @@ -XXX,XX +XXX,XX @@ static bool trans_VLD_all_lanes(DisasContext *s, arg_VLD_all_lanes *a) | ||
47 | /* Subsequent memory operations inherit alignment */ | ||
48 | mop &= ~MO_AMASK; | ||
49 | } | ||
50 | - tcg_temp_free_i32(tmp); | ||
51 | - tcg_temp_free_i32(addr); | ||
52 | |||
53 | gen_neon_ldst_base_update(s, a->rm, a->rn, (1 << size) * nregs); | ||
54 | |||
55 | @@ -XXX,XX +XXX,XX @@ static bool trans_VLDST_single(DisasContext *s, arg_VLDST_single *a) | ||
56 | /* Subsequent memory operations inherit alignment */ | ||
57 | mop &= ~MO_AMASK; | ||
58 | } | ||
59 | - tcg_temp_free_i32(addr); | ||
60 | - tcg_temp_free_i32(tmp); | ||
61 | |||
62 | gen_neon_ldst_base_update(s, a->rm, a->rn, (1 << a->size) * nregs); | ||
63 | |||
64 | @@ -XXX,XX +XXX,XX @@ static bool do_3same_pair(DisasContext *s, arg_3same *a, NeonGenTwoOpFn *fn) | ||
65 | write_neon_element32(tmp, a->vd, 0, MO_32); | ||
66 | write_neon_element32(tmp3, a->vd, 1, MO_32); | ||
67 | |||
68 | - tcg_temp_free_i32(tmp); | ||
69 | - tcg_temp_free_i32(tmp2); | ||
70 | - tcg_temp_free_i32(tmp3); | ||
71 | return true; | ||
72 | } | ||
73 | |||
74 | @@ -XXX,XX +XXX,XX @@ DO_3SAME_VQDMULH(VQRDMULH, qrdmulh) | ||
75 | TCGv_ptr fpst = fpstatus_ptr(FPST); \ | ||
76 | tcg_gen_gvec_3_ptr(rd_ofs, rn_ofs, rm_ofs, fpst, \ | ||
77 | oprsz, maxsz, 0, FUNC); \ | ||
78 | - tcg_temp_free_ptr(fpst); \ | ||
79 | } | ||
80 | |||
81 | #define DO_3S_FP_GVEC(INSN,SFUNC,HFUNC) \ | ||
82 | @@ -XXX,XX +XXX,XX @@ static bool do_3same_fp_pair(DisasContext *s, arg_3same *a, | ||
83 | vfp_reg_offset(1, a->vn), | ||
84 | vfp_reg_offset(1, a->vm), | ||
85 | fpstatus, 8, 8, 0, fn); | ||
86 | - tcg_temp_free_ptr(fpstatus); | ||
87 | |||
88 | return true; | ||
89 | } | ||
90 | @@ -XXX,XX +XXX,XX @@ static bool do_2shift_env_64(DisasContext *s, arg_2reg_shift *a, | ||
91 | read_neon_element64(tmp, a->vm, pass, MO_64); | ||
92 | fn(tmp, cpu_env, tmp, constimm); | ||
93 | write_neon_element64(tmp, a->vd, pass, MO_64); | ||
94 | - tcg_temp_free_i64(tmp); | ||
95 | } | ||
96 | return true; | ||
97 | } | ||
98 | @@ -XXX,XX +XXX,XX @@ static bool do_2shift_env_32(DisasContext *s, arg_2reg_shift *a, | ||
99 | fn(tmp, cpu_env, tmp, constimm); | ||
100 | write_neon_element32(tmp, a->vd, pass, MO_32); | ||
101 | } | ||
102 | - tcg_temp_free_i32(tmp); | ||
103 | return true; | ||
104 | } | ||
105 | |||
106 | @@ -XXX,XX +XXX,XX @@ static bool do_2shift_narrow_64(DisasContext *s, arg_2reg_shift *a, | ||
107 | narrowfn(rd, cpu_env, rm2); | ||
108 | write_neon_element32(rd, a->vd, 1, MO_32); | ||
109 | |||
110 | - tcg_temp_free_i32(rd); | ||
111 | - tcg_temp_free_i64(rm1); | ||
112 | - tcg_temp_free_i64(rm2); | ||
113 | - | ||
114 | return true; | ||
115 | } | ||
116 | |||
117 | @@ -XXX,XX +XXX,XX @@ static bool do_2shift_narrow_32(DisasContext *s, arg_2reg_shift *a, | ||
118 | shiftfn(rm2, rm2, constimm); | ||
119 | |||
120 | tcg_gen_concat_i32_i64(rtmp, rm1, rm2); | ||
121 | - tcg_temp_free_i32(rm2); | ||
122 | |||
123 | narrowfn(rm1, cpu_env, rtmp); | ||
124 | write_neon_element32(rm1, a->vd, 0, MO_32); | ||
125 | - tcg_temp_free_i32(rm1); | ||
126 | |||
127 | shiftfn(rm3, rm3, constimm); | ||
128 | shiftfn(rm4, rm4, constimm); | ||
129 | |||
130 | tcg_gen_concat_i32_i64(rtmp, rm3, rm4); | ||
131 | - tcg_temp_free_i32(rm4); | ||
132 | |||
133 | narrowfn(rm3, cpu_env, rtmp); | ||
134 | - tcg_temp_free_i64(rtmp); | ||
135 | write_neon_element32(rm3, a->vd, 1, MO_32); | ||
136 | - tcg_temp_free_i32(rm3); | ||
137 | return true; | ||
138 | } | ||
139 | |||
140 | @@ -XXX,XX +XXX,XX @@ static bool do_vshll_2sh(DisasContext *s, arg_2reg_shift *a, | ||
141 | tmp = tcg_temp_new_i64(); | ||
142 | |||
143 | widenfn(tmp, rm0); | ||
144 | - tcg_temp_free_i32(rm0); | ||
145 | if (a->shift != 0) { | ||
146 | tcg_gen_shli_i64(tmp, tmp, a->shift); | ||
147 | tcg_gen_andi_i64(tmp, tmp, ~widen_mask); | ||
148 | @@ -XXX,XX +XXX,XX @@ static bool do_vshll_2sh(DisasContext *s, arg_2reg_shift *a, | ||
149 | write_neon_element64(tmp, a->vd, 0, MO_64); | ||
150 | |||
151 | widenfn(tmp, rm1); | ||
152 | - tcg_temp_free_i32(rm1); | ||
153 | if (a->shift != 0) { | ||
154 | tcg_gen_shli_i64(tmp, tmp, a->shift); | ||
155 | tcg_gen_andi_i64(tmp, tmp, ~widen_mask); | ||
156 | } | ||
157 | write_neon_element64(tmp, a->vd, 1, MO_64); | ||
158 | - tcg_temp_free_i64(tmp); | ||
159 | return true; | ||
160 | } | ||
161 | |||
162 | @@ -XXX,XX +XXX,XX @@ static bool do_fp_2sh(DisasContext *s, arg_2reg_shift *a, | ||
163 | |||
164 | fpst = fpstatus_ptr(a->size == MO_16 ? FPST_STD_F16 : FPST_STD); | ||
165 | tcg_gen_gvec_2_ptr(rd_ofs, rm_ofs, fpst, vec_size, vec_size, a->shift, fn); | ||
166 | - tcg_temp_free_ptr(fpst); | ||
167 | return true; | ||
168 | } | ||
169 | |||
170 | @@ -XXX,XX +XXX,XX @@ static bool do_prewiden_3d(DisasContext *s, arg_3diff *a, | ||
171 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
172 | read_neon_element32(tmp, a->vn, 0, MO_32); | ||
173 | widenfn(rn0_64, tmp); | ||
174 | - tcg_temp_free_i32(tmp); | ||
175 | } | ||
176 | if (src2_mop >= 0) { | ||
177 | read_neon_element64(rm_64, a->vm, 0, src2_mop); | ||
178 | @@ -XXX,XX +XXX,XX @@ static bool do_prewiden_3d(DisasContext *s, arg_3diff *a, | ||
179 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
180 | read_neon_element32(tmp, a->vm, 0, MO_32); | ||
181 | widenfn(rm_64, tmp); | ||
182 | - tcg_temp_free_i32(tmp); | ||
183 | } | ||
184 | |||
185 | opfn(rn0_64, rn0_64, rm_64); | ||
186 | @@ -XXX,XX +XXX,XX @@ static bool do_prewiden_3d(DisasContext *s, arg_3diff *a, | ||
187 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
188 | read_neon_element32(tmp, a->vn, 1, MO_32); | ||
189 | widenfn(rn1_64, tmp); | ||
190 | - tcg_temp_free_i32(tmp); | ||
191 | } | ||
192 | if (src2_mop >= 0) { | ||
193 | read_neon_element64(rm_64, a->vm, 1, src2_mop); | ||
194 | @@ -XXX,XX +XXX,XX @@ static bool do_prewiden_3d(DisasContext *s, arg_3diff *a, | ||
195 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
196 | read_neon_element32(tmp, a->vm, 1, MO_32); | ||
197 | widenfn(rm_64, tmp); | ||
198 | - tcg_temp_free_i32(tmp); | ||
199 | } | ||
200 | |||
201 | write_neon_element64(rn0_64, a->vd, 0, MO_64); | ||
202 | @@ -XXX,XX +XXX,XX @@ static bool do_prewiden_3d(DisasContext *s, arg_3diff *a, | ||
203 | opfn(rn1_64, rn1_64, rm_64); | ||
204 | write_neon_element64(rn1_64, a->vd, 1, MO_64); | ||
205 | |||
206 | - tcg_temp_free_i64(rn0_64); | ||
207 | - tcg_temp_free_i64(rn1_64); | ||
208 | - tcg_temp_free_i64(rm_64); | ||
209 | - | ||
210 | return true; | ||
211 | } | ||
212 | |||
213 | @@ -XXX,XX +XXX,XX @@ static bool do_narrow_3d(DisasContext *s, arg_3diff *a, | ||
214 | write_neon_element32(rd0, a->vd, 0, MO_32); | ||
215 | write_neon_element32(rd1, a->vd, 1, MO_32); | ||
216 | |||
217 | - tcg_temp_free_i32(rd0); | ||
218 | - tcg_temp_free_i32(rd1); | ||
219 | - tcg_temp_free_i64(rn_64); | ||
220 | - tcg_temp_free_i64(rm_64); | ||
221 | - | ||
222 | return true; | ||
223 | } | ||
224 | |||
225 | @@ -XXX,XX +XXX,XX @@ static bool do_long_3d(DisasContext *s, arg_3diff *a, | ||
226 | read_neon_element32(rn, a->vn, 1, MO_32); | ||
227 | read_neon_element32(rm, a->vm, 1, MO_32); | ||
228 | opfn(rd1, rn, rm); | ||
229 | - tcg_temp_free_i32(rn); | ||
230 | - tcg_temp_free_i32(rm); | ||
231 | |||
232 | /* Don't store results until after all loads: they might overlap */ | ||
233 | if (accfn) { | ||
234 | @@ -XXX,XX +XXX,XX @@ static bool do_long_3d(DisasContext *s, arg_3diff *a, | ||
235 | accfn(rd0, tmp, rd0); | ||
236 | read_neon_element64(tmp, a->vd, 1, MO_64); | ||
237 | accfn(rd1, tmp, rd1); | ||
238 | - tcg_temp_free_i64(tmp); | ||
239 | } | ||
240 | |||
241 | write_neon_element64(rd0, a->vd, 0, MO_64); | ||
242 | write_neon_element64(rd1, a->vd, 1, MO_64); | ||
243 | - tcg_temp_free_i64(rd0); | ||
244 | - tcg_temp_free_i64(rd1); | ||
245 | |||
246 | return true; | ||
247 | } | ||
248 | @@ -XXX,XX +XXX,XX @@ static void gen_mull_s32(TCGv_i64 rd, TCGv_i32 rn, TCGv_i32 rm) | ||
249 | |||
250 | tcg_gen_muls2_i32(lo, hi, rn, rm); | ||
251 | tcg_gen_concat_i32_i64(rd, lo, hi); | ||
252 | - | ||
253 | - tcg_temp_free_i32(lo); | ||
254 | - tcg_temp_free_i32(hi); | ||
255 | } | ||
256 | |||
257 | static void gen_mull_u32(TCGv_i64 rd, TCGv_i32 rn, TCGv_i32 rm) | ||
258 | @@ -XXX,XX +XXX,XX @@ static void gen_mull_u32(TCGv_i64 rd, TCGv_i32 rn, TCGv_i32 rm) | ||
259 | |||
260 | tcg_gen_mulu2_i32(lo, hi, rn, rm); | ||
261 | tcg_gen_concat_i32_i64(rd, lo, hi); | ||
262 | - | ||
263 | - tcg_temp_free_i32(lo); | ||
264 | - tcg_temp_free_i32(hi); | ||
265 | } | ||
266 | |||
267 | static bool trans_VMULL_S_3d(DisasContext *s, arg_3diff *a) | ||
268 | @@ -XXX,XX +XXX,XX @@ static void gen_neon_dup_low16(TCGv_i32 var) | ||
269 | tcg_gen_ext16u_i32(var, var); | ||
270 | tcg_gen_shli_i32(tmp, var, 16); | ||
271 | tcg_gen_or_i32(var, var, tmp); | ||
272 | - tcg_temp_free_i32(tmp); | ||
273 | } | ||
274 | |||
275 | static void gen_neon_dup_high16(TCGv_i32 var) | ||
276 | @@ -XXX,XX +XXX,XX @@ static void gen_neon_dup_high16(TCGv_i32 var) | ||
277 | tcg_gen_andi_i32(var, var, 0xffff0000); | ||
278 | tcg_gen_shri_i32(tmp, var, 16); | ||
279 | tcg_gen_or_i32(var, var, tmp); | ||
280 | - tcg_temp_free_i32(tmp); | ||
281 | } | ||
282 | |||
283 | static inline TCGv_i32 neon_get_scalar(int size, int reg) | ||
284 | @@ -XXX,XX +XXX,XX @@ static bool do_2scalar(DisasContext *s, arg_2scalar *a, | ||
285 | TCGv_i32 rd = tcg_temp_new_i32(); | ||
286 | read_neon_element32(rd, a->vd, pass, MO_32); | ||
287 | accfn(tmp, rd, tmp); | ||
288 | - tcg_temp_free_i32(rd); | ||
289 | } | ||
290 | write_neon_element32(tmp, a->vd, pass, MO_32); | ||
291 | } | ||
292 | - tcg_temp_free_i32(tmp); | ||
293 | - tcg_temp_free_i32(scalar); | ||
294 | return true; | ||
295 | } | ||
296 | |||
297 | @@ -XXX,XX +XXX,XX @@ static bool do_2scalar_fp_vec(DisasContext *s, arg_2scalar *a, | ||
298 | fpstatus = fpstatus_ptr(a->size == 1 ? FPST_STD_F16 : FPST_STD); | ||
299 | tcg_gen_gvec_3_ptr(rd_ofs, rn_ofs, rm_ofs, fpstatus, | ||
300 | vec_size, vec_size, idx, fn); | ||
301 | - tcg_temp_free_ptr(fpstatus); | ||
302 | return true; | ||
303 | } | ||
304 | |||
305 | @@ -XXX,XX +XXX,XX @@ static bool do_vqrdmlah_2sc(DisasContext *s, arg_2scalar *a, | ||
306 | opfn(rd, cpu_env, rn, scalar, rd); | ||
307 | write_neon_element32(rd, a->vd, pass, MO_32); | ||
308 | } | ||
309 | - tcg_temp_free_i32(rn); | ||
310 | - tcg_temp_free_i32(rd); | ||
311 | - tcg_temp_free_i32(scalar); | ||
312 | - | ||
313 | return true; | ||
314 | } | ||
315 | |||
316 | @@ -XXX,XX +XXX,XX @@ static bool do_2scalar_long(DisasContext *s, arg_2scalar *a, | ||
317 | read_neon_element32(rn, a->vn, 1, MO_32); | ||
318 | rn1_64 = tcg_temp_new_i64(); | ||
319 | opfn(rn1_64, rn, scalar); | ||
320 | - tcg_temp_free_i32(rn); | ||
321 | - tcg_temp_free_i32(scalar); | ||
322 | |||
323 | if (accfn) { | ||
324 | TCGv_i64 t64 = tcg_temp_new_i64(); | ||
325 | @@ -XXX,XX +XXX,XX @@ static bool do_2scalar_long(DisasContext *s, arg_2scalar *a, | ||
326 | accfn(rn0_64, t64, rn0_64); | ||
327 | read_neon_element64(t64, a->vd, 1, MO_64); | ||
328 | accfn(rn1_64, t64, rn1_64); | ||
329 | - tcg_temp_free_i64(t64); | ||
330 | } | ||
331 | |||
332 | write_neon_element64(rn0_64, a->vd, 0, MO_64); | ||
333 | write_neon_element64(rn1_64, a->vd, 1, MO_64); | ||
334 | - tcg_temp_free_i64(rn0_64); | ||
335 | - tcg_temp_free_i64(rn1_64); | ||
336 | return true; | ||
337 | } | ||
338 | |||
339 | @@ -XXX,XX +XXX,XX @@ static bool trans_VEXT(DisasContext *s, arg_VEXT *a) | ||
340 | read_neon_element64(left, a->vm, 0, MO_64); | ||
341 | tcg_gen_extract2_i64(dest, right, left, a->imm * 8); | ||
342 | write_neon_element64(dest, a->vd, 0, MO_64); | ||
343 | - | ||
344 | - tcg_temp_free_i64(left); | ||
345 | - tcg_temp_free_i64(right); | ||
346 | - tcg_temp_free_i64(dest); | ||
347 | } else { | ||
348 | /* Extract 128 bits from <Vm+1:Vm:Vn+1:Vn> */ | ||
349 | TCGv_i64 left, middle, right, destleft, destright; | ||
350 | @@ -XXX,XX +XXX,XX @@ static bool trans_VEXT(DisasContext *s, arg_VEXT *a) | ||
351 | |||
352 | write_neon_element64(destright, a->vd, 0, MO_64); | ||
353 | write_neon_element64(destleft, a->vd, 1, MO_64); | ||
354 | - | ||
355 | - tcg_temp_free_i64(destright); | ||
356 | - tcg_temp_free_i64(destleft); | ||
357 | - tcg_temp_free_i64(right); | ||
358 | - tcg_temp_free_i64(middle); | ||
359 | - tcg_temp_free_i64(left); | ||
360 | } | ||
361 | return true; | ||
362 | } | ||
363 | @@ -XXX,XX +XXX,XX @@ static bool trans_VTBL(DisasContext *s, arg_VTBL *a) | ||
364 | |||
365 | gen_helper_neon_tbl(val, cpu_env, desc, val, def); | ||
366 | write_neon_element64(val, a->vd, 0, MO_64); | ||
367 | - | ||
368 | - tcg_temp_free_i64(def); | ||
369 | - tcg_temp_free_i64(val); | ||
370 | return true; | ||
371 | } | ||
372 | |||
373 | @@ -XXX,XX +XXX,XX @@ static bool trans_VREV64(DisasContext *s, arg_VREV64 *a) | ||
374 | write_neon_element32(tmp[1], a->vd, pass * 2, MO_32); | ||
375 | write_neon_element32(tmp[0], a->vd, pass * 2 + 1, MO_32); | ||
376 | } | ||
377 | - | ||
378 | - tcg_temp_free_i32(tmp[0]); | ||
379 | - tcg_temp_free_i32(tmp[1]); | ||
380 | return true; | ||
381 | } | ||
382 | |||
383 | @@ -XXX,XX +XXX,XX @@ static bool do_2misc_pairwise(DisasContext *s, arg_2misc *a, | ||
384 | widenfn(rm0_64, tmp); | ||
385 | read_neon_element32(tmp, a->vm, pass * 2 + 1, MO_32); | ||
386 | widenfn(rm1_64, tmp); | ||
387 | - tcg_temp_free_i32(tmp); | ||
388 | |||
389 | opfn(rd_64, rm0_64, rm1_64); | ||
390 | - tcg_temp_free_i64(rm0_64); | ||
391 | - tcg_temp_free_i64(rm1_64); | ||
392 | |||
393 | if (accfn) { | ||
394 | TCGv_i64 tmp64 = tcg_temp_new_i64(); | ||
395 | read_neon_element64(tmp64, a->vd, pass, MO_64); | ||
396 | accfn(rd_64, tmp64, rd_64); | ||
397 | - tcg_temp_free_i64(tmp64); | ||
398 | } | ||
399 | write_neon_element64(rd_64, a->vd, pass, MO_64); | ||
400 | - tcg_temp_free_i64(rd_64); | ||
401 | } | ||
402 | return true; | ||
403 | } | ||
404 | @@ -XXX,XX +XXX,XX @@ static bool do_zip_uzp(DisasContext *s, arg_2misc *a, | ||
405 | pd = vfp_reg_ptr(true, a->vd); | ||
406 | pm = vfp_reg_ptr(true, a->vm); | ||
407 | fn(pd, pm); | ||
408 | - tcg_temp_free_ptr(pd); | ||
409 | - tcg_temp_free_ptr(pm); | ||
410 | return true; | ||
411 | } | ||
412 | |||
413 | @@ -XXX,XX +XXX,XX @@ static bool do_vmovn(DisasContext *s, arg_2misc *a, | ||
414 | narrowfn(rd1, cpu_env, rm); | ||
415 | write_neon_element32(rd0, a->vd, 0, MO_32); | ||
416 | write_neon_element32(rd1, a->vd, 1, MO_32); | ||
417 | - tcg_temp_free_i32(rd0); | ||
418 | - tcg_temp_free_i32(rd1); | ||
419 | - tcg_temp_free_i64(rm); | ||
420 | return true; | ||
421 | } | ||
422 | |||
423 | @@ -XXX,XX +XXX,XX @@ static bool trans_VSHLL(DisasContext *s, arg_2misc *a) | ||
424 | widenfn(rd, rm1); | ||
425 | tcg_gen_shli_i64(rd, rd, 8 << a->size); | ||
426 | write_neon_element64(rd, a->vd, 1, MO_64); | ||
427 | - | ||
428 | - tcg_temp_free_i64(rd); | ||
429 | - tcg_temp_free_i32(rm0); | ||
430 | - tcg_temp_free_i32(rm1); | ||
431 | return true; | ||
432 | } | ||
433 | |||
434 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_B16_F32(DisasContext *s, arg_2misc *a) | ||
435 | |||
436 | write_neon_element32(dst0, a->vd, 0, MO_32); | ||
437 | write_neon_element32(dst1, a->vd, 1, MO_32); | ||
438 | - | ||
439 | - tcg_temp_free_i64(tmp); | ||
440 | - tcg_temp_free_i32(dst0); | ||
441 | - tcg_temp_free_i32(dst1); | ||
442 | - tcg_temp_free_ptr(fpst); | ||
443 | return true; | ||
444 | } | ||
445 | |||
446 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_F16_F32(DisasContext *s, arg_2misc *a) | ||
447 | tmp3 = tcg_temp_new_i32(); | ||
448 | read_neon_element32(tmp3, a->vm, 3, MO_32); | ||
449 | write_neon_element32(tmp2, a->vd, 0, MO_32); | ||
450 | - tcg_temp_free_i32(tmp2); | ||
451 | gen_helper_vfp_fcvt_f32_to_f16(tmp3, tmp3, fpst, ahp); | ||
452 | tcg_gen_shli_i32(tmp3, tmp3, 16); | ||
453 | tcg_gen_or_i32(tmp3, tmp3, tmp); | ||
454 | write_neon_element32(tmp3, a->vd, 1, MO_32); | ||
455 | - tcg_temp_free_i32(tmp3); | ||
456 | - tcg_temp_free_i32(tmp); | ||
457 | - tcg_temp_free_i32(ahp); | ||
458 | - tcg_temp_free_ptr(fpst); | ||
459 | - | ||
460 | return true; | ||
461 | } | ||
462 | |||
463 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCVT_F32_F16(DisasContext *s, arg_2misc *a) | ||
464 | tcg_gen_shri_i32(tmp, tmp, 16); | ||
465 | gen_helper_vfp_fcvt_f16_to_f32(tmp, tmp, fpst, ahp); | ||
466 | write_neon_element32(tmp, a->vd, 1, MO_32); | ||
467 | - tcg_temp_free_i32(tmp); | ||
468 | tcg_gen_ext16u_i32(tmp3, tmp2); | ||
469 | gen_helper_vfp_fcvt_f16_to_f32(tmp3, tmp3, fpst, ahp); | ||
470 | write_neon_element32(tmp3, a->vd, 2, MO_32); | ||
471 | - tcg_temp_free_i32(tmp3); | ||
472 | tcg_gen_shri_i32(tmp2, tmp2, 16); | ||
473 | gen_helper_vfp_fcvt_f16_to_f32(tmp2, tmp2, fpst, ahp); | ||
474 | write_neon_element32(tmp2, a->vd, 3, MO_32); | ||
475 | - tcg_temp_free_i32(tmp2); | ||
476 | - tcg_temp_free_i32(ahp); | ||
477 | - tcg_temp_free_ptr(fpst); | ||
478 | - | ||
479 | return true; | ||
480 | } | ||
481 | |||
482 | @@ -XXX,XX +XXX,XX @@ static bool do_2misc(DisasContext *s, arg_2misc *a, NeonGenOneOpFn *fn) | ||
483 | fn(tmp, tmp); | ||
484 | write_neon_element32(tmp, a->vd, pass, MO_32); | ||
485 | } | ||
486 | - tcg_temp_free_i32(tmp); | ||
487 | - | ||
488 | return true; | ||
489 | } | ||
490 | |||
491 | @@ -XXX,XX +XXX,XX @@ static bool trans_VQNEG(DisasContext *s, arg_2misc *a) | ||
492 | fpst = fpstatus_ptr(vece == MO_16 ? FPST_STD_F16 : FPST_STD); \ | ||
493 | tcg_gen_gvec_2_ptr(rd_ofs, rm_ofs, fpst, oprsz, maxsz, 0, \ | ||
494 | fns[vece]); \ | ||
495 | - tcg_temp_free_ptr(fpst); \ | ||
496 | } \ | ||
497 | static bool trans_##INSN(DisasContext *s, arg_2misc *a) \ | ||
498 | { \ | ||
499 | @@ -XXX,XX +XXX,XX @@ static bool trans_VRINTX(DisasContext *s, arg_2misc *a) | ||
500 | fpst = fpstatus_ptr(vece == 1 ? FPST_STD_F16 : FPST_STD); \ | ||
501 | tcg_gen_gvec_2_ptr(rd_ofs, rm_ofs, fpst, oprsz, maxsz, \ | ||
502 | arm_rmode_to_sf(RMODE), fns[vece]); \ | ||
503 | - tcg_temp_free_ptr(fpst); \ | ||
504 | } \ | ||
505 | static bool trans_##INSN(DisasContext *s, arg_2misc *a) \ | ||
506 | { \ | ||
507 | @@ -XXX,XX +XXX,XX @@ static bool trans_VSWP(DisasContext *s, arg_2misc *a) | ||
508 | write_neon_element64(rm, a->vd, pass, MO_64); | ||
509 | write_neon_element64(rd, a->vm, pass, MO_64); | ||
510 | } | ||
511 | - tcg_temp_free_i64(rm); | ||
512 | - tcg_temp_free_i64(rd); | ||
513 | - | ||
514 | return true; | ||
515 | } | ||
516 | + | ||
517 | static void gen_neon_trn_u8(TCGv_i32 t0, TCGv_i32 t1) | ||
518 | { | ||
519 | TCGv_i32 rd, tmp; | ||
520 | @@ -XXX,XX +XXX,XX @@ static void gen_neon_trn_u8(TCGv_i32 t0, TCGv_i32 t1) | ||
521 | tcg_gen_andi_i32(tmp, t0, 0xff00ff00); | ||
522 | tcg_gen_or_i32(t1, t1, tmp); | ||
523 | tcg_gen_mov_i32(t0, rd); | ||
524 | - | ||
525 | - tcg_temp_free_i32(tmp); | ||
526 | - tcg_temp_free_i32(rd); | ||
527 | } | ||
528 | |||
529 | static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1) | ||
530 | @@ -XXX,XX +XXX,XX @@ static void gen_neon_trn_u16(TCGv_i32 t0, TCGv_i32 t1) | ||
531 | tcg_gen_andi_i32(tmp, t0, 0xffff0000); | ||
532 | tcg_gen_or_i32(t1, t1, tmp); | ||
533 | tcg_gen_mov_i32(t0, rd); | ||
534 | - | ||
535 | - tcg_temp_free_i32(tmp); | ||
536 | - tcg_temp_free_i32(rd); | ||
537 | } | ||
538 | |||
539 | static bool trans_VTRN(DisasContext *s, arg_2misc *a) | ||
540 | @@ -XXX,XX +XXX,XX @@ static bool trans_VTRN(DisasContext *s, arg_2misc *a) | ||
541 | write_neon_element32(tmp, a->vd, pass, MO_32); | ||
542 | } | ||
543 | } | ||
544 | - tcg_temp_free_i32(tmp); | ||
545 | - tcg_temp_free_i32(tmp2); | ||
546 | return true; | ||
547 | } | ||
548 | |||
549 | -- | ||
550 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/arm/tcg/translate-sme.c | 28 ---------------------------- | ||
7 | 1 file changed, 28 deletions(-) | ||
8 | |||
9 | diff --git a/target/arm/tcg/translate-sme.c b/target/arm/tcg/translate-sme.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/arm/tcg/translate-sme.c | ||
12 | +++ b/target/arm/tcg/translate-sme.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static TCGv_ptr get_tile_rowcol(DisasContext *s, int esz, int rs, | ||
14 | /* Add the byte offset to env to produce the final pointer. */ | ||
15 | addr = tcg_temp_new_ptr(); | ||
16 | tcg_gen_ext_i32_ptr(addr, tmp); | ||
17 | - tcg_temp_free_i32(tmp); | ||
18 | tcg_gen_add_ptr(addr, addr, cpu_env); | ||
19 | |||
20 | return addr; | ||
21 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOVA(DisasContext *s, arg_MOVA *a) | ||
22 | h_fns[a->esz](t_za, t_zr, t_za, t_pg, t_desc); | ||
23 | } | ||
24 | } | ||
25 | - | ||
26 | - tcg_temp_free_ptr(t_za); | ||
27 | - tcg_temp_free_ptr(t_zr); | ||
28 | - tcg_temp_free_ptr(t_pg); | ||
29 | - | ||
30 | return true; | ||
31 | } | ||
32 | |||
33 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDST1(DisasContext *s, arg_LDST1 *a) | ||
34 | |||
35 | fns[a->esz][be][a->v][mte][a->st](cpu_env, t_za, t_pg, addr, | ||
36 | tcg_constant_i32(desc)); | ||
37 | - | ||
38 | - tcg_temp_free_ptr(t_za); | ||
39 | - tcg_temp_free_ptr(t_pg); | ||
40 | - tcg_temp_free_i64(addr); | ||
41 | return true; | ||
42 | } | ||
43 | |||
44 | @@ -XXX,XX +XXX,XX @@ static bool do_ldst_r(DisasContext *s, arg_ldstr *a, GenLdStR *fn) | ||
45 | base = get_tile_rowcol(s, MO_8, a->rv, imm, false); | ||
46 | |||
47 | fn(s, base, 0, svl, a->rn, imm * svl); | ||
48 | - | ||
49 | - tcg_temp_free_ptr(base); | ||
50 | return true; | ||
51 | } | ||
52 | |||
53 | @@ -XXX,XX +XXX,XX @@ static bool do_adda(DisasContext *s, arg_adda *a, MemOp esz, | ||
54 | pm = pred_full_reg_ptr(s, a->pm); | ||
55 | |||
56 | fn(za, zn, pn, pm, tcg_constant_i32(desc)); | ||
57 | - | ||
58 | - tcg_temp_free_ptr(za); | ||
59 | - tcg_temp_free_ptr(zn); | ||
60 | - tcg_temp_free_ptr(pn); | ||
61 | - tcg_temp_free_ptr(pm); | ||
62 | return true; | ||
63 | } | ||
64 | |||
65 | @@ -XXX,XX +XXX,XX @@ static bool do_outprod(DisasContext *s, arg_op *a, MemOp esz, | ||
66 | pm = pred_full_reg_ptr(s, a->pm); | ||
67 | |||
68 | fn(za, zn, zm, pn, pm, tcg_constant_i32(desc)); | ||
69 | - | ||
70 | - tcg_temp_free_ptr(za); | ||
71 | - tcg_temp_free_ptr(zn); | ||
72 | - tcg_temp_free_ptr(pn); | ||
73 | - tcg_temp_free_ptr(pm); | ||
74 | return true; | ||
75 | } | ||
76 | |||
77 | @@ -XXX,XX +XXX,XX @@ static bool do_outprod_fpst(DisasContext *s, arg_op *a, MemOp esz, | ||
78 | fpst = fpstatus_ptr(FPST_FPCR); | ||
79 | |||
80 | fn(za, zn, zm, pn, pm, fpst, tcg_constant_i32(desc)); | ||
81 | - | ||
82 | - tcg_temp_free_ptr(za); | ||
83 | - tcg_temp_free_ptr(zn); | ||
84 | - tcg_temp_free_ptr(pn); | ||
85 | - tcg_temp_free_ptr(pm); | ||
86 | - tcg_temp_free_ptr(fpst); | ||
87 | return true; | ||
88 | } | ||
89 | |||
90 | -- | ||
91 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/arm/tcg/translate.h | 2 -- | ||
7 | 1 file changed, 2 deletions(-) | ||
8 | |||
9 | diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/arm/tcg/translate.h | ||
12 | +++ b/target/arm/tcg/translate.h | ||
13 | @@ -XXX,XX +XXX,XX @@ static inline void set_pstate_bits(uint32_t bits) | ||
14 | tcg_gen_ld_i32(p, cpu_env, offsetof(CPUARMState, pstate)); | ||
15 | tcg_gen_ori_i32(p, p, bits); | ||
16 | tcg_gen_st_i32(p, cpu_env, offsetof(CPUARMState, pstate)); | ||
17 | - tcg_temp_free_i32(p); | ||
18 | } | ||
19 | |||
20 | /* Clear bits within PSTATE. */ | ||
21 | @@ -XXX,XX +XXX,XX @@ static inline void clear_pstate_bits(uint32_t bits) | ||
22 | tcg_gen_ld_i32(p, cpu_env, offsetof(CPUARMState, pstate)); | ||
23 | tcg_gen_andi_i32(p, p, ~bits); | ||
24 | tcg_gen_st_i32(p, cpu_env, offsetof(CPUARMState, pstate)); | ||
25 | - tcg_temp_free_i32(p); | ||
26 | } | ||
27 | |||
28 | /* If the singlestep state is Active-not-pending, advance to Active-pending. */ | ||
29 | -- | ||
30 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries, | ||
2 | therefore there's no need to record for later freeing. | ||
3 | 1 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
6 | --- | ||
7 | target/avr/translate.c | 19 ------------------- | ||
8 | 1 file changed, 19 deletions(-) | ||
9 | |||
10 | diff --git a/target/avr/translate.c b/target/avr/translate.c | ||
11 | index XXXXXXX..XXXXXXX 100644 | ||
12 | --- a/target/avr/translate.c | ||
13 | +++ b/target/avr/translate.c | ||
14 | @@ -XXX,XX +XXX,XX @@ struct DisasContext { | ||
15 | * tcg_gen_brcond_tl(skip_cond, skip_var0, skip_var1, skip_label); | ||
16 | * } | ||
17 | * | ||
18 | - * if (free_skip_var0) { | ||
19 | - * tcg_temp_free(skip_var0); | ||
20 | - * free_skip_var0 = false; | ||
21 | - * } | ||
22 | - * | ||
23 | * translate(ctx); | ||
24 | * | ||
25 | * if (skip_label) { | ||
26 | @@ -XXX,XX +XXX,XX @@ struct DisasContext { | ||
27 | TCGv skip_var0; | ||
28 | TCGv skip_var1; | ||
29 | TCGCond skip_cond; | ||
30 | - bool free_skip_var0; | ||
31 | }; | ||
32 | |||
33 | void avr_cpu_tcg_init(void) | ||
34 | @@ -XXX,XX +XXX,XX @@ static bool trans_SBRC(DisasContext *ctx, arg_SBRC *a) | ||
35 | |||
36 | ctx->skip_cond = TCG_COND_EQ; | ||
37 | ctx->skip_var0 = tcg_temp_new(); | ||
38 | - ctx->free_skip_var0 = true; | ||
39 | |||
40 | tcg_gen_andi_tl(ctx->skip_var0, Rr, 1 << a->bit); | ||
41 | return true; | ||
42 | @@ -XXX,XX +XXX,XX @@ static bool trans_SBRS(DisasContext *ctx, arg_SBRS *a) | ||
43 | |||
44 | ctx->skip_cond = TCG_COND_NE; | ||
45 | ctx->skip_var0 = tcg_temp_new(); | ||
46 | - ctx->free_skip_var0 = true; | ||
47 | |||
48 | tcg_gen_andi_tl(ctx->skip_var0, Rr, 1 << a->bit); | ||
49 | return true; | ||
50 | @@ -XXX,XX +XXX,XX @@ static bool trans_SBIC(DisasContext *ctx, arg_SBIC *a) | ||
51 | tcg_gen_andi_tl(temp, temp, 1 << a->bit); | ||
52 | ctx->skip_cond = TCG_COND_EQ; | ||
53 | ctx->skip_var0 = temp; | ||
54 | - ctx->free_skip_var0 = true; | ||
55 | |||
56 | return true; | ||
57 | } | ||
58 | @@ -XXX,XX +XXX,XX @@ static bool trans_SBIS(DisasContext *ctx, arg_SBIS *a) | ||
59 | tcg_gen_andi_tl(temp, temp, 1 << a->bit); | ||
60 | ctx->skip_cond = TCG_COND_NE; | ||
61 | ctx->skip_var0 = temp; | ||
62 | - ctx->free_skip_var0 = true; | ||
63 | |||
64 | return true; | ||
65 | } | ||
66 | @@ -XXX,XX +XXX,XX @@ static bool canonicalize_skip(DisasContext *ctx) | ||
67 | ctx->skip_cond = TCG_COND_NE; | ||
68 | break; | ||
69 | } | ||
70 | - if (ctx->free_skip_var0) { | ||
71 | - tcg_temp_free(ctx->skip_var0); | ||
72 | - ctx->free_skip_var0 = false; | ||
73 | - } | ||
74 | ctx->skip_var0 = cpu_skip; | ||
75 | return true; | ||
76 | } | ||
77 | @@ -XXX,XX +XXX,XX @@ static void avr_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) | ||
78 | * This ensures that cpu_skip is non-zero after the label | ||
79 | * if and only if the skipped insn itself sets a skip. | ||
80 | */ | ||
81 | - ctx->free_skip_var0 = true; | ||
82 | ctx->skip_var0 = tcg_temp_new(); | ||
83 | tcg_gen_mov_tl(ctx->skip_var0, cpu_skip); | ||
84 | tcg_gen_movi_tl(cpu_skip, 0); | ||
85 | @@ -XXX,XX +XXX,XX @@ static void avr_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) | ||
86 | ctx->skip_var1, skip_label); | ||
87 | ctx->skip_var1 = NULL; | ||
88 | } | ||
89 | - if (ctx->free_skip_var0) { | ||
90 | - tcg_temp_free(ctx->skip_var0); | ||
91 | - ctx->free_skip_var0 = false; | ||
92 | - } | ||
93 | ctx->skip_cond = TCG_COND_NEVER; | ||
94 | ctx->skip_var0 = NULL; | ||
95 | } | ||
96 | -- | ||
97 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | This variable is not used, only allocated and freed. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/avr/translate.c | 4 ---- | ||
7 | 1 file changed, 4 deletions(-) | ||
8 | |||
9 | diff --git a/target/avr/translate.c b/target/avr/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/avr/translate.c | ||
12 | +++ b/target/avr/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static bool trans_EOR(DisasContext *ctx, arg_EOR *a) | ||
14 | static bool trans_COM(DisasContext *ctx, arg_COM *a) | ||
15 | { | ||
16 | TCGv Rd = cpu_r[a->rd]; | ||
17 | - TCGv R = tcg_temp_new_i32(); | ||
18 | |||
19 | tcg_gen_xori_tl(Rd, Rd, 0xff); | ||
20 | |||
21 | @@ -XXX,XX +XXX,XX @@ static bool trans_COM(DisasContext *ctx, arg_COM *a) | ||
22 | tcg_gen_movi_tl(cpu_Cf, 1); /* Cf = 1 */ | ||
23 | tcg_gen_movi_tl(cpu_Vf, 0); /* Vf = 0 */ | ||
24 | gen_ZNSf(Rd); | ||
25 | - | ||
26 | - tcg_temp_free_i32(R); | ||
27 | - | ||
28 | return true; | ||
29 | } | ||
30 | |||
31 | -- | ||
32 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/avr/translate.c | 228 ----------------------------------------- | ||
7 | 1 file changed, 228 deletions(-) | ||
8 | |||
9 | diff --git a/target/avr/translate.c b/target/avr/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/avr/translate.c | ||
12 | +++ b/target/avr/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static void gen_add_CHf(TCGv R, TCGv Rd, TCGv Rr) | ||
14 | tcg_gen_shri_tl(cpu_Cf, t1, 7); /* Cf = t1(7) */ | ||
15 | tcg_gen_shri_tl(cpu_Hf, t1, 3); /* Hf = t1(3) */ | ||
16 | tcg_gen_andi_tl(cpu_Hf, cpu_Hf, 1); | ||
17 | - | ||
18 | - tcg_temp_free_i32(t3); | ||
19 | - tcg_temp_free_i32(t2); | ||
20 | - tcg_temp_free_i32(t1); | ||
21 | } | ||
22 | |||
23 | static void gen_add_Vf(TCGv R, TCGv Rd, TCGv Rr) | ||
24 | @@ -XXX,XX +XXX,XX @@ static void gen_add_Vf(TCGv R, TCGv Rd, TCGv Rr) | ||
25 | tcg_gen_andc_tl(t1, t1, t2); | ||
26 | |||
27 | tcg_gen_shri_tl(cpu_Vf, t1, 7); /* Vf = t1(7) */ | ||
28 | - | ||
29 | - tcg_temp_free_i32(t2); | ||
30 | - tcg_temp_free_i32(t1); | ||
31 | } | ||
32 | |||
33 | static void gen_sub_CHf(TCGv R, TCGv Rd, TCGv Rr) | ||
34 | @@ -XXX,XX +XXX,XX @@ static void gen_sub_CHf(TCGv R, TCGv Rd, TCGv Rr) | ||
35 | tcg_gen_shri_tl(cpu_Cf, t2, 7); /* Cf = t2(7) */ | ||
36 | tcg_gen_shri_tl(cpu_Hf, t2, 3); /* Hf = t2(3) */ | ||
37 | tcg_gen_andi_tl(cpu_Hf, cpu_Hf, 1); | ||
38 | - | ||
39 | - tcg_temp_free_i32(t3); | ||
40 | - tcg_temp_free_i32(t2); | ||
41 | - tcg_temp_free_i32(t1); | ||
42 | } | ||
43 | |||
44 | static void gen_sub_Vf(TCGv R, TCGv Rd, TCGv Rr) | ||
45 | @@ -XXX,XX +XXX,XX @@ static void gen_sub_Vf(TCGv R, TCGv Rd, TCGv Rr) | ||
46 | tcg_gen_and_tl(t1, t1, t2); | ||
47 | |||
48 | tcg_gen_shri_tl(cpu_Vf, t1, 7); /* Vf = t1(7) */ | ||
49 | - | ||
50 | - tcg_temp_free_i32(t2); | ||
51 | - tcg_temp_free_i32(t1); | ||
52 | } | ||
53 | |||
54 | static void gen_NSf(TCGv R) | ||
55 | @@ -XXX,XX +XXX,XX @@ static bool trans_ADD(DisasContext *ctx, arg_ADD *a) | ||
56 | |||
57 | /* update output registers */ | ||
58 | tcg_gen_mov_tl(Rd, R); | ||
59 | - | ||
60 | - tcg_temp_free_i32(R); | ||
61 | - | ||
62 | return true; | ||
63 | } | ||
64 | |||
65 | @@ -XXX,XX +XXX,XX @@ static bool trans_ADC(DisasContext *ctx, arg_ADC *a) | ||
66 | |||
67 | /* update output registers */ | ||
68 | tcg_gen_mov_tl(Rd, R); | ||
69 | - | ||
70 | - tcg_temp_free_i32(R); | ||
71 | - | ||
72 | return true; | ||
73 | } | ||
74 | |||
75 | @@ -XXX,XX +XXX,XX @@ static bool trans_ADIW(DisasContext *ctx, arg_ADIW *a) | ||
76 | /* update output registers */ | ||
77 | tcg_gen_andi_tl(RdL, R, 0xff); | ||
78 | tcg_gen_shri_tl(RdH, R, 8); | ||
79 | - | ||
80 | - tcg_temp_free_i32(Rd); | ||
81 | - tcg_temp_free_i32(R); | ||
82 | - | ||
83 | return true; | ||
84 | } | ||
85 | |||
86 | @@ -XXX,XX +XXX,XX @@ static bool trans_SUB(DisasContext *ctx, arg_SUB *a) | ||
87 | |||
88 | /* update output registers */ | ||
89 | tcg_gen_mov_tl(Rd, R); | ||
90 | - | ||
91 | - tcg_temp_free_i32(R); | ||
92 | - | ||
93 | return true; | ||
94 | } | ||
95 | |||
96 | @@ -XXX,XX +XXX,XX @@ static bool trans_SUBI(DisasContext *ctx, arg_SUBI *a) | ||
97 | |||
98 | /* update output registers */ | ||
99 | tcg_gen_mov_tl(Rd, R); | ||
100 | - | ||
101 | - tcg_temp_free_i32(R); | ||
102 | - tcg_temp_free_i32(Rr); | ||
103 | - | ||
104 | return true; | ||
105 | } | ||
106 | |||
107 | @@ -XXX,XX +XXX,XX @@ static bool trans_SBC(DisasContext *ctx, arg_SBC *a) | ||
108 | |||
109 | /* update output registers */ | ||
110 | tcg_gen_mov_tl(Rd, R); | ||
111 | - | ||
112 | - tcg_temp_free_i32(zero); | ||
113 | - tcg_temp_free_i32(R); | ||
114 | - | ||
115 | return true; | ||
116 | } | ||
117 | |||
118 | @@ -XXX,XX +XXX,XX @@ static bool trans_SBCI(DisasContext *ctx, arg_SBCI *a) | ||
119 | |||
120 | /* update output registers */ | ||
121 | tcg_gen_mov_tl(Rd, R); | ||
122 | - | ||
123 | - tcg_temp_free_i32(zero); | ||
124 | - tcg_temp_free_i32(R); | ||
125 | - tcg_temp_free_i32(Rr); | ||
126 | - | ||
127 | return true; | ||
128 | } | ||
129 | |||
130 | @@ -XXX,XX +XXX,XX @@ static bool trans_SBIW(DisasContext *ctx, arg_SBIW *a) | ||
131 | /* update output registers */ | ||
132 | tcg_gen_andi_tl(RdL, R, 0xff); | ||
133 | tcg_gen_shri_tl(RdH, R, 8); | ||
134 | - | ||
135 | - tcg_temp_free_i32(Rd); | ||
136 | - tcg_temp_free_i32(R); | ||
137 | - | ||
138 | return true; | ||
139 | } | ||
140 | |||
141 | @@ -XXX,XX +XXX,XX @@ static bool trans_AND(DisasContext *ctx, arg_AND *a) | ||
142 | |||
143 | /* update output registers */ | ||
144 | tcg_gen_mov_tl(Rd, R); | ||
145 | - | ||
146 | - tcg_temp_free_i32(R); | ||
147 | - | ||
148 | return true; | ||
149 | } | ||
150 | |||
151 | @@ -XXX,XX +XXX,XX @@ static bool trans_OR(DisasContext *ctx, arg_OR *a) | ||
152 | |||
153 | /* update output registers */ | ||
154 | tcg_gen_mov_tl(Rd, R); | ||
155 | - | ||
156 | - tcg_temp_free_i32(R); | ||
157 | - | ||
158 | return true; | ||
159 | } | ||
160 | |||
161 | @@ -XXX,XX +XXX,XX @@ static bool trans_NEG(DisasContext *ctx, arg_NEG *a) | ||
162 | |||
163 | /* update output registers */ | ||
164 | tcg_gen_mov_tl(Rd, R); | ||
165 | - | ||
166 | - tcg_temp_free_i32(t0); | ||
167 | - tcg_temp_free_i32(R); | ||
168 | - | ||
169 | return true; | ||
170 | } | ||
171 | |||
172 | @@ -XXX,XX +XXX,XX @@ static bool trans_MUL(DisasContext *ctx, arg_MUL *a) | ||
173 | /* update status register */ | ||
174 | tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */ | ||
175 | tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */ | ||
176 | - | ||
177 | - tcg_temp_free_i32(R); | ||
178 | - | ||
179 | return true; | ||
180 | } | ||
181 | |||
182 | @@ -XXX,XX +XXX,XX @@ static bool trans_MULS(DisasContext *ctx, arg_MULS *a) | ||
183 | /* update status register */ | ||
184 | tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */ | ||
185 | tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */ | ||
186 | - | ||
187 | - tcg_temp_free_i32(t1); | ||
188 | - tcg_temp_free_i32(t0); | ||
189 | - tcg_temp_free_i32(R); | ||
190 | - | ||
191 | return true; | ||
192 | } | ||
193 | |||
194 | @@ -XXX,XX +XXX,XX @@ static bool trans_MULSU(DisasContext *ctx, arg_MULSU *a) | ||
195 | /* update status register */ | ||
196 | tcg_gen_shri_tl(cpu_Cf, R, 15); /* Cf = R(15) */ | ||
197 | tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_Zf, R, 0); /* Zf = R == 0 */ | ||
198 | - | ||
199 | - tcg_temp_free_i32(t0); | ||
200 | - tcg_temp_free_i32(R); | ||
201 | - | ||
202 | return true; | ||
203 | } | ||
204 | |||
205 | @@ -XXX,XX +XXX,XX @@ static bool trans_FMUL(DisasContext *ctx, arg_FMUL *a) | ||
206 | tcg_gen_andi_tl(R0, R, 0xff); | ||
207 | tcg_gen_shri_tl(R1, R, 8); | ||
208 | tcg_gen_andi_tl(R1, R1, 0xff); | ||
209 | - | ||
210 | - | ||
211 | - tcg_temp_free_i32(R); | ||
212 | - | ||
213 | return true; | ||
214 | } | ||
215 | |||
216 | @@ -XXX,XX +XXX,XX @@ static bool trans_FMULS(DisasContext *ctx, arg_FMULS *a) | ||
217 | tcg_gen_andi_tl(R0, R, 0xff); | ||
218 | tcg_gen_shri_tl(R1, R, 8); | ||
219 | tcg_gen_andi_tl(R1, R1, 0xff); | ||
220 | - | ||
221 | - tcg_temp_free_i32(t1); | ||
222 | - tcg_temp_free_i32(t0); | ||
223 | - tcg_temp_free_i32(R); | ||
224 | - | ||
225 | return true; | ||
226 | } | ||
227 | |||
228 | @@ -XXX,XX +XXX,XX @@ static bool trans_FMULSU(DisasContext *ctx, arg_FMULSU *a) | ||
229 | tcg_gen_andi_tl(R0, R, 0xff); | ||
230 | tcg_gen_shri_tl(R1, R, 8); | ||
231 | tcg_gen_andi_tl(R1, R1, 0xff); | ||
232 | - | ||
233 | - tcg_temp_free_i32(t0); | ||
234 | - tcg_temp_free_i32(R); | ||
235 | - | ||
236 | return true; | ||
237 | } | ||
238 | |||
239 | @@ -XXX,XX +XXX,XX @@ static void gen_jmp_z(DisasContext *ctx) | ||
240 | static void gen_push_ret(DisasContext *ctx, int ret) | ||
241 | { | ||
242 | if (avr_feature(ctx->env, AVR_FEATURE_1_BYTE_PC)) { | ||
243 | - | ||
244 | TCGv t0 = tcg_const_i32((ret & 0x0000ff)); | ||
245 | |||
246 | tcg_gen_qemu_st_tl(t0, cpu_sp, MMU_DATA_IDX, MO_UB); | ||
247 | tcg_gen_subi_tl(cpu_sp, cpu_sp, 1); | ||
248 | - | ||
249 | - tcg_temp_free_i32(t0); | ||
250 | } else if (avr_feature(ctx->env, AVR_FEATURE_2_BYTE_PC)) { | ||
251 | - | ||
252 | TCGv t0 = tcg_const_i32((ret & 0x00ffff)); | ||
253 | |||
254 | tcg_gen_subi_tl(cpu_sp, cpu_sp, 1); | ||
255 | tcg_gen_qemu_st_tl(t0, cpu_sp, MMU_DATA_IDX, MO_BEUW); | ||
256 | tcg_gen_subi_tl(cpu_sp, cpu_sp, 1); | ||
257 | - | ||
258 | - tcg_temp_free_i32(t0); | ||
259 | - | ||
260 | } else if (avr_feature(ctx->env, AVR_FEATURE_3_BYTE_PC)) { | ||
261 | - | ||
262 | TCGv lo = tcg_const_i32((ret & 0x0000ff)); | ||
263 | TCGv hi = tcg_const_i32((ret & 0xffff00) >> 8); | ||
264 | |||
265 | @@ -XXX,XX +XXX,XX @@ static void gen_push_ret(DisasContext *ctx, int ret) | ||
266 | tcg_gen_subi_tl(cpu_sp, cpu_sp, 2); | ||
267 | tcg_gen_qemu_st_tl(hi, cpu_sp, MMU_DATA_IDX, MO_BEUW); | ||
268 | tcg_gen_subi_tl(cpu_sp, cpu_sp, 1); | ||
269 | - | ||
270 | - tcg_temp_free_i32(lo); | ||
271 | - tcg_temp_free_i32(hi); | ||
272 | } | ||
273 | } | ||
274 | |||
275 | @@ -XXX,XX +XXX,XX @@ static void gen_pop_ret(DisasContext *ctx, TCGv ret) | ||
276 | tcg_gen_qemu_ld_tl(lo, cpu_sp, MMU_DATA_IDX, MO_UB); | ||
277 | |||
278 | tcg_gen_deposit_tl(ret, lo, hi, 8, 16); | ||
279 | - | ||
280 | - tcg_temp_free_i32(lo); | ||
281 | - tcg_temp_free_i32(hi); | ||
282 | } | ||
283 | } | ||
284 | |||
285 | @@ -XXX,XX +XXX,XX @@ static bool trans_CP(DisasContext *ctx, arg_CP *a) | ||
286 | gen_sub_CHf(R, Rd, Rr); | ||
287 | gen_sub_Vf(R, Rd, Rr); | ||
288 | gen_ZNSf(R); | ||
289 | - | ||
290 | - tcg_temp_free_i32(R); | ||
291 | - | ||
292 | return true; | ||
293 | } | ||
294 | |||
295 | @@ -XXX,XX +XXX,XX @@ static bool trans_CPC(DisasContext *ctx, arg_CPC *a) | ||
296 | * cleared otherwise. | ||
297 | */ | ||
298 | tcg_gen_movcond_tl(TCG_COND_EQ, cpu_Zf, R, zero, cpu_Zf, zero); | ||
299 | - | ||
300 | - tcg_temp_free_i32(zero); | ||
301 | - tcg_temp_free_i32(R); | ||
302 | - | ||
303 | return true; | ||
304 | } | ||
305 | |||
306 | @@ -XXX,XX +XXX,XX @@ static bool trans_CPI(DisasContext *ctx, arg_CPI *a) | ||
307 | gen_sub_CHf(R, Rd, Rr); | ||
308 | gen_sub_Vf(R, Rd, Rr); | ||
309 | gen_ZNSf(R); | ||
310 | - | ||
311 | - tcg_temp_free_i32(R); | ||
312 | - tcg_temp_free_i32(Rr); | ||
313 | - | ||
314 | return true; | ||
315 | } | ||
316 | |||
317 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDS(DisasContext *ctx, arg_LDS *a) | ||
318 | tcg_gen_ori_tl(addr, addr, a->imm); | ||
319 | |||
320 | gen_data_load(ctx, Rd, addr); | ||
321 | - | ||
322 | - tcg_temp_free_i32(addr); | ||
323 | - | ||
324 | return true; | ||
325 | } | ||
326 | |||
327 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDX1(DisasContext *ctx, arg_LDX1 *a) | ||
328 | TCGv addr = gen_get_xaddr(); | ||
329 | |||
330 | gen_data_load(ctx, Rd, addr); | ||
331 | - | ||
332 | - tcg_temp_free_i32(addr); | ||
333 | - | ||
334 | return true; | ||
335 | } | ||
336 | |||
337 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDX2(DisasContext *ctx, arg_LDX2 *a) | ||
338 | tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */ | ||
339 | |||
340 | gen_set_xaddr(addr); | ||
341 | - | ||
342 | - tcg_temp_free_i32(addr); | ||
343 | - | ||
344 | return true; | ||
345 | } | ||
346 | |||
347 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDX3(DisasContext *ctx, arg_LDX3 *a) | ||
348 | tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */ | ||
349 | gen_data_load(ctx, Rd, addr); | ||
350 | gen_set_xaddr(addr); | ||
351 | - | ||
352 | - tcg_temp_free_i32(addr); | ||
353 | - | ||
354 | return true; | ||
355 | } | ||
356 | |||
357 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDY2(DisasContext *ctx, arg_LDY2 *a) | ||
358 | tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */ | ||
359 | |||
360 | gen_set_yaddr(addr); | ||
361 | - | ||
362 | - tcg_temp_free_i32(addr); | ||
363 | - | ||
364 | return true; | ||
365 | } | ||
366 | |||
367 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDY3(DisasContext *ctx, arg_LDY3 *a) | ||
368 | tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */ | ||
369 | gen_data_load(ctx, Rd, addr); | ||
370 | gen_set_yaddr(addr); | ||
371 | - | ||
372 | - tcg_temp_free_i32(addr); | ||
373 | - | ||
374 | return true; | ||
375 | } | ||
376 | |||
377 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDDY(DisasContext *ctx, arg_LDDY *a) | ||
378 | |||
379 | tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */ | ||
380 | gen_data_load(ctx, Rd, addr); | ||
381 | - | ||
382 | - tcg_temp_free_i32(addr); | ||
383 | - | ||
384 | return true; | ||
385 | } | ||
386 | |||
387 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDZ2(DisasContext *ctx, arg_LDZ2 *a) | ||
388 | tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */ | ||
389 | |||
390 | gen_set_zaddr(addr); | ||
391 | - | ||
392 | - tcg_temp_free_i32(addr); | ||
393 | - | ||
394 | return true; | ||
395 | } | ||
396 | |||
397 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDZ3(DisasContext *ctx, arg_LDZ3 *a) | ||
398 | gen_data_load(ctx, Rd, addr); | ||
399 | |||
400 | gen_set_zaddr(addr); | ||
401 | - | ||
402 | - tcg_temp_free_i32(addr); | ||
403 | - | ||
404 | return true; | ||
405 | } | ||
406 | |||
407 | @@ -XXX,XX +XXX,XX @@ static bool trans_LDDZ(DisasContext *ctx, arg_LDDZ *a) | ||
408 | |||
409 | tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */ | ||
410 | gen_data_load(ctx, Rd, addr); | ||
411 | - | ||
412 | - tcg_temp_free_i32(addr); | ||
413 | - | ||
414 | return true; | ||
415 | } | ||
416 | |||
417 | @@ -XXX,XX +XXX,XX @@ static bool trans_STS(DisasContext *ctx, arg_STS *a) | ||
418 | tcg_gen_shli_tl(addr, addr, 16); | ||
419 | tcg_gen_ori_tl(addr, addr, a->imm); | ||
420 | gen_data_store(ctx, Rd, addr); | ||
421 | - | ||
422 | - tcg_temp_free_i32(addr); | ||
423 | - | ||
424 | return true; | ||
425 | } | ||
426 | |||
427 | @@ -XXX,XX +XXX,XX @@ static bool trans_STX1(DisasContext *ctx, arg_STX1 *a) | ||
428 | TCGv addr = gen_get_xaddr(); | ||
429 | |||
430 | gen_data_store(ctx, Rd, addr); | ||
431 | - | ||
432 | - tcg_temp_free_i32(addr); | ||
433 | - | ||
434 | return true; | ||
435 | } | ||
436 | |||
437 | @@ -XXX,XX +XXX,XX @@ static bool trans_STX2(DisasContext *ctx, arg_STX2 *a) | ||
438 | gen_data_store(ctx, Rd, addr); | ||
439 | tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */ | ||
440 | gen_set_xaddr(addr); | ||
441 | - | ||
442 | - tcg_temp_free_i32(addr); | ||
443 | - | ||
444 | return true; | ||
445 | } | ||
446 | |||
447 | @@ -XXX,XX +XXX,XX @@ static bool trans_STX3(DisasContext *ctx, arg_STX3 *a) | ||
448 | tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */ | ||
449 | gen_data_store(ctx, Rd, addr); | ||
450 | gen_set_xaddr(addr); | ||
451 | - | ||
452 | - tcg_temp_free_i32(addr); | ||
453 | - | ||
454 | return true; | ||
455 | } | ||
456 | |||
457 | @@ -XXX,XX +XXX,XX @@ static bool trans_STY2(DisasContext *ctx, arg_STY2 *a) | ||
458 | gen_data_store(ctx, Rd, addr); | ||
459 | tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */ | ||
460 | gen_set_yaddr(addr); | ||
461 | - | ||
462 | - tcg_temp_free_i32(addr); | ||
463 | - | ||
464 | return true; | ||
465 | } | ||
466 | |||
467 | @@ -XXX,XX +XXX,XX @@ static bool trans_STY3(DisasContext *ctx, arg_STY3 *a) | ||
468 | tcg_gen_subi_tl(addr, addr, 1); /* addr = addr - 1 */ | ||
469 | gen_data_store(ctx, Rd, addr); | ||
470 | gen_set_yaddr(addr); | ||
471 | - | ||
472 | - tcg_temp_free_i32(addr); | ||
473 | - | ||
474 | return true; | ||
475 | } | ||
476 | |||
477 | @@ -XXX,XX +XXX,XX @@ static bool trans_STDY(DisasContext *ctx, arg_STDY *a) | ||
478 | |||
479 | tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */ | ||
480 | gen_data_store(ctx, Rd, addr); | ||
481 | - | ||
482 | - tcg_temp_free_i32(addr); | ||
483 | - | ||
484 | return true; | ||
485 | } | ||
486 | |||
487 | @@ -XXX,XX +XXX,XX @@ static bool trans_STZ2(DisasContext *ctx, arg_STZ2 *a) | ||
488 | tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */ | ||
489 | |||
490 | gen_set_zaddr(addr); | ||
491 | - | ||
492 | - tcg_temp_free_i32(addr); | ||
493 | - | ||
494 | return true; | ||
495 | } | ||
496 | |||
497 | @@ -XXX,XX +XXX,XX @@ static bool trans_STZ3(DisasContext *ctx, arg_STZ3 *a) | ||
498 | gen_data_store(ctx, Rd, addr); | ||
499 | |||
500 | gen_set_zaddr(addr); | ||
501 | - | ||
502 | - tcg_temp_free_i32(addr); | ||
503 | - | ||
504 | return true; | ||
505 | } | ||
506 | |||
507 | @@ -XXX,XX +XXX,XX @@ static bool trans_STDZ(DisasContext *ctx, arg_STDZ *a) | ||
508 | |||
509 | tcg_gen_addi_tl(addr, addr, a->imm); /* addr = addr + q */ | ||
510 | gen_data_store(ctx, Rd, addr); | ||
511 | - | ||
512 | - tcg_temp_free_i32(addr); | ||
513 | - | ||
514 | return true; | ||
515 | } | ||
516 | |||
517 | @@ -XXX,XX +XXX,XX @@ static bool trans_LPM1(DisasContext *ctx, arg_LPM1 *a) | ||
518 | tcg_gen_shli_tl(addr, H, 8); /* addr = H:L */ | ||
519 | tcg_gen_or_tl(addr, addr, L); | ||
520 | tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */ | ||
521 | - | ||
522 | - tcg_temp_free_i32(addr); | ||
523 | - | ||
524 | return true; | ||
525 | } | ||
526 | |||
527 | @@ -XXX,XX +XXX,XX @@ static bool trans_LPM2(DisasContext *ctx, arg_LPM2 *a) | ||
528 | tcg_gen_shli_tl(addr, H, 8); /* addr = H:L */ | ||
529 | tcg_gen_or_tl(addr, addr, L); | ||
530 | tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */ | ||
531 | - | ||
532 | - tcg_temp_free_i32(addr); | ||
533 | - | ||
534 | return true; | ||
535 | } | ||
536 | |||
537 | @@ -XXX,XX +XXX,XX @@ static bool trans_LPMX(DisasContext *ctx, arg_LPMX *a) | ||
538 | tcg_gen_andi_tl(L, addr, 0xff); | ||
539 | tcg_gen_shri_tl(addr, addr, 8); | ||
540 | tcg_gen_andi_tl(H, addr, 0xff); | ||
541 | - | ||
542 | - tcg_temp_free_i32(addr); | ||
543 | - | ||
544 | return true; | ||
545 | } | ||
546 | |||
547 | @@ -XXX,XX +XXX,XX @@ static bool trans_ELPM1(DisasContext *ctx, arg_ELPM1 *a) | ||
548 | TCGv addr = gen_get_zaddr(); | ||
549 | |||
550 | tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */ | ||
551 | - | ||
552 | - tcg_temp_free_i32(addr); | ||
553 | - | ||
554 | return true; | ||
555 | } | ||
556 | |||
557 | @@ -XXX,XX +XXX,XX @@ static bool trans_ELPM2(DisasContext *ctx, arg_ELPM2 *a) | ||
558 | TCGv addr = gen_get_zaddr(); | ||
559 | |||
560 | tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */ | ||
561 | - | ||
562 | - tcg_temp_free_i32(addr); | ||
563 | - | ||
564 | return true; | ||
565 | } | ||
566 | |||
567 | @@ -XXX,XX +XXX,XX @@ static bool trans_ELPMX(DisasContext *ctx, arg_ELPMX *a) | ||
568 | tcg_gen_qemu_ld8u(Rd, addr, MMU_CODE_IDX); /* Rd = mem[addr] */ | ||
569 | tcg_gen_addi_tl(addr, addr, 1); /* addr = addr + 1 */ | ||
570 | gen_set_zaddr(addr); | ||
571 | - | ||
572 | - tcg_temp_free_i32(addr); | ||
573 | - | ||
574 | return true; | ||
575 | } | ||
576 | |||
577 | @@ -XXX,XX +XXX,XX @@ static bool trans_IN(DisasContext *ctx, arg_IN *a) | ||
578 | TCGv port = tcg_const_i32(a->imm); | ||
579 | |||
580 | gen_helper_inb(Rd, cpu_env, port); | ||
581 | - | ||
582 | - tcg_temp_free_i32(port); | ||
583 | - | ||
584 | return true; | ||
585 | } | ||
586 | |||
587 | @@ -XXX,XX +XXX,XX @@ static bool trans_OUT(DisasContext *ctx, arg_OUT *a) | ||
588 | TCGv port = tcg_const_i32(a->imm); | ||
589 | |||
590 | gen_helper_outb(cpu_env, port, Rd); | ||
591 | - | ||
592 | - tcg_temp_free_i32(port); | ||
593 | - | ||
594 | return true; | ||
595 | } | ||
596 | |||
597 | @@ -XXX,XX +XXX,XX @@ static bool trans_XCH(DisasContext *ctx, arg_XCH *a) | ||
598 | gen_data_load(ctx, t0, addr); | ||
599 | gen_data_store(ctx, Rd, addr); | ||
600 | tcg_gen_mov_tl(Rd, t0); | ||
601 | - | ||
602 | - tcg_temp_free_i32(t0); | ||
603 | - tcg_temp_free_i32(addr); | ||
604 | - | ||
605 | return true; | ||
606 | } | ||
607 | |||
608 | @@ -XXX,XX +XXX,XX @@ static bool trans_LAS(DisasContext *ctx, arg_LAS *a) | ||
609 | tcg_gen_or_tl(t1, t0, Rr); | ||
610 | tcg_gen_mov_tl(Rr, t0); /* Rr = t0 */ | ||
611 | gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */ | ||
612 | - | ||
613 | - tcg_temp_free_i32(t1); | ||
614 | - tcg_temp_free_i32(t0); | ||
615 | - tcg_temp_free_i32(addr); | ||
616 | - | ||
617 | return true; | ||
618 | } | ||
619 | |||
620 | @@ -XXX,XX +XXX,XX @@ static bool trans_LAC(DisasContext *ctx, arg_LAC *a) | ||
621 | tcg_gen_andc_tl(t1, t0, Rr); /* t1 = t0 & (0xff - Rr) = t0 & ~Rr */ | ||
622 | tcg_gen_mov_tl(Rr, t0); /* Rr = t0 */ | ||
623 | gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */ | ||
624 | - | ||
625 | - tcg_temp_free_i32(t1); | ||
626 | - tcg_temp_free_i32(t0); | ||
627 | - tcg_temp_free_i32(addr); | ||
628 | - | ||
629 | return true; | ||
630 | } | ||
631 | |||
632 | @@ -XXX,XX +XXX,XX @@ static bool trans_LAT(DisasContext *ctx, arg_LAT *a) | ||
633 | tcg_gen_xor_tl(t1, t0, Rd); | ||
634 | tcg_gen_mov_tl(Rd, t0); /* Rd = t0 */ | ||
635 | gen_data_store(ctx, t1, addr); /* mem[addr] = t1 */ | ||
636 | - | ||
637 | - tcg_temp_free_i32(t1); | ||
638 | - tcg_temp_free_i32(t0); | ||
639 | - tcg_temp_free_i32(addr); | ||
640 | - | ||
641 | return true; | ||
642 | } | ||
643 | |||
644 | @@ -XXX,XX +XXX,XX @@ static bool trans_ROR(DisasContext *ctx, arg_ROR *a) | ||
645 | |||
646 | /* update status register */ | ||
647 | gen_rshift_ZNVSf(Rd); | ||
648 | - | ||
649 | - tcg_temp_free_i32(t0); | ||
650 | - | ||
651 | return true; | ||
652 | } | ||
653 | |||
654 | @@ -XXX,XX +XXX,XX @@ static bool trans_ASR(DisasContext *ctx, arg_ASR *a) | ||
655 | |||
656 | /* update status register */ | ||
657 | gen_rshift_ZNVSf(Rd); | ||
658 | - | ||
659 | - tcg_temp_free_i32(t0); | ||
660 | - | ||
661 | return true; | ||
662 | } | ||
663 | |||
664 | @@ -XXX,XX +XXX,XX @@ static bool trans_SWAP(DisasContext *ctx, arg_SWAP *a) | ||
665 | tcg_gen_andi_tl(t1, Rd, 0xf0); | ||
666 | tcg_gen_shri_tl(t1, t1, 4); | ||
667 | tcg_gen_or_tl(Rd, t0, t1); | ||
668 | - | ||
669 | - tcg_temp_free_i32(t1); | ||
670 | - tcg_temp_free_i32(t0); | ||
671 | - | ||
672 | return true; | ||
673 | } | ||
674 | |||
675 | @@ -XXX,XX +XXX,XX @@ static bool trans_SBI(DisasContext *ctx, arg_SBI *a) | ||
676 | gen_helper_inb(data, cpu_env, port); | ||
677 | tcg_gen_ori_tl(data, data, 1 << a->bit); | ||
678 | gen_helper_outb(cpu_env, port, data); | ||
679 | - | ||
680 | - tcg_temp_free_i32(port); | ||
681 | - tcg_temp_free_i32(data); | ||
682 | - | ||
683 | return true; | ||
684 | } | ||
685 | |||
686 | @@ -XXX,XX +XXX,XX @@ static bool trans_CBI(DisasContext *ctx, arg_CBI *a) | ||
687 | gen_helper_inb(data, cpu_env, port); | ||
688 | tcg_gen_andi_tl(data, data, ~(1 << a->bit)); | ||
689 | gen_helper_outb(cpu_env, port, data); | ||
690 | - | ||
691 | - tcg_temp_free_i32(data); | ||
692 | - tcg_temp_free_i32(port); | ||
693 | - | ||
694 | return true; | ||
695 | } | ||
696 | |||
697 | @@ -XXX,XX +XXX,XX @@ static bool trans_BLD(DisasContext *ctx, arg_BLD *a) | ||
698 | tcg_gen_andi_tl(Rd, Rd, ~(1u << a->bit)); /* clear bit */ | ||
699 | tcg_gen_shli_tl(t1, cpu_Tf, a->bit); /* create mask */ | ||
700 | tcg_gen_or_tl(Rd, Rd, t1); | ||
701 | - | ||
702 | - tcg_temp_free_i32(t1); | ||
703 | - | ||
704 | return true; | ||
705 | } | ||
706 | |||
707 | -- | ||
708 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/cris/translate.c | 20 -------------------- | ||
7 | 1 file changed, 20 deletions(-) | ||
8 | |||
9 | diff --git a/target/cris/translate.c b/target/cris/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/cris/translate.c | ||
12 | +++ b/target/cris/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static inline void cris_alu_alloc_temps(DisasContext *dc, int size, TCGv *t) | ||
14 | } | ||
15 | } | ||
16 | |||
17 | -static inline void cris_alu_free_temps(DisasContext *dc, int size, TCGv *t) | ||
18 | -{ | ||
19 | - if (size != 4) { | ||
20 | - tcg_temp_free(t[0]); | ||
21 | - tcg_temp_free(t[1]); | ||
22 | - } | ||
23 | -} | ||
24 | - | ||
25 | static int dec_and_r(CPUCRISState *env, DisasContext *dc) | ||
26 | { | ||
27 | TCGv t[2]; | ||
28 | @@ -XXX,XX +XXX,XX @@ static int dec_and_r(CPUCRISState *env, DisasContext *dc) | ||
29 | cris_alu_alloc_temps(dc, size, t); | ||
30 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]); | ||
31 | cris_alu(dc, CC_OP_AND, cpu_R[dc->op2], t[0], t[1], size); | ||
32 | - cris_alu_free_temps(dc, size, t); | ||
33 | return 2; | ||
34 | } | ||
35 | |||
36 | @@ -XXX,XX +XXX,XX @@ static int dec_lsl_r(CPUCRISState *env, DisasContext *dc) | ||
37 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]); | ||
38 | tcg_gen_andi_tl(t[1], t[1], 63); | ||
39 | cris_alu(dc, CC_OP_LSL, cpu_R[dc->op2], t[0], t[1], size); | ||
40 | - cris_alu_free_temps(dc, size, t); | ||
41 | return 2; | ||
42 | } | ||
43 | |||
44 | @@ -XXX,XX +XXX,XX @@ static int dec_lsr_r(CPUCRISState *env, DisasContext *dc) | ||
45 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]); | ||
46 | tcg_gen_andi_tl(t[1], t[1], 63); | ||
47 | cris_alu(dc, CC_OP_LSR, cpu_R[dc->op2], t[0], t[1], size); | ||
48 | - cris_alu_free_temps(dc, size, t); | ||
49 | return 2; | ||
50 | } | ||
51 | |||
52 | @@ -XXX,XX +XXX,XX @@ static int dec_asr_r(CPUCRISState *env, DisasContext *dc) | ||
53 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 1, t[0], t[1]); | ||
54 | tcg_gen_andi_tl(t[1], t[1], 63); | ||
55 | cris_alu(dc, CC_OP_ASR, cpu_R[dc->op2], t[0], t[1], size); | ||
56 | - cris_alu_free_temps(dc, size, t); | ||
57 | return 2; | ||
58 | } | ||
59 | |||
60 | @@ -XXX,XX +XXX,XX @@ static int dec_muls_r(CPUCRISState *env, DisasContext *dc) | ||
61 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 1, t[0], t[1]); | ||
62 | |||
63 | cris_alu(dc, CC_OP_MULS, cpu_R[dc->op2], t[0], t[1], 4); | ||
64 | - cris_alu_free_temps(dc, size, t); | ||
65 | return 2; | ||
66 | } | ||
67 | |||
68 | @@ -XXX,XX +XXX,XX @@ static int dec_mulu_r(CPUCRISState *env, DisasContext *dc) | ||
69 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]); | ||
70 | |||
71 | cris_alu(dc, CC_OP_MULU, cpu_R[dc->op2], t[0], t[1], 4); | ||
72 | - cris_alu_free_temps(dc, size, t); | ||
73 | return 2; | ||
74 | } | ||
75 | |||
76 | @@ -XXX,XX +XXX,XX @@ static int dec_xor_r(CPUCRISState *env, DisasContext *dc) | ||
77 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]); | ||
78 | |||
79 | cris_alu(dc, CC_OP_XOR, cpu_R[dc->op2], t[0], t[1], 4); | ||
80 | - cris_alu_free_temps(dc, size, t); | ||
81 | return 2; | ||
82 | } | ||
83 | |||
84 | @@ -XXX,XX +XXX,XX @@ static int dec_cmp_r(CPUCRISState *env, DisasContext *dc) | ||
85 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]); | ||
86 | |||
87 | cris_alu(dc, CC_OP_CMP, cpu_R[dc->op2], t[0], t[1], size); | ||
88 | - cris_alu_free_temps(dc, size, t); | ||
89 | return 2; | ||
90 | } | ||
91 | |||
92 | @@ -XXX,XX +XXX,XX @@ static int dec_add_r(CPUCRISState *env, DisasContext *dc) | ||
93 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]); | ||
94 | |||
95 | cris_alu(dc, CC_OP_ADD, cpu_R[dc->op2], t[0], t[1], size); | ||
96 | - cris_alu_free_temps(dc, size, t); | ||
97 | return 2; | ||
98 | } | ||
99 | |||
100 | @@ -XXX,XX +XXX,XX @@ static int dec_or_r(CPUCRISState *env, DisasContext *dc) | ||
101 | cris_alu_alloc_temps(dc, size, t); | ||
102 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]); | ||
103 | cris_alu(dc, CC_OP_OR, cpu_R[dc->op2], t[0], t[1], size); | ||
104 | - cris_alu_free_temps(dc, size, t); | ||
105 | return 2; | ||
106 | } | ||
107 | |||
108 | @@ -XXX,XX +XXX,XX @@ static int dec_neg_r(CPUCRISState *env, DisasContext *dc) | ||
109 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]); | ||
110 | |||
111 | cris_alu(dc, CC_OP_NEG, cpu_R[dc->op2], t[0], t[1], size); | ||
112 | - cris_alu_free_temps(dc, size, t); | ||
113 | return 2; | ||
114 | } | ||
115 | |||
116 | @@ -XXX,XX +XXX,XX @@ static int dec_sub_r(CPUCRISState *env, DisasContext *dc) | ||
117 | cris_alu_alloc_temps(dc, size, t); | ||
118 | dec_prep_alu_r(dc, dc->op1, dc->op2, size, 0, t[0], t[1]); | ||
119 | cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], t[0], t[1], size); | ||
120 | - cris_alu_free_temps(dc, size, t); | ||
121 | return 2; | ||
122 | } | ||
123 | |||
124 | -- | ||
125 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/cris/translate.c | 23 ----------------------- | ||
7 | target/cris/translate_v10.c.inc | 4 ---- | ||
8 | 2 files changed, 27 deletions(-) | ||
9 | |||
10 | diff --git a/target/cris/translate.c b/target/cris/translate.c | ||
11 | index XXXXXXX..XXXXXXX 100644 | ||
12 | --- a/target/cris/translate.c | ||
13 | +++ b/target/cris/translate.c | ||
14 | @@ -XXX,XX +XXX,XX @@ static inline void cris_alu_m_alloc_temps(TCGv *t) | ||
15 | t[1] = tcg_temp_new(); | ||
16 | } | ||
17 | |||
18 | -static inline void cris_alu_m_free_temps(TCGv *t) | ||
19 | -{ | ||
20 | - tcg_temp_free(t[0]); | ||
21 | - tcg_temp_free(t[1]); | ||
22 | -} | ||
23 | - | ||
24 | static int dec_movs_m(CPUCRISState *env, DisasContext *dc) | ||
25 | { | ||
26 | TCGv t[2]; | ||
27 | @@ -XXX,XX +XXX,XX @@ static int dec_movs_m(CPUCRISState *env, DisasContext *dc) | ||
28 | cris_alu(dc, CC_OP_MOVE, | ||
29 | cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); | ||
30 | do_postinc(dc, memsize); | ||
31 | - cris_alu_m_free_temps(t); | ||
32 | return insn_len; | ||
33 | } | ||
34 | |||
35 | @@ -XXX,XX +XXX,XX @@ static int dec_addu_m(CPUCRISState *env, DisasContext *dc) | ||
36 | cris_alu(dc, CC_OP_ADD, | ||
37 | cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); | ||
38 | do_postinc(dc, memsize); | ||
39 | - cris_alu_m_free_temps(t); | ||
40 | return insn_len; | ||
41 | } | ||
42 | |||
43 | @@ -XXX,XX +XXX,XX @@ static int dec_adds_m(CPUCRISState *env, DisasContext *dc) | ||
44 | cris_cc_mask(dc, CC_MASK_NZVC); | ||
45 | cris_alu(dc, CC_OP_ADD, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); | ||
46 | do_postinc(dc, memsize); | ||
47 | - cris_alu_m_free_temps(t); | ||
48 | return insn_len; | ||
49 | } | ||
50 | |||
51 | @@ -XXX,XX +XXX,XX @@ static int dec_subu_m(CPUCRISState *env, DisasContext *dc) | ||
52 | cris_cc_mask(dc, CC_MASK_NZVC); | ||
53 | cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); | ||
54 | do_postinc(dc, memsize); | ||
55 | - cris_alu_m_free_temps(t); | ||
56 | return insn_len; | ||
57 | } | ||
58 | |||
59 | @@ -XXX,XX +XXX,XX @@ static int dec_subs_m(CPUCRISState *env, DisasContext *dc) | ||
60 | cris_cc_mask(dc, CC_MASK_NZVC); | ||
61 | cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); | ||
62 | do_postinc(dc, memsize); | ||
63 | - cris_alu_m_free_temps(t); | ||
64 | return insn_len; | ||
65 | } | ||
66 | |||
67 | @@ -XXX,XX +XXX,XX @@ static int dec_movu_m(CPUCRISState *env, DisasContext *dc) | ||
68 | cris_cc_mask(dc, CC_MASK_NZ); | ||
69 | cris_alu(dc, CC_OP_MOVE, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); | ||
70 | do_postinc(dc, memsize); | ||
71 | - cris_alu_m_free_temps(t); | ||
72 | return insn_len; | ||
73 | } | ||
74 | |||
75 | @@ -XXX,XX +XXX,XX @@ static int dec_cmpu_m(CPUCRISState *env, DisasContext *dc) | ||
76 | cris_cc_mask(dc, CC_MASK_NZVC); | ||
77 | cris_alu(dc, CC_OP_CMP, cpu_R[dc->op2], cpu_R[dc->op2], t[1], 4); | ||
78 | do_postinc(dc, memsize); | ||
79 | - cris_alu_m_free_temps(t); | ||
80 | return insn_len; | ||
81 | } | ||
82 | |||
83 | @@ -XXX,XX +XXX,XX @@ static int dec_cmps_m(CPUCRISState *env, DisasContext *dc) | ||
84 | cpu_R[dc->op2], cpu_R[dc->op2], t[1], | ||
85 | memsize_zz(dc)); | ||
86 | do_postinc(dc, memsize); | ||
87 | - cris_alu_m_free_temps(t); | ||
88 | return insn_len; | ||
89 | } | ||
90 | |||
91 | @@ -XXX,XX +XXX,XX @@ static int dec_cmp_m(CPUCRISState *env, DisasContext *dc) | ||
92 | cpu_R[dc->op2], cpu_R[dc->op2], t[1], | ||
93 | memsize_zz(dc)); | ||
94 | do_postinc(dc, memsize); | ||
95 | - cris_alu_m_free_temps(t); | ||
96 | return insn_len; | ||
97 | } | ||
98 | |||
99 | @@ -XXX,XX +XXX,XX @@ static int dec_test_m(CPUCRISState *env, DisasContext *dc) | ||
100 | cpu_R[dc->op2], t[1], c, memsize_zz(dc)); | ||
101 | tcg_temp_free(c); | ||
102 | do_postinc(dc, memsize); | ||
103 | - cris_alu_m_free_temps(t); | ||
104 | return insn_len; | ||
105 | } | ||
106 | |||
107 | @@ -XXX,XX +XXX,XX @@ static int dec_and_m(CPUCRISState *env, DisasContext *dc) | ||
108 | cris_cc_mask(dc, CC_MASK_NZ); | ||
109 | cris_alu(dc, CC_OP_AND, cpu_R[dc->op2], t[0], t[1], memsize_zz(dc)); | ||
110 | do_postinc(dc, memsize); | ||
111 | - cris_alu_m_free_temps(t); | ||
112 | return insn_len; | ||
113 | } | ||
114 | |||
115 | @@ -XXX,XX +XXX,XX @@ static int dec_add_m(CPUCRISState *env, DisasContext *dc) | ||
116 | cris_alu(dc, CC_OP_ADD, | ||
117 | cpu_R[dc->op2], t[0], t[1], memsize_zz(dc)); | ||
118 | do_postinc(dc, memsize); | ||
119 | - cris_alu_m_free_temps(t); | ||
120 | return insn_len; | ||
121 | } | ||
122 | |||
123 | @@ -XXX,XX +XXX,XX @@ static int dec_addo_m(CPUCRISState *env, DisasContext *dc) | ||
124 | cris_cc_mask(dc, 0); | ||
125 | cris_alu(dc, CC_OP_ADD, cpu_R[R_ACR], t[0], t[1], 4); | ||
126 | do_postinc(dc, memsize); | ||
127 | - cris_alu_m_free_temps(t); | ||
128 | return insn_len; | ||
129 | } | ||
130 | |||
131 | @@ -XXX,XX +XXX,XX @@ static int dec_addc_mr(CPUCRISState *env, DisasContext *dc) | ||
132 | cris_cc_mask(dc, CC_MASK_NZVC); | ||
133 | cris_alu(dc, CC_OP_ADDC, cpu_R[dc->op2], t[0], t[1], 4); | ||
134 | do_postinc(dc, 4); | ||
135 | - cris_alu_m_free_temps(t); | ||
136 | return insn_len; | ||
137 | } | ||
138 | |||
139 | @@ -XXX,XX +XXX,XX @@ static int dec_sub_m(CPUCRISState *env, DisasContext *dc) | ||
140 | cris_cc_mask(dc, CC_MASK_NZVC); | ||
141 | cris_alu(dc, CC_OP_SUB, cpu_R[dc->op2], t[0], t[1], memsize); | ||
142 | do_postinc(dc, memsize); | ||
143 | - cris_alu_m_free_temps(t); | ||
144 | return insn_len; | ||
145 | } | ||
146 | |||
147 | @@ -XXX,XX +XXX,XX @@ static int dec_or_m(CPUCRISState *env, DisasContext *dc) | ||
148 | cris_alu(dc, CC_OP_OR, | ||
149 | cpu_R[dc->op2], t[0], t[1], memsize_zz(dc)); | ||
150 | do_postinc(dc, memsize); | ||
151 | - cris_alu_m_free_temps(t); | ||
152 | return insn_len; | ||
153 | } | ||
154 | |||
155 | @@ -XXX,XX +XXX,XX @@ static int dec_move_mp(CPUCRISState *env, DisasContext *dc) | ||
156 | t_gen_mov_preg_TN(dc, dc->op2, t[1]); | ||
157 | |||
158 | do_postinc(dc, memsize); | ||
159 | - cris_alu_m_free_temps(t); | ||
160 | return insn_len; | ||
161 | } | ||
162 | |||
163 | diff --git a/target/cris/translate_v10.c.inc b/target/cris/translate_v10.c.inc | ||
164 | index XXXXXXX..XXXXXXX 100644 | ||
165 | --- a/target/cris/translate_v10.c.inc | ||
166 | +++ b/target/cris/translate_v10.c.inc | ||
167 | @@ -XXX,XX +XXX,XX @@ static int dec10_ind_alu(CPUCRISState *env, DisasContext *dc, | ||
168 | dc->delayed_branch = 1; | ||
169 | return insn_len; | ||
170 | } | ||
171 | - | ||
172 | - cris_alu_m_free_temps(t); | ||
173 | - | ||
174 | return insn_len; | ||
175 | } | ||
176 | |||
177 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc) | ||
178 | cris_alu(dc, CC_OP_CMP, cpu_R[dc->dst], | ||
179 | t[0], c, size); | ||
180 | tcg_temp_free(c); | ||
181 | - cris_alu_m_free_temps(t); | ||
182 | break; | ||
183 | case CRISV10_IND_ADD: | ||
184 | LOG_DIS("add size=%d op=%d %d\n", size, dc->src, dc->dst); | ||
185 | -- | ||
186 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | This variable is not used, only allocated and freed. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/cris/translate_v10.c.inc | 4 +--- | ||
7 | 1 file changed, 1 insertion(+), 3 deletions(-) | ||
8 | |||
9 | diff --git a/target/cris/translate_v10.c.inc b/target/cris/translate_v10.c.inc | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/cris/translate_v10.c.inc | ||
12 | +++ b/target/cris/translate_v10.c.inc | ||
13 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind_move_r_m(DisasContext *dc, unsigned int size) | ||
14 | static unsigned int dec10_ind_move_m_pr(CPUCRISState *env, DisasContext *dc) | ||
15 | { | ||
16 | unsigned int insn_len = 2, rd = dc->dst; | ||
17 | - TCGv t, addr; | ||
18 | + TCGv t; | ||
19 | |||
20 | LOG_DIS("move.%d $p%d, [$r%d]\n", dc->size, dc->dst, dc->src); | ||
21 | cris_lock_irq(dc); | ||
22 | |||
23 | - addr = tcg_temp_new(); | ||
24 | t = tcg_temp_new(); | ||
25 | insn_len += dec10_prep_move_m(env, dc, 0, 4, t); | ||
26 | if (rd == 15) { | ||
27 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind_move_m_pr(CPUCRISState *env, DisasContext *dc) | ||
28 | tcg_gen_mov_tl(cpu_PR[rd], t); | ||
29 | dc->cpustate_changed = 1; | ||
30 | } | ||
31 | - tcg_temp_free(addr); | ||
32 | tcg_temp_free(t); | ||
33 | return insn_len; | ||
34 | } | ||
35 | -- | ||
36 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/cris/translate.c | 70 --------------------------------- | ||
7 | target/cris/translate_v10.c.inc | 41 ------------------- | ||
8 | 2 files changed, 111 deletions(-) | ||
9 | |||
10 | diff --git a/target/cris/translate.c b/target/cris/translate.c | ||
11 | index XXXXXXX..XXXXXXX 100644 | ||
12 | --- a/target/cris/translate.c | ||
13 | +++ b/target/cris/translate.c | ||
14 | @@ -XXX,XX +XXX,XX @@ static const int preg_sizes[] = { | ||
15 | do { \ | ||
16 | TCGv tc = tcg_const_tl(c); \ | ||
17 | t_gen_mov_env_TN(member, tc); \ | ||
18 | - tcg_temp_free(tc); \ | ||
19 | } while (0) | ||
20 | |||
21 | static inline void t_gen_mov_TN_preg(TCGv tn, int r) | ||
22 | @@ -XXX,XX +XXX,XX @@ static inline void t_gen_raise_exception(uint32_t index) | ||
23 | { | ||
24 | TCGv_i32 tmp = tcg_const_i32(index); | ||
25 | gen_helper_raise_exception(cpu_env, tmp); | ||
26 | - tcg_temp_free_i32(tmp); | ||
27 | } | ||
28 | |||
29 | static void t_gen_lsl(TCGv d, TCGv a, TCGv b) | ||
30 | @@ -XXX,XX +XXX,XX @@ static void t_gen_lsl(TCGv d, TCGv a, TCGv b) | ||
31 | tcg_gen_sar_tl(t0, t0, t_31); | ||
32 | tcg_gen_and_tl(t0, t0, d); | ||
33 | tcg_gen_xor_tl(d, d, t0); | ||
34 | - tcg_temp_free(t0); | ||
35 | - tcg_temp_free(t_31); | ||
36 | } | ||
37 | |||
38 | static void t_gen_lsr(TCGv d, TCGv a, TCGv b) | ||
39 | @@ -XXX,XX +XXX,XX @@ static void t_gen_lsr(TCGv d, TCGv a, TCGv b) | ||
40 | tcg_gen_sar_tl(t0, t0, t_31); | ||
41 | tcg_gen_and_tl(t0, t0, d); | ||
42 | tcg_gen_xor_tl(d, d, t0); | ||
43 | - tcg_temp_free(t0); | ||
44 | - tcg_temp_free(t_31); | ||
45 | } | ||
46 | |||
47 | static void t_gen_asr(TCGv d, TCGv a, TCGv b) | ||
48 | @@ -XXX,XX +XXX,XX @@ static void t_gen_asr(TCGv d, TCGv a, TCGv b) | ||
49 | tcg_gen_sub_tl(t0, t_31, b); | ||
50 | tcg_gen_sar_tl(t0, t0, t_31); | ||
51 | tcg_gen_or_tl(d, d, t0); | ||
52 | - tcg_temp_free(t0); | ||
53 | - tcg_temp_free(t_31); | ||
54 | } | ||
55 | |||
56 | static void t_gen_cris_dstep(TCGv d, TCGv a, TCGv b) | ||
57 | @@ -XXX,XX +XXX,XX @@ static void t_gen_cris_dstep(TCGv d, TCGv a, TCGv b) | ||
58 | tcg_gen_shli_tl(d, a, 1); | ||
59 | tcg_gen_sub_tl(t, d, b); | ||
60 | tcg_gen_movcond_tl(TCG_COND_GEU, d, d, b, t, d); | ||
61 | - tcg_temp_free(t); | ||
62 | } | ||
63 | |||
64 | static void t_gen_cris_mstep(TCGv d, TCGv a, TCGv b, TCGv ccs) | ||
65 | @@ -XXX,XX +XXX,XX @@ static void t_gen_cris_mstep(TCGv d, TCGv a, TCGv b, TCGv ccs) | ||
66 | tcg_gen_sari_tl(t, t, 31); | ||
67 | tcg_gen_and_tl(t, t, b); | ||
68 | tcg_gen_add_tl(d, d, t); | ||
69 | - tcg_temp_free(t); | ||
70 | } | ||
71 | |||
72 | /* Extended arithmetics on CRIS. */ | ||
73 | @@ -XXX,XX +XXX,XX @@ static inline void t_gen_add_flag(TCGv d, int flag) | ||
74 | tcg_gen_shri_tl(c, c, flag); | ||
75 | } | ||
76 | tcg_gen_add_tl(d, d, c); | ||
77 | - tcg_temp_free(c); | ||
78 | } | ||
79 | |||
80 | static inline void t_gen_addx_carry(DisasContext *dc, TCGv d) | ||
81 | @@ -XXX,XX +XXX,XX @@ static inline void t_gen_addx_carry(DisasContext *dc, TCGv d) | ||
82 | /* C flag is already at bit 0. */ | ||
83 | tcg_gen_andi_tl(c, c, C_FLAG); | ||
84 | tcg_gen_add_tl(d, d, c); | ||
85 | - tcg_temp_free(c); | ||
86 | } | ||
87 | } | ||
88 | |||
89 | @@ -XXX,XX +XXX,XX @@ static inline void t_gen_subx_carry(DisasContext *dc, TCGv d) | ||
90 | /* C flag is already at bit 0. */ | ||
91 | tcg_gen_andi_tl(c, c, C_FLAG); | ||
92 | tcg_gen_sub_tl(d, d, c); | ||
93 | - tcg_temp_free(c); | ||
94 | } | ||
95 | } | ||
96 | |||
97 | @@ -XXX,XX +XXX,XX @@ static inline void t_gen_swapb(TCGv d, TCGv s) | ||
98 | tcg_gen_shri_tl(t, org_s, 8); | ||
99 | tcg_gen_andi_tl(t, t, 0x00ff00ff); | ||
100 | tcg_gen_or_tl(d, d, t); | ||
101 | - tcg_temp_free(t); | ||
102 | - tcg_temp_free(org_s); | ||
103 | } | ||
104 | |||
105 | /* Swap the halfwords of the s operand. */ | ||
106 | @@ -XXX,XX +XXX,XX @@ static inline void t_gen_swapw(TCGv d, TCGv s) | ||
107 | tcg_gen_shli_tl(d, t, 16); | ||
108 | tcg_gen_shri_tl(t, t, 16); | ||
109 | tcg_gen_or_tl(d, d, t); | ||
110 | - tcg_temp_free(t); | ||
111 | } | ||
112 | |||
113 | /* Reverse the within each byte. | ||
114 | @@ -XXX,XX +XXX,XX @@ static void t_gen_swapr(TCGv d, TCGv s) | ||
115 | tcg_gen_andi_tl(t, t, bitrev[i].mask); | ||
116 | tcg_gen_or_tl(d, d, t); | ||
117 | } | ||
118 | - tcg_temp_free(t); | ||
119 | - tcg_temp_free(org_s); | ||
120 | } | ||
121 | |||
122 | static bool use_goto_tb(DisasContext *dc, target_ulong dest) | ||
123 | @@ -XXX,XX +XXX,XX @@ static void cris_alu(DisasContext *dc, int op, | ||
124 | } | ||
125 | tcg_gen_or_tl(d, d, tmp); | ||
126 | } | ||
127 | - if (tmp != d) { | ||
128 | - tcg_temp_free(tmp); | ||
129 | - } | ||
130 | } | ||
131 | |||
132 | static int arith_cc(DisasContext *dc) | ||
133 | @@ -XXX,XX +XXX,XX @@ static void gen_tst_cc (DisasContext *dc, TCGv cc, int cond) | ||
134 | tcg_gen_shli_tl(cc, tmp, 2); | ||
135 | tcg_gen_and_tl(cc, tmp, cc); | ||
136 | tcg_gen_andi_tl(cc, cc, Z_FLAG); | ||
137 | - | ||
138 | - tcg_temp_free(tmp); | ||
139 | } | ||
140 | break; | ||
141 | case CC_GE: | ||
142 | @@ -XXX,XX +XXX,XX @@ static void gen_tst_cc (DisasContext *dc, TCGv cc, int cond) | ||
143 | tcg_gen_xori_tl(n, n, 2); | ||
144 | tcg_gen_and_tl(cc, z, n); | ||
145 | tcg_gen_andi_tl(cc, cc, 2); | ||
146 | - | ||
147 | - tcg_temp_free(n); | ||
148 | - tcg_temp_free(z); | ||
149 | } | ||
150 | break; | ||
151 | case CC_LE: | ||
152 | @@ -XXX,XX +XXX,XX @@ static void gen_tst_cc (DisasContext *dc, TCGv cc, int cond) | ||
153 | tcg_gen_xor_tl(n, n, cpu_PR[PR_CCS]); | ||
154 | tcg_gen_or_tl(cc, z, n); | ||
155 | tcg_gen_andi_tl(cc, cc, 2); | ||
156 | - | ||
157 | - tcg_temp_free(n); | ||
158 | - tcg_temp_free(z); | ||
159 | } | ||
160 | break; | ||
161 | case CC_P: | ||
162 | @@ -XXX,XX +XXX,XX @@ static int dec_addq(CPUCRISState *env, DisasContext *dc) | ||
163 | c = tcg_const_tl(dc->op1); | ||
164 | cris_alu(dc, CC_OP_ADD, | ||
165 | cpu_R[dc->op2], cpu_R[dc->op2], c, 4); | ||
166 | - tcg_temp_free(c); | ||
167 | return 2; | ||
168 | } | ||
169 | static int dec_moveq(CPUCRISState *env, DisasContext *dc) | ||
170 | @@ -XXX,XX +XXX,XX @@ static int dec_subq(CPUCRISState *env, DisasContext *dc) | ||
171 | c = tcg_const_tl(dc->op1); | ||
172 | cris_alu(dc, CC_OP_SUB, | ||
173 | cpu_R[dc->op2], cpu_R[dc->op2], c, 4); | ||
174 | - tcg_temp_free(c); | ||
175 | return 2; | ||
176 | } | ||
177 | static int dec_cmpq(CPUCRISState *env, DisasContext *dc) | ||
178 | @@ -XXX,XX +XXX,XX @@ static int dec_cmpq(CPUCRISState *env, DisasContext *dc) | ||
179 | c = tcg_const_tl(imm); | ||
180 | cris_alu(dc, CC_OP_CMP, | ||
181 | cpu_R[dc->op2], cpu_R[dc->op2], c, 4); | ||
182 | - tcg_temp_free(c); | ||
183 | return 2; | ||
184 | } | ||
185 | static int dec_andq(CPUCRISState *env, DisasContext *dc) | ||
186 | @@ -XXX,XX +XXX,XX @@ static int dec_andq(CPUCRISState *env, DisasContext *dc) | ||
187 | c = tcg_const_tl(imm); | ||
188 | cris_alu(dc, CC_OP_AND, | ||
189 | cpu_R[dc->op2], cpu_R[dc->op2], c, 4); | ||
190 | - tcg_temp_free(c); | ||
191 | return 2; | ||
192 | } | ||
193 | static int dec_orq(CPUCRISState *env, DisasContext *dc) | ||
194 | @@ -XXX,XX +XXX,XX @@ static int dec_orq(CPUCRISState *env, DisasContext *dc) | ||
195 | c = tcg_const_tl(imm); | ||
196 | cris_alu(dc, CC_OP_OR, | ||
197 | cpu_R[dc->op2], cpu_R[dc->op2], c, 4); | ||
198 | - tcg_temp_free(c); | ||
199 | return 2; | ||
200 | } | ||
201 | static int dec_btstq(CPUCRISState *env, DisasContext *dc) | ||
202 | @@ -XXX,XX +XXX,XX @@ static int dec_btstq(CPUCRISState *env, DisasContext *dc) | ||
203 | cris_evaluate_flags(dc); | ||
204 | gen_helper_btst(cpu_PR[PR_CCS], cpu_env, cpu_R[dc->op2], | ||
205 | c, cpu_PR[PR_CCS]); | ||
206 | - tcg_temp_free(c); | ||
207 | cris_alu(dc, CC_OP_MOVE, | ||
208 | cpu_R[dc->op2], cpu_R[dc->op2], cpu_R[dc->op2], 4); | ||
209 | cris_update_cc_op(dc, CC_OP_FLAGS, 4); | ||
210 | @@ -XXX,XX +XXX,XX @@ static int dec_move_r(CPUCRISState *env, DisasContext *dc) | ||
211 | cris_alu(dc, CC_OP_MOVE, | ||
212 | cpu_R[dc->op2], | ||
213 | cpu_R[dc->op2], t0, size); | ||
214 | - tcg_temp_free(t0); | ||
215 | } | ||
216 | return 2; | ||
217 | } | ||
218 | @@ -XXX,XX +XXX,XX @@ static int dec_lz_r(CPUCRISState *env, DisasContext *dc) | ||
219 | t0 = tcg_temp_new(); | ||
220 | dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0, cpu_R[dc->op2], t0); | ||
221 | cris_alu(dc, CC_OP_LZ, cpu_R[dc->op2], cpu_R[dc->op2], t0, 4); | ||
222 | - tcg_temp_free(t0); | ||
223 | return 2; | ||
224 | } | ||
225 | |||
226 | @@ -XXX,XX +XXX,XX @@ static int dec_bound_r(CPUCRISState *env, DisasContext *dc) | ||
227 | l0 = tcg_temp_new(); | ||
228 | dec_prep_move_r(dc, dc->op1, dc->op2, size, 0, l0); | ||
229 | cris_alu(dc, CC_OP_BOUND, cpu_R[dc->op2], cpu_R[dc->op2], l0, 4); | ||
230 | - tcg_temp_free(l0); | ||
231 | return 2; | ||
232 | } | ||
233 | |||
234 | @@ -XXX,XX +XXX,XX @@ static int dec_swap_r(CPUCRISState *env, DisasContext *dc) | ||
235 | t_gen_swapr(t0, t0); | ||
236 | } | ||
237 | cris_alu(dc, CC_OP_MOVE, cpu_R[dc->op1], cpu_R[dc->op1], t0, 4); | ||
238 | - tcg_temp_free(t0); | ||
239 | return 2; | ||
240 | } | ||
241 | |||
242 | @@ -XXX,XX +XXX,XX @@ static int dec_addi_r(CPUCRISState *env, DisasContext *dc) | ||
243 | t0 = tcg_temp_new(); | ||
244 | tcg_gen_shli_tl(t0, cpu_R[dc->op2], dc->zzsize); | ||
245 | tcg_gen_add_tl(cpu_R[dc->op1], cpu_R[dc->op1], t0); | ||
246 | - tcg_temp_free(t0); | ||
247 | return 2; | ||
248 | } | ||
249 | |||
250 | @@ -XXX,XX +XXX,XX @@ static int dec_addi_acr(CPUCRISState *env, DisasContext *dc) | ||
251 | t0 = tcg_temp_new(); | ||
252 | tcg_gen_shli_tl(t0, cpu_R[dc->op2], dc->zzsize); | ||
253 | tcg_gen_add_tl(cpu_R[R_ACR], cpu_R[dc->op1], t0); | ||
254 | - tcg_temp_free(t0); | ||
255 | return 2; | ||
256 | } | ||
257 | |||
258 | @@ -XXX,XX +XXX,XX @@ static int dec_movu_r(CPUCRISState *env, DisasContext *dc) | ||
259 | t0 = tcg_temp_new(); | ||
260 | dec_prep_move_r(dc, dc->op1, dc->op2, size, 0, t0); | ||
261 | cris_alu(dc, CC_OP_MOVE, cpu_R[dc->op2], cpu_R[dc->op2], t0, 4); | ||
262 | - tcg_temp_free(t0); | ||
263 | return 2; | ||
264 | } | ||
265 | |||
266 | @@ -XXX,XX +XXX,XX @@ static int dec_movs_r(CPUCRISState *env, DisasContext *dc) | ||
267 | t_gen_sext(t0, cpu_R[dc->op1], size); | ||
268 | cris_alu(dc, CC_OP_MOVE, | ||
269 | cpu_R[dc->op2], cpu_R[dc->op1], t0, 4); | ||
270 | - tcg_temp_free(t0); | ||
271 | return 2; | ||
272 | } | ||
273 | |||
274 | @@ -XXX,XX +XXX,XX @@ static int dec_addu_r(CPUCRISState *env, DisasContext *dc) | ||
275 | /* Size can only be qi or hi. */ | ||
276 | t_gen_zext(t0, cpu_R[dc->op1], size); | ||
277 | cris_alu(dc, CC_OP_ADD, cpu_R[dc->op2], cpu_R[dc->op2], t0, 4); | ||
278 | - tcg_temp_free(t0); | ||
279 | return 2; | ||
280 | } | ||
281 | |||
282 | @@ -XXX,XX +XXX,XX @@ static int dec_adds_r(CPUCRISState *env, DisasContext *dc) | ||
283 | t_gen_sext(t0, cpu_R[dc->op1], size); | ||
284 | cris_alu(dc, CC_OP_ADD, | ||
285 | cpu_R[dc->op2], cpu_R[dc->op2], t0, 4); | ||
286 | - tcg_temp_free(t0); | ||
287 | return 2; | ||
288 | } | ||
289 | |||
290 | @@ -XXX,XX +XXX,XX @@ static int dec_subu_r(CPUCRISState *env, DisasContext *dc) | ||
291 | t_gen_zext(t0, cpu_R[dc->op1], size); | ||
292 | cris_alu(dc, CC_OP_SUB, | ||
293 | cpu_R[dc->op2], cpu_R[dc->op2], t0, 4); | ||
294 | - tcg_temp_free(t0); | ||
295 | return 2; | ||
296 | } | ||
297 | |||
298 | @@ -XXX,XX +XXX,XX @@ static int dec_subs_r(CPUCRISState *env, DisasContext *dc) | ||
299 | t_gen_sext(t0, cpu_R[dc->op1], size); | ||
300 | cris_alu(dc, CC_OP_SUB, | ||
301 | cpu_R[dc->op2], cpu_R[dc->op2], t0, 4); | ||
302 | - tcg_temp_free(t0); | ||
303 | return 2; | ||
304 | } | ||
305 | |||
306 | @@ -XXX,XX +XXX,XX @@ static int dec_move_rs(CPUCRISState *env, DisasContext *dc) | ||
307 | c2 = tcg_const_tl(dc->op2); | ||
308 | cris_cc_mask(dc, 0); | ||
309 | gen_helper_movl_sreg_reg(cpu_env, c2, c1); | ||
310 | - tcg_temp_free(c1); | ||
311 | - tcg_temp_free(c2); | ||
312 | return 2; | ||
313 | } | ||
314 | static int dec_move_sr(CPUCRISState *env, DisasContext *dc) | ||
315 | @@ -XXX,XX +XXX,XX @@ static int dec_move_sr(CPUCRISState *env, DisasContext *dc) | ||
316 | c2 = tcg_const_tl(dc->op2); | ||
317 | cris_cc_mask(dc, 0); | ||
318 | gen_helper_movl_reg_sreg(cpu_env, c1, c2); | ||
319 | - tcg_temp_free(c1); | ||
320 | - tcg_temp_free(c2); | ||
321 | return 2; | ||
322 | } | ||
323 | |||
324 | @@ -XXX,XX +XXX,XX @@ static int dec_move_rp(CPUCRISState *env, DisasContext *dc) | ||
325 | tcg_gen_andi_tl(t[0], t[0], 0x39f); | ||
326 | tcg_gen_andi_tl(t[1], cpu_PR[PR_CCS], ~0x39f); | ||
327 | tcg_gen_or_tl(t[0], t[1], t[0]); | ||
328 | - tcg_temp_free(t[1]); | ||
329 | } | ||
330 | } else { | ||
331 | tcg_gen_mov_tl(t[0], cpu_R[dc->op1]); | ||
332 | @@ -XXX,XX +XXX,XX @@ static int dec_move_rp(CPUCRISState *env, DisasContext *dc) | ||
333 | cris_update_cc_op(dc, CC_OP_FLAGS, 4); | ||
334 | dc->flags_uptodate = 1; | ||
335 | } | ||
336 | - tcg_temp_free(t[0]); | ||
337 | return 2; | ||
338 | } | ||
339 | static int dec_move_pr(CPUCRISState *env, DisasContext *dc) | ||
340 | @@ -XXX,XX +XXX,XX @@ static int dec_move_pr(CPUCRISState *env, DisasContext *dc) | ||
341 | cris_alu(dc, CC_OP_MOVE, | ||
342 | cpu_R[dc->op1], cpu_R[dc->op1], t0, | ||
343 | preg_sizes[dc->op2]); | ||
344 | - tcg_temp_free(t0); | ||
345 | } | ||
346 | return 2; | ||
347 | } | ||
348 | @@ -XXX,XX +XXX,XX @@ static int dec_move_mr(CPUCRISState *env, DisasContext *dc) | ||
349 | cris_cc_mask(dc, CC_MASK_NZ); | ||
350 | cris_alu(dc, CC_OP_MOVE, | ||
351 | cpu_R[dc->op2], cpu_R[dc->op2], t0, memsize); | ||
352 | - tcg_temp_free(t0); | ||
353 | } | ||
354 | do_postinc(dc, memsize); | ||
355 | return insn_len; | ||
356 | @@ -XXX,XX +XXX,XX @@ static int dec_test_m(CPUCRISState *env, DisasContext *dc) | ||
357 | c = tcg_const_tl(0); | ||
358 | cris_alu(dc, CC_OP_CMP, | ||
359 | cpu_R[dc->op2], t[1], c, memsize_zz(dc)); | ||
360 | - tcg_temp_free(c); | ||
361 | do_postinc(dc, memsize); | ||
362 | return insn_len; | ||
363 | } | ||
364 | @@ -XXX,XX +XXX,XX @@ static int dec_bound_m(CPUCRISState *env, DisasContext *dc) | ||
365 | cris_cc_mask(dc, CC_MASK_NZ); | ||
366 | cris_alu(dc, CC_OP_BOUND, cpu_R[dc->op2], l[0], l[1], 4); | ||
367 | do_postinc(dc, memsize); | ||
368 | - tcg_temp_free(l[0]); | ||
369 | - tcg_temp_free(l[1]); | ||
370 | return insn_len; | ||
371 | } | ||
372 | |||
373 | @@ -XXX,XX +XXX,XX @@ static int dec_move_pm(CPUCRISState *env, DisasContext *dc) | ||
374 | t_gen_mov_TN_preg(t0, dc->op2); | ||
375 | cris_flush_cc_state(dc); | ||
376 | gen_store(dc, cpu_R[dc->op1], t0, memsize); | ||
377 | - tcg_temp_free(t0); | ||
378 | |||
379 | cris_cc_mask(dc, 0); | ||
380 | if (dc->postinc) { | ||
381 | @@ -XXX,XX +XXX,XX @@ static int dec_movem_mr(CPUCRISState *env, DisasContext *dc) | ||
382 | } else { | ||
383 | tmp32 = NULL; | ||
384 | } | ||
385 | - tcg_temp_free(addr); | ||
386 | |||
387 | for (i = 0; i < (nr >> 1); i++) { | ||
388 | tcg_gen_extrl_i64_i32(cpu_R[i * 2], tmp[i]); | ||
389 | tcg_gen_shri_i64(tmp[i], tmp[i], 32); | ||
390 | tcg_gen_extrl_i64_i32(cpu_R[i * 2 + 1], tmp[i]); | ||
391 | - tcg_temp_free_i64(tmp[i]); | ||
392 | } | ||
393 | if (nr & 1) { | ||
394 | tcg_gen_mov_tl(cpu_R[dc->op2], tmp32); | ||
395 | - tcg_temp_free(tmp32); | ||
396 | } | ||
397 | |||
398 | /* writeback the updated pointer value. */ | ||
399 | @@ -XXX,XX +XXX,XX @@ static int dec_movem_rm(CPUCRISState *env, DisasContext *dc) | ||
400 | tcg_gen_mov_tl(cpu_R[dc->op1], addr); | ||
401 | } | ||
402 | cris_cc_mask(dc, 0); | ||
403 | - tcg_temp_free(tmp); | ||
404 | - tcg_temp_free(addr); | ||
405 | return 2; | ||
406 | } | ||
407 | |||
408 | @@ -XXX,XX +XXX,XX @@ static int dec_jas_r(CPUCRISState *env, DisasContext *dc) | ||
409 | } | ||
410 | c = tcg_const_tl(dc->pc + 4); | ||
411 | t_gen_mov_preg_TN(dc, dc->op2, c); | ||
412 | - tcg_temp_free(c); | ||
413 | |||
414 | cris_prepare_jmp(dc, JMP_INDIRECT); | ||
415 | return 2; | ||
416 | @@ -XXX,XX +XXX,XX @@ static int dec_jas_im(CPUCRISState *env, DisasContext *dc) | ||
417 | c = tcg_const_tl(dc->pc + 8); | ||
418 | /* Store the return address in Pd. */ | ||
419 | t_gen_mov_preg_TN(dc, dc->op2, c); | ||
420 | - tcg_temp_free(c); | ||
421 | |||
422 | dc->jmp_pc = imm; | ||
423 | cris_prepare_jmp(dc, JMP_DIRECT); | ||
424 | @@ -XXX,XX +XXX,XX @@ static int dec_jasc_im(CPUCRISState *env, DisasContext *dc) | ||
425 | c = tcg_const_tl(dc->pc + 8 + 4); | ||
426 | /* Store the return address in Pd. */ | ||
427 | t_gen_mov_preg_TN(dc, dc->op2, c); | ||
428 | - tcg_temp_free(c); | ||
429 | |||
430 | dc->jmp_pc = imm; | ||
431 | cris_prepare_jmp(dc, JMP_DIRECT); | ||
432 | @@ -XXX,XX +XXX,XX @@ static int dec_jasc_r(CPUCRISState *env, DisasContext *dc) | ||
433 | tcg_gen_mov_tl(env_btarget, cpu_R[dc->op1]); | ||
434 | c = tcg_const_tl(dc->pc + 4 + 4); | ||
435 | t_gen_mov_preg_TN(dc, dc->op2, c); | ||
436 | - tcg_temp_free(c); | ||
437 | cris_prepare_jmp(dc, JMP_INDIRECT); | ||
438 | return 2; | ||
439 | } | ||
440 | @@ -XXX,XX +XXX,XX @@ static int dec_bas_im(CPUCRISState *env, DisasContext *dc) | ||
441 | c = tcg_const_tl(dc->pc + 8); | ||
442 | /* Store the return address in Pd. */ | ||
443 | t_gen_mov_preg_TN(dc, dc->op2, c); | ||
444 | - tcg_temp_free(c); | ||
445 | |||
446 | dc->jmp_pc = dc->pc + simm; | ||
447 | cris_prepare_jmp(dc, JMP_DIRECT); | ||
448 | @@ -XXX,XX +XXX,XX @@ static int dec_basc_im(CPUCRISState *env, DisasContext *dc) | ||
449 | c = tcg_const_tl(dc->pc + 12); | ||
450 | /* Store the return address in Pd. */ | ||
451 | t_gen_mov_preg_TN(dc, dc->op2, c); | ||
452 | - tcg_temp_free(c); | ||
453 | |||
454 | dc->jmp_pc = dc->pc + simm; | ||
455 | cris_prepare_jmp(dc, JMP_DIRECT); | ||
456 | diff --git a/target/cris/translate_v10.c.inc b/target/cris/translate_v10.c.inc | ||
457 | index XXXXXXX..XXXXXXX 100644 | ||
458 | --- a/target/cris/translate_v10.c.inc | ||
459 | +++ b/target/cris/translate_v10.c.inc | ||
460 | @@ -XXX,XX +XXX,XX @@ static void gen_store_v10_conditional(DisasContext *dc, TCGv addr, TCGv val, | ||
461 | gen_set_label(l1); | ||
462 | tcg_gen_shri_tl(t1, t1, 1); /* shift F to P position */ | ||
463 | tcg_gen_or_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], t1); /*P=F*/ | ||
464 | - tcg_temp_free(t1); | ||
465 | - tcg_temp_free(tval); | ||
466 | - tcg_temp_free(taddr); | ||
467 | } | ||
468 | |||
469 | static void gen_store_v10(DisasContext *dc, TCGv addr, TCGv val, | ||
470 | @@ -XXX,XX +XXX,XX @@ static int dec10_prep_move_m(CPUCRISState *env, DisasContext *dc, | ||
471 | else | ||
472 | t_gen_zext(dst, dst, memsize); | ||
473 | insn_len += crisv10_post_memaddr(dc, memsize); | ||
474 | - tcg_temp_free(addr); | ||
475 | } | ||
476 | |||
477 | if (dc->mode == CRISV10_MODE_INDIRECT && (dc->tb_flags & PFIX_FLAG)) { | ||
478 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_quick_imm(DisasContext *dc) | ||
479 | c = tcg_const_tl(simm); | ||
480 | cris_alu(dc, CC_OP_MOVE, cpu_R[dc->dst], | ||
481 | cpu_R[dc->dst], c, 4); | ||
482 | - tcg_temp_free(c); | ||
483 | break; | ||
484 | case CRISV10_QIMM_CMPQ: | ||
485 | LOG_DIS("cmpq %d, $r%d\n", simm, dc->dst); | ||
486 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_quick_imm(DisasContext *dc) | ||
487 | c = tcg_const_tl(simm); | ||
488 | cris_alu(dc, CC_OP_CMP, cpu_R[dc->dst], | ||
489 | cpu_R[dc->dst], c, 4); | ||
490 | - tcg_temp_free(c); | ||
491 | break; | ||
492 | case CRISV10_QIMM_ADDQ: | ||
493 | LOG_DIS("addq %d, $r%d\n", imm, dc->dst); | ||
494 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_quick_imm(DisasContext *dc) | ||
495 | c = tcg_const_tl(imm); | ||
496 | cris_alu(dc, CC_OP_ADD, cpu_R[dc->dst], | ||
497 | cpu_R[dc->dst], c, 4); | ||
498 | - tcg_temp_free(c); | ||
499 | break; | ||
500 | case CRISV10_QIMM_ANDQ: | ||
501 | LOG_DIS("andq %d, $r%d\n", simm, dc->dst); | ||
502 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_quick_imm(DisasContext *dc) | ||
503 | c = tcg_const_tl(simm); | ||
504 | cris_alu(dc, CC_OP_AND, cpu_R[dc->dst], | ||
505 | cpu_R[dc->dst], c, 4); | ||
506 | - tcg_temp_free(c); | ||
507 | break; | ||
508 | case CRISV10_QIMM_ASHQ: | ||
509 | LOG_DIS("ashq %d, $r%d\n", simm, dc->dst); | ||
510 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_quick_imm(DisasContext *dc) | ||
511 | gen_helper_btst(cpu_PR[PR_CCS], cpu_env, cpu_R[dc->dst], | ||
512 | c, cpu_PR[PR_CCS]); | ||
513 | } | ||
514 | - tcg_temp_free(c); | ||
515 | break; | ||
516 | case CRISV10_QIMM_LSHQ: | ||
517 | LOG_DIS("lshq %d, $r%d\n", simm, dc->dst); | ||
518 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_quick_imm(DisasContext *dc) | ||
519 | c = tcg_const_tl(imm); | ||
520 | cris_alu(dc, op, cpu_R[dc->dst], | ||
521 | cpu_R[dc->dst], c, 4); | ||
522 | - tcg_temp_free(c); | ||
523 | break; | ||
524 | case CRISV10_QIMM_SUBQ: | ||
525 | LOG_DIS("subq %d, $r%d\n", imm, dc->dst); | ||
526 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_quick_imm(DisasContext *dc) | ||
527 | c = tcg_const_tl(imm); | ||
528 | cris_alu(dc, CC_OP_SUB, cpu_R[dc->dst], | ||
529 | cpu_R[dc->dst], c, 4); | ||
530 | - tcg_temp_free(c); | ||
531 | break; | ||
532 | case CRISV10_QIMM_ORQ: | ||
533 | LOG_DIS("andq %d, $r%d\n", simm, dc->dst); | ||
534 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_quick_imm(DisasContext *dc) | ||
535 | c = tcg_const_tl(simm); | ||
536 | cris_alu(dc, CC_OP_OR, cpu_R[dc->dst], | ||
537 | cpu_R[dc->dst], c, 4); | ||
538 | - tcg_temp_free(c); | ||
539 | break; | ||
540 | |||
541 | case CRISV10_QIMM_BCC_R0: | ||
542 | @@ -XXX,XX +XXX,XX @@ static void dec10_reg_alu(DisasContext *dc, int op, int size, int sext) | ||
543 | |||
544 | assert(dc->dst != 15); | ||
545 | cris_alu(dc, op, cpu_R[dc->dst], t[0], t[1], size); | ||
546 | - tcg_temp_free(t[0]); | ||
547 | - tcg_temp_free(t[1]); | ||
548 | } | ||
549 | |||
550 | static void dec10_reg_bound(DisasContext *dc, int size) | ||
551 | @@ -XXX,XX +XXX,XX @@ static void dec10_reg_bound(DisasContext *dc, int size) | ||
552 | t = tcg_temp_new(); | ||
553 | t_gen_zext(t, cpu_R[dc->src], size); | ||
554 | cris_alu(dc, CC_OP_BOUND, cpu_R[dc->dst], cpu_R[dc->dst], t, 4); | ||
555 | - tcg_temp_free(t); | ||
556 | } | ||
557 | |||
558 | static void dec10_reg_mul(DisasContext *dc, int size, int sext) | ||
559 | @@ -XXX,XX +XXX,XX @@ static void dec10_reg_mul(DisasContext *dc, int size, int sext) | ||
560 | t[0], t[1], cpu_R[dc->dst], cpu_R[dc->src]); | ||
561 | |||
562 | cris_alu(dc, op, cpu_R[dc->dst], t[0], t[1], 4); | ||
563 | - | ||
564 | - tcg_temp_free(t[0]); | ||
565 | - tcg_temp_free(t[1]); | ||
566 | } | ||
567 | |||
568 | |||
569 | @@ -XXX,XX +XXX,XX @@ static void dec10_reg_movs(DisasContext *dc) | ||
570 | t_gen_zext(t, cpu_R[dc->src], size); | ||
571 | |||
572 | cris_alu(dc, CC_OP_MOVE, cpu_R[dc->dst], cpu_R[dc->dst], t, 4); | ||
573 | - tcg_temp_free(t); | ||
574 | } | ||
575 | |||
576 | static void dec10_reg_alux(DisasContext *dc, int op) | ||
577 | @@ -XXX,XX +XXX,XX @@ static void dec10_reg_alux(DisasContext *dc, int op) | ||
578 | t_gen_zext(t, cpu_R[dc->src], size); | ||
579 | |||
580 | cris_alu(dc, op, cpu_R[dc->dst], cpu_R[dc->dst], t, 4); | ||
581 | - tcg_temp_free(t); | ||
582 | } | ||
583 | |||
584 | static void dec10_reg_mov_pr(DisasContext *dc) | ||
585 | @@ -XXX,XX +XXX,XX @@ static void dec10_reg_abs(DisasContext *dc) | ||
586 | tcg_gen_sub_tl(t0, cpu_R[dc->dst], t0); | ||
587 | |||
588 | cris_alu(dc, CC_OP_MOVE, cpu_R[dc->dst], cpu_R[dc->dst], t0, 4); | ||
589 | - tcg_temp_free(t0); | ||
590 | } | ||
591 | |||
592 | static void dec10_reg_swap(DisasContext *dc) | ||
593 | @@ -XXX,XX +XXX,XX @@ static void dec10_reg_swap(DisasContext *dc) | ||
594 | if (dc->dst & 1) | ||
595 | t_gen_swapr(t0, t0); | ||
596 | cris_alu(dc, CC_OP_MOVE, cpu_R[dc->src], cpu_R[dc->src], t0, 4); | ||
597 | - tcg_temp_free(t0); | ||
598 | } | ||
599 | |||
600 | static void dec10_reg_scc(DisasContext *dc) | ||
601 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_reg(DisasContext *dc) | ||
602 | LOG_DIS("addi r%d r%d size=%d\n", dc->src, dc->dst, dc->size); | ||
603 | tcg_gen_shli_tl(t, cpu_R[dc->dst], dc->size & 3); | ||
604 | tcg_gen_add_tl(cpu_R[dc->src], cpu_R[dc->src], t); | ||
605 | - tcg_temp_free(t); | ||
606 | break; | ||
607 | case CRISV10_REG_LSL: | ||
608 | LOG_DIS("lsl $r%d, $r%d sz=%d\n", dc->src, dc->dst, size); | ||
609 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_reg(DisasContext *dc) | ||
610 | } else { | ||
611 | tcg_gen_add_tl(cpu_PR[PR_PREFIX], cpu_R[dc->src], t); | ||
612 | } | ||
613 | - tcg_temp_free(t); | ||
614 | cris_set_prefix(dc); | ||
615 | break; | ||
616 | |||
617 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind_move_m_r(CPUCRISState *env, DisasContext *dc, | ||
618 | dc->delayed_branch = 1; | ||
619 | } | ||
620 | |||
621 | - tcg_temp_free(t); | ||
622 | return insn_len; | ||
623 | } | ||
624 | |||
625 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind_move_r_m(DisasContext *dc, unsigned int size) | ||
626 | crisv10_prepare_memaddr(dc, addr, size); | ||
627 | gen_store_v10(dc, addr, cpu_R[dc->dst], size); | ||
628 | insn_len += crisv10_post_memaddr(dc, size); | ||
629 | - tcg_temp_free(addr); | ||
630 | |||
631 | return insn_len; | ||
632 | } | ||
633 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind_move_m_pr(CPUCRISState *env, DisasContext *dc) | ||
634 | tcg_gen_mov_tl(cpu_PR[rd], t); | ||
635 | dc->cpustate_changed = 1; | ||
636 | } | ||
637 | - tcg_temp_free(t); | ||
638 | return insn_len; | ||
639 | } | ||
640 | |||
641 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind_move_pr_m(DisasContext *dc) | ||
642 | cris_evaluate_flags(dc); | ||
643 | tcg_gen_andi_tl(t0, cpu_PR[PR_CCS], ~PFIX_FLAG); | ||
644 | gen_store_v10(dc, addr, t0, size); | ||
645 | - tcg_temp_free(t0); | ||
646 | } else { | ||
647 | gen_store_v10(dc, addr, cpu_PR[dc->dst], size); | ||
648 | } | ||
649 | insn_len += crisv10_post_memaddr(dc, size); | ||
650 | - tcg_temp_free(addr); | ||
651 | cris_lock_irq(dc); | ||
652 | |||
653 | return insn_len; | ||
654 | @@ -XXX,XX +XXX,XX @@ static void dec10_movem_r_m(DisasContext *dc) | ||
655 | if (!pfix && dc->mode == CRISV10_MODE_AUTOINC) { | ||
656 | tcg_gen_mov_tl(cpu_R[dc->src], addr); | ||
657 | } | ||
658 | - tcg_temp_free(addr); | ||
659 | - tcg_temp_free(t0); | ||
660 | } | ||
661 | |||
662 | static void dec10_movem_m_r(DisasContext *dc) | ||
663 | @@ -XXX,XX +XXX,XX @@ static void dec10_movem_m_r(DisasContext *dc) | ||
664 | if (!pfix && dc->mode == CRISV10_MODE_AUTOINC) { | ||
665 | tcg_gen_mov_tl(cpu_R[dc->src], addr); | ||
666 | } | ||
667 | - tcg_temp_free(addr); | ||
668 | - tcg_temp_free(t0); | ||
669 | } | ||
670 | |||
671 | static int dec10_ind_alu(CPUCRISState *env, DisasContext *dc, | ||
672 | @@ -XXX,XX +XXX,XX @@ static int dec10_ind_bound(CPUCRISState *env, DisasContext *dc, | ||
673 | dc->delayed_branch = 1; | ||
674 | } | ||
675 | |||
676 | - tcg_temp_free(t); | ||
677 | return insn_len; | ||
678 | } | ||
679 | |||
680 | @@ -XXX,XX +XXX,XX @@ static int dec10_alux_m(CPUCRISState *env, DisasContext *dc, int op) | ||
681 | dc->delayed_branch = 1; | ||
682 | } | ||
683 | |||
684 | - tcg_temp_free(t); | ||
685 | return insn_len; | ||
686 | } | ||
687 | |||
688 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc) | ||
689 | c = tcg_const_tl(0); | ||
690 | cris_alu(dc, CC_OP_CMP, cpu_R[dc->dst], | ||
691 | t[0], c, size); | ||
692 | - tcg_temp_free(c); | ||
693 | break; | ||
694 | case CRISV10_IND_ADD: | ||
695 | LOG_DIS("add size=%d op=%d %d\n", size, dc->src, dc->dst); | ||
696 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc) | ||
697 | |||
698 | c = tcg_const_tl(dc->pc + insn_len); | ||
699 | t_gen_mov_preg_TN(dc, dc->dst, c); | ||
700 | - tcg_temp_free(c); | ||
701 | dc->jmp_pc = imm; | ||
702 | cris_prepare_jmp(dc, JMP_DIRECT); | ||
703 | dc->delayed_branch--; /* v10 has no dslot here. */ | ||
704 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc) | ||
705 | tcg_gen_movi_tl(env_pc, dc->pc + 2); | ||
706 | c = tcg_const_tl(dc->src + 2); | ||
707 | t_gen_mov_env_TN(trap_vector, c); | ||
708 | - tcg_temp_free(c); | ||
709 | t_gen_raise_exception(EXCP_BREAK); | ||
710 | dc->base.is_jmp = DISAS_NORETURN; | ||
711 | return insn_len; | ||
712 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc) | ||
713 | t[0] = tcg_temp_new(); | ||
714 | c = tcg_const_tl(dc->pc + insn_len); | ||
715 | t_gen_mov_preg_TN(dc, dc->dst, c); | ||
716 | - tcg_temp_free(c); | ||
717 | crisv10_prepare_memaddr(dc, t[0], size); | ||
718 | gen_load(dc, env_btarget, t[0], 4, 0); | ||
719 | insn_len += crisv10_post_memaddr(dc, size); | ||
720 | cris_prepare_jmp(dc, JMP_INDIRECT); | ||
721 | dc->delayed_branch--; /* v10 has no dslot here. */ | ||
722 | - tcg_temp_free(t[0]); | ||
723 | } | ||
724 | break; | ||
725 | |||
726 | @@ -XXX,XX +XXX,XX @@ static unsigned int dec10_ind(CPUCRISState *env, DisasContext *dc) | ||
727 | tcg_gen_mov_tl(env_btarget, cpu_R[dc->src]); | ||
728 | c = tcg_const_tl(dc->pc + insn_len); | ||
729 | t_gen_mov_preg_TN(dc, dc->dst, c); | ||
730 | - tcg_temp_free(c); | ||
731 | cris_prepare_jmp(dc, JMP_INDIRECT); | ||
732 | dc->delayed_branch--; /* v10 has no dslot here. */ | ||
733 | break; | ||
734 | -- | ||
735 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Taylor Simpson <tsimpson@quicinc.com> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/hexagon/gen_tcg.h | 29 ------------------ | ||
7 | target/hexagon/gen_tcg_hvx.h | 15 ---------- | ||
8 | target/hexagon/macros.h | 7 ----- | ||
9 | target/hexagon/genptr.c | 58 ------------------------------------ | ||
10 | target/hexagon/translate.c | 7 ----- | ||
11 | target/hexagon/README | 5 ---- | ||
12 | 6 files changed, 121 deletions(-) | ||
13 | |||
14 | diff --git a/target/hexagon/gen_tcg.h b/target/hexagon/gen_tcg.h | ||
15 | index XXXXXXX..XXXXXXX 100644 | ||
16 | --- a/target/hexagon/gen_tcg.h | ||
17 | +++ b/target/hexagon/gen_tcg.h | ||
18 | @@ -XXX,XX +XXX,XX @@ | ||
19 | tcg_gen_mov_tl(EA, RxV); \ | ||
20 | gen_read_ireg(ireg, MuV, (SHIFT)); \ | ||
21 | gen_helper_fcircadd(RxV, RxV, ireg, MuV, hex_gpr[HEX_REG_CS0 + MuN]); \ | ||
22 | - tcg_temp_free(ireg); \ | ||
23 | } while (0) | ||
24 | |||
25 | /* Instructions with multiple definitions */ | ||
26 | @@ -XXX,XX +XXX,XX @@ | ||
27 | gen_read_ireg(ireg, MuV, SHIFT); \ | ||
28 | gen_helper_fcircadd(RxV, RxV, ireg, MuV, hex_gpr[HEX_REG_CS0 + MuN]); \ | ||
29 | LOAD; \ | ||
30 | - tcg_temp_free(ireg); \ | ||
31 | } while (0) | ||
32 | |||
33 | #define fGEN_TCG_L2_loadrub_pcr(SHORTCODE) \ | ||
34 | @@ -XXX,XX +XXX,XX @@ | ||
35 | for (int i = 0; i < 2; i++) { \ | ||
36 | gen_set_half(i, RdV, gen_get_byte(byte, i, tmp, (SIGN))); \ | ||
37 | } \ | ||
38 | - tcg_temp_free(tmp); \ | ||
39 | - tcg_temp_free(byte); \ | ||
40 | } while (0) | ||
41 | |||
42 | #define fGEN_TCG_L2_loadbzw2_io(SHORTCODE) \ | ||
43 | @@ -XXX,XX +XXX,XX @@ | ||
44 | for (int i = 0; i < 4; i++) { \ | ||
45 | gen_set_half_i64(i, RddV, gen_get_byte(byte, i, tmp, (SIGN))); \ | ||
46 | } \ | ||
47 | - tcg_temp_free(tmp); \ | ||
48 | - tcg_temp_free(byte); \ | ||
49 | } while (0) | ||
50 | |||
51 | #define fGEN_TCG_L2_loadbzw4_io(SHORTCODE) \ | ||
52 | @@ -XXX,XX +XXX,XX @@ | ||
53 | tcg_gen_extu_i32_i64(tmp_i64, tmp); \ | ||
54 | tcg_gen_shri_i64(RyyV, RyyV, 16); \ | ||
55 | tcg_gen_deposit_i64(RyyV, RyyV, tmp_i64, 48, 16); \ | ||
56 | - tcg_temp_free(tmp); \ | ||
57 | - tcg_temp_free_i64(tmp_i64); \ | ||
58 | } while (0) | ||
59 | |||
60 | #define fGEN_TCG_L4_loadalignh_ur(SHORTCODE) \ | ||
61 | @@ -XXX,XX +XXX,XX @@ | ||
62 | tcg_gen_extu_i32_i64(tmp_i64, tmp); \ | ||
63 | tcg_gen_shri_i64(RyyV, RyyV, 8); \ | ||
64 | tcg_gen_deposit_i64(RyyV, RyyV, tmp_i64, 56, 8); \ | ||
65 | - tcg_temp_free(tmp); \ | ||
66 | - tcg_temp_free_i64(tmp_i64); \ | ||
67 | } while (0) | ||
68 | |||
69 | #define fGEN_TCG_L2_loadalignb_io(SHORTCODE) \ | ||
70 | @@ -XXX,XX +XXX,XX @@ | ||
71 | tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, label); \ | ||
72 | fLOAD(1, SIZE, SIGN, EA, RdV); \ | ||
73 | gen_set_label(label); \ | ||
74 | - tcg_temp_free(LSB); \ | ||
75 | } while (0) | ||
76 | |||
77 | #define fGEN_TCG_L2_ploadrubt_pi(SHORTCODE) \ | ||
78 | @@ -XXX,XX +XXX,XX @@ | ||
79 | tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, label); \ | ||
80 | fLOAD(1, 8, u, EA, RddV); \ | ||
81 | gen_set_label(label); \ | ||
82 | - tcg_temp_free(LSB); \ | ||
83 | } while (0) | ||
84 | |||
85 | #define fGEN_TCG_L2_ploadrdt_pi(SHORTCODE) \ | ||
86 | @@ -XXX,XX +XXX,XX @@ | ||
87 | TCGv HALF = tcg_temp_new(); \ | ||
88 | TCGv BYTE = tcg_temp_new(); \ | ||
89 | SHORTCODE; \ | ||
90 | - tcg_temp_free(HALF); \ | ||
91 | - tcg_temp_free(BYTE); \ | ||
92 | } while (0) | ||
93 | |||
94 | #define fGEN_TCG_STORE_pcr(SHIFT, STORE) \ | ||
95 | @@ -XXX,XX +XXX,XX @@ | ||
96 | gen_read_ireg(ireg, MuV, SHIFT); \ | ||
97 | gen_helper_fcircadd(RxV, RxV, ireg, MuV, hex_gpr[HEX_REG_CS0 + MuN]); \ | ||
98 | STORE; \ | ||
99 | - tcg_temp_free(ireg); \ | ||
100 | - tcg_temp_free(HALF); \ | ||
101 | - tcg_temp_free(BYTE); \ | ||
102 | } while (0) | ||
103 | |||
104 | #define fGEN_TCG_S2_storerb_pbr(SHORTCODE) \ | ||
105 | @@ -XXX,XX +XXX,XX @@ | ||
106 | gen_helper_sfrecipa(tmp, cpu_env, RsV, RtV); \ | ||
107 | tcg_gen_extrh_i64_i32(RdV, tmp); \ | ||
108 | tcg_gen_extrl_i64_i32(PeV, tmp); \ | ||
109 | - tcg_temp_free_i64(tmp); \ | ||
110 | } while (0) | ||
111 | |||
112 | /* | ||
113 | @@ -XXX,XX +XXX,XX @@ | ||
114 | gen_helper_sfinvsqrta(tmp, cpu_env, RsV); \ | ||
115 | tcg_gen_extrh_i64_i32(RdV, tmp); \ | ||
116 | tcg_gen_extrl_i64_i32(PeV, tmp); \ | ||
117 | - tcg_temp_free_i64(tmp); \ | ||
118 | } while (0) | ||
119 | |||
120 | /* | ||
121 | @@ -XXX,XX +XXX,XX @@ | ||
122 | tcg_gen_add2_i64(RddV, carry, RddV, carry, RttV, zero); \ | ||
123 | tcg_gen_extrl_i64_i32(PxV, carry); \ | ||
124 | gen_8bitsof(PxV, PxV); \ | ||
125 | - tcg_temp_free_i64(carry); \ | ||
126 | } while (0) | ||
127 | |||
128 | /* r5:4 = sub(r1:0, r3:2, p1):carry */ | ||
129 | @@ -XXX,XX +XXX,XX @@ | ||
130 | tcg_gen_add2_i64(RddV, carry, RddV, carry, not_RttV, zero); \ | ||
131 | tcg_gen_extrl_i64_i32(PxV, carry); \ | ||
132 | gen_8bitsof(PxV, PxV); \ | ||
133 | - tcg_temp_free_i64(carry); \ | ||
134 | - tcg_temp_free_i64(not_RttV); \ | ||
135 | } while (0) | ||
136 | |||
137 | /* | ||
138 | @@ -XXX,XX +XXX,XX @@ | ||
139 | tcg_gen_umin_tl(tmp, left, right); \ | ||
140 | gen_set_byte_i64(i, RddV, tmp); \ | ||
141 | } \ | ||
142 | - tcg_temp_free(left); \ | ||
143 | - tcg_temp_free(right); \ | ||
144 | - tcg_temp_free(tmp); \ | ||
145 | } while (0) | ||
146 | |||
147 | #define fGEN_TCG_J2_call(SHORTCODE) \ | ||
148 | @@ -XXX,XX +XXX,XX @@ | ||
149 | TCGv LSB = tcg_temp_new(); \ | ||
150 | COND; \ | ||
151 | gen_cond_jump(ctx, TCG_COND_EQ, LSB, riV); \ | ||
152 | - tcg_temp_free(LSB); \ | ||
153 | } while (0) | ||
154 | #define fGEN_TCG_cond_jumpf(COND) \ | ||
155 | do { \ | ||
156 | TCGv LSB = tcg_temp_new(); \ | ||
157 | COND; \ | ||
158 | gen_cond_jump(ctx, TCG_COND_NE, LSB, riV); \ | ||
159 | - tcg_temp_free(LSB); \ | ||
160 | } while (0) | ||
161 | |||
162 | #define fGEN_TCG_J2_jumpt(SHORTCODE) \ | ||
163 | @@ -XXX,XX +XXX,XX @@ | ||
164 | TCGv LSB = tcg_temp_new(); \ | ||
165 | COND; \ | ||
166 | gen_cond_jumpr(ctx, RsV, TCG_COND_EQ, LSB); \ | ||
167 | - tcg_temp_free(LSB); \ | ||
168 | } while (0) | ||
169 | #define fGEN_TCG_cond_jumprf(COND) \ | ||
170 | do { \ | ||
171 | TCGv LSB = tcg_temp_new(); \ | ||
172 | COND; \ | ||
173 | gen_cond_jumpr(ctx, RsV, TCG_COND_NE, LSB); \ | ||
174 | - tcg_temp_free(LSB); \ | ||
175 | } while (0) | ||
176 | |||
177 | #define fGEN_TCG_J2_jumprt(SHORTCODE) \ | ||
178 | diff --git a/target/hexagon/gen_tcg_hvx.h b/target/hexagon/gen_tcg_hvx.h | ||
179 | index XXXXXXX..XXXXXXX 100644 | ||
180 | --- a/target/hexagon/gen_tcg_hvx.h | ||
181 | +++ b/target/hexagon/gen_tcg_hvx.h | ||
182 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
183 | TCGLabel *end_label = gen_new_label(); \ | ||
184 | tcg_gen_andi_tl(lsb, PsV, 1); \ | ||
185 | tcg_gen_brcondi_tl(TCG_COND_NE, lsb, PRED, false_label); \ | ||
186 | - tcg_temp_free(lsb); \ | ||
187 | tcg_gen_gvec_mov(MO_64, VdV_off, VuV_off, \ | ||
188 | sizeof(MMVector), sizeof(MMVector)); \ | ||
189 | tcg_gen_br(end_label); \ | ||
190 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
191 | tcg_gen_andi_tl(shift, RtV, 15); \ | ||
192 | tcg_gen_gvec_sars(MO_16, VdV_off, VuV_off, shift, \ | ||
193 | sizeof(MMVector), sizeof(MMVector)); \ | ||
194 | - tcg_temp_free(shift); \ | ||
195 | } while (0) | ||
196 | |||
197 | #define fGEN_TCG_V6_vasrh_acc(SHORTCODE) \ | ||
198 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
199 | sizeof(MMVector), sizeof(MMVector)); \ | ||
200 | tcg_gen_gvec_add(MO_16, VxV_off, VxV_off, tmpoff, \ | ||
201 | sizeof(MMVector), sizeof(MMVector)); \ | ||
202 | - tcg_temp_free(shift); \ | ||
203 | } while (0) | ||
204 | |||
205 | #define fGEN_TCG_V6_vasrw(SHORTCODE) \ | ||
206 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
207 | tcg_gen_andi_tl(shift, RtV, 31); \ | ||
208 | tcg_gen_gvec_sars(MO_32, VdV_off, VuV_off, shift, \ | ||
209 | sizeof(MMVector), sizeof(MMVector)); \ | ||
210 | - tcg_temp_free(shift); \ | ||
211 | } while (0) | ||
212 | |||
213 | #define fGEN_TCG_V6_vasrw_acc(SHORTCODE) \ | ||
214 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
215 | sizeof(MMVector), sizeof(MMVector)); \ | ||
216 | tcg_gen_gvec_add(MO_32, VxV_off, VxV_off, tmpoff, \ | ||
217 | sizeof(MMVector), sizeof(MMVector)); \ | ||
218 | - tcg_temp_free(shift); \ | ||
219 | } while (0) | ||
220 | |||
221 | #define fGEN_TCG_V6_vlsrb(SHORTCODE) \ | ||
222 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
223 | tcg_gen_andi_tl(shift, RtV, 7); \ | ||
224 | tcg_gen_gvec_shrs(MO_8, VdV_off, VuV_off, shift, \ | ||
225 | sizeof(MMVector), sizeof(MMVector)); \ | ||
226 | - tcg_temp_free(shift); \ | ||
227 | } while (0) | ||
228 | |||
229 | #define fGEN_TCG_V6_vlsrh(SHORTCODE) \ | ||
230 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
231 | tcg_gen_andi_tl(shift, RtV, 15); \ | ||
232 | tcg_gen_gvec_shrs(MO_16, VdV_off, VuV_off, shift, \ | ||
233 | sizeof(MMVector), sizeof(MMVector)); \ | ||
234 | - tcg_temp_free(shift); \ | ||
235 | } while (0) | ||
236 | |||
237 | #define fGEN_TCG_V6_vlsrw(SHORTCODE) \ | ||
238 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
239 | tcg_gen_andi_tl(shift, RtV, 31); \ | ||
240 | tcg_gen_gvec_shrs(MO_32, VdV_off, VuV_off, shift, \ | ||
241 | sizeof(MMVector), sizeof(MMVector)); \ | ||
242 | - tcg_temp_free(shift); \ | ||
243 | } while (0) | ||
244 | |||
245 | /* Vector shift left - various forms */ | ||
246 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
247 | tcg_gen_andi_tl(shift, RtV, 7); \ | ||
248 | tcg_gen_gvec_shls(MO_8, VdV_off, VuV_off, shift, \ | ||
249 | sizeof(MMVector), sizeof(MMVector)); \ | ||
250 | - tcg_temp_free(shift); \ | ||
251 | } while (0) | ||
252 | |||
253 | #define fGEN_TCG_V6_vaslh(SHORTCODE) \ | ||
254 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
255 | tcg_gen_andi_tl(shift, RtV, 15); \ | ||
256 | tcg_gen_gvec_shls(MO_16, VdV_off, VuV_off, shift, \ | ||
257 | sizeof(MMVector), sizeof(MMVector)); \ | ||
258 | - tcg_temp_free(shift); \ | ||
259 | } while (0) | ||
260 | |||
261 | #define fGEN_TCG_V6_vaslh_acc(SHORTCODE) \ | ||
262 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
263 | sizeof(MMVector), sizeof(MMVector)); \ | ||
264 | tcg_gen_gvec_add(MO_16, VxV_off, VxV_off, tmpoff, \ | ||
265 | sizeof(MMVector), sizeof(MMVector)); \ | ||
266 | - tcg_temp_free(shift); \ | ||
267 | } while (0) | ||
268 | |||
269 | #define fGEN_TCG_V6_vaslw(SHORTCODE) \ | ||
270 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
271 | tcg_gen_andi_tl(shift, RtV, 31); \ | ||
272 | tcg_gen_gvec_shls(MO_32, VdV_off, VuV_off, shift, \ | ||
273 | sizeof(MMVector), sizeof(MMVector)); \ | ||
274 | - tcg_temp_free(shift); \ | ||
275 | } while (0) | ||
276 | |||
277 | #define fGEN_TCG_V6_vaslw_acc(SHORTCODE) \ | ||
278 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
279 | sizeof(MMVector), sizeof(MMVector)); \ | ||
280 | tcg_gen_gvec_add(MO_32, VxV_off, VxV_off, tmpoff, \ | ||
281 | sizeof(MMVector), sizeof(MMVector)); \ | ||
282 | - tcg_temp_free(shift); \ | ||
283 | } while (0) | ||
284 | |||
285 | /* Vector max - various forms */ | ||
286 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
287 | GET_EA; \ | ||
288 | PRED; \ | ||
289 | tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, false_label); \ | ||
290 | - tcg_temp_free(LSB); \ | ||
291 | gen_vreg_load(ctx, DSTOFF, EA, true); \ | ||
292 | INC; \ | ||
293 | tcg_gen_br(end_label); \ | ||
294 | @@ -XXX,XX +XXX,XX @@ static inline void assert_vhist_tmp(DisasContext *ctx) | ||
295 | GET_EA; \ | ||
296 | PRED; \ | ||
297 | tcg_gen_brcondi_tl(TCG_COND_EQ, LSB, 0, false_label); \ | ||
298 | - tcg_temp_free(LSB); \ | ||
299 | gen_vreg_store(ctx, EA, SRCOFF, insn->slot, ALIGN); \ | ||
300 | INC; \ | ||
301 | tcg_gen_br(end_label); \ | ||
302 | diff --git a/target/hexagon/macros.h b/target/hexagon/macros.h | ||
303 | index XXXXXXX..XXXXXXX 100644 | ||
304 | --- a/target/hexagon/macros.h | ||
305 | +++ b/target/hexagon/macros.h | ||
306 | @@ -XXX,XX +XXX,XX @@ static inline void gen_pred_cancel(TCGv pred, uint32_t slot_num) | ||
307 | tcg_gen_andi_tl(tmp, pred, 1); | ||
308 | tcg_gen_movcond_tl(TCG_COND_EQ, hex_slot_cancelled, tmp, zero, | ||
309 | slot_mask, hex_slot_cancelled); | ||
310 | - tcg_temp_free(slot_mask); | ||
311 | - tcg_temp_free(tmp); | ||
312 | } | ||
313 | #define PRED_LOAD_CANCEL(PRED, EA) \ | ||
314 | gen_pred_cancel(PRED, insn->is_endloop ? 4 : insn->slot) | ||
315 | @@ -XXX,XX +XXX,XX @@ static inline TCGv gen_read_ireg(TCGv result, TCGv val, int shift) | ||
316 | tcg_gen_deposit_tl(result, msb, lsb, 0, 7); | ||
317 | |||
318 | tcg_gen_shli_tl(result, result, shift); | ||
319 | - | ||
320 | - tcg_temp_free(msb); | ||
321 | - tcg_temp_free(lsb); | ||
322 | - | ||
323 | return result; | ||
324 | } | ||
325 | #define fREAD_IREG(VAL, SHIFT) gen_read_ireg(ireg, (VAL), (SHIFT)) | ||
326 | @@ -XXX,XX +XXX,XX @@ static inline TCGv gen_read_ireg(TCGv result, TCGv val, int shift) | ||
327 | TCGv tmp = tcg_temp_new(); \ | ||
328 | tcg_gen_shli_tl(tmp, REG2, SCALE); \ | ||
329 | tcg_gen_add_tl(EA, REG, tmp); \ | ||
330 | - tcg_temp_free(tmp); \ | ||
331 | } while (0) | ||
332 | #define fEA_IRs(IMM, REG, SCALE) \ | ||
333 | do { \ | ||
334 | diff --git a/target/hexagon/genptr.c b/target/hexagon/genptr.c | ||
335 | index XXXXXXX..XXXXXXX 100644 | ||
336 | --- a/target/hexagon/genptr.c | ||
337 | +++ b/target/hexagon/genptr.c | ||
338 | @@ -XXX,XX +XXX,XX @@ static inline void gen_masked_reg_write(TCGv new_val, TCGv cur_val, | ||
339 | tcg_gen_andi_tl(new_val, new_val, ~reg_mask); | ||
340 | tcg_gen_andi_tl(tmp, cur_val, reg_mask); | ||
341 | tcg_gen_or_tl(new_val, new_val, tmp); | ||
342 | - | ||
343 | - tcg_temp_free(tmp); | ||
344 | } | ||
345 | } | ||
346 | |||
347 | @@ -XXX,XX +XXX,XX @@ static inline void gen_log_predicated_reg_write(int rnum, TCGv val, | ||
348 | tcg_gen_setcond_tl(TCG_COND_EQ, slot_mask, slot_mask, zero); | ||
349 | tcg_gen_or_tl(hex_reg_written[rnum], hex_reg_written[rnum], slot_mask); | ||
350 | } | ||
351 | - | ||
352 | - tcg_temp_free(slot_mask); | ||
353 | } | ||
354 | |||
355 | void gen_log_reg_write(int rnum, TCGv val) | ||
356 | @@ -XXX,XX +XXX,XX @@ static void gen_log_predicated_reg_write_pair(int rnum, TCGv_i64 val, | ||
357 | tcg_gen_or_tl(hex_reg_written[rnum + 1], hex_reg_written[rnum + 1], | ||
358 | slot_mask); | ||
359 | } | ||
360 | - | ||
361 | - tcg_temp_free(val32); | ||
362 | - tcg_temp_free(slot_mask); | ||
363 | } | ||
364 | |||
365 | static void gen_log_reg_write_pair(int rnum, TCGv_i64 val) | ||
366 | @@ -XXX,XX +XXX,XX @@ static void gen_log_reg_write_pair(int rnum, TCGv_i64 val) | ||
367 | /* Do this so HELPER(debug_commit_end) will know */ | ||
368 | tcg_gen_movi_tl(hex_reg_written[rnum + 1], 1); | ||
369 | } | ||
370 | - | ||
371 | - tcg_temp_free(val32); | ||
372 | } | ||
373 | |||
374 | void gen_log_pred_write(DisasContext *ctx, int pnum, TCGv val) | ||
375 | @@ -XXX,XX +XXX,XX @@ void gen_log_pred_write(DisasContext *ctx, int pnum, TCGv val) | ||
376 | hex_new_pred_value[pnum], base_val); | ||
377 | } | ||
378 | tcg_gen_ori_tl(hex_pred_written, hex_pred_written, 1 << pnum); | ||
379 | - | ||
380 | - tcg_temp_free(base_val); | ||
381 | } | ||
382 | |||
383 | static inline void gen_read_p3_0(TCGv control_reg) | ||
384 | @@ -XXX,XX +XXX,XX @@ static inline void gen_read_ctrl_reg_pair(DisasContext *ctx, const int reg_num, | ||
385 | TCGv p3_0 = tcg_temp_new(); | ||
386 | gen_read_p3_0(p3_0); | ||
387 | tcg_gen_concat_i32_i64(dest, p3_0, hex_gpr[reg_num + 1]); | ||
388 | - tcg_temp_free(p3_0); | ||
389 | } else if (reg_num == HEX_REG_PC - 1) { | ||
390 | TCGv pc = tcg_constant_tl(ctx->base.pc_next); | ||
391 | tcg_gen_concat_i32_i64(dest, hex_gpr[reg_num], pc); | ||
392 | @@ -XXX,XX +XXX,XX @@ static inline void gen_read_ctrl_reg_pair(DisasContext *ctx, const int reg_num, | ||
393 | tcg_gen_addi_tl(insn_cnt, hex_gpr[HEX_REG_QEMU_INSN_CNT], | ||
394 | ctx->num_insns); | ||
395 | tcg_gen_concat_i32_i64(dest, pkt_cnt, insn_cnt); | ||
396 | - tcg_temp_free(pkt_cnt); | ||
397 | - tcg_temp_free(insn_cnt); | ||
398 | } else if (reg_num == HEX_REG_QEMU_HVX_CNT) { | ||
399 | TCGv hvx_cnt = tcg_temp_new(); | ||
400 | tcg_gen_addi_tl(hvx_cnt, hex_gpr[HEX_REG_QEMU_HVX_CNT], | ||
401 | ctx->num_hvx_insns); | ||
402 | tcg_gen_concat_i32_i64(dest, hvx_cnt, hex_gpr[reg_num + 1]); | ||
403 | - tcg_temp_free(hvx_cnt); | ||
404 | } else { | ||
405 | tcg_gen_concat_i32_i64(dest, | ||
406 | hex_gpr[reg_num], | ||
407 | @@ -XXX,XX +XXX,XX @@ static void gen_write_p3_0(DisasContext *ctx, TCGv control_reg) | ||
408 | gen_log_pred_write(ctx, i, hex_p8); | ||
409 | ctx_log_pred_write(ctx, i); | ||
410 | } | ||
411 | - tcg_temp_free(hex_p8); | ||
412 | } | ||
413 | |||
414 | /* | ||
415 | @@ -XXX,XX +XXX,XX @@ static inline void gen_write_ctrl_reg_pair(DisasContext *ctx, int reg_num, | ||
416 | gen_write_p3_0(ctx, val32); | ||
417 | tcg_gen_extrh_i64_i32(val32, val); | ||
418 | gen_log_reg_write(reg_num + 1, val32); | ||
419 | - tcg_temp_free(val32); | ||
420 | ctx_log_reg_write(ctx, reg_num + 1); | ||
421 | } else { | ||
422 | gen_log_reg_write_pair(reg_num, val); | ||
423 | @@ -XXX,XX +XXX,XX @@ TCGv gen_get_byte_i64(TCGv result, int N, TCGv_i64 src, bool sign) | ||
424 | tcg_gen_extract_i64(res64, src, N * 8, 8); | ||
425 | } | ||
426 | tcg_gen_extrl_i64_i32(result, res64); | ||
427 | - tcg_temp_free_i64(res64); | ||
428 | |||
429 | return result; | ||
430 | } | ||
431 | @@ -XXX,XX +XXX,XX @@ void gen_set_half_i64(int N, TCGv_i64 result, TCGv src) | ||
432 | TCGv_i64 src64 = tcg_temp_new_i64(); | ||
433 | tcg_gen_extu_i32_i64(src64, src); | ||
434 | tcg_gen_deposit_i64(result, result, src64, N * 16, 16); | ||
435 | - tcg_temp_free_i64(src64); | ||
436 | } | ||
437 | |||
438 | void gen_set_byte_i64(int N, TCGv_i64 result, TCGv src) | ||
439 | @@ -XXX,XX +XXX,XX @@ void gen_set_byte_i64(int N, TCGv_i64 result, TCGv src) | ||
440 | TCGv_i64 src64 = tcg_temp_new_i64(); | ||
441 | tcg_gen_extu_i32_i64(src64, src); | ||
442 | tcg_gen_deposit_i64(result, result, src64, N * 8, 8); | ||
443 | - tcg_temp_free_i64(src64); | ||
444 | } | ||
445 | |||
446 | static inline void gen_load_locked4u(TCGv dest, TCGv vaddr, int mem_index) | ||
447 | @@ -XXX,XX +XXX,XX @@ static inline void gen_store_conditional4(DisasContext *ctx, | ||
448 | ctx->mem_idx, MO_32); | ||
449 | tcg_gen_movcond_tl(TCG_COND_EQ, pred, tmp, hex_llsc_val, | ||
450 | one, zero); | ||
451 | - tcg_temp_free(tmp); | ||
452 | tcg_gen_br(done); | ||
453 | |||
454 | gen_set_label(fail); | ||
455 | @@ -XXX,XX +XXX,XX @@ static inline void gen_store_conditional8(DisasContext *ctx, | ||
456 | tcg_gen_movcond_i64(TCG_COND_EQ, tmp, tmp, hex_llsc_val_i64, | ||
457 | one, zero); | ||
458 | tcg_gen_extrl_i64_i32(pred, tmp); | ||
459 | - tcg_temp_free_i64(tmp); | ||
460 | tcg_gen_br(done); | ||
461 | |||
462 | gen_set_label(fail); | ||
463 | @@ -XXX,XX +XXX,XX @@ static void gen_cmpnd_cmp_jmp(DisasContext *ctx, | ||
464 | TCGv pred = tcg_temp_new(); | ||
465 | gen_compare(cond1, pred, arg1, arg2); | ||
466 | gen_log_pred_write(ctx, pnum, pred); | ||
467 | - tcg_temp_free(pred); | ||
468 | } else { | ||
469 | TCGv pred = tcg_temp_new(); | ||
470 | tcg_gen_mov_tl(pred, hex_new_pred_value[pnum]); | ||
471 | gen_cond_jump(ctx, cond2, pred, pc_off); | ||
472 | - tcg_temp_free(pred); | ||
473 | } | ||
474 | } | ||
475 | |||
476 | @@ -XXX,XX +XXX,XX @@ static void gen_cmpnd_tstbit0_jmp(DisasContext *ctx, | ||
477 | tcg_gen_andi_tl(pred, arg, 1); | ||
478 | gen_8bitsof(pred, pred); | ||
479 | gen_log_pred_write(ctx, pnum, pred); | ||
480 | - tcg_temp_free(pred); | ||
481 | } else { | ||
482 | TCGv pred = tcg_temp_new(); | ||
483 | tcg_gen_mov_tl(pred, hex_new_pred_value[pnum]); | ||
484 | gen_cond_jump(ctx, cond, pred, pc_off); | ||
485 | - tcg_temp_free(pred); | ||
486 | } | ||
487 | } | ||
488 | |||
489 | @@ -XXX,XX +XXX,XX @@ static void gen_testbit0_jumpnv(DisasContext *ctx, | ||
490 | TCGv pred = tcg_temp_new(); | ||
491 | tcg_gen_andi_tl(pred, arg, 1); | ||
492 | gen_cond_jump(ctx, cond, pred, pc_off); | ||
493 | - tcg_temp_free(pred); | ||
494 | } | ||
495 | |||
496 | static void gen_jump(DisasContext *ctx, int pc_off) | ||
497 | @@ -XXX,XX +XXX,XX @@ static void gen_cond_call(DisasContext *ctx, TCGv pred, | ||
498 | tcg_gen_andi_tl(lsb, pred, 1); | ||
499 | gen_write_new_pc_pcrel(ctx, pc_off, cond, lsb); | ||
500 | tcg_gen_brcondi_tl(cond, lsb, 0, skip); | ||
501 | - tcg_temp_free(lsb); | ||
502 | next_PC = | ||
503 | tcg_constant_tl(ctx->pkt->pc + ctx->pkt->encod_pkt_size_in_bytes); | ||
504 | gen_log_reg_write(HEX_REG_LR, next_PC); | ||
505 | @@ -XXX,XX +XXX,XX @@ static void gen_endloop0(DisasContext *ctx) | ||
506 | } | ||
507 | gen_set_label(label3); | ||
508 | } | ||
509 | - | ||
510 | - tcg_temp_free(lpcfg); | ||
511 | } | ||
512 | |||
513 | static void gen_cmp_jumpnv(DisasContext *ctx, | ||
514 | @@ -XXX,XX +XXX,XX @@ static void gen_cmp_jumpnv(DisasContext *ctx, | ||
515 | TCGv pred = tcg_temp_new(); | ||
516 | tcg_gen_setcond_tl(cond, pred, val, src); | ||
517 | gen_cond_jump(ctx, TCG_COND_EQ, pred, pc_off); | ||
518 | - tcg_temp_free(pred); | ||
519 | } | ||
520 | |||
521 | static void gen_cmpi_jumpnv(DisasContext *ctx, | ||
522 | @@ -XXX,XX +XXX,XX @@ static void gen_cmpi_jumpnv(DisasContext *ctx, | ||
523 | TCGv pred = tcg_temp_new(); | ||
524 | tcg_gen_setcondi_tl(cond, pred, val, src); | ||
525 | gen_cond_jump(ctx, TCG_COND_EQ, pred, pc_off); | ||
526 | - tcg_temp_free(pred); | ||
527 | } | ||
528 | |||
529 | /* Shift left with saturation */ | ||
530 | @@ -XXX,XX +XXX,XX @@ static void gen_shl_sat(TCGv dst, TCGv src, TCGv shift_amt) | ||
531 | tcg_gen_or_tl(hex_new_value[HEX_REG_USR], hex_new_value[HEX_REG_USR], ovf); | ||
532 | |||
533 | tcg_gen_movcond_tl(TCG_COND_EQ, dst, dst_sar, src, dst, satval); | ||
534 | - | ||
535 | - tcg_temp_free(sh32); | ||
536 | - tcg_temp_free(dst_sar); | ||
537 | - tcg_temp_free(ovf); | ||
538 | - tcg_temp_free(satval); | ||
539 | } | ||
540 | |||
541 | static void gen_sar(TCGv dst, TCGv src, TCGv shift_amt) | ||
542 | @@ -XXX,XX +XXX,XX @@ static void gen_sar(TCGv dst, TCGv src, TCGv shift_amt) | ||
543 | TCGv tmp = tcg_temp_new(); | ||
544 | tcg_gen_umin_tl(tmp, shift_amt, tcg_constant_tl(31)); | ||
545 | tcg_gen_sar_tl(dst, src, tmp); | ||
546 | - tcg_temp_free(tmp); | ||
547 | } | ||
548 | |||
549 | /* Bidirectional shift right with saturation */ | ||
550 | @@ -XXX,XX +XXX,XX @@ static void gen_asr_r_r_sat(TCGv RdV, TCGv RsV, TCGv RtV) | ||
551 | gen_sar(RdV, RsV, shift_amt); | ||
552 | |||
553 | gen_set_label(done); | ||
554 | - | ||
555 | - tcg_temp_free(shift_amt); | ||
556 | } | ||
557 | |||
558 | /* Bidirectional shift left with saturation */ | ||
559 | @@ -XXX,XX +XXX,XX @@ static void gen_asl_r_r_sat(TCGv RdV, TCGv RsV, TCGv RtV) | ||
560 | gen_shl_sat(RdV, RsV, shift_amt); | ||
561 | |||
562 | gen_set_label(done); | ||
563 | - | ||
564 | - tcg_temp_free(shift_amt); | ||
565 | } | ||
566 | |||
567 | static intptr_t vreg_src_off(DisasContext *ctx, int num) | ||
568 | @@ -XXX,XX +XXX,XX @@ static void gen_log_vreg_write(DisasContext *ctx, intptr_t srcoff, int num, | ||
569 | /* Don't do anything if the slot was cancelled */ | ||
570 | tcg_gen_extract_tl(cancelled, hex_slot_cancelled, slot_num, 1); | ||
571 | tcg_gen_brcondi_tl(TCG_COND_NE, cancelled, 0, label_end); | ||
572 | - tcg_temp_free(cancelled); | ||
573 | } | ||
574 | |||
575 | if (type != EXT_TMP) { | ||
576 | @@ -XXX,XX +XXX,XX @@ static void gen_log_qreg_write(intptr_t srcoff, int num, int vnew, | ||
577 | /* Don't do anything if the slot was cancelled */ | ||
578 | tcg_gen_extract_tl(cancelled, hex_slot_cancelled, slot_num, 1); | ||
579 | tcg_gen_brcondi_tl(TCG_COND_NE, cancelled, 0, label_end); | ||
580 | - tcg_temp_free(cancelled); | ||
581 | } | ||
582 | |||
583 | dstoff = offsetof(CPUHexagonState, future_QRegs[num]); | ||
584 | @@ -XXX,XX +XXX,XX @@ static void gen_vreg_load(DisasContext *ctx, intptr_t dstoff, TCGv src, | ||
585 | tcg_gen_addi_tl(src, src, 8); | ||
586 | tcg_gen_st_i64(tmp, cpu_env, dstoff + i * 8); | ||
587 | } | ||
588 | - tcg_temp_free_i64(tmp); | ||
589 | } | ||
590 | |||
591 | static void gen_vreg_store(DisasContext *ctx, TCGv EA, intptr_t srcoff, | ||
592 | @@ -XXX,XX +XXX,XX @@ static void vec_to_qvec(size_t size, intptr_t dstoff, intptr_t srcoff) | ||
593 | |||
594 | tcg_gen_st8_i64(mask, cpu_env, dstoff + i); | ||
595 | } | ||
596 | - tcg_temp_free_i64(tmp); | ||
597 | - tcg_temp_free_i64(word); | ||
598 | - tcg_temp_free_i64(bits); | ||
599 | - tcg_temp_free_i64(mask); | ||
600 | } | ||
601 | |||
602 | void probe_noshuf_load(TCGv va, int s, int mi) | ||
603 | @@ -XXX,XX +XXX,XX @@ void gen_set_usr_field_if(int field, TCGv val) | ||
604 | tcg_gen_or_tl(hex_new_value[HEX_REG_USR], | ||
605 | hex_new_value[HEX_REG_USR], | ||
606 | tmp); | ||
607 | - tcg_temp_free(tmp); | ||
608 | } else { | ||
609 | TCGLabel *skip_label = gen_new_label(); | ||
610 | tcg_gen_brcondi_tl(TCG_COND_EQ, val, 0, skip_label); | ||
611 | @@ -XXX,XX +XXX,XX @@ void gen_sat_i64_ovfl(TCGv ovfl, TCGv_i64 dest, TCGv_i64 source, int width) | ||
612 | ovfl_64 = tcg_temp_new_i64(); | ||
613 | tcg_gen_setcond_i64(TCG_COND_NE, ovfl_64, dest, source); | ||
614 | tcg_gen_trunc_i64_tl(ovfl, ovfl_64); | ||
615 | - tcg_temp_free_i64(ovfl_64); | ||
616 | } | ||
617 | |||
618 | void gen_satu_i64(TCGv_i64 dest, TCGv_i64 source, int width) | ||
619 | @@ -XXX,XX +XXX,XX @@ void gen_satu_i64_ovfl(TCGv ovfl, TCGv_i64 dest, TCGv_i64 source, int width) | ||
620 | ovfl_64 = tcg_temp_new_i64(); | ||
621 | tcg_gen_setcond_i64(TCG_COND_NE, ovfl_64, dest, source); | ||
622 | tcg_gen_trunc_i64_tl(ovfl, ovfl_64); | ||
623 | - tcg_temp_free_i64(ovfl_64); | ||
624 | } | ||
625 | |||
626 | /* Implements the fADDSAT64 macro in TCG */ | ||
627 | @@ -XXX,XX +XXX,XX @@ void gen_add_sat_i64(TCGv_i64 ret, TCGv_i64 a, TCGv_i64 b) | ||
628 | |||
629 | /* if (xor & mask) */ | ||
630 | tcg_gen_and_i64(cond1, xor, mask); | ||
631 | - tcg_temp_free_i64(xor); | ||
632 | tcg_gen_brcondi_i64(TCG_COND_NE, cond1, 0, no_ovfl_label); | ||
633 | - tcg_temp_free_i64(cond1); | ||
634 | |||
635 | /* else if ((a ^ sum) & mask) */ | ||
636 | tcg_gen_xor_i64(cond2, a, sum); | ||
637 | tcg_gen_and_i64(cond2, cond2, mask); | ||
638 | tcg_gen_brcondi_i64(TCG_COND_NE, cond2, 0, ovfl_label); | ||
639 | - tcg_temp_free_i64(cond2); | ||
640 | /* fallthrough to no_ovfl_label branch */ | ||
641 | |||
642 | /* if branch */ | ||
643 | @@ -XXX,XX +XXX,XX @@ void gen_add_sat_i64(TCGv_i64 ret, TCGv_i64 a, TCGv_i64 b) | ||
644 | /* else if branch */ | ||
645 | gen_set_label(ovfl_label); | ||
646 | tcg_gen_and_i64(cond3, sum, mask); | ||
647 | - tcg_temp_free_i64(mask); | ||
648 | - tcg_temp_free_i64(sum); | ||
649 | tcg_gen_movcond_i64(TCG_COND_NE, ret, cond3, zero, max_pos, max_neg); | ||
650 | - tcg_temp_free_i64(cond3); | ||
651 | SET_USR_FIELD(USR_OVF, 1); | ||
652 | |||
653 | gen_set_label(ret_label); | ||
654 | diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c | ||
655 | index XXXXXXX..XXXXXXX 100644 | ||
656 | --- a/target/hexagon/translate.c | ||
657 | +++ b/target/hexagon/translate.c | ||
658 | @@ -XXX,XX +XXX,XX @@ static void gen_pred_writes(DisasContext *ctx) | ||
659 | hex_new_pred_value[pred_num], | ||
660 | hex_pred[pred_num]); | ||
661 | } | ||
662 | - tcg_temp_free(pred_written); | ||
663 | } else { | ||
664 | for (i = 0; i < ctx->preg_log_idx; i++) { | ||
665 | int pred_num = ctx->preg_log[i]; | ||
666 | @@ -XXX,XX +XXX,XX @@ void process_store(DisasContext *ctx, int slot_num) | ||
667 | /* Don't do anything if the slot was cancelled */ | ||
668 | tcg_gen_extract_tl(cancelled, hex_slot_cancelled, slot_num, 1); | ||
669 | tcg_gen_brcondi_tl(TCG_COND_NE, cancelled, 0, label_end); | ||
670 | - tcg_temp_free(cancelled); | ||
671 | } | ||
672 | { | ||
673 | TCGv address = tcg_temp_new(); | ||
674 | @@ -XXX,XX +XXX,XX @@ void process_store(DisasContext *ctx, int slot_num) | ||
675 | gen_helper_commit_store(cpu_env, slot); | ||
676 | } | ||
677 | } | ||
678 | - tcg_temp_free(address); | ||
679 | } | ||
680 | if (is_predicated) { | ||
681 | gen_set_label(label_end); | ||
682 | @@ -XXX,XX +XXX,XX @@ static void process_dczeroa(DisasContext *ctx) | ||
683 | tcg_gen_qemu_st64(zero, addr, ctx->mem_idx); | ||
684 | tcg_gen_addi_tl(addr, addr, 8); | ||
685 | tcg_gen_qemu_st64(zero, addr, ctx->mem_idx); | ||
686 | - | ||
687 | - tcg_temp_free(addr); | ||
688 | } | ||
689 | } | ||
690 | |||
691 | @@ -XXX,XX +XXX,XX @@ static void gen_commit_hvx(DisasContext *ctx) | ||
692 | |||
693 | tcg_gen_andi_tl(cmp, hex_VRegs_updated, 1 << rnum); | ||
694 | tcg_gen_brcondi_tl(TCG_COND_EQ, cmp, 0, label_skip); | ||
695 | - tcg_temp_free(cmp); | ||
696 | tcg_gen_gvec_mov(MO_64, dstoff, srcoff, size, size); | ||
697 | gen_set_label(label_skip); | ||
698 | } else { | ||
699 | @@ -XXX,XX +XXX,XX @@ static void gen_commit_hvx(DisasContext *ctx) | ||
700 | |||
701 | tcg_gen_andi_tl(cmp, hex_QRegs_updated, 1 << rnum); | ||
702 | tcg_gen_brcondi_tl(TCG_COND_EQ, cmp, 0, label_skip); | ||
703 | - tcg_temp_free(cmp); | ||
704 | tcg_gen_gvec_mov(MO_64, dstoff, srcoff, size, size); | ||
705 | gen_set_label(label_skip); | ||
706 | } else { | ||
707 | diff --git a/target/hexagon/README b/target/hexagon/README | ||
708 | index XXXXXXX..XXXXXXX 100644 | ||
709 | --- a/target/hexagon/README | ||
710 | +++ b/target/hexagon/README | ||
711 | @@ -XXX,XX +XXX,XX @@ tcg_funcs_generated.c.inc | ||
712 | gen_helper_A2_add(RdV, cpu_env, RsV, RtV); | ||
713 | gen_log_reg_write(RdN, RdV); | ||
714 | ctx_log_reg_write(ctx, RdN); | ||
715 | - tcg_temp_free(RdV); | ||
716 | } | ||
717 | |||
718 | helper_funcs_generated.c.inc | ||
719 | @@ -XXX,XX +XXX,XX @@ istruction. | ||
720 | tcg_gen_addi_ptr(VvV, cpu_env, VvV_off); | ||
721 | TCGv slot = tcg_constant_tl(insn->slot); | ||
722 | gen_helper_V6_vaddw(cpu_env, VdV, VuV, VvV, slot); | ||
723 | - tcg_temp_free(slot); | ||
724 | gen_log_vreg_write(ctx, VdV_off, VdN, EXT_DFL, insn->slot, false); | ||
725 | ctx_log_vreg_write(ctx, VdN, EXT_DFL, false); | ||
726 | - tcg_temp_free_ptr(VdV); | ||
727 | - tcg_temp_free_ptr(VuV); | ||
728 | - tcg_temp_free_ptr(VvV); | ||
729 | } | ||
730 | |||
731 | Notice that we also generate a variable named <operand>_off for each operand of | ||
732 | -- | ||
733 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Taylor Simpson <tsimpson@quicinc.com> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/hexagon/gen_tcg_funcs.py | 79 +-------------------------------- | ||
7 | 1 file changed, 1 insertion(+), 78 deletions(-) | ||
8 | |||
9 | diff --git a/target/hexagon/gen_tcg_funcs.py b/target/hexagon/gen_tcg_funcs.py | ||
10 | index XXXXXXX..XXXXXXX 100755 | ||
11 | --- a/target/hexagon/gen_tcg_funcs.py | ||
12 | +++ b/target/hexagon/gen_tcg_funcs.py | ||
13 | @@ -XXX,XX +XXX,XX @@ | ||
14 | ## Helpers for gen_tcg_func | ||
15 | ## | ||
16 | def gen_decl_ea_tcg(f, tag): | ||
17 | - f.write(" TCGv EA = tcg_temp_new();\n") | ||
18 | - | ||
19 | -def gen_free_ea_tcg(f): | ||
20 | - f.write(" tcg_temp_free(EA);\n") | ||
21 | + f.write(" TCGv EA G_GNUC_UNUSED = tcg_temp_new();\n") | ||
22 | |||
23 | def genptr_decl_pair_writable(f, tag, regtype, regid, regno): | ||
24 | regN="%s%sN" % (regtype,regid) | ||
25 | @@ -XXX,XX +XXX,XX @@ def genptr_decl_imm(f,immlett): | ||
26 | f.write(" int %s = insn->immed[%d];\n" % \ | ||
27 | (hex_common.imm_name(immlett), i)) | ||
28 | |||
29 | -def genptr_free(f, tag, regtype, regid, regno): | ||
30 | - if (regtype == "R"): | ||
31 | - if (regid in {"dd", "ss", "tt", "xx", "yy"}): | ||
32 | - f.write(" tcg_temp_free_i64(%s%sV);\n" % (regtype, regid)) | ||
33 | - elif (regid in {"d", "e", "x", "y"}): | ||
34 | - f.write(" tcg_temp_free(%s%sV);\n" % (regtype, regid)) | ||
35 | - elif (regid not in {"s", "t", "u", "v"}): | ||
36 | - print("Bad register parse: ",regtype,regid) | ||
37 | - elif (regtype == "P"): | ||
38 | - if (regid in {"d", "e", "x"}): | ||
39 | - f.write(" tcg_temp_free(%s%sV);\n" % (regtype, regid)) | ||
40 | - elif (regid not in {"s", "t", "u", "v"}): | ||
41 | - print("Bad register parse: ",regtype,regid) | ||
42 | - elif (regtype == "C"): | ||
43 | - if (regid in {"dd", "ss"}): | ||
44 | - f.write(" tcg_temp_free_i64(%s%sV);\n" % (regtype, regid)) | ||
45 | - elif (regid in {"d", "s"}): | ||
46 | - f.write(" tcg_temp_free(%s%sV);\n" % (regtype, regid)) | ||
47 | - else: | ||
48 | - print("Bad register parse: ",regtype,regid) | ||
49 | - elif (regtype == "M"): | ||
50 | - if (regid != "u"): | ||
51 | - print("Bad register parse: ", regtype, regid) | ||
52 | - elif (regtype == "V"): | ||
53 | - if (regid in {"dd", "uu", "vv", "xx", \ | ||
54 | - "d", "s", "u", "v", "w", "x", "y"}): | ||
55 | - if (not hex_common.skip_qemu_helper(tag)): | ||
56 | - f.write(" tcg_temp_free_ptr(%s%sV);\n" % \ | ||
57 | - (regtype, regid)) | ||
58 | - else: | ||
59 | - print("Bad register parse: ", regtype, regid) | ||
60 | - elif (regtype == "Q"): | ||
61 | - if (regid in {"d", "e", "s", "t", "u", "v", "x"}): | ||
62 | - if (not hex_common.skip_qemu_helper(tag)): | ||
63 | - f.write(" tcg_temp_free_ptr(%s%sV);\n" % \ | ||
64 | - (regtype, regid)) | ||
65 | - else: | ||
66 | - print("Bad register parse: ", regtype, regid) | ||
67 | - else: | ||
68 | - print("Bad register parse: ", regtype, regid) | ||
69 | - | ||
70 | -def genptr_free_new(f, tag, regtype, regid, regno): | ||
71 | - if (regtype == "N"): | ||
72 | - if (regid not in {"s", "t"}): | ||
73 | - print("Bad register parse: ", regtype, regid) | ||
74 | - elif (regtype == "P"): | ||
75 | - if (regid not in {"t", "u", "v"}): | ||
76 | - print("Bad register parse: ", regtype, regid) | ||
77 | - elif (regtype == "O"): | ||
78 | - if (regid != "s"): | ||
79 | - print("Bad register parse: ", regtype, regid) | ||
80 | - else: | ||
81 | - print("Bad register parse: ", regtype, regid) | ||
82 | - | ||
83 | -def genptr_free_opn(f,regtype,regid,i,tag): | ||
84 | - if (hex_common.is_pair(regid)): | ||
85 | - genptr_free(f, tag, regtype, regid, i) | ||
86 | - elif (hex_common.is_single(regid)): | ||
87 | - if hex_common.is_old_val(regtype, regid, tag): | ||
88 | - genptr_free(f, tag, regtype, regid, i) | ||
89 | - elif hex_common.is_new_val(regtype, regid, tag): | ||
90 | - genptr_free_new(f, tag, regtype, regid, i) | ||
91 | - else: | ||
92 | - print("Bad register parse: ",regtype,regid,toss,numregs) | ||
93 | - else: | ||
94 | - print("Bad register parse: ",regtype,regid,toss,numregs) | ||
95 | - | ||
96 | def genptr_src_read(f, tag, regtype, regid): | ||
97 | if (regtype == "R"): | ||
98 | if (regid in {"ss", "tt", "xx", "yy"}): | ||
99 | @@ -XXX,XX +XXX,XX @@ def genptr_dst_write_opn(f,regtype, regid, tag): | ||
100 | ## <GEN> | ||
101 | ## gen_log_reg_write(RdN, RdV); | ||
102 | ## ctx_log_reg_write(ctx, RdN); | ||
103 | -## tcg_temp_free(RdV); | ||
104 | ## } | ||
105 | ## | ||
106 | ## where <GEN> depends on hex_common.skip_qemu_helper(tag) | ||
107 | @@ -XXX,XX +XXX,XX @@ def gen_tcg_func(f, tag, regs, imms): | ||
108 | if (hex_common.is_written(regid)): | ||
109 | genptr_dst_write_opn(f,regtype, regid, tag) | ||
110 | |||
111 | - ## Free all the operands (regs and immediates) | ||
112 | - if hex_common.need_ea(tag): gen_free_ea_tcg(f) | ||
113 | - for regtype,regid,toss,numregs in regs: | ||
114 | - genptr_free_opn(f,regtype,regid,i,tag) | ||
115 | - i += 1 | ||
116 | - | ||
117 | f.write("}\n\n") | ||
118 | |||
119 | def gen_def_tcg_func(f, tag, tagregs, tagimms): | ||
120 | -- | ||
121 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | This removes gen_rvalue_free, gen_rvalue_free_manual and | ||
3 | free_variables, whose only purpose was to emit tcg_temp_free. | ||
4 | 1 | ||
5 | Reviewed-by: Taylor Simpson <tsimpson@quicinc.com> | ||
6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
7 | --- | ||
8 | target/hexagon/idef-parser/README.rst | 8 -- | ||
9 | target/hexagon/idef-parser/parser-helpers.h | 4 - | ||
10 | target/hexagon/idef-parser/parser-helpers.c | 142 -------------------- | ||
11 | target/hexagon/idef-parser/idef-parser.y | 10 -- | ||
12 | 4 files changed, 164 deletions(-) | ||
13 | |||
14 | diff --git a/target/hexagon/idef-parser/README.rst b/target/hexagon/idef-parser/README.rst | ||
15 | index XXXXXXX..XXXXXXX 100644 | ||
16 | --- a/target/hexagon/idef-parser/README.rst | ||
17 | +++ b/target/hexagon/idef-parser/README.rst | ||
18 | @@ -XXX,XX +XXX,XX @@ idef-parser will compile the above code into the following code: | ||
19 | TCGv_i32 tmp_0 = tcg_temp_new_i32(); | ||
20 | tcg_gen_add_i32(tmp_0, RsV, RtV); | ||
21 | tcg_gen_mov_i32(RdV, tmp_0); | ||
22 | - tcg_temp_free_i32(tmp_0); | ||
23 | } | ||
24 | |||
25 | The output of the compilation process will be a function, containing the | ||
26 | @@ -XXX,XX +XXX,XX @@ The result of the addition is now stored in the temporary, we move it into the | ||
27 | correct destination register. This code may seem inefficient, but QEMU will | ||
28 | perform some optimizations on the tinycode, reducing the unnecessary copy. | ||
29 | |||
30 | -:: | ||
31 | - | ||
32 | - tcg_temp_free_i32(tmp_0); | ||
33 | - | ||
34 | -Finally, we free the temporary we used to hold the addition result. | ||
35 | - | ||
36 | Parser Input | ||
37 | ------------ | ||
38 | |||
39 | @@ -XXX,XX +XXX,XX @@ instruction, | ||
40 | TCGv_i32 tmp_0 = tcg_temp_new_i32(); | ||
41 | tcg_gen_add_i32(tmp_0, RsV, RsV); | ||
42 | tcg_gen_mov_i32(RdV, tmp_0); | ||
43 | - tcg_temp_free_i32(tmp_0); | ||
44 | } | ||
45 | |||
46 | Here the bug, albeit hard to spot, is in ``tcg_gen_add_i32(tmp_0, RsV, RsV);`` | ||
47 | diff --git a/target/hexagon/idef-parser/parser-helpers.h b/target/hexagon/idef-parser/parser-helpers.h | ||
48 | index XXXXXXX..XXXXXXX 100644 | ||
49 | --- a/target/hexagon/idef-parser/parser-helpers.h | ||
50 | +++ b/target/hexagon/idef-parser/parser-helpers.h | ||
51 | @@ -XXX,XX +XXX,XX @@ HexValue gen_imm_value(Context *c __attribute__((unused)), | ||
52 | HexValue gen_imm_qemu_tmp(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
53 | HexSignedness signedness); | ||
54 | |||
55 | -void gen_rvalue_free(Context *c, YYLTYPE *locp, HexValue *rvalue); | ||
56 | - | ||
57 | HexValue rvalue_materialize(Context *c, YYLTYPE *locp, HexValue *rvalue); | ||
58 | |||
59 | HexValue gen_rvalue_extend(Context *c, YYLTYPE *locp, HexValue *rvalue); | ||
60 | @@ -XXX,XX +XXX,XX @@ void emit_footer(Context *c); | ||
61 | |||
62 | void track_string(Context *c, GString *s); | ||
63 | |||
64 | -void free_variables(Context *c, YYLTYPE *locp); | ||
65 | - | ||
66 | void free_instruction(Context *c); | ||
67 | |||
68 | void assert_signedness(Context *c, | ||
69 | diff --git a/target/hexagon/idef-parser/parser-helpers.c b/target/hexagon/idef-parser/parser-helpers.c | ||
70 | index XXXXXXX..XXXXXXX 100644 | ||
71 | --- a/target/hexagon/idef-parser/parser-helpers.c | ||
72 | +++ b/target/hexagon/idef-parser/parser-helpers.c | ||
73 | @@ -XXX,XX +XXX,XX @@ HexValue gen_imm_qemu_tmp(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
74 | return rvalue; | ||
75 | } | ||
76 | |||
77 | -void gen_rvalue_free(Context *c, YYLTYPE *locp, HexValue *rvalue) | ||
78 | -{ | ||
79 | - if (rvalue->type == TEMP && !rvalue->is_manual) { | ||
80 | - const char *bit_suffix = (rvalue->bit_width == 64) ? "i64" : "i32"; | ||
81 | - OUT(c, locp, "tcg_temp_free_", bit_suffix, "(", rvalue, ");\n"); | ||
82 | - } | ||
83 | -} | ||
84 | - | ||
85 | -static void gen_rvalue_free_manual(Context *c, YYLTYPE *locp, HexValue *rvalue) | ||
86 | -{ | ||
87 | - rvalue->is_manual = false; | ||
88 | - gen_rvalue_free(c, locp, rvalue); | ||
89 | -} | ||
90 | - | ||
91 | HexValue rvalue_materialize(Context *c, YYLTYPE *locp, HexValue *rvalue) | ||
92 | { | ||
93 | if (rvalue->type == IMMEDIATE) { | ||
94 | HexValue res = gen_tmp_value_from_imm(c, locp, rvalue); | ||
95 | - gen_rvalue_free(c, locp, rvalue); | ||
96 | return res; | ||
97 | } | ||
98 | return *rvalue; | ||
99 | @@ -XXX,XX +XXX,XX @@ HexValue gen_rvalue_extend(Context *c, YYLTYPE *locp, HexValue *rvalue) | ||
100 | const char *sign_suffix = is_unsigned ? "u" : ""; | ||
101 | OUT(c, locp, "tcg_gen_ext", sign_suffix, | ||
102 | "_i32_i64(", &res, ", ", rvalue, ");\n"); | ||
103 | - gen_rvalue_free(c, locp, rvalue); | ||
104 | return res; | ||
105 | } | ||
106 | } | ||
107 | @@ -XXX,XX +XXX,XX @@ HexValue gen_rvalue_truncate(Context *c, YYLTYPE *locp, HexValue *rvalue) | ||
108 | if (rvalue->bit_width == 64) { | ||
109 | HexValue res = gen_tmp(c, locp, 32, rvalue->signedness); | ||
110 | OUT(c, locp, "tcg_gen_trunc_i64_tl(", &res, ", ", rvalue, ");\n"); | ||
111 | - gen_rvalue_free(c, locp, rvalue); | ||
112 | return res; | ||
113 | } | ||
114 | } | ||
115 | @@ -XXX,XX +XXX,XX @@ HexValue gen_bin_cmp(Context *c, | ||
116 | fprintf(stderr, "Error in evalutating immediateness!"); | ||
117 | abort(); | ||
118 | } | ||
119 | - | ||
120 | - /* Free operands */ | ||
121 | - gen_rvalue_free(c, locp, &op1_m); | ||
122 | - gen_rvalue_free(c, locp, &op2_m); | ||
123 | - | ||
124 | return res; | ||
125 | } | ||
126 | |||
127 | @@ -XXX,XX +XXX,XX @@ static void gen_simple_op(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
128 | "(", res, ", ", op1, ", ", op2, ");\n"); | ||
129 | break; | ||
130 | } | ||
131 | - gen_rvalue_free(c, locp, op1); | ||
132 | - gen_rvalue_free(c, locp, op2); | ||
133 | } | ||
134 | |||
135 | static void gen_sub_op(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
136 | @@ -XXX,XX +XXX,XX @@ static void gen_sub_op(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
137 | "(", res, ", ", op1, ", ", op2, ");\n"); | ||
138 | } break; | ||
139 | } | ||
140 | - gen_rvalue_free(c, locp, op1); | ||
141 | - gen_rvalue_free(c, locp, op2); | ||
142 | } | ||
143 | |||
144 | static void gen_asl_op(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
145 | @@ -XXX,XX +XXX,XX @@ static void gen_asl_op(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
146 | OUT(c, locp, "tcg_gen_movcond_i", &bit_width); | ||
147 | OUT(c, locp, "(TCG_COND_GEU, ", res, ", ", &op2_m, ", ", &edge); | ||
148 | OUT(c, locp, ", ", &zero, ", ", res, ");\n"); | ||
149 | - gen_rvalue_free(c, locp, &edge); | ||
150 | } | ||
151 | - gen_rvalue_free(c, locp, &op1_m); | ||
152 | - gen_rvalue_free(c, locp, &op2_m); | ||
153 | } | ||
154 | |||
155 | static void gen_asr_op(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
156 | @@ -XXX,XX +XXX,XX @@ static void gen_asr_op(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
157 | OUT(c, locp, "tcg_gen_movcond_i", &bit_width); | ||
158 | OUT(c, locp, "(TCG_COND_GEU, ", res, ", ", &op2_m, ", ", &edge); | ||
159 | OUT(c, locp, ", ", &tmp, ", ", res, ");\n"); | ||
160 | - gen_rvalue_free(c, locp, &edge); | ||
161 | - gen_rvalue_free(c, locp, &tmp); | ||
162 | } | ||
163 | - gen_rvalue_free(c, locp, &op1_m); | ||
164 | - gen_rvalue_free(c, locp, &op2_m); | ||
165 | } | ||
166 | |||
167 | static void gen_lsr_op(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
168 | @@ -XXX,XX +XXX,XX @@ static void gen_lsr_op(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
169 | OUT(c, locp, "tcg_gen_movcond_i", &bit_width); | ||
170 | OUT(c, locp, "(TCG_COND_GEU, ", res, ", ", &op2_m, ", ", &edge); | ||
171 | OUT(c, locp, ", ", &zero, ", ", res, ");\n"); | ||
172 | - gen_rvalue_free(c, locp, &edge); | ||
173 | } | ||
174 | - gen_rvalue_free(c, locp, &op1_m); | ||
175 | - gen_rvalue_free(c, locp, &op2_m); | ||
176 | } | ||
177 | |||
178 | /* | ||
179 | @@ -XXX,XX +XXX,XX @@ static void gen_andl_op(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
180 | tmp2 = gen_bin_cmp(c, locp, TCG_COND_NE, op2, &zero); | ||
181 | OUT(c, locp, "tcg_gen_and_", bit_suffix, | ||
182 | "(", res, ", ", &tmp1, ", ", &tmp2, ");\n"); | ||
183 | - gen_rvalue_free_manual(c, locp, &zero); | ||
184 | - gen_rvalue_free(c, locp, &tmp1); | ||
185 | - gen_rvalue_free(c, locp, &tmp2); | ||
186 | break; | ||
187 | } | ||
188 | } | ||
189 | @@ -XXX,XX +XXX,XX @@ static void gen_minmax_op(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
190 | OUT(c, locp, res, ", ", op1, ", ", &op2_m, ");\n"); | ||
191 | break; | ||
192 | } | ||
193 | - gen_rvalue_free(c, locp, &op1_m); | ||
194 | - gen_rvalue_free(c, locp, &op2_m); | ||
195 | } | ||
196 | |||
197 | /* Code generation functions */ | ||
198 | @@ -XXX,XX +XXX,XX @@ HexValue gen_cast_op(Context *c, | ||
199 | &res, ", ", src, ");\n"); | ||
200 | } | ||
201 | } | ||
202 | - gen_rvalue_free(c, locp, src); | ||
203 | return res; | ||
204 | } | ||
205 | } | ||
206 | @@ -XXX,XX +XXX,XX @@ static HexValue gen_extend_imm_width_op(Context *c, | ||
207 | if (need_guarding) { | ||
208 | OUT(c, locp, "}\n"); | ||
209 | } | ||
210 | - | ||
211 | - gen_rvalue_free(c, locp, value); | ||
212 | return res; | ||
213 | } else { | ||
214 | /* | ||
215 | @@ -XXX,XX +XXX,XX @@ static HexValue gen_extend_imm_width_op(Context *c, | ||
216 | ", 0);\n"); | ||
217 | OUT(c, locp, "}\n"); | ||
218 | } | ||
219 | - | ||
220 | - gen_rvalue_free(c, locp, value); | ||
221 | return res; | ||
222 | } | ||
223 | } | ||
224 | @@ -XXX,XX +XXX,XX @@ static HexValue gen_extend_tcg_width_op(Context *c, | ||
225 | &mask, ", ", &mask, ", ", &shift, ");\n"); | ||
226 | OUT(c, locp, "tcg_gen_and_i", &dst_width, "(", | ||
227 | &res, ", ", value, ", ", &mask, ");\n"); | ||
228 | - gen_rvalue_free(c, locp, &mask); | ||
229 | } else { | ||
230 | OUT(c, locp, "tcg_gen_shl_i", &dst_width, "(", | ||
231 | &res, ", ", value, ", ", &shift, ");\n"); | ||
232 | @@ -XXX,XX +XXX,XX @@ static HexValue gen_extend_tcg_width_op(Context *c, | ||
233 | OUT(c, locp, &src_width_m, ", ", &zero, ", ", &zero, ", ", &res, | ||
234 | ");\n"); | ||
235 | |||
236 | - gen_rvalue_free(c, locp, &src_width_m); | ||
237 | - gen_rvalue_free(c, locp, value); | ||
238 | - gen_rvalue_free(c, locp, &shift); | ||
239 | - | ||
240 | return res; | ||
241 | } | ||
242 | |||
243 | @@ -XXX,XX +XXX,XX @@ void gen_rdeposit_op(Context *c, | ||
244 | dst); | ||
245 | OUT(c, locp, ", ", &width_m, ", ", &zero, ", ", &res, ", ", dst, | ||
246 | ");\n"); | ||
247 | - | ||
248 | - gen_rvalue_free(c, locp, width); | ||
249 | - gen_rvalue_free(c, locp, &res); | ||
250 | } | ||
251 | |||
252 | void gen_deposit_op(Context *c, | ||
253 | @@ -XXX,XX +XXX,XX @@ void gen_deposit_op(Context *c, | ||
254 | value_m = rvalue_materialize(c, locp, &value_m); | ||
255 | OUT(c, locp, "tcg_gen_deposit_i", &bit_width, "(", dst, ", ", dst, ", "); | ||
256 | OUT(c, locp, &value_m, ", ", index, " * ", &width, ", ", &width, ");\n"); | ||
257 | - gen_rvalue_free(c, locp, index); | ||
258 | - gen_rvalue_free(c, locp, &value_m); | ||
259 | } | ||
260 | |||
261 | HexValue gen_rextract_op(Context *c, | ||
262 | @@ -XXX,XX +XXX,XX @@ HexValue gen_rextract_op(Context *c, | ||
263 | HexValue res = gen_tmp(c, locp, bit_width, UNSIGNED); | ||
264 | OUT(c, locp, "tcg_gen_extract_i", &bit_width, "(", &res); | ||
265 | OUT(c, locp, ", ", src, ", ", &begin, ", ", &width, ");\n"); | ||
266 | - gen_rvalue_free(c, locp, src); | ||
267 | return res; | ||
268 | } | ||
269 | |||
270 | @@ -XXX,XX +XXX,XX @@ HexValue gen_extract_op(Context *c, | ||
271 | const char *sign_suffix = (extract->signedness == UNSIGNED) ? "u" : ""; | ||
272 | OUT(c, locp, "tcg_gen_ext", sign_suffix, "_i32_i64(", | ||
273 | &tmp, ", ", &res, ");\n"); | ||
274 | - gen_rvalue_free(c, locp, &res); | ||
275 | res = tmp; | ||
276 | } | ||
277 | - | ||
278 | - gen_rvalue_free(c, locp, src); | ||
279 | - gen_rvalue_free(c, locp, index); | ||
280 | return res; | ||
281 | } | ||
282 | |||
283 | @@ -XXX,XX +XXX,XX @@ void gen_write_reg(Context *c, YYLTYPE *locp, HexValue *reg, HexValue *value) | ||
284 | locp, | ||
285 | "ctx_log_reg_write(ctx, ", ®->reg.id, | ||
286 | ");\n"); | ||
287 | - gen_rvalue_free(c, locp, reg); | ||
288 | - gen_rvalue_free(c, locp, &value_m); | ||
289 | } | ||
290 | |||
291 | void gen_assign(Context *c, | ||
292 | @@ -XXX,XX +XXX,XX @@ void gen_assign(Context *c, | ||
293 | const char *imm_suffix = (value_m.type == IMMEDIATE) ? "i" : ""; | ||
294 | OUT(c, locp, "tcg_gen_mov", imm_suffix, "_i", &bit_width, | ||
295 | "(", dst, ", ", &value_m, ");\n"); | ||
296 | - | ||
297 | - gen_rvalue_free(c, locp, &value_m); | ||
298 | } | ||
299 | |||
300 | HexValue gen_convround(Context *c, | ||
301 | @@ -XXX,XX +XXX,XX @@ HexValue gen_convround(Context *c, | ||
302 | OUT(c, locp, ", ", &and, ", ", &mask, ", "); | ||
303 | OUT(c, locp, &src_p1, ", ", &src_m, ");\n"); | ||
304 | |||
305 | - /* Free src but use the original `is_manual` value */ | ||
306 | - gen_rvalue_free(c, locp, src); | ||
307 | - | ||
308 | - /* Free the rest of the values */ | ||
309 | - gen_rvalue_free(c, locp, &src_p1); | ||
310 | - | ||
311 | return res; | ||
312 | } | ||
313 | |||
314 | @@ -XXX,XX +XXX,XX @@ static HexValue gen_convround_n_b(Context *c, | ||
315 | OUT(c, locp, "tcg_gen_add_i64(", &res); | ||
316 | OUT(c, locp, ", ", &res, ", ", &tmp_64, ");\n"); | ||
317 | |||
318 | - gen_rvalue_free(c, locp, &tmp); | ||
319 | - gen_rvalue_free(c, locp, &tmp_64); | ||
320 | - | ||
321 | return res; | ||
322 | } | ||
323 | |||
324 | @@ -XXX,XX +XXX,XX @@ static HexValue gen_convround_n_c(Context *c, | ||
325 | OUT(c, locp, "tcg_gen_add_i64(", &res); | ||
326 | OUT(c, locp, ", ", &res, ", ", &tmp_64, ");\n"); | ||
327 | |||
328 | - gen_rvalue_free(c, locp, &one); | ||
329 | - gen_rvalue_free(c, locp, &tmp); | ||
330 | - gen_rvalue_free(c, locp, &tmp_64); | ||
331 | - | ||
332 | return res; | ||
333 | } | ||
334 | |||
335 | @@ -XXX,XX +XXX,XX @@ HexValue gen_convround_n(Context *c, | ||
336 | OUT(c, locp, "tcg_gen_shr_i64(", &res); | ||
337 | OUT(c, locp, ", ", &res, ", ", &n_64, ");\n"); | ||
338 | |||
339 | - gen_rvalue_free(c, locp, &src_casted); | ||
340 | - gen_rvalue_free(c, locp, &pos_casted); | ||
341 | - | ||
342 | - gen_rvalue_free(c, locp, &r1); | ||
343 | - gen_rvalue_free(c, locp, &r2); | ||
344 | - gen_rvalue_free(c, locp, &r3); | ||
345 | - | ||
346 | - gen_rvalue_free(c, locp, &cond); | ||
347 | - gen_rvalue_free(c, locp, &cond_64); | ||
348 | - gen_rvalue_free(c, locp, &mask); | ||
349 | - gen_rvalue_free(c, locp, &n_64); | ||
350 | - | ||
351 | res = gen_rvalue_truncate(c, locp, &res); | ||
352 | return res; | ||
353 | } | ||
354 | @@ -XXX,XX +XXX,XX @@ HexValue gen_round(Context *c, | ||
355 | OUT(c, locp, "(TCG_COND_EQ, ", &res, ", ", &b, ", ", &zero); | ||
356 | OUT(c, locp, ", ", &a, ", ", &sum, ");\n"); | ||
357 | |||
358 | - gen_rvalue_free_manual(c, locp, &a); | ||
359 | - gen_rvalue_free_manual(c, locp, &b); | ||
360 | - gen_rvalue_free(c, locp, &sum); | ||
361 | - | ||
362 | return res; | ||
363 | } | ||
364 | |||
365 | @@ -XXX,XX +XXX,XX @@ void gen_circ_op(Context *c, | ||
366 | ", ", | ||
367 | modifier); | ||
368 | OUT(c, locp, ", ", &cs, ");\n"); | ||
369 | - gen_rvalue_free(c, locp, &increment_m); | ||
370 | - gen_rvalue_free(c, locp, modifier); | ||
371 | - gen_rvalue_free(c, locp, &cs); | ||
372 | } | ||
373 | |||
374 | HexValue gen_locnt_op(Context *c, YYLTYPE *locp, HexValue *src) | ||
375 | @@ -XXX,XX +XXX,XX @@ HexValue gen_locnt_op(Context *c, YYLTYPE *locp, HexValue *src) | ||
376 | &res, ", ", &src_m, ");\n"); | ||
377 | OUT(c, locp, "tcg_gen_clzi_i", bit_suffix, "(", &res, ", ", &res, ", "); | ||
378 | OUT(c, locp, bit_suffix, ");\n"); | ||
379 | - gen_rvalue_free(c, locp, &src_m); | ||
380 | return res; | ||
381 | } | ||
382 | |||
383 | @@ -XXX,XX +XXX,XX @@ HexValue gen_ctpop_op(Context *c, YYLTYPE *locp, HexValue *src) | ||
384 | src_m = rvalue_materialize(c, locp, &src_m); | ||
385 | OUT(c, locp, "tcg_gen_ctpop_i", bit_suffix, | ||
386 | "(", &res, ", ", &src_m, ");\n"); | ||
387 | - gen_rvalue_free(c, locp, &src_m); | ||
388 | return res; | ||
389 | } | ||
390 | |||
391 | @@ -XXX,XX +XXX,XX @@ HexValue gen_rotl(Context *c, YYLTYPE *locp, HexValue *src, HexValue *width) | ||
392 | amount = rvalue_materialize(c, locp, &amount); | ||
393 | OUT(c, locp, "tcg_gen_rotl_", suffix, "(", | ||
394 | &res, ", ", src, ", ", &amount, ");\n"); | ||
395 | - gen_rvalue_free(c, locp, src); | ||
396 | - gen_rvalue_free(c, locp, &amount); | ||
397 | |||
398 | return res; | ||
399 | } | ||
400 | @@ -XXX,XX +XXX,XX @@ HexValue gen_carry_from_add(Context *c, | ||
401 | OUT(c, locp, "tcg_gen_add2_i64(", &res, ", ", &cf, ", ", &res, ", ", &cf); | ||
402 | OUT(c, locp, ", ", &op2_m, ", ", &zero, ");\n"); | ||
403 | |||
404 | - gen_rvalue_free(c, locp, &op1_m); | ||
405 | - gen_rvalue_free(c, locp, &op2_m); | ||
406 | - gen_rvalue_free(c, locp, &op3_m); | ||
407 | - gen_rvalue_free(c, locp, &res); | ||
408 | return cf; | ||
409 | } | ||
410 | |||
411 | @@ -XXX,XX +XXX,XX @@ void gen_inst_code(Context *c, YYLTYPE *locp) | ||
412 | c->inst.name->str, | ||
413 | c->inst.error_count); | ||
414 | } else { | ||
415 | - free_variables(c, locp); | ||
416 | c->implemented_insn++; | ||
417 | fprintf(c->enabled_file, "%s\n", c->inst.name->str); | ||
418 | emit_footer(c); | ||
419 | @@ -XXX,XX +XXX,XX @@ void gen_pred_assign(Context *c, YYLTYPE *locp, HexValue *left_pred, | ||
420 | OUT(c, locp, "gen_log_pred_write(ctx, ", pred_id, ", ", left_pred, | ||
421 | ");\n"); | ||
422 | OUT(c, locp, "ctx_log_pred_write(ctx, ", pred_id, ");\n"); | ||
423 | - gen_rvalue_free(c, locp, left_pred); | ||
424 | } | ||
425 | - /* Free temporary value */ | ||
426 | - gen_rvalue_free(c, locp, &r); | ||
427 | } | ||
428 | |||
429 | void gen_cancel(Context *c, YYLTYPE *locp) | ||
430 | @@ -XXX,XX +XXX,XX @@ void gen_load(Context *c, YYLTYPE *locp, HexValue *width, | ||
431 | OUT(c, locp, "(TCGv) "); | ||
432 | } | ||
433 | OUT(c, locp, dst, ", ", ea, ", ctx->mem_idx);\n"); | ||
434 | - /* If the var in EA was truncated it is now a tmp HexValue, so free it. */ | ||
435 | - gen_rvalue_free(c, locp, ea); | ||
436 | } | ||
437 | |||
438 | void gen_store(Context *c, YYLTYPE *locp, HexValue *width, HexValue *ea, | ||
439 | @@ -XXX,XX +XXX,XX @@ void gen_store(Context *c, YYLTYPE *locp, HexValue *width, HexValue *ea, | ||
440 | src_m = rvalue_materialize(c, locp, &src_m); | ||
441 | OUT(c, locp, "gen_store", &mem_width, "(cpu_env, ", ea, ", ", &src_m); | ||
442 | OUT(c, locp, ", insn->slot);\n"); | ||
443 | - gen_rvalue_free(c, locp, &src_m); | ||
444 | - /* If the var in ea was truncated it is now a tmp HexValue, so free it. */ | ||
445 | - gen_rvalue_free(c, locp, ea); | ||
446 | } | ||
447 | |||
448 | void gen_sethalf(Context *c, YYLTYPE *locp, HexCast *sh, HexValue *n, | ||
449 | @@ -XXX,XX +XXX,XX @@ void gen_setbits(Context *c, YYLTYPE *locp, HexValue *hi, HexValue *lo, | ||
450 | OUT(c, locp, "tcg_gen_deposit_i32(", dst, ", ", dst, | ||
451 | ", ", &tmp, ", "); | ||
452 | OUT(c, locp, lo, ", ", &len, ");\n"); | ||
453 | - | ||
454 | - gen_rvalue_free(c, locp, &tmp); | ||
455 | - gen_rvalue_free(c, locp, hi); | ||
456 | - gen_rvalue_free(c, locp, lo); | ||
457 | - gen_rvalue_free(c, locp, value); | ||
458 | } | ||
459 | |||
460 | unsigned gen_if_cond(Context *c, YYLTYPE *locp, HexValue *cond) | ||
461 | @@ -XXX,XX +XXX,XX @@ unsigned gen_if_cond(Context *c, YYLTYPE *locp, HexValue *cond) | ||
462 | bit_suffix = (cond->bit_width == 64) ? "i64" : "i32"; | ||
463 | OUT(c, locp, "tcg_gen_brcondi_", bit_suffix, "(TCG_COND_EQ, ", cond, | ||
464 | ", 0, if_label_", &c->inst.if_count, ");\n"); | ||
465 | - gen_rvalue_free(c, locp, cond); | ||
466 | return c->inst.if_count++; | ||
467 | } | ||
468 | |||
469 | @@ -XXX,XX +XXX,XX @@ static inline HexValue gen_rvalue_simple_unary(Context *c, YYLTYPE *locp, | ||
470 | res = gen_tmp(c, locp, bit_width, value->signedness); | ||
471 | OUT(c, locp, tcg_code, "_i", &bit_width, "(", &res, ", ", value, | ||
472 | ");\n"); | ||
473 | - gen_rvalue_free(c, locp, value); | ||
474 | } | ||
475 | return res; | ||
476 | } | ||
477 | @@ -XXX,XX +XXX,XX @@ HexValue gen_rvalue_notl(Context *c, YYLTYPE *locp, HexValue *value) | ||
478 | OUT(c, locp, "tcg_gen_movcond_i", &bit_width); | ||
479 | OUT(c, locp, "(TCG_COND_EQ, ", &res, ", ", value, ", ", &zero); | ||
480 | OUT(c, locp, ", ", &one, ", ", &zero, ");\n"); | ||
481 | - gen_rvalue_free(c, locp, value); | ||
482 | } | ||
483 | return res; | ||
484 | } | ||
485 | @@ -XXX,XX +XXX,XX @@ HexValue gen_rvalue_sat(Context *c, YYLTYPE *locp, HexSat *sat, | ||
486 | OUT(c, locp, &ovfl, ", ", &res, ", ", value, ", ", &width->imm.value, | ||
487 | ");\n"); | ||
488 | OUT(c, locp, "gen_set_usr_field_if(USR_OVF,", &ovfl, ");\n"); | ||
489 | - gen_rvalue_free(c, locp, value); | ||
490 | |||
491 | return res; | ||
492 | } | ||
493 | @@ -XXX,XX +XXX,XX @@ HexValue gen_rvalue_fscr(Context *c, YYLTYPE *locp, HexValue *value) | ||
494 | OUT(c, locp, "tcg_gen_concat_i32_i64(", | ||
495 | &key, ", ", &frame_key, ", ", &frame_key, ");\n"); | ||
496 | OUT(c, locp, "tcg_gen_xor_i64(", &res, ", ", value, ", ", &key, ");\n"); | ||
497 | - gen_rvalue_free(c, locp, &key); | ||
498 | - gen_rvalue_free(c, locp, &frame_key); | ||
499 | - gen_rvalue_free(c, locp, value); | ||
500 | return res; | ||
501 | } | ||
502 | |||
503 | @@ -XXX,XX +XXX,XX @@ HexValue gen_rvalue_brev(Context *c, YYLTYPE *locp, HexValue *value) | ||
504 | res = gen_tmp(c, locp, value->bit_width, value->signedness); | ||
505 | *value = rvalue_materialize(c, locp, value); | ||
506 | OUT(c, locp, "gen_helper_fbrev(", &res, ", ", value, ");\n"); | ||
507 | - gen_rvalue_free(c, locp, value); | ||
508 | return res; | ||
509 | } | ||
510 | |||
511 | @@ -XXX,XX +XXX,XX @@ HexValue gen_rvalue_ternary(Context *c, YYLTYPE *locp, HexValue *cond, | ||
512 | unsigned bit_width = (is_64bit) ? 64 : 32; | ||
513 | HexValue zero = gen_constant(c, locp, "0", bit_width, UNSIGNED); | ||
514 | HexValue res = gen_tmp(c, locp, bit_width, UNSIGNED); | ||
515 | - Ternary *ternary = NULL; | ||
516 | |||
517 | if (is_64bit) { | ||
518 | *cond = gen_rvalue_extend(c, locp, cond); | ||
519 | @@ -XXX,XX +XXX,XX @@ HexValue gen_rvalue_ternary(Context *c, YYLTYPE *locp, HexValue *cond, | ||
520 | OUT(c, locp, ", ", true_branch, ", ", false_branch, ");\n"); | ||
521 | |||
522 | assert(c->ternary->len > 0); | ||
523 | - ternary = &g_array_index(c->ternary, Ternary, c->ternary->len - 1); | ||
524 | - gen_rvalue_free_manual(c, locp, &ternary->cond); | ||
525 | g_array_remove_index(c->ternary, c->ternary->len - 1); | ||
526 | |||
527 | - gen_rvalue_free(c, locp, cond); | ||
528 | - gen_rvalue_free(c, locp, true_branch); | ||
529 | - gen_rvalue_free(c, locp, false_branch); | ||
530 | return res; | ||
531 | } | ||
532 | |||
533 | @@ -XXX,XX +XXX,XX @@ void track_string(Context *c, GString *s) | ||
534 | g_array_append_val(c->inst.strings, s); | ||
535 | } | ||
536 | |||
537 | -void free_variables(Context *c, YYLTYPE *locp) | ||
538 | -{ | ||
539 | - for (unsigned i = 0; i < c->inst.allocated->len; ++i) { | ||
540 | - Var *var = &g_array_index(c->inst.allocated, Var, i); | ||
541 | - const char *suffix = var->bit_width == 64 ? "i64" : "i32"; | ||
542 | - OUT(c, locp, "tcg_temp_free_", suffix, "(", var->name->str, ");\n"); | ||
543 | - } | ||
544 | -} | ||
545 | - | ||
546 | void free_instruction(Context *c) | ||
547 | { | ||
548 | assert(!is_inside_ternary(c)); | ||
549 | diff --git a/target/hexagon/idef-parser/idef-parser.y b/target/hexagon/idef-parser/idef-parser.y | ||
550 | index XXXXXXX..XXXXXXX 100644 | ||
551 | --- a/target/hexagon/idef-parser/idef-parser.y | ||
552 | +++ b/target/hexagon/idef-parser/idef-parser.y | ||
553 | @@ -XXX,XX +XXX,XX @@ statements : statements statement | ||
554 | statement : control_statement | ||
555 | | var_decl ';' | ||
556 | | rvalue ';' | ||
557 | - { | ||
558 | - gen_rvalue_free(c, &@1, &$1); | ||
559 | - } | ||
560 | | code_block | ||
561 | | ';' | ||
562 | ; | ||
563 | @@ -XXX,XX +XXX,XX @@ assign_statement : lvalue '=' rvalue | ||
564 | $3 = gen_rvalue_truncate(c, &@1, &$3); | ||
565 | $3 = rvalue_materialize(c, &@1, &$3); | ||
566 | OUT(c, &@1, "gen_write_new_pc(", &$3, ");\n"); | ||
567 | - gen_rvalue_free(c, &@1, &$3); /* Free temporary value */ | ||
568 | } | ||
569 | | LOAD '(' IMM ',' IMM ',' SIGN ',' var ',' lvalue ')' | ||
570 | { | ||
571 | @@ -XXX,XX +XXX,XX @@ assign_statement : lvalue '=' rvalue | ||
572 | $3 = gen_rvalue_truncate(c, &@1, &$3); | ||
573 | $3 = rvalue_materialize(c, &@1, &$3); | ||
574 | OUT(c, &@1, "SET_USR_FIELD(USR_LPCFG, ", &$3, ");\n"); | ||
575 | - gen_rvalue_free(c, &@1, &$3); | ||
576 | } | ||
577 | | DEPOSIT '(' rvalue ',' rvalue ',' rvalue ')' | ||
578 | { | ||
579 | @@ -XXX,XX +XXX,XX @@ control_statement : frame_check | ||
580 | ; | ||
581 | |||
582 | frame_check : FCHK '(' rvalue ',' rvalue ')' ';' | ||
583 | - { | ||
584 | - gen_rvalue_free(c, &@1, &$3); | ||
585 | - gen_rvalue_free(c, &@1, &$5); | ||
586 | - } | ||
587 | ; | ||
588 | |||
589 | cancel_statement : LOAD_CANCEL | ||
590 | @@ -XXX,XX +XXX,XX @@ rvalue : FAIL | ||
591 | @1.last_column = @6.last_column; | ||
592 | $$ = gen_tmp(c, &@1, 32, UNSIGNED); | ||
593 | OUT(c, &@1, "gen_read_ireg(", &$$, ", ", &$3, ", ", &$6, ");\n"); | ||
594 | - gen_rvalue_free(c, &@1, &$3); | ||
595 | } | ||
596 | | CIRCADD '(' rvalue ',' rvalue ',' rvalue ')' | ||
597 | { | ||
598 | -- | ||
599 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | This field is no longer used. | ||
2 | 1 | ||
3 | Reviewed-by: Taylor Simpson <tsimpson@quicinc.com> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/hexagon/idef-parser/idef-parser.h | 1 - | ||
7 | target/hexagon/idef-parser/parser-helpers.c | 15 --------------- | ||
8 | target/hexagon/idef-parser/idef-parser.y | 2 -- | ||
9 | 3 files changed, 18 deletions(-) | ||
10 | |||
11 | diff --git a/target/hexagon/idef-parser/idef-parser.h b/target/hexagon/idef-parser/idef-parser.h | ||
12 | index XXXXXXX..XXXXXXX 100644 | ||
13 | --- a/target/hexagon/idef-parser/idef-parser.h | ||
14 | +++ b/target/hexagon/idef-parser/idef-parser.h | ||
15 | @@ -XXX,XX +XXX,XX @@ typedef struct HexValue { | ||
16 | unsigned bit_width; /**< Bit width of the rvalue */ | ||
17 | HexSignedness signedness; /**< Unsigned flag for the rvalue */ | ||
18 | bool is_dotnew; /**< rvalue of predicate type is dotnew? */ | ||
19 | - bool is_manual; /**< Opt out of automatic freeing of params */ | ||
20 | } HexValue; | ||
21 | |||
22 | /** | ||
23 | diff --git a/target/hexagon/idef-parser/parser-helpers.c b/target/hexagon/idef-parser/parser-helpers.c | ||
24 | index XXXXXXX..XXXXXXX 100644 | ||
25 | --- a/target/hexagon/idef-parser/parser-helpers.c | ||
26 | +++ b/target/hexagon/idef-parser/parser-helpers.c | ||
27 | @@ -XXX,XX +XXX,XX @@ static HexValue gen_constant(Context *c, | ||
28 | rvalue.bit_width = bit_width; | ||
29 | rvalue.signedness = signedness; | ||
30 | rvalue.is_dotnew = false; | ||
31 | - rvalue.is_manual = true; | ||
32 | rvalue.tmp.index = c->inst.tmp_count; | ||
33 | OUT(c, locp, "TCGv_i", &bit_width, " tmp_", &c->inst.tmp_count, | ||
34 | " = tcg_constant_i", &bit_width, "(", value, ");\n"); | ||
35 | @@ -XXX,XX +XXX,XX @@ HexValue gen_tmp(Context *c, | ||
36 | rvalue.bit_width = bit_width; | ||
37 | rvalue.signedness = signedness; | ||
38 | rvalue.is_dotnew = false; | ||
39 | - rvalue.is_manual = false; | ||
40 | rvalue.tmp.index = c->inst.tmp_count; | ||
41 | OUT(c, locp, "TCGv_i", &bit_width, " tmp_", &c->inst.tmp_count, | ||
42 | " = tcg_temp_new_i", &bit_width, "();\n"); | ||
43 | @@ -XXX,XX +XXX,XX @@ HexValue gen_tmp_value(Context *c, | ||
44 | rvalue.bit_width = bit_width; | ||
45 | rvalue.signedness = signedness; | ||
46 | rvalue.is_dotnew = false; | ||
47 | - rvalue.is_manual = false; | ||
48 | rvalue.tmp.index = c->inst.tmp_count; | ||
49 | OUT(c, locp, "TCGv_i", &bit_width, " tmp_", &c->inst.tmp_count, | ||
50 | " = tcg_const_i", &bit_width, "(", value, ");\n"); | ||
51 | @@ -XXX,XX +XXX,XX @@ static HexValue gen_tmp_value_from_imm(Context *c, | ||
52 | rvalue.bit_width = value->bit_width; | ||
53 | rvalue.signedness = value->signedness; | ||
54 | rvalue.is_dotnew = false; | ||
55 | - rvalue.is_manual = false; | ||
56 | rvalue.tmp.index = c->inst.tmp_count; | ||
57 | /* | ||
58 | * Here we output the call to `tcg_const_i<width>` in | ||
59 | @@ -XXX,XX +XXX,XX @@ HexValue gen_imm_value(Context *c __attribute__((unused)), | ||
60 | rvalue.bit_width = bit_width; | ||
61 | rvalue.signedness = signedness; | ||
62 | rvalue.is_dotnew = false; | ||
63 | - rvalue.is_manual = false; | ||
64 | rvalue.imm.type = VALUE; | ||
65 | rvalue.imm.value = value; | ||
66 | return rvalue; | ||
67 | @@ -XXX,XX +XXX,XX @@ HexValue gen_imm_qemu_tmp(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
68 | memset(&rvalue, 0, sizeof(HexValue)); | ||
69 | rvalue.type = IMMEDIATE; | ||
70 | rvalue.is_dotnew = false; | ||
71 | - rvalue.is_manual = false; | ||
72 | rvalue.bit_width = bit_width; | ||
73 | rvalue.signedness = signedness; | ||
74 | rvalue.imm.type = QEMU_TMP; | ||
75 | @@ -XXX,XX +XXX,XX @@ void gen_rdeposit_op(Context *c, | ||
76 | */ | ||
77 | k64 = gen_bin_op(c, locp, SUB_OP, &k64, &width_m); | ||
78 | mask = gen_bin_op(c, locp, LSR_OP, &mask, &k64); | ||
79 | - begin_m.is_manual = true; | ||
80 | mask = gen_bin_op(c, locp, ASL_OP, &mask, &begin_m); | ||
81 | - mask.is_manual = true; | ||
82 | value_m = gen_bin_op(c, locp, ASL_OP, &value_m, &begin_m); | ||
83 | value_m = gen_bin_op(c, locp, ANDB_OP, &value_m, &mask); | ||
84 | |||
85 | OUT(c, locp, "tcg_gen_not_i", &dst->bit_width, "(", &mask, ", ", | ||
86 | &mask, ");\n"); | ||
87 | - mask.is_manual = false; | ||
88 | res = gen_bin_op(c, locp, ANDB_OP, dst, &mask); | ||
89 | res = gen_bin_op(c, locp, ORB_OP, &res, &value_m); | ||
90 | |||
91 | @@ -XXX,XX +XXX,XX @@ HexValue gen_convround(Context *c, | ||
92 | HexValue and; | ||
93 | HexValue src_p1; | ||
94 | |||
95 | - src_m.is_manual = true; | ||
96 | - | ||
97 | and = gen_bin_op(c, locp, ANDB_OP, &src_m, &mask); | ||
98 | src_p1 = gen_bin_op(c, locp, ADD_OP, &src_m, &one); | ||
99 | |||
100 | @@ -XXX,XX +XXX,XX @@ HexValue gen_round(Context *c, | ||
101 | b = gen_extend_op(c, locp, &src_width, 64, pos, UNSIGNED); | ||
102 | b = rvalue_materialize(c, locp, &b); | ||
103 | |||
104 | - /* Disable auto-free of values used more than once */ | ||
105 | - a.is_manual = true; | ||
106 | - b.is_manual = true; | ||
107 | - | ||
108 | n_m1 = gen_bin_op(c, locp, SUB_OP, &b, &one); | ||
109 | shifted = gen_bin_op(c, locp, ASL_OP, &one, &n_m1); | ||
110 | sum = gen_bin_op(c, locp, ADD_OP, &shifted, &a); | ||
111 | diff --git a/target/hexagon/idef-parser/idef-parser.y b/target/hexagon/idef-parser/idef-parser.y | ||
112 | index XXXXXXX..XXXXXXX 100644 | ||
113 | --- a/target/hexagon/idef-parser/idef-parser.y | ||
114 | +++ b/target/hexagon/idef-parser/idef-parser.y | ||
115 | @@ -XXX,XX +XXX,XX @@ rvalue : FAIL | ||
116 | rvalue.imm.type = IMM_CONSTEXT; | ||
117 | rvalue.signedness = UNSIGNED; | ||
118 | rvalue.is_dotnew = false; | ||
119 | - rvalue.is_manual = false; | ||
120 | $$ = rvalue; | ||
121 | } | ||
122 | | var | ||
123 | @@ -XXX,XX +XXX,XX @@ rvalue : FAIL | ||
124 | } | ||
125 | | rvalue '?' | ||
126 | { | ||
127 | - $1.is_manual = true; | ||
128 | Ternary t = { 0 }; | ||
129 | t.state = IN_LEFT; | ||
130 | t.cond = $1; | ||
131 | -- | ||
132 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/hppa/translate.c | 93 +---------------------------------------- | ||
7 | 1 file changed, 1 insertion(+), 92 deletions(-) | ||
8 | |||
9 | diff --git a/target/hppa/translate.c b/target/hppa/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/hppa/translate.c | ||
12 | +++ b/target/hppa/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ | ||
14 | #undef TCGv | ||
15 | #undef tcg_temp_new | ||
16 | #undef tcg_global_mem_new | ||
17 | -#undef tcg_temp_free | ||
18 | |||
19 | #if TARGET_LONG_BITS == 64 | ||
20 | #define TCGv_tl TCGv_i64 | ||
21 | #define tcg_temp_new_tl tcg_temp_new_i64 | ||
22 | -#define tcg_temp_free_tl tcg_temp_free_i64 | ||
23 | #if TARGET_REGISTER_BITS == 64 | ||
24 | #define tcg_gen_extu_reg_tl tcg_gen_mov_i64 | ||
25 | #else | ||
26 | @@ -XXX,XX +XXX,XX @@ | ||
27 | #else | ||
28 | #define TCGv_tl TCGv_i32 | ||
29 | #define tcg_temp_new_tl tcg_temp_new_i32 | ||
30 | -#define tcg_temp_free_tl tcg_temp_free_i32 | ||
31 | #define tcg_gen_extu_reg_tl tcg_gen_mov_i32 | ||
32 | #endif | ||
33 | |||
34 | @@ -XXX,XX +XXX,XX @@ | ||
35 | |||
36 | #define tcg_temp_new tcg_temp_new_i64 | ||
37 | #define tcg_global_mem_new tcg_global_mem_new_i64 | ||
38 | -#define tcg_temp_free tcg_temp_free_i64 | ||
39 | |||
40 | #define tcg_gen_movi_reg tcg_gen_movi_i64 | ||
41 | #define tcg_gen_mov_reg tcg_gen_mov_i64 | ||
42 | @@ -XXX,XX +XXX,XX @@ | ||
43 | #define TCGv_reg TCGv_i32 | ||
44 | #define tcg_temp_new tcg_temp_new_i32 | ||
45 | #define tcg_global_mem_new tcg_global_mem_new_i32 | ||
46 | -#define tcg_temp_free tcg_temp_free_i32 | ||
47 | |||
48 | #define tcg_gen_movi_reg tcg_gen_movi_i32 | ||
49 | #define tcg_gen_mov_reg tcg_gen_mov_i32 | ||
50 | @@ -XXX,XX +XXX,XX @@ static void cond_free(DisasCond *cond) | ||
51 | { | ||
52 | switch (cond->c) { | ||
53 | default: | ||
54 | - if (cond->a0 != cpu_psw_n) { | ||
55 | - tcg_temp_free(cond->a0); | ||
56 | - } | ||
57 | - tcg_temp_free(cond->a1); | ||
58 | cond->a0 = NULL; | ||
59 | cond->a1 = NULL; | ||
60 | /* fallthru */ | ||
61 | @@ -XXX,XX +XXX,XX @@ static DisasCond do_unit_cond(unsigned cf, TCGv_reg res, | ||
62 | tcg_gen_and_reg(tmp, in1, in2); | ||
63 | tcg_gen_andc_reg(cb, cb, res); | ||
64 | tcg_gen_or_reg(cb, cb, tmp); | ||
65 | - tcg_temp_free(tmp); | ||
66 | } | ||
67 | |||
68 | switch (cf >> 1) { | ||
69 | @@ -XXX,XX +XXX,XX @@ static DisasCond do_unit_cond(unsigned cf, TCGv_reg res, | ||
70 | tcg_gen_andc_reg(tmp, tmp, res); | ||
71 | tcg_gen_andi_reg(tmp, tmp, 0x80808080u); | ||
72 | cond = cond_make_0(TCG_COND_NE, tmp); | ||
73 | - tcg_temp_free(tmp); | ||
74 | break; | ||
75 | |||
76 | case 3: /* SHZ / NHZ */ | ||
77 | @@ -XXX,XX +XXX,XX @@ static DisasCond do_unit_cond(unsigned cf, TCGv_reg res, | ||
78 | tcg_gen_andc_reg(tmp, tmp, res); | ||
79 | tcg_gen_andi_reg(tmp, tmp, 0x80008000u); | ||
80 | cond = cond_make_0(TCG_COND_NE, tmp); | ||
81 | - tcg_temp_free(tmp); | ||
82 | break; | ||
83 | |||
84 | case 4: /* SDC / NDC */ | ||
85 | @@ -XXX,XX +XXX,XX @@ static DisasCond do_unit_cond(unsigned cf, TCGv_reg res, | ||
86 | default: | ||
87 | g_assert_not_reached(); | ||
88 | } | ||
89 | - if (cf & 8) { | ||
90 | - tcg_temp_free(cb); | ||
91 | - } | ||
92 | if (cf & 1) { | ||
93 | cond.c = tcg_invert_cond(cond.c); | ||
94 | } | ||
95 | @@ -XXX,XX +XXX,XX @@ static TCGv_reg do_add_sv(DisasContext *ctx, TCGv_reg res, | ||
96 | tcg_gen_xor_reg(sv, res, in1); | ||
97 | tcg_gen_xor_reg(tmp, in1, in2); | ||
98 | tcg_gen_andc_reg(sv, sv, tmp); | ||
99 | - tcg_temp_free(tmp); | ||
100 | |||
101 | return sv; | ||
102 | } | ||
103 | @@ -XXX,XX +XXX,XX @@ static TCGv_reg do_sub_sv(DisasContext *ctx, TCGv_reg res, | ||
104 | tcg_gen_xor_reg(sv, res, in1); | ||
105 | tcg_gen_xor_reg(tmp, in1, in2); | ||
106 | tcg_gen_and_reg(sv, sv, tmp); | ||
107 | - tcg_temp_free(tmp); | ||
108 | |||
109 | return sv; | ||
110 | } | ||
111 | @@ -XXX,XX +XXX,XX @@ static void do_add(DisasContext *ctx, unsigned rt, TCGv_reg in1, | ||
112 | tmp = tcg_temp_new(); | ||
113 | tcg_gen_setcond_reg(cond.c, tmp, cond.a0, cond.a1); | ||
114 | gen_helper_tcond(cpu_env, tmp); | ||
115 | - tcg_temp_free(tmp); | ||
116 | } | ||
117 | |||
118 | /* Write back the result. */ | ||
119 | @@ -XXX,XX +XXX,XX @@ static void do_add(DisasContext *ctx, unsigned rt, TCGv_reg in1, | ||
120 | save_or_nullify(ctx, cpu_psw_cb_msb, cb_msb); | ||
121 | } | ||
122 | save_gpr(ctx, rt, dest); | ||
123 | - tcg_temp_free(dest); | ||
124 | |||
125 | /* Install the new nullification. */ | ||
126 | cond_free(&ctx->null_cond); | ||
127 | @@ -XXX,XX +XXX,XX @@ static void do_sub(DisasContext *ctx, unsigned rt, TCGv_reg in1, | ||
128 | tmp = tcg_temp_new(); | ||
129 | tcg_gen_setcond_reg(cond.c, tmp, cond.a0, cond.a1); | ||
130 | gen_helper_tcond(cpu_env, tmp); | ||
131 | - tcg_temp_free(tmp); | ||
132 | } | ||
133 | |||
134 | /* Write back the result. */ | ||
135 | save_or_nullify(ctx, cpu_psw_cb, cb); | ||
136 | save_or_nullify(ctx, cpu_psw_cb_msb, cb_msb); | ||
137 | save_gpr(ctx, rt, dest); | ||
138 | - tcg_temp_free(dest); | ||
139 | - tcg_temp_free(cb); | ||
140 | - tcg_temp_free(cb_msb); | ||
141 | |||
142 | /* Install the new nullification. */ | ||
143 | cond_free(&ctx->null_cond); | ||
144 | @@ -XXX,XX +XXX,XX @@ static void do_cmpclr(DisasContext *ctx, unsigned rt, TCGv_reg in1, | ||
145 | /* Clear. */ | ||
146 | tcg_gen_movi_reg(dest, 0); | ||
147 | save_gpr(ctx, rt, dest); | ||
148 | - tcg_temp_free(dest); | ||
149 | |||
150 | /* Install the new nullification. */ | ||
151 | cond_free(&ctx->null_cond); | ||
152 | @@ -XXX,XX +XXX,XX @@ static void do_unit(DisasContext *ctx, unsigned rt, TCGv_reg in1, | ||
153 | TCGv_reg tmp = tcg_temp_new(); | ||
154 | tcg_gen_setcond_reg(cond.c, tmp, cond.a0, cond.a1); | ||
155 | gen_helper_tcond(cpu_env, tmp); | ||
156 | - tcg_temp_free(tmp); | ||
157 | } | ||
158 | save_gpr(ctx, rt, dest); | ||
159 | |||
160 | @@ -XXX,XX +XXX,XX @@ static TCGv_i64 space_select(DisasContext *ctx, int sp, TCGv_reg base) | ||
161 | tcg_gen_shri_reg(tmp, base, TARGET_REGISTER_BITS - 5); | ||
162 | tcg_gen_andi_reg(tmp, tmp, 030); | ||
163 | tcg_gen_trunc_reg_ptr(ptr, tmp); | ||
164 | - tcg_temp_free(tmp); | ||
165 | |||
166 | tcg_gen_add_ptr(ptr, ptr, cpu_env); | ||
167 | tcg_gen_ld_i64(spc, ptr, offsetof(CPUHPPAState, sr[4])); | ||
168 | - tcg_temp_free_ptr(ptr); | ||
169 | |||
170 | return spc; | ||
171 | } | ||
172 | @@ -XXX,XX +XXX,XX @@ static bool do_floadw(DisasContext *ctx, unsigned rt, unsigned rb, | ||
173 | tmp = tcg_temp_new_i32(); | ||
174 | do_load_32(ctx, tmp, rb, rx, scale, disp, sp, modify, MO_TEUL); | ||
175 | save_frw_i32(rt, tmp); | ||
176 | - tcg_temp_free_i32(tmp); | ||
177 | |||
178 | if (rt == 0) { | ||
179 | gen_helper_loaded_fr0(cpu_env); | ||
180 | @@ -XXX,XX +XXX,XX @@ static bool do_floadd(DisasContext *ctx, unsigned rt, unsigned rb, | ||
181 | tmp = tcg_temp_new_i64(); | ||
182 | do_load_64(ctx, tmp, rb, rx, scale, disp, sp, modify, MO_TEUQ); | ||
183 | save_frd(rt, tmp); | ||
184 | - tcg_temp_free_i64(tmp); | ||
185 | |||
186 | if (rt == 0) { | ||
187 | gen_helper_loaded_fr0(cpu_env); | ||
188 | @@ -XXX,XX +XXX,XX @@ static bool do_fstorew(DisasContext *ctx, unsigned rt, unsigned rb, | ||
189 | |||
190 | tmp = load_frw_i32(rt); | ||
191 | do_store_32(ctx, tmp, rb, rx, scale, disp, sp, modify, MO_TEUL); | ||
192 | - tcg_temp_free_i32(tmp); | ||
193 | |||
194 | return nullify_end(ctx); | ||
195 | } | ||
196 | @@ -XXX,XX +XXX,XX @@ static bool do_fstored(DisasContext *ctx, unsigned rt, unsigned rb, | ||
197 | |||
198 | tmp = load_frd(rt); | ||
199 | do_store_64(ctx, tmp, rb, rx, scale, disp, sp, modify, MO_TEUQ); | ||
200 | - tcg_temp_free_i64(tmp); | ||
201 | |||
202 | return nullify_end(ctx); | ||
203 | } | ||
204 | @@ -XXX,XX +XXX,XX @@ static bool do_fop_wew(DisasContext *ctx, unsigned rt, unsigned ra, | ||
205 | func(tmp, cpu_env, tmp); | ||
206 | |||
207 | save_frw_i32(rt, tmp); | ||
208 | - tcg_temp_free_i32(tmp); | ||
209 | return nullify_end(ctx); | ||
210 | } | ||
211 | |||
212 | @@ -XXX,XX +XXX,XX @@ static bool do_fop_wed(DisasContext *ctx, unsigned rt, unsigned ra, | ||
213 | |||
214 | func(dst, cpu_env, src); | ||
215 | |||
216 | - tcg_temp_free_i64(src); | ||
217 | save_frw_i32(rt, dst); | ||
218 | - tcg_temp_free_i32(dst); | ||
219 | return nullify_end(ctx); | ||
220 | } | ||
221 | |||
222 | @@ -XXX,XX +XXX,XX @@ static bool do_fop_ded(DisasContext *ctx, unsigned rt, unsigned ra, | ||
223 | func(tmp, cpu_env, tmp); | ||
224 | |||
225 | save_frd(rt, tmp); | ||
226 | - tcg_temp_free_i64(tmp); | ||
227 | return nullify_end(ctx); | ||
228 | } | ||
229 | |||
230 | @@ -XXX,XX +XXX,XX @@ static bool do_fop_dew(DisasContext *ctx, unsigned rt, unsigned ra, | ||
231 | |||
232 | func(dst, cpu_env, src); | ||
233 | |||
234 | - tcg_temp_free_i32(src); | ||
235 | save_frd(rt, dst); | ||
236 | - tcg_temp_free_i64(dst); | ||
237 | return nullify_end(ctx); | ||
238 | } | ||
239 | |||
240 | @@ -XXX,XX +XXX,XX @@ static bool do_fop_weww(DisasContext *ctx, unsigned rt, | ||
241 | |||
242 | func(a, cpu_env, a, b); | ||
243 | |||
244 | - tcg_temp_free_i32(b); | ||
245 | save_frw_i32(rt, a); | ||
246 | - tcg_temp_free_i32(a); | ||
247 | return nullify_end(ctx); | ||
248 | } | ||
249 | |||
250 | @@ -XXX,XX +XXX,XX @@ static bool do_fop_dedd(DisasContext *ctx, unsigned rt, | ||
251 | |||
252 | func(a, cpu_env, a, b); | ||
253 | |||
254 | - tcg_temp_free_i64(b); | ||
255 | save_frd(rt, a); | ||
256 | - tcg_temp_free_i64(a); | ||
257 | return nullify_end(ctx); | ||
258 | } | ||
259 | |||
260 | @@ -XXX,XX +XXX,XX @@ static bool trans_mfsp(DisasContext *ctx, arg_mfsp *a) | ||
261 | tcg_gen_trunc_i64_reg(t1, t0); | ||
262 | |||
263 | save_gpr(ctx, rt, t1); | ||
264 | - tcg_temp_free(t1); | ||
265 | - tcg_temp_free_i64(t0); | ||
266 | |||
267 | cond_free(&ctx->null_cond); | ||
268 | return true; | ||
269 | @@ -XXX,XX +XXX,XX @@ static bool trans_mtsp(DisasContext *ctx, arg_mtsp *a) | ||
270 | } else { | ||
271 | tcg_gen_mov_i64(cpu_sr[rs], t64); | ||
272 | } | ||
273 | - tcg_temp_free_i64(t64); | ||
274 | |||
275 | return nullify_end(ctx); | ||
276 | } | ||
277 | @@ -XXX,XX +XXX,XX @@ static bool trans_mtctl(DisasContext *ctx, arg_mtctl *a) | ||
278 | tmp = tcg_temp_new(); | ||
279 | tcg_gen_andi_reg(tmp, reg, TARGET_REGISTER_BITS - 1); | ||
280 | save_or_nullify(ctx, cpu_sar, tmp); | ||
281 | - tcg_temp_free(tmp); | ||
282 | |||
283 | cond_free(&ctx->null_cond); | ||
284 | return true; | ||
285 | @@ -XXX,XX +XXX,XX @@ static bool trans_mtsarcm(DisasContext *ctx, arg_mtsarcm *a) | ||
286 | tcg_gen_not_reg(tmp, load_gpr(ctx, a->r)); | ||
287 | tcg_gen_andi_reg(tmp, tmp, TARGET_REGISTER_BITS - 1); | ||
288 | save_or_nullify(ctx, cpu_sar, tmp); | ||
289 | - tcg_temp_free(tmp); | ||
290 | |||
291 | cond_free(&ctx->null_cond); | ||
292 | return true; | ||
293 | @@ -XXX,XX +XXX,XX @@ static bool trans_ldsid(DisasContext *ctx, arg_ldsid *a) | ||
294 | tcg_gen_mov_i64(t0, space_select(ctx, a->sp, load_gpr(ctx, a->b))); | ||
295 | tcg_gen_shri_i64(t0, t0, 32); | ||
296 | tcg_gen_trunc_i64_reg(dest, t0); | ||
297 | - | ||
298 | - tcg_temp_free_i64(t0); | ||
299 | #endif | ||
300 | save_gpr(ctx, a->t, dest); | ||
301 | |||
302 | @@ -XXX,XX +XXX,XX @@ static bool trans_probe(DisasContext *ctx, arg_probe *a) | ||
303 | |||
304 | gen_helper_probe(dest, cpu_env, addr, level, want); | ||
305 | |||
306 | - tcg_temp_free_i32(level); | ||
307 | - | ||
308 | save_gpr(ctx, a->t, dest); | ||
309 | return nullify_end(ctx); | ||
310 | } | ||
311 | @@ -XXX,XX +XXX,XX @@ static bool trans_ixtlbxf(DisasContext *ctx, arg_ixtlbxf *a) | ||
312 | : offsetof(CPUHPPAState, cr[CR_IIAOQ])); | ||
313 | tcg_gen_shli_i64(stl, stl, 32); | ||
314 | tcg_gen_or_tl(addr, atl, stl); | ||
315 | - tcg_temp_free_tl(atl); | ||
316 | - tcg_temp_free_tl(stl); | ||
317 | |||
318 | reg = load_gpr(ctx, a->r); | ||
319 | if (a->addr) { | ||
320 | @@ -XXX,XX +XXX,XX @@ static bool trans_ixtlbxf(DisasContext *ctx, arg_ixtlbxf *a) | ||
321 | } else { | ||
322 | gen_helper_itlbp(cpu_env, addr, reg); | ||
323 | } | ||
324 | - tcg_temp_free_tl(addr); | ||
325 | |||
326 | /* Exit TB for TLB change if mmu is enabled. */ | ||
327 | if (ctx->tb_flags & PSW_C) { | ||
328 | @@ -XXX,XX +XXX,XX @@ static bool trans_lpa(DisasContext *ctx, arg_ldst *a) | ||
329 | save_gpr(ctx, a->b, ofs); | ||
330 | } | ||
331 | save_gpr(ctx, a->t, paddr); | ||
332 | - tcg_temp_free(paddr); | ||
333 | |||
334 | return nullify_end(ctx); | ||
335 | #endif | ||
336 | @@ -XXX,XX +XXX,XX @@ static bool trans_ds(DisasContext *ctx, arg_rrr_cf *a) | ||
337 | tcg_gen_add2_i32(dest, cpu_psw_cb_msb, add1, zero, add2, zero); | ||
338 | tcg_gen_add2_i32(dest, cpu_psw_cb_msb, dest, cpu_psw_cb_msb, addc, zero); | ||
339 | |||
340 | - tcg_temp_free(addc); | ||
341 | - | ||
342 | /* Write back the result register. */ | ||
343 | save_gpr(ctx, a->t, dest); | ||
344 | |||
345 | @@ -XXX,XX +XXX,XX @@ static bool trans_ds(DisasContext *ctx, arg_rrr_cf *a) | ||
346 | ctx->null_cond = do_cond(a->cf, dest, cpu_psw_cb_msb, sv); | ||
347 | } | ||
348 | |||
349 | - tcg_temp_free(add1); | ||
350 | - tcg_temp_free(add2); | ||
351 | - tcg_temp_free(dest); | ||
352 | - | ||
353 | return nullify_end(ctx); | ||
354 | } | ||
355 | |||
356 | @@ -XXX,XX +XXX,XX @@ static bool do_addb(DisasContext *ctx, unsigned r, TCGv_reg in1, | ||
357 | |||
358 | cond = do_cond(c * 2 + f, dest, cb_msb, sv); | ||
359 | save_gpr(ctx, r, dest); | ||
360 | - tcg_temp_free(dest); | ||
361 | return do_cbranch(ctx, disp, n, &cond); | ||
362 | } | ||
363 | |||
364 | @@ -XXX,XX +XXX,XX @@ static bool trans_bb_sar(DisasContext *ctx, arg_bb_sar *a) | ||
365 | tcg_gen_shl_reg(tmp, tcg_r, cpu_sar); | ||
366 | |||
367 | cond = cond_make_0(a->c ? TCG_COND_GE : TCG_COND_LT, tmp); | ||
368 | - tcg_temp_free(tmp); | ||
369 | return do_cbranch(ctx, a->disp, a->n, &cond); | ||
370 | } | ||
371 | |||
372 | @@ -XXX,XX +XXX,XX @@ static bool trans_bb_imm(DisasContext *ctx, arg_bb_imm *a) | ||
373 | tcg_gen_shli_reg(tmp, tcg_r, a->p); | ||
374 | |||
375 | cond = cond_make_0(a->c ? TCG_COND_GE : TCG_COND_LT, tmp); | ||
376 | - tcg_temp_free(tmp); | ||
377 | return do_cbranch(ctx, a->disp, a->n, &cond); | ||
378 | } | ||
379 | |||
380 | @@ -XXX,XX +XXX,XX @@ static bool trans_shrpw_sar(DisasContext *ctx, arg_shrpw_sar *a) | ||
381 | tcg_gen_trunc_reg_i32(t32, load_gpr(ctx, a->r2)); | ||
382 | tcg_gen_rotr_i32(t32, t32, cpu_sar); | ||
383 | tcg_gen_extu_i32_reg(dest, t32); | ||
384 | - tcg_temp_free_i32(t32); | ||
385 | } else { | ||
386 | TCGv_i64 t = tcg_temp_new_i64(); | ||
387 | TCGv_i64 s = tcg_temp_new_i64(); | ||
388 | @@ -XXX,XX +XXX,XX @@ static bool trans_shrpw_sar(DisasContext *ctx, arg_shrpw_sar *a) | ||
389 | tcg_gen_extu_reg_i64(s, cpu_sar); | ||
390 | tcg_gen_shr_i64(t, t, s); | ||
391 | tcg_gen_trunc_i64_reg(dest, t); | ||
392 | - | ||
393 | - tcg_temp_free_i64(t); | ||
394 | - tcg_temp_free_i64(s); | ||
395 | } | ||
396 | save_gpr(ctx, a->t, dest); | ||
397 | |||
398 | @@ -XXX,XX +XXX,XX @@ static bool trans_shrpw_imm(DisasContext *ctx, arg_shrpw_imm *a) | ||
399 | tcg_gen_trunc_reg_i32(t32, t2); | ||
400 | tcg_gen_rotri_i32(t32, t32, sa); | ||
401 | tcg_gen_extu_i32_reg(dest, t32); | ||
402 | - tcg_temp_free_i32(t32); | ||
403 | } else { | ||
404 | TCGv_i64 t64 = tcg_temp_new_i64(); | ||
405 | tcg_gen_concat_reg_i64(t64, t2, cpu_gr[a->r1]); | ||
406 | tcg_gen_shri_i64(t64, t64, sa); | ||
407 | tcg_gen_trunc_i64_reg(dest, t64); | ||
408 | - tcg_temp_free_i64(t64); | ||
409 | } | ||
410 | save_gpr(ctx, a->t, dest); | ||
411 | |||
412 | @@ -XXX,XX +XXX,XX @@ static bool trans_extrw_sar(DisasContext *ctx, arg_extrw_sar *a) | ||
413 | tcg_gen_shr_reg(dest, src, tmp); | ||
414 | tcg_gen_extract_reg(dest, dest, 0, len); | ||
415 | } | ||
416 | - tcg_temp_free(tmp); | ||
417 | save_gpr(ctx, a->t, dest); | ||
418 | |||
419 | /* Install the new nullification. */ | ||
420 | @@ -XXX,XX +XXX,XX @@ static bool do_depw_sar(DisasContext *ctx, unsigned rt, unsigned c, | ||
421 | } else { | ||
422 | tcg_gen_shl_reg(dest, tmp, shift); | ||
423 | } | ||
424 | - tcg_temp_free(shift); | ||
425 | - tcg_temp_free(mask); | ||
426 | - tcg_temp_free(tmp); | ||
427 | save_gpr(ctx, rt, dest); | ||
428 | |||
429 | /* Install the new nullification. */ | ||
430 | @@ -XXX,XX +XXX,XX @@ static bool trans_be(DisasContext *ctx, arg_be *a) | ||
431 | tcg_gen_mov_i64(cpu_iasq_b, new_spc); | ||
432 | nullify_set(ctx, a->n); | ||
433 | } | ||
434 | - tcg_temp_free_i64(new_spc); | ||
435 | tcg_gen_lookup_and_goto_ptr(); | ||
436 | ctx->base.is_jmp = DISAS_NORETURN; | ||
437 | return nullify_end(ctx); | ||
438 | @@ -XXX,XX +XXX,XX @@ static bool trans_fcmp_f(DisasContext *ctx, arg_fclass2 *a) | ||
439 | |||
440 | gen_helper_fcmp_s(cpu_env, ta, tb, ty, tc); | ||
441 | |||
442 | - tcg_temp_free_i32(ta); | ||
443 | - tcg_temp_free_i32(tb); | ||
444 | - | ||
445 | return nullify_end(ctx); | ||
446 | } | ||
447 | |||
448 | @@ -XXX,XX +XXX,XX @@ static bool trans_fcmp_d(DisasContext *ctx, arg_fclass2 *a) | ||
449 | |||
450 | gen_helper_fcmp_d(cpu_env, ta, tb, ty, tc); | ||
451 | |||
452 | - tcg_temp_free_i64(ta); | ||
453 | - tcg_temp_free_i64(tb); | ||
454 | - | ||
455 | return nullify_end(ctx); | ||
456 | } | ||
457 | |||
458 | @@ -XXX,XX +XXX,XX @@ static bool trans_ftest(DisasContext *ctx, arg_ftest *a) | ||
459 | |||
460 | tcg_gen_extract_reg(t, t, 21 - cbit, 1); | ||
461 | ctx->null_cond = cond_make_0(TCG_COND_NE, t); | ||
462 | - tcg_temp_free(t); | ||
463 | } | ||
464 | |||
465 | done: | ||
466 | @@ -XXX,XX +XXX,XX @@ static bool trans_xmpyu(DisasContext *ctx, arg_xmpyu *a) | ||
467 | y = load_frw0_i64(a->r2); | ||
468 | tcg_gen_mul_i64(x, x, y); | ||
469 | save_frd(a->t, x); | ||
470 | - tcg_temp_free_i64(x); | ||
471 | - tcg_temp_free_i64(y); | ||
472 | |||
473 | return nullify_end(ctx); | ||
474 | } | ||
475 | @@ -XXX,XX +XXX,XX @@ static bool trans_fmpyfadd_f(DisasContext *ctx, arg_fmpyfadd_f *a) | ||
476 | gen_helper_fmpyfadd_s(x, cpu_env, x, y, z); | ||
477 | } | ||
478 | |||
479 | - tcg_temp_free_i32(y); | ||
480 | - tcg_temp_free_i32(z); | ||
481 | save_frw_i32(a->t, x); | ||
482 | - tcg_temp_free_i32(x); | ||
483 | return nullify_end(ctx); | ||
484 | } | ||
485 | |||
486 | @@ -XXX,XX +XXX,XX @@ static bool trans_fmpyfadd_d(DisasContext *ctx, arg_fmpyfadd_d *a) | ||
487 | gen_helper_fmpyfadd_d(x, cpu_env, x, y, z); | ||
488 | } | ||
489 | |||
490 | - tcg_temp_free_i64(y); | ||
491 | - tcg_temp_free_i64(z); | ||
492 | save_frd(a->t, x); | ||
493 | - tcg_temp_free_i64(x); | ||
494 | return nullify_end(ctx); | ||
495 | } | ||
496 | |||
497 | @@ -XXX,XX +XXX,XX @@ static void hppa_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) | ||
498 | } | ||
499 | } | ||
500 | |||
501 | - /* Free any temporaries allocated. */ | ||
502 | + /* Forget any temporaries allocated. */ | ||
503 | for (i = 0, n = ctx->ntempr; i < n; ++i) { | ||
504 | - tcg_temp_free(ctx->tempr[i]); | ||
505 | ctx->tempr[i] = NULL; | ||
506 | } | ||
507 | for (i = 0, n = ctx->ntempl; i < n; ++i) { | ||
508 | - tcg_temp_free_tl(ctx->templ[i]); | ||
509 | ctx->templ[i] = NULL; | ||
510 | } | ||
511 | ctx->ntempr = 0; | ||
512 | -- | ||
513 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries, | ||
2 | therefore there's no need to record temps for later freeing. | ||
3 | Replace the few uses with tcg_temp_new. | ||
4 | 1 | ||
5 | Reviewed-by: Song Gao <gaosong@loongson.cn> | ||
6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
7 | --- | ||
8 | target/loongarch/translate.h | 3 --- | ||
9 | target/loongarch/translate.c | 21 +++---------------- | ||
10 | .../insn_trans/trans_privileged.c.inc | 2 +- | ||
11 | 3 files changed, 4 insertions(+), 22 deletions(-) | ||
12 | |||
13 | diff --git a/target/loongarch/translate.h b/target/loongarch/translate.h | ||
14 | index XXXXXXX..XXXXXXX 100644 | ||
15 | --- a/target/loongarch/translate.h | ||
16 | +++ b/target/loongarch/translate.h | ||
17 | @@ -XXX,XX +XXX,XX @@ typedef struct DisasContext { | ||
18 | uint16_t mem_idx; | ||
19 | uint16_t plv; | ||
20 | TCGv zero; | ||
21 | - /* Space for 3 operands plus 1 extra for address computation. */ | ||
22 | - TCGv temp[4]; | ||
23 | - uint8_t ntemp; | ||
24 | } DisasContext; | ||
25 | |||
26 | void generate_exception(DisasContext *ctx, int excp); | ||
27 | diff --git a/target/loongarch/translate.c b/target/loongarch/translate.c | ||
28 | index XXXXXXX..XXXXXXX 100644 | ||
29 | --- a/target/loongarch/translate.c | ||
30 | +++ b/target/loongarch/translate.c | ||
31 | @@ -XXX,XX +XXX,XX @@ static void loongarch_tr_init_disas_context(DisasContextBase *dcbase, | ||
32 | bound = -(ctx->base.pc_first | TARGET_PAGE_MASK) / 4; | ||
33 | ctx->base.max_insns = MIN(ctx->base.max_insns, bound); | ||
34 | |||
35 | - ctx->ntemp = 0; | ||
36 | - memset(ctx->temp, 0, sizeof(ctx->temp)); | ||
37 | - | ||
38 | ctx->zero = tcg_constant_tl(0); | ||
39 | } | ||
40 | |||
41 | @@ -XXX,XX +XXX,XX @@ static void loongarch_tr_insn_start(DisasContextBase *dcbase, CPUState *cs) | ||
42 | * | ||
43 | * Further, we may provide an extension for word operations. | ||
44 | */ | ||
45 | -static TCGv temp_new(DisasContext *ctx) | ||
46 | -{ | ||
47 | - assert(ctx->ntemp < ARRAY_SIZE(ctx->temp)); | ||
48 | - return ctx->temp[ctx->ntemp++] = tcg_temp_new(); | ||
49 | -} | ||
50 | - | ||
51 | static TCGv gpr_src(DisasContext *ctx, int reg_num, DisasExtend src_ext) | ||
52 | { | ||
53 | TCGv t; | ||
54 | @@ -XXX,XX +XXX,XX @@ static TCGv gpr_src(DisasContext *ctx, int reg_num, DisasExtend src_ext) | ||
55 | case EXT_NONE: | ||
56 | return cpu_gpr[reg_num]; | ||
57 | case EXT_SIGN: | ||
58 | - t = temp_new(ctx); | ||
59 | + t = tcg_temp_new(); | ||
60 | tcg_gen_ext32s_tl(t, cpu_gpr[reg_num]); | ||
61 | return t; | ||
62 | case EXT_ZERO: | ||
63 | - t = temp_new(ctx); | ||
64 | + t = tcg_temp_new(); | ||
65 | tcg_gen_ext32u_tl(t, cpu_gpr[reg_num]); | ||
66 | return t; | ||
67 | } | ||
68 | @@ -XXX,XX +XXX,XX @@ static TCGv gpr_src(DisasContext *ctx, int reg_num, DisasExtend src_ext) | ||
69 | static TCGv gpr_dst(DisasContext *ctx, int reg_num, DisasExtend dst_ext) | ||
70 | { | ||
71 | if (reg_num == 0 || dst_ext) { | ||
72 | - return temp_new(ctx); | ||
73 | + return tcg_temp_new(); | ||
74 | } | ||
75 | return cpu_gpr[reg_num]; | ||
76 | } | ||
77 | @@ -XXX,XX +XXX,XX @@ static void loongarch_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) | ||
78 | generate_exception(ctx, EXCCODE_INE); | ||
79 | } | ||
80 | |||
81 | - for (int i = ctx->ntemp - 1; i >= 0; --i) { | ||
82 | - tcg_temp_free(ctx->temp[i]); | ||
83 | - ctx->temp[i] = NULL; | ||
84 | - } | ||
85 | - ctx->ntemp = 0; | ||
86 | - | ||
87 | ctx->base.pc_next += 4; | ||
88 | } | ||
89 | |||
90 | diff --git a/target/loongarch/insn_trans/trans_privileged.c.inc b/target/loongarch/insn_trans/trans_privileged.c.inc | ||
91 | index XXXXXXX..XXXXXXX 100644 | ||
92 | --- a/target/loongarch/insn_trans/trans_privileged.c.inc | ||
93 | +++ b/target/loongarch/insn_trans/trans_privileged.c.inc | ||
94 | @@ -XXX,XX +XXX,XX @@ static bool trans_csrwr(DisasContext *ctx, arg_csrwr *a) | ||
95 | dest = gpr_dst(ctx, a->rd, EXT_NONE); | ||
96 | csr->writefn(dest, cpu_env, src1); | ||
97 | } else { | ||
98 | - dest = temp_new(ctx); | ||
99 | + dest = tcg_temp_new(); | ||
100 | tcg_gen_ld_tl(dest, cpu_env, csr->offset); | ||
101 | tcg_gen_st_tl(src1, cpu_env, csr->offset); | ||
102 | } | ||
103 | -- | ||
104 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Song Gao <gaosong@loongson.cn> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/loongarch/insn_trans/trans_arith.c.inc | 12 ------- | ||
7 | .../loongarch/insn_trans/trans_atomic.c.inc | 3 -- | ||
8 | target/loongarch/insn_trans/trans_bit.c.inc | 12 ------- | ||
9 | target/loongarch/insn_trans/trans_fcmp.c.inc | 3 -- | ||
10 | .../loongarch/insn_trans/trans_fmemory.c.inc | 20 ++--------- | ||
11 | target/loongarch/insn_trans/trans_fmov.c.inc | 6 ---- | ||
12 | .../loongarch/insn_trans/trans_memory.c.inc | 34 +++---------------- | ||
13 | .../insn_trans/trans_privileged.c.inc | 4 --- | ||
14 | target/loongarch/insn_trans/trans_shift.c.inc | 11 ------ | ||
15 | 9 files changed, 6 insertions(+), 99 deletions(-) | ||
16 | |||
17 | diff --git a/target/loongarch/insn_trans/trans_arith.c.inc b/target/loongarch/insn_trans/trans_arith.c.inc | ||
18 | index XXXXXXX..XXXXXXX 100644 | ||
19 | --- a/target/loongarch/insn_trans/trans_arith.c.inc | ||
20 | +++ b/target/loongarch/insn_trans/trans_arith.c.inc | ||
21 | @@ -XXX,XX +XXX,XX @@ static void gen_mulh_d(TCGv dest, TCGv src1, TCGv src2) | ||
22 | { | ||
23 | TCGv discard = tcg_temp_new(); | ||
24 | tcg_gen_muls2_tl(discard, dest, src1, src2); | ||
25 | - tcg_temp_free(discard); | ||
26 | } | ||
27 | |||
28 | static void gen_mulh_du(TCGv dest, TCGv src1, TCGv src2) | ||
29 | { | ||
30 | TCGv discard = tcg_temp_new(); | ||
31 | tcg_gen_mulu2_tl(discard, dest, src1, src2); | ||
32 | - tcg_temp_free(discard); | ||
33 | } | ||
34 | |||
35 | static void prep_divisor_d(TCGv ret, TCGv src1, TCGv src2) | ||
36 | @@ -XXX,XX +XXX,XX @@ static void prep_divisor_d(TCGv ret, TCGv src1, TCGv src2) | ||
37 | tcg_gen_and_tl(ret, ret, t0); | ||
38 | tcg_gen_or_tl(ret, ret, t1); | ||
39 | tcg_gen_movcond_tl(TCG_COND_NE, ret, ret, zero, ret, src2); | ||
40 | - | ||
41 | - tcg_temp_free(t0); | ||
42 | - tcg_temp_free(t1); | ||
43 | } | ||
44 | |||
45 | static void prep_divisor_du(TCGv ret, TCGv src2) | ||
46 | @@ -XXX,XX +XXX,XX @@ static void gen_div_d(TCGv dest, TCGv src1, TCGv src2) | ||
47 | TCGv t0 = tcg_temp_new(); | ||
48 | prep_divisor_d(t0, src1, src2); | ||
49 | tcg_gen_div_tl(dest, src1, t0); | ||
50 | - tcg_temp_free(t0); | ||
51 | } | ||
52 | |||
53 | static void gen_rem_d(TCGv dest, TCGv src1, TCGv src2) | ||
54 | @@ -XXX,XX +XXX,XX @@ static void gen_rem_d(TCGv dest, TCGv src1, TCGv src2) | ||
55 | TCGv t0 = tcg_temp_new(); | ||
56 | prep_divisor_d(t0, src1, src2); | ||
57 | tcg_gen_rem_tl(dest, src1, t0); | ||
58 | - tcg_temp_free(t0); | ||
59 | } | ||
60 | |||
61 | static void gen_div_du(TCGv dest, TCGv src1, TCGv src2) | ||
62 | @@ -XXX,XX +XXX,XX @@ static void gen_div_du(TCGv dest, TCGv src1, TCGv src2) | ||
63 | TCGv t0 = tcg_temp_new(); | ||
64 | prep_divisor_du(t0, src2); | ||
65 | tcg_gen_divu_tl(dest, src1, t0); | ||
66 | - tcg_temp_free(t0); | ||
67 | } | ||
68 | |||
69 | static void gen_rem_du(TCGv dest, TCGv src1, TCGv src2) | ||
70 | @@ -XXX,XX +XXX,XX @@ static void gen_rem_du(TCGv dest, TCGv src1, TCGv src2) | ||
71 | TCGv t0 = tcg_temp_new(); | ||
72 | prep_divisor_du(t0, src2); | ||
73 | tcg_gen_remu_tl(dest, src1, t0); | ||
74 | - tcg_temp_free(t0); | ||
75 | } | ||
76 | |||
77 | static void gen_div_w(TCGv dest, TCGv src1, TCGv src2) | ||
78 | @@ -XXX,XX +XXX,XX @@ static void gen_div_w(TCGv dest, TCGv src1, TCGv src2) | ||
79 | /* We need not check for integer overflow for div_w. */ | ||
80 | prep_divisor_du(t0, src2); | ||
81 | tcg_gen_div_tl(dest, src1, t0); | ||
82 | - tcg_temp_free(t0); | ||
83 | } | ||
84 | |||
85 | static void gen_rem_w(TCGv dest, TCGv src1, TCGv src2) | ||
86 | @@ -XXX,XX +XXX,XX @@ static void gen_rem_w(TCGv dest, TCGv src1, TCGv src2) | ||
87 | /* We need not check for integer overflow for rem_w. */ | ||
88 | prep_divisor_du(t0, src2); | ||
89 | tcg_gen_rem_tl(dest, src1, t0); | ||
90 | - tcg_temp_free(t0); | ||
91 | } | ||
92 | |||
93 | static void gen_alsl(TCGv dest, TCGv src1, TCGv src2, target_long sa) | ||
94 | @@ -XXX,XX +XXX,XX @@ static void gen_alsl(TCGv dest, TCGv src1, TCGv src2, target_long sa) | ||
95 | TCGv t0 = tcg_temp_new(); | ||
96 | tcg_gen_shli_tl(t0, src1, sa); | ||
97 | tcg_gen_add_tl(dest, t0, src2); | ||
98 | - tcg_temp_free(t0); | ||
99 | } | ||
100 | |||
101 | static bool trans_lu32i_d(DisasContext *ctx, arg_lu32i_d *a) | ||
102 | diff --git a/target/loongarch/insn_trans/trans_atomic.c.inc b/target/loongarch/insn_trans/trans_atomic.c.inc | ||
103 | index XXXXXXX..XXXXXXX 100644 | ||
104 | --- a/target/loongarch/insn_trans/trans_atomic.c.inc | ||
105 | +++ b/target/loongarch/insn_trans/trans_atomic.c.inc | ||
106 | @@ -XXX,XX +XXX,XX @@ static bool gen_ll(DisasContext *ctx, arg_rr_i *a, MemOp mop) | ||
107 | tcg_gen_st_tl(t0, cpu_env, offsetof(CPULoongArchState, lladdr)); | ||
108 | tcg_gen_st_tl(dest, cpu_env, offsetof(CPULoongArchState, llval)); | ||
109 | gen_set_gpr(a->rd, dest, EXT_NONE); | ||
110 | - tcg_temp_free(t0); | ||
111 | |||
112 | return true; | ||
113 | } | ||
114 | @@ -XXX,XX +XXX,XX @@ static bool gen_sc(DisasContext *ctx, arg_rr_i *a, MemOp mop) | ||
115 | tcg_gen_setcond_tl(TCG_COND_EQ, dest, t0, cpu_llval); | ||
116 | gen_set_label(done); | ||
117 | gen_set_gpr(a->rd, dest, EXT_NONE); | ||
118 | - tcg_temp_free(t0); | ||
119 | - tcg_temp_free(val); | ||
120 | |||
121 | return true; | ||
122 | } | ||
123 | diff --git a/target/loongarch/insn_trans/trans_bit.c.inc b/target/loongarch/insn_trans/trans_bit.c.inc | ||
124 | index XXXXXXX..XXXXXXX 100644 | ||
125 | --- a/target/loongarch/insn_trans/trans_bit.c.inc | ||
126 | +++ b/target/loongarch/insn_trans/trans_bit.c.inc | ||
127 | @@ -XXX,XX +XXX,XX @@ static void gen_revb_2h(TCGv dest, TCGv src1) | ||
128 | tcg_gen_and_tl(t1, src1, mask); | ||
129 | tcg_gen_shli_tl(t1, t1, 8); | ||
130 | tcg_gen_or_tl(dest, t0, t1); | ||
131 | - | ||
132 | - tcg_temp_free(t0); | ||
133 | - tcg_temp_free(t1); | ||
134 | } | ||
135 | |||
136 | static void gen_revb_4h(TCGv dest, TCGv src1) | ||
137 | @@ -XXX,XX +XXX,XX @@ static void gen_revb_4h(TCGv dest, TCGv src1) | ||
138 | tcg_gen_and_tl(t1, src1, mask); | ||
139 | tcg_gen_shli_tl(t1, t1, 8); | ||
140 | tcg_gen_or_tl(dest, t0, t1); | ||
141 | - | ||
142 | - tcg_temp_free(t0); | ||
143 | - tcg_temp_free(t1); | ||
144 | } | ||
145 | |||
146 | static void gen_revh_2w(TCGv dest, TCGv src1) | ||
147 | @@ -XXX,XX +XXX,XX @@ static void gen_revh_2w(TCGv dest, TCGv src1) | ||
148 | tcg_gen_and_i64(t0, t0, mask); | ||
149 | tcg_gen_shli_i64(t1, t1, 16); | ||
150 | tcg_gen_or_i64(dest, t1, t0); | ||
151 | - | ||
152 | - tcg_temp_free_i64(t0); | ||
153 | - tcg_temp_free_i64(t1); | ||
154 | } | ||
155 | |||
156 | static void gen_revh_d(TCGv dest, TCGv src1) | ||
157 | @@ -XXX,XX +XXX,XX @@ static void gen_revh_d(TCGv dest, TCGv src1) | ||
158 | tcg_gen_shli_tl(t0, t0, 16); | ||
159 | tcg_gen_or_tl(t0, t0, t1); | ||
160 | tcg_gen_rotri_tl(dest, t0, 32); | ||
161 | - | ||
162 | - tcg_temp_free(t0); | ||
163 | - tcg_temp_free(t1); | ||
164 | } | ||
165 | |||
166 | static void gen_maskeqz(TCGv dest, TCGv src1, TCGv src2) | ||
167 | diff --git a/target/loongarch/insn_trans/trans_fcmp.c.inc b/target/loongarch/insn_trans/trans_fcmp.c.inc | ||
168 | index XXXXXXX..XXXXXXX 100644 | ||
169 | --- a/target/loongarch/insn_trans/trans_fcmp.c.inc | ||
170 | +++ b/target/loongarch/insn_trans/trans_fcmp.c.inc | ||
171 | @@ -XXX,XX +XXX,XX @@ static bool trans_fcmp_cond_s(DisasContext *ctx, arg_fcmp_cond_s *a) | ||
172 | fn(var, cpu_env, cpu_fpr[a->fj], cpu_fpr[a->fk], tcg_constant_i32(flags)); | ||
173 | |||
174 | tcg_gen_st8_tl(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd])); | ||
175 | - tcg_temp_free(var); | ||
176 | return true; | ||
177 | } | ||
178 | |||
179 | @@ -XXX,XX +XXX,XX @@ static bool trans_fcmp_cond_d(DisasContext *ctx, arg_fcmp_cond_d *a) | ||
180 | fn(var, cpu_env, cpu_fpr[a->fj], cpu_fpr[a->fk], tcg_constant_i32(flags)); | ||
181 | |||
182 | tcg_gen_st8_tl(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd])); | ||
183 | - | ||
184 | - tcg_temp_free(var); | ||
185 | return true; | ||
186 | } | ||
187 | diff --git a/target/loongarch/insn_trans/trans_fmemory.c.inc b/target/loongarch/insn_trans/trans_fmemory.c.inc | ||
188 | index XXXXXXX..XXXXXXX 100644 | ||
189 | --- a/target/loongarch/insn_trans/trans_fmemory.c.inc | ||
190 | +++ b/target/loongarch/insn_trans/trans_fmemory.c.inc | ||
191 | @@ -XXX,XX +XXX,XX @@ static void maybe_nanbox_load(TCGv freg, MemOp mop) | ||
192 | static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop) | ||
193 | { | ||
194 | TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); | ||
195 | - TCGv temp = NULL; | ||
196 | |||
197 | CHECK_FPE; | ||
198 | |||
199 | if (a->imm) { | ||
200 | - temp = tcg_temp_new(); | ||
201 | + TCGv temp = tcg_temp_new(); | ||
202 | tcg_gen_addi_tl(temp, addr, a->imm); | ||
203 | addr = temp; | ||
204 | } | ||
205 | @@ -XXX,XX +XXX,XX @@ static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop) | ||
206 | tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); | ||
207 | maybe_nanbox_load(cpu_fpr[a->fd], mop); | ||
208 | |||
209 | - if (temp) { | ||
210 | - tcg_temp_free(temp); | ||
211 | - } | ||
212 | - | ||
213 | return true; | ||
214 | } | ||
215 | |||
216 | static bool gen_fstore_i(DisasContext *ctx, arg_fr_i *a, MemOp mop) | ||
217 | { | ||
218 | TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); | ||
219 | - TCGv temp = NULL; | ||
220 | |||
221 | CHECK_FPE; | ||
222 | |||
223 | if (a->imm) { | ||
224 | - temp = tcg_temp_new(); | ||
225 | + TCGv temp = tcg_temp_new(); | ||
226 | tcg_gen_addi_tl(temp, addr, a->imm); | ||
227 | addr = temp; | ||
228 | } | ||
229 | |||
230 | tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); | ||
231 | - | ||
232 | - if (temp) { | ||
233 | - tcg_temp_free(temp); | ||
234 | - } | ||
235 | return true; | ||
236 | } | ||
237 | |||
238 | @@ -XXX,XX +XXX,XX @@ static bool gen_floadx(DisasContext *ctx, arg_frr *a, MemOp mop) | ||
239 | tcg_gen_add_tl(addr, src1, src2); | ||
240 | tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); | ||
241 | maybe_nanbox_load(cpu_fpr[a->fd], mop); | ||
242 | - tcg_temp_free(addr); | ||
243 | |||
244 | return true; | ||
245 | } | ||
246 | @@ -XXX,XX +XXX,XX @@ static bool gen_fstorex(DisasContext *ctx, arg_frr *a, MemOp mop) | ||
247 | addr = tcg_temp_new(); | ||
248 | tcg_gen_add_tl(addr, src1, src2); | ||
249 | tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); | ||
250 | - tcg_temp_free(addr); | ||
251 | |||
252 | return true; | ||
253 | } | ||
254 | @@ -XXX,XX +XXX,XX @@ static bool gen_fload_gt(DisasContext *ctx, arg_frr *a, MemOp mop) | ||
255 | tcg_gen_add_tl(addr, src1, src2); | ||
256 | tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); | ||
257 | maybe_nanbox_load(cpu_fpr[a->fd], mop); | ||
258 | - tcg_temp_free(addr); | ||
259 | |||
260 | return true; | ||
261 | } | ||
262 | @@ -XXX,XX +XXX,XX @@ static bool gen_fstore_gt(DisasContext *ctx, arg_frr *a, MemOp mop) | ||
263 | gen_helper_asrtgt_d(cpu_env, src1, src2); | ||
264 | tcg_gen_add_tl(addr, src1, src2); | ||
265 | tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); | ||
266 | - tcg_temp_free(addr); | ||
267 | |||
268 | return true; | ||
269 | } | ||
270 | @@ -XXX,XX +XXX,XX @@ static bool gen_fload_le(DisasContext *ctx, arg_frr *a, MemOp mop) | ||
271 | tcg_gen_add_tl(addr, src1, src2); | ||
272 | tcg_gen_qemu_ld_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); | ||
273 | maybe_nanbox_load(cpu_fpr[a->fd], mop); | ||
274 | - tcg_temp_free(addr); | ||
275 | |||
276 | return true; | ||
277 | } | ||
278 | @@ -XXX,XX +XXX,XX @@ static bool gen_fstore_le(DisasContext *ctx, arg_frr *a, MemOp mop) | ||
279 | gen_helper_asrtle_d(cpu_env, src1, src2); | ||
280 | tcg_gen_add_tl(addr, src1, src2); | ||
281 | tcg_gen_qemu_st_tl(cpu_fpr[a->fd], addr, ctx->mem_idx, mop); | ||
282 | - tcg_temp_free(addr); | ||
283 | |||
284 | return true; | ||
285 | } | ||
286 | diff --git a/target/loongarch/insn_trans/trans_fmov.c.inc b/target/loongarch/insn_trans/trans_fmov.c.inc | ||
287 | index XXXXXXX..XXXXXXX 100644 | ||
288 | --- a/target/loongarch/insn_trans/trans_fmov.c.inc | ||
289 | +++ b/target/loongarch/insn_trans/trans_fmov.c.inc | ||
290 | @@ -XXX,XX +XXX,XX @@ static bool trans_fsel(DisasContext *ctx, arg_fsel *a) | ||
291 | tcg_gen_ld8u_tl(cond, cpu_env, offsetof(CPULoongArchState, cf[a->ca])); | ||
292 | tcg_gen_movcond_tl(TCG_COND_EQ, cpu_fpr[a->fd], cond, zero, | ||
293 | cpu_fpr[a->fj], cpu_fpr[a->fk]); | ||
294 | - tcg_temp_free(cond); | ||
295 | |||
296 | return true; | ||
297 | } | ||
298 | @@ -XXX,XX +XXX,XX @@ static bool trans_movgr2fcsr(DisasContext *ctx, arg_movgr2fcsr *a) | ||
299 | tcg_gen_andi_i32(fcsr0, fcsr0, ~mask); | ||
300 | tcg_gen_or_i32(fcsr0, fcsr0, temp); | ||
301 | tcg_gen_st_i32(fcsr0, cpu_env, offsetof(CPULoongArchState, fcsr0)); | ||
302 | - | ||
303 | - tcg_temp_free_i32(temp); | ||
304 | - tcg_temp_free_i32(fcsr0); | ||
305 | } | ||
306 | |||
307 | /* | ||
308 | @@ -XXX,XX +XXX,XX @@ static bool trans_movfr2cf(DisasContext *ctx, arg_movfr2cf *a) | ||
309 | t0 = tcg_temp_new(); | ||
310 | tcg_gen_andi_tl(t0, cpu_fpr[a->fj], 0x1); | ||
311 | tcg_gen_st8_tl(t0, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7])); | ||
312 | - tcg_temp_free(t0); | ||
313 | |||
314 | return true; | ||
315 | } | ||
316 | @@ -XXX,XX +XXX,XX @@ static bool trans_movgr2cf(DisasContext *ctx, arg_movgr2cf *a) | ||
317 | t0 = tcg_temp_new(); | ||
318 | tcg_gen_andi_tl(t0, gpr_src(ctx, a->rj, EXT_NONE), 0x1); | ||
319 | tcg_gen_st8_tl(t0, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7])); | ||
320 | - tcg_temp_free(t0); | ||
321 | |||
322 | return true; | ||
323 | } | ||
324 | diff --git a/target/loongarch/insn_trans/trans_memory.c.inc b/target/loongarch/insn_trans/trans_memory.c.inc | ||
325 | index XXXXXXX..XXXXXXX 100644 | ||
326 | --- a/target/loongarch/insn_trans/trans_memory.c.inc | ||
327 | +++ b/target/loongarch/insn_trans/trans_memory.c.inc | ||
328 | @@ -XXX,XX +XXX,XX @@ static bool gen_load(DisasContext *ctx, arg_rr_i *a, MemOp mop) | ||
329 | { | ||
330 | TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE); | ||
331 | TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); | ||
332 | - TCGv temp = NULL; | ||
333 | |||
334 | if (a->imm) { | ||
335 | - temp = tcg_temp_new(); | ||
336 | + TCGv temp = tcg_temp_new(); | ||
337 | tcg_gen_addi_tl(temp, addr, a->imm); | ||
338 | addr = temp; | ||
339 | } | ||
340 | |||
341 | tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop); | ||
342 | gen_set_gpr(a->rd, dest, EXT_NONE); | ||
343 | - | ||
344 | - if (temp) { | ||
345 | - tcg_temp_free(temp); | ||
346 | - } | ||
347 | - | ||
348 | return true; | ||
349 | } | ||
350 | |||
351 | @@ -XXX,XX +XXX,XX @@ static bool gen_store(DisasContext *ctx, arg_rr_i *a, MemOp mop) | ||
352 | { | ||
353 | TCGv data = gpr_src(ctx, a->rd, EXT_NONE); | ||
354 | TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); | ||
355 | - TCGv temp = NULL; | ||
356 | |||
357 | if (a->imm) { | ||
358 | - temp = tcg_temp_new(); | ||
359 | + TCGv temp = tcg_temp_new(); | ||
360 | tcg_gen_addi_tl(temp, addr, a->imm); | ||
361 | addr = temp; | ||
362 | } | ||
363 | |||
364 | tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop); | ||
365 | - | ||
366 | - if (temp) { | ||
367 | - tcg_temp_free(temp); | ||
368 | - } | ||
369 | - | ||
370 | return true; | ||
371 | } | ||
372 | |||
373 | @@ -XXX,XX +XXX,XX @@ static bool gen_loadx(DisasContext *ctx, arg_rrr *a, MemOp mop) | ||
374 | tcg_gen_add_tl(addr, src1, src2); | ||
375 | tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop); | ||
376 | gen_set_gpr(a->rd, dest, EXT_NONE); | ||
377 | - tcg_temp_free(addr); | ||
378 | |||
379 | return true; | ||
380 | } | ||
381 | @@ -XXX,XX +XXX,XX @@ static bool gen_storex(DisasContext *ctx, arg_rrr *a, MemOp mop) | ||
382 | |||
383 | tcg_gen_add_tl(addr, src1, src2); | ||
384 | tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop); | ||
385 | - tcg_temp_free(addr); | ||
386 | |||
387 | return true; | ||
388 | } | ||
389 | @@ -XXX,XX +XXX,XX @@ static bool gen_ldptr(DisasContext *ctx, arg_rr_i *a, MemOp mop) | ||
390 | { | ||
391 | TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE); | ||
392 | TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); | ||
393 | - TCGv temp = NULL; | ||
394 | |||
395 | if (a->imm) { | ||
396 | - temp = tcg_temp_new(); | ||
397 | + TCGv temp = tcg_temp_new(); | ||
398 | tcg_gen_addi_tl(temp, addr, a->imm); | ||
399 | addr = temp; | ||
400 | } | ||
401 | |||
402 | tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop); | ||
403 | gen_set_gpr(a->rd, dest, EXT_NONE); | ||
404 | - | ||
405 | - if (temp) { | ||
406 | - tcg_temp_free(temp); | ||
407 | - } | ||
408 | - | ||
409 | return true; | ||
410 | } | ||
411 | |||
412 | @@ -XXX,XX +XXX,XX @@ static bool gen_stptr(DisasContext *ctx, arg_rr_i *a, MemOp mop) | ||
413 | { | ||
414 | TCGv data = gpr_src(ctx, a->rd, EXT_NONE); | ||
415 | TCGv addr = gpr_src(ctx, a->rj, EXT_NONE); | ||
416 | - TCGv temp = NULL; | ||
417 | |||
418 | if (a->imm) { | ||
419 | - temp = tcg_temp_new(); | ||
420 | + TCGv temp = tcg_temp_new(); | ||
421 | tcg_gen_addi_tl(temp, addr, a->imm); | ||
422 | addr = temp; | ||
423 | } | ||
424 | |||
425 | tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, mop); | ||
426 | - | ||
427 | - if (temp) { | ||
428 | - tcg_temp_free(temp); | ||
429 | - } | ||
430 | - | ||
431 | return true; | ||
432 | } | ||
433 | |||
434 | diff --git a/target/loongarch/insn_trans/trans_privileged.c.inc b/target/loongarch/insn_trans/trans_privileged.c.inc | ||
435 | index XXXXXXX..XXXXXXX 100644 | ||
436 | --- a/target/loongarch/insn_trans/trans_privileged.c.inc | ||
437 | +++ b/target/loongarch/insn_trans/trans_privileged.c.inc | ||
438 | @@ -XXX,XX +XXX,XX @@ static bool trans_csrxchg(DisasContext *ctx, arg_csrxchg *a) | ||
439 | tcg_gen_st_tl(newv, cpu_env, csr->offset); | ||
440 | } | ||
441 | gen_set_gpr(a->rd, oldv, EXT_NONE); | ||
442 | - | ||
443 | - tcg_temp_free(temp); | ||
444 | - tcg_temp_free(newv); | ||
445 | - tcg_temp_free(oldv); | ||
446 | return true; | ||
447 | } | ||
448 | |||
449 | diff --git a/target/loongarch/insn_trans/trans_shift.c.inc b/target/loongarch/insn_trans/trans_shift.c.inc | ||
450 | index XXXXXXX..XXXXXXX 100644 | ||
451 | --- a/target/loongarch/insn_trans/trans_shift.c.inc | ||
452 | +++ b/target/loongarch/insn_trans/trans_shift.c.inc | ||
453 | @@ -XXX,XX +XXX,XX @@ static void gen_sll_w(TCGv dest, TCGv src1, TCGv src2) | ||
454 | TCGv t0 = tcg_temp_new(); | ||
455 | tcg_gen_andi_tl(t0, src2, 0x1f); | ||
456 | tcg_gen_shl_tl(dest, src1, t0); | ||
457 | - tcg_temp_free(t0); | ||
458 | } | ||
459 | |||
460 | static void gen_srl_w(TCGv dest, TCGv src1, TCGv src2) | ||
461 | @@ -XXX,XX +XXX,XX @@ static void gen_srl_w(TCGv dest, TCGv src1, TCGv src2) | ||
462 | TCGv t0 = tcg_temp_new(); | ||
463 | tcg_gen_andi_tl(t0, src2, 0x1f); | ||
464 | tcg_gen_shr_tl(dest, src1, t0); | ||
465 | - tcg_temp_free(t0); | ||
466 | } | ||
467 | |||
468 | static void gen_sra_w(TCGv dest, TCGv src1, TCGv src2) | ||
469 | @@ -XXX,XX +XXX,XX @@ static void gen_sra_w(TCGv dest, TCGv src1, TCGv src2) | ||
470 | TCGv t0 = tcg_temp_new(); | ||
471 | tcg_gen_andi_tl(t0, src2, 0x1f); | ||
472 | tcg_gen_sar_tl(dest, src1, t0); | ||
473 | - tcg_temp_free(t0); | ||
474 | } | ||
475 | |||
476 | static void gen_sll_d(TCGv dest, TCGv src1, TCGv src2) | ||
477 | @@ -XXX,XX +XXX,XX @@ static void gen_sll_d(TCGv dest, TCGv src1, TCGv src2) | ||
478 | TCGv t0 = tcg_temp_new(); | ||
479 | tcg_gen_andi_tl(t0, src2, 0x3f); | ||
480 | tcg_gen_shl_tl(dest, src1, t0); | ||
481 | - tcg_temp_free(t0); | ||
482 | } | ||
483 | |||
484 | static void gen_srl_d(TCGv dest, TCGv src1, TCGv src2) | ||
485 | @@ -XXX,XX +XXX,XX @@ static void gen_srl_d(TCGv dest, TCGv src1, TCGv src2) | ||
486 | TCGv t0 = tcg_temp_new(); | ||
487 | tcg_gen_andi_tl(t0, src2, 0x3f); | ||
488 | tcg_gen_shr_tl(dest, src1, t0); | ||
489 | - tcg_temp_free(t0); | ||
490 | } | ||
491 | |||
492 | static void gen_sra_d(TCGv dest, TCGv src1, TCGv src2) | ||
493 | @@ -XXX,XX +XXX,XX @@ static void gen_sra_d(TCGv dest, TCGv src1, TCGv src2) | ||
494 | TCGv t0 = tcg_temp_new(); | ||
495 | tcg_gen_andi_tl(t0, src2, 0x3f); | ||
496 | tcg_gen_sar_tl(dest, src1, t0); | ||
497 | - tcg_temp_free(t0); | ||
498 | } | ||
499 | |||
500 | static void gen_rotr_w(TCGv dest, TCGv src1, TCGv src2) | ||
501 | @@ -XXX,XX +XXX,XX @@ static void gen_rotr_w(TCGv dest, TCGv src1, TCGv src2) | ||
502 | |||
503 | tcg_gen_rotr_i32(t1, t1, t2); | ||
504 | tcg_gen_ext_i32_tl(dest, t1); | ||
505 | - | ||
506 | - tcg_temp_free_i32(t1); | ||
507 | - tcg_temp_free_i32(t2); | ||
508 | - tcg_temp_free(t0); | ||
509 | } | ||
510 | |||
511 | static void gen_rotr_d(TCGv dest, TCGv src1, TCGv src2) | ||
512 | @@ -XXX,XX +XXX,XX @@ static void gen_rotr_d(TCGv dest, TCGv src1, TCGv src2) | ||
513 | TCGv t0 = tcg_temp_new(); | ||
514 | tcg_gen_andi_tl(t0, src2, 0x3f); | ||
515 | tcg_gen_rotr_tl(dest, src1, t0); | ||
516 | - tcg_temp_free(t0); | ||
517 | } | ||
518 | |||
519 | static bool trans_srai_w(DisasContext *ctx, arg_srai_w *a) | ||
520 | -- | ||
521 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries, | ||
2 | therefore there's no need to record temps for later freeing. | ||
3 | 1 | ||
4 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
6 | --- | ||
7 | target/m68k/translate.c | 55 ++++++++++------------------------------- | ||
8 | 1 file changed, 13 insertions(+), 42 deletions(-) | ||
9 | |||
10 | diff --git a/target/m68k/translate.c b/target/m68k/translate.c | ||
11 | index XXXXXXX..XXXXXXX 100644 | ||
12 | --- a/target/m68k/translate.c | ||
13 | +++ b/target/m68k/translate.c | ||
14 | @@ -XXX,XX +XXX,XX @@ typedef struct DisasContext { | ||
15 | int done_mac; | ||
16 | int writeback_mask; | ||
17 | TCGv writeback[8]; | ||
18 | -#define MAX_TO_RELEASE 8 | ||
19 | - int release_count; | ||
20 | - TCGv release[MAX_TO_RELEASE]; | ||
21 | bool ss_active; | ||
22 | } DisasContext; | ||
23 | |||
24 | -static void init_release_array(DisasContext *s) | ||
25 | -{ | ||
26 | -#ifdef CONFIG_DEBUG_TCG | ||
27 | - memset(s->release, 0, sizeof(s->release)); | ||
28 | -#endif | ||
29 | - s->release_count = 0; | ||
30 | -} | ||
31 | - | ||
32 | -static void do_release(DisasContext *s) | ||
33 | -{ | ||
34 | - int i; | ||
35 | - for (i = 0; i < s->release_count; i++) { | ||
36 | - tcg_temp_free(s->release[i]); | ||
37 | - } | ||
38 | - init_release_array(s); | ||
39 | -} | ||
40 | - | ||
41 | -static TCGv mark_to_release(DisasContext *s, TCGv tmp) | ||
42 | -{ | ||
43 | - g_assert(s->release_count < MAX_TO_RELEASE); | ||
44 | - return s->release[s->release_count++] = tmp; | ||
45 | -} | ||
46 | - | ||
47 | static TCGv get_areg(DisasContext *s, unsigned regno) | ||
48 | { | ||
49 | if (s->writeback_mask & (1 << regno)) { | ||
50 | @@ -XXX,XX +XXX,XX @@ static TCGv gen_ldst(DisasContext *s, int opsize, TCGv addr, TCGv val, | ||
51 | gen_store(s, opsize, addr, val, index); | ||
52 | return store_dummy; | ||
53 | } else { | ||
54 | - return mark_to_release(s, gen_load(s, opsize, addr, | ||
55 | - what == EA_LOADS, index)); | ||
56 | + return gen_load(s, opsize, addr, what == EA_LOADS, index); | ||
57 | } | ||
58 | } | ||
59 | |||
60 | @@ -XXX,XX +XXX,XX @@ static TCGv gen_lea_indexed(CPUM68KState *env, DisasContext *s, TCGv base) | ||
61 | } else { | ||
62 | bd = 0; | ||
63 | } | ||
64 | - tmp = mark_to_release(s, tcg_temp_new()); | ||
65 | + tmp = tcg_temp_new(); | ||
66 | if ((ext & 0x44) == 0) { | ||
67 | /* pre-index */ | ||
68 | add = gen_addr_index(s, ext, tmp); | ||
69 | @@ -XXX,XX +XXX,XX @@ static TCGv gen_lea_indexed(CPUM68KState *env, DisasContext *s, TCGv base) | ||
70 | if ((ext & 0x80) == 0) { | ||
71 | /* base not suppressed */ | ||
72 | if (IS_NULL_QREG(base)) { | ||
73 | - base = mark_to_release(s, tcg_const_i32(offset + bd)); | ||
74 | + base = tcg_const_i32(offset + bd); | ||
75 | bd = 0; | ||
76 | } | ||
77 | if (!IS_NULL_QREG(add)) { | ||
78 | @@ -XXX,XX +XXX,XX @@ static TCGv gen_lea_indexed(CPUM68KState *env, DisasContext *s, TCGv base) | ||
79 | add = tmp; | ||
80 | } | ||
81 | } else { | ||
82 | - add = mark_to_release(s, tcg_const_i32(bd)); | ||
83 | + add = tcg_const_i32(bd); | ||
84 | } | ||
85 | if ((ext & 3) != 0) { | ||
86 | /* memory indirect */ | ||
87 | - base = mark_to_release(s, gen_load(s, OS_LONG, add, 0, IS_USER(s))); | ||
88 | + base = gen_load(s, OS_LONG, add, 0, IS_USER(s)); | ||
89 | if ((ext & 0x44) == 4) { | ||
90 | add = gen_addr_index(s, ext, tmp); | ||
91 | tcg_gen_add_i32(tmp, add, base); | ||
92 | @@ -XXX,XX +XXX,XX @@ static TCGv gen_lea_indexed(CPUM68KState *env, DisasContext *s, TCGv base) | ||
93 | } | ||
94 | } else { | ||
95 | /* brief extension word format */ | ||
96 | - tmp = mark_to_release(s, tcg_temp_new()); | ||
97 | + tmp = tcg_temp_new(); | ||
98 | add = gen_addr_index(s, ext, tmp); | ||
99 | if (!IS_NULL_QREG(base)) { | ||
100 | tcg_gen_add_i32(tmp, add, base); | ||
101 | @@ -XXX,XX +XXX,XX @@ static inline TCGv gen_extend(DisasContext *s, TCGv val, int opsize, int sign) | ||
102 | if (opsize == OS_LONG) { | ||
103 | tmp = val; | ||
104 | } else { | ||
105 | - tmp = mark_to_release(s, tcg_temp_new()); | ||
106 | + tmp = tcg_temp_new(); | ||
107 | gen_ext(tmp, val, opsize, sign); | ||
108 | } | ||
109 | |||
110 | @@ -XXX,XX +XXX,XX @@ static TCGv gen_lea_mode(CPUM68KState *env, DisasContext *s, | ||
111 | return NULL_QREG; | ||
112 | } | ||
113 | reg = get_areg(s, reg0); | ||
114 | - tmp = mark_to_release(s, tcg_temp_new()); | ||
115 | + tmp = tcg_temp_new(); | ||
116 | if (reg0 == 7 && opsize == OS_BYTE && | ||
117 | m68k_feature(s->env, M68K_FEATURE_M68K)) { | ||
118 | tcg_gen_subi_i32(tmp, reg, 2); | ||
119 | @@ -XXX,XX +XXX,XX @@ static TCGv gen_lea_mode(CPUM68KState *env, DisasContext *s, | ||
120 | return tmp; | ||
121 | case 5: /* Indirect displacement. */ | ||
122 | reg = get_areg(s, reg0); | ||
123 | - tmp = mark_to_release(s, tcg_temp_new()); | ||
124 | + tmp = tcg_temp_new(); | ||
125 | ext = read_im16(env, s); | ||
126 | tcg_gen_addi_i32(tmp, reg, (int16_t)ext); | ||
127 | return tmp; | ||
128 | @@ -XXX,XX +XXX,XX @@ static TCGv gen_lea_mode(CPUM68KState *env, DisasContext *s, | ||
129 | switch (reg0) { | ||
130 | case 0: /* Absolute short. */ | ||
131 | offset = (int16_t)read_im16(env, s); | ||
132 | - return mark_to_release(s, tcg_const_i32(offset)); | ||
133 | + return tcg_const_i32(offset); | ||
134 | case 1: /* Absolute long. */ | ||
135 | offset = read_im32(env, s); | ||
136 | - return mark_to_release(s, tcg_const_i32(offset)); | ||
137 | + return tcg_const_i32(offset); | ||
138 | case 2: /* pc displacement */ | ||
139 | offset = s->pc; | ||
140 | offset += (int16_t)read_im16(env, s); | ||
141 | - return mark_to_release(s, tcg_const_i32(offset)); | ||
142 | + return tcg_const_i32(offset); | ||
143 | case 3: /* pc index+displacement. */ | ||
144 | return gen_lea_indexed(env, s, NULL_QREG); | ||
145 | case 4: /* Immediate. */ | ||
146 | @@ -XXX,XX +XXX,XX @@ static TCGv gen_ea_mode(CPUM68KState *env, DisasContext *s, int mode, int reg0, | ||
147 | default: | ||
148 | g_assert_not_reached(); | ||
149 | } | ||
150 | - return mark_to_release(s, tcg_const_i32(offset)); | ||
151 | + return tcg_const_i32(offset); | ||
152 | default: | ||
153 | return NULL_QREG; | ||
154 | } | ||
155 | @@ -XXX,XX +XXX,XX @@ static void m68k_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu) | ||
156 | dc->cc_op_synced = 1; | ||
157 | dc->done_mac = 0; | ||
158 | dc->writeback_mask = 0; | ||
159 | - init_release_array(dc); | ||
160 | |||
161 | dc->ss_active = (M68K_SR_TRACE(env->sr) == M68K_SR_TRACE_ANY_INS); | ||
162 | /* If architectural single step active, limit to 1 */ | ||
163 | @@ -XXX,XX +XXX,XX @@ static void m68k_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) | ||
164 | |||
165 | opcode_table[insn](env, dc, insn); | ||
166 | do_writebacks(dc); | ||
167 | - do_release(dc); | ||
168 | |||
169 | dc->pc_prev = dc->base.pc_next; | ||
170 | dc->base.pc_next = dc->pc; | ||
171 | -- | ||
172 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | Remove the g1 and g2 members of DisasCompare, as they were | ||
3 | used to track which temps needed to be freed. | ||
4 | 1 | ||
5 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
7 | --- | ||
8 | target/m68k/translate.c | 40 ---------------------------------------- | ||
9 | 1 file changed, 40 deletions(-) | ||
10 | |||
11 | diff --git a/target/m68k/translate.c b/target/m68k/translate.c | ||
12 | index XXXXXXX..XXXXXXX 100644 | ||
13 | --- a/target/m68k/translate.c | ||
14 | +++ b/target/m68k/translate.c | ||
15 | @@ -XXX,XX +XXX,XX @@ static int gen_ea_fp(CPUM68KState *env, DisasContext *s, uint16_t insn, | ||
16 | |||
17 | typedef struct { | ||
18 | TCGCond tcond; | ||
19 | - bool g1; | ||
20 | - bool g2; | ||
21 | TCGv v1; | ||
22 | TCGv v2; | ||
23 | } DisasCompare; | ||
24 | @@ -XXX,XX +XXX,XX @@ static void gen_cc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
25 | |||
26 | /* The CC_OP_CMP form can handle most normal comparisons directly. */ | ||
27 | if (op == CC_OP_CMPB || op == CC_OP_CMPW || op == CC_OP_CMPL) { | ||
28 | - c->g1 = c->g2 = 1; | ||
29 | c->v1 = QREG_CC_N; | ||
30 | c->v2 = QREG_CC_V; | ||
31 | switch (cond) { | ||
32 | @@ -XXX,XX +XXX,XX @@ static void gen_cc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
33 | goto done; | ||
34 | case 10: /* PL */ | ||
35 | case 11: /* MI */ | ||
36 | - c->g1 = c->g2 = 0; | ||
37 | c->v2 = tcg_const_i32(0); | ||
38 | c->v1 = tmp = tcg_temp_new(); | ||
39 | tcg_gen_sub_i32(tmp, QREG_CC_N, QREG_CC_V); | ||
40 | @@ -XXX,XX +XXX,XX @@ static void gen_cc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
41 | } | ||
42 | } | ||
43 | |||
44 | - c->g1 = 1; | ||
45 | - c->g2 = 0; | ||
46 | c->v2 = tcg_const_i32(0); | ||
47 | |||
48 | switch (cond) { | ||
49 | @@ -XXX,XX +XXX,XX @@ static void gen_cc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
50 | case 2: /* HI (!C && !Z) -> !(C || Z)*/ | ||
51 | case 3: /* LS (C || Z) */ | ||
52 | c->v1 = tmp = tcg_temp_new(); | ||
53 | - c->g1 = 0; | ||
54 | tcg_gen_setcond_i32(TCG_COND_EQ, tmp, QREG_CC_Z, c->v2); | ||
55 | tcg_gen_or_i32(tmp, tmp, QREG_CC_C); | ||
56 | tcond = TCG_COND_NE; | ||
57 | @@ -XXX,XX +XXX,XX @@ static void gen_cc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
58 | case 12: /* GE (!(N ^ V)) */ | ||
59 | case 13: /* LT (N ^ V) */ | ||
60 | c->v1 = tmp = tcg_temp_new(); | ||
61 | - c->g1 = 0; | ||
62 | tcg_gen_xor_i32(tmp, QREG_CC_N, QREG_CC_V); | ||
63 | tcond = TCG_COND_LT; | ||
64 | break; | ||
65 | case 14: /* GT (!(Z || (N ^ V))) */ | ||
66 | case 15: /* LE (Z || (N ^ V)) */ | ||
67 | c->v1 = tmp = tcg_temp_new(); | ||
68 | - c->g1 = 0; | ||
69 | tcg_gen_setcond_i32(TCG_COND_EQ, tmp, QREG_CC_Z, c->v2); | ||
70 | tcg_gen_neg_i32(tmp, tmp); | ||
71 | tmp2 = tcg_temp_new(); | ||
72 | @@ -XXX,XX +XXX,XX @@ static void gen_cc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
73 | c->tcond = tcond; | ||
74 | } | ||
75 | |||
76 | -static void free_cond(DisasCompare *c) | ||
77 | -{ | ||
78 | - if (!c->g1) { | ||
79 | - tcg_temp_free(c->v1); | ||
80 | - } | ||
81 | - if (!c->g2) { | ||
82 | - tcg_temp_free(c->v2); | ||
83 | - } | ||
84 | -} | ||
85 | - | ||
86 | static void gen_jmpcc(DisasContext *s, int cond, TCGLabel *l1) | ||
87 | { | ||
88 | DisasCompare c; | ||
89 | @@ -XXX,XX +XXX,XX @@ static void gen_jmpcc(DisasContext *s, int cond, TCGLabel *l1) | ||
90 | gen_cc_cond(&c, s, cond); | ||
91 | update_cc_op(s); | ||
92 | tcg_gen_brcond_i32(c.tcond, c.v1, c.v2, l1); | ||
93 | - free_cond(&c); | ||
94 | } | ||
95 | |||
96 | /* Force a TB lookup after an instruction that changes the CPU state. */ | ||
97 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(scc) | ||
98 | |||
99 | tmp = tcg_temp_new(); | ||
100 | tcg_gen_setcond_i32(c.tcond, tmp, c.v1, c.v2); | ||
101 | - free_cond(&c); | ||
102 | |||
103 | tcg_gen_neg_i32(tmp, tmp); | ||
104 | DEST_EA(env, insn, OS_BYTE, tmp, NULL); | ||
105 | @@ -XXX,XX +XXX,XX @@ static void do_trapcc(DisasContext *s, DisasCompare *c) | ||
106 | s->base.is_jmp = DISAS_NEXT; | ||
107 | } | ||
108 | } | ||
109 | - free_cond(c); | ||
110 | } | ||
111 | |||
112 | DISAS_INSN(trapcc) | ||
113 | @@ -XXX,XX +XXX,XX @@ static void gen_fcc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
114 | { | ||
115 | TCGv fpsr; | ||
116 | |||
117 | - c->g1 = 1; | ||
118 | c->v2 = tcg_const_i32(0); | ||
119 | - c->g2 = 0; | ||
120 | /* TODO: Raise BSUN exception. */ | ||
121 | fpsr = tcg_temp_new(); | ||
122 | gen_load_fcr(s, fpsr, M68K_FPSR); | ||
123 | @@ -XXX,XX +XXX,XX @@ static void gen_fcc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
124 | case 1: /* EQual Z */ | ||
125 | case 17: /* Signaling EQual Z */ | ||
126 | c->v1 = tcg_temp_new(); | ||
127 | - c->g1 = 0; | ||
128 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_Z); | ||
129 | c->tcond = TCG_COND_NE; | ||
130 | break; | ||
131 | case 2: /* Ordered Greater Than !(A || Z || N) */ | ||
132 | case 18: /* Greater Than !(A || Z || N) */ | ||
133 | c->v1 = tcg_temp_new(); | ||
134 | - c->g1 = 0; | ||
135 | tcg_gen_andi_i32(c->v1, fpsr, | ||
136 | FPSR_CC_A | FPSR_CC_Z | FPSR_CC_N); | ||
137 | c->tcond = TCG_COND_EQ; | ||
138 | @@ -XXX,XX +XXX,XX @@ static void gen_fcc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
139 | case 3: /* Ordered Greater than or Equal Z || !(A || N) */ | ||
140 | case 19: /* Greater than or Equal Z || !(A || N) */ | ||
141 | c->v1 = tcg_temp_new(); | ||
142 | - c->g1 = 0; | ||
143 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_A); | ||
144 | tcg_gen_shli_i32(c->v1, c->v1, ctz32(FPSR_CC_N) - ctz32(FPSR_CC_A)); | ||
145 | tcg_gen_andi_i32(fpsr, fpsr, FPSR_CC_Z | FPSR_CC_N); | ||
146 | @@ -XXX,XX +XXX,XX @@ static void gen_fcc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
147 | case 4: /* Ordered Less Than !(!N || A || Z); */ | ||
148 | case 20: /* Less Than !(!N || A || Z); */ | ||
149 | c->v1 = tcg_temp_new(); | ||
150 | - c->g1 = 0; | ||
151 | tcg_gen_xori_i32(c->v1, fpsr, FPSR_CC_N); | ||
152 | tcg_gen_andi_i32(c->v1, c->v1, FPSR_CC_N | FPSR_CC_A | FPSR_CC_Z); | ||
153 | c->tcond = TCG_COND_EQ; | ||
154 | @@ -XXX,XX +XXX,XX @@ static void gen_fcc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
155 | case 5: /* Ordered Less than or Equal Z || (N && !A) */ | ||
156 | case 21: /* Less than or Equal Z || (N && !A) */ | ||
157 | c->v1 = tcg_temp_new(); | ||
158 | - c->g1 = 0; | ||
159 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_A); | ||
160 | tcg_gen_shli_i32(c->v1, c->v1, ctz32(FPSR_CC_N) - ctz32(FPSR_CC_A)); | ||
161 | tcg_gen_andc_i32(c->v1, fpsr, c->v1); | ||
162 | @@ -XXX,XX +XXX,XX @@ static void gen_fcc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
163 | case 6: /* Ordered Greater or Less than !(A || Z) */ | ||
164 | case 22: /* Greater or Less than !(A || Z) */ | ||
165 | c->v1 = tcg_temp_new(); | ||
166 | - c->g1 = 0; | ||
167 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_A | FPSR_CC_Z); | ||
168 | c->tcond = TCG_COND_EQ; | ||
169 | break; | ||
170 | case 7: /* Ordered !A */ | ||
171 | case 23: /* Greater, Less or Equal !A */ | ||
172 | c->v1 = tcg_temp_new(); | ||
173 | - c->g1 = 0; | ||
174 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_A); | ||
175 | c->tcond = TCG_COND_EQ; | ||
176 | break; | ||
177 | case 8: /* Unordered A */ | ||
178 | case 24: /* Not Greater, Less or Equal A */ | ||
179 | c->v1 = tcg_temp_new(); | ||
180 | - c->g1 = 0; | ||
181 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_A); | ||
182 | c->tcond = TCG_COND_NE; | ||
183 | break; | ||
184 | case 9: /* Unordered or Equal A || Z */ | ||
185 | case 25: /* Not Greater or Less then A || Z */ | ||
186 | c->v1 = tcg_temp_new(); | ||
187 | - c->g1 = 0; | ||
188 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_A | FPSR_CC_Z); | ||
189 | c->tcond = TCG_COND_NE; | ||
190 | break; | ||
191 | case 10: /* Unordered or Greater Than A || !(N || Z)) */ | ||
192 | case 26: /* Not Less or Equal A || !(N || Z)) */ | ||
193 | c->v1 = tcg_temp_new(); | ||
194 | - c->g1 = 0; | ||
195 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_Z); | ||
196 | tcg_gen_shli_i32(c->v1, c->v1, ctz32(FPSR_CC_N) - ctz32(FPSR_CC_Z)); | ||
197 | tcg_gen_andi_i32(fpsr, fpsr, FPSR_CC_A | FPSR_CC_N); | ||
198 | @@ -XXX,XX +XXX,XX @@ static void gen_fcc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
199 | case 11: /* Unordered or Greater or Equal A || Z || !N */ | ||
200 | case 27: /* Not Less Than A || Z || !N */ | ||
201 | c->v1 = tcg_temp_new(); | ||
202 | - c->g1 = 0; | ||
203 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_A | FPSR_CC_Z | FPSR_CC_N); | ||
204 | tcg_gen_xori_i32(c->v1, c->v1, FPSR_CC_N); | ||
205 | c->tcond = TCG_COND_NE; | ||
206 | @@ -XXX,XX +XXX,XX @@ static void gen_fcc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
207 | case 12: /* Unordered or Less Than A || (N && !Z) */ | ||
208 | case 28: /* Not Greater than or Equal A || (N && !Z) */ | ||
209 | c->v1 = tcg_temp_new(); | ||
210 | - c->g1 = 0; | ||
211 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_Z); | ||
212 | tcg_gen_shli_i32(c->v1, c->v1, ctz32(FPSR_CC_N) - ctz32(FPSR_CC_Z)); | ||
213 | tcg_gen_andc_i32(c->v1, fpsr, c->v1); | ||
214 | @@ -XXX,XX +XXX,XX @@ static void gen_fcc_cond(DisasCompare *c, DisasContext *s, int cond) | ||
215 | case 13: /* Unordered or Less or Equal A || Z || N */ | ||
216 | case 29: /* Not Greater Than A || Z || N */ | ||
217 | c->v1 = tcg_temp_new(); | ||
218 | - c->g1 = 0; | ||
219 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_A | FPSR_CC_Z | FPSR_CC_N); | ||
220 | c->tcond = TCG_COND_NE; | ||
221 | break; | ||
222 | case 14: /* Not Equal !Z */ | ||
223 | case 30: /* Signaling Not Equal !Z */ | ||
224 | c->v1 = tcg_temp_new(); | ||
225 | - c->g1 = 0; | ||
226 | tcg_gen_andi_i32(c->v1, fpsr, FPSR_CC_Z); | ||
227 | c->tcond = TCG_COND_EQ; | ||
228 | break; | ||
229 | @@ -XXX,XX +XXX,XX @@ static void gen_fjmpcc(DisasContext *s, int cond, TCGLabel *l1) | ||
230 | gen_fcc_cond(&c, s, cond); | ||
231 | update_cc_op(s); | ||
232 | tcg_gen_brcond_i32(c.tcond, c.v1, c.v2, l1); | ||
233 | - free_cond(&c); | ||
234 | } | ||
235 | |||
236 | DISAS_INSN(fbcc) | ||
237 | @@ -XXX,XX +XXX,XX @@ DISAS_INSN(fscc) | ||
238 | |||
239 | tmp = tcg_temp_new(); | ||
240 | tcg_gen_setcond_i32(c.tcond, tmp, c.v1, c.v2); | ||
241 | - free_cond(&c); | ||
242 | |||
243 | tcg_gen_neg_i32(tmp, tmp); | ||
244 | DEST_EA(env, insn, OS_BYTE, tmp, NULL); | ||
245 | -- | ||
246 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/microblaze/translate.c | 54 ----------------------------------- | ||
7 | 1 file changed, 54 deletions(-) | ||
8 | |||
9 | diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/microblaze/translate.c | ||
12 | +++ b/target/microblaze/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static void gen_raise_exception(DisasContext *dc, uint32_t index) | ||
14 | TCGv_i32 tmp = tcg_const_i32(index); | ||
15 | |||
16 | gen_helper_raise_exception(cpu_env, tmp); | ||
17 | - tcg_temp_free_i32(tmp); | ||
18 | dc->base.is_jmp = DISAS_NORETURN; | ||
19 | } | ||
20 | |||
21 | @@ -XXX,XX +XXX,XX @@ static void gen_raise_hw_excp(DisasContext *dc, uint32_t esr_ec) | ||
22 | { | ||
23 | TCGv_i32 tmp = tcg_const_i32(esr_ec); | ||
24 | tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUMBState, esr)); | ||
25 | - tcg_temp_free_i32(tmp); | ||
26 | |||
27 | gen_raise_exception_sync(dc, EXCP_HW_EXCP); | ||
28 | } | ||
29 | @@ -XXX,XX +XXX,XX @@ static bool do_typeb_val(DisasContext *dc, arg_typeb *arg, bool side_effects, | ||
30 | imm = tcg_const_i32(arg->imm); | ||
31 | |||
32 | fn(rd, ra, imm); | ||
33 | - | ||
34 | - tcg_temp_free_i32(imm); | ||
35 | return true; | ||
36 | } | ||
37 | |||
38 | @@ -XXX,XX +XXX,XX @@ static void gen_add(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
39 | TCGv_i32 zero = tcg_const_i32(0); | ||
40 | |||
41 | tcg_gen_add2_i32(out, cpu_msr_c, ina, zero, inb, zero); | ||
42 | - | ||
43 | - tcg_temp_free_i32(zero); | ||
44 | } | ||
45 | |||
46 | /* Input and output carry. */ | ||
47 | @@ -XXX,XX +XXX,XX @@ static void gen_addc(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
48 | |||
49 | tcg_gen_add2_i32(tmp, cpu_msr_c, ina, zero, cpu_msr_c, zero); | ||
50 | tcg_gen_add2_i32(out, cpu_msr_c, tmp, cpu_msr_c, inb, zero); | ||
51 | - | ||
52 | - tcg_temp_free_i32(tmp); | ||
53 | - tcg_temp_free_i32(zero); | ||
54 | } | ||
55 | |||
56 | /* Input carry, but no output carry. */ | ||
57 | @@ -XXX,XX +XXX,XX @@ static void gen_bsra(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
58 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
59 | tcg_gen_andi_i32(tmp, inb, 31); | ||
60 | tcg_gen_sar_i32(out, ina, tmp); | ||
61 | - tcg_temp_free_i32(tmp); | ||
62 | } | ||
63 | |||
64 | static void gen_bsrl(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
65 | @@ -XXX,XX +XXX,XX @@ static void gen_bsrl(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
66 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
67 | tcg_gen_andi_i32(tmp, inb, 31); | ||
68 | tcg_gen_shr_i32(out, ina, tmp); | ||
69 | - tcg_temp_free_i32(tmp); | ||
70 | } | ||
71 | |||
72 | static void gen_bsll(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
73 | @@ -XXX,XX +XXX,XX @@ static void gen_bsll(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
74 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
75 | tcg_gen_andi_i32(tmp, inb, 31); | ||
76 | tcg_gen_shl_i32(out, ina, tmp); | ||
77 | - tcg_temp_free_i32(tmp); | ||
78 | } | ||
79 | |||
80 | static void gen_bsefi(TCGv_i32 out, TCGv_i32 ina, int32_t imm) | ||
81 | @@ -XXX,XX +XXX,XX @@ static void gen_cmp(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
82 | tcg_gen_setcond_i32(TCG_COND_LT, lt, inb, ina); | ||
83 | tcg_gen_sub_i32(out, inb, ina); | ||
84 | tcg_gen_deposit_i32(out, out, lt, 31, 1); | ||
85 | - tcg_temp_free_i32(lt); | ||
86 | } | ||
87 | |||
88 | static void gen_cmpu(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
89 | @@ -XXX,XX +XXX,XX @@ static void gen_cmpu(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
90 | tcg_gen_setcond_i32(TCG_COND_LTU, lt, inb, ina); | ||
91 | tcg_gen_sub_i32(out, inb, ina); | ||
92 | tcg_gen_deposit_i32(out, out, lt, 31, 1); | ||
93 | - tcg_temp_free_i32(lt); | ||
94 | } | ||
95 | |||
96 | DO_TYPEA(cmp, false, gen_cmp) | ||
97 | @@ -XXX,XX +XXX,XX @@ static void gen_mulh(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
98 | { | ||
99 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
100 | tcg_gen_muls2_i32(tmp, out, ina, inb); | ||
101 | - tcg_temp_free_i32(tmp); | ||
102 | } | ||
103 | |||
104 | static void gen_mulhu(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
105 | { | ||
106 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
107 | tcg_gen_mulu2_i32(tmp, out, ina, inb); | ||
108 | - tcg_temp_free_i32(tmp); | ||
109 | } | ||
110 | |||
111 | static void gen_mulhsu(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
112 | { | ||
113 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
114 | tcg_gen_mulsu2_i32(tmp, out, ina, inb); | ||
115 | - tcg_temp_free_i32(tmp); | ||
116 | } | ||
117 | |||
118 | DO_TYPEA_CFG(mul, use_hw_mul, false, tcg_gen_mul_i32) | ||
119 | @@ -XXX,XX +XXX,XX @@ static void gen_rsubc(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
120 | tcg_gen_not_i32(tmp, ina); | ||
121 | tcg_gen_add2_i32(tmp, cpu_msr_c, tmp, zero, cpu_msr_c, zero); | ||
122 | tcg_gen_add2_i32(out, cpu_msr_c, tmp, cpu_msr_c, inb, zero); | ||
123 | - | ||
124 | - tcg_temp_free_i32(zero); | ||
125 | - tcg_temp_free_i32(tmp); | ||
126 | } | ||
127 | |||
128 | /* No input or output carry. */ | ||
129 | @@ -XXX,XX +XXX,XX @@ static void gen_rsubkc(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
130 | tcg_gen_not_i32(nota, ina); | ||
131 | tcg_gen_add_i32(out, inb, nota); | ||
132 | tcg_gen_add_i32(out, out, cpu_msr_c); | ||
133 | - | ||
134 | - tcg_temp_free_i32(nota); | ||
135 | } | ||
136 | |||
137 | DO_TYPEA(rsub, true, gen_rsub) | ||
138 | @@ -XXX,XX +XXX,XX @@ static void gen_src(TCGv_i32 out, TCGv_i32 ina) | ||
139 | tcg_gen_mov_i32(tmp, cpu_msr_c); | ||
140 | tcg_gen_andi_i32(cpu_msr_c, ina, 1); | ||
141 | tcg_gen_extract2_i32(out, ina, tmp, 1); | ||
142 | - | ||
143 | - tcg_temp_free_i32(tmp); | ||
144 | } | ||
145 | |||
146 | static void gen_srl(TCGv_i32 out, TCGv_i32 ina) | ||
147 | @@ -XXX,XX +XXX,XX @@ static TCGv compute_ldst_addr_typea(DisasContext *dc, int ra, int rb) | ||
148 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
149 | tcg_gen_add_i32(tmp, cpu_R[ra], cpu_R[rb]); | ||
150 | tcg_gen_extu_i32_tl(ret, tmp); | ||
151 | - tcg_temp_free_i32(tmp); | ||
152 | } else if (ra) { | ||
153 | tcg_gen_extu_i32_tl(ret, cpu_R[ra]); | ||
154 | } else if (rb) { | ||
155 | @@ -XXX,XX +XXX,XX @@ static TCGv compute_ldst_addr_typeb(DisasContext *dc, int ra, int imm) | ||
156 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
157 | tcg_gen_addi_i32(tmp, cpu_R[ra], imm); | ||
158 | tcg_gen_extu_i32_tl(ret, tmp); | ||
159 | - tcg_temp_free_i32(tmp); | ||
160 | } else { | ||
161 | tcg_gen_movi_tl(ret, (uint32_t)imm); | ||
162 | } | ||
163 | @@ -XXX,XX +XXX,XX @@ static bool do_load(DisasContext *dc, int rd, TCGv addr, MemOp mop, | ||
164 | #endif | ||
165 | |||
166 | tcg_gen_qemu_ld_i32(reg_for_write(dc, rd), addr, mem_index, mop); | ||
167 | - | ||
168 | - tcg_temp_free(addr); | ||
169 | return true; | ||
170 | } | ||
171 | |||
172 | @@ -XXX,XX +XXX,XX @@ static bool trans_lwx(DisasContext *dc, arg_typea *arg) | ||
173 | |||
174 | tcg_gen_qemu_ld_i32(cpu_res_val, addr, dc->mem_index, MO_TEUL); | ||
175 | tcg_gen_mov_tl(cpu_res_addr, addr); | ||
176 | - tcg_temp_free(addr); | ||
177 | |||
178 | if (arg->rd) { | ||
179 | tcg_gen_mov_i32(cpu_R[arg->rd], cpu_res_val); | ||
180 | @@ -XXX,XX +XXX,XX @@ static bool do_store(DisasContext *dc, int rd, TCGv addr, MemOp mop, | ||
181 | #endif | ||
182 | |||
183 | tcg_gen_qemu_st_i32(reg_for_read(dc, rd), addr, mem_index, mop); | ||
184 | - | ||
185 | - tcg_temp_free(addr); | ||
186 | return true; | ||
187 | } | ||
188 | |||
189 | @@ -XXX,XX +XXX,XX @@ static bool trans_swx(DisasContext *dc, arg_typea *arg) | ||
190 | * In either case, addr is no longer needed. | ||
191 | */ | ||
192 | tcg_gen_brcond_tl(TCG_COND_NE, cpu_res_addr, addr, swx_fail); | ||
193 | - tcg_temp_free(addr); | ||
194 | |||
195 | /* | ||
196 | * Compare the value loaded during lwx with current contents of | ||
197 | @@ -XXX,XX +XXX,XX @@ static bool trans_swx(DisasContext *dc, arg_typea *arg) | ||
198 | dc->mem_index, MO_TEUL); | ||
199 | |||
200 | tcg_gen_brcond_i32(TCG_COND_NE, cpu_res_val, tval, swx_fail); | ||
201 | - tcg_temp_free_i32(tval); | ||
202 | |||
203 | /* Success */ | ||
204 | tcg_gen_movi_i32(cpu_msr_c, 0); | ||
205 | @@ -XXX,XX +XXX,XX @@ static bool do_bcc(DisasContext *dc, int dest_rb, int dest_imm, | ||
206 | tcg_gen_movcond_i32(dc->jmp_cond, cpu_btarget, | ||
207 | reg_for_read(dc, ra), zero, | ||
208 | cpu_btarget, next); | ||
209 | - tcg_temp_free_i32(zero); | ||
210 | - tcg_temp_free_i32(next); | ||
211 | |||
212 | return true; | ||
213 | } | ||
214 | @@ -XXX,XX +XXX,XX @@ static bool trans_mbar(DisasContext *dc, arg_mbar *arg) | ||
215 | tcg_gen_st_i32(tmp_1, cpu_env, | ||
216 | -offsetof(MicroBlazeCPU, env) | ||
217 | +offsetof(CPUState, halted)); | ||
218 | - tcg_temp_free_i32(tmp_1); | ||
219 | |||
220 | tcg_gen_movi_i32(cpu_pc, dc->base.pc_next + 4); | ||
221 | |||
222 | @@ -XXX,XX +XXX,XX @@ static void msr_read(DisasContext *dc, TCGv_i32 d) | ||
223 | t = tcg_temp_new_i32(); | ||
224 | tcg_gen_muli_i32(t, cpu_msr_c, MSR_C | MSR_CC); | ||
225 | tcg_gen_or_i32(d, cpu_msr, t); | ||
226 | - tcg_temp_free_i32(t); | ||
227 | } | ||
228 | |||
229 | static bool do_msrclrset(DisasContext *dc, arg_type_msr *arg, bool set) | ||
230 | @@ -XXX,XX +XXX,XX @@ static bool trans_mts(DisasContext *dc, arg_mts *arg) | ||
231 | TCGv_i32 tmp_reg = tcg_const_i32(arg->rs & 7); | ||
232 | |||
233 | gen_helper_mmu_write(cpu_env, tmp_ext, tmp_reg, src); | ||
234 | - tcg_temp_free_i32(tmp_reg); | ||
235 | - tcg_temp_free_i32(tmp_ext); | ||
236 | } | ||
237 | break; | ||
238 | |||
239 | @@ -XXX,XX +XXX,XX @@ static bool trans_mfs(DisasContext *dc, arg_mfs *arg) | ||
240 | TCGv_i64 t64 = tcg_temp_new_i64(); | ||
241 | tcg_gen_ld_i64(t64, cpu_env, offsetof(CPUMBState, ear)); | ||
242 | tcg_gen_extrh_i64_i32(dest, t64); | ||
243 | - tcg_temp_free_i64(t64); | ||
244 | } | ||
245 | return true; | ||
246 | #ifndef CONFIG_USER_ONLY | ||
247 | @@ -XXX,XX +XXX,XX @@ static bool trans_mfs(DisasContext *dc, arg_mfs *arg) | ||
248 | TCGv_i64 t64 = tcg_temp_new_i64(); | ||
249 | tcg_gen_ld_i64(t64, cpu_env, offsetof(CPUMBState, ear)); | ||
250 | tcg_gen_extrl_i64_i32(dest, t64); | ||
251 | - tcg_temp_free_i64(t64); | ||
252 | } | ||
253 | break; | ||
254 | case SR_ESR: | ||
255 | @@ -XXX,XX +XXX,XX @@ static bool trans_mfs(DisasContext *dc, arg_mfs *arg) | ||
256 | TCGv_i32 tmp_reg = tcg_const_i32(arg->rs & 7); | ||
257 | |||
258 | gen_helper_mmu_read(dest, cpu_env, tmp_ext, tmp_reg); | ||
259 | - tcg_temp_free_i32(tmp_reg); | ||
260 | - tcg_temp_free_i32(tmp_ext); | ||
261 | } | ||
262 | break; | ||
263 | #endif | ||
264 | @@ -XXX,XX +XXX,XX @@ static void do_rti(DisasContext *dc) | ||
265 | tcg_gen_andi_i32(tmp, tmp, MSR_VM | MSR_UM); | ||
266 | tcg_gen_andi_i32(cpu_msr, cpu_msr, ~(MSR_VM | MSR_UM)); | ||
267 | tcg_gen_or_i32(cpu_msr, cpu_msr, tmp); | ||
268 | - | ||
269 | - tcg_temp_free_i32(tmp); | ||
270 | } | ||
271 | |||
272 | static void do_rtb(DisasContext *dc) | ||
273 | @@ -XXX,XX +XXX,XX @@ static void do_rtb(DisasContext *dc) | ||
274 | tcg_gen_andi_i32(cpu_msr, cpu_msr, ~(MSR_VM | MSR_UM | MSR_BIP)); | ||
275 | tcg_gen_andi_i32(tmp, tmp, (MSR_VM | MSR_UM)); | ||
276 | tcg_gen_or_i32(cpu_msr, cpu_msr, tmp); | ||
277 | - | ||
278 | - tcg_temp_free_i32(tmp); | ||
279 | } | ||
280 | |||
281 | static void do_rte(DisasContext *dc) | ||
282 | @@ -XXX,XX +XXX,XX @@ static void do_rte(DisasContext *dc) | ||
283 | tcg_gen_andi_i32(tmp, tmp, (MSR_VM | MSR_UM)); | ||
284 | tcg_gen_andi_i32(cpu_msr, cpu_msr, ~(MSR_VM | MSR_UM | MSR_EIP)); | ||
285 | tcg_gen_or_i32(cpu_msr, cpu_msr, tmp); | ||
286 | - | ||
287 | - tcg_temp_free_i32(tmp); | ||
288 | } | ||
289 | |||
290 | /* Insns connected to FSL or AXI stream attached devices. */ | ||
291 | @@ -XXX,XX +XXX,XX @@ static bool do_get(DisasContext *dc, int rd, int rb, int imm, int ctrl) | ||
292 | |||
293 | t_ctrl = tcg_const_i32(ctrl); | ||
294 | gen_helper_get(reg_for_write(dc, rd), t_id, t_ctrl); | ||
295 | - tcg_temp_free_i32(t_id); | ||
296 | - tcg_temp_free_i32(t_ctrl); | ||
297 | return true; | ||
298 | } | ||
299 | |||
300 | @@ -XXX,XX +XXX,XX @@ static bool do_put(DisasContext *dc, int ra, int rb, int imm, int ctrl) | ||
301 | |||
302 | t_ctrl = tcg_const_i32(ctrl); | ||
303 | gen_helper_put(t_id, t_ctrl, reg_for_read(dc, ra)); | ||
304 | - tcg_temp_free_i32(t_id); | ||
305 | - tcg_temp_free_i32(t_ctrl); | ||
306 | return true; | ||
307 | } | ||
308 | |||
309 | @@ -XXX,XX +XXX,XX @@ static void mb_tr_translate_insn(DisasContextBase *dcb, CPUState *cs) | ||
310 | } | ||
311 | |||
312 | if (dc->r0) { | ||
313 | - tcg_temp_free_i32(dc->r0); | ||
314 | dc->r0 = NULL; | ||
315 | dc->r0_set = false; | ||
316 | } | ||
317 | -- | ||
318 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/nios2/translate.c | 15 --------------- | ||
7 | 1 file changed, 15 deletions(-) | ||
8 | |||
9 | diff --git a/target/nios2/translate.c b/target/nios2/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/nios2/translate.c | ||
12 | +++ b/target/nios2/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static void gen_jumpr(DisasContext *dc, int regno, bool is_call) | ||
14 | |||
15 | tcg_gen_andi_tl(test, dest, 3); | ||
16 | tcg_gen_brcondi_tl(TCG_COND_NE, test, 0, l); | ||
17 | - tcg_temp_free(test); | ||
18 | |||
19 | tcg_gen_mov_tl(cpu_pc, dest); | ||
20 | if (is_call) { | ||
21 | @@ -XXX,XX +XXX,XX @@ static void gen_ldx(DisasContext *dc, uint32_t code, uint32_t flags) | ||
22 | |||
23 | tcg_gen_addi_tl(addr, load_gpr(dc, instr.a), instr.imm16.s); | ||
24 | tcg_gen_qemu_ld_tl(data, addr, dc->mem_idx, flags); | ||
25 | - tcg_temp_free(addr); | ||
26 | } | ||
27 | |||
28 | /* Store instructions */ | ||
29 | @@ -XXX,XX +XXX,XX @@ static void gen_stx(DisasContext *dc, uint32_t code, uint32_t flags) | ||
30 | TCGv addr = tcg_temp_new(); | ||
31 | tcg_gen_addi_tl(addr, load_gpr(dc, instr.a), instr.imm16.s); | ||
32 | tcg_gen_qemu_st_tl(val, addr, dc->mem_idx, flags); | ||
33 | - tcg_temp_free(addr); | ||
34 | } | ||
35 | |||
36 | /* Branch instructions */ | ||
37 | @@ -XXX,XX +XXX,XX @@ static void eret(DisasContext *dc, uint32_t code, uint32_t flags) | ||
38 | TCGv tmp = tcg_temp_new(); | ||
39 | tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPUNios2State, ctrl[CR_ESTATUS])); | ||
40 | gen_helper_eret(cpu_env, tmp, load_gpr(dc, R_EA)); | ||
41 | - tcg_temp_free(tmp); | ||
42 | } else { | ||
43 | gen_helper_eret(cpu_env, load_gpr(dc, R_SSTATUS), load_gpr(dc, R_EA)); | ||
44 | } | ||
45 | @@ -XXX,XX +XXX,XX @@ static void bret(DisasContext *dc, uint32_t code, uint32_t flags) | ||
46 | TCGv tmp = tcg_temp_new(); | ||
47 | tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPUNios2State, ctrl[CR_BSTATUS])); | ||
48 | gen_helper_eret(cpu_env, tmp, load_gpr(dc, R_BA)); | ||
49 | - tcg_temp_free(tmp); | ||
50 | |||
51 | dc->base.is_jmp = DISAS_NORETURN; | ||
52 | #endif | ||
53 | @@ -XXX,XX +XXX,XX @@ static void rdctl(DisasContext *dc, uint32_t code, uint32_t flags) | ||
54 | tcg_gen_ld_tl(t1, cpu_env, offsetof(CPUNios2State, ctrl[CR_IPENDING])); | ||
55 | tcg_gen_ld_tl(t2, cpu_env, offsetof(CPUNios2State, ctrl[CR_IENABLE])); | ||
56 | tcg_gen_and_tl(dest, t1, t2); | ||
57 | - tcg_temp_free(t1); | ||
58 | - tcg_temp_free(t2); | ||
59 | break; | ||
60 | default: | ||
61 | tcg_gen_ld_tl(dest, cpu_env, | ||
62 | @@ -XXX,XX +XXX,XX @@ static void wrctl(DisasContext *dc, uint32_t code, uint32_t flags) | ||
63 | tcg_gen_ld_tl(o, cpu_env, ofs); | ||
64 | tcg_gen_andi_tl(o, o, ro); | ||
65 | tcg_gen_or_tl(n, n, o); | ||
66 | - tcg_temp_free(o); | ||
67 | } | ||
68 | |||
69 | tcg_gen_st_tl(n, cpu_env, ofs); | ||
70 | - tcg_temp_free(n); | ||
71 | } | ||
72 | break; | ||
73 | } | ||
74 | @@ -XXX,XX +XXX,XX @@ static void do_rr_mul_high(DisasContext *dc, uint32_t insn, GenFn4 *fn) | ||
75 | |||
76 | fn(discard, dest_gpr(dc, instr.c), | ||
77 | load_gpr(dc, instr.a), load_gpr(dc, instr.b)); | ||
78 | - tcg_temp_free(discard); | ||
79 | } | ||
80 | |||
81 | #define gen_rr_mul_high(fname, insn) \ | ||
82 | @@ -XXX,XX +XXX,XX @@ static void do_rr_shift(DisasContext *dc, uint32_t insn, GenFn3 *fn) | ||
83 | |||
84 | tcg_gen_andi_tl(sh, load_gpr(dc, instr.b), 31); | ||
85 | fn(dest_gpr(dc, instr.c), load_gpr(dc, instr.a), sh); | ||
86 | - tcg_temp_free(sh); | ||
87 | } | ||
88 | |||
89 | #define gen_rr_shift(fname, insn) \ | ||
90 | @@ -XXX,XX +XXX,XX @@ static void nios2_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs) | ||
91 | |||
92 | instr = &i_type_instructions[op]; | ||
93 | instr->handler(dc, code, instr->flags); | ||
94 | - | ||
95 | - if (dc->sink) { | ||
96 | - tcg_temp_free(dc->sink); | ||
97 | - } | ||
98 | } | ||
99 | |||
100 | static void nios2_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs) | ||
101 | -- | ||
102 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/openrisc/translate.c | 39 ------------------------------------- | ||
7 | 1 file changed, 39 deletions(-) | ||
8 | |||
9 | diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/openrisc/translate.c | ||
12 | +++ b/target/openrisc/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static void gen_add(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) | ||
14 | tcg_gen_xor_tl(cpu_sr_ov, srca, srcb); | ||
15 | tcg_gen_xor_tl(t0, res, srcb); | ||
16 | tcg_gen_andc_tl(cpu_sr_ov, t0, cpu_sr_ov); | ||
17 | - tcg_temp_free(t0); | ||
18 | |||
19 | tcg_gen_mov_tl(dest, res); | ||
20 | - tcg_temp_free(res); | ||
21 | |||
22 | gen_ove_cyov(dc); | ||
23 | } | ||
24 | @@ -XXX,XX +XXX,XX @@ static void gen_addc(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) | ||
25 | tcg_gen_xor_tl(cpu_sr_ov, srca, srcb); | ||
26 | tcg_gen_xor_tl(t0, res, srcb); | ||
27 | tcg_gen_andc_tl(cpu_sr_ov, t0, cpu_sr_ov); | ||
28 | - tcg_temp_free(t0); | ||
29 | |||
30 | tcg_gen_mov_tl(dest, res); | ||
31 | - tcg_temp_free(res); | ||
32 | |||
33 | gen_ove_cyov(dc); | ||
34 | } | ||
35 | @@ -XXX,XX +XXX,XX @@ static void gen_sub(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) | ||
36 | tcg_gen_setcond_tl(TCG_COND_LTU, cpu_sr_cy, srca, srcb); | ||
37 | |||
38 | tcg_gen_mov_tl(dest, res); | ||
39 | - tcg_temp_free(res); | ||
40 | |||
41 | gen_ove_cyov(dc); | ||
42 | } | ||
43 | @@ -XXX,XX +XXX,XX @@ static void gen_mul(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) | ||
44 | tcg_gen_muls2_tl(dest, cpu_sr_ov, srca, srcb); | ||
45 | tcg_gen_sari_tl(t0, dest, TARGET_LONG_BITS - 1); | ||
46 | tcg_gen_setcond_tl(TCG_COND_NE, cpu_sr_ov, cpu_sr_ov, t0); | ||
47 | - tcg_temp_free(t0); | ||
48 | |||
49 | tcg_gen_neg_tl(cpu_sr_ov, cpu_sr_ov); | ||
50 | gen_ove_ov(dc); | ||
51 | @@ -XXX,XX +XXX,XX @@ static void gen_div(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) | ||
52 | Supress the host-side exception by dividing by 1. */ | ||
53 | tcg_gen_or_tl(t0, srcb, cpu_sr_ov); | ||
54 | tcg_gen_div_tl(dest, srca, t0); | ||
55 | - tcg_temp_free(t0); | ||
56 | |||
57 | tcg_gen_neg_tl(cpu_sr_ov, cpu_sr_ov); | ||
58 | gen_ove_ov(dc); | ||
59 | @@ -XXX,XX +XXX,XX @@ static void gen_divu(DisasContext *dc, TCGv dest, TCGv srca, TCGv srcb) | ||
60 | Supress the host-side exception by dividing by 1. */ | ||
61 | tcg_gen_or_tl(t0, srcb, cpu_sr_cy); | ||
62 | tcg_gen_divu_tl(dest, srca, t0); | ||
63 | - tcg_temp_free(t0); | ||
64 | |||
65 | gen_ove_cy(dc); | ||
66 | } | ||
67 | @@ -XXX,XX +XXX,XX @@ static void gen_muld(DisasContext *dc, TCGv srca, TCGv srcb) | ||
68 | tcg_gen_muls2_i64(cpu_mac, high, t1, t2); | ||
69 | tcg_gen_sari_i64(t1, cpu_mac, 63); | ||
70 | tcg_gen_setcond_i64(TCG_COND_NE, t1, t1, high); | ||
71 | - tcg_temp_free_i64(high); | ||
72 | tcg_gen_trunc_i64_tl(cpu_sr_ov, t1); | ||
73 | tcg_gen_neg_tl(cpu_sr_ov, cpu_sr_ov); | ||
74 | |||
75 | gen_ove_ov(dc); | ||
76 | } | ||
77 | - tcg_temp_free_i64(t1); | ||
78 | - tcg_temp_free_i64(t2); | ||
79 | } | ||
80 | |||
81 | static void gen_muldu(DisasContext *dc, TCGv srca, TCGv srcb) | ||
82 | @@ -XXX,XX +XXX,XX @@ static void gen_muldu(DisasContext *dc, TCGv srca, TCGv srcb) | ||
83 | tcg_gen_mulu2_i64(cpu_mac, high, t1, t2); | ||
84 | tcg_gen_setcondi_i64(TCG_COND_NE, high, high, 0); | ||
85 | tcg_gen_trunc_i64_tl(cpu_sr_cy, high); | ||
86 | - tcg_temp_free_i64(high); | ||
87 | |||
88 | gen_ove_cy(dc); | ||
89 | } | ||
90 | - tcg_temp_free_i64(t1); | ||
91 | - tcg_temp_free_i64(t2); | ||
92 | } | ||
93 | |||
94 | static void gen_mac(DisasContext *dc, TCGv srca, TCGv srcb) | ||
95 | @@ -XXX,XX +XXX,XX @@ static void gen_mac(DisasContext *dc, TCGv srca, TCGv srcb) | ||
96 | tcg_gen_add_i64(cpu_mac, cpu_mac, t1); | ||
97 | tcg_gen_xor_i64(t1, t1, cpu_mac); | ||
98 | tcg_gen_andc_i64(t1, t1, t2); | ||
99 | - tcg_temp_free_i64(t2); | ||
100 | |||
101 | #if TARGET_LONG_BITS == 32 | ||
102 | tcg_gen_extrh_i64_i32(cpu_sr_ov, t1); | ||
103 | #else | ||
104 | tcg_gen_mov_i64(cpu_sr_ov, t1); | ||
105 | #endif | ||
106 | - tcg_temp_free_i64(t1); | ||
107 | |||
108 | gen_ove_ov(dc); | ||
109 | } | ||
110 | @@ -XXX,XX +XXX,XX @@ static void gen_macu(DisasContext *dc, TCGv srca, TCGv srcb) | ||
111 | tcg_gen_extu_tl_i64(t1, srca); | ||
112 | tcg_gen_extu_tl_i64(t2, srcb); | ||
113 | tcg_gen_mul_i64(t1, t1, t2); | ||
114 | - tcg_temp_free_i64(t2); | ||
115 | |||
116 | /* Note that overflow is only computed during addition stage. */ | ||
117 | tcg_gen_add_i64(cpu_mac, cpu_mac, t1); | ||
118 | tcg_gen_setcond_i64(TCG_COND_LTU, t1, cpu_mac, t1); | ||
119 | tcg_gen_trunc_i64_tl(cpu_sr_cy, t1); | ||
120 | - tcg_temp_free_i64(t1); | ||
121 | |||
122 | gen_ove_cy(dc); | ||
123 | } | ||
124 | @@ -XXX,XX +XXX,XX @@ static void gen_msb(DisasContext *dc, TCGv srca, TCGv srcb) | ||
125 | tcg_gen_sub_i64(cpu_mac, cpu_mac, t1); | ||
126 | tcg_gen_xor_i64(t1, t1, cpu_mac); | ||
127 | tcg_gen_and_i64(t1, t1, t2); | ||
128 | - tcg_temp_free_i64(t2); | ||
129 | |||
130 | #if TARGET_LONG_BITS == 32 | ||
131 | tcg_gen_extrh_i64_i32(cpu_sr_ov, t1); | ||
132 | #else | ||
133 | tcg_gen_mov_i64(cpu_sr_ov, t1); | ||
134 | #endif | ||
135 | - tcg_temp_free_i64(t1); | ||
136 | |||
137 | gen_ove_ov(dc); | ||
138 | } | ||
139 | @@ -XXX,XX +XXX,XX @@ static void gen_msbu(DisasContext *dc, TCGv srca, TCGv srcb) | ||
140 | tcg_gen_setcond_i64(TCG_COND_LTU, t2, cpu_mac, t1); | ||
141 | tcg_gen_sub_i64(cpu_mac, cpu_mac, t1); | ||
142 | tcg_gen_trunc_i64_tl(cpu_sr_cy, t2); | ||
143 | - tcg_temp_free_i64(t2); | ||
144 | - tcg_temp_free_i64(t1); | ||
145 | |||
146 | gen_ove_cy(dc); | ||
147 | } | ||
148 | @@ -XXX,XX +XXX,XX @@ static bool trans_l_lwa(DisasContext *dc, arg_load *a) | ||
149 | tcg_gen_qemu_ld_tl(cpu_R(dc, a->d), ea, dc->mem_idx, MO_TEUL); | ||
150 | tcg_gen_mov_tl(cpu_lock_addr, ea); | ||
151 | tcg_gen_mov_tl(cpu_lock_value, cpu_R(dc, a->d)); | ||
152 | - tcg_temp_free(ea); | ||
153 | return true; | ||
154 | } | ||
155 | |||
156 | @@ -XXX,XX +XXX,XX @@ static void do_load(DisasContext *dc, arg_load *a, MemOp mop) | ||
157 | ea = tcg_temp_new(); | ||
158 | tcg_gen_addi_tl(ea, cpu_R(dc, a->a), a->i); | ||
159 | tcg_gen_qemu_ld_tl(cpu_R(dc, a->d), ea, dc->mem_idx, mop); | ||
160 | - tcg_temp_free(ea); | ||
161 | } | ||
162 | |||
163 | static bool trans_l_lwz(DisasContext *dc, arg_load *a) | ||
164 | @@ -XXX,XX +XXX,XX @@ static bool trans_l_swa(DisasContext *dc, arg_store *a) | ||
165 | lab_fail = gen_new_label(); | ||
166 | lab_done = gen_new_label(); | ||
167 | tcg_gen_brcond_tl(TCG_COND_NE, ea, cpu_lock_addr, lab_fail); | ||
168 | - tcg_temp_free(ea); | ||
169 | |||
170 | val = tcg_temp_new(); | ||
171 | tcg_gen_atomic_cmpxchg_tl(val, cpu_lock_addr, cpu_lock_value, | ||
172 | cpu_R(dc, a->b), dc->mem_idx, MO_TEUL); | ||
173 | tcg_gen_setcond_tl(TCG_COND_EQ, cpu_sr_f, val, cpu_lock_value); | ||
174 | - tcg_temp_free(val); | ||
175 | |||
176 | tcg_gen_br(lab_done); | ||
177 | |||
178 | @@ -XXX,XX +XXX,XX @@ static void do_store(DisasContext *dc, arg_store *a, MemOp mop) | ||
179 | TCGv t0 = tcg_temp_new(); | ||
180 | tcg_gen_addi_tl(t0, cpu_R(dc, a->a), a->i); | ||
181 | tcg_gen_qemu_st_tl(cpu_R(dc, a->b), t0, dc->mem_idx, mop); | ||
182 | - tcg_temp_free(t0); | ||
183 | } | ||
184 | |||
185 | static bool trans_l_sw(DisasContext *dc, arg_store *a) | ||
186 | @@ -XXX,XX +XXX,XX @@ static bool trans_l_mfspr(DisasContext *dc, arg_l_mfspr *a) | ||
187 | |||
188 | tcg_gen_ori_tl(spr, cpu_R(dc, a->a), a->k); | ||
189 | gen_helper_mfspr(cpu_R(dc, a->d), cpu_env, cpu_R(dc, a->d), spr); | ||
190 | - tcg_temp_free(spr); | ||
191 | } | ||
192 | return true; | ||
193 | } | ||
194 | @@ -XXX,XX +XXX,XX @@ static bool trans_l_mtspr(DisasContext *dc, arg_l_mtspr *a) | ||
195 | spr = tcg_temp_new(); | ||
196 | tcg_gen_ori_tl(spr, cpu_R(dc, a->a), a->k); | ||
197 | gen_helper_mtspr(cpu_env, spr, cpu_R(dc, a->b)); | ||
198 | - tcg_temp_free(spr); | ||
199 | } | ||
200 | return true; | ||
201 | } | ||
202 | @@ -XXX,XX +XXX,XX @@ static bool do_dp3(DisasContext *dc, arg_dab_pair *a, | ||
203 | load_pair(dc, t1, a->b, a->bp); | ||
204 | fn(t0, cpu_env, t0, t1); | ||
205 | save_pair(dc, t0, a->d, a->dp); | ||
206 | - tcg_temp_free_i64(t0); | ||
207 | - tcg_temp_free_i64(t1); | ||
208 | |||
209 | gen_helper_update_fpcsr(cpu_env); | ||
210 | return true; | ||
211 | @@ -XXX,XX +XXX,XX @@ static bool do_dp2(DisasContext *dc, arg_da_pair *a, | ||
212 | load_pair(dc, t0, a->a, a->ap); | ||
213 | fn(t0, cpu_env, t0); | ||
214 | save_pair(dc, t0, a->d, a->dp); | ||
215 | - tcg_temp_free_i64(t0); | ||
216 | |||
217 | gen_helper_update_fpcsr(cpu_env); | ||
218 | return true; | ||
219 | @@ -XXX,XX +XXX,XX @@ static bool do_dpcmp(DisasContext *dc, arg_ab_pair *a, | ||
220 | } else { | ||
221 | fn(cpu_sr_f, cpu_env, t0, t1); | ||
222 | } | ||
223 | - tcg_temp_free_i64(t0); | ||
224 | - tcg_temp_free_i64(t1); | ||
225 | |||
226 | if (inv) { | ||
227 | tcg_gen_xori_tl(cpu_sr_f, cpu_sr_f, 1); | ||
228 | @@ -XXX,XX +XXX,XX @@ static bool trans_lf_stod_d(DisasContext *dc, arg_lf_stod_d *a) | ||
229 | t0 = tcg_temp_new_i64(); | ||
230 | gen_helper_stod(t0, cpu_env, cpu_R(dc, a->a)); | ||
231 | save_pair(dc, t0, a->d, a->dp); | ||
232 | - tcg_temp_free_i64(t0); | ||
233 | |||
234 | gen_helper_update_fpcsr(cpu_env); | ||
235 | return true; | ||
236 | @@ -XXX,XX +XXX,XX @@ static bool trans_lf_dtos_d(DisasContext *dc, arg_lf_dtos_d *a) | ||
237 | t0 = tcg_temp_new_i64(); | ||
238 | load_pair(dc, t0, a->a, a->ap); | ||
239 | gen_helper_dtos(cpu_R(dc, a->d), cpu_env, t0); | ||
240 | - tcg_temp_free_i64(t0); | ||
241 | |||
242 | gen_helper_update_fpcsr(cpu_env); | ||
243 | return true; | ||
244 | @@ -XXX,XX +XXX,XX @@ static bool trans_lf_madd_d(DisasContext *dc, arg_dab_pair *a) | ||
245 | load_pair(dc, t2, a->b, a->bp); | ||
246 | gen_helper_float_madd_d(t0, cpu_env, t0, t1, t2); | ||
247 | save_pair(dc, t0, a->d, a->dp); | ||
248 | - tcg_temp_free_i64(t0); | ||
249 | - tcg_temp_free_i64(t1); | ||
250 | - tcg_temp_free_i64(t2); | ||
251 | |||
252 | gen_helper_update_fpcsr(cpu_env); | ||
253 | return true; | ||
254 | -- | ||
255 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/ppc/translate.c | 283 ------------------ | ||
7 | target/ppc/power8-pmu-regs.c.inc | 16 - | ||
8 | target/ppc/translate/dfp-impl.c.inc | 20 -- | ||
9 | target/ppc/translate/fixedpoint-impl.c.inc | 16 - | ||
10 | target/ppc/translate/fp-impl.c.inc | 122 +------- | ||
11 | target/ppc/translate/spe-impl.c.inc | 59 ---- | ||
12 | target/ppc/translate/storage-ctrl-impl.c.inc | 2 - | ||
13 | target/ppc/translate/vmx-impl.c.inc | 296 +------------------ | ||
14 | target/ppc/translate/vsx-impl.c.inc | 287 +----------------- | ||
15 | 9 files changed, 7 insertions(+), 1094 deletions(-) | ||
16 | |||
17 | diff --git a/target/ppc/translate.c b/target/ppc/translate.c | ||
18 | index XXXXXXX..XXXXXXX 100644 | ||
19 | --- a/target/ppc/translate.c | ||
20 | +++ b/target/ppc/translate.c | ||
21 | @@ -XXX,XX +XXX,XX @@ static void gen_exception_err(DisasContext *ctx, uint32_t excp, uint32_t error) | ||
22 | t0 = tcg_const_i32(excp); | ||
23 | t1 = tcg_const_i32(error); | ||
24 | gen_helper_raise_exception_err(cpu_env, t0, t1); | ||
25 | - tcg_temp_free_i32(t0); | ||
26 | - tcg_temp_free_i32(t1); | ||
27 | ctx->base.is_jmp = DISAS_NORETURN; | ||
28 | } | ||
29 | |||
30 | @@ -XXX,XX +XXX,XX @@ static void gen_exception(DisasContext *ctx, uint32_t excp) | ||
31 | gen_update_nip(ctx, ctx->cia); | ||
32 | t0 = tcg_const_i32(excp); | ||
33 | gen_helper_raise_exception(cpu_env, t0); | ||
34 | - tcg_temp_free_i32(t0); | ||
35 | ctx->base.is_jmp = DISAS_NORETURN; | ||
36 | } | ||
37 | |||
38 | @@ -XXX,XX +XXX,XX @@ static void gen_exception_nip(DisasContext *ctx, uint32_t excp, | ||
39 | gen_update_nip(ctx, nip); | ||
40 | t0 = tcg_const_i32(excp); | ||
41 | gen_helper_raise_exception(cpu_env, t0); | ||
42 | - tcg_temp_free_i32(t0); | ||
43 | ctx->base.is_jmp = DISAS_NORETURN; | ||
44 | } | ||
45 | |||
46 | @@ -XXX,XX +XXX,XX @@ static uint32_t gen_prep_dbgex(DisasContext *ctx) | ||
47 | gen_load_spr(t0, SPR_BOOKE_DBSR); | ||
48 | tcg_gen_ori_tl(t0, t0, dbsr); | ||
49 | gen_store_spr(SPR_BOOKE_DBSR, t0); | ||
50 | - tcg_temp_free(t0); | ||
51 | return POWERPC_EXCP_DEBUG; | ||
52 | } else { | ||
53 | return POWERPC_EXCP_TRACE; | ||
54 | @@ -XXX,XX +XXX,XX @@ static void spr_load_dump_spr(int sprn) | ||
55 | #ifdef PPC_DUMP_SPR_ACCESSES | ||
56 | TCGv_i32 t0 = tcg_const_i32(sprn); | ||
57 | gen_helper_load_dump_spr(cpu_env, t0); | ||
58 | - tcg_temp_free_i32(t0); | ||
59 | #endif | ||
60 | } | ||
61 | |||
62 | @@ -XXX,XX +XXX,XX @@ static void spr_store_dump_spr(int sprn) | ||
63 | #ifdef PPC_DUMP_SPR_ACCESSES | ||
64 | TCGv_i32 t0 = tcg_const_i32(sprn); | ||
65 | gen_helper_store_dump_spr(cpu_env, t0); | ||
66 | - tcg_temp_free_i32(t0); | ||
67 | #endif | ||
68 | } | ||
69 | |||
70 | @@ -XXX,XX +XXX,XX @@ void spr_write_generic32(DisasContext *ctx, int sprn, int gprn) | ||
71 | TCGv t0 = tcg_temp_new(); | ||
72 | tcg_gen_ext32u_tl(t0, cpu_gpr[gprn]); | ||
73 | gen_store_spr(sprn, t0); | ||
74 | - tcg_temp_free(t0); | ||
75 | spr_store_dump_spr(sprn); | ||
76 | #else | ||
77 | spr_write_generic(ctx, sprn, gprn); | ||
78 | @@ -XXX,XX +XXX,XX @@ void spr_write_clear(DisasContext *ctx, int sprn, int gprn) | ||
79 | tcg_gen_neg_tl(t1, cpu_gpr[gprn]); | ||
80 | tcg_gen_and_tl(t0, t0, t1); | ||
81 | gen_store_spr(sprn, t0); | ||
82 | - tcg_temp_free(t0); | ||
83 | - tcg_temp_free(t1); | ||
84 | } | ||
85 | |||
86 | void spr_access_nop(DisasContext *ctx, int sprn, int gprn) | ||
87 | @@ -XXX,XX +XXX,XX @@ void spr_read_xer(DisasContext *ctx, int gprn, int sprn) | ||
88 | tcg_gen_shli_tl(t0, cpu_ca32, XER_CA32); | ||
89 | tcg_gen_or_tl(dst, dst, t0); | ||
90 | } | ||
91 | - tcg_temp_free(t0); | ||
92 | - tcg_temp_free(t1); | ||
93 | - tcg_temp_free(t2); | ||
94 | } | ||
95 | |||
96 | void spr_write_xer(DisasContext *ctx, int sprn, int gprn) | ||
97 | @@ -XXX,XX +XXX,XX @@ void spr_write_ibatu(DisasContext *ctx, int sprn, int gprn) | ||
98 | { | ||
99 | TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0U) / 2); | ||
100 | gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]); | ||
101 | - tcg_temp_free_i32(t0); | ||
102 | } | ||
103 | |||
104 | void spr_write_ibatu_h(DisasContext *ctx, int sprn, int gprn) | ||
105 | { | ||
106 | TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4U) / 2) + 4); | ||
107 | gen_helper_store_ibatu(cpu_env, t0, cpu_gpr[gprn]); | ||
108 | - tcg_temp_free_i32(t0); | ||
109 | } | ||
110 | |||
111 | void spr_write_ibatl(DisasContext *ctx, int sprn, int gprn) | ||
112 | { | ||
113 | TCGv_i32 t0 = tcg_const_i32((sprn - SPR_IBAT0L) / 2); | ||
114 | gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]); | ||
115 | - tcg_temp_free_i32(t0); | ||
116 | } | ||
117 | |||
118 | void spr_write_ibatl_h(DisasContext *ctx, int sprn, int gprn) | ||
119 | { | ||
120 | TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_IBAT4L) / 2) + 4); | ||
121 | gen_helper_store_ibatl(cpu_env, t0, cpu_gpr[gprn]); | ||
122 | - tcg_temp_free_i32(t0); | ||
123 | } | ||
124 | |||
125 | /* DBAT0U...DBAT7U */ | ||
126 | @@ -XXX,XX +XXX,XX @@ void spr_write_dbatu(DisasContext *ctx, int sprn, int gprn) | ||
127 | { | ||
128 | TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0U) / 2); | ||
129 | gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]); | ||
130 | - tcg_temp_free_i32(t0); | ||
131 | } | ||
132 | |||
133 | void spr_write_dbatu_h(DisasContext *ctx, int sprn, int gprn) | ||
134 | { | ||
135 | TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4U) / 2) + 4); | ||
136 | gen_helper_store_dbatu(cpu_env, t0, cpu_gpr[gprn]); | ||
137 | - tcg_temp_free_i32(t0); | ||
138 | } | ||
139 | |||
140 | void spr_write_dbatl(DisasContext *ctx, int sprn, int gprn) | ||
141 | { | ||
142 | TCGv_i32 t0 = tcg_const_i32((sprn - SPR_DBAT0L) / 2); | ||
143 | gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]); | ||
144 | - tcg_temp_free_i32(t0); | ||
145 | } | ||
146 | |||
147 | void spr_write_dbatl_h(DisasContext *ctx, int sprn, int gprn) | ||
148 | { | ||
149 | TCGv_i32 t0 = tcg_const_i32(((sprn - SPR_DBAT4L) / 2) + 4); | ||
150 | gen_helper_store_dbatl(cpu_env, t0, cpu_gpr[gprn]); | ||
151 | - tcg_temp_free_i32(t0); | ||
152 | } | ||
153 | |||
154 | /* SDR1 */ | ||
155 | @@ -XXX,XX +XXX,XX @@ void spr_write_hior(DisasContext *ctx, int sprn, int gprn) | ||
156 | TCGv t0 = tcg_temp_new(); | ||
157 | tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0x3FFFFF00000ULL); | ||
158 | tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix)); | ||
159 | - tcg_temp_free(t0); | ||
160 | } | ||
161 | void spr_write_ptcr(DisasContext *ctx, int sprn, int gprn) | ||
162 | { | ||
163 | @@ -XXX,XX +XXX,XX @@ void spr_write_40x_pid(DisasContext *ctx, int sprn, int gprn) | ||
164 | TCGv t0 = tcg_temp_new(); | ||
165 | tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0xFF); | ||
166 | gen_helper_store_40x_pid(cpu_env, t0); | ||
167 | - tcg_temp_free(t0); | ||
168 | } | ||
169 | |||
170 | void spr_write_booke_tcr(DisasContext *ctx, int sprn, int gprn) | ||
171 | @@ -XXX,XX +XXX,XX @@ void spr_write_pir(DisasContext *ctx, int sprn, int gprn) | ||
172 | TCGv t0 = tcg_temp_new(); | ||
173 | tcg_gen_andi_tl(t0, cpu_gpr[gprn], 0xF); | ||
174 | gen_store_spr(SPR_PIR, t0); | ||
175 | - tcg_temp_free(t0); | ||
176 | } | ||
177 | #endif | ||
178 | |||
179 | @@ -XXX,XX +XXX,XX @@ void spr_read_spefscr(DisasContext *ctx, int gprn, int sprn) | ||
180 | TCGv_i32 t0 = tcg_temp_new_i32(); | ||
181 | tcg_gen_ld_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr)); | ||
182 | tcg_gen_extu_i32_tl(cpu_gpr[gprn], t0); | ||
183 | - tcg_temp_free_i32(t0); | ||
184 | } | ||
185 | |||
186 | void spr_write_spefscr(DisasContext *ctx, int sprn, int gprn) | ||
187 | @@ -XXX,XX +XXX,XX @@ void spr_write_spefscr(DisasContext *ctx, int sprn, int gprn) | ||
188 | TCGv_i32 t0 = tcg_temp_new_i32(); | ||
189 | tcg_gen_trunc_tl_i32(t0, cpu_gpr[gprn]); | ||
190 | tcg_gen_st_i32(t0, cpu_env, offsetof(CPUPPCState, spe_fscr)); | ||
191 | - tcg_temp_free_i32(t0); | ||
192 | } | ||
193 | |||
194 | #if !defined(CONFIG_USER_ONLY) | ||
195 | @@ -XXX,XX +XXX,XX @@ void spr_write_excp_prefix(DisasContext *ctx, int sprn, int gprn) | ||
196 | tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]); | ||
197 | tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_prefix)); | ||
198 | gen_store_spr(sprn, t0); | ||
199 | - tcg_temp_free(t0); | ||
200 | } | ||
201 | |||
202 | void spr_write_excp_vector(DisasContext *ctx, int sprn, int gprn) | ||
203 | @@ -XXX,XX +XXX,XX @@ void spr_write_excp_vector(DisasContext *ctx, int sprn, int gprn) | ||
204 | tcg_gen_and_tl(t0, t0, cpu_gpr[gprn]); | ||
205 | tcg_gen_st_tl(t0, cpu_env, offsetof(CPUPPCState, excp_vectors[sprn_offs])); | ||
206 | gen_store_spr(sprn, t0); | ||
207 | - tcg_temp_free(t0); | ||
208 | } | ||
209 | #endif | ||
210 | |||
211 | @@ -XXX,XX +XXX,XX @@ void spr_write_amr(DisasContext *ctx, int sprn, int gprn) | ||
212 | tcg_gen_or_tl(t0, t0, t2); | ||
213 | gen_store_spr(SPR_AMR, t0); | ||
214 | spr_store_dump_spr(SPR_AMR); | ||
215 | - | ||
216 | - tcg_temp_free(t0); | ||
217 | - tcg_temp_free(t1); | ||
218 | - tcg_temp_free(t2); | ||
219 | } | ||
220 | |||
221 | void spr_write_uamor(DisasContext *ctx, int sprn, int gprn) | ||
222 | @@ -XXX,XX +XXX,XX @@ void spr_write_uamor(DisasContext *ctx, int sprn, int gprn) | ||
223 | tcg_gen_or_tl(t0, t0, t2); | ||
224 | gen_store_spr(SPR_UAMOR, t0); | ||
225 | spr_store_dump_spr(SPR_UAMOR); | ||
226 | - | ||
227 | - tcg_temp_free(t0); | ||
228 | - tcg_temp_free(t1); | ||
229 | - tcg_temp_free(t2); | ||
230 | } | ||
231 | |||
232 | void spr_write_iamr(DisasContext *ctx, int sprn, int gprn) | ||
233 | @@ -XXX,XX +XXX,XX @@ void spr_write_iamr(DisasContext *ctx, int sprn, int gprn) | ||
234 | tcg_gen_or_tl(t0, t0, t2); | ||
235 | gen_store_spr(SPR_IAMR, t0); | ||
236 | spr_store_dump_spr(SPR_IAMR); | ||
237 | - | ||
238 | - tcg_temp_free(t0); | ||
239 | - tcg_temp_free(t1); | ||
240 | - tcg_temp_free(t2); | ||
241 | } | ||
242 | #endif | ||
243 | #endif | ||
244 | @@ -XXX,XX +XXX,XX @@ void spr_write_e500_l1csr0(DisasContext *ctx, int sprn, int gprn) | ||
245 | |||
246 | tcg_gen_andi_tl(t0, cpu_gpr[gprn], L1CSR0_DCE | L1CSR0_CPE); | ||
247 | gen_store_spr(sprn, t0); | ||
248 | - tcg_temp_free(t0); | ||
249 | } | ||
250 | |||
251 | void spr_write_e500_l1csr1(DisasContext *ctx, int sprn, int gprn) | ||
252 | @@ -XXX,XX +XXX,XX @@ void spr_write_e500_l1csr1(DisasContext *ctx, int sprn, int gprn) | ||
253 | |||
254 | tcg_gen_andi_tl(t0, cpu_gpr[gprn], L1CSR1_ICE | L1CSR1_CPE); | ||
255 | gen_store_spr(sprn, t0); | ||
256 | - tcg_temp_free(t0); | ||
257 | } | ||
258 | |||
259 | void spr_write_e500_l2csr0(DisasContext *ctx, int sprn, int gprn) | ||
260 | @@ -XXX,XX +XXX,XX @@ void spr_write_e500_l2csr0(DisasContext *ctx, int sprn, int gprn) | ||
261 | tcg_gen_andi_tl(t0, cpu_gpr[gprn], | ||
262 | ~(E500_L2CSR0_L2FI | E500_L2CSR0_L2FL | E500_L2CSR0_L2LFC)); | ||
263 | gen_store_spr(sprn, t0); | ||
264 | - tcg_temp_free(t0); | ||
265 | } | ||
266 | |||
267 | void spr_write_booke206_mmucsr0(DisasContext *ctx, int sprn, int gprn) | ||
268 | @@ -XXX,XX +XXX,XX @@ void spr_write_booke_pid(DisasContext *ctx, int sprn, int gprn) | ||
269 | { | ||
270 | TCGv_i32 t0 = tcg_const_i32(sprn); | ||
271 | gen_helper_booke_setpid(cpu_env, t0, cpu_gpr[gprn]); | ||
272 | - tcg_temp_free_i32(t0); | ||
273 | } | ||
274 | void spr_write_eplc(DisasContext *ctx, int sprn, int gprn) | ||
275 | { | ||
276 | @@ -XXX,XX +XXX,XX @@ void spr_write_mas73(DisasContext *ctx, int sprn, int gprn) | ||
277 | gen_store_spr(SPR_BOOKE_MAS3, val); | ||
278 | tcg_gen_shri_tl(val, cpu_gpr[gprn], 32); | ||
279 | gen_store_spr(SPR_BOOKE_MAS7, val); | ||
280 | - tcg_temp_free(val); | ||
281 | } | ||
282 | |||
283 | void spr_read_mas73(DisasContext *ctx, int gprn, int sprn) | ||
284 | @@ -XXX,XX +XXX,XX @@ void spr_read_mas73(DisasContext *ctx, int gprn, int sprn) | ||
285 | tcg_gen_shli_tl(mas7, mas7, 32); | ||
286 | gen_load_spr(mas3, SPR_BOOKE_MAS3); | ||
287 | tcg_gen_or_tl(cpu_gpr[gprn], mas3, mas7); | ||
288 | - tcg_temp_free(mas3); | ||
289 | - tcg_temp_free(mas7); | ||
290 | } | ||
291 | |||
292 | #endif | ||
293 | @@ -XXX,XX +XXX,XX @@ static void gen_fscr_facility_check(DisasContext *ctx, int facility_sprn, | ||
294 | TCGv_i32 t3 = tcg_const_i32(cause); | ||
295 | |||
296 | gen_helper_fscr_facility_check(cpu_env, t1, t2, t3); | ||
297 | - | ||
298 | - tcg_temp_free_i32(t3); | ||
299 | - tcg_temp_free_i32(t2); | ||
300 | - tcg_temp_free_i32(t1); | ||
301 | } | ||
302 | |||
303 | static void gen_msr_facility_check(DisasContext *ctx, int facility_sprn, | ||
304 | @@ -XXX,XX +XXX,XX @@ static void gen_msr_facility_check(DisasContext *ctx, int facility_sprn, | ||
305 | TCGv_i32 t3 = tcg_const_i32(cause); | ||
306 | |||
307 | gen_helper_msr_facility_check(cpu_env, t1, t2, t3); | ||
308 | - | ||
309 | - tcg_temp_free_i32(t3); | ||
310 | - tcg_temp_free_i32(t2); | ||
311 | - tcg_temp_free_i32(t1); | ||
312 | } | ||
313 | |||
314 | void spr_read_prev_upper32(DisasContext *ctx, int gprn, int sprn) | ||
315 | @@ -XXX,XX +XXX,XX @@ void spr_read_prev_upper32(DisasContext *ctx, int gprn, int sprn) | ||
316 | gen_load_spr(spr, sprn - 1); | ||
317 | tcg_gen_shri_tl(spr_up, spr, 32); | ||
318 | tcg_gen_ext32u_tl(cpu_gpr[gprn], spr_up); | ||
319 | - | ||
320 | - tcg_temp_free(spr); | ||
321 | - tcg_temp_free(spr_up); | ||
322 | } | ||
323 | |||
324 | void spr_write_prev_upper32(DisasContext *ctx, int sprn, int gprn) | ||
325 | @@ -XXX,XX +XXX,XX @@ void spr_write_prev_upper32(DisasContext *ctx, int sprn, int gprn) | ||
326 | gen_load_spr(spr, sprn - 1); | ||
327 | tcg_gen_deposit_tl(spr, spr, cpu_gpr[gprn], 32, 32); | ||
328 | gen_store_spr(sprn - 1, spr); | ||
329 | - | ||
330 | - tcg_temp_free(spr); | ||
331 | } | ||
332 | |||
333 | #if !defined(CONFIG_USER_ONLY) | ||
334 | @@ -XXX,XX +XXX,XX @@ void spr_write_hmer(DisasContext *ctx, int sprn, int gprn) | ||
335 | tcg_gen_and_tl(hmer, cpu_gpr[gprn], hmer); | ||
336 | gen_store_spr(sprn, hmer); | ||
337 | spr_store_dump_spr(sprn); | ||
338 | - tcg_temp_free(hmer); | ||
339 | } | ||
340 | |||
341 | void spr_write_lpcr(DisasContext *ctx, int sprn, int gprn) | ||
342 | @@ -XXX,XX +XXX,XX @@ void spr_read_dexcr_ureg(DisasContext *ctx, int gprn, int sprn) | ||
343 | |||
344 | gen_load_spr(t0, sprn + 16); | ||
345 | tcg_gen_ext32u_tl(cpu_gpr[gprn], t0); | ||
346 | - | ||
347 | - tcg_temp_free(t0); | ||
348 | } | ||
349 | #endif | ||
350 | |||
351 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_cmp(TCGv arg0, TCGv arg1, int s, int crf) | ||
352 | tcg_gen_trunc_tl_i32(t, t0); | ||
353 | tcg_gen_trunc_tl_i32(cpu_crf[crf], cpu_so); | ||
354 | tcg_gen_or_i32(cpu_crf[crf], cpu_crf[crf], t); | ||
355 | - | ||
356 | - tcg_temp_free(t0); | ||
357 | - tcg_temp_free(t1); | ||
358 | - tcg_temp_free_i32(t); | ||
359 | } | ||
360 | |||
361 | static inline void gen_op_cmpi(TCGv arg0, target_ulong arg1, int s, int crf) | ||
362 | { | ||
363 | TCGv t0 = tcg_const_tl(arg1); | ||
364 | gen_op_cmp(arg0, t0, s, crf); | ||
365 | - tcg_temp_free(t0); | ||
366 | } | ||
367 | |||
368 | static inline void gen_op_cmp32(TCGv arg0, TCGv arg1, int s, int crf) | ||
369 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_cmp32(TCGv arg0, TCGv arg1, int s, int crf) | ||
370 | tcg_gen_ext32u_tl(t1, arg1); | ||
371 | } | ||
372 | gen_op_cmp(t0, t1, s, crf); | ||
373 | - tcg_temp_free(t1); | ||
374 | - tcg_temp_free(t0); | ||
375 | } | ||
376 | |||
377 | static inline void gen_op_cmpi32(TCGv arg0, target_ulong arg1, int s, int crf) | ||
378 | { | ||
379 | TCGv t0 = tcg_const_tl(arg1); | ||
380 | gen_op_cmp32(arg0, t0, s, crf); | ||
381 | - tcg_temp_free(t0); | ||
382 | } | ||
383 | |||
384 | static inline void gen_set_Rc0(DisasContext *ctx, TCGv reg) | ||
385 | @@ -XXX,XX +XXX,XX @@ static void gen_cmprb(DisasContext *ctx) | ||
386 | tcg_gen_or_i32(crf, crf, src2lo); | ||
387 | } | ||
388 | tcg_gen_shli_i32(crf, crf, CRF_GT_BIT); | ||
389 | - tcg_temp_free_i32(src1); | ||
390 | - tcg_temp_free_i32(src2); | ||
391 | - tcg_temp_free_i32(src2lo); | ||
392 | - tcg_temp_free_i32(src2hi); | ||
393 | } | ||
394 | |||
395 | #if defined(TARGET_PPC64) | ||
396 | @@ -XXX,XX +XXX,XX @@ static void gen_isel(DisasContext *ctx) | ||
397 | tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr[rD(ctx->opcode)], t0, zr, | ||
398 | rA(ctx->opcode) ? cpu_gpr[rA(ctx->opcode)] : zr, | ||
399 | cpu_gpr[rB(ctx->opcode)]); | ||
400 | - tcg_temp_free(zr); | ||
401 | - tcg_temp_free(t0); | ||
402 | } | ||
403 | |||
404 | /* cmpb: PowerPC 2.05 specification */ | ||
405 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_compute_ov(DisasContext *ctx, TCGv arg0, | ||
406 | } else { | ||
407 | tcg_gen_andc_tl(cpu_ov, cpu_ov, t0); | ||
408 | } | ||
409 | - tcg_temp_free(t0); | ||
410 | if (NARROW_MODE(ctx)) { | ||
411 | tcg_gen_extract_tl(cpu_ov, cpu_ov, 31, 1); | ||
412 | if (is_isa300(ctx)) { | ||
413 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_compute_ca32(DisasContext *ctx, | ||
414 | } | ||
415 | tcg_gen_xor_tl(t0, t0, res); | ||
416 | tcg_gen_extract_tl(ca32, t0, 32, 1); | ||
417 | - tcg_temp_free(t0); | ||
418 | } | ||
419 | |||
420 | /* Common add function */ | ||
421 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_add(DisasContext *ctx, TCGv ret, TCGv arg1, | ||
422 | tcg_gen_add_tl(t0, t0, ca); | ||
423 | } | ||
424 | tcg_gen_xor_tl(ca, t0, t1); /* bits changed w/ carry */ | ||
425 | - tcg_temp_free(t1); | ||
426 | tcg_gen_extract_tl(ca, ca, 32, 1); | ||
427 | if (is_isa300(ctx)) { | ||
428 | tcg_gen_mov_tl(ca32, ca); | ||
429 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_add(DisasContext *ctx, TCGv ret, TCGv arg1, | ||
430 | tcg_gen_add2_tl(t0, ca, arg1, zero, arg2, zero); | ||
431 | } | ||
432 | gen_op_arith_compute_ca32(ctx, t0, arg1, arg2, ca32, 0); | ||
433 | - tcg_temp_free(zero); | ||
434 | } | ||
435 | } else { | ||
436 | tcg_gen_add_tl(t0, arg1, arg2); | ||
437 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_add(DisasContext *ctx, TCGv ret, TCGv arg1, | ||
438 | |||
439 | if (t0 != ret) { | ||
440 | tcg_gen_mov_tl(ret, t0); | ||
441 | - tcg_temp_free(t0); | ||
442 | } | ||
443 | } | ||
444 | /* Add functions with two operands */ | ||
445 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
446 | cpu_gpr[rA(ctx->opcode)], t0, \ | ||
447 | ca, glue(ca, 32), \ | ||
448 | add_ca, compute_ca, compute_ov, Rc(ctx->opcode)); \ | ||
449 | - tcg_temp_free(t0); \ | ||
450 | } | ||
451 | |||
452 | /* add add. addo addo. */ | ||
453 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_addic(DisasContext *ctx, bool compute_rc0) | ||
454 | TCGv c = tcg_const_tl(SIMM(ctx->opcode)); | ||
455 | gen_op_arith_add(ctx, cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], | ||
456 | c, cpu_ca, cpu_ca32, 0, 1, 0, compute_rc0); | ||
457 | - tcg_temp_free(c); | ||
458 | } | ||
459 | |||
460 | static void gen_addic(DisasContext *ctx) | ||
461 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_divw(DisasContext *ctx, TCGv ret, TCGv arg1, | ||
462 | } | ||
463 | tcg_gen_or_tl(cpu_so, cpu_so, cpu_ov); | ||
464 | } | ||
465 | - tcg_temp_free_i32(t0); | ||
466 | - tcg_temp_free_i32(t1); | ||
467 | - tcg_temp_free_i32(t2); | ||
468 | - tcg_temp_free_i32(t3); | ||
469 | |||
470 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
471 | gen_set_Rc0(ctx, ret); | ||
472 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
473 | TCGv_i32 t0 = tcg_const_i32(compute_ov); \ | ||
474 | gen_helper_##hlpr(cpu_gpr[rD(ctx->opcode)], cpu_env, \ | ||
475 | cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], t0); \ | ||
476 | - tcg_temp_free_i32(t0); \ | ||
477 | if (unlikely(Rc(ctx->opcode) != 0)) { \ | ||
478 | gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]); \ | ||
479 | } \ | ||
480 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_divd(DisasContext *ctx, TCGv ret, TCGv arg1, | ||
481 | } | ||
482 | tcg_gen_or_tl(cpu_so, cpu_so, cpu_ov); | ||
483 | } | ||
484 | - tcg_temp_free_i64(t0); | ||
485 | - tcg_temp_free_i64(t1); | ||
486 | - tcg_temp_free_i64(t2); | ||
487 | - tcg_temp_free_i64(t3); | ||
488 | |||
489 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
490 | gen_set_Rc0(ctx, ret); | ||
491 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_modw(DisasContext *ctx, TCGv ret, TCGv arg1, | ||
492 | tcg_gen_movcond_i32(TCG_COND_NE, t1, t2, t3, t2, t1); | ||
493 | tcg_gen_rem_i32(t3, t0, t1); | ||
494 | tcg_gen_ext_i32_tl(ret, t3); | ||
495 | - tcg_temp_free_i32(t2); | ||
496 | - tcg_temp_free_i32(t3); | ||
497 | } else { | ||
498 | TCGv_i32 t2 = tcg_const_i32(1); | ||
499 | TCGv_i32 t3 = tcg_const_i32(0); | ||
500 | tcg_gen_movcond_i32(TCG_COND_EQ, t1, t1, t3, t2, t1); | ||
501 | tcg_gen_remu_i32(t3, t0, t1); | ||
502 | tcg_gen_extu_i32_tl(ret, t3); | ||
503 | - tcg_temp_free_i32(t2); | ||
504 | - tcg_temp_free_i32(t3); | ||
505 | } | ||
506 | - tcg_temp_free_i32(t0); | ||
507 | - tcg_temp_free_i32(t1); | ||
508 | } | ||
509 | |||
510 | #define GEN_INT_ARITH_MODW(name, opc3, sign) \ | ||
511 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_modd(DisasContext *ctx, TCGv ret, TCGv arg1, | ||
512 | tcg_gen_movi_i64(t3, 0); | ||
513 | tcg_gen_movcond_i64(TCG_COND_NE, t1, t2, t3, t2, t1); | ||
514 | tcg_gen_rem_i64(ret, t0, t1); | ||
515 | - tcg_temp_free_i64(t2); | ||
516 | - tcg_temp_free_i64(t3); | ||
517 | } else { | ||
518 | TCGv_i64 t2 = tcg_const_i64(1); | ||
519 | TCGv_i64 t3 = tcg_const_i64(0); | ||
520 | tcg_gen_movcond_i64(TCG_COND_EQ, t1, t1, t3, t2, t1); | ||
521 | tcg_gen_remu_i64(ret, t0, t1); | ||
522 | - tcg_temp_free_i64(t2); | ||
523 | - tcg_temp_free_i64(t3); | ||
524 | } | ||
525 | - tcg_temp_free_i64(t0); | ||
526 | - tcg_temp_free_i64(t1); | ||
527 | } | ||
528 | |||
529 | #define GEN_INT_ARITH_MODD(name, opc3, sign) \ | ||
530 | @@ -XXX,XX +XXX,XX @@ static void gen_mulhw(DisasContext *ctx) | ||
531 | tcg_gen_trunc_tl_i32(t1, cpu_gpr[rB(ctx->opcode)]); | ||
532 | tcg_gen_muls2_i32(t0, t1, t0, t1); | ||
533 | tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t1); | ||
534 | - tcg_temp_free_i32(t0); | ||
535 | - tcg_temp_free_i32(t1); | ||
536 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
537 | gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]); | ||
538 | } | ||
539 | @@ -XXX,XX +XXX,XX @@ static void gen_mulhwu(DisasContext *ctx) | ||
540 | tcg_gen_trunc_tl_i32(t1, cpu_gpr[rB(ctx->opcode)]); | ||
541 | tcg_gen_mulu2_i32(t0, t1, t0, t1); | ||
542 | tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t1); | ||
543 | - tcg_temp_free_i32(t0); | ||
544 | - tcg_temp_free_i32(t1); | ||
545 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
546 | gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]); | ||
547 | } | ||
548 | @@ -XXX,XX +XXX,XX @@ static void gen_mullw(DisasContext *ctx) | ||
549 | tcg_gen_ext32s_tl(t0, cpu_gpr[rA(ctx->opcode)]); | ||
550 | tcg_gen_ext32s_tl(t1, cpu_gpr[rB(ctx->opcode)]); | ||
551 | tcg_gen_mul_i64(cpu_gpr[rD(ctx->opcode)], t0, t1); | ||
552 | - tcg_temp_free(t0); | ||
553 | - tcg_temp_free(t1); | ||
554 | #else | ||
555 | tcg_gen_mul_i32(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], | ||
556 | cpu_gpr[rB(ctx->opcode)]); | ||
557 | @@ -XXX,XX +XXX,XX @@ static void gen_mullwo(DisasContext *ctx) | ||
558 | } | ||
559 | tcg_gen_or_tl(cpu_so, cpu_so, cpu_ov); | ||
560 | |||
561 | - tcg_temp_free_i32(t0); | ||
562 | - tcg_temp_free_i32(t1); | ||
563 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
564 | gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]); | ||
565 | } | ||
566 | @@ -XXX,XX +XXX,XX @@ static void gen_mulhd(DisasContext *ctx) | ||
567 | TCGv lo = tcg_temp_new(); | ||
568 | tcg_gen_muls2_tl(lo, cpu_gpr[rD(ctx->opcode)], | ||
569 | cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]); | ||
570 | - tcg_temp_free(lo); | ||
571 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
572 | gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]); | ||
573 | } | ||
574 | @@ -XXX,XX +XXX,XX @@ static void gen_mulhdu(DisasContext *ctx) | ||
575 | TCGv lo = tcg_temp_new(); | ||
576 | tcg_gen_mulu2_tl(lo, cpu_gpr[rD(ctx->opcode)], | ||
577 | cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]); | ||
578 | - tcg_temp_free(lo); | ||
579 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
580 | gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]); | ||
581 | } | ||
582 | @@ -XXX,XX +XXX,XX @@ static void gen_mulldo(DisasContext *ctx) | ||
583 | } | ||
584 | tcg_gen_or_tl(cpu_so, cpu_so, cpu_ov); | ||
585 | |||
586 | - tcg_temp_free_i64(t0); | ||
587 | - tcg_temp_free_i64(t1); | ||
588 | - | ||
589 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
590 | gen_set_Rc0(ctx, cpu_gpr[rD(ctx->opcode)]); | ||
591 | } | ||
592 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_subf(DisasContext *ctx, TCGv ret, TCGv arg1, | ||
593 | } | ||
594 | tcg_gen_xor_tl(t1, arg2, inv1); /* add without carry */ | ||
595 | tcg_gen_add_tl(t0, t0, inv1); | ||
596 | - tcg_temp_free(inv1); | ||
597 | tcg_gen_xor_tl(cpu_ca, t0, t1); /* bits changes w/ carry */ | ||
598 | - tcg_temp_free(t1); | ||
599 | tcg_gen_extract_tl(cpu_ca, cpu_ca, 32, 1); | ||
600 | if (is_isa300(ctx)) { | ||
601 | tcg_gen_mov_tl(cpu_ca32, cpu_ca); | ||
602 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_subf(DisasContext *ctx, TCGv ret, TCGv arg1, | ||
603 | tcg_gen_add2_tl(t0, cpu_ca, arg2, zero, cpu_ca, zero); | ||
604 | tcg_gen_add2_tl(t0, cpu_ca, t0, cpu_ca, inv1, zero); | ||
605 | gen_op_arith_compute_ca32(ctx, t0, inv1, arg2, cpu_ca32, 0); | ||
606 | - tcg_temp_free(zero); | ||
607 | - tcg_temp_free(inv1); | ||
608 | } else { | ||
609 | tcg_gen_setcond_tl(TCG_COND_GEU, cpu_ca, arg2, arg1); | ||
610 | tcg_gen_sub_tl(t0, arg2, arg1); | ||
611 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_subf(DisasContext *ctx, TCGv ret, TCGv arg1, | ||
612 | |||
613 | if (t0 != ret) { | ||
614 | tcg_gen_mov_tl(ret, t0); | ||
615 | - tcg_temp_free(t0); | ||
616 | } | ||
617 | } | ||
618 | /* Sub functions with Two operands functions */ | ||
619 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
620 | gen_op_arith_subf(ctx, cpu_gpr[rD(ctx->opcode)], \ | ||
621 | cpu_gpr[rA(ctx->opcode)], t0, \ | ||
622 | add_ca, compute_ca, compute_ov, Rc(ctx->opcode)); \ | ||
623 | - tcg_temp_free(t0); \ | ||
624 | } | ||
625 | /* subf subf. subfo subfo. */ | ||
626 | GEN_INT_ARITH_SUBF(subf, 0x01, 0, 0, 0) | ||
627 | @@ -XXX,XX +XXX,XX @@ static void gen_subfic(DisasContext *ctx) | ||
628 | TCGv c = tcg_const_tl(SIMM(ctx->opcode)); | ||
629 | gen_op_arith_subf(ctx, cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], | ||
630 | c, 0, 1, 0, 0); | ||
631 | - tcg_temp_free(c); | ||
632 | } | ||
633 | |||
634 | /* neg neg. nego nego. */ | ||
635 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_arith_neg(DisasContext *ctx, bool compute_ov) | ||
636 | TCGv zero = tcg_const_tl(0); | ||
637 | gen_op_arith_subf(ctx, cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], | ||
638 | zero, 0, 0, compute_ov, Rc(ctx->opcode)); | ||
639 | - tcg_temp_free(zero); | ||
640 | } | ||
641 | |||
642 | static void gen_neg(DisasContext *ctx) | ||
643 | @@ -XXX,XX +XXX,XX @@ static void gen_cntlzw(DisasContext *ctx) | ||
644 | tcg_gen_trunc_tl_i32(t, cpu_gpr[rS(ctx->opcode)]); | ||
645 | tcg_gen_clzi_i32(t, t, 32); | ||
646 | tcg_gen_extu_i32_tl(cpu_gpr[rA(ctx->opcode)], t); | ||
647 | - tcg_temp_free_i32(t); | ||
648 | |||
649 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
650 | gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | ||
651 | @@ -XXX,XX +XXX,XX @@ static void gen_cnttzw(DisasContext *ctx) | ||
652 | tcg_gen_trunc_tl_i32(t, cpu_gpr[rS(ctx->opcode)]); | ||
653 | tcg_gen_ctzi_i32(t, t, 32); | ||
654 | tcg_gen_extu_i32_tl(cpu_gpr[rA(ctx->opcode)], t); | ||
655 | - tcg_temp_free_i32(t); | ||
656 | |||
657 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
658 | gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | ||
659 | @@ -XXX,XX +XXX,XX @@ static void gen_pause(DisasContext *ctx) | ||
660 | TCGv_i32 t0 = tcg_const_i32(0); | ||
661 | tcg_gen_st_i32(t0, cpu_env, | ||
662 | -offsetof(PowerPCCPU, env) + offsetof(CPUState, halted)); | ||
663 | - tcg_temp_free_i32(t0); | ||
664 | |||
665 | /* Stop translation, this gives other CPUs a chance to run */ | ||
666 | gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); | ||
667 | @@ -XXX,XX +XXX,XX @@ static void gen_or(DisasContext *ctx) | ||
668 | tcg_gen_andi_tl(t0, t0, ~0x001C000000000000ULL); | ||
669 | tcg_gen_ori_tl(t0, t0, ((uint64_t)prio) << 50); | ||
670 | gen_store_spr(SPR_PPR, t0); | ||
671 | - tcg_temp_free(t0); | ||
672 | } | ||
673 | #if !defined(CONFIG_USER_ONLY) | ||
674 | /* | ||
675 | @@ -XXX,XX +XXX,XX @@ static void gen_prtyw(DisasContext *ctx) | ||
676 | tcg_gen_shri_tl(t0, ra, 8); | ||
677 | tcg_gen_xor_tl(ra, ra, t0); | ||
678 | tcg_gen_andi_tl(ra, ra, (target_ulong)0x100000001ULL); | ||
679 | - tcg_temp_free(t0); | ||
680 | } | ||
681 | |||
682 | #if defined(TARGET_PPC64) | ||
683 | @@ -XXX,XX +XXX,XX @@ static void gen_prtyd(DisasContext *ctx) | ||
684 | tcg_gen_shri_tl(t0, ra, 8); | ||
685 | tcg_gen_xor_tl(ra, ra, t0); | ||
686 | tcg_gen_andi_tl(ra, ra, 1); | ||
687 | - tcg_temp_free(t0); | ||
688 | } | ||
689 | #endif | ||
690 | |||
691 | @@ -XXX,XX +XXX,XX @@ static void gen_rlwimi(DisasContext *ctx) | ||
692 | tcg_gen_trunc_tl_i32(t0, t_rs); | ||
693 | tcg_gen_rotli_i32(t0, t0, sh); | ||
694 | tcg_gen_extu_i32_tl(t1, t0); | ||
695 | - tcg_temp_free_i32(t0); | ||
696 | } else { | ||
697 | #if defined(TARGET_PPC64) | ||
698 | tcg_gen_deposit_i64(t1, t_rs, t_rs, 32, 32); | ||
699 | @@ -XXX,XX +XXX,XX @@ static void gen_rlwimi(DisasContext *ctx) | ||
700 | tcg_gen_andi_tl(t1, t1, mask); | ||
701 | tcg_gen_andi_tl(t_ra, t_ra, ~mask); | ||
702 | tcg_gen_or_tl(t_ra, t_ra, t1); | ||
703 | - tcg_temp_free(t1); | ||
704 | } | ||
705 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
706 | gen_set_Rc0(ctx, t_ra); | ||
707 | @@ -XXX,XX +XXX,XX @@ static void gen_rlwinm(DisasContext *ctx) | ||
708 | tcg_gen_rotli_i32(t0, t0, sh); | ||
709 | tcg_gen_andi_i32(t0, t0, mask); | ||
710 | tcg_gen_extu_i32_tl(t_ra, t0); | ||
711 | - tcg_temp_free_i32(t0); | ||
712 | } | ||
713 | } else { | ||
714 | #if defined(TARGET_PPC64) | ||
715 | @@ -XXX,XX +XXX,XX @@ static void gen_rlwnm(DisasContext *ctx) | ||
716 | tcg_gen_andi_i32(t0, t0, 0x1f); | ||
717 | tcg_gen_rotl_i32(t1, t1, t0); | ||
718 | tcg_gen_extu_i32_tl(t_ra, t1); | ||
719 | - tcg_temp_free_i32(t0); | ||
720 | - tcg_temp_free_i32(t1); | ||
721 | } else { | ||
722 | #if defined(TARGET_PPC64) | ||
723 | TCGv_i64 t0 = tcg_temp_new_i64(); | ||
724 | tcg_gen_andi_i64(t0, t_rb, 0x1f); | ||
725 | tcg_gen_deposit_i64(t_ra, t_rs, t_rs, 32, 32); | ||
726 | tcg_gen_rotl_i64(t_ra, t_ra, t0); | ||
727 | - tcg_temp_free_i64(t0); | ||
728 | #else | ||
729 | g_assert_not_reached(); | ||
730 | #endif | ||
731 | @@ -XXX,XX +XXX,XX @@ static void gen_rldnm(DisasContext *ctx, int mb, int me) | ||
732 | t0 = tcg_temp_new(); | ||
733 | tcg_gen_andi_tl(t0, t_rb, 0x3f); | ||
734 | tcg_gen_rotl_tl(t_ra, t_rs, t0); | ||
735 | - tcg_temp_free(t0); | ||
736 | |||
737 | tcg_gen_andi_tl(t_ra, t_ra, MASK(mb, me)); | ||
738 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
739 | @@ -XXX,XX +XXX,XX @@ static void gen_rldimi(DisasContext *ctx, int mbn, int shn) | ||
740 | tcg_gen_andi_tl(t1, t1, mask); | ||
741 | tcg_gen_andi_tl(t_ra, t_ra, ~mask); | ||
742 | tcg_gen_or_tl(t_ra, t_ra, t1); | ||
743 | - tcg_temp_free(t1); | ||
744 | } | ||
745 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
746 | gen_set_Rc0(ctx, t_ra); | ||
747 | @@ -XXX,XX +XXX,XX @@ static void gen_slw(DisasContext *ctx) | ||
748 | t1 = tcg_temp_new(); | ||
749 | tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x1f); | ||
750 | tcg_gen_shl_tl(cpu_gpr[rA(ctx->opcode)], t0, t1); | ||
751 | - tcg_temp_free(t1); | ||
752 | - tcg_temp_free(t0); | ||
753 | tcg_gen_ext32u_tl(cpu_gpr[rA(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]); | ||
754 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
755 | gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | ||
756 | @@ -XXX,XX +XXX,XX @@ static void gen_srawi(DisasContext *ctx) | ||
757 | t0 = tcg_temp_new(); | ||
758 | tcg_gen_sari_tl(t0, dst, TARGET_LONG_BITS - 1); | ||
759 | tcg_gen_and_tl(cpu_ca, cpu_ca, t0); | ||
760 | - tcg_temp_free(t0); | ||
761 | tcg_gen_setcondi_tl(TCG_COND_NE, cpu_ca, cpu_ca, 0); | ||
762 | if (is_isa300(ctx)) { | ||
763 | tcg_gen_mov_tl(cpu_ca32, cpu_ca); | ||
764 | @@ -XXX,XX +XXX,XX @@ static void gen_srw(DisasContext *ctx) | ||
765 | t1 = tcg_temp_new(); | ||
766 | tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x1f); | ||
767 | tcg_gen_shr_tl(cpu_gpr[rA(ctx->opcode)], t0, t1); | ||
768 | - tcg_temp_free(t1); | ||
769 | - tcg_temp_free(t0); | ||
770 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
771 | gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | ||
772 | } | ||
773 | @@ -XXX,XX +XXX,XX @@ static void gen_sld(DisasContext *ctx) | ||
774 | t1 = tcg_temp_new(); | ||
775 | tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x3f); | ||
776 | tcg_gen_shl_tl(cpu_gpr[rA(ctx->opcode)], t0, t1); | ||
777 | - tcg_temp_free(t1); | ||
778 | - tcg_temp_free(t0); | ||
779 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
780 | gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | ||
781 | } | ||
782 | @@ -XXX,XX +XXX,XX @@ static inline void gen_sradi(DisasContext *ctx, int n) | ||
783 | t0 = tcg_temp_new(); | ||
784 | tcg_gen_sari_tl(t0, src, TARGET_LONG_BITS - 1); | ||
785 | tcg_gen_and_tl(cpu_ca, cpu_ca, t0); | ||
786 | - tcg_temp_free(t0); | ||
787 | tcg_gen_setcondi_tl(TCG_COND_NE, cpu_ca, cpu_ca, 0); | ||
788 | if (is_isa300(ctx)) { | ||
789 | tcg_gen_mov_tl(cpu_ca32, cpu_ca); | ||
790 | @@ -XXX,XX +XXX,XX @@ static void gen_srd(DisasContext *ctx) | ||
791 | t1 = tcg_temp_new(); | ||
792 | tcg_gen_andi_tl(t1, cpu_gpr[rB(ctx->opcode)], 0x3f); | ||
793 | tcg_gen_shr_tl(cpu_gpr[rA(ctx->opcode)], t0, t1); | ||
794 | - tcg_temp_free(t1); | ||
795 | - tcg_temp_free(t0); | ||
796 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
797 | gen_set_Rc0(ctx, cpu_gpr[rA(ctx->opcode)]); | ||
798 | } | ||
799 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name##x)(DisasContext *ctx) \ | ||
800 | EA = tcg_temp_new(); \ | ||
801 | gen_addr_reg_index(ctx, EA); \ | ||
802 | gen_qemu_##ldop(ctx, cpu_gpr[rD(ctx->opcode)], EA); \ | ||
803 | - tcg_temp_free(EA); \ | ||
804 | } | ||
805 | |||
806 | #define GEN_LDX(name, ldop, opc2, opc3, type) \ | ||
807 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name##epx)(DisasContext *ctx) \ | ||
808 | EA = tcg_temp_new(); \ | ||
809 | gen_addr_reg_index(ctx, EA); \ | ||
810 | tcg_gen_qemu_ld_tl(cpu_gpr[rD(ctx->opcode)], EA, PPC_TLB_EPID_LOAD, ldop);\ | ||
811 | - tcg_temp_free(EA); \ | ||
812 | } | ||
813 | |||
814 | GEN_LDEPX(lb, DEF_MEMOP(MO_UB), 0x1F, 0x02) | ||
815 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name##x)(DisasContext *ctx) \ | ||
816 | EA = tcg_temp_new(); \ | ||
817 | gen_addr_reg_index(ctx, EA); \ | ||
818 | gen_qemu_##stop(ctx, cpu_gpr[rS(ctx->opcode)], EA); \ | ||
819 | - tcg_temp_free(EA); \ | ||
820 | } | ||
821 | #define GEN_STX(name, stop, opc2, opc3, type) \ | ||
822 | GEN_STX_E(name, stop, opc2, opc3, type, PPC_NONE, CHK_NONE) | ||
823 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name##epx)(DisasContext *ctx) \ | ||
824 | gen_addr_reg_index(ctx, EA); \ | ||
825 | tcg_gen_qemu_st_tl( \ | ||
826 | cpu_gpr[rD(ctx->opcode)], EA, PPC_TLB_EPID_STORE, stop); \ | ||
827 | - tcg_temp_free(EA); \ | ||
828 | } | ||
829 | |||
830 | GEN_STEPX(stb, DEF_MEMOP(MO_UB), 0x1F, 0x06) | ||
831 | @@ -XXX,XX +XXX,XX @@ static void gen_lmw(DisasContext *ctx) | ||
832 | t1 = tcg_const_i32(rD(ctx->opcode)); | ||
833 | gen_addr_imm_index(ctx, t0, 0); | ||
834 | gen_helper_lmw(cpu_env, t0, t1); | ||
835 | - tcg_temp_free(t0); | ||
836 | - tcg_temp_free_i32(t1); | ||
837 | } | ||
838 | |||
839 | /* stmw */ | ||
840 | @@ -XXX,XX +XXX,XX @@ static void gen_stmw(DisasContext *ctx) | ||
841 | t1 = tcg_const_i32(rS(ctx->opcode)); | ||
842 | gen_addr_imm_index(ctx, t0, 0); | ||
843 | gen_helper_stmw(cpu_env, t0, t1); | ||
844 | - tcg_temp_free(t0); | ||
845 | - tcg_temp_free_i32(t1); | ||
846 | } | ||
847 | |||
848 | /*** Integer load and store strings ***/ | ||
849 | @@ -XXX,XX +XXX,XX @@ static void gen_lswi(DisasContext *ctx) | ||
850 | t1 = tcg_const_i32(nb); | ||
851 | t2 = tcg_const_i32(start); | ||
852 | gen_helper_lsw(cpu_env, t0, t1, t2); | ||
853 | - tcg_temp_free(t0); | ||
854 | - tcg_temp_free_i32(t1); | ||
855 | - tcg_temp_free_i32(t2); | ||
856 | } | ||
857 | |||
858 | /* lswx */ | ||
859 | @@ -XXX,XX +XXX,XX @@ static void gen_lswx(DisasContext *ctx) | ||
860 | t2 = tcg_const_i32(rA(ctx->opcode)); | ||
861 | t3 = tcg_const_i32(rB(ctx->opcode)); | ||
862 | gen_helper_lswx(cpu_env, t0, t1, t2, t3); | ||
863 | - tcg_temp_free(t0); | ||
864 | - tcg_temp_free_i32(t1); | ||
865 | - tcg_temp_free_i32(t2); | ||
866 | - tcg_temp_free_i32(t3); | ||
867 | } | ||
868 | |||
869 | /* stswi */ | ||
870 | @@ -XXX,XX +XXX,XX @@ static void gen_stswi(DisasContext *ctx) | ||
871 | t1 = tcg_const_i32(nb); | ||
872 | t2 = tcg_const_i32(rS(ctx->opcode)); | ||
873 | gen_helper_stsw(cpu_env, t0, t1, t2); | ||
874 | - tcg_temp_free(t0); | ||
875 | - tcg_temp_free_i32(t1); | ||
876 | - tcg_temp_free_i32(t2); | ||
877 | } | ||
878 | |||
879 | /* stswx */ | ||
880 | @@ -XXX,XX +XXX,XX @@ static void gen_stswx(DisasContext *ctx) | ||
881 | tcg_gen_andi_i32(t1, t1, 0x7F); | ||
882 | t2 = tcg_const_i32(rS(ctx->opcode)); | ||
883 | gen_helper_stsw(cpu_env, t0, t1, t2); | ||
884 | - tcg_temp_free(t0); | ||
885 | - tcg_temp_free_i32(t1); | ||
886 | - tcg_temp_free_i32(t2); | ||
887 | } | ||
888 | |||
889 | /*** Memory synchronisation ***/ | ||
890 | @@ -XXX,XX +XXX,XX @@ static inline void gen_check_tlb_flush(DisasContext *ctx, bool global) | ||
891 | gen_helper_check_tlb_flush_local(cpu_env); | ||
892 | } | ||
893 | gen_set_label(l); | ||
894 | - tcg_temp_free_i32(t); | ||
895 | } | ||
896 | #else | ||
897 | static inline void gen_check_tlb_flush(DisasContext *ctx, bool global) { } | ||
898 | @@ -XXX,XX +XXX,XX @@ static void gen_load_locked(DisasContext *ctx, MemOp memop) | ||
899 | tcg_gen_mov_tl(cpu_reserve, t0); | ||
900 | tcg_gen_mov_tl(cpu_reserve_val, gpr); | ||
901 | tcg_gen_mb(TCG_MO_ALL | TCG_BAR_LDAQ); | ||
902 | - tcg_temp_free(t0); | ||
903 | } | ||
904 | |||
905 | #define LARX(name, memop) \ | ||
906 | @@ -XXX,XX +XXX,XX @@ static void gen_fetch_inc_conditional(DisasContext *ctx, MemOp memop, | ||
907 | /* RT = (t != t2 ? t : u = 1<<(s*8-1)) */ | ||
908 | tcg_gen_movi_tl(u, 1 << (MEMOP_GET_SIZE(memop) * 8 - 1)); | ||
909 | tcg_gen_movcond_tl(cond, cpu_gpr[rD(ctx->opcode)], t, t2, t, u); | ||
910 | - | ||
911 | - tcg_temp_free(t); | ||
912 | - tcg_temp_free(t2); | ||
913 | - tcg_temp_free(u); | ||
914 | } | ||
915 | |||
916 | static void gen_ld_atomic(DisasContext *ctx, MemOp memop) | ||
917 | @@ -XXX,XX +XXX,XX @@ static void gen_ld_atomic(DisasContext *ctx, MemOp memop) | ||
918 | cpu_gpr[(rt + 2) & 31], t0); | ||
919 | tcg_gen_qemu_st_tl(t1, EA, ctx->mem_idx, memop); | ||
920 | tcg_gen_mov_tl(dst, t0); | ||
921 | - | ||
922 | - tcg_temp_free(t0); | ||
923 | - tcg_temp_free(t1); | ||
924 | } | ||
925 | break; | ||
926 | |||
927 | @@ -XXX,XX +XXX,XX @@ static void gen_ld_atomic(DisasContext *ctx, MemOp memop) | ||
928 | /* invoke data storage error handler */ | ||
929 | gen_exception_err(ctx, POWERPC_EXCP_DSI, POWERPC_EXCP_INVAL); | ||
930 | } | ||
931 | - tcg_temp_free(EA); | ||
932 | |||
933 | if (need_serial) { | ||
934 | /* Restart with exclusive lock. */ | ||
935 | @@ -XXX,XX +XXX,XX @@ static void gen_st_atomic(DisasContext *ctx, MemOp memop) | ||
936 | tcg_gen_movcond_tl(TCG_COND_EQ, s2, t, t2, src, t2); | ||
937 | tcg_gen_qemu_st_tl(s, EA, ctx->mem_idx, memop); | ||
938 | tcg_gen_qemu_st_tl(s2, ea_plus_s, ctx->mem_idx, memop); | ||
939 | - | ||
940 | - tcg_temp_free(ea_plus_s); | ||
941 | - tcg_temp_free(s2); | ||
942 | - tcg_temp_free(s); | ||
943 | - tcg_temp_free(t2); | ||
944 | - tcg_temp_free(t); | ||
945 | } | ||
946 | break; | ||
947 | default: | ||
948 | /* invoke data storage error handler */ | ||
949 | gen_exception_err(ctx, POWERPC_EXCP_DSI, POWERPC_EXCP_INVAL); | ||
950 | } | ||
951 | - tcg_temp_free(discard); | ||
952 | - tcg_temp_free(EA); | ||
953 | } | ||
954 | |||
955 | static void gen_stwat(DisasContext *ctx) | ||
956 | @@ -XXX,XX +XXX,XX @@ static void gen_conditional_store(DisasContext *ctx, MemOp memop) | ||
957 | gen_set_access_type(ctx, ACCESS_RES); | ||
958 | gen_addr_reg_index(ctx, t0); | ||
959 | tcg_gen_brcond_tl(TCG_COND_NE, t0, cpu_reserve, l1); | ||
960 | - tcg_temp_free(t0); | ||
961 | |||
962 | t0 = tcg_temp_new(); | ||
963 | tcg_gen_atomic_cmpxchg_tl(t0, cpu_reserve, cpu_reserve_val, | ||
964 | @@ -XXX,XX +XXX,XX @@ static void gen_conditional_store(DisasContext *ctx, MemOp memop) | ||
965 | tcg_gen_shli_tl(t0, t0, CRF_EQ_BIT); | ||
966 | tcg_gen_or_tl(t0, t0, cpu_so); | ||
967 | tcg_gen_trunc_tl_i32(cpu_crf[0], t0); | ||
968 | - tcg_temp_free(t0); | ||
969 | tcg_gen_br(l2); | ||
970 | |||
971 | gen_set_label(l1); | ||
972 | @@ -XXX,XX +XXX,XX @@ static void gen_lqarx(DisasContext *ctx) | ||
973 | ctx->mem_idx)); | ||
974 | gen_helper_lq_be_parallel(lo, cpu_env, EA, oi); | ||
975 | } | ||
976 | - tcg_temp_free_i32(oi); | ||
977 | tcg_gen_ld_i64(hi, cpu_env, offsetof(CPUPPCState, retxh)); | ||
978 | } else { | ||
979 | /* Restart with exclusive lock. */ | ||
980 | gen_helper_exit_atomic(cpu_env); | ||
981 | ctx->base.is_jmp = DISAS_NORETURN; | ||
982 | - tcg_temp_free(EA); | ||
983 | return; | ||
984 | } | ||
985 | } else if (ctx->le_mode) { | ||
986 | @@ -XXX,XX +XXX,XX @@ static void gen_lqarx(DisasContext *ctx) | ||
987 | gen_addr_add(ctx, EA, EA, 8); | ||
988 | tcg_gen_qemu_ld_i64(lo, EA, ctx->mem_idx, MO_BEUQ); | ||
989 | } | ||
990 | - tcg_temp_free(EA); | ||
991 | |||
992 | tcg_gen_st_tl(hi, cpu_env, offsetof(CPUPPCState, reserve_val)); | ||
993 | tcg_gen_st_tl(lo, cpu_env, offsetof(CPUPPCState, reserve_val2)); | ||
994 | @@ -XXX,XX +XXX,XX @@ static void gen_stqcx_(DisasContext *ctx) | ||
995 | gen_addr_reg_index(ctx, EA); | ||
996 | |||
997 | tcg_gen_brcond_tl(TCG_COND_NE, EA, cpu_reserve, lab_fail); | ||
998 | - tcg_temp_free(EA); | ||
999 | |||
1000 | cmp = tcg_temp_new_i128(); | ||
1001 | val = tcg_temp_new_i128(); | ||
1002 | @@ -XXX,XX +XXX,XX @@ static void gen_stqcx_(DisasContext *ctx) | ||
1003 | |||
1004 | tcg_gen_atomic_cmpxchg_i128(val, cpu_reserve, cmp, val, ctx->mem_idx, | ||
1005 | DEF_MEMOP(MO_128 | MO_ALIGN)); | ||
1006 | - tcg_temp_free_i128(cmp); | ||
1007 | |||
1008 | t0 = tcg_temp_new(); | ||
1009 | t1 = tcg_temp_new(); | ||
1010 | tcg_gen_extr_i128_i64(t1, t0, val); | ||
1011 | - tcg_temp_free_i128(val); | ||
1012 | |||
1013 | tcg_gen_xor_tl(t1, t1, cpu_reserve_val2); | ||
1014 | tcg_gen_xor_tl(t0, t0, cpu_reserve_val); | ||
1015 | tcg_gen_or_tl(t0, t0, t1); | ||
1016 | - tcg_temp_free(t1); | ||
1017 | |||
1018 | tcg_gen_setcondi_tl(TCG_COND_EQ, t0, t0, 0); | ||
1019 | tcg_gen_shli_tl(t0, t0, CRF_EQ_BIT); | ||
1020 | tcg_gen_or_tl(t0, t0, cpu_so); | ||
1021 | tcg_gen_trunc_tl_i32(cpu_crf[0], t0); | ||
1022 | - tcg_temp_free(t0); | ||
1023 | |||
1024 | tcg_gen_br(lab_over); | ||
1025 | gen_set_label(lab_fail); | ||
1026 | @@ -XXX,XX +XXX,XX @@ static void gen_wait(DisasContext *ctx) | ||
1027 | TCGv_i32 t0 = tcg_const_i32(1); | ||
1028 | tcg_gen_st_i32(t0, cpu_env, | ||
1029 | -offsetof(PowerPCCPU, env) + offsetof(CPUState, halted)); | ||
1030 | - tcg_temp_free_i32(t0); | ||
1031 | /* Stop translation, as the CPU is supposed to sleep from now */ | ||
1032 | gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); | ||
1033 | } | ||
1034 | @@ -XXX,XX +XXX,XX @@ static void gen_doze(DisasContext *ctx) | ||
1035 | CHK_HV(ctx); | ||
1036 | t = tcg_const_i32(PPC_PM_DOZE); | ||
1037 | gen_helper_pminsn(cpu_env, t); | ||
1038 | - tcg_temp_free_i32(t); | ||
1039 | /* Stop translation, as the CPU is supposed to sleep from now */ | ||
1040 | gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); | ||
1041 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1042 | @@ -XXX,XX +XXX,XX @@ static void gen_nap(DisasContext *ctx) | ||
1043 | CHK_HV(ctx); | ||
1044 | t = tcg_const_i32(PPC_PM_NAP); | ||
1045 | gen_helper_pminsn(cpu_env, t); | ||
1046 | - tcg_temp_free_i32(t); | ||
1047 | /* Stop translation, as the CPU is supposed to sleep from now */ | ||
1048 | gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); | ||
1049 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1050 | @@ -XXX,XX +XXX,XX @@ static void gen_stop(DisasContext *ctx) | ||
1051 | CHK_HV(ctx); | ||
1052 | t = tcg_const_i32(PPC_PM_STOP); | ||
1053 | gen_helper_pminsn(cpu_env, t); | ||
1054 | - tcg_temp_free_i32(t); | ||
1055 | /* Stop translation, as the CPU is supposed to sleep from now */ | ||
1056 | gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); | ||
1057 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1058 | @@ -XXX,XX +XXX,XX @@ static void gen_sleep(DisasContext *ctx) | ||
1059 | CHK_HV(ctx); | ||
1060 | t = tcg_const_i32(PPC_PM_SLEEP); | ||
1061 | gen_helper_pminsn(cpu_env, t); | ||
1062 | - tcg_temp_free_i32(t); | ||
1063 | /* Stop translation, as the CPU is supposed to sleep from now */ | ||
1064 | gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); | ||
1065 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1066 | @@ -XXX,XX +XXX,XX @@ static void gen_rvwinkle(DisasContext *ctx) | ||
1067 | CHK_HV(ctx); | ||
1068 | t = tcg_const_i32(PPC_PM_RVWINKLE); | ||
1069 | gen_helper_pminsn(cpu_env, t); | ||
1070 | - tcg_temp_free_i32(t); | ||
1071 | /* Stop translation, as the CPU is supposed to sleep from now */ | ||
1072 | gen_exception_nip(ctx, EXCP_HLT, ctx->base.pc_next); | ||
1073 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1074 | @@ -XXX,XX +XXX,XX @@ static void pmu_count_insns(DisasContext *ctx) | ||
1075 | } | ||
1076 | |||
1077 | gen_set_label(l); | ||
1078 | - tcg_temp_free(t0); | ||
1079 | } else { | ||
1080 | gen_helper_insns_inc(cpu_env, tcg_constant_i32(ctx->base.num_insns)); | ||
1081 | } | ||
1082 | @@ -XXX,XX +XXX,XX @@ static void pmu_count_insns(DisasContext *ctx) | ||
1083 | gen_load_spr(t0, SPR_POWER_PMC5); | ||
1084 | tcg_gen_addi_tl(t0, t0, ctx->base.num_insns); | ||
1085 | gen_store_spr(SPR_POWER_PMC5, t0); | ||
1086 | - | ||
1087 | - tcg_temp_free(t0); | ||
1088 | #endif /* #if !defined(CONFIG_USER_ONLY) */ | ||
1089 | } | ||
1090 | #else | ||
1091 | @@ -XXX,XX +XXX,XX @@ static void gen_bcond(DisasContext *ctx, int type) | ||
1092 | */ | ||
1093 | if (unlikely(!is_book3s_arch2x(ctx))) { | ||
1094 | gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL); | ||
1095 | - tcg_temp_free(temp); | ||
1096 | - tcg_temp_free(target); | ||
1097 | return; | ||
1098 | } | ||
1099 | |||
1100 | @@ -XXX,XX +XXX,XX @@ static void gen_bcond(DisasContext *ctx, int type) | ||
1101 | tcg_gen_brcondi_tl(TCG_COND_EQ, temp, 0, l1); | ||
1102 | } | ||
1103 | } | ||
1104 | - tcg_temp_free(temp); | ||
1105 | } | ||
1106 | if ((bo & 0x10) == 0) { | ||
1107 | /* Test CR */ | ||
1108 | @@ -XXX,XX +XXX,XX @@ static void gen_bcond(DisasContext *ctx, int type) | ||
1109 | tcg_gen_andi_i32(temp, cpu_crf[bi >> 2], mask); | ||
1110 | tcg_gen_brcondi_i32(TCG_COND_NE, temp, 0, l1); | ||
1111 | } | ||
1112 | - tcg_temp_free_i32(temp); | ||
1113 | } | ||
1114 | gen_update_cfar(ctx, ctx->cia); | ||
1115 | if (type == BCOND_IM) { | ||
1116 | @@ -XXX,XX +XXX,XX @@ static void gen_bcond(DisasContext *ctx, int type) | ||
1117 | tcg_gen_andi_tl(cpu_nip, target, ~3); | ||
1118 | } | ||
1119 | gen_lookup_and_goto_ptr(ctx); | ||
1120 | - tcg_temp_free(target); | ||
1121 | } | ||
1122 | if ((bo & 0x14) != 0x14) { | ||
1123 | /* fallthrough case */ | ||
1124 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
1125 | tcg_gen_andi_i32(t0, t0, bitmask); \ | ||
1126 | tcg_gen_andi_i32(t1, cpu_crf[crbD(ctx->opcode) >> 2], ~bitmask); \ | ||
1127 | tcg_gen_or_i32(cpu_crf[crbD(ctx->opcode) >> 2], t0, t1); \ | ||
1128 | - tcg_temp_free_i32(t0); \ | ||
1129 | - tcg_temp_free_i32(t1); \ | ||
1130 | } | ||
1131 | |||
1132 | /* crand */ | ||
1133 | @@ -XXX,XX +XXX,XX @@ static void gen_tw(DisasContext *ctx) | ||
1134 | t0 = tcg_const_i32(TO(ctx->opcode)); | ||
1135 | gen_helper_tw(cpu_env, cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], | ||
1136 | t0); | ||
1137 | - tcg_temp_free_i32(t0); | ||
1138 | } | ||
1139 | |||
1140 | /* twi */ | ||
1141 | @@ -XXX,XX +XXX,XX @@ static void gen_twi(DisasContext *ctx) | ||
1142 | t0 = tcg_const_tl(SIMM(ctx->opcode)); | ||
1143 | t1 = tcg_const_i32(TO(ctx->opcode)); | ||
1144 | gen_helper_tw(cpu_env, cpu_gpr[rA(ctx->opcode)], t0, t1); | ||
1145 | - tcg_temp_free(t0); | ||
1146 | - tcg_temp_free_i32(t1); | ||
1147 | } | ||
1148 | |||
1149 | #if defined(TARGET_PPC64) | ||
1150 | @@ -XXX,XX +XXX,XX @@ static void gen_td(DisasContext *ctx) | ||
1151 | t0 = tcg_const_i32(TO(ctx->opcode)); | ||
1152 | gen_helper_td(cpu_env, cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], | ||
1153 | t0); | ||
1154 | - tcg_temp_free_i32(t0); | ||
1155 | } | ||
1156 | |||
1157 | /* tdi */ | ||
1158 | @@ -XXX,XX +XXX,XX @@ static void gen_tdi(DisasContext *ctx) | ||
1159 | t0 = tcg_const_tl(SIMM(ctx->opcode)); | ||
1160 | t1 = tcg_const_i32(TO(ctx->opcode)); | ||
1161 | gen_helper_td(cpu_env, cpu_gpr[rA(ctx->opcode)], t0, t1); | ||
1162 | - tcg_temp_free(t0); | ||
1163 | - tcg_temp_free_i32(t1); | ||
1164 | } | ||
1165 | #endif | ||
1166 | |||
1167 | @@ -XXX,XX +XXX,XX @@ static void gen_mcrxr(DisasContext *ctx) | ||
1168 | tcg_gen_shli_i32(dst, dst, 1); | ||
1169 | tcg_gen_or_i32(dst, dst, t0); | ||
1170 | tcg_gen_or_i32(dst, dst, t1); | ||
1171 | - tcg_temp_free_i32(t0); | ||
1172 | - tcg_temp_free_i32(t1); | ||
1173 | |||
1174 | tcg_gen_movi_tl(cpu_so, 0); | ||
1175 | tcg_gen_movi_tl(cpu_ov, 0); | ||
1176 | @@ -XXX,XX +XXX,XX @@ static void gen_mcrxrx(DisasContext *ctx) | ||
1177 | tcg_gen_or_tl(t1, t1, cpu_ca32); | ||
1178 | tcg_gen_or_tl(t0, t0, t1); | ||
1179 | tcg_gen_trunc_tl_i32(dst, t0); | ||
1180 | - tcg_temp_free(t0); | ||
1181 | - tcg_temp_free(t1); | ||
1182 | } | ||
1183 | #endif | ||
1184 | |||
1185 | @@ -XXX,XX +XXX,XX @@ static void gen_mfcr(DisasContext *ctx) | ||
1186 | tcg_gen_shli_i32(t0, t0, 4); | ||
1187 | tcg_gen_or_i32(t0, t0, cpu_crf[7]); | ||
1188 | tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t0); | ||
1189 | - tcg_temp_free_i32(t0); | ||
1190 | } | ||
1191 | } | ||
1192 | |||
1193 | @@ -XXX,XX +XXX,XX @@ static void gen_mtcrf(DisasContext *ctx) | ||
1194 | tcg_gen_trunc_tl_i32(temp, cpu_gpr[rS(ctx->opcode)]); | ||
1195 | tcg_gen_shri_i32(temp, temp, crn * 4); | ||
1196 | tcg_gen_andi_i32(cpu_crf[7 - crn], temp, 0xf); | ||
1197 | - tcg_temp_free_i32(temp); | ||
1198 | } | ||
1199 | } else { | ||
1200 | TCGv_i32 temp = tcg_temp_new_i32(); | ||
1201 | @@ -XXX,XX +XXX,XX @@ static void gen_mtcrf(DisasContext *ctx) | ||
1202 | tcg_gen_andi_i32(cpu_crf[7 - crn], cpu_crf[7 - crn], 0xf); | ||
1203 | } | ||
1204 | } | ||
1205 | - tcg_temp_free_i32(temp); | ||
1206 | } | ||
1207 | } | ||
1208 | |||
1209 | @@ -XXX,XX +XXX,XX @@ static void gen_mtmsrd(DisasContext *ctx) | ||
1210 | |||
1211 | /* Must stop the translation as machine state (may have) changed */ | ||
1212 | ctx->base.is_jmp = DISAS_EXIT_UPDATE; | ||
1213 | - | ||
1214 | - tcg_temp_free(t0); | ||
1215 | - tcg_temp_free(t1); | ||
1216 | #endif /* !defined(CONFIG_USER_ONLY) */ | ||
1217 | } | ||
1218 | #endif /* defined(TARGET_PPC64) */ | ||
1219 | @@ -XXX,XX +XXX,XX @@ static void gen_mtmsr(DisasContext *ctx) | ||
1220 | |||
1221 | /* Must stop the translation as machine state (may have) changed */ | ||
1222 | ctx->base.is_jmp = DISAS_EXIT_UPDATE; | ||
1223 | - | ||
1224 | - tcg_temp_free(t0); | ||
1225 | - tcg_temp_free(t1); | ||
1226 | #endif | ||
1227 | } | ||
1228 | |||
1229 | @@ -XXX,XX +XXX,XX @@ static void gen_setb(DisasContext *ctx) | ||
1230 | tcg_gen_setcondi_i32(TCG_COND_GEU, t0, cpu_crf[crf], 4); | ||
1231 | tcg_gen_movcond_i32(TCG_COND_GEU, t0, cpu_crf[crf], t8, tm1, t0); | ||
1232 | tcg_gen_ext_i32_tl(cpu_gpr[rD(ctx->opcode)], t0); | ||
1233 | - | ||
1234 | - tcg_temp_free_i32(t0); | ||
1235 | } | ||
1236 | #endif | ||
1237 | |||
1238 | @@ -XXX,XX +XXX,XX @@ static void gen_dcbf(DisasContext *ctx) | ||
1239 | t0 = tcg_temp_new(); | ||
1240 | gen_addr_reg_index(ctx, t0); | ||
1241 | gen_qemu_ld8u(ctx, t0, t0); | ||
1242 | - tcg_temp_free(t0); | ||
1243 | } | ||
1244 | |||
1245 | /* dcbfep (external PID dcbf) */ | ||
1246 | @@ -XXX,XX +XXX,XX @@ static void gen_dcbfep(DisasContext *ctx) | ||
1247 | t0 = tcg_temp_new(); | ||
1248 | gen_addr_reg_index(ctx, t0); | ||
1249 | tcg_gen_qemu_ld_tl(t0, t0, PPC_TLB_EPID_LOAD, DEF_MEMOP(MO_UB)); | ||
1250 | - tcg_temp_free(t0); | ||
1251 | } | ||
1252 | |||
1253 | /* dcbi (Supervisor only) */ | ||
1254 | @@ -XXX,XX +XXX,XX @@ static void gen_dcbi(DisasContext *ctx) | ||
1255 | /* XXX: specification says this should be treated as a store by the MMU */ | ||
1256 | gen_qemu_ld8u(ctx, val, EA); | ||
1257 | gen_qemu_st8(ctx, val, EA); | ||
1258 | - tcg_temp_free(val); | ||
1259 | - tcg_temp_free(EA); | ||
1260 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1261 | } | ||
1262 | |||
1263 | @@ -XXX,XX +XXX,XX @@ static void gen_dcbst(DisasContext *ctx) | ||
1264 | t0 = tcg_temp_new(); | ||
1265 | gen_addr_reg_index(ctx, t0); | ||
1266 | gen_qemu_ld8u(ctx, t0, t0); | ||
1267 | - tcg_temp_free(t0); | ||
1268 | } | ||
1269 | |||
1270 | /* dcbstep (dcbstep External PID version) */ | ||
1271 | @@ -XXX,XX +XXX,XX @@ static void gen_dcbstep(DisasContext *ctx) | ||
1272 | t0 = tcg_temp_new(); | ||
1273 | gen_addr_reg_index(ctx, t0); | ||
1274 | tcg_gen_qemu_ld_tl(t0, t0, PPC_TLB_EPID_LOAD, DEF_MEMOP(MO_UB)); | ||
1275 | - tcg_temp_free(t0); | ||
1276 | } | ||
1277 | |||
1278 | /* dcbt */ | ||
1279 | @@ -XXX,XX +XXX,XX @@ static void gen_dcbtls(DisasContext *ctx) | ||
1280 | gen_load_spr(t0, SPR_Exxx_L1CSR0); | ||
1281 | tcg_gen_ori_tl(t0, t0, L1CSR0_CUL); | ||
1282 | gen_store_spr(SPR_Exxx_L1CSR0, t0); | ||
1283 | - tcg_temp_free(t0); | ||
1284 | } | ||
1285 | |||
1286 | /* dcblc */ | ||
1287 | @@ -XXX,XX +XXX,XX @@ static void gen_dcbz(DisasContext *ctx) | ||
1288 | tcgv_op = tcg_const_i32(ctx->opcode & 0x03FF000); | ||
1289 | gen_addr_reg_index(ctx, tcgv_addr); | ||
1290 | gen_helper_dcbz(cpu_env, tcgv_addr, tcgv_op); | ||
1291 | - tcg_temp_free(tcgv_addr); | ||
1292 | - tcg_temp_free_i32(tcgv_op); | ||
1293 | } | ||
1294 | |||
1295 | /* dcbzep */ | ||
1296 | @@ -XXX,XX +XXX,XX @@ static void gen_dcbzep(DisasContext *ctx) | ||
1297 | tcgv_op = tcg_const_i32(ctx->opcode & 0x03FF000); | ||
1298 | gen_addr_reg_index(ctx, tcgv_addr); | ||
1299 | gen_helper_dcbzep(cpu_env, tcgv_addr, tcgv_op); | ||
1300 | - tcg_temp_free(tcgv_addr); | ||
1301 | - tcg_temp_free_i32(tcgv_op); | ||
1302 | } | ||
1303 | |||
1304 | /* dst / dstt */ | ||
1305 | @@ -XXX,XX +XXX,XX @@ static void gen_icbi(DisasContext *ctx) | ||
1306 | t0 = tcg_temp_new(); | ||
1307 | gen_addr_reg_index(ctx, t0); | ||
1308 | gen_helper_icbi(cpu_env, t0); | ||
1309 | - tcg_temp_free(t0); | ||
1310 | } | ||
1311 | |||
1312 | /* icbiep */ | ||
1313 | @@ -XXX,XX +XXX,XX @@ static void gen_icbiep(DisasContext *ctx) | ||
1314 | t0 = tcg_temp_new(); | ||
1315 | gen_addr_reg_index(ctx, t0); | ||
1316 | gen_helper_icbiep(cpu_env, t0); | ||
1317 | - tcg_temp_free(t0); | ||
1318 | } | ||
1319 | |||
1320 | /* Optional: */ | ||
1321 | @@ -XXX,XX +XXX,XX @@ static void gen_mfsr(DisasContext *ctx) | ||
1322 | CHK_SV(ctx); | ||
1323 | t0 = tcg_const_tl(SR(ctx->opcode)); | ||
1324 | gen_helper_load_sr(cpu_gpr[rD(ctx->opcode)], cpu_env, t0); | ||
1325 | - tcg_temp_free(t0); | ||
1326 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1327 | } | ||
1328 | |||
1329 | @@ -XXX,XX +XXX,XX @@ static void gen_mfsrin(DisasContext *ctx) | ||
1330 | t0 = tcg_temp_new(); | ||
1331 | tcg_gen_extract_tl(t0, cpu_gpr[rB(ctx->opcode)], 28, 4); | ||
1332 | gen_helper_load_sr(cpu_gpr[rD(ctx->opcode)], cpu_env, t0); | ||
1333 | - tcg_temp_free(t0); | ||
1334 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1335 | } | ||
1336 | |||
1337 | @@ -XXX,XX +XXX,XX @@ static void gen_mtsr(DisasContext *ctx) | ||
1338 | CHK_SV(ctx); | ||
1339 | t0 = tcg_const_tl(SR(ctx->opcode)); | ||
1340 | gen_helper_store_sr(cpu_env, t0, cpu_gpr[rS(ctx->opcode)]); | ||
1341 | - tcg_temp_free(t0); | ||
1342 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1343 | } | ||
1344 | |||
1345 | @@ -XXX,XX +XXX,XX @@ static void gen_mtsrin(DisasContext *ctx) | ||
1346 | t0 = tcg_temp_new(); | ||
1347 | tcg_gen_extract_tl(t0, cpu_gpr[rB(ctx->opcode)], 28, 4); | ||
1348 | gen_helper_store_sr(cpu_env, t0, cpu_gpr[rD(ctx->opcode)]); | ||
1349 | - tcg_temp_free(t0); | ||
1350 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1351 | } | ||
1352 | |||
1353 | @@ -XXX,XX +XXX,XX @@ static void gen_mfsr_64b(DisasContext *ctx) | ||
1354 | CHK_SV(ctx); | ||
1355 | t0 = tcg_const_tl(SR(ctx->opcode)); | ||
1356 | gen_helper_load_sr(cpu_gpr[rD(ctx->opcode)], cpu_env, t0); | ||
1357 | - tcg_temp_free(t0); | ||
1358 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1359 | } | ||
1360 | |||
1361 | @@ -XXX,XX +XXX,XX @@ static void gen_mfsrin_64b(DisasContext *ctx) | ||
1362 | t0 = tcg_temp_new(); | ||
1363 | tcg_gen_extract_tl(t0, cpu_gpr[rB(ctx->opcode)], 28, 4); | ||
1364 | gen_helper_load_sr(cpu_gpr[rD(ctx->opcode)], cpu_env, t0); | ||
1365 | - tcg_temp_free(t0); | ||
1366 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1367 | } | ||
1368 | |||
1369 | @@ -XXX,XX +XXX,XX @@ static void gen_mtsr_64b(DisasContext *ctx) | ||
1370 | CHK_SV(ctx); | ||
1371 | t0 = tcg_const_tl(SR(ctx->opcode)); | ||
1372 | gen_helper_store_sr(cpu_env, t0, cpu_gpr[rS(ctx->opcode)]); | ||
1373 | - tcg_temp_free(t0); | ||
1374 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1375 | } | ||
1376 | |||
1377 | @@ -XXX,XX +XXX,XX @@ static void gen_mtsrin_64b(DisasContext *ctx) | ||
1378 | t0 = tcg_temp_new(); | ||
1379 | tcg_gen_extract_tl(t0, cpu_gpr[rB(ctx->opcode)], 28, 4); | ||
1380 | gen_helper_store_sr(cpu_env, t0, cpu_gpr[rS(ctx->opcode)]); | ||
1381 | - tcg_temp_free(t0); | ||
1382 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1383 | } | ||
1384 | |||
1385 | @@ -XXX,XX +XXX,XX @@ static void gen_eciwx(DisasContext *ctx) | ||
1386 | gen_addr_reg_index(ctx, t0); | ||
1387 | tcg_gen_qemu_ld_tl(cpu_gpr[rD(ctx->opcode)], t0, ctx->mem_idx, | ||
1388 | DEF_MEMOP(MO_UL | MO_ALIGN)); | ||
1389 | - tcg_temp_free(t0); | ||
1390 | } | ||
1391 | |||
1392 | /* ecowx */ | ||
1393 | @@ -XXX,XX +XXX,XX @@ static void gen_ecowx(DisasContext *ctx) | ||
1394 | gen_addr_reg_index(ctx, t0); | ||
1395 | tcg_gen_qemu_st_tl(cpu_gpr[rD(ctx->opcode)], t0, ctx->mem_idx, | ||
1396 | DEF_MEMOP(MO_UL | MO_ALIGN)); | ||
1397 | - tcg_temp_free(t0); | ||
1398 | } | ||
1399 | |||
1400 | /* 602 - 603 - G2 TLB management */ | ||
1401 | @@ -XXX,XX +XXX,XX @@ static void gen_tlbiva(DisasContext *ctx) | ||
1402 | t0 = tcg_temp_new(); | ||
1403 | gen_addr_reg_index(ctx, t0); | ||
1404 | gen_helper_tlbiva(cpu_env, cpu_gpr[rB(ctx->opcode)]); | ||
1405 | - tcg_temp_free(t0); | ||
1406 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1407 | } | ||
1408 | |||
1409 | @@ -XXX,XX +XXX,XX @@ static inline void gen_405_mulladd_insn(DisasContext *ctx, int opc2, int opc3, | ||
1410 | } else { | ||
1411 | tcg_gen_mul_tl(cpu_gpr[rt], t0, t1); | ||
1412 | } | ||
1413 | - tcg_temp_free(t0); | ||
1414 | - tcg_temp_free(t1); | ||
1415 | if (unlikely(Rc) != 0) { | ||
1416 | /* Update Rc0 */ | ||
1417 | gen_set_Rc0(ctx, cpu_gpr[rt]); | ||
1418 | @@ -XXX,XX +XXX,XX @@ static void gen_mfdcr(DisasContext *ctx) | ||
1419 | CHK_SV(ctx); | ||
1420 | dcrn = tcg_const_tl(SPR(ctx->opcode)); | ||
1421 | gen_helper_load_dcr(cpu_gpr[rD(ctx->opcode)], cpu_env, dcrn); | ||
1422 | - tcg_temp_free(dcrn); | ||
1423 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1424 | } | ||
1425 | |||
1426 | @@ -XXX,XX +XXX,XX @@ static void gen_mtdcr(DisasContext *ctx) | ||
1427 | CHK_SV(ctx); | ||
1428 | dcrn = tcg_const_tl(SPR(ctx->opcode)); | ||
1429 | gen_helper_store_dcr(cpu_env, dcrn, cpu_gpr[rS(ctx->opcode)]); | ||
1430 | - tcg_temp_free(dcrn); | ||
1431 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1432 | } | ||
1433 | |||
1434 | @@ -XXX,XX +XXX,XX @@ static void gen_dcread(DisasContext *ctx) | ||
1435 | gen_addr_reg_index(ctx, EA); | ||
1436 | val = tcg_temp_new(); | ||
1437 | gen_qemu_ld32u(ctx, val, EA); | ||
1438 | - tcg_temp_free(val); | ||
1439 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], EA); | ||
1440 | - tcg_temp_free(EA); | ||
1441 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1442 | } | ||
1443 | |||
1444 | @@ -XXX,XX +XXX,XX @@ static void gen_tlbsx_40x(DisasContext *ctx) | ||
1445 | t0 = tcg_temp_new(); | ||
1446 | gen_addr_reg_index(ctx, t0); | ||
1447 | gen_helper_4xx_tlbsx(cpu_gpr[rD(ctx->opcode)], cpu_env, t0); | ||
1448 | - tcg_temp_free(t0); | ||
1449 | if (Rc(ctx->opcode)) { | ||
1450 | TCGLabel *l1 = gen_new_label(); | ||
1451 | tcg_gen_trunc_tl_i32(cpu_crf[0], cpu_so); | ||
1452 | @@ -XXX,XX +XXX,XX @@ static void gen_tlbre_440(DisasContext *ctx) | ||
1453 | TCGv_i32 t0 = tcg_const_i32(rB(ctx->opcode)); | ||
1454 | gen_helper_440_tlbre(cpu_gpr[rD(ctx->opcode)], cpu_env, | ||
1455 | t0, cpu_gpr[rA(ctx->opcode)]); | ||
1456 | - tcg_temp_free_i32(t0); | ||
1457 | } | ||
1458 | break; | ||
1459 | default: | ||
1460 | @@ -XXX,XX +XXX,XX @@ static void gen_tlbsx_440(DisasContext *ctx) | ||
1461 | t0 = tcg_temp_new(); | ||
1462 | gen_addr_reg_index(ctx, t0); | ||
1463 | gen_helper_440_tlbsx(cpu_gpr[rD(ctx->opcode)], cpu_env, t0); | ||
1464 | - tcg_temp_free(t0); | ||
1465 | if (Rc(ctx->opcode)) { | ||
1466 | TCGLabel *l1 = gen_new_label(); | ||
1467 | tcg_gen_trunc_tl_i32(cpu_crf[0], cpu_so); | ||
1468 | @@ -XXX,XX +XXX,XX @@ static void gen_tlbwe_440(DisasContext *ctx) | ||
1469 | TCGv_i32 t0 = tcg_const_i32(rB(ctx->opcode)); | ||
1470 | gen_helper_440_tlbwe(cpu_env, t0, cpu_gpr[rA(ctx->opcode)], | ||
1471 | cpu_gpr[rS(ctx->opcode)]); | ||
1472 | - tcg_temp_free_i32(t0); | ||
1473 | } | ||
1474 | break; | ||
1475 | default: | ||
1476 | @@ -XXX,XX +XXX,XX @@ static void gen_tlbsx_booke206(DisasContext *ctx) | ||
1477 | |||
1478 | tcg_gen_add_tl(t0, t0, cpu_gpr[rB(ctx->opcode)]); | ||
1479 | gen_helper_booke206_tlbsx(cpu_env, t0); | ||
1480 | - tcg_temp_free(t0); | ||
1481 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1482 | } | ||
1483 | |||
1484 | @@ -XXX,XX +XXX,XX @@ static void gen_tlbivax_booke206(DisasContext *ctx) | ||
1485 | t0 = tcg_temp_new(); | ||
1486 | gen_addr_reg_index(ctx, t0); | ||
1487 | gen_helper_booke206_tlbivax(cpu_env, t0); | ||
1488 | - tcg_temp_free(t0); | ||
1489 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1490 | } | ||
1491 | |||
1492 | @@ -XXX,XX +XXX,XX @@ static void gen_tlbilx_booke206(DisasContext *ctx) | ||
1493 | gen_inval_exception(ctx, POWERPC_EXCP_INVAL_INVAL); | ||
1494 | break; | ||
1495 | } | ||
1496 | - | ||
1497 | - tcg_temp_free(t0); | ||
1498 | #endif /* defined(CONFIG_USER_ONLY) */ | ||
1499 | } | ||
1500 | |||
1501 | @@ -XXX,XX +XXX,XX @@ static void gen_wrtee(DisasContext *ctx) | ||
1502 | tcg_gen_andi_tl(cpu_msr, cpu_msr, ~(1 << MSR_EE)); | ||
1503 | tcg_gen_or_tl(cpu_msr, cpu_msr, t0); | ||
1504 | gen_ppc_maybe_interrupt(ctx); | ||
1505 | - tcg_temp_free(t0); | ||
1506 | /* | ||
1507 | * Stop translation to have a chance to raise an exception if we | ||
1508 | * just set msr_ee to 1 | ||
1509 | @@ -XXX,XX +XXX,XX @@ static void gen_dlmzb(DisasContext *ctx) | ||
1510 | TCGv_i32 t0 = tcg_const_i32(Rc(ctx->opcode)); | ||
1511 | gen_helper_dlmzb(cpu_gpr[rA(ctx->opcode)], cpu_env, | ||
1512 | cpu_gpr[rS(ctx->opcode)], cpu_gpr[rB(ctx->opcode)], t0); | ||
1513 | - tcg_temp_free_i32(t0); | ||
1514 | } | ||
1515 | |||
1516 | /* mbar replaces eieio on 440 */ | ||
1517 | @@ -XXX,XX +XXX,XX @@ static void gen_maddld(DisasContext *ctx) | ||
1518 | |||
1519 | tcg_gen_mul_i64(t1, cpu_gpr[rA(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]); | ||
1520 | tcg_gen_add_i64(cpu_gpr[rD(ctx->opcode)], t1, cpu_gpr[rC(ctx->opcode)]); | ||
1521 | - tcg_temp_free_i64(t1); | ||
1522 | } | ||
1523 | |||
1524 | /* maddhd maddhdu */ | ||
1525 | @@ -XXX,XX +XXX,XX @@ static void gen_maddhd_maddhdu(DisasContext *ctx) | ||
1526 | } | ||
1527 | tcg_gen_add2_i64(t1, cpu_gpr[rD(ctx->opcode)], lo, hi, | ||
1528 | cpu_gpr[rC(ctx->opcode)], t1); | ||
1529 | - tcg_temp_free_i64(lo); | ||
1530 | - tcg_temp_free_i64(hi); | ||
1531 | - tcg_temp_free_i64(t1); | ||
1532 | } | ||
1533 | #endif /* defined(TARGET_PPC64) */ | ||
1534 | |||
1535 | @@ -XXX,XX +XXX,XX @@ static void gen_brh(DisasContext *ctx) | ||
1536 | tcg_gen_and_i64(t1, cpu_gpr[rS(ctx->opcode)], mask); | ||
1537 | tcg_gen_shli_i64(t1, t1, 8); | ||
1538 | tcg_gen_or_i64(cpu_gpr[rA(ctx->opcode)], t1, t2); | ||
1539 | - | ||
1540 | - tcg_temp_free_i64(t1); | ||
1541 | - tcg_temp_free_i64(t2); | ||
1542 | } | ||
1543 | #endif | ||
1544 | |||
1545 | diff --git a/target/ppc/power8-pmu-regs.c.inc b/target/ppc/power8-pmu-regs.c.inc | ||
1546 | index XXXXXXX..XXXXXXX 100644 | ||
1547 | --- a/target/ppc/power8-pmu-regs.c.inc | ||
1548 | +++ b/target/ppc/power8-pmu-regs.c.inc | ||
1549 | @@ -XXX,XX +XXX,XX @@ static bool spr_groupA_write_allowed(DisasContext *ctx) | ||
1550 | /* | ||
1551 | * Helper function to avoid code repetition between MMCR0 and | ||
1552 | * MMCR2 problem state write functions. | ||
1553 | - * | ||
1554 | - * 'ret' must be tcg_temp_freed() by the caller. | ||
1555 | */ | ||
1556 | static TCGv masked_gprn_for_spr_write(int gprn, int sprn, | ||
1557 | uint64_t spr_mask) | ||
1558 | @@ -XXX,XX +XXX,XX @@ static TCGv masked_gprn_for_spr_write(int gprn, int sprn, | ||
1559 | /* Add the masked gprn bits into 'ret' */ | ||
1560 | tcg_gen_or_tl(ret, ret, t0); | ||
1561 | |||
1562 | - tcg_temp_free(t0); | ||
1563 | - | ||
1564 | return ret; | ||
1565 | } | ||
1566 | |||
1567 | @@ -XXX,XX +XXX,XX @@ void spr_read_MMCR0_ureg(DisasContext *ctx, int gprn, int sprn) | ||
1568 | gen_load_spr(t0, SPR_POWER_MMCR0); | ||
1569 | tcg_gen_andi_tl(t0, t0, MMCR0_UREG_MASK); | ||
1570 | tcg_gen_mov_tl(cpu_gpr[gprn], t0); | ||
1571 | - | ||
1572 | - tcg_temp_free(t0); | ||
1573 | } | ||
1574 | |||
1575 | static void write_MMCR0_common(DisasContext *ctx, TCGv val) | ||
1576 | @@ -XXX,XX +XXX,XX @@ void spr_write_MMCR0_ureg(DisasContext *ctx, int sprn, int gprn) | ||
1577 | masked_gprn = masked_gprn_for_spr_write(gprn, SPR_POWER_MMCR0, | ||
1578 | MMCR0_UREG_MASK); | ||
1579 | write_MMCR0_common(ctx, masked_gprn); | ||
1580 | - | ||
1581 | - tcg_temp_free(masked_gprn); | ||
1582 | } | ||
1583 | |||
1584 | void spr_read_MMCR2_ureg(DisasContext *ctx, int gprn, int sprn) | ||
1585 | @@ -XXX,XX +XXX,XX @@ void spr_read_MMCR2_ureg(DisasContext *ctx, int gprn, int sprn) | ||
1586 | gen_load_spr(t0, SPR_POWER_MMCR2); | ||
1587 | tcg_gen_andi_tl(t0, t0, MMCR2_UREG_MASK); | ||
1588 | tcg_gen_mov_tl(cpu_gpr[gprn], t0); | ||
1589 | - | ||
1590 | - tcg_temp_free(t0); | ||
1591 | } | ||
1592 | |||
1593 | void spr_write_MMCR2_ureg(DisasContext *ctx, int sprn, int gprn) | ||
1594 | @@ -XXX,XX +XXX,XX @@ void spr_write_MMCR2_ureg(DisasContext *ctx, int sprn, int gprn) | ||
1595 | masked_gprn = masked_gprn_for_spr_write(gprn, SPR_POWER_MMCR2, | ||
1596 | MMCR2_UREG_MASK); | ||
1597 | gen_store_spr(SPR_POWER_MMCR2, masked_gprn); | ||
1598 | - | ||
1599 | - tcg_temp_free(masked_gprn); | ||
1600 | } | ||
1601 | |||
1602 | void spr_read_PMC(DisasContext *ctx, int gprn, int sprn) | ||
1603 | @@ -XXX,XX +XXX,XX @@ void spr_read_PMC(DisasContext *ctx, int gprn, int sprn) | ||
1604 | |||
1605 | gen_icount_io_start(ctx); | ||
1606 | gen_helper_read_pmc(cpu_gpr[gprn], cpu_env, t_sprn); | ||
1607 | - | ||
1608 | - tcg_temp_free_i32(t_sprn); | ||
1609 | } | ||
1610 | |||
1611 | void spr_read_PMC14_ureg(DisasContext *ctx, int gprn, int sprn) | ||
1612 | @@ -XXX,XX +XXX,XX @@ void spr_write_PMC(DisasContext *ctx, int sprn, int gprn) | ||
1613 | |||
1614 | gen_icount_io_start(ctx); | ||
1615 | gen_helper_store_pmc(cpu_env, t_sprn, cpu_gpr[gprn]); | ||
1616 | - | ||
1617 | - tcg_temp_free_i32(t_sprn); | ||
1618 | } | ||
1619 | |||
1620 | void spr_write_PMC14_ureg(DisasContext *ctx, int sprn, int gprn) | ||
1621 | diff --git a/target/ppc/translate/dfp-impl.c.inc b/target/ppc/translate/dfp-impl.c.inc | ||
1622 | index XXXXXXX..XXXXXXX 100644 | ||
1623 | --- a/target/ppc/translate/dfp-impl.c.inc | ||
1624 | +++ b/target/ppc/translate/dfp-impl.c.inc | ||
1625 | @@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \ | ||
1626 | if (unlikely(a->rc)) { \ | ||
1627 | gen_set_cr1_from_fpscr(ctx); \ | ||
1628 | } \ | ||
1629 | - tcg_temp_free_ptr(rt); \ | ||
1630 | - tcg_temp_free_ptr(ra); \ | ||
1631 | - tcg_temp_free_ptr(rb); \ | ||
1632 | return true; \ | ||
1633 | } | ||
1634 | |||
1635 | @@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \ | ||
1636 | rb = gen_fprp_ptr(a->rb); \ | ||
1637 | gen_helper_##NAME(cpu_crf[a->bf], \ | ||
1638 | cpu_env, ra, rb); \ | ||
1639 | - tcg_temp_free_ptr(ra); \ | ||
1640 | - tcg_temp_free_ptr(rb); \ | ||
1641 | return true; \ | ||
1642 | } | ||
1643 | |||
1644 | @@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \ | ||
1645 | rb = gen_fprp_ptr(a->rb); \ | ||
1646 | gen_helper_##NAME(cpu_crf[a->bf], \ | ||
1647 | cpu_env, tcg_constant_i32(a->uim), rb);\ | ||
1648 | - tcg_temp_free_ptr(rb); \ | ||
1649 | return true; \ | ||
1650 | } | ||
1651 | |||
1652 | @@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \ | ||
1653 | ra = gen_fprp_ptr(a->fra); \ | ||
1654 | gen_helper_##NAME(cpu_crf[a->bf], \ | ||
1655 | cpu_env, ra, tcg_constant_i32(a->dm)); \ | ||
1656 | - tcg_temp_free_ptr(ra); \ | ||
1657 | return true; \ | ||
1658 | } | ||
1659 | |||
1660 | @@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \ | ||
1661 | if (unlikely(a->rc)) { \ | ||
1662 | gen_set_cr1_from_fpscr(ctx); \ | ||
1663 | } \ | ||
1664 | - tcg_temp_free_ptr(rt); \ | ||
1665 | - tcg_temp_free_ptr(rb); \ | ||
1666 | return true; \ | ||
1667 | } | ||
1668 | |||
1669 | @@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \ | ||
1670 | if (unlikely(a->rc)) { \ | ||
1671 | gen_set_cr1_from_fpscr(ctx); \ | ||
1672 | } \ | ||
1673 | - tcg_temp_free_ptr(rt); \ | ||
1674 | - tcg_temp_free_ptr(ra); \ | ||
1675 | - tcg_temp_free_ptr(rb); \ | ||
1676 | return true; \ | ||
1677 | } | ||
1678 | |||
1679 | @@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \ | ||
1680 | if (unlikely(a->rc)) { \ | ||
1681 | gen_set_cr1_from_fpscr(ctx); \ | ||
1682 | } \ | ||
1683 | - tcg_temp_free_ptr(rt); \ | ||
1684 | - tcg_temp_free_ptr(rb); \ | ||
1685 | return true; \ | ||
1686 | } | ||
1687 | |||
1688 | @@ -XXX,XX +XXX,XX @@ static bool trans_##NAME(DisasContext *ctx, arg_##NAME *a) \ | ||
1689 | if (unlikely(a->rc)) { \ | ||
1690 | gen_set_cr1_from_fpscr(ctx); \ | ||
1691 | } \ | ||
1692 | - tcg_temp_free_ptr(rt); \ | ||
1693 | - tcg_temp_free_ptr(rx); \ | ||
1694 | return true; \ | ||
1695 | } | ||
1696 | |||
1697 | @@ -XXX,XX +XXX,XX @@ static bool trans_DCFFIXQQ(DisasContext *ctx, arg_DCFFIXQQ *a) | ||
1698 | rt = gen_fprp_ptr(a->frtp); | ||
1699 | rb = gen_avr_ptr(a->vrb); | ||
1700 | gen_helper_DCFFIXQQ(cpu_env, rt, rb); | ||
1701 | - tcg_temp_free_ptr(rt); | ||
1702 | - tcg_temp_free_ptr(rb); | ||
1703 | |||
1704 | return true; | ||
1705 | } | ||
1706 | @@ -XXX,XX +XXX,XX @@ static bool trans_DCTFIXQQ(DisasContext *ctx, arg_DCTFIXQQ *a) | ||
1707 | rt = gen_avr_ptr(a->vrt); | ||
1708 | rb = gen_fprp_ptr(a->frbp); | ||
1709 | gen_helper_DCTFIXQQ(cpu_env, rt, rb); | ||
1710 | - tcg_temp_free_ptr(rt); | ||
1711 | - tcg_temp_free_ptr(rb); | ||
1712 | |||
1713 | return true; | ||
1714 | } | ||
1715 | diff --git a/target/ppc/translate/fixedpoint-impl.c.inc b/target/ppc/translate/fixedpoint-impl.c.inc | ||
1716 | index XXXXXXX..XXXXXXX 100644 | ||
1717 | --- a/target/ppc/translate/fixedpoint-impl.c.inc | ||
1718 | +++ b/target/ppc/translate/fixedpoint-impl.c.inc | ||
1719 | @@ -XXX,XX +XXX,XX @@ static bool do_ldst(DisasContext *ctx, int rt, int ra, TCGv displ, bool update, | ||
1720 | if (update) { | ||
1721 | tcg_gen_mov_tl(cpu_gpr[ra], ea); | ||
1722 | } | ||
1723 | - tcg_temp_free(ea); | ||
1724 | - | ||
1725 | return true; | ||
1726 | } | ||
1727 | |||
1728 | @@ -XXX,XX +XXX,XX @@ static bool do_ldst_quad(DisasContext *ctx, arg_D *a, bool store, bool prefixed) | ||
1729 | tcg_gen_qemu_ld_i64(high_addr_gpr, ea, ctx->mem_idx, mop); | ||
1730 | } | ||
1731 | } | ||
1732 | - tcg_temp_free(ea); | ||
1733 | #else | ||
1734 | qemu_build_not_reached(); | ||
1735 | #endif | ||
1736 | @@ -XXX,XX +XXX,XX @@ static bool do_set_bool_cond(DisasContext *ctx, arg_X_bi *a, bool neg, bool rev) | ||
1737 | if (neg) { | ||
1738 | tcg_gen_neg_tl(cpu_gpr[a->rt], cpu_gpr[a->rt]); | ||
1739 | } | ||
1740 | - tcg_temp_free(temp); | ||
1741 | - | ||
1742 | return true; | ||
1743 | } | ||
1744 | |||
1745 | @@ -XXX,XX +XXX,XX @@ static void do_cntzdm(TCGv_i64 dst, TCGv_i64 src, TCGv_i64 mask, int64_t trail) | ||
1746 | } | ||
1747 | |||
1748 | tcg_gen_ctpop_i64(dst, t0); | ||
1749 | - | ||
1750 | - tcg_temp_free_i64(t0); | ||
1751 | - tcg_temp_free_i64(t1); | ||
1752 | } | ||
1753 | |||
1754 | static bool trans_CNTLZDM(DisasContext *ctx, arg_X *a) | ||
1755 | @@ -XXX,XX +XXX,XX @@ static bool trans_ADDG6S(DisasContext *ctx, arg_X *a) | ||
1756 | |||
1757 | tcg_gen_xori_tl(carry, carry, (target_long)carry_bits); | ||
1758 | tcg_gen_muli_tl(cpu_gpr[a->rt], carry, 6); | ||
1759 | - | ||
1760 | - tcg_temp_free(t0); | ||
1761 | - tcg_temp_free(t1); | ||
1762 | - tcg_temp_free(carry); | ||
1763 | - | ||
1764 | return true; | ||
1765 | } | ||
1766 | |||
1767 | @@ -XXX,XX +XXX,XX @@ static bool do_hash(DisasContext *ctx, arg_X *a, bool priv, | ||
1768 | |||
1769 | ea = do_ea_calc(ctx, a->ra, tcg_constant_tl(a->rt)); | ||
1770 | helper(cpu_env, ea, cpu_gpr[a->ra], cpu_gpr[a->rb]); | ||
1771 | - | ||
1772 | - tcg_temp_free(ea); | ||
1773 | - | ||
1774 | return true; | ||
1775 | } | ||
1776 | |||
1777 | diff --git a/target/ppc/translate/fp-impl.c.inc b/target/ppc/translate/fp-impl.c.inc | ||
1778 | index XXXXXXX..XXXXXXX 100644 | ||
1779 | --- a/target/ppc/translate/fp-impl.c.inc | ||
1780 | +++ b/target/ppc/translate/fp-impl.c.inc | ||
1781 | @@ -XXX,XX +XXX,XX @@ static void gen_set_cr1_from_fpscr(DisasContext *ctx) | ||
1782 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
1783 | tcg_gen_trunc_tl_i32(tmp, cpu_fpscr); | ||
1784 | tcg_gen_shri_i32(cpu_crf[1], tmp, 28); | ||
1785 | - tcg_temp_free_i32(tmp); | ||
1786 | } | ||
1787 | #else | ||
1788 | static void gen_set_cr1_from_fpscr(DisasContext *ctx) | ||
1789 | @@ -XXX,XX +XXX,XX @@ static void gen_f##name(DisasContext *ctx) \ | ||
1790 | if (unlikely(Rc(ctx->opcode) != 0)) { \ | ||
1791 | gen_set_cr1_from_fpscr(ctx); \ | ||
1792 | } \ | ||
1793 | - tcg_temp_free_i64(t0); \ | ||
1794 | - tcg_temp_free_i64(t1); \ | ||
1795 | - tcg_temp_free_i64(t2); \ | ||
1796 | - tcg_temp_free_i64(t3); \ | ||
1797 | } | ||
1798 | |||
1799 | #define GEN_FLOAT_ACB(name, op2, set_fprf, type) \ | ||
1800 | @@ -XXX,XX +XXX,XX @@ static void gen_f##name(DisasContext *ctx) \ | ||
1801 | if (unlikely(Rc(ctx->opcode) != 0)) { \ | ||
1802 | gen_set_cr1_from_fpscr(ctx); \ | ||
1803 | } \ | ||
1804 | - tcg_temp_free_i64(t0); \ | ||
1805 | - tcg_temp_free_i64(t1); \ | ||
1806 | - tcg_temp_free_i64(t2); \ | ||
1807 | } | ||
1808 | #define GEN_FLOAT_AB(name, op2, inval, set_fprf, type) \ | ||
1809 | _GEN_FLOAT_AB(name, 0x3F, op2, inval, set_fprf, type); \ | ||
1810 | @@ -XXX,XX +XXX,XX @@ static void gen_f##name(DisasContext *ctx) \ | ||
1811 | if (unlikely(Rc(ctx->opcode) != 0)) { \ | ||
1812 | gen_set_cr1_from_fpscr(ctx); \ | ||
1813 | } \ | ||
1814 | - tcg_temp_free_i64(t0); \ | ||
1815 | - tcg_temp_free_i64(t1); \ | ||
1816 | - tcg_temp_free_i64(t2); \ | ||
1817 | } | ||
1818 | #define GEN_FLOAT_AC(name, op2, inval, set_fprf, type) \ | ||
1819 | _GEN_FLOAT_AC(name, 0x3F, op2, inval, set_fprf, type); \ | ||
1820 | @@ -XXX,XX +XXX,XX @@ static void gen_f##name(DisasContext *ctx) \ | ||
1821 | if (unlikely(Rc(ctx->opcode) != 0)) { \ | ||
1822 | gen_set_cr1_from_fpscr(ctx); \ | ||
1823 | } \ | ||
1824 | - tcg_temp_free_i64(t0); \ | ||
1825 | - tcg_temp_free_i64(t1); \ | ||
1826 | } | ||
1827 | |||
1828 | #define GEN_FLOAT_BS(name, op1, op2, set_fprf, type) \ | ||
1829 | @@ -XXX,XX +XXX,XX @@ static void gen_f##name(DisasContext *ctx) \ | ||
1830 | if (unlikely(Rc(ctx->opcode) != 0)) { \ | ||
1831 | gen_set_cr1_from_fpscr(ctx); \ | ||
1832 | } \ | ||
1833 | - tcg_temp_free_i64(t0); \ | ||
1834 | - tcg_temp_free_i64(t1); \ | ||
1835 | } | ||
1836 | |||
1837 | /* fadd - fadds */ | ||
1838 | @@ -XXX,XX +XXX,XX @@ static void gen_frsqrtes(DisasContext *ctx) | ||
1839 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
1840 | gen_set_cr1_from_fpscr(ctx); | ||
1841 | } | ||
1842 | - tcg_temp_free_i64(t0); | ||
1843 | - tcg_temp_free_i64(t1); | ||
1844 | } | ||
1845 | |||
1846 | static bool trans_FSEL(DisasContext *ctx, arg_A *a) | ||
1847 | @@ -XXX,XX +XXX,XX @@ static bool trans_FSEL(DisasContext *ctx, arg_A *a) | ||
1848 | if (a->rc) { | ||
1849 | gen_set_cr1_from_fpscr(ctx); | ||
1850 | } | ||
1851 | - | ||
1852 | - tcg_temp_free_i64(t0); | ||
1853 | - tcg_temp_free_i64(t1); | ||
1854 | - tcg_temp_free_i64(t2); | ||
1855 | - | ||
1856 | return true; | ||
1857 | } | ||
1858 | |||
1859 | @@ -XXX,XX +XXX,XX @@ static bool do_helper_fsqrt(DisasContext *ctx, arg_A_tb *a, | ||
1860 | if (unlikely(a->rc != 0)) { | ||
1861 | gen_set_cr1_from_fpscr(ctx); | ||
1862 | } | ||
1863 | - | ||
1864 | - tcg_temp_free_i64(t0); | ||
1865 | - tcg_temp_free_i64(t1); | ||
1866 | - | ||
1867 | return true; | ||
1868 | } | ||
1869 | |||
1870 | @@ -XXX,XX +XXX,XX @@ static void gen_ftdiv(DisasContext *ctx) | ||
1871 | get_fpr(t0, rA(ctx->opcode)); | ||
1872 | get_fpr(t1, rB(ctx->opcode)); | ||
1873 | gen_helper_ftdiv(cpu_crf[crfD(ctx->opcode)], t0, t1); | ||
1874 | - tcg_temp_free_i64(t0); | ||
1875 | - tcg_temp_free_i64(t1); | ||
1876 | } | ||
1877 | |||
1878 | static void gen_ftsqrt(DisasContext *ctx) | ||
1879 | @@ -XXX,XX +XXX,XX @@ static void gen_ftsqrt(DisasContext *ctx) | ||
1880 | t0 = tcg_temp_new_i64(); | ||
1881 | get_fpr(t0, rB(ctx->opcode)); | ||
1882 | gen_helper_ftsqrt(cpu_crf[crfD(ctx->opcode)], t0); | ||
1883 | - tcg_temp_free_i64(t0); | ||
1884 | } | ||
1885 | |||
1886 | |||
1887 | @@ -XXX,XX +XXX,XX @@ static void gen_fcmpo(DisasContext *ctx) | ||
1888 | get_fpr(t0, rA(ctx->opcode)); | ||
1889 | get_fpr(t1, rB(ctx->opcode)); | ||
1890 | gen_helper_fcmpo(cpu_env, t0, t1, crf); | ||
1891 | - tcg_temp_free_i32(crf); | ||
1892 | gen_helper_float_check_status(cpu_env); | ||
1893 | - tcg_temp_free_i64(t0); | ||
1894 | - tcg_temp_free_i64(t1); | ||
1895 | } | ||
1896 | |||
1897 | /* fcmpu */ | ||
1898 | @@ -XXX,XX +XXX,XX @@ static void gen_fcmpu(DisasContext *ctx) | ||
1899 | get_fpr(t0, rA(ctx->opcode)); | ||
1900 | get_fpr(t1, rB(ctx->opcode)); | ||
1901 | gen_helper_fcmpu(cpu_env, t0, t1, crf); | ||
1902 | - tcg_temp_free_i32(crf); | ||
1903 | gen_helper_float_check_status(cpu_env); | ||
1904 | - tcg_temp_free_i64(t0); | ||
1905 | - tcg_temp_free_i64(t1); | ||
1906 | } | ||
1907 | |||
1908 | /*** Floating-point move ***/ | ||
1909 | @@ -XXX,XX +XXX,XX @@ static void gen_fabs(DisasContext *ctx) | ||
1910 | if (unlikely(Rc(ctx->opcode))) { | ||
1911 | gen_set_cr1_from_fpscr(ctx); | ||
1912 | } | ||
1913 | - tcg_temp_free_i64(t0); | ||
1914 | - tcg_temp_free_i64(t1); | ||
1915 | } | ||
1916 | |||
1917 | /* fmr - fmr. */ | ||
1918 | @@ -XXX,XX +XXX,XX @@ static void gen_fmr(DisasContext *ctx) | ||
1919 | if (unlikely(Rc(ctx->opcode))) { | ||
1920 | gen_set_cr1_from_fpscr(ctx); | ||
1921 | } | ||
1922 | - tcg_temp_free_i64(t0); | ||
1923 | } | ||
1924 | |||
1925 | /* fnabs */ | ||
1926 | @@ -XXX,XX +XXX,XX @@ static void gen_fnabs(DisasContext *ctx) | ||
1927 | if (unlikely(Rc(ctx->opcode))) { | ||
1928 | gen_set_cr1_from_fpscr(ctx); | ||
1929 | } | ||
1930 | - tcg_temp_free_i64(t0); | ||
1931 | - tcg_temp_free_i64(t1); | ||
1932 | } | ||
1933 | |||
1934 | /* fneg */ | ||
1935 | @@ -XXX,XX +XXX,XX @@ static void gen_fneg(DisasContext *ctx) | ||
1936 | if (unlikely(Rc(ctx->opcode))) { | ||
1937 | gen_set_cr1_from_fpscr(ctx); | ||
1938 | } | ||
1939 | - tcg_temp_free_i64(t0); | ||
1940 | - tcg_temp_free_i64(t1); | ||
1941 | } | ||
1942 | |||
1943 | /* fcpsgn: PowerPC 2.05 specification */ | ||
1944 | @@ -XXX,XX +XXX,XX @@ static void gen_fcpsgn(DisasContext *ctx) | ||
1945 | if (unlikely(Rc(ctx->opcode))) { | ||
1946 | gen_set_cr1_from_fpscr(ctx); | ||
1947 | } | ||
1948 | - tcg_temp_free_i64(t0); | ||
1949 | - tcg_temp_free_i64(t1); | ||
1950 | - tcg_temp_free_i64(t2); | ||
1951 | } | ||
1952 | |||
1953 | static void gen_fmrgew(DisasContext *ctx) | ||
1954 | @@ -XXX,XX +XXX,XX @@ static void gen_fmrgew(DisasContext *ctx) | ||
1955 | get_fpr(t0, rA(ctx->opcode)); | ||
1956 | tcg_gen_deposit_i64(t1, t0, b0, 0, 32); | ||
1957 | set_fpr(rD(ctx->opcode), t1); | ||
1958 | - tcg_temp_free_i64(b0); | ||
1959 | - tcg_temp_free_i64(t0); | ||
1960 | - tcg_temp_free_i64(t1); | ||
1961 | } | ||
1962 | |||
1963 | static void gen_fmrgow(DisasContext *ctx) | ||
1964 | @@ -XXX,XX +XXX,XX @@ static void gen_fmrgow(DisasContext *ctx) | ||
1965 | get_fpr(t1, rA(ctx->opcode)); | ||
1966 | tcg_gen_deposit_i64(t2, t0, t1, 32, 32); | ||
1967 | set_fpr(rD(ctx->opcode), t2); | ||
1968 | - tcg_temp_free_i64(t0); | ||
1969 | - tcg_temp_free_i64(t1); | ||
1970 | - tcg_temp_free_i64(t2); | ||
1971 | } | ||
1972 | |||
1973 | /*** Floating-Point status & ctrl register ***/ | ||
1974 | @@ -XXX,XX +XXX,XX @@ static void gen_mcrfs(DisasContext *ctx) | ||
1975 | tcg_gen_trunc_tl_i32(cpu_crf[crfD(ctx->opcode)], tmp); | ||
1976 | tcg_gen_andi_i32(cpu_crf[crfD(ctx->opcode)], cpu_crf[crfD(ctx->opcode)], | ||
1977 | 0xf); | ||
1978 | - tcg_temp_free(tmp); | ||
1979 | tcg_gen_extu_tl_i64(tnew_fpscr, cpu_fpscr); | ||
1980 | /* Only the exception bits (including FX) should be cleared if read */ | ||
1981 | tcg_gen_andi_i64(tnew_fpscr, tnew_fpscr, | ||
1982 | @@ -XXX,XX +XXX,XX @@ static void gen_mcrfs(DisasContext *ctx) | ||
1983 | /* FEX and VX need to be updated, so don't set fpscr directly */ | ||
1984 | tmask = tcg_const_i32(1 << nibble); | ||
1985 | gen_helper_store_fpscr(cpu_env, tnew_fpscr, tmask); | ||
1986 | - tcg_temp_free_i32(tmask); | ||
1987 | - tcg_temp_free_i64(tnew_fpscr); | ||
1988 | } | ||
1989 | |||
1990 | static TCGv_i64 place_from_fpscr(int rt, uint64_t mask) | ||
1991 | @@ -XXX,XX +XXX,XX @@ static TCGv_i64 place_from_fpscr(int rt, uint64_t mask) | ||
1992 | tcg_gen_andi_i64(fpscr_masked, fpscr, mask); | ||
1993 | set_fpr(rt, fpscr_masked); | ||
1994 | |||
1995 | - tcg_temp_free_i64(fpscr_masked); | ||
1996 | - | ||
1997 | return fpscr; | ||
1998 | } | ||
1999 | |||
2000 | @@ -XXX,XX +XXX,XX @@ static void store_fpscr_masked(TCGv_i64 fpscr, uint64_t clear_mask, | ||
2001 | tcg_gen_andi_i64(fpscr_masked, fpscr, ~clear_mask); | ||
2002 | tcg_gen_or_i64(fpscr_masked, fpscr_masked, set_mask); | ||
2003 | gen_helper_store_fpscr(cpu_env, fpscr_masked, st_mask); | ||
2004 | - | ||
2005 | - tcg_temp_free_i64(fpscr_masked); | ||
2006 | } | ||
2007 | |||
2008 | static bool trans_MFFS(DisasContext *ctx, arg_X_t_rc *a) | ||
2009 | { | ||
2010 | - TCGv_i64 fpscr; | ||
2011 | - | ||
2012 | REQUIRE_FPU(ctx); | ||
2013 | |||
2014 | gen_reset_fpstatus(); | ||
2015 | - fpscr = place_from_fpscr(a->rt, UINT64_MAX); | ||
2016 | + place_from_fpscr(a->rt, UINT64_MAX); | ||
2017 | if (a->rc) { | ||
2018 | gen_set_cr1_from_fpscr(ctx); | ||
2019 | } | ||
2020 | - | ||
2021 | - tcg_temp_free_i64(fpscr); | ||
2022 | - | ||
2023 | return true; | ||
2024 | } | ||
2025 | |||
2026 | @@ -XXX,XX +XXX,XX @@ static bool trans_MFFSCE(DisasContext *ctx, arg_X_t *a) | ||
2027 | gen_reset_fpstatus(); | ||
2028 | fpscr = place_from_fpscr(a->rt, UINT64_MAX); | ||
2029 | store_fpscr_masked(fpscr, FP_ENABLES, tcg_constant_i64(0), 0x0003); | ||
2030 | - | ||
2031 | - tcg_temp_free_i64(fpscr); | ||
2032 | - | ||
2033 | return true; | ||
2034 | } | ||
2035 | |||
2036 | @@ -XXX,XX +XXX,XX @@ static bool trans_MFFSCRN(DisasContext *ctx, arg_X_tb *a) | ||
2037 | gen_reset_fpstatus(); | ||
2038 | fpscr = place_from_fpscr(a->rt, FP_DRN | FP_ENABLES | FP_NI | FP_RN); | ||
2039 | store_fpscr_masked(fpscr, FP_RN, t1, 0x0001); | ||
2040 | - | ||
2041 | - tcg_temp_free_i64(t1); | ||
2042 | - tcg_temp_free_i64(fpscr); | ||
2043 | - | ||
2044 | return true; | ||
2045 | } | ||
2046 | |||
2047 | @@ -XXX,XX +XXX,XX @@ static bool trans_MFFSCDRN(DisasContext *ctx, arg_X_tb *a) | ||
2048 | gen_reset_fpstatus(); | ||
2049 | fpscr = place_from_fpscr(a->rt, FP_DRN | FP_ENABLES | FP_NI | FP_RN); | ||
2050 | store_fpscr_masked(fpscr, FP_DRN, t1, 0x0100); | ||
2051 | - | ||
2052 | - tcg_temp_free_i64(t1); | ||
2053 | - tcg_temp_free_i64(fpscr); | ||
2054 | - | ||
2055 | return true; | ||
2056 | } | ||
2057 | |||
2058 | @@ -XXX,XX +XXX,XX @@ static bool trans_MFFSCRNI(DisasContext *ctx, arg_X_imm2 *a) | ||
2059 | gen_reset_fpstatus(); | ||
2060 | fpscr = place_from_fpscr(a->rt, FP_DRN | FP_ENABLES | FP_NI | FP_RN); | ||
2061 | store_fpscr_masked(fpscr, FP_RN, t1, 0x0001); | ||
2062 | - | ||
2063 | - tcg_temp_free_i64(t1); | ||
2064 | - tcg_temp_free_i64(fpscr); | ||
2065 | - | ||
2066 | return true; | ||
2067 | } | ||
2068 | |||
2069 | @@ -XXX,XX +XXX,XX @@ static bool trans_MFFSCDRNI(DisasContext *ctx, arg_X_imm3 *a) | ||
2070 | gen_reset_fpstatus(); | ||
2071 | fpscr = place_from_fpscr(a->rt, FP_DRN | FP_ENABLES | FP_NI | FP_RN); | ||
2072 | store_fpscr_masked(fpscr, FP_DRN, t1, 0x0100); | ||
2073 | - | ||
2074 | - tcg_temp_free_i64(t1); | ||
2075 | - tcg_temp_free_i64(fpscr); | ||
2076 | - | ||
2077 | return true; | ||
2078 | } | ||
2079 | |||
2080 | static bool trans_MFFSL(DisasContext *ctx, arg_X_t *a) | ||
2081 | { | ||
2082 | - TCGv_i64 fpscr; | ||
2083 | - | ||
2084 | REQUIRE_INSNS_FLAGS2(ctx, ISA300); | ||
2085 | REQUIRE_FPU(ctx); | ||
2086 | |||
2087 | gen_reset_fpstatus(); | ||
2088 | - fpscr = place_from_fpscr(a->rt, | ||
2089 | - FP_DRN | FP_STATUS | FP_ENABLES | FP_NI | FP_RN); | ||
2090 | - | ||
2091 | - tcg_temp_free_i64(fpscr); | ||
2092 | - | ||
2093 | + place_from_fpscr(a->rt, FP_DRN | FP_STATUS | FP_ENABLES | FP_NI | FP_RN); | ||
2094 | return true; | ||
2095 | } | ||
2096 | |||
2097 | @@ -XXX,XX +XXX,XX @@ static void gen_mtfsb0(DisasContext *ctx) | ||
2098 | TCGv_i32 t0; | ||
2099 | t0 = tcg_const_i32(crb); | ||
2100 | gen_helper_fpscr_clrbit(cpu_env, t0); | ||
2101 | - tcg_temp_free_i32(t0); | ||
2102 | } | ||
2103 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
2104 | tcg_gen_trunc_tl_i32(cpu_crf[1], cpu_fpscr); | ||
2105 | @@ -XXX,XX +XXX,XX @@ static void gen_mtfsb1(DisasContext *ctx) | ||
2106 | TCGv_i32 t0; | ||
2107 | t0 = tcg_const_i32(crb); | ||
2108 | gen_helper_fpscr_setbit(cpu_env, t0); | ||
2109 | - tcg_temp_free_i32(t0); | ||
2110 | } | ||
2111 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
2112 | tcg_gen_trunc_tl_i32(cpu_crf[1], cpu_fpscr); | ||
2113 | @@ -XXX,XX +XXX,XX @@ static void gen_mtfsf(DisasContext *ctx) | ||
2114 | t1 = tcg_temp_new_i64(); | ||
2115 | get_fpr(t1, rB(ctx->opcode)); | ||
2116 | gen_helper_store_fpscr(cpu_env, t1, t0); | ||
2117 | - tcg_temp_free_i32(t0); | ||
2118 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
2119 | tcg_gen_trunc_tl_i32(cpu_crf[1], cpu_fpscr); | ||
2120 | tcg_gen_shri_i32(cpu_crf[1], cpu_crf[1], FPSCR_OX); | ||
2121 | } | ||
2122 | /* We can raise a deferred exception */ | ||
2123 | gen_helper_fpscr_check_status(cpu_env); | ||
2124 | - tcg_temp_free_i64(t1); | ||
2125 | } | ||
2126 | |||
2127 | /* mtfsfi */ | ||
2128 | @@ -XXX,XX +XXX,XX @@ static void gen_mtfsfi(DisasContext *ctx) | ||
2129 | t0 = tcg_const_i64(((uint64_t)FPIMM(ctx->opcode)) << (4 * sh)); | ||
2130 | t1 = tcg_const_i32(1 << sh); | ||
2131 | gen_helper_store_fpscr(cpu_env, t0, t1); | ||
2132 | - tcg_temp_free_i64(t0); | ||
2133 | - tcg_temp_free_i32(t1); | ||
2134 | if (unlikely(Rc(ctx->opcode) != 0)) { | ||
2135 | tcg_gen_trunc_tl_i32(cpu_crf[1], cpu_fpscr); | ||
2136 | tcg_gen_shri_i32(cpu_crf[1], cpu_crf[1], FPSCR_OX); | ||
2137 | @@ -XXX,XX +XXX,XX @@ static void gen_qemu_ld32fs(DisasContext *ctx, TCGv_i64 dest, TCGv addr) | ||
2138 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
2139 | tcg_gen_qemu_ld_i32(tmp, addr, ctx->mem_idx, DEF_MEMOP(MO_UL)); | ||
2140 | gen_helper_todouble(dest, tmp); | ||
2141 | - tcg_temp_free_i32(tmp); | ||
2142 | } | ||
2143 | |||
2144 | /* lfdepx (external PID lfdx) */ | ||
2145 | @@ -XXX,XX +XXX,XX @@ static void gen_lfdepx(DisasContext *ctx) | ||
2146 | gen_addr_reg_index(ctx, EA); | ||
2147 | tcg_gen_qemu_ld_i64(t0, EA, PPC_TLB_EPID_LOAD, DEF_MEMOP(MO_UQ)); | ||
2148 | set_fpr(rD(ctx->opcode), t0); | ||
2149 | - tcg_temp_free(EA); | ||
2150 | - tcg_temp_free_i64(t0); | ||
2151 | } | ||
2152 | |||
2153 | /* lfdp */ | ||
2154 | @@ -XXX,XX +XXX,XX @@ static void gen_lfdp(DisasContext *ctx) | ||
2155 | gen_qemu_ld64_i64(ctx, t0, EA); | ||
2156 | set_fpr(rD(ctx->opcode) + 1, t0); | ||
2157 | } | ||
2158 | - tcg_temp_free(EA); | ||
2159 | - tcg_temp_free_i64(t0); | ||
2160 | } | ||
2161 | |||
2162 | /* lfdpx */ | ||
2163 | @@ -XXX,XX +XXX,XX @@ static void gen_lfdpx(DisasContext *ctx) | ||
2164 | gen_qemu_ld64_i64(ctx, t0, EA); | ||
2165 | set_fpr(rD(ctx->opcode) + 1, t0); | ||
2166 | } | ||
2167 | - tcg_temp_free(EA); | ||
2168 | - tcg_temp_free_i64(t0); | ||
2169 | } | ||
2170 | |||
2171 | /* lfiwax */ | ||
2172 | @@ -XXX,XX +XXX,XX @@ static void gen_lfiwax(DisasContext *ctx) | ||
2173 | gen_qemu_ld32s(ctx, t0, EA); | ||
2174 | tcg_gen_ext_tl_i64(t1, t0); | ||
2175 | set_fpr(rD(ctx->opcode), t1); | ||
2176 | - tcg_temp_free(EA); | ||
2177 | - tcg_temp_free(t0); | ||
2178 | - tcg_temp_free_i64(t1); | ||
2179 | } | ||
2180 | |||
2181 | /* lfiwzx */ | ||
2182 | @@ -XXX,XX +XXX,XX @@ static void gen_lfiwzx(DisasContext *ctx) | ||
2183 | gen_addr_reg_index(ctx, EA); | ||
2184 | gen_qemu_ld32u_i64(ctx, t0, EA); | ||
2185 | set_fpr(rD(ctx->opcode), t0); | ||
2186 | - tcg_temp_free(EA); | ||
2187 | - tcg_temp_free_i64(t0); | ||
2188 | } | ||
2189 | |||
2190 | #define GEN_STXF(name, stop, opc2, opc3, type) \ | ||
2191 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name##x)(DisasContext *ctx) \ | ||
2192 | gen_addr_reg_index(ctx, EA); \ | ||
2193 | get_fpr(t0, rS(ctx->opcode)); \ | ||
2194 | gen_qemu_##stop(ctx, t0, EA); \ | ||
2195 | - tcg_temp_free(EA); \ | ||
2196 | - tcg_temp_free_i64(t0); \ | ||
2197 | } | ||
2198 | |||
2199 | static void gen_qemu_st32fs(DisasContext *ctx, TCGv_i64 src, TCGv addr) | ||
2200 | @@ -XXX,XX +XXX,XX @@ static void gen_qemu_st32fs(DisasContext *ctx, TCGv_i64 src, TCGv addr) | ||
2201 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
2202 | gen_helper_tosingle(tmp, src); | ||
2203 | tcg_gen_qemu_st_i32(tmp, addr, ctx->mem_idx, DEF_MEMOP(MO_UL)); | ||
2204 | - tcg_temp_free_i32(tmp); | ||
2205 | } | ||
2206 | |||
2207 | /* stfdepx (external PID lfdx) */ | ||
2208 | @@ -XXX,XX +XXX,XX @@ static void gen_stfdepx(DisasContext *ctx) | ||
2209 | gen_addr_reg_index(ctx, EA); | ||
2210 | get_fpr(t0, rD(ctx->opcode)); | ||
2211 | tcg_gen_qemu_st_i64(t0, EA, PPC_TLB_EPID_STORE, DEF_MEMOP(MO_UQ)); | ||
2212 | - tcg_temp_free(EA); | ||
2213 | - tcg_temp_free_i64(t0); | ||
2214 | } | ||
2215 | |||
2216 | /* stfdp */ | ||
2217 | @@ -XXX,XX +XXX,XX @@ static void gen_stfdp(DisasContext *ctx) | ||
2218 | get_fpr(t0, rD(ctx->opcode) + 1); | ||
2219 | gen_qemu_st64_i64(ctx, t0, EA); | ||
2220 | } | ||
2221 | - tcg_temp_free(EA); | ||
2222 | - tcg_temp_free_i64(t0); | ||
2223 | } | ||
2224 | |||
2225 | /* stfdpx */ | ||
2226 | @@ -XXX,XX +XXX,XX @@ static void gen_stfdpx(DisasContext *ctx) | ||
2227 | get_fpr(t0, rD(ctx->opcode) + 1); | ||
2228 | gen_qemu_st64_i64(ctx, t0, EA); | ||
2229 | } | ||
2230 | - tcg_temp_free(EA); | ||
2231 | - tcg_temp_free_i64(t0); | ||
2232 | } | ||
2233 | |||
2234 | /* Optional: */ | ||
2235 | @@ -XXX,XX +XXX,XX @@ static inline void gen_qemu_st32fiw(DisasContext *ctx, TCGv_i64 arg1, TCGv arg2) | ||
2236 | TCGv t0 = tcg_temp_new(); | ||
2237 | tcg_gen_trunc_i64_tl(t0, arg1), | ||
2238 | gen_qemu_st32(ctx, t0, arg2); | ||
2239 | - tcg_temp_free(t0); | ||
2240 | } | ||
2241 | /* stfiwx */ | ||
2242 | GEN_STXF(stfiw, st32fiw, 0x17, 0x1E, PPC_FLOAT_STFIWX); | ||
2243 | @@ -XXX,XX +XXX,XX @@ static bool do_lsfpsd(DisasContext *ctx, int rt, int ra, TCGv displ, | ||
2244 | if (update) { | ||
2245 | tcg_gen_mov_tl(cpu_gpr[ra], ea); | ||
2246 | } | ||
2247 | - tcg_temp_free_i64(t0); | ||
2248 | - tcg_temp_free(ea); | ||
2249 | return true; | ||
2250 | } | ||
2251 | |||
2252 | diff --git a/target/ppc/translate/spe-impl.c.inc b/target/ppc/translate/spe-impl.c.inc | ||
2253 | index XXXXXXX..XXXXXXX 100644 | ||
2254 | --- a/target/ppc/translate/spe-impl.c.inc | ||
2255 | +++ b/target/ppc/translate/spe-impl.c.inc | ||
2256 | @@ -XXX,XX +XXX,XX @@ static inline void gen_evmra(DisasContext *ctx) | ||
2257 | |||
2258 | /* spe_acc := tmp */ | ||
2259 | tcg_gen_st_i64(tmp, cpu_env, offsetof(CPUPPCState, spe_acc)); | ||
2260 | - tcg_temp_free_i64(tmp); | ||
2261 | |||
2262 | /* rD := rA */ | ||
2263 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]); | ||
2264 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2265 | tcg_gen_trunc_tl_i32(t0, cpu_gprh[rA(ctx->opcode)]); \ | ||
2266 | tcg_opi(t0, t0, rB(ctx->opcode)); \ | ||
2267 | tcg_gen_extu_i32_tl(cpu_gprh[rD(ctx->opcode)], t0); \ | ||
2268 | - \ | ||
2269 | - tcg_temp_free_i32(t0); \ | ||
2270 | } | ||
2271 | GEN_SPEOP_TCG_LOGIC_IMM2(evslwi, tcg_gen_shli_i32); | ||
2272 | GEN_SPEOP_TCG_LOGIC_IMM2(evsrwiu, tcg_gen_shri_i32); | ||
2273 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2274 | tcg_gen_trunc_tl_i32(t0, cpu_gprh[rA(ctx->opcode)]); \ | ||
2275 | tcg_op(t0, t0); \ | ||
2276 | tcg_gen_extu_i32_tl(cpu_gprh[rD(ctx->opcode)], t0); \ | ||
2277 | - \ | ||
2278 | - tcg_temp_free_i32(t0); \ | ||
2279 | } | ||
2280 | |||
2281 | GEN_SPEOP_ARITH1(evabs, tcg_gen_abs_i32); | ||
2282 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2283 | tcg_gen_trunc_tl_i32(t1, cpu_gprh[rB(ctx->opcode)]); \ | ||
2284 | tcg_op(t0, t0, t1); \ | ||
2285 | tcg_gen_extu_i32_tl(cpu_gprh[rD(ctx->opcode)], t0); \ | ||
2286 | - \ | ||
2287 | - tcg_temp_free_i32(t0); \ | ||
2288 | - tcg_temp_free_i32(t1); \ | ||
2289 | } | ||
2290 | |||
2291 | static inline void gen_op_evsrwu(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) | ||
2292 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evsrwu(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) | ||
2293 | gen_set_label(l1); | ||
2294 | tcg_gen_movi_i32(ret, 0); | ||
2295 | gen_set_label(l2); | ||
2296 | - tcg_temp_free_i32(t0); | ||
2297 | } | ||
2298 | GEN_SPEOP_ARITH2(evsrwu, gen_op_evsrwu); | ||
2299 | static inline void gen_op_evsrws(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) | ||
2300 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evsrws(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) | ||
2301 | gen_set_label(l1); | ||
2302 | tcg_gen_movi_i32(ret, 0); | ||
2303 | gen_set_label(l2); | ||
2304 | - tcg_temp_free_i32(t0); | ||
2305 | } | ||
2306 | GEN_SPEOP_ARITH2(evsrws, gen_op_evsrws); | ||
2307 | static inline void gen_op_evslw(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) | ||
2308 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evslw(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) | ||
2309 | gen_set_label(l1); | ||
2310 | tcg_gen_movi_i32(ret, 0); | ||
2311 | gen_set_label(l2); | ||
2312 | - tcg_temp_free_i32(t0); | ||
2313 | } | ||
2314 | GEN_SPEOP_ARITH2(evslw, gen_op_evslw); | ||
2315 | static inline void gen_op_evrlw(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) | ||
2316 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evrlw(TCGv_i32 ret, TCGv_i32 arg1, TCGv_i32 arg2) | ||
2317 | TCGv_i32 t0 = tcg_temp_new_i32(); | ||
2318 | tcg_gen_andi_i32(t0, arg2, 0x1F); | ||
2319 | tcg_gen_rotl_i32(ret, arg1, t0); | ||
2320 | - tcg_temp_free_i32(t0); | ||
2321 | } | ||
2322 | GEN_SPEOP_ARITH2(evrlw, gen_op_evrlw); | ||
2323 | static inline void gen_evmergehi(DisasContext *ctx) | ||
2324 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2325 | tcg_gen_trunc_tl_i32(t0, cpu_gprh[rB(ctx->opcode)]); \ | ||
2326 | tcg_op(t0, t0, rA(ctx->opcode)); \ | ||
2327 | tcg_gen_extu_i32_tl(cpu_gprh[rD(ctx->opcode)], t0); \ | ||
2328 | - \ | ||
2329 | - tcg_temp_free_i32(t0); \ | ||
2330 | } | ||
2331 | GEN_SPEOP_ARITH_IMM2(evaddiw, tcg_gen_addi_i32); | ||
2332 | GEN_SPEOP_ARITH_IMM2(evsubifw, tcg_gen_subi_i32); | ||
2333 | @@ -XXX,XX +XXX,XX @@ static inline void gen_evmergelohi(DisasContext *ctx) | ||
2334 | tcg_gen_mov_tl(tmp, cpu_gpr[rA(ctx->opcode)]); | ||
2335 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_gprh[rB(ctx->opcode)]); | ||
2336 | tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], tmp); | ||
2337 | - tcg_temp_free(tmp); | ||
2338 | } else { | ||
2339 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_gprh[rB(ctx->opcode)]); | ||
2340 | tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)]); | ||
2341 | @@ -XXX,XX +XXX,XX @@ static inline void gen_evsel(DisasContext *ctx) | ||
2342 | gen_set_label(l3); | ||
2343 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rB(ctx->opcode)]); | ||
2344 | gen_set_label(l4); | ||
2345 | - tcg_temp_free_i32(t0); | ||
2346 | } | ||
2347 | |||
2348 | static void gen_evsel0(DisasContext *ctx) | ||
2349 | @@ -XXX,XX +XXX,XX @@ static inline void gen_evmwumi(DisasContext *ctx) | ||
2350 | tcg_gen_mul_i64(t0, t0, t1); /* t0 := rA * rB */ | ||
2351 | |||
2352 | gen_store_gpr64(rD(ctx->opcode), t0); /* rD := t0 */ | ||
2353 | - | ||
2354 | - tcg_temp_free_i64(t0); | ||
2355 | - tcg_temp_free_i64(t1); | ||
2356 | } | ||
2357 | |||
2358 | static inline void gen_evmwumia(DisasContext *ctx) | ||
2359 | @@ -XXX,XX +XXX,XX @@ static inline void gen_evmwumia(DisasContext *ctx) | ||
2360 | /* acc := rD */ | ||
2361 | gen_load_gpr64(tmp, rD(ctx->opcode)); | ||
2362 | tcg_gen_st_i64(tmp, cpu_env, offsetof(CPUPPCState, spe_acc)); | ||
2363 | - tcg_temp_free_i64(tmp); | ||
2364 | } | ||
2365 | |||
2366 | static inline void gen_evmwumiaa(DisasContext *ctx) | ||
2367 | @@ -XXX,XX +XXX,XX @@ static inline void gen_evmwumiaa(DisasContext *ctx) | ||
2368 | |||
2369 | /* rD := acc */ | ||
2370 | gen_store_gpr64(rD(ctx->opcode), acc); | ||
2371 | - | ||
2372 | - tcg_temp_free_i64(acc); | ||
2373 | - tcg_temp_free_i64(tmp); | ||
2374 | } | ||
2375 | |||
2376 | static inline void gen_evmwsmi(DisasContext *ctx) | ||
2377 | @@ -XXX,XX +XXX,XX @@ static inline void gen_evmwsmi(DisasContext *ctx) | ||
2378 | tcg_gen_mul_i64(t0, t0, t1); /* t0 := rA * rB */ | ||
2379 | |||
2380 | gen_store_gpr64(rD(ctx->opcode), t0); /* rD := t0 */ | ||
2381 | - | ||
2382 | - tcg_temp_free_i64(t0); | ||
2383 | - tcg_temp_free_i64(t1); | ||
2384 | } | ||
2385 | |||
2386 | static inline void gen_evmwsmia(DisasContext *ctx) | ||
2387 | @@ -XXX,XX +XXX,XX @@ static inline void gen_evmwsmia(DisasContext *ctx) | ||
2388 | /* acc := rD */ | ||
2389 | gen_load_gpr64(tmp, rD(ctx->opcode)); | ||
2390 | tcg_gen_st_i64(tmp, cpu_env, offsetof(CPUPPCState, spe_acc)); | ||
2391 | - | ||
2392 | - tcg_temp_free_i64(tmp); | ||
2393 | } | ||
2394 | |||
2395 | static inline void gen_evmwsmiaa(DisasContext *ctx) | ||
2396 | @@ -XXX,XX +XXX,XX @@ static inline void gen_evmwsmiaa(DisasContext *ctx) | ||
2397 | |||
2398 | /* rD := acc */ | ||
2399 | gen_store_gpr64(rD(ctx->opcode), acc); | ||
2400 | - | ||
2401 | - tcg_temp_free_i64(acc); | ||
2402 | - tcg_temp_free_i64(tmp); | ||
2403 | } | ||
2404 | |||
2405 | GEN_SPE(evaddw, speundef, 0x00, 0x08, 0x00000000, 0xFFFFFFFF, PPC_SPE); //// | ||
2406 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evldd(DisasContext *ctx, TCGv addr) | ||
2407 | TCGv_i64 t0 = tcg_temp_new_i64(); | ||
2408 | gen_qemu_ld64_i64(ctx, t0, addr); | ||
2409 | gen_store_gpr64(rD(ctx->opcode), t0); | ||
2410 | - tcg_temp_free_i64(t0); | ||
2411 | } | ||
2412 | |||
2413 | static inline void gen_op_evldw(DisasContext *ctx, TCGv addr) | ||
2414 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evldh(DisasContext *ctx, TCGv addr) | ||
2415 | gen_addr_add(ctx, addr, addr, 2); | ||
2416 | gen_qemu_ld16u(ctx, t0, addr); | ||
2417 | tcg_gen_or_tl(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rD(ctx->opcode)], t0); | ||
2418 | - tcg_temp_free(t0); | ||
2419 | } | ||
2420 | |||
2421 | static inline void gen_op_evlhhesplat(DisasContext *ctx, TCGv addr) | ||
2422 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evlhhesplat(DisasContext *ctx, TCGv addr) | ||
2423 | tcg_gen_shli_tl(t0, t0, 16); | ||
2424 | tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], t0); | ||
2425 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], t0); | ||
2426 | - tcg_temp_free(t0); | ||
2427 | } | ||
2428 | |||
2429 | static inline void gen_op_evlhhousplat(DisasContext *ctx, TCGv addr) | ||
2430 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evlhhousplat(DisasContext *ctx, TCGv addr) | ||
2431 | gen_qemu_ld16u(ctx, t0, addr); | ||
2432 | tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], t0); | ||
2433 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], t0); | ||
2434 | - tcg_temp_free(t0); | ||
2435 | } | ||
2436 | |||
2437 | static inline void gen_op_evlhhossplat(DisasContext *ctx, TCGv addr) | ||
2438 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evlhhossplat(DisasContext *ctx, TCGv addr) | ||
2439 | gen_qemu_ld16s(ctx, t0, addr); | ||
2440 | tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], t0); | ||
2441 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], t0); | ||
2442 | - tcg_temp_free(t0); | ||
2443 | } | ||
2444 | |||
2445 | static inline void gen_op_evlwhe(DisasContext *ctx, TCGv addr) | ||
2446 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evlwhe(DisasContext *ctx, TCGv addr) | ||
2447 | gen_addr_add(ctx, addr, addr, 2); | ||
2448 | gen_qemu_ld16u(ctx, t0, addr); | ||
2449 | tcg_gen_shli_tl(cpu_gpr[rD(ctx->opcode)], t0, 16); | ||
2450 | - tcg_temp_free(t0); | ||
2451 | } | ||
2452 | |||
2453 | static inline void gen_op_evlwhou(DisasContext *ctx, TCGv addr) | ||
2454 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evlwwsplat(DisasContext *ctx, TCGv addr) | ||
2455 | gen_qemu_ld32u(ctx, t0, addr); | ||
2456 | tcg_gen_mov_tl(cpu_gprh[rD(ctx->opcode)], t0); | ||
2457 | tcg_gen_mov_tl(cpu_gpr[rD(ctx->opcode)], t0); | ||
2458 | - tcg_temp_free(t0); | ||
2459 | } | ||
2460 | |||
2461 | static inline void gen_op_evlwhsplat(DisasContext *ctx, TCGv addr) | ||
2462 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evlwhsplat(DisasContext *ctx, TCGv addr) | ||
2463 | gen_qemu_ld16u(ctx, t0, addr); | ||
2464 | tcg_gen_shli_tl(cpu_gpr[rD(ctx->opcode)], t0, 16); | ||
2465 | tcg_gen_or_tl(cpu_gpr[rD(ctx->opcode)], cpu_gprh[rD(ctx->opcode)], t0); | ||
2466 | - tcg_temp_free(t0); | ||
2467 | } | ||
2468 | |||
2469 | static inline void gen_op_evstdd(DisasContext *ctx, TCGv addr) | ||
2470 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evstdd(DisasContext *ctx, TCGv addr) | ||
2471 | TCGv_i64 t0 = tcg_temp_new_i64(); | ||
2472 | gen_load_gpr64(t0, rS(ctx->opcode)); | ||
2473 | gen_qemu_st64_i64(ctx, t0, addr); | ||
2474 | - tcg_temp_free_i64(t0); | ||
2475 | } | ||
2476 | |||
2477 | static inline void gen_op_evstdw(DisasContext *ctx, TCGv addr) | ||
2478 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evstdh(DisasContext *ctx, TCGv addr) | ||
2479 | gen_addr_add(ctx, addr, addr, 2); | ||
2480 | tcg_gen_shri_tl(t0, cpu_gpr[rS(ctx->opcode)], 16); | ||
2481 | gen_qemu_st16(ctx, t0, addr); | ||
2482 | - tcg_temp_free(t0); | ||
2483 | gen_addr_add(ctx, addr, addr, 2); | ||
2484 | gen_qemu_st16(ctx, cpu_gpr[rS(ctx->opcode)], addr); | ||
2485 | } | ||
2486 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_evstwhe(DisasContext *ctx, TCGv addr) | ||
2487 | gen_addr_add(ctx, addr, addr, 2); | ||
2488 | tcg_gen_shri_tl(t0, cpu_gpr[rS(ctx->opcode)], 16); | ||
2489 | gen_qemu_st16(ctx, t0, addr); | ||
2490 | - tcg_temp_free(t0); | ||
2491 | } | ||
2492 | |||
2493 | static inline void gen_op_evstwho(DisasContext *ctx, TCGv addr) | ||
2494 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2495 | gen_addr_reg_index(ctx, t0); \ | ||
2496 | } \ | ||
2497 | gen_op_##name(ctx, t0); \ | ||
2498 | - tcg_temp_free(t0); \ | ||
2499 | } | ||
2500 | |||
2501 | GEN_SPEOP_LDST(evldd, 0x00, 3); | ||
2502 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2503 | tcg_gen_trunc_tl_i32(t0, cpu_gpr[rB(ctx->opcode)]); \ | ||
2504 | gen_helper_##name(t0, cpu_env, t0); \ | ||
2505 | tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t0); \ | ||
2506 | - tcg_temp_free_i32(t0); \ | ||
2507 | } | ||
2508 | #define GEN_SPEFPUOP_CONV_32_64(name) \ | ||
2509 | static inline void gen_##name(DisasContext *ctx) \ | ||
2510 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2511 | gen_load_gpr64(t0, rB(ctx->opcode)); \ | ||
2512 | gen_helper_##name(t1, cpu_env, t0); \ | ||
2513 | tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t1); \ | ||
2514 | - tcg_temp_free_i64(t0); \ | ||
2515 | - tcg_temp_free_i32(t1); \ | ||
2516 | } | ||
2517 | #define GEN_SPEFPUOP_CONV_64_32(name) \ | ||
2518 | static inline void gen_##name(DisasContext *ctx) \ | ||
2519 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2520 | tcg_gen_trunc_tl_i32(t1, cpu_gpr[rB(ctx->opcode)]); \ | ||
2521 | gen_helper_##name(t0, cpu_env, t1); \ | ||
2522 | gen_store_gpr64(rD(ctx->opcode), t0); \ | ||
2523 | - tcg_temp_free_i64(t0); \ | ||
2524 | - tcg_temp_free_i32(t1); \ | ||
2525 | } | ||
2526 | #define GEN_SPEFPUOP_CONV_64_64(name) \ | ||
2527 | static inline void gen_##name(DisasContext *ctx) \ | ||
2528 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2529 | gen_load_gpr64(t0, rB(ctx->opcode)); \ | ||
2530 | gen_helper_##name(t0, cpu_env, t0); \ | ||
2531 | gen_store_gpr64(rD(ctx->opcode), t0); \ | ||
2532 | - tcg_temp_free_i64(t0); \ | ||
2533 | } | ||
2534 | #define GEN_SPEFPUOP_ARITH2_32_32(name) \ | ||
2535 | static inline void gen_##name(DisasContext *ctx) \ | ||
2536 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2537 | tcg_gen_trunc_tl_i32(t1, cpu_gpr[rB(ctx->opcode)]); \ | ||
2538 | gen_helper_##name(t0, cpu_env, t0, t1); \ | ||
2539 | tcg_gen_extu_i32_tl(cpu_gpr[rD(ctx->opcode)], t0); \ | ||
2540 | - \ | ||
2541 | - tcg_temp_free_i32(t0); \ | ||
2542 | - tcg_temp_free_i32(t1); \ | ||
2543 | } | ||
2544 | #define GEN_SPEFPUOP_ARITH2_64_64(name) \ | ||
2545 | static inline void gen_##name(DisasContext *ctx) \ | ||
2546 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2547 | gen_load_gpr64(t1, rB(ctx->opcode)); \ | ||
2548 | gen_helper_##name(t0, cpu_env, t0, t1); \ | ||
2549 | gen_store_gpr64(rD(ctx->opcode), t0); \ | ||
2550 | - tcg_temp_free_i64(t0); \ | ||
2551 | - tcg_temp_free_i64(t1); \ | ||
2552 | } | ||
2553 | #define GEN_SPEFPUOP_COMP_32(name) \ | ||
2554 | static inline void gen_##name(DisasContext *ctx) \ | ||
2555 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2556 | tcg_gen_trunc_tl_i32(t0, cpu_gpr[rA(ctx->opcode)]); \ | ||
2557 | tcg_gen_trunc_tl_i32(t1, cpu_gpr[rB(ctx->opcode)]); \ | ||
2558 | gen_helper_##name(cpu_crf[crfD(ctx->opcode)], cpu_env, t0, t1); \ | ||
2559 | - \ | ||
2560 | - tcg_temp_free_i32(t0); \ | ||
2561 | - tcg_temp_free_i32(t1); \ | ||
2562 | } | ||
2563 | #define GEN_SPEFPUOP_COMP_64(name) \ | ||
2564 | static inline void gen_##name(DisasContext *ctx) \ | ||
2565 | @@ -XXX,XX +XXX,XX @@ static inline void gen_##name(DisasContext *ctx) \ | ||
2566 | gen_load_gpr64(t0, rA(ctx->opcode)); \ | ||
2567 | gen_load_gpr64(t1, rB(ctx->opcode)); \ | ||
2568 | gen_helper_##name(cpu_crf[crfD(ctx->opcode)], cpu_env, t0, t1); \ | ||
2569 | - tcg_temp_free_i64(t0); \ | ||
2570 | - tcg_temp_free_i64(t1); \ | ||
2571 | } | ||
2572 | |||
2573 | /* Single precision floating-point vectors operations */ | ||
2574 | diff --git a/target/ppc/translate/storage-ctrl-impl.c.inc b/target/ppc/translate/storage-ctrl-impl.c.inc | ||
2575 | index XXXXXXX..XXXXXXX 100644 | ||
2576 | --- a/target/ppc/translate/storage-ctrl-impl.c.inc | ||
2577 | +++ b/target/ppc/translate/storage-ctrl-impl.c.inc | ||
2578 | @@ -XXX,XX +XXX,XX @@ static bool do_tlbie(DisasContext *ctx, arg_X_tlbie *a, bool local) | ||
2579 | TCGv t0 = tcg_temp_new(); | ||
2580 | tcg_gen_ext32u_tl(t0, cpu_gpr[rb]); | ||
2581 | gen_helper_tlbie(cpu_env, t0); | ||
2582 | - tcg_temp_free(t0); | ||
2583 | |||
2584 | #if defined(TARGET_PPC64) | ||
2585 | /* | ||
2586 | @@ -XXX,XX +XXX,XX @@ static bool do_tlbie(DisasContext *ctx, arg_X_tlbie *a, bool local) | ||
2587 | tcg_gen_ld_i32(t1, cpu_env, offsetof(CPUPPCState, tlb_need_flush)); | ||
2588 | tcg_gen_ori_i32(t1, t1, TLB_NEED_GLOBAL_FLUSH); | ||
2589 | tcg_gen_st_i32(t1, cpu_env, offsetof(CPUPPCState, tlb_need_flush)); | ||
2590 | - tcg_temp_free_i32(t1); | ||
2591 | |||
2592 | return true; | ||
2593 | #endif | ||
2594 | diff --git a/target/ppc/translate/vmx-impl.c.inc b/target/ppc/translate/vmx-impl.c.inc | ||
2595 | index XXXXXXX..XXXXXXX 100644 | ||
2596 | --- a/target/ppc/translate/vmx-impl.c.inc | ||
2597 | +++ b/target/ppc/translate/vmx-impl.c.inc | ||
2598 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2599 | gen_qemu_ld64_i64(ctx, avr, EA); \ | ||
2600 | set_avr64(rD(ctx->opcode), avr, false); \ | ||
2601 | } \ | ||
2602 | - tcg_temp_free(EA); \ | ||
2603 | - tcg_temp_free_i64(avr); \ | ||
2604 | } | ||
2605 | |||
2606 | #define GEN_VR_STX(name, opc2, opc3) \ | ||
2607 | @@ -XXX,XX +XXX,XX @@ static void gen_st##name(DisasContext *ctx) \ | ||
2608 | get_avr64(avr, rD(ctx->opcode), false); \ | ||
2609 | gen_qemu_st64_i64(ctx, avr, EA); \ | ||
2610 | } \ | ||
2611 | - tcg_temp_free(EA); \ | ||
2612 | - tcg_temp_free_i64(avr); \ | ||
2613 | } | ||
2614 | |||
2615 | #define GEN_VR_LVE(name, opc2, opc3, size) \ | ||
2616 | @@ -XXX,XX +XXX,XX @@ static void gen_lve##name(DisasContext *ctx) \ | ||
2617 | } \ | ||
2618 | rs = gen_avr_ptr(rS(ctx->opcode)); \ | ||
2619 | gen_helper_lve##name(cpu_env, rs, EA); \ | ||
2620 | - tcg_temp_free(EA); \ | ||
2621 | - tcg_temp_free_ptr(rs); \ | ||
2622 | } | ||
2623 | |||
2624 | #define GEN_VR_STVE(name, opc2, opc3, size) \ | ||
2625 | @@ -XXX,XX +XXX,XX @@ static void gen_stve##name(DisasContext *ctx) \ | ||
2626 | } \ | ||
2627 | rs = gen_avr_ptr(rS(ctx->opcode)); \ | ||
2628 | gen_helper_stve##name(cpu_env, rs, EA); \ | ||
2629 | - tcg_temp_free(EA); \ | ||
2630 | - tcg_temp_free_ptr(rs); \ | ||
2631 | } | ||
2632 | |||
2633 | GEN_VR_LDX(lvx, 0x07, 0x03); | ||
2634 | @@ -XXX,XX +XXX,XX @@ static void gen_mfvscr(DisasContext *ctx) | ||
2635 | gen_helper_mfvscr(t, cpu_env); | ||
2636 | tcg_gen_extu_i32_i64(avr, t); | ||
2637 | set_avr64(rD(ctx->opcode), avr, false); | ||
2638 | - tcg_temp_free_i32(t); | ||
2639 | - tcg_temp_free_i64(avr); | ||
2640 | } | ||
2641 | |||
2642 | static void gen_mtvscr(DisasContext *ctx) | ||
2643 | @@ -XXX,XX +XXX,XX @@ static void gen_mtvscr(DisasContext *ctx) | ||
2644 | |||
2645 | tcg_gen_ld_i32(val, cpu_env, bofs); | ||
2646 | gen_helper_mtvscr(cpu_env, val); | ||
2647 | - tcg_temp_free_i32(val); | ||
2648 | } | ||
2649 | |||
2650 | #define GEN_VX_VMUL10(name, add_cin, ret_carry) \ | ||
2651 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2652 | tcg_gen_add_i64(avr, t0, t2); \ | ||
2653 | set_avr64(rD(ctx->opcode), avr, true); \ | ||
2654 | } \ | ||
2655 | - \ | ||
2656 | - tcg_temp_free_i64(t0); \ | ||
2657 | - tcg_temp_free_i64(t1); \ | ||
2658 | - tcg_temp_free_i64(t2); \ | ||
2659 | - tcg_temp_free_i64(avr); \ | ||
2660 | - tcg_temp_free_i64(ten); \ | ||
2661 | - tcg_temp_free_i64(z); \ | ||
2662 | } \ | ||
2663 | |||
2664 | GEN_VX_VMUL10(vmul10uq, 0, 0); | ||
2665 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2666 | rb = gen_avr_ptr(rB(ctx->opcode)); \ | ||
2667 | rd = gen_avr_ptr(rD(ctx->opcode)); \ | ||
2668 | gen_helper_##name(rd, ra, rb); \ | ||
2669 | - tcg_temp_free_ptr(ra); \ | ||
2670 | - tcg_temp_free_ptr(rb); \ | ||
2671 | - tcg_temp_free_ptr(rd); \ | ||
2672 | } | ||
2673 | |||
2674 | #define GEN_VXFORM_TRANS(name, opc2, opc3) \ | ||
2675 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2676 | rb = gen_avr_ptr(rB(ctx->opcode)); \ | ||
2677 | rd = gen_avr_ptr(rD(ctx->opcode)); \ | ||
2678 | gen_helper_##name(cpu_env, rd, ra, rb); \ | ||
2679 | - tcg_temp_free_ptr(ra); \ | ||
2680 | - tcg_temp_free_ptr(rb); \ | ||
2681 | - tcg_temp_free_ptr(rd); \ | ||
2682 | } | ||
2683 | |||
2684 | #define GEN_VXFORM3(name, opc2, opc3) \ | ||
2685 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2686 | rc = gen_avr_ptr(rC(ctx->opcode)); \ | ||
2687 | rd = gen_avr_ptr(rD(ctx->opcode)); \ | ||
2688 | gen_helper_##name(rd, ra, rb, rc); \ | ||
2689 | - tcg_temp_free_ptr(ra); \ | ||
2690 | - tcg_temp_free_ptr(rb); \ | ||
2691 | - tcg_temp_free_ptr(rc); \ | ||
2692 | - tcg_temp_free_ptr(rd); \ | ||
2693 | } | ||
2694 | |||
2695 | /* | ||
2696 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2697 | } \ | ||
2698 | rb = gen_avr_ptr(rB(ctx->opcode)); \ | ||
2699 | gen_helper_##name(cpu_gpr[rD(ctx->opcode)], cpu_gpr[rA(ctx->opcode)], rb); \ | ||
2700 | - tcg_temp_free_ptr(rb); \ | ||
2701 | } | ||
2702 | |||
2703 | GEN_VXFORM_V(vaddubm, MO_8, tcg_gen_gvec_add, 0, 0); | ||
2704 | @@ -XXX,XX +XXX,XX @@ static void trans_vmrgew(DisasContext *ctx) | ||
2705 | get_avr64(avr, VA, false); | ||
2706 | tcg_gen_deposit_i64(avr, avr, tmp, 0, 32); | ||
2707 | set_avr64(VT, avr, false); | ||
2708 | - | ||
2709 | - tcg_temp_free_i64(tmp); | ||
2710 | - tcg_temp_free_i64(avr); | ||
2711 | } | ||
2712 | |||
2713 | static void trans_vmrgow(DisasContext *ctx) | ||
2714 | @@ -XXX,XX +XXX,XX @@ static void trans_vmrgow(DisasContext *ctx) | ||
2715 | get_avr64(t1, VA, false); | ||
2716 | tcg_gen_deposit_i64(avr, t0, t1, 32, 32); | ||
2717 | set_avr64(VT, avr, false); | ||
2718 | - | ||
2719 | - tcg_temp_free_i64(t0); | ||
2720 | - tcg_temp_free_i64(t1); | ||
2721 | - tcg_temp_free_i64(avr); | ||
2722 | } | ||
2723 | |||
2724 | /* | ||
2725 | @@ -XXX,XX +XXX,XX @@ static void trans_lvsl(DisasContext *ctx) | ||
2726 | */ | ||
2727 | tcg_gen_addi_i64(result, sh, 0x08090a0b0c0d0e0fULL); | ||
2728 | set_avr64(VT, result, false); | ||
2729 | - | ||
2730 | - tcg_temp_free_i64(result); | ||
2731 | - tcg_temp_free_i64(sh); | ||
2732 | - tcg_temp_free(EA); | ||
2733 | } | ||
2734 | |||
2735 | /* | ||
2736 | @@ -XXX,XX +XXX,XX @@ static void trans_lvsr(DisasContext *ctx) | ||
2737 | */ | ||
2738 | tcg_gen_subfi_i64(result, 0x18191a1b1c1d1e1fULL, sh); | ||
2739 | set_avr64(VT, result, false); | ||
2740 | - | ||
2741 | - tcg_temp_free_i64(result); | ||
2742 | - tcg_temp_free_i64(sh); | ||
2743 | - tcg_temp_free(EA); | ||
2744 | } | ||
2745 | |||
2746 | /* | ||
2747 | @@ -XXX,XX +XXX,XX @@ static void trans_vsl(DisasContext *ctx) | ||
2748 | tcg_gen_shl_i64(avr, avr, sh); | ||
2749 | tcg_gen_or_i64(avr, avr, carry); | ||
2750 | set_avr64(VT, avr, true); | ||
2751 | - | ||
2752 | - tcg_temp_free_i64(avr); | ||
2753 | - tcg_temp_free_i64(sh); | ||
2754 | - tcg_temp_free_i64(carry); | ||
2755 | - tcg_temp_free_i64(tmp); | ||
2756 | } | ||
2757 | |||
2758 | /* | ||
2759 | @@ -XXX,XX +XXX,XX @@ static void trans_vsr(DisasContext *ctx) | ||
2760 | tcg_gen_shr_i64(avr, avr, sh); | ||
2761 | tcg_gen_or_i64(avr, avr, carry); | ||
2762 | set_avr64(VT, avr, false); | ||
2763 | - | ||
2764 | - tcg_temp_free_i64(avr); | ||
2765 | - tcg_temp_free_i64(sh); | ||
2766 | - tcg_temp_free_i64(carry); | ||
2767 | - tcg_temp_free_i64(tmp); | ||
2768 | } | ||
2769 | |||
2770 | /* | ||
2771 | @@ -XXX,XX +XXX,XX @@ static void trans_vgbbd(DisasContext *ctx) | ||
2772 | for (j = 0; j < 2; j++) { | ||
2773 | set_avr64(VT, result[j], j); | ||
2774 | } | ||
2775 | - | ||
2776 | - tcg_temp_free_i64(tmp); | ||
2777 | - tcg_temp_free_i64(tcg_mask); | ||
2778 | - tcg_temp_free_i64(result[0]); | ||
2779 | - tcg_temp_free_i64(result[1]); | ||
2780 | - tcg_temp_free_i64(avr[0]); | ||
2781 | - tcg_temp_free_i64(avr[1]); | ||
2782 | } | ||
2783 | |||
2784 | /* | ||
2785 | @@ -XXX,XX +XXX,XX @@ static void trans_vclzw(DisasContext *ctx) | ||
2786 | tcg_gen_st_i32(tmp, cpu_env, | ||
2787 | offsetof(CPUPPCState, vsr[32 + VT].u64[0]) + i * 4); | ||
2788 | } | ||
2789 | - | ||
2790 | - tcg_temp_free_i32(tmp); | ||
2791 | } | ||
2792 | |||
2793 | /* | ||
2794 | @@ -XXX,XX +XXX,XX @@ static void trans_vclzd(DisasContext *ctx) | ||
2795 | get_avr64(avr, VB, false); | ||
2796 | tcg_gen_clzi_i64(avr, avr, 64); | ||
2797 | set_avr64(VT, avr, false); | ||
2798 | - | ||
2799 | - tcg_temp_free_i64(avr); | ||
2800 | } | ||
2801 | |||
2802 | GEN_VXFORM_V(vmuluwm, MO_32, tcg_gen_gvec_mul, 4, 2); | ||
2803 | @@ -XXX,XX +XXX,XX @@ static TCGv_vec do_vrl_mask_vec(unsigned vece, TCGv_vec vrb) | ||
2804 | /* negate the mask */ | ||
2805 | tcg_gen_xor_vec(vece, t0, t0, t2); | ||
2806 | |||
2807 | - tcg_temp_free_vec(t1); | ||
2808 | - tcg_temp_free_vec(t2); | ||
2809 | - | ||
2810 | return t0; | ||
2811 | } | ||
2812 | |||
2813 | @@ -XXX,XX +XXX,XX @@ static void gen_vrlnm_vec(unsigned vece, TCGv_vec vrt, TCGv_vec vra, | ||
2814 | /* Rotate and mask */ | ||
2815 | tcg_gen_rotlv_vec(vece, vrt, vra, n); | ||
2816 | tcg_gen_and_vec(vece, vrt, vrt, mask); | ||
2817 | - | ||
2818 | - tcg_temp_free_vec(n); | ||
2819 | - tcg_temp_free_vec(mask); | ||
2820 | } | ||
2821 | |||
2822 | static bool do_vrlnm(DisasContext *ctx, arg_VX *a, int vece) | ||
2823 | @@ -XXX,XX +XXX,XX @@ static void gen_vrlmi_vec(unsigned vece, TCGv_vec vrt, TCGv_vec vra, | ||
2824 | /* Rotate and insert */ | ||
2825 | tcg_gen_rotlv_vec(vece, tmp, vra, n); | ||
2826 | tcg_gen_bitsel_vec(vece, vrt, mask, tmp, vrt); | ||
2827 | - | ||
2828 | - tcg_temp_free_vec(n); | ||
2829 | - tcg_temp_free_vec(tmp); | ||
2830 | - tcg_temp_free_vec(mask); | ||
2831 | } | ||
2832 | |||
2833 | static bool do_vrlmi(DisasContext *ctx, arg_VX *a, int vece) | ||
2834 | @@ -XXX,XX +XXX,XX @@ static bool do_vector_shift_quad(DisasContext *ctx, arg_VX *a, bool right, | ||
2835 | } | ||
2836 | tcg_gen_or_i64(hi, hi, lo); | ||
2837 | set_avr64(a->vrt, hi, !right); | ||
2838 | - | ||
2839 | - tcg_temp_free_i64(hi); | ||
2840 | - tcg_temp_free_i64(lo); | ||
2841 | - tcg_temp_free_i64(t0); | ||
2842 | - tcg_temp_free_i64(t1); | ||
2843 | - tcg_temp_free_i64(n); | ||
2844 | - | ||
2845 | return true; | ||
2846 | } | ||
2847 | |||
2848 | @@ -XXX,XX +XXX,XX @@ static void do_vrlq_mask(TCGv_i64 mh, TCGv_i64 ml, TCGv_i64 b, TCGv_i64 e) | ||
2849 | |||
2850 | tcg_gen_xor_i64(mh, mh, t0); | ||
2851 | tcg_gen_xor_i64(ml, ml, t0); | ||
2852 | - | ||
2853 | - tcg_temp_free_i64(th); | ||
2854 | - tcg_temp_free_i64(tl); | ||
2855 | - tcg_temp_free_i64(t0); | ||
2856 | - tcg_temp_free_i64(t1); | ||
2857 | } | ||
2858 | |||
2859 | static bool do_vector_rotl_quad(DisasContext *ctx, arg_VX *a, bool mask, | ||
2860 | @@ -XXX,XX +XXX,XX @@ static bool do_vector_rotl_quad(DisasContext *ctx, arg_VX *a, bool mask, | ||
2861 | |||
2862 | set_avr64(a->vrt, t0, true); | ||
2863 | set_avr64(a->vrt, t1, false); | ||
2864 | - | ||
2865 | - tcg_temp_free_i64(ah); | ||
2866 | - tcg_temp_free_i64(al); | ||
2867 | - tcg_temp_free_i64(vrb); | ||
2868 | - tcg_temp_free_i64(n); | ||
2869 | - tcg_temp_free_i64(t0); | ||
2870 | - tcg_temp_free_i64(t1); | ||
2871 | - | ||
2872 | return true; | ||
2873 | } | ||
2874 | |||
2875 | @@ -XXX,XX +XXX,XX @@ static void glue(glue(gen_, NAME), _vec)(unsigned vece, TCGv_vec t, \ | ||
2876 | glue(glue(tcg_gen_, SAT), _vec)(VECE, t, a, b); \ | ||
2877 | tcg_gen_cmp_vec(TCG_COND_NE, VECE, x, x, t); \ | ||
2878 | tcg_gen_or_vec(VECE, sat, sat, x); \ | ||
2879 | - tcg_temp_free_vec(x); \ | ||
2880 | } \ | ||
2881 | static void glue(gen_, NAME)(DisasContext *ctx) \ | ||
2882 | { \ | ||
2883 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2884 | rb = gen_avr_ptr(rB(ctx->opcode)); \ | ||
2885 | rd = gen_avr_ptr(rD(ctx->opcode)); \ | ||
2886 | gen_helper_##opname(cpu_env, rd, ra, rb); \ | ||
2887 | - tcg_temp_free_ptr(ra); \ | ||
2888 | - tcg_temp_free_ptr(rb); \ | ||
2889 | - tcg_temp_free_ptr(rd); \ | ||
2890 | } | ||
2891 | |||
2892 | #define GEN_VXRFORM(name, opc2, opc3) \ | ||
2893 | @@ -XXX,XX +XXX,XX @@ static void do_vcmp_rc(int vrt) | ||
2894 | |||
2895 | tcg_gen_or_i64(tmp, set, clr); | ||
2896 | tcg_gen_extrl_i64_i32(cpu_crf[6], tmp); | ||
2897 | - | ||
2898 | - tcg_temp_free_i64(tmp); | ||
2899 | - tcg_temp_free_i64(set); | ||
2900 | - tcg_temp_free_i64(clr); | ||
2901 | } | ||
2902 | |||
2903 | static bool do_vcmp(DisasContext *ctx, arg_VC *a, TCGCond cond, int vece) | ||
2904 | @@ -XXX,XX +XXX,XX @@ static void gen_vcmpnez_vec(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b) | ||
2905 | |||
2906 | tcg_gen_or_vec(vece, t, t, t0); | ||
2907 | tcg_gen_or_vec(vece, t, t, t1); | ||
2908 | - | ||
2909 | - tcg_temp_free_vec(t0); | ||
2910 | - tcg_temp_free_vec(t1); | ||
2911 | } | ||
2912 | |||
2913 | static bool do_vcmpnez(DisasContext *ctx, arg_VC *a, int vece) | ||
2914 | @@ -XXX,XX +XXX,XX @@ static bool trans_VCMPEQUQ(DisasContext *ctx, arg_VC *a) | ||
2915 | tcg_gen_andi_i32(cpu_crf[6], cpu_crf[6], 0xa); | ||
2916 | tcg_gen_xori_i32(cpu_crf[6], cpu_crf[6], 0x2); | ||
2917 | } | ||
2918 | - | ||
2919 | - tcg_temp_free_i64(t0); | ||
2920 | - tcg_temp_free_i64(t1); | ||
2921 | - tcg_temp_free_i64(t2); | ||
2922 | - | ||
2923 | return true; | ||
2924 | } | ||
2925 | |||
2926 | @@ -XXX,XX +XXX,XX @@ static bool do_vcmpgtq(DisasContext *ctx, arg_VC *a, bool sign) | ||
2927 | tcg_gen_andi_i32(cpu_crf[6], cpu_crf[6], 0xa); | ||
2928 | tcg_gen_xori_i32(cpu_crf[6], cpu_crf[6], 0x2); | ||
2929 | } | ||
2930 | - | ||
2931 | - tcg_temp_free_i64(t0); | ||
2932 | - tcg_temp_free_i64(t1); | ||
2933 | - tcg_temp_free_i64(t2); | ||
2934 | - | ||
2935 | return true; | ||
2936 | } | ||
2937 | |||
2938 | @@ -XXX,XX +XXX,XX @@ static bool do_vcmpq(DisasContext *ctx, arg_VX_bf *a, bool sign) | ||
2939 | tcg_gen_br(done); | ||
2940 | |||
2941 | gen_set_label(done); | ||
2942 | - tcg_temp_free_i64(vra); | ||
2943 | - tcg_temp_free_i64(vrb); | ||
2944 | - | ||
2945 | return true; | ||
2946 | } | ||
2947 | |||
2948 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2949 | rb = gen_avr_ptr(rB(ctx->opcode)); \ | ||
2950 | rd = gen_avr_ptr(rD(ctx->opcode)); \ | ||
2951 | gen_helper_##name(rd, rb); \ | ||
2952 | - tcg_temp_free_ptr(rb); \ | ||
2953 | - tcg_temp_free_ptr(rd); \ | ||
2954 | } | ||
2955 | |||
2956 | #define GEN_VXFORM_NOA_ENV(name, opc2, opc3) \ | ||
2957 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2958 | rb = gen_avr_ptr(rB(ctx->opcode)); \ | ||
2959 | rd = gen_avr_ptr(rD(ctx->opcode)); \ | ||
2960 | gen_helper_##name(cpu_env, rd, rb); \ | ||
2961 | - tcg_temp_free_ptr(rb); \ | ||
2962 | - tcg_temp_free_ptr(rd); \ | ||
2963 | } | ||
2964 | |||
2965 | #define GEN_VXFORM_NOA_2(name, opc2, opc3, opc4) \ | ||
2966 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2967 | rb = gen_avr_ptr(rB(ctx->opcode)); \ | ||
2968 | rd = gen_avr_ptr(rD(ctx->opcode)); \ | ||
2969 | gen_helper_##name(rd, rb); \ | ||
2970 | - tcg_temp_free_ptr(rb); \ | ||
2971 | - tcg_temp_free_ptr(rd); \ | ||
2972 | } | ||
2973 | |||
2974 | #define GEN_VXFORM_NOA_3(name, opc2, opc3, opc4) \ | ||
2975 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2976 | } \ | ||
2977 | rb = gen_avr_ptr(rB(ctx->opcode)); \ | ||
2978 | gen_helper_##name(cpu_gpr[rD(ctx->opcode)], rb); \ | ||
2979 | - tcg_temp_free_ptr(rb); \ | ||
2980 | } | ||
2981 | GEN_VXFORM_NOA(vupkhsb, 7, 8); | ||
2982 | GEN_VXFORM_NOA(vupkhsh, 7, 9); | ||
2983 | @@ -XXX,XX +XXX,XX @@ static void gen_vprtyb_vec(unsigned vece, TCGv_vec t, TCGv_vec b) | ||
2984 | tcg_gen_xor_vec(vece, b, tmp, b); | ||
2985 | } | ||
2986 | tcg_gen_and_vec(vece, t, b, tcg_constant_vec_matching(t, vece, 1)); | ||
2987 | - tcg_temp_free_vec(tmp); | ||
2988 | } | ||
2989 | |||
2990 | /* vprtybw */ | ||
2991 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
2992 | rb = gen_avr_ptr(rB(ctx->opcode)); \ | ||
2993 | rd = gen_avr_ptr(rD(ctx->opcode)); \ | ||
2994 | gen_helper_##name(cpu_env, rd, rb, uimm); \ | ||
2995 | - tcg_temp_free_i32(uimm); \ | ||
2996 | - tcg_temp_free_ptr(rb); \ | ||
2997 | - tcg_temp_free_ptr(rd); \ | ||
2998 | } | ||
2999 | |||
3000 | #define GEN_VXFORM_UIMM_SPLAT(name, opc2, opc3, splat_max) \ | ||
3001 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
3002 | rb = gen_avr_ptr(rB(ctx->opcode)); \ | ||
3003 | rd = gen_avr_ptr(rD(ctx->opcode)); \ | ||
3004 | gen_helper_##name(rd, rb, t0); \ | ||
3005 | - tcg_temp_free_i32(t0); \ | ||
3006 | - tcg_temp_free_ptr(rb); \ | ||
3007 | - tcg_temp_free_ptr(rd); \ | ||
3008 | } | ||
3009 | |||
3010 | GEN_VXFORM_VSPLT(vspltb, MO_8, 6, 8); | ||
3011 | @@ -XXX,XX +XXX,XX @@ static bool trans_VGNB(DisasContext *ctx, arg_VX_n *a) | ||
3012 | tcg_gen_shri_i64(lo, lo, nbits); | ||
3013 | tcg_gen_or_i64(hi, hi, lo); | ||
3014 | tcg_gen_trunc_i64_tl(cpu_gpr[a->rt], hi); | ||
3015 | - | ||
3016 | - tcg_temp_free_i64(hi); | ||
3017 | - tcg_temp_free_i64(lo); | ||
3018 | - tcg_temp_free_i64(t0); | ||
3019 | - tcg_temp_free_i64(t1); | ||
3020 | - | ||
3021 | return true; | ||
3022 | } | ||
3023 | |||
3024 | @@ -XXX,XX +XXX,XX @@ static bool do_vextdx(DisasContext *ctx, arg_VA *a, int size, bool right, | ||
3025 | tcg_gen_subfi_tl(rc, 32 - size, rc); | ||
3026 | } | ||
3027 | gen_helper(cpu_env, vrt, vra, vrb, rc); | ||
3028 | - | ||
3029 | - tcg_temp_free_ptr(vrt); | ||
3030 | - tcg_temp_free_ptr(vra); | ||
3031 | - tcg_temp_free_ptr(vrb); | ||
3032 | - tcg_temp_free(rc); | ||
3033 | return true; | ||
3034 | } | ||
3035 | |||
3036 | @@ -XXX,XX +XXX,XX @@ static bool do_vinsx(DisasContext *ctx, int vrt, int size, bool right, TCGv ra, | ||
3037 | } | ||
3038 | |||
3039 | gen_helper(cpu_env, t, rb, idx); | ||
3040 | - | ||
3041 | - tcg_temp_free_ptr(t); | ||
3042 | - tcg_temp_free(idx); | ||
3043 | - | ||
3044 | return true; | ||
3045 | } | ||
3046 | |||
3047 | static bool do_vinsvx(DisasContext *ctx, int vrt, int size, bool right, TCGv ra, | ||
3048 | int vrb, void (*gen_helper)(TCGv_ptr, TCGv_ptr, TCGv_i64, TCGv)) | ||
3049 | { | ||
3050 | - bool ok; | ||
3051 | TCGv_i64 val; | ||
3052 | |||
3053 | val = tcg_temp_new_i64(); | ||
3054 | get_avr64(val, vrb, true); | ||
3055 | - ok = do_vinsx(ctx, vrt, size, right, ra, val, gen_helper); | ||
3056 | - | ||
3057 | - tcg_temp_free_i64(val); | ||
3058 | - return ok; | ||
3059 | + return do_vinsx(ctx, vrt, size, right, ra, val, gen_helper); | ||
3060 | } | ||
3061 | |||
3062 | static bool do_vinsx_VX(DisasContext *ctx, arg_VX *a, int size, bool right, | ||
3063 | void (*gen_helper)(TCGv_ptr, TCGv_ptr, TCGv_i64, TCGv)) | ||
3064 | { | ||
3065 | - bool ok; | ||
3066 | TCGv_i64 val; | ||
3067 | |||
3068 | REQUIRE_INSNS_FLAGS2(ctx, ISA310); | ||
3069 | @@ -XXX,XX +XXX,XX @@ static bool do_vinsx_VX(DisasContext *ctx, arg_VX *a, int size, bool right, | ||
3070 | val = tcg_temp_new_i64(); | ||
3071 | tcg_gen_extu_tl_i64(val, cpu_gpr[a->vrb]); | ||
3072 | |||
3073 | - ok = do_vinsx(ctx, a->vrt, size, right, cpu_gpr[a->vra], val, gen_helper); | ||
3074 | - | ||
3075 | - tcg_temp_free_i64(val); | ||
3076 | - return ok; | ||
3077 | + return do_vinsx(ctx, a->vrt, size, right, cpu_gpr[a->vra], val, gen_helper); | ||
3078 | } | ||
3079 | |||
3080 | static bool do_vinsvx_VX(DisasContext *ctx, arg_VX *a, int size, bool right, | ||
3081 | @@ -XXX,XX +XXX,XX @@ static bool do_vinsvx_VX(DisasContext *ctx, arg_VX *a, int size, bool right, | ||
3082 | static bool do_vins_VX_uim4(DisasContext *ctx, arg_VX_uim4 *a, int size, | ||
3083 | void (*gen_helper)(TCGv_ptr, TCGv_ptr, TCGv_i64, TCGv)) | ||
3084 | { | ||
3085 | - bool ok; | ||
3086 | TCGv_i64 val; | ||
3087 | |||
3088 | REQUIRE_INSNS_FLAGS2(ctx, ISA310); | ||
3089 | @@ -XXX,XX +XXX,XX @@ static bool do_vins_VX_uim4(DisasContext *ctx, arg_VX_uim4 *a, int size, | ||
3090 | val = tcg_temp_new_i64(); | ||
3091 | tcg_gen_extu_tl_i64(val, cpu_gpr[a->vrb]); | ||
3092 | |||
3093 | - ok = do_vinsx(ctx, a->vrt, size, false, tcg_constant_tl(a->uim), val, | ||
3094 | - gen_helper); | ||
3095 | - | ||
3096 | - tcg_temp_free_i64(val); | ||
3097 | - return ok; | ||
3098 | + return do_vinsx(ctx, a->vrt, size, false, tcg_constant_tl(a->uim), val, | ||
3099 | + gen_helper); | ||
3100 | } | ||
3101 | |||
3102 | static bool do_vinsert_VX_uim4(DisasContext *ctx, arg_VX_uim4 *a, int size, | ||
3103 | @@ -XXX,XX +XXX,XX @@ static void gen_vsldoi(DisasContext *ctx) | ||
3104 | rd = gen_avr_ptr(rD(ctx->opcode)); | ||
3105 | sh = tcg_const_i32(VSH(ctx->opcode)); | ||
3106 | gen_helper_vsldoi(rd, ra, rb, sh); | ||
3107 | - tcg_temp_free_ptr(ra); | ||
3108 | - tcg_temp_free_ptr(rb); | ||
3109 | - tcg_temp_free_ptr(rd); | ||
3110 | - tcg_temp_free_i32(sh); | ||
3111 | } | ||
3112 | |||
3113 | static bool trans_VSLDBI(DisasContext *ctx, arg_VN *a) | ||
3114 | @@ -XXX,XX +XXX,XX @@ static bool trans_VSLDBI(DisasContext *ctx, arg_VN *a) | ||
3115 | |||
3116 | tcg_gen_extract2_i64(t0, t1, t0, 64 - a->sh); | ||
3117 | tcg_gen_extract2_i64(t1, t2, t1, 64 - a->sh); | ||
3118 | - | ||
3119 | - tcg_temp_free_i64(t2); | ||
3120 | } | ||
3121 | |||
3122 | set_avr64(a->vrt, t0, true); | ||
3123 | set_avr64(a->vrt, t1, false); | ||
3124 | - | ||
3125 | - tcg_temp_free_i64(t0); | ||
3126 | - tcg_temp_free_i64(t1); | ||
3127 | - | ||
3128 | return true; | ||
3129 | } | ||
3130 | |||
3131 | @@ -XXX,XX +XXX,XX @@ static bool trans_VSRDBI(DisasContext *ctx, arg_VN *a) | ||
3132 | |||
3133 | tcg_gen_extract2_i64(t0, t0, t1, a->sh); | ||
3134 | tcg_gen_extract2_i64(t1, t1, t2, a->sh); | ||
3135 | - | ||
3136 | - tcg_temp_free_i64(t2); | ||
3137 | } | ||
3138 | |||
3139 | set_avr64(a->vrt, t0, false); | ||
3140 | set_avr64(a->vrt, t1, true); | ||
3141 | - | ||
3142 | - tcg_temp_free_i64(t0); | ||
3143 | - tcg_temp_free_i64(t1); | ||
3144 | - | ||
3145 | return true; | ||
3146 | } | ||
3147 | |||
3148 | @@ -XXX,XX +XXX,XX @@ static bool trans_VEXPANDQM(DisasContext *ctx, arg_VX_tb *a) | ||
3149 | tcg_gen_sari_i64(tmp, tmp, 63); | ||
3150 | set_avr64(a->vrt, tmp, false); | ||
3151 | set_avr64(a->vrt, tmp, true); | ||
3152 | - | ||
3153 | - tcg_temp_free_i64(tmp); | ||
3154 | return true; | ||
3155 | } | ||
3156 | |||
3157 | @@ -XXX,XX +XXX,XX @@ static bool do_vextractm(DisasContext *ctx, arg_VX_tb *a, unsigned vece) | ||
3158 | tcg_gen_shri_i64(hi, hi, 64 - elem_count_half); | ||
3159 | tcg_gen_extract2_i64(lo, lo, hi, 64 - elem_count_half); | ||
3160 | tcg_gen_trunc_i64_tl(cpu_gpr[a->vrt], lo); | ||
3161 | - | ||
3162 | - tcg_temp_free_i64(hi); | ||
3163 | - tcg_temp_free_i64(lo); | ||
3164 | - tcg_temp_free_i64(t0); | ||
3165 | - tcg_temp_free_i64(t1); | ||
3166 | - | ||
3167 | return true; | ||
3168 | } | ||
3169 | |||
3170 | @@ -XXX,XX +XXX,XX @@ static bool trans_VEXTRACTQM(DisasContext *ctx, arg_VX_tb *a) | ||
3171 | get_avr64(tmp, a->vrb, true); | ||
3172 | tcg_gen_shri_i64(tmp, tmp, 63); | ||
3173 | tcg_gen_trunc_i64_tl(cpu_gpr[a->vrt], tmp); | ||
3174 | - | ||
3175 | - tcg_temp_free_i64(tmp); | ||
3176 | - | ||
3177 | return true; | ||
3178 | } | ||
3179 | |||
3180 | @@ -XXX,XX +XXX,XX @@ static bool do_mtvsrm(DisasContext *ctx, arg_VX_tb *a, unsigned vece) | ||
3181 | |||
3182 | set_avr64(a->vrt, lo, false); | ||
3183 | set_avr64(a->vrt, hi, true); | ||
3184 | - | ||
3185 | - tcg_temp_free_i64(hi); | ||
3186 | - tcg_temp_free_i64(lo); | ||
3187 | - tcg_temp_free_i64(t0); | ||
3188 | - tcg_temp_free_i64(t1); | ||
3189 | - | ||
3190 | return true; | ||
3191 | } | ||
3192 | |||
3193 | @@ -XXX,XX +XXX,XX @@ static bool trans_MTVSRQM(DisasContext *ctx, arg_VX_tb *a) | ||
3194 | tcg_gen_sextract_i64(tmp, tmp, 0, 1); | ||
3195 | set_avr64(a->vrt, tmp, false); | ||
3196 | set_avr64(a->vrt, tmp, true); | ||
3197 | - | ||
3198 | - tcg_temp_free_i64(tmp); | ||
3199 | - | ||
3200 | return true; | ||
3201 | } | ||
3202 | |||
3203 | @@ -XXX,XX +XXX,XX @@ static bool do_vcntmb(DisasContext *ctx, arg_VX_mp *a, int vece) | ||
3204 | |||
3205 | tcg_gen_shli_i64(rt, rt, TARGET_LONG_BITS - 8 + vece); | ||
3206 | tcg_gen_trunc_i64_tl(cpu_gpr[a->rt], rt); | ||
3207 | - | ||
3208 | - tcg_temp_free_i64(vrb); | ||
3209 | - tcg_temp_free_i64(rt); | ||
3210 | - | ||
3211 | return true; | ||
3212 | } | ||
3213 | |||
3214 | @@ -XXX,XX +XXX,XX @@ static bool do_vstri(DisasContext *ctx, arg_VX_tb_rc *a, | ||
3215 | } else { | ||
3216 | TCGv_i32 discard = tcg_temp_new_i32(); | ||
3217 | gen_helper(discard, vrt, vrb); | ||
3218 | - tcg_temp_free_i32(discard); | ||
3219 | } | ||
3220 | - | ||
3221 | - tcg_temp_free_ptr(vrt); | ||
3222 | - tcg_temp_free_ptr(vrb); | ||
3223 | - | ||
3224 | return true; | ||
3225 | } | ||
3226 | |||
3227 | @@ -XXX,XX +XXX,XX @@ static bool do_vclrb(DisasContext *ctx, arg_VX *a, bool right) | ||
3228 | get_avr64(tmp, a->vra, false); | ||
3229 | tcg_gen_and_i64(tmp, tmp, ml); | ||
3230 | set_avr64(a->vrt, tmp, false); | ||
3231 | - | ||
3232 | - tcg_temp_free_i64(rb); | ||
3233 | - tcg_temp_free_i64(mh); | ||
3234 | - tcg_temp_free_i64(ml); | ||
3235 | - tcg_temp_free_i64(tmp); | ||
3236 | - | ||
3237 | return true; | ||
3238 | } | ||
3239 | |||
3240 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name0##_##name1)(DisasContext *ctx) \ | ||
3241 | } else { \ | ||
3242 | gen_helper_##name0(cpu_env, rd, ra, rb, rc); \ | ||
3243 | } \ | ||
3244 | - tcg_temp_free_ptr(ra); \ | ||
3245 | - tcg_temp_free_ptr(rb); \ | ||
3246 | - tcg_temp_free_ptr(rc); \ | ||
3247 | - tcg_temp_free_ptr(rd); \ | ||
3248 | } | ||
3249 | |||
3250 | GEN_VAFORM_PAIRED(vmaddfp, vnmsubfp, 23) | ||
3251 | @@ -XXX,XX +XXX,XX @@ static bool do_va_helper(DisasContext *ctx, arg_VA *a, | ||
3252 | vrb = gen_avr_ptr(a->vrb); | ||
3253 | vrc = gen_avr_ptr(a->rc); | ||
3254 | gen_helper(vrt, vra, vrb, vrc); | ||
3255 | - tcg_temp_free_ptr(vrt); | ||
3256 | - tcg_temp_free_ptr(vra); | ||
3257 | - tcg_temp_free_ptr(vrb); | ||
3258 | - tcg_temp_free_ptr(vrc); | ||
3259 | - | ||
3260 | return true; | ||
3261 | } | ||
3262 | |||
3263 | @@ -XXX,XX +XXX,XX @@ static bool do_va_env_helper(DisasContext *ctx, arg_VA *a, | ||
3264 | vrb = gen_avr_ptr(a->vrb); | ||
3265 | vrc = gen_avr_ptr(a->rc); | ||
3266 | gen_helper(cpu_env, vrt, vra, vrb, vrc); | ||
3267 | - tcg_temp_free_ptr(vrt); | ||
3268 | - tcg_temp_free_ptr(vra); | ||
3269 | - tcg_temp_free_ptr(vrb); | ||
3270 | - tcg_temp_free_ptr(vrc); | ||
3271 | - | ||
3272 | return true; | ||
3273 | } | ||
3274 | |||
3275 | @@ -XXX,XX +XXX,XX @@ static bool trans_VEXTSD2Q(DisasContext *ctx, arg_VX_tb *a) | ||
3276 | set_avr64(a->vrt, tmp, false); | ||
3277 | tcg_gen_sari_i64(tmp, tmp, 63); | ||
3278 | set_avr64(a->vrt, tmp, true); | ||
3279 | - | ||
3280 | - tcg_temp_free_i64(tmp); | ||
3281 | return true; | ||
3282 | } | ||
3283 | |||
3284 | @@ -XXX,XX +XXX,XX @@ static void gen_##op(DisasContext *ctx) \ | ||
3285 | ps = tcg_const_i32((ctx->opcode & 0x200) != 0); \ | ||
3286 | \ | ||
3287 | gen_helper_##op(cpu_crf[6], rd, ra, rb, ps); \ | ||
3288 | - \ | ||
3289 | - tcg_temp_free_ptr(ra); \ | ||
3290 | - tcg_temp_free_ptr(rb); \ | ||
3291 | - tcg_temp_free_ptr(rd); \ | ||
3292 | - tcg_temp_free_i32(ps); \ | ||
3293 | } | ||
3294 | |||
3295 | #define GEN_BCD2(op) \ | ||
3296 | @@ -XXX,XX +XXX,XX @@ static void gen_##op(DisasContext *ctx) \ | ||
3297 | ps = tcg_const_i32((ctx->opcode & 0x200) != 0); \ | ||
3298 | \ | ||
3299 | gen_helper_##op(cpu_crf[6], rd, rb, ps); \ | ||
3300 | - \ | ||
3301 | - tcg_temp_free_ptr(rb); \ | ||
3302 | - tcg_temp_free_ptr(rd); \ | ||
3303 | - tcg_temp_free_i32(ps); \ | ||
3304 | } | ||
3305 | |||
3306 | GEN_BCD(bcdadd) | ||
3307 | @@ -XXX,XX +XXX,XX @@ static void gen_vsbox(DisasContext *ctx) | ||
3308 | ra = gen_avr_ptr(rA(ctx->opcode)); | ||
3309 | rd = gen_avr_ptr(rD(ctx->opcode)); | ||
3310 | gen_helper_vsbox(rd, ra); | ||
3311 | - tcg_temp_free_ptr(ra); | ||
3312 | - tcg_temp_free_ptr(rd); | ||
3313 | } | ||
3314 | |||
3315 | GEN_VXFORM(vcipher, 4, 20) | ||
3316 | @@ -XXX,XX +XXX,XX @@ static void gen_##op(DisasContext *ctx) \ | ||
3317 | rd = gen_avr_ptr(rD(ctx->opcode)); \ | ||
3318 | st_six = tcg_const_i32(rB(ctx->opcode)); \ | ||
3319 | gen_helper_##op(rd, ra, st_six); \ | ||
3320 | - tcg_temp_free_ptr(ra); \ | ||
3321 | - tcg_temp_free_ptr(rd); \ | ||
3322 | - tcg_temp_free_i32(st_six); \ | ||
3323 | } | ||
3324 | |||
3325 | VSHASIGMA(vshasigmaw) | ||
3326 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMSUMUDM(DisasContext *ctx, arg_VA *a) | ||
3327 | |||
3328 | set_avr64(a->vrt, rl, false); | ||
3329 | set_avr64(a->vrt, rh, true); | ||
3330 | - | ||
3331 | - tcg_temp_free_i64(rl); | ||
3332 | - tcg_temp_free_i64(rh); | ||
3333 | - tcg_temp_free_i64(src1); | ||
3334 | - tcg_temp_free_i64(src2); | ||
3335 | - | ||
3336 | return true; | ||
3337 | } | ||
3338 | |||
3339 | @@ -XXX,XX +XXX,XX @@ static bool trans_VMSUMCUD(DisasContext *ctx, arg_VA *a) | ||
3340 | /* Discard 64 more bits to complete the CHOP128(temp >> 128) */ | ||
3341 | set_avr64(a->vrt, tmp0, false); | ||
3342 | set_avr64(a->vrt, zero, true); | ||
3343 | - | ||
3344 | - tcg_temp_free_i64(tmp0); | ||
3345 | - tcg_temp_free_i64(tmp1); | ||
3346 | - tcg_temp_free_i64(prod1h); | ||
3347 | - tcg_temp_free_i64(prod1l); | ||
3348 | - tcg_temp_free_i64(prod0h); | ||
3349 | - tcg_temp_free_i64(prod0l); | ||
3350 | - | ||
3351 | return true; | ||
3352 | } | ||
3353 | |||
3354 | @@ -XXX,XX +XXX,XX @@ static bool do_vx_helper(DisasContext *ctx, arg_VX *a, | ||
3355 | rb = gen_avr_ptr(a->vrb); | ||
3356 | rd = gen_avr_ptr(a->vrt); | ||
3357 | gen_helper(rd, ra, rb); | ||
3358 | - tcg_temp_free_ptr(ra); | ||
3359 | - tcg_temp_free_ptr(rb); | ||
3360 | - tcg_temp_free_ptr(rd); | ||
3361 | - | ||
3362 | return true; | ||
3363 | } | ||
3364 | |||
3365 | @@ -XXX,XX +XXX,XX @@ static bool do_vx_vmuleo(DisasContext *ctx, arg_VX *a, bool even, | ||
3366 | gen_mul(vrt0, vrt1, vra, vrb); | ||
3367 | set_avr64(a->vrt, vrt0, false); | ||
3368 | set_avr64(a->vrt, vrt1, true); | ||
3369 | - | ||
3370 | - tcg_temp_free_i64(vra); | ||
3371 | - tcg_temp_free_i64(vrb); | ||
3372 | - tcg_temp_free_i64(vrt0); | ||
3373 | - tcg_temp_free_i64(vrt1); | ||
3374 | - | ||
3375 | return true; | ||
3376 | } | ||
3377 | |||
3378 | @@ -XXX,XX +XXX,XX @@ static void do_vx_vmulhw_i64(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b, bool sign) | ||
3379 | |||
3380 | tcg_gen_shri_i64(lh, lh, 32); | ||
3381 | tcg_gen_deposit_i64(t, hh, lh, 0, 32); | ||
3382 | - | ||
3383 | - tcg_temp_free_i64(hh); | ||
3384 | - tcg_temp_free_i64(lh); | ||
3385 | - tcg_temp_free_i64(temp); | ||
3386 | } | ||
3387 | |||
3388 | static void do_vx_vmulhd_i64(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b, bool sign) | ||
3389 | @@ -XXX,XX +XXX,XX @@ static void do_vx_vmulhd_i64(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b, bool sign) | ||
3390 | } else { | ||
3391 | tcg_gen_mulu2_i64(tlow, t, a, b); | ||
3392 | } | ||
3393 | - | ||
3394 | - tcg_temp_free_i64(tlow); | ||
3395 | } | ||
3396 | |||
3397 | static bool do_vx_mulh(DisasContext *ctx, arg_VX *a, bool sign, | ||
3398 | @@ -XXX,XX +XXX,XX @@ static bool do_vx_mulh(DisasContext *ctx, arg_VX *a, bool sign, | ||
3399 | |||
3400 | set_avr64(a->vrt, vrt, i); | ||
3401 | } | ||
3402 | - | ||
3403 | - tcg_temp_free_i64(vra); | ||
3404 | - tcg_temp_free_i64(vrb); | ||
3405 | - tcg_temp_free_i64(vrt); | ||
3406 | - | ||
3407 | return true; | ||
3408 | - | ||
3409 | } | ||
3410 | |||
3411 | TRANS(VMULHSW, do_vx_mulh, true , do_vx_vmulhw_i64) | ||
3412 | @@ -XXX,XX +XXX,XX @@ static void do_vavg(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b, | ||
3413 | gen_shr_vec(vece, b, b, 1); | ||
3414 | tcg_gen_add_vec(vece, t, a, b); | ||
3415 | tcg_gen_add_vec(vece, t, t, tmp); | ||
3416 | - tcg_temp_free_vec(tmp); | ||
3417 | } | ||
3418 | |||
3419 | QEMU_FLATTEN | ||
3420 | @@ -XXX,XX +XXX,XX @@ static void NAME(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b) \ | ||
3421 | tcg_gen_movi_i32(t1, 0); \ | ||
3422 | tcg_gen_movcond_i32(TCG_COND_NE, b, t0, t1, t0, b); \ | ||
3423 | DIV(t, a, b); \ | ||
3424 | - tcg_temp_free_i32(t0); \ | ||
3425 | - tcg_temp_free_i32(t1); \ | ||
3426 | } | ||
3427 | |||
3428 | #define DIVU64(NAME, DIV) \ | ||
3429 | @@ -XXX,XX +XXX,XX @@ static void NAME(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b) \ | ||
3430 | tcg_gen_movi_i64(t1, 0); \ | ||
3431 | tcg_gen_movcond_i64(TCG_COND_NE, b, t0, t1, t0, b); \ | ||
3432 | DIV(t, a, b); \ | ||
3433 | - tcg_temp_free_i64(t0); \ | ||
3434 | - tcg_temp_free_i64(t1); \ | ||
3435 | } | ||
3436 | |||
3437 | DIVS32(do_divsw, tcg_gen_div_i32) | ||
3438 | @@ -XXX,XX +XXX,XX @@ static void do_dives_i32(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b) | ||
3439 | |||
3440 | /* if quotient doesn't fit in 32 bits the result is undefined */ | ||
3441 | tcg_gen_extrl_i64_i32(t, val1); | ||
3442 | - | ||
3443 | - tcg_temp_free_i64(val1); | ||
3444 | - tcg_temp_free_i64(val2); | ||
3445 | } | ||
3446 | |||
3447 | static void do_diveu_i32(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b) | ||
3448 | @@ -XXX,XX +XXX,XX @@ static void do_diveu_i32(TCGv_i32 t, TCGv_i32 a, TCGv_i32 b) | ||
3449 | |||
3450 | /* if quotient doesn't fit in 32 bits the result is undefined */ | ||
3451 | tcg_gen_extrl_i64_i32(t, val1); | ||
3452 | - | ||
3453 | - tcg_temp_free_i64(val1); | ||
3454 | - tcg_temp_free_i64(val2); | ||
3455 | } | ||
3456 | |||
3457 | DIVS32(do_divesw, do_dives_i32) | ||
3458 | diff --git a/target/ppc/translate/vsx-impl.c.inc b/target/ppc/translate/vsx-impl.c.inc | ||
3459 | index XXXXXXX..XXXXXXX 100644 | ||
3460 | --- a/target/ppc/translate/vsx-impl.c.inc | ||
3461 | +++ b/target/ppc/translate/vsx-impl.c.inc | ||
3462 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3463 | gen_qemu_##operation(ctx, t0, EA); \ | ||
3464 | set_cpu_vsr(xT(ctx->opcode), t0, true); \ | ||
3465 | /* NOTE: cpu_vsrl is undefined */ \ | ||
3466 | - tcg_temp_free(EA); \ | ||
3467 | - tcg_temp_free_i64(t0); \ | ||
3468 | } | ||
3469 | |||
3470 | VSX_LOAD_SCALAR(lxsdx, ld64_i64) | ||
3471 | @@ -XXX,XX +XXX,XX @@ static void gen_lxvd2x(DisasContext *ctx) | ||
3472 | tcg_gen_addi_tl(EA, EA, 8); | ||
3473 | gen_qemu_ld64_i64(ctx, t0, EA); | ||
3474 | set_cpu_vsr(xT(ctx->opcode), t0, false); | ||
3475 | - tcg_temp_free(EA); | ||
3476 | - tcg_temp_free_i64(t0); | ||
3477 | } | ||
3478 | |||
3479 | static void gen_lxvw4x(DisasContext *ctx) | ||
3480 | @@ -XXX,XX +XXX,XX @@ static void gen_lxvw4x(DisasContext *ctx) | ||
3481 | tcg_gen_qemu_ld_i64(t0, EA, ctx->mem_idx, MO_LEUQ); | ||
3482 | tcg_gen_shri_i64(t1, t0, 32); | ||
3483 | tcg_gen_deposit_i64(xtl, t1, t0, 32, 32); | ||
3484 | - tcg_temp_free_i64(t0); | ||
3485 | - tcg_temp_free_i64(t1); | ||
3486 | } else { | ||
3487 | tcg_gen_qemu_ld_i64(xth, EA, ctx->mem_idx, MO_BEUQ); | ||
3488 | tcg_gen_addi_tl(EA, EA, 8); | ||
3489 | @@ -XXX,XX +XXX,XX @@ static void gen_lxvw4x(DisasContext *ctx) | ||
3490 | } | ||
3491 | set_cpu_vsr(xT(ctx->opcode), xth, true); | ||
3492 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
3493 | - tcg_temp_free(EA); | ||
3494 | - tcg_temp_free_i64(xth); | ||
3495 | - tcg_temp_free_i64(xtl); | ||
3496 | } | ||
3497 | |||
3498 | static void gen_lxvwsx(DisasContext *ctx) | ||
3499 | @@ -XXX,XX +XXX,XX @@ static void gen_lxvwsx(DisasContext *ctx) | ||
3500 | data = tcg_temp_new_i32(); | ||
3501 | tcg_gen_qemu_ld_i32(data, EA, ctx->mem_idx, DEF_MEMOP(MO_UL)); | ||
3502 | tcg_gen_gvec_dup_i32(MO_UL, vsr_full_offset(xT(ctx->opcode)), 16, 16, data); | ||
3503 | - | ||
3504 | - tcg_temp_free(EA); | ||
3505 | - tcg_temp_free_i32(data); | ||
3506 | } | ||
3507 | |||
3508 | static void gen_lxvdsx(DisasContext *ctx) | ||
3509 | @@ -XXX,XX +XXX,XX @@ static void gen_lxvdsx(DisasContext *ctx) | ||
3510 | data = tcg_temp_new_i64(); | ||
3511 | tcg_gen_qemu_ld_i64(data, EA, ctx->mem_idx, DEF_MEMOP(MO_UQ)); | ||
3512 | tcg_gen_gvec_dup_i64(MO_UQ, vsr_full_offset(xT(ctx->opcode)), 16, 16, data); | ||
3513 | - | ||
3514 | - tcg_temp_free(EA); | ||
3515 | - tcg_temp_free_i64(data); | ||
3516 | } | ||
3517 | |||
3518 | static void gen_bswap16x8(TCGv_i64 outh, TCGv_i64 outl, | ||
3519 | @@ -XXX,XX +XXX,XX @@ static void gen_bswap16x8(TCGv_i64 outh, TCGv_i64 outl, | ||
3520 | tcg_gen_shri_i64(t1, inl, 8); | ||
3521 | tcg_gen_and_i64(t1, t1, mask); | ||
3522 | tcg_gen_or_i64(outl, t0, t1); | ||
3523 | - | ||
3524 | - tcg_temp_free_i64(t0); | ||
3525 | - tcg_temp_free_i64(t1); | ||
3526 | - tcg_temp_free_i64(mask); | ||
3527 | } | ||
3528 | |||
3529 | static void gen_bswap32x4(TCGv_i64 outh, TCGv_i64 outl, | ||
3530 | @@ -XXX,XX +XXX,XX @@ static void gen_bswap32x4(TCGv_i64 outh, TCGv_i64 outl, | ||
3531 | tcg_gen_deposit_i64(outh, outh, hi, 32, 32); | ||
3532 | tcg_gen_shri_i64(outl, lo, 32); | ||
3533 | tcg_gen_deposit_i64(outl, outl, lo, 32, 32); | ||
3534 | - | ||
3535 | - tcg_temp_free_i64(hi); | ||
3536 | - tcg_temp_free_i64(lo); | ||
3537 | } | ||
3538 | + | ||
3539 | static void gen_lxvh8x(DisasContext *ctx) | ||
3540 | { | ||
3541 | TCGv EA; | ||
3542 | @@ -XXX,XX +XXX,XX @@ static void gen_lxvh8x(DisasContext *ctx) | ||
3543 | } | ||
3544 | set_cpu_vsr(xT(ctx->opcode), xth, true); | ||
3545 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
3546 | - tcg_temp_free(EA); | ||
3547 | - tcg_temp_free_i64(xth); | ||
3548 | - tcg_temp_free_i64(xtl); | ||
3549 | } | ||
3550 | |||
3551 | static void gen_lxvb16x(DisasContext *ctx) | ||
3552 | @@ -XXX,XX +XXX,XX @@ static void gen_lxvb16x(DisasContext *ctx) | ||
3553 | tcg_gen_qemu_ld_i64(xtl, EA, ctx->mem_idx, MO_BEUQ); | ||
3554 | set_cpu_vsr(xT(ctx->opcode), xth, true); | ||
3555 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
3556 | - tcg_temp_free(EA); | ||
3557 | - tcg_temp_free_i64(xth); | ||
3558 | - tcg_temp_free_i64(xtl); | ||
3559 | } | ||
3560 | |||
3561 | #ifdef TARGET_PPC64 | ||
3562 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3563 | gen_set_access_type(ctx, ACCESS_INT); \ | ||
3564 | gen_addr_register(ctx, EA); \ | ||
3565 | gen_helper_##name(cpu_env, EA, xt, cpu_gpr[rB(ctx->opcode)]); \ | ||
3566 | - tcg_temp_free(EA); \ | ||
3567 | - tcg_temp_free_ptr(xt); \ | ||
3568 | } | ||
3569 | |||
3570 | VSX_VECTOR_LOAD_STORE_LENGTH(lxvl) | ||
3571 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3572 | gen_addr_reg_index(ctx, EA); \ | ||
3573 | get_cpu_vsr(t0, xS(ctx->opcode), true); \ | ||
3574 | gen_qemu_##operation(ctx, t0, EA); \ | ||
3575 | - tcg_temp_free(EA); \ | ||
3576 | - tcg_temp_free_i64(t0); \ | ||
3577 | } | ||
3578 | |||
3579 | VSX_STORE_SCALAR(stxsdx, st64_i64) | ||
3580 | @@ -XXX,XX +XXX,XX @@ static void gen_stxvd2x(DisasContext *ctx) | ||
3581 | tcg_gen_addi_tl(EA, EA, 8); | ||
3582 | get_cpu_vsr(t0, xS(ctx->opcode), false); | ||
3583 | gen_qemu_st64_i64(ctx, t0, EA); | ||
3584 | - tcg_temp_free(EA); | ||
3585 | - tcg_temp_free_i64(t0); | ||
3586 | } | ||
3587 | |||
3588 | static void gen_stxvw4x(DisasContext *ctx) | ||
3589 | @@ -XXX,XX +XXX,XX @@ static void gen_stxvw4x(DisasContext *ctx) | ||
3590 | tcg_gen_shri_i64(t0, xsl, 32); | ||
3591 | tcg_gen_deposit_i64(t1, t0, xsl, 32, 32); | ||
3592 | tcg_gen_qemu_st_i64(t1, EA, ctx->mem_idx, MO_LEUQ); | ||
3593 | - tcg_temp_free_i64(t0); | ||
3594 | - tcg_temp_free_i64(t1); | ||
3595 | } else { | ||
3596 | tcg_gen_qemu_st_i64(xsh, EA, ctx->mem_idx, MO_BEUQ); | ||
3597 | tcg_gen_addi_tl(EA, EA, 8); | ||
3598 | tcg_gen_qemu_st_i64(xsl, EA, ctx->mem_idx, MO_BEUQ); | ||
3599 | } | ||
3600 | - tcg_temp_free(EA); | ||
3601 | - tcg_temp_free_i64(xsh); | ||
3602 | - tcg_temp_free_i64(xsl); | ||
3603 | } | ||
3604 | |||
3605 | static void gen_stxvh8x(DisasContext *ctx) | ||
3606 | @@ -XXX,XX +XXX,XX @@ static void gen_stxvh8x(DisasContext *ctx) | ||
3607 | tcg_gen_qemu_st_i64(outh, EA, ctx->mem_idx, MO_BEUQ); | ||
3608 | tcg_gen_addi_tl(EA, EA, 8); | ||
3609 | tcg_gen_qemu_st_i64(outl, EA, ctx->mem_idx, MO_BEUQ); | ||
3610 | - tcg_temp_free_i64(outh); | ||
3611 | - tcg_temp_free_i64(outl); | ||
3612 | } else { | ||
3613 | tcg_gen_qemu_st_i64(xsh, EA, ctx->mem_idx, MO_BEUQ); | ||
3614 | tcg_gen_addi_tl(EA, EA, 8); | ||
3615 | tcg_gen_qemu_st_i64(xsl, EA, ctx->mem_idx, MO_BEUQ); | ||
3616 | } | ||
3617 | - tcg_temp_free(EA); | ||
3618 | - tcg_temp_free_i64(xsh); | ||
3619 | - tcg_temp_free_i64(xsl); | ||
3620 | } | ||
3621 | |||
3622 | static void gen_stxvb16x(DisasContext *ctx) | ||
3623 | @@ -XXX,XX +XXX,XX @@ static void gen_stxvb16x(DisasContext *ctx) | ||
3624 | tcg_gen_qemu_st_i64(xsh, EA, ctx->mem_idx, MO_BEUQ); | ||
3625 | tcg_gen_addi_tl(EA, EA, 8); | ||
3626 | tcg_gen_qemu_st_i64(xsl, EA, ctx->mem_idx, MO_BEUQ); | ||
3627 | - tcg_temp_free(EA); | ||
3628 | - tcg_temp_free_i64(xsh); | ||
3629 | - tcg_temp_free_i64(xsl); | ||
3630 | } | ||
3631 | |||
3632 | static void gen_mfvsrwz(DisasContext *ctx) | ||
3633 | @@ -XXX,XX +XXX,XX @@ static void gen_mfvsrwz(DisasContext *ctx) | ||
3634 | get_cpu_vsr(xsh, xS(ctx->opcode), true); | ||
3635 | tcg_gen_ext32u_i64(tmp, xsh); | ||
3636 | tcg_gen_trunc_i64_tl(cpu_gpr[rA(ctx->opcode)], tmp); | ||
3637 | - tcg_temp_free_i64(tmp); | ||
3638 | - tcg_temp_free_i64(xsh); | ||
3639 | } | ||
3640 | |||
3641 | static void gen_mtvsrwa(DisasContext *ctx) | ||
3642 | @@ -XXX,XX +XXX,XX @@ static void gen_mtvsrwa(DisasContext *ctx) | ||
3643 | tcg_gen_extu_tl_i64(tmp, cpu_gpr[rA(ctx->opcode)]); | ||
3644 | tcg_gen_ext32s_i64(xsh, tmp); | ||
3645 | set_cpu_vsr(xT(ctx->opcode), xsh, true); | ||
3646 | - tcg_temp_free_i64(tmp); | ||
3647 | - tcg_temp_free_i64(xsh); | ||
3648 | } | ||
3649 | |||
3650 | static void gen_mtvsrwz(DisasContext *ctx) | ||
3651 | @@ -XXX,XX +XXX,XX @@ static void gen_mtvsrwz(DisasContext *ctx) | ||
3652 | tcg_gen_extu_tl_i64(tmp, cpu_gpr[rA(ctx->opcode)]); | ||
3653 | tcg_gen_ext32u_i64(xsh, tmp); | ||
3654 | set_cpu_vsr(xT(ctx->opcode), xsh, true); | ||
3655 | - tcg_temp_free_i64(tmp); | ||
3656 | - tcg_temp_free_i64(xsh); | ||
3657 | } | ||
3658 | |||
3659 | #if defined(TARGET_PPC64) | ||
3660 | @@ -XXX,XX +XXX,XX @@ static void gen_mfvsrd(DisasContext *ctx) | ||
3661 | t0 = tcg_temp_new_i64(); | ||
3662 | get_cpu_vsr(t0, xS(ctx->opcode), true); | ||
3663 | tcg_gen_mov_i64(cpu_gpr[rA(ctx->opcode)], t0); | ||
3664 | - tcg_temp_free_i64(t0); | ||
3665 | } | ||
3666 | |||
3667 | static void gen_mtvsrd(DisasContext *ctx) | ||
3668 | @@ -XXX,XX +XXX,XX @@ static void gen_mtvsrd(DisasContext *ctx) | ||
3669 | t0 = tcg_temp_new_i64(); | ||
3670 | tcg_gen_mov_i64(t0, cpu_gpr[rA(ctx->opcode)]); | ||
3671 | set_cpu_vsr(xT(ctx->opcode), t0, true); | ||
3672 | - tcg_temp_free_i64(t0); | ||
3673 | } | ||
3674 | |||
3675 | static void gen_mfvsrld(DisasContext *ctx) | ||
3676 | @@ -XXX,XX +XXX,XX @@ static void gen_mfvsrld(DisasContext *ctx) | ||
3677 | t0 = tcg_temp_new_i64(); | ||
3678 | get_cpu_vsr(t0, xS(ctx->opcode), false); | ||
3679 | tcg_gen_mov_i64(cpu_gpr[rA(ctx->opcode)], t0); | ||
3680 | - tcg_temp_free_i64(t0); | ||
3681 | } | ||
3682 | |||
3683 | static void gen_mtvsrdd(DisasContext *ctx) | ||
3684 | @@ -XXX,XX +XXX,XX @@ static void gen_mtvsrdd(DisasContext *ctx) | ||
3685 | |||
3686 | tcg_gen_mov_i64(t0, cpu_gpr[rB(ctx->opcode)]); | ||
3687 | set_cpu_vsr(xT(ctx->opcode), t0, false); | ||
3688 | - tcg_temp_free_i64(t0); | ||
3689 | } | ||
3690 | |||
3691 | static void gen_mtvsrws(DisasContext *ctx) | ||
3692 | @@ -XXX,XX +XXX,XX @@ static void gen_mtvsrws(DisasContext *ctx) | ||
3693 | cpu_gpr[rA(ctx->opcode)], 32, 32); | ||
3694 | set_cpu_vsr(xT(ctx->opcode), t0, false); | ||
3695 | set_cpu_vsr(xT(ctx->opcode), t0, true); | ||
3696 | - tcg_temp_free_i64(t0); | ||
3697 | } | ||
3698 | |||
3699 | #endif | ||
3700 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
3701 | tcg_gen_and_i64(xa, xa, sgm); \ | ||
3702 | tcg_gen_andc_i64(xb, xb, sgm); \ | ||
3703 | tcg_gen_or_i64(xb, xb, xa); \ | ||
3704 | - tcg_temp_free_i64(xa); \ | ||
3705 | break; \ | ||
3706 | } \ | ||
3707 | } \ | ||
3708 | set_cpu_vsr(xT(ctx->opcode), xb, true); \ | ||
3709 | set_cpu_vsr(xT(ctx->opcode), tcg_constant_i64(0), false); \ | ||
3710 | - tcg_temp_free_i64(xb); \ | ||
3711 | - tcg_temp_free_i64(sgm); \ | ||
3712 | } | ||
3713 | |||
3714 | VSX_SCALAR_MOVE(xsabsdp, OP_ABS, SGN_MASK_DP) | ||
3715 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
3716 | tcg_gen_and_i64(xah, tmp, sgm); \ | ||
3717 | tcg_gen_andc_i64(xbh, xbh, sgm); \ | ||
3718 | tcg_gen_or_i64(xbh, xbh, xah); \ | ||
3719 | - tcg_temp_free_i64(xah); \ | ||
3720 | break; \ | ||
3721 | } \ | ||
3722 | set_cpu_vsr(xt, xbh, true); \ | ||
3723 | set_cpu_vsr(xt, xbl, false); \ | ||
3724 | - tcg_temp_free_i64(xbl); \ | ||
3725 | - tcg_temp_free_i64(xbh); \ | ||
3726 | - tcg_temp_free_i64(sgm); \ | ||
3727 | - tcg_temp_free_i64(tmp); \ | ||
3728 | } | ||
3729 | |||
3730 | VSX_SCALAR_MOVE_QP(xsabsqp, OP_ABS, SGN_MASK_DP) | ||
3731 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3732 | } else { \ | ||
3733 | ignored = tcg_temp_new_i32(); \ | ||
3734 | gen_helper_##name(ignored, cpu_env, xt, xa, xb); \ | ||
3735 | - tcg_temp_free_i32(ignored); \ | ||
3736 | } \ | ||
3737 | - tcg_temp_free_ptr(xt); \ | ||
3738 | - tcg_temp_free_ptr(xa); \ | ||
3739 | - tcg_temp_free_ptr(xb); \ | ||
3740 | } | ||
3741 | |||
3742 | VSX_CMP(xvcmpeqdp, 0x0C, 0x0C, 0, PPC2_VSX) | ||
3743 | @@ -XXX,XX +XXX,XX @@ static bool trans_XSCVQPDP(DisasContext *ctx, arg_X_tb_rc *a) | ||
3744 | xt = gen_avr_ptr(a->rt); | ||
3745 | xb = gen_avr_ptr(a->rb); | ||
3746 | gen_helper_XSCVQPDP(cpu_env, ro, xt, xb); | ||
3747 | - tcg_temp_free_i32(ro); | ||
3748 | - tcg_temp_free_ptr(xt); | ||
3749 | - tcg_temp_free_ptr(xb); | ||
3750 | - | ||
3751 | return true; | ||
3752 | } | ||
3753 | |||
3754 | @@ -XXX,XX +XXX,XX @@ static bool do_helper_env_X_tb(DisasContext *ctx, arg_X_tb *a, | ||
3755 | xt = gen_avr_ptr(a->rt); | ||
3756 | xb = gen_avr_ptr(a->rb); | ||
3757 | gen_helper(cpu_env, xt, xb); | ||
3758 | - tcg_temp_free_ptr(xt); | ||
3759 | - tcg_temp_free_ptr(xb); | ||
3760 | - | ||
3761 | return true; | ||
3762 | } | ||
3763 | |||
3764 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3765 | } \ | ||
3766 | opc = tcg_const_i32(ctx->opcode); \ | ||
3767 | gen_helper_##name(cpu_env, opc); \ | ||
3768 | - tcg_temp_free_i32(opc); \ | ||
3769 | } | ||
3770 | |||
3771 | #define GEN_VSX_HELPER_X3(name, op1, op2, inval, type) \ | ||
3772 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3773 | xa = gen_vsr_ptr(xA(ctx->opcode)); \ | ||
3774 | xb = gen_vsr_ptr(xB(ctx->opcode)); \ | ||
3775 | gen_helper_##name(cpu_env, xt, xa, xb); \ | ||
3776 | - tcg_temp_free_ptr(xt); \ | ||
3777 | - tcg_temp_free_ptr(xa); \ | ||
3778 | - tcg_temp_free_ptr(xb); \ | ||
3779 | } | ||
3780 | |||
3781 | #define GEN_VSX_HELPER_X2(name, op1, op2, inval, type) \ | ||
3782 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3783 | xt = gen_vsr_ptr(xT(ctx->opcode)); \ | ||
3784 | xb = gen_vsr_ptr(xB(ctx->opcode)); \ | ||
3785 | gen_helper_##name(cpu_env, xt, xb); \ | ||
3786 | - tcg_temp_free_ptr(xt); \ | ||
3787 | - tcg_temp_free_ptr(xb); \ | ||
3788 | } | ||
3789 | |||
3790 | #define GEN_VSX_HELPER_X2_AB(name, op1, op2, inval, type) \ | ||
3791 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3792 | xa = gen_vsr_ptr(xA(ctx->opcode)); \ | ||
3793 | xb = gen_vsr_ptr(xB(ctx->opcode)); \ | ||
3794 | gen_helper_##name(cpu_env, opc, xa, xb); \ | ||
3795 | - tcg_temp_free_i32(opc); \ | ||
3796 | - tcg_temp_free_ptr(xa); \ | ||
3797 | - tcg_temp_free_ptr(xb); \ | ||
3798 | } | ||
3799 | |||
3800 | #define GEN_VSX_HELPER_X1(name, op1, op2, inval, type) \ | ||
3801 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3802 | opc = tcg_const_i32(ctx->opcode); \ | ||
3803 | xb = gen_vsr_ptr(xB(ctx->opcode)); \ | ||
3804 | gen_helper_##name(cpu_env, opc, xb); \ | ||
3805 | - tcg_temp_free_i32(opc); \ | ||
3806 | - tcg_temp_free_ptr(xb); \ | ||
3807 | } | ||
3808 | |||
3809 | #define GEN_VSX_HELPER_R3(name, op1, op2, inval, type) \ | ||
3810 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3811 | xa = gen_vsr_ptr(rA(ctx->opcode) + 32); \ | ||
3812 | xb = gen_vsr_ptr(rB(ctx->opcode) + 32); \ | ||
3813 | gen_helper_##name(cpu_env, opc, xt, xa, xb); \ | ||
3814 | - tcg_temp_free_i32(opc); \ | ||
3815 | - tcg_temp_free_ptr(xt); \ | ||
3816 | - tcg_temp_free_ptr(xa); \ | ||
3817 | - tcg_temp_free_ptr(xb); \ | ||
3818 | } | ||
3819 | |||
3820 | #define GEN_VSX_HELPER_R2(name, op1, op2, inval, type) \ | ||
3821 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3822 | xt = gen_vsr_ptr(rD(ctx->opcode) + 32); \ | ||
3823 | xb = gen_vsr_ptr(rB(ctx->opcode) + 32); \ | ||
3824 | gen_helper_##name(cpu_env, opc, xt, xb); \ | ||
3825 | - tcg_temp_free_i32(opc); \ | ||
3826 | - tcg_temp_free_ptr(xt); \ | ||
3827 | - tcg_temp_free_ptr(xb); \ | ||
3828 | } | ||
3829 | |||
3830 | #define GEN_VSX_HELPER_R2_AB(name, op1, op2, inval, type) \ | ||
3831 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3832 | xa = gen_vsr_ptr(rA(ctx->opcode) + 32); \ | ||
3833 | xb = gen_vsr_ptr(rB(ctx->opcode) + 32); \ | ||
3834 | gen_helper_##name(cpu_env, opc, xa, xb); \ | ||
3835 | - tcg_temp_free_i32(opc); \ | ||
3836 | - tcg_temp_free_ptr(xa); \ | ||
3837 | - tcg_temp_free_ptr(xb); \ | ||
3838 | } | ||
3839 | |||
3840 | #define GEN_VSX_HELPER_XT_XB_ENV(name, op1, op2, inval, type) \ | ||
3841 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3842 | gen_helper_##name(t1, cpu_env, t0); \ | ||
3843 | set_cpu_vsr(xT(ctx->opcode), t1, true); \ | ||
3844 | set_cpu_vsr(xT(ctx->opcode), tcg_constant_i64(0), false); \ | ||
3845 | - tcg_temp_free_i64(t0); \ | ||
3846 | - tcg_temp_free_i64(t1); \ | ||
3847 | } | ||
3848 | |||
3849 | GEN_VSX_HELPER_X3(xsadddp, 0x00, 0x04, 0, PPC2_VSX) | ||
3850 | @@ -XXX,XX +XXX,XX @@ static bool do_XX2_bf_uim(DisasContext *ctx, arg_XX2_bf_uim *a, bool vsr, | ||
3851 | REQUIRE_VSX(ctx); | ||
3852 | xb = vsr ? gen_vsr_ptr(a->xb) : gen_avr_ptr(a->xb); | ||
3853 | gen_helper(cpu_env, tcg_constant_i32(a->bf), tcg_constant_i32(a->uim), xb); | ||
3854 | - tcg_temp_free_ptr(xb); | ||
3855 | - | ||
3856 | return true; | ||
3857 | } | ||
3858 | |||
3859 | @@ -XXX,XX +XXX,XX @@ bool trans_XSCVSPDPN(DisasContext *ctx, arg_XX2 *a) | ||
3860 | |||
3861 | set_cpu_vsr(a->xt, tmp, true); | ||
3862 | set_cpu_vsr(a->xt, tcg_constant_i64(0), false); | ||
3863 | - | ||
3864 | - tcg_temp_free_i64(tmp); | ||
3865 | - | ||
3866 | return true; | ||
3867 | } | ||
3868 | |||
3869 | @@ -XXX,XX +XXX,XX @@ static bool trans_XXPERM(DisasContext *ctx, arg_XX3 *a) | ||
3870 | xb = gen_vsr_ptr(a->xb); | ||
3871 | |||
3872 | gen_helper_VPERM(xt, xa, xt, xb); | ||
3873 | - | ||
3874 | - tcg_temp_free_ptr(xt); | ||
3875 | - tcg_temp_free_ptr(xa); | ||
3876 | - tcg_temp_free_ptr(xb); | ||
3877 | - | ||
3878 | return true; | ||
3879 | } | ||
3880 | |||
3881 | @@ -XXX,XX +XXX,XX @@ static bool trans_XXPERMR(DisasContext *ctx, arg_XX3 *a) | ||
3882 | xb = gen_vsr_ptr(a->xb); | ||
3883 | |||
3884 | gen_helper_VPERMR(xt, xa, xt, xb); | ||
3885 | - | ||
3886 | - tcg_temp_free_ptr(xt); | ||
3887 | - tcg_temp_free_ptr(xa); | ||
3888 | - tcg_temp_free_ptr(xb); | ||
3889 | - | ||
3890 | return true; | ||
3891 | } | ||
3892 | |||
3893 | @@ -XXX,XX +XXX,XX @@ static bool trans_XXPERMDI(DisasContext *ctx, arg_XX3_dm *a) | ||
3894 | |||
3895 | set_cpu_vsr(a->xt, t0, true); | ||
3896 | set_cpu_vsr(a->xt, t1, false); | ||
3897 | - | ||
3898 | - tcg_temp_free_i64(t1); | ||
3899 | } else { | ||
3900 | get_cpu_vsr(t0, a->xa, (a->dm & 2) == 0); | ||
3901 | set_cpu_vsr(a->xt, t0, true); | ||
3902 | @@ -XXX,XX +XXX,XX @@ static bool trans_XXPERMDI(DisasContext *ctx, arg_XX3_dm *a) | ||
3903 | get_cpu_vsr(t0, a->xb, (a->dm & 1) == 0); | ||
3904 | set_cpu_vsr(a->xt, t0, false); | ||
3905 | } | ||
3906 | - | ||
3907 | - tcg_temp_free_i64(t0); | ||
3908 | - | ||
3909 | return true; | ||
3910 | } | ||
3911 | |||
3912 | @@ -XXX,XX +XXX,XX @@ static bool trans_XXPERMX(DisasContext *ctx, arg_8RR_XX4_uim3 *a) | ||
3913 | xc = gen_vsr_ptr(a->xc); | ||
3914 | |||
3915 | gen_helper_XXPERMX(xt, xa, xb, xc, tcg_constant_tl(a->uim3)); | ||
3916 | - | ||
3917 | - tcg_temp_free_ptr(xt); | ||
3918 | - tcg_temp_free_ptr(xa); | ||
3919 | - tcg_temp_free_ptr(xb); | ||
3920 | - tcg_temp_free_ptr(xc); | ||
3921 | - | ||
3922 | return true; | ||
3923 | } | ||
3924 | |||
3925 | @@ -XXX,XX +XXX,XX @@ static bool do_xxgenpcv(DisasContext *ctx, arg_X_imm5 *a, | ||
3926 | vrb = gen_avr_ptr(a->vrb); | ||
3927 | |||
3928 | fn[a->imm](xt, vrb); | ||
3929 | - | ||
3930 | - tcg_temp_free_ptr(xt); | ||
3931 | - tcg_temp_free_ptr(vrb); | ||
3932 | - | ||
3933 | return true; | ||
3934 | } | ||
3935 | |||
3936 | @@ -XXX,XX +XXX,XX @@ static bool do_xsmadd(DisasContext *ctx, int tgt, int src1, int src2, int src3, | ||
3937 | s3 = gen_vsr_ptr(src3); | ||
3938 | |||
3939 | gen_helper(cpu_env, t, s1, s2, s3); | ||
3940 | - | ||
3941 | - tcg_temp_free_ptr(t); | ||
3942 | - tcg_temp_free_ptr(s1); | ||
3943 | - tcg_temp_free_ptr(s2); | ||
3944 | - tcg_temp_free_ptr(s3); | ||
3945 | - | ||
3946 | return true; | ||
3947 | } | ||
3948 | |||
3949 | @@ -XXX,XX +XXX,XX @@ static void gen_##name(DisasContext *ctx) \ | ||
3950 | s3 = gen_vsr_ptr(xB(ctx->opcode)); \ | ||
3951 | } \ | ||
3952 | gen_helper_##name(cpu_env, xt, s1, s2, s3); \ | ||
3953 | - tcg_temp_free_ptr(xt); \ | ||
3954 | - tcg_temp_free_ptr(s1); \ | ||
3955 | - tcg_temp_free_ptr(s2); \ | ||
3956 | - tcg_temp_free_ptr(s3); \ | ||
3957 | } | ||
3958 | |||
3959 | GEN_VSX_HELPER_VSX_MADD(xvmadddp, 0x04, 0x0C, 0x0D, 0, PPC2_VSX) | ||
3960 | @@ -XXX,XX +XXX,XX @@ static void gen_xxbrd(DisasContext *ctx) | ||
3961 | tcg_gen_bswap64_i64(xtl, xbl); | ||
3962 | set_cpu_vsr(xT(ctx->opcode), xth, true); | ||
3963 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
3964 | - | ||
3965 | - tcg_temp_free_i64(xth); | ||
3966 | - tcg_temp_free_i64(xtl); | ||
3967 | - tcg_temp_free_i64(xbh); | ||
3968 | - tcg_temp_free_i64(xbl); | ||
3969 | } | ||
3970 | |||
3971 | static void gen_xxbrh(DisasContext *ctx) | ||
3972 | @@ -XXX,XX +XXX,XX @@ static void gen_xxbrh(DisasContext *ctx) | ||
3973 | gen_bswap16x8(xth, xtl, xbh, xbl); | ||
3974 | set_cpu_vsr(xT(ctx->opcode), xth, true); | ||
3975 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
3976 | - | ||
3977 | - tcg_temp_free_i64(xth); | ||
3978 | - tcg_temp_free_i64(xtl); | ||
3979 | - tcg_temp_free_i64(xbh); | ||
3980 | - tcg_temp_free_i64(xbl); | ||
3981 | } | ||
3982 | |||
3983 | static void gen_xxbrq(DisasContext *ctx) | ||
3984 | @@ -XXX,XX +XXX,XX @@ static void gen_xxbrq(DisasContext *ctx) | ||
3985 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
3986 | tcg_gen_mov_i64(xth, t0); | ||
3987 | set_cpu_vsr(xT(ctx->opcode), xth, true); | ||
3988 | - | ||
3989 | - tcg_temp_free_i64(t0); | ||
3990 | - tcg_temp_free_i64(xth); | ||
3991 | - tcg_temp_free_i64(xtl); | ||
3992 | - tcg_temp_free_i64(xbh); | ||
3993 | - tcg_temp_free_i64(xbl); | ||
3994 | } | ||
3995 | |||
3996 | static void gen_xxbrw(DisasContext *ctx) | ||
3997 | @@ -XXX,XX +XXX,XX @@ static void gen_xxbrw(DisasContext *ctx) | ||
3998 | gen_bswap32x4(xth, xtl, xbh, xbl); | ||
3999 | set_cpu_vsr(xT(ctx->opcode), xth, true); | ||
4000 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
4001 | - | ||
4002 | - tcg_temp_free_i64(xth); | ||
4003 | - tcg_temp_free_i64(xtl); | ||
4004 | - tcg_temp_free_i64(xbh); | ||
4005 | - tcg_temp_free_i64(xbl); | ||
4006 | } | ||
4007 | |||
4008 | #define VSX_LOGICAL(name, vece, tcg_op) \ | ||
4009 | @@ -XXX,XX +XXX,XX @@ static void glue(gen_, name)(DisasContext *ctx) \ | ||
4010 | set_cpu_vsr(xT(ctx->opcode), tmp, true); \ | ||
4011 | tcg_gen_deposit_i64(tmp, b1, a1, 32, 32); \ | ||
4012 | set_cpu_vsr(xT(ctx->opcode), tmp, false); \ | ||
4013 | - tcg_temp_free_i64(a0); \ | ||
4014 | - tcg_temp_free_i64(a1); \ | ||
4015 | - tcg_temp_free_i64(b0); \ | ||
4016 | - tcg_temp_free_i64(b1); \ | ||
4017 | - tcg_temp_free_i64(tmp); \ | ||
4018 | } | ||
4019 | |||
4020 | VSX_XXMRG(xxmrghw, 1) | ||
4021 | @@ -XXX,XX +XXX,XX @@ static bool trans_XVTLSBB(DisasContext *ctx, arg_XX2_bf_xb *a) | ||
4022 | |||
4023 | tcg_gen_or_i64(t0, all_false, all_true); | ||
4024 | tcg_gen_extrl_i64_i32(cpu_crf[a->bf], t0); | ||
4025 | - | ||
4026 | - tcg_temp_free_i64(xb); | ||
4027 | - tcg_temp_free_i64(t0); | ||
4028 | - tcg_temp_free_i64(t1); | ||
4029 | - tcg_temp_free_i64(all_true); | ||
4030 | - tcg_temp_free_i64(all_false); | ||
4031 | - | ||
4032 | return true; | ||
4033 | } | ||
4034 | |||
4035 | @@ -XXX,XX +XXX,XX @@ static void gen_xxsldwi(DisasContext *ctx) | ||
4036 | get_cpu_vsr(t0, xB(ctx->opcode), true); | ||
4037 | tcg_gen_shri_i64(t0, t0, 32); | ||
4038 | tcg_gen_or_i64(xtl, xtl, t0); | ||
4039 | - tcg_temp_free_i64(t0); | ||
4040 | break; | ||
4041 | } | ||
4042 | case 2: { | ||
4043 | @@ -XXX,XX +XXX,XX @@ static void gen_xxsldwi(DisasContext *ctx) | ||
4044 | get_cpu_vsr(t0, xB(ctx->opcode), false); | ||
4045 | tcg_gen_shri_i64(t0, t0, 32); | ||
4046 | tcg_gen_or_i64(xtl, xtl, t0); | ||
4047 | - tcg_temp_free_i64(t0); | ||
4048 | break; | ||
4049 | } | ||
4050 | } | ||
4051 | |||
4052 | set_cpu_vsr(xT(ctx->opcode), xth, true); | ||
4053 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
4054 | - | ||
4055 | - tcg_temp_free_i64(xth); | ||
4056 | - tcg_temp_free_i64(xtl); | ||
4057 | } | ||
4058 | |||
4059 | static bool do_vsx_extract_insert(DisasContext *ctx, arg_XX2_uim *a, | ||
4060 | @@ -XXX,XX +XXX,XX @@ static bool do_vsx_extract_insert(DisasContext *ctx, arg_XX2_uim *a, | ||
4061 | xt = gen_vsr_ptr(a->xt); | ||
4062 | xb = gen_vsr_ptr(a->xb); | ||
4063 | gen_helper(xt, xb, tcg_constant_i32(a->uim)); | ||
4064 | - tcg_temp_free_ptr(xb); | ||
4065 | - tcg_temp_free_ptr(xt); | ||
4066 | } | ||
4067 | - | ||
4068 | return true; | ||
4069 | } | ||
4070 | |||
4071 | @@ -XXX,XX +XXX,XX @@ static void gen_xsxexpdp(DisasContext *ctx) | ||
4072 | t0 = tcg_temp_new_i64(); | ||
4073 | get_cpu_vsr(t0, xB(ctx->opcode), true); | ||
4074 | tcg_gen_extract_i64(rt, t0, 52, 11); | ||
4075 | - tcg_temp_free_i64(t0); | ||
4076 | } | ||
4077 | |||
4078 | static void gen_xsxexpqp(DisasContext *ctx) | ||
4079 | @@ -XXX,XX +XXX,XX @@ static void gen_xsxexpqp(DisasContext *ctx) | ||
4080 | set_cpu_vsr(rD(ctx->opcode) + 32, xth, true); | ||
4081 | tcg_gen_movi_i64(xtl, 0); | ||
4082 | set_cpu_vsr(rD(ctx->opcode) + 32, xtl, false); | ||
4083 | - | ||
4084 | - tcg_temp_free_i64(xbh); | ||
4085 | - tcg_temp_free_i64(xth); | ||
4086 | - tcg_temp_free_i64(xtl); | ||
4087 | } | ||
4088 | |||
4089 | static void gen_xsiexpdp(DisasContext *ctx) | ||
4090 | @@ -XXX,XX +XXX,XX @@ static void gen_xsiexpdp(DisasContext *ctx) | ||
4091 | tcg_gen_or_i64(xth, xth, t0); | ||
4092 | set_cpu_vsr(xT(ctx->opcode), xth, true); | ||
4093 | set_cpu_vsr(xT(ctx->opcode), tcg_constant_i64(0), false); | ||
4094 | - tcg_temp_free_i64(t0); | ||
4095 | - tcg_temp_free_i64(xth); | ||
4096 | } | ||
4097 | |||
4098 | static void gen_xsiexpqp(DisasContext *ctx) | ||
4099 | @@ -XXX,XX +XXX,XX @@ static void gen_xsiexpqp(DisasContext *ctx) | ||
4100 | set_cpu_vsr(rD(ctx->opcode) + 32, xth, true); | ||
4101 | tcg_gen_mov_i64(xtl, xal); | ||
4102 | set_cpu_vsr(rD(ctx->opcode) + 32, xtl, false); | ||
4103 | - | ||
4104 | - tcg_temp_free_i64(t0); | ||
4105 | - tcg_temp_free_i64(xth); | ||
4106 | - tcg_temp_free_i64(xtl); | ||
4107 | - tcg_temp_free_i64(xah); | ||
4108 | - tcg_temp_free_i64(xal); | ||
4109 | - tcg_temp_free_i64(xbh); | ||
4110 | } | ||
4111 | |||
4112 | static void gen_xsxsigdp(DisasContext *ctx) | ||
4113 | @@ -XXX,XX +XXX,XX @@ static void gen_xsxsigdp(DisasContext *ctx) | ||
4114 | tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0); | ||
4115 | get_cpu_vsr(t1, xB(ctx->opcode), true); | ||
4116 | tcg_gen_deposit_i64(rt, t0, t1, 0, 52); | ||
4117 | - | ||
4118 | - tcg_temp_free_i64(t0); | ||
4119 | - tcg_temp_free_i64(t1); | ||
4120 | - tcg_temp_free_i64(exp); | ||
4121 | - tcg_temp_free_i64(zr); | ||
4122 | - tcg_temp_free_i64(nan); | ||
4123 | } | ||
4124 | |||
4125 | static void gen_xsxsigqp(DisasContext *ctx) | ||
4126 | @@ -XXX,XX +XXX,XX @@ static void gen_xsxsigqp(DisasContext *ctx) | ||
4127 | set_cpu_vsr(rD(ctx->opcode) + 32, xth, true); | ||
4128 | tcg_gen_mov_i64(xtl, xbl); | ||
4129 | set_cpu_vsr(rD(ctx->opcode) + 32, xtl, false); | ||
4130 | - | ||
4131 | - tcg_temp_free_i64(t0); | ||
4132 | - tcg_temp_free_i64(exp); | ||
4133 | - tcg_temp_free_i64(zr); | ||
4134 | - tcg_temp_free_i64(nan); | ||
4135 | - tcg_temp_free_i64(xth); | ||
4136 | - tcg_temp_free_i64(xtl); | ||
4137 | - tcg_temp_free_i64(xbh); | ||
4138 | - tcg_temp_free_i64(xbl); | ||
4139 | } | ||
4140 | #endif | ||
4141 | |||
4142 | @@ -XXX,XX +XXX,XX @@ static void gen_xviexpsp(DisasContext *ctx) | ||
4143 | tcg_gen_shli_i64(t0, t0, 23); | ||
4144 | tcg_gen_or_i64(xtl, xtl, t0); | ||
4145 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
4146 | - | ||
4147 | - tcg_temp_free_i64(t0); | ||
4148 | - tcg_temp_free_i64(xth); | ||
4149 | - tcg_temp_free_i64(xtl); | ||
4150 | - tcg_temp_free_i64(xah); | ||
4151 | - tcg_temp_free_i64(xal); | ||
4152 | - tcg_temp_free_i64(xbh); | ||
4153 | - tcg_temp_free_i64(xbl); | ||
4154 | } | ||
4155 | |||
4156 | static void gen_xviexpdp(DisasContext *ctx) | ||
4157 | @@ -XXX,XX +XXX,XX @@ static void gen_xviexpdp(DisasContext *ctx) | ||
4158 | |||
4159 | tcg_gen_deposit_i64(xtl, xal, xbl, 52, 11); | ||
4160 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
4161 | - | ||
4162 | - tcg_temp_free_i64(xth); | ||
4163 | - tcg_temp_free_i64(xtl); | ||
4164 | - tcg_temp_free_i64(xah); | ||
4165 | - tcg_temp_free_i64(xal); | ||
4166 | - tcg_temp_free_i64(xbh); | ||
4167 | - tcg_temp_free_i64(xbl); | ||
4168 | } | ||
4169 | |||
4170 | static void gen_xvxexpsp(DisasContext *ctx) | ||
4171 | @@ -XXX,XX +XXX,XX @@ static void gen_xvxexpsp(DisasContext *ctx) | ||
4172 | tcg_gen_shri_i64(xtl, xbl, 23); | ||
4173 | tcg_gen_andi_i64(xtl, xtl, 0xFF000000FF); | ||
4174 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
4175 | - | ||
4176 | - tcg_temp_free_i64(xth); | ||
4177 | - tcg_temp_free_i64(xtl); | ||
4178 | - tcg_temp_free_i64(xbh); | ||
4179 | - tcg_temp_free_i64(xbl); | ||
4180 | } | ||
4181 | |||
4182 | static void gen_xvxexpdp(DisasContext *ctx) | ||
4183 | @@ -XXX,XX +XXX,XX @@ static void gen_xvxexpdp(DisasContext *ctx) | ||
4184 | set_cpu_vsr(xT(ctx->opcode), xth, true); | ||
4185 | tcg_gen_extract_i64(xtl, xbl, 52, 11); | ||
4186 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
4187 | - | ||
4188 | - tcg_temp_free_i64(xth); | ||
4189 | - tcg_temp_free_i64(xtl); | ||
4190 | - tcg_temp_free_i64(xbh); | ||
4191 | - tcg_temp_free_i64(xbl); | ||
4192 | } | ||
4193 | |||
4194 | static bool trans_XVXSIGSP(DisasContext *ctx, arg_XX2 *a) | ||
4195 | @@ -XXX,XX +XXX,XX @@ static bool trans_XVXSIGSP(DisasContext *ctx, arg_XX2 *a) | ||
4196 | b = gen_vsr_ptr(a->xb); | ||
4197 | |||
4198 | gen_helper_XVXSIGSP(t, b); | ||
4199 | - | ||
4200 | - tcg_temp_free_ptr(t); | ||
4201 | - tcg_temp_free_ptr(b); | ||
4202 | - | ||
4203 | return true; | ||
4204 | } | ||
4205 | |||
4206 | @@ -XXX,XX +XXX,XX @@ static void gen_xvxsigdp(DisasContext *ctx) | ||
4207 | tcg_gen_movcond_i64(TCG_COND_EQ, t0, exp, nan, zr, t0); | ||
4208 | tcg_gen_deposit_i64(xtl, t0, xbl, 0, 52); | ||
4209 | set_cpu_vsr(xT(ctx->opcode), xtl, false); | ||
4210 | - | ||
4211 | - tcg_temp_free_i64(t0); | ||
4212 | - tcg_temp_free_i64(exp); | ||
4213 | - tcg_temp_free_i64(zr); | ||
4214 | - tcg_temp_free_i64(nan); | ||
4215 | - tcg_temp_free_i64(xth); | ||
4216 | - tcg_temp_free_i64(xtl); | ||
4217 | - tcg_temp_free_i64(xbh); | ||
4218 | - tcg_temp_free_i64(xbl); | ||
4219 | } | ||
4220 | |||
4221 | static bool do_lstxv(DisasContext *ctx, int ra, TCGv displ, | ||
4222 | @@ -XXX,XX +XXX,XX @@ static bool do_lstxv(DisasContext *ctx, int ra, TCGv displ, | ||
4223 | set_cpu_vsr(rt2, xt, ctx->le_mode); | ||
4224 | } | ||
4225 | } | ||
4226 | - | ||
4227 | - tcg_temp_free(ea); | ||
4228 | - tcg_temp_free_i64(xt); | ||
4229 | return true; | ||
4230 | } | ||
4231 | |||
4232 | @@ -XXX,XX +XXX,XX @@ static bool do_lstxsd(DisasContext *ctx, int rt, int ra, TCGv displ, bool store) | ||
4233 | set_cpu_vsr(rt + 32, xt, true); | ||
4234 | set_cpu_vsr(rt + 32, tcg_constant_i64(0), false); | ||
4235 | } | ||
4236 | - | ||
4237 | - tcg_temp_free(ea); | ||
4238 | - tcg_temp_free_i64(xt); | ||
4239 | - | ||
4240 | return true; | ||
4241 | } | ||
4242 | |||
4243 | @@ -XXX,XX +XXX,XX @@ static bool do_lstxssp(DisasContext *ctx, int rt, int ra, TCGv displ, bool store | ||
4244 | set_cpu_vsr(rt + 32, xt, true); | ||
4245 | set_cpu_vsr(rt + 32, tcg_constant_i64(0), false); | ||
4246 | } | ||
4247 | - | ||
4248 | - tcg_temp_free(ea); | ||
4249 | - tcg_temp_free_i64(xt); | ||
4250 | - | ||
4251 | return true; | ||
4252 | } | ||
4253 | |||
4254 | @@ -XXX,XX +XXX,XX @@ static bool do_lstrm(DisasContext *ctx, arg_X *a, MemOp mop, bool store) | ||
4255 | set_cpu_vsr(a->rt, xt, false); | ||
4256 | set_cpu_vsr(a->rt, tcg_constant_i64(0), true); | ||
4257 | } | ||
4258 | - | ||
4259 | - tcg_temp_free(ea); | ||
4260 | - tcg_temp_free_i64(xt); | ||
4261 | return true; | ||
4262 | } | ||
4263 | |||
4264 | @@ -XXX,XX +XXX,XX @@ static void gen_xxeval_i64(TCGv_i64 t, TCGv_i64 a, TCGv_i64 b, TCGv_i64 c, | ||
4265 | } | ||
4266 | |||
4267 | tcg_gen_mov_i64(t, disj); | ||
4268 | - | ||
4269 | - tcg_temp_free_i64(conj); | ||
4270 | - tcg_temp_free_i64(disj); | ||
4271 | } | ||
4272 | |||
4273 | static void gen_xxeval_vec(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b, | ||
4274 | @@ -XXX,XX +XXX,XX @@ static void gen_xxeval_vec(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b, | ||
4275 | } | ||
4276 | |||
4277 | tcg_gen_mov_vec(t, disj); | ||
4278 | - | ||
4279 | - tcg_temp_free_vec(disj); | ||
4280 | - tcg_temp_free_vec(conj); | ||
4281 | } | ||
4282 | |||
4283 | static bool trans_XXEVAL(DisasContext *ctx, arg_8RR_XX4_imm *a) | ||
4284 | @@ -XXX,XX +XXX,XX @@ static void gen_xxblendv_vec(unsigned vece, TCGv_vec t, TCGv_vec a, TCGv_vec b, | ||
4285 | TCGv_vec tmp = tcg_temp_new_vec_matching(c); | ||
4286 | tcg_gen_sari_vec(vece, tmp, c, (8 << vece) - 1); | ||
4287 | tcg_gen_bitsel_vec(vece, t, tmp, b, a); | ||
4288 | - tcg_temp_free_vec(tmp); | ||
4289 | } | ||
4290 | |||
4291 | static bool do_xxblendv(DisasContext *ctx, arg_8RR_XX4 *a, unsigned vece) | ||
4292 | @@ -XXX,XX +XXX,XX @@ static bool do_helper_XX3(DisasContext *ctx, arg_XX3 *a, | ||
4293 | xb = gen_vsr_ptr(a->xb); | ||
4294 | |||
4295 | helper(cpu_env, xt, xa, xb); | ||
4296 | - | ||
4297 | - tcg_temp_free_ptr(xt); | ||
4298 | - tcg_temp_free_ptr(xa); | ||
4299 | - tcg_temp_free_ptr(xb); | ||
4300 | - | ||
4301 | return true; | ||
4302 | } | ||
4303 | |||
4304 | @@ -XXX,XX +XXX,XX @@ static bool do_helper_X(arg_X *a, | ||
4305 | rb = gen_avr_ptr(a->rb); | ||
4306 | |||
4307 | helper(cpu_env, rt, ra, rb); | ||
4308 | - | ||
4309 | - tcg_temp_free_ptr(rt); | ||
4310 | - tcg_temp_free_ptr(ra); | ||
4311 | - tcg_temp_free_ptr(rb); | ||
4312 | - | ||
4313 | return true; | ||
4314 | } | ||
4315 | |||
4316 | @@ -XXX,XX +XXX,XX @@ static bool trans_XVCVSPBF16(DisasContext *ctx, arg_XX2 *a) | ||
4317 | xb = gen_vsr_ptr(a->xb); | ||
4318 | |||
4319 | gen_helper_XVCVSPBF16(cpu_env, xt, xb); | ||
4320 | - | ||
4321 | - tcg_temp_free_ptr(xt); | ||
4322 | - tcg_temp_free_ptr(xb); | ||
4323 | - | ||
4324 | return true; | ||
4325 | } | ||
4326 | |||
4327 | @@ -XXX,XX +XXX,XX @@ static bool do_ger(DisasContext *ctx, arg_MMIRR_XX3 *a, | ||
4328 | |||
4329 | mask = ger_pack_masks(a->pmsk, a->ymsk, a->xmsk); | ||
4330 | helper(cpu_env, xa, xb, xt, tcg_constant_i32(mask)); | ||
4331 | - tcg_temp_free_ptr(xt); | ||
4332 | - tcg_temp_free_ptr(xa); | ||
4333 | - tcg_temp_free_ptr(xb); | ||
4334 | return true; | ||
4335 | } | ||
4336 | |||
4337 | -- | ||
4338 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries, | ||
2 | therefore there's no need to record temps for later freeing. | ||
3 | Replace the few uses with tcg_temp_new_i64. | ||
4 | 1 | ||
5 | Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn> | ||
6 | Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> | ||
7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
8 | --- | ||
9 | target/riscv/translate.c | 24 ++++-------------------- | ||
10 | 1 file changed, 4 insertions(+), 20 deletions(-) | ||
11 | |||
12 | diff --git a/target/riscv/translate.c b/target/riscv/translate.c | ||
13 | index XXXXXXX..XXXXXXX 100644 | ||
14 | --- a/target/riscv/translate.c | ||
15 | +++ b/target/riscv/translate.c | ||
16 | @@ -XXX,XX +XXX,XX @@ typedef struct DisasContext { | ||
17 | TCGv zero; | ||
18 | /* Space for 3 operands plus 1 extra for address computation. */ | ||
19 | TCGv temp[4]; | ||
20 | - /* Space for 4 operands(1 dest and <=3 src) for float point computation */ | ||
21 | - TCGv_i64 ftemp[4]; | ||
22 | - uint8_t nftemp; | ||
23 | /* PointerMasking extension */ | ||
24 | bool pm_mask_enabled; | ||
25 | bool pm_base_enabled; | ||
26 | @@ -XXX,XX +XXX,XX @@ static void gen_set_gpr128(DisasContext *ctx, int reg_num, TCGv rl, TCGv rh) | ||
27 | } | ||
28 | } | ||
29 | |||
30 | -static TCGv_i64 ftemp_new(DisasContext *ctx) | ||
31 | -{ | ||
32 | - assert(ctx->nftemp < ARRAY_SIZE(ctx->ftemp)); | ||
33 | - return ctx->ftemp[ctx->nftemp++] = tcg_temp_new_i64(); | ||
34 | -} | ||
35 | - | ||
36 | static TCGv_i64 get_fpr_hs(DisasContext *ctx, int reg_num) | ||
37 | { | ||
38 | if (!ctx->cfg_ptr->ext_zfinx) { | ||
39 | @@ -XXX,XX +XXX,XX @@ static TCGv_i64 get_fpr_hs(DisasContext *ctx, int reg_num) | ||
40 | case MXL_RV32: | ||
41 | #ifdef TARGET_RISCV32 | ||
42 | { | ||
43 | - TCGv_i64 t = ftemp_new(ctx); | ||
44 | + TCGv_i64 t = tcg_temp_new_i64(); | ||
45 | tcg_gen_ext_i32_i64(t, cpu_gpr[reg_num]); | ||
46 | return t; | ||
47 | } | ||
48 | @@ -XXX,XX +XXX,XX @@ static TCGv_i64 get_fpr_d(DisasContext *ctx, int reg_num) | ||
49 | switch (get_xl(ctx)) { | ||
50 | case MXL_RV32: | ||
51 | { | ||
52 | - TCGv_i64 t = ftemp_new(ctx); | ||
53 | + TCGv_i64 t = tcg_temp_new_i64(); | ||
54 | tcg_gen_concat_tl_i64(t, cpu_gpr[reg_num], cpu_gpr[reg_num + 1]); | ||
55 | return t; | ||
56 | } | ||
57 | @@ -XXX,XX +XXX,XX @@ static TCGv_i64 dest_fpr(DisasContext *ctx, int reg_num) | ||
58 | } | ||
59 | |||
60 | if (reg_num == 0) { | ||
61 | - return ftemp_new(ctx); | ||
62 | + return tcg_temp_new_i64(); | ||
63 | } | ||
64 | |||
65 | switch (get_xl(ctx)) { | ||
66 | case MXL_RV32: | ||
67 | - return ftemp_new(ctx); | ||
68 | + return tcg_temp_new_i64(); | ||
69 | #ifdef TARGET_RISCV64 | ||
70 | case MXL_RV64: | ||
71 | return cpu_gpr[reg_num]; | ||
72 | @@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) | ||
73 | ctx->cs = cs; | ||
74 | ctx->ntemp = 0; | ||
75 | memset(ctx->temp, 0, sizeof(ctx->temp)); | ||
76 | - ctx->nftemp = 0; | ||
77 | - memset(ctx->ftemp, 0, sizeof(ctx->ftemp)); | ||
78 | ctx->pm_mask_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_MASK_ENABLED); | ||
79 | ctx->pm_base_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_BASE_ENABLED); | ||
80 | ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER); | ||
81 | @@ -XXX,XX +XXX,XX @@ static void riscv_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) | ||
82 | ctx->temp[i] = NULL; | ||
83 | } | ||
84 | ctx->ntemp = 0; | ||
85 | - for (i = ctx->nftemp - 1; i >= 0; --i) { | ||
86 | - tcg_temp_free_i64(ctx->ftemp[i]); | ||
87 | - ctx->ftemp[i] = NULL; | ||
88 | - } | ||
89 | - ctx->nftemp = 0; | ||
90 | |||
91 | /* Only the first insn within a TB is allowed to cross a page boundary. */ | ||
92 | if (ctx->base.is_jmp == DISAS_NEXT) { | ||
93 | -- | ||
94 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries, | ||
2 | therefore there's no need to record temps for later freeing. | ||
3 | Replace the few uses with tcg_temp_new. | ||
4 | 1 | ||
5 | Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn> | ||
6 | Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> | ||
7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
8 | --- | ||
9 | target/riscv/translate.c | 30 +++++------------------ | ||
10 | target/riscv/insn_trans/trans_rvzfh.c.inc | 2 +- | ||
11 | 2 files changed, 7 insertions(+), 25 deletions(-) | ||
12 | |||
13 | diff --git a/target/riscv/translate.c b/target/riscv/translate.c | ||
14 | index XXXXXXX..XXXXXXX 100644 | ||
15 | --- a/target/riscv/translate.c | ||
16 | +++ b/target/riscv/translate.c | ||
17 | @@ -XXX,XX +XXX,XX @@ typedef struct DisasContext { | ||
18 | bool cfg_vta_all_1s; | ||
19 | target_ulong vstart; | ||
20 | bool vl_eq_vlmax; | ||
21 | - uint8_t ntemp; | ||
22 | CPUState *cs; | ||
23 | TCGv zero; | ||
24 | - /* Space for 3 operands plus 1 extra for address computation. */ | ||
25 | - TCGv temp[4]; | ||
26 | /* PointerMasking extension */ | ||
27 | bool pm_mask_enabled; | ||
28 | bool pm_base_enabled; | ||
29 | @@ -XXX,XX +XXX,XX @@ static void gen_goto_tb(DisasContext *ctx, int n, target_ulong dest) | ||
30 | * | ||
31 | * Further, we may provide an extension for word operations. | ||
32 | */ | ||
33 | -static TCGv temp_new(DisasContext *ctx) | ||
34 | -{ | ||
35 | - assert(ctx->ntemp < ARRAY_SIZE(ctx->temp)); | ||
36 | - return ctx->temp[ctx->ntemp++] = tcg_temp_new(); | ||
37 | -} | ||
38 | - | ||
39 | static TCGv get_gpr(DisasContext *ctx, int reg_num, DisasExtend ext) | ||
40 | { | ||
41 | TCGv t; | ||
42 | @@ -XXX,XX +XXX,XX @@ static TCGv get_gpr(DisasContext *ctx, int reg_num, DisasExtend ext) | ||
43 | case EXT_NONE: | ||
44 | break; | ||
45 | case EXT_SIGN: | ||
46 | - t = temp_new(ctx); | ||
47 | + t = tcg_temp_new(); | ||
48 | tcg_gen_ext32s_tl(t, cpu_gpr[reg_num]); | ||
49 | return t; | ||
50 | case EXT_ZERO: | ||
51 | - t = temp_new(ctx); | ||
52 | + t = tcg_temp_new(); | ||
53 | tcg_gen_ext32u_tl(t, cpu_gpr[reg_num]); | ||
54 | return t; | ||
55 | default: | ||
56 | @@ -XXX,XX +XXX,XX @@ static TCGv get_gprh(DisasContext *ctx, int reg_num) | ||
57 | static TCGv dest_gpr(DisasContext *ctx, int reg_num) | ||
58 | { | ||
59 | if (reg_num == 0 || get_olen(ctx) < TARGET_LONG_BITS) { | ||
60 | - return temp_new(ctx); | ||
61 | + return tcg_temp_new(); | ||
62 | } | ||
63 | return cpu_gpr[reg_num]; | ||
64 | } | ||
65 | @@ -XXX,XX +XXX,XX @@ static TCGv dest_gpr(DisasContext *ctx, int reg_num) | ||
66 | static TCGv dest_gprh(DisasContext *ctx, int reg_num) | ||
67 | { | ||
68 | if (reg_num == 0) { | ||
69 | - return temp_new(ctx); | ||
70 | + return tcg_temp_new(); | ||
71 | } | ||
72 | return cpu_gprh[reg_num]; | ||
73 | } | ||
74 | @@ -XXX,XX +XXX,XX @@ static void gen_jal(DisasContext *ctx, int rd, target_ulong imm) | ||
75 | /* Compute a canonical address from a register plus offset. */ | ||
76 | static TCGv get_address(DisasContext *ctx, int rs1, int imm) | ||
77 | { | ||
78 | - TCGv addr = temp_new(ctx); | ||
79 | + TCGv addr = tcg_temp_new(); | ||
80 | TCGv src1 = get_gpr(ctx, rs1, EXT_NONE); | ||
81 | |||
82 | tcg_gen_addi_tl(addr, src1, imm); | ||
83 | @@ -XXX,XX +XXX,XX @@ static TCGv get_address(DisasContext *ctx, int rs1, int imm) | ||
84 | /* Compute a canonical address from a register plus reg offset. */ | ||
85 | static TCGv get_address_indexed(DisasContext *ctx, int rs1, TCGv offs) | ||
86 | { | ||
87 | - TCGv addr = temp_new(ctx); | ||
88 | + TCGv addr = tcg_temp_new(); | ||
89 | TCGv src1 = get_gpr(ctx, rs1, EXT_NONE); | ||
90 | |||
91 | tcg_gen_add_tl(addr, src1, offs); | ||
92 | @@ -XXX,XX +XXX,XX @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) | ||
93 | ctx->misa_mxl_max = env->misa_mxl_max; | ||
94 | ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL); | ||
95 | ctx->cs = cs; | ||
96 | - ctx->ntemp = 0; | ||
97 | - memset(ctx->temp, 0, sizeof(ctx->temp)); | ||
98 | ctx->pm_mask_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_MASK_ENABLED); | ||
99 | ctx->pm_base_enabled = FIELD_EX32(tb_flags, TB_FLAGS, PM_BASE_ENABLED); | ||
100 | ctx->itrigger = FIELD_EX32(tb_flags, TB_FLAGS, ITRIGGER); | ||
101 | @@ -XXX,XX +XXX,XX @@ static void riscv_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) | ||
102 | DisasContext *ctx = container_of(dcbase, DisasContext, base); | ||
103 | CPURISCVState *env = cpu->env_ptr; | ||
104 | uint16_t opcode16 = translator_lduw(env, &ctx->base, ctx->base.pc_next); | ||
105 | - int i; | ||
106 | |||
107 | ctx->ol = ctx->xl; | ||
108 | decode_opc(env, ctx, opcode16); | ||
109 | ctx->base.pc_next = ctx->pc_succ_insn; | ||
110 | |||
111 | - for (i = ctx->ntemp - 1; i >= 0; --i) { | ||
112 | - tcg_temp_free(ctx->temp[i]); | ||
113 | - ctx->temp[i] = NULL; | ||
114 | - } | ||
115 | - ctx->ntemp = 0; | ||
116 | - | ||
117 | /* Only the first insn within a TB is allowed to cross a page boundary. */ | ||
118 | if (ctx->base.is_jmp == DISAS_NEXT) { | ||
119 | if (ctx->itrigger || !is_same_page(&ctx->base, ctx->base.pc_next)) { | ||
120 | diff --git a/target/riscv/insn_trans/trans_rvzfh.c.inc b/target/riscv/insn_trans/trans_rvzfh.c.inc | ||
121 | index XXXXXXX..XXXXXXX 100644 | ||
122 | --- a/target/riscv/insn_trans/trans_rvzfh.c.inc | ||
123 | +++ b/target/riscv/insn_trans/trans_rvzfh.c.inc | ||
124 | @@ -XXX,XX +XXX,XX @@ static bool trans_flh(DisasContext *ctx, arg_flh *a) | ||
125 | decode_save_opc(ctx); | ||
126 | t0 = get_gpr(ctx, a->rs1, EXT_NONE); | ||
127 | if (a->imm) { | ||
128 | - TCGv temp = temp_new(ctx); | ||
129 | + TCGv temp = tcg_temp_new(); | ||
130 | tcg_gen_addi_tl(temp, t0, a->imm); | ||
131 | t0 = temp; | ||
132 | } | ||
133 | -- | ||
134 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Weiwei Li <liweiwei@iscas.ac.cn> | ||
4 | Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
6 | --- | ||
7 | target/riscv/translate.c | 7 --- | ||
8 | target/riscv/insn_trans/trans_rvb.c.inc | 24 ---------- | ||
9 | target/riscv/insn_trans/trans_rvd.c.inc | 2 - | ||
10 | target/riscv/insn_trans/trans_rvf.c.inc | 9 ---- | ||
11 | target/riscv/insn_trans/trans_rvi.c.inc | 37 --------------- | ||
12 | target/riscv/insn_trans/trans_rvk.c.inc | 15 ------ | ||
13 | target/riscv/insn_trans/trans_rvm.c.inc | 33 ------------- | ||
14 | target/riscv/insn_trans/trans_rvv.c.inc | 55 ---------------------- | ||
15 | target/riscv/insn_trans/trans_rvzfh.c.inc | 10 ---- | ||
16 | target/riscv/insn_trans/trans_xthead.c.inc | 24 +--------- | ||
17 | 10 files changed, 1 insertion(+), 215 deletions(-) | ||
18 | |||
19 | diff --git a/target/riscv/translate.c b/target/riscv/translate.c | ||
20 | index XXXXXXX..XXXXXXX 100644 | ||
21 | --- a/target/riscv/translate.c | ||
22 | +++ b/target/riscv/translate.c | ||
23 | @@ -XXX,XX +XXX,XX @@ static void gen_check_nanbox_h(TCGv_i64 out, TCGv_i64 in) | ||
24 | TCGv_i64 t_nan = tcg_const_i64(0xffffffffffff7e00ull); | ||
25 | |||
26 | tcg_gen_movcond_i64(TCG_COND_GEU, out, in, t_max, in, t_nan); | ||
27 | - tcg_temp_free_i64(t_max); | ||
28 | - tcg_temp_free_i64(t_nan); | ||
29 | } | ||
30 | |||
31 | static void gen_check_nanbox_s(TCGv_i64 out, TCGv_i64 in) | ||
32 | @@ -XXX,XX +XXX,XX @@ static void mark_fs_dirty(DisasContext *ctx) | ||
33 | tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus)); | ||
34 | tcg_gen_ori_tl(tmp, tmp, MSTATUS_FS); | ||
35 | tcg_gen_st_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus)); | ||
36 | - tcg_temp_free(tmp); | ||
37 | } | ||
38 | |||
39 | if (ctx->virt_enabled && ctx->mstatus_hs_fs != MSTATUS_FS) { | ||
40 | @@ -XXX,XX +XXX,XX @@ static void mark_fs_dirty(DisasContext *ctx) | ||
41 | tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus_hs)); | ||
42 | tcg_gen_ori_tl(tmp, tmp, MSTATUS_FS); | ||
43 | tcg_gen_st_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus_hs)); | ||
44 | - tcg_temp_free(tmp); | ||
45 | } | ||
46 | } | ||
47 | #else | ||
48 | @@ -XXX,XX +XXX,XX @@ static void mark_vs_dirty(DisasContext *ctx) | ||
49 | tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus)); | ||
50 | tcg_gen_ori_tl(tmp, tmp, MSTATUS_VS); | ||
51 | tcg_gen_st_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus)); | ||
52 | - tcg_temp_free(tmp); | ||
53 | } | ||
54 | |||
55 | if (ctx->virt_enabled && ctx->mstatus_hs_vs != MSTATUS_VS) { | ||
56 | @@ -XXX,XX +XXX,XX @@ static void mark_vs_dirty(DisasContext *ctx) | ||
57 | tcg_gen_ld_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus_hs)); | ||
58 | tcg_gen_ori_tl(tmp, tmp, MSTATUS_VS); | ||
59 | tcg_gen_st_tl(tmp, cpu_env, offsetof(CPURISCVState, mstatus_hs)); | ||
60 | - tcg_temp_free(tmp); | ||
61 | } | ||
62 | } | ||
63 | #else | ||
64 | @@ -XXX,XX +XXX,XX @@ static bool gen_shift(DisasContext *ctx, arg_r *a, DisasExtend ext, | ||
65 | f128(dest, desth, src1, src1h, ext2); | ||
66 | gen_set_gpr128(ctx, a->rd, dest, desth); | ||
67 | } | ||
68 | - tcg_temp_free(ext2); | ||
69 | return true; | ||
70 | } | ||
71 | |||
72 | diff --git a/target/riscv/insn_trans/trans_rvb.c.inc b/target/riscv/insn_trans/trans_rvb.c.inc | ||
73 | index XXXXXXX..XXXXXXX 100644 | ||
74 | --- a/target/riscv/insn_trans/trans_rvb.c.inc | ||
75 | +++ b/target/riscv/insn_trans/trans_rvb.c.inc | ||
76 | @@ -XXX,XX +XXX,XX @@ static void gen_clzw(TCGv ret, TCGv arg1) | ||
77 | TCGv t = tcg_temp_new(); | ||
78 | tcg_gen_shli_tl(t, arg1, 32); | ||
79 | tcg_gen_clzi_tl(ret, t, 32); | ||
80 | - tcg_temp_free(t); | ||
81 | } | ||
82 | |||
83 | static bool trans_clz(DisasContext *ctx, arg_clz *a) | ||
84 | @@ -XXX,XX +XXX,XX @@ static void gen_bset(TCGv ret, TCGv arg1, TCGv shamt) | ||
85 | |||
86 | gen_sbop_mask(t, shamt); | ||
87 | tcg_gen_or_tl(ret, arg1, t); | ||
88 | - | ||
89 | - tcg_temp_free(t); | ||
90 | } | ||
91 | |||
92 | static bool trans_bset(DisasContext *ctx, arg_bset *a) | ||
93 | @@ -XXX,XX +XXX,XX @@ static void gen_bclr(TCGv ret, TCGv arg1, TCGv shamt) | ||
94 | |||
95 | gen_sbop_mask(t, shamt); | ||
96 | tcg_gen_andc_tl(ret, arg1, t); | ||
97 | - | ||
98 | - tcg_temp_free(t); | ||
99 | } | ||
100 | |||
101 | static bool trans_bclr(DisasContext *ctx, arg_bclr *a) | ||
102 | @@ -XXX,XX +XXX,XX @@ static void gen_binv(TCGv ret, TCGv arg1, TCGv shamt) | ||
103 | |||
104 | gen_sbop_mask(t, shamt); | ||
105 | tcg_gen_xor_tl(ret, arg1, t); | ||
106 | - | ||
107 | - tcg_temp_free(t); | ||
108 | } | ||
109 | |||
110 | static bool trans_binv(DisasContext *ctx, arg_binv *a) | ||
111 | @@ -XXX,XX +XXX,XX @@ static void gen_rorw(TCGv ret, TCGv arg1, TCGv arg2) | ||
112 | |||
113 | /* sign-extend 64-bits */ | ||
114 | tcg_gen_ext_i32_tl(ret, t1); | ||
115 | - | ||
116 | - tcg_temp_free_i32(t1); | ||
117 | - tcg_temp_free_i32(t2); | ||
118 | } | ||
119 | |||
120 | static bool trans_ror(DisasContext *ctx, arg_ror *a) | ||
121 | @@ -XXX,XX +XXX,XX @@ static void gen_roriw(TCGv ret, TCGv arg1, target_long shamt) | ||
122 | tcg_gen_trunc_tl_i32(t1, arg1); | ||
123 | tcg_gen_rotri_i32(t1, t1, shamt); | ||
124 | tcg_gen_ext_i32_tl(ret, t1); | ||
125 | - | ||
126 | - tcg_temp_free_i32(t1); | ||
127 | } | ||
128 | |||
129 | static bool trans_rori(DisasContext *ctx, arg_rori *a) | ||
130 | @@ -XXX,XX +XXX,XX @@ static void gen_rolw(TCGv ret, TCGv arg1, TCGv arg2) | ||
131 | |||
132 | /* sign-extend 64-bits */ | ||
133 | tcg_gen_ext_i32_tl(ret, t1); | ||
134 | - | ||
135 | - tcg_temp_free_i32(t1); | ||
136 | - tcg_temp_free_i32(t2); | ||
137 | } | ||
138 | |||
139 | static bool trans_rol(DisasContext *ctx, arg_rol *a) | ||
140 | @@ -XXX,XX +XXX,XX @@ static void gen_orc_b(TCGv ret, TCGv source1) | ||
141 | |||
142 | /* Replicate the lsb of each byte across the byte. */ | ||
143 | tcg_gen_muli_tl(ret, tmp, 0xff); | ||
144 | - | ||
145 | - tcg_temp_free(tmp); | ||
146 | } | ||
147 | |||
148 | static bool trans_orc_b(DisasContext *ctx, arg_orc_b *a) | ||
149 | @@ -XXX,XX +XXX,XX @@ static void gen_sh##SHAMT##add(TCGv ret, TCGv arg1, TCGv arg2) \ | ||
150 | \ | ||
151 | tcg_gen_shli_tl(t, arg1, SHAMT); \ | ||
152 | tcg_gen_add_tl(ret, t, arg2); \ | ||
153 | - \ | ||
154 | - tcg_temp_free(t); \ | ||
155 | } | ||
156 | |||
157 | GEN_SHADD(1) | ||
158 | @@ -XXX,XX +XXX,XX @@ static void gen_sh##SHAMT##add_uw(TCGv ret, TCGv arg1, TCGv arg2) \ | ||
159 | \ | ||
160 | tcg_gen_shli_tl(t, t, SHAMT); \ | ||
161 | tcg_gen_add_tl(ret, t, arg2); \ | ||
162 | - \ | ||
163 | - tcg_temp_free(t); \ | ||
164 | } | ||
165 | |||
166 | GEN_SHADD_UW(1) | ||
167 | @@ -XXX,XX +XXX,XX @@ static void gen_add_uw(TCGv ret, TCGv arg1, TCGv arg2) | ||
168 | TCGv t = tcg_temp_new(); | ||
169 | tcg_gen_ext32u_tl(t, arg1); | ||
170 | tcg_gen_add_tl(ret, t, arg2); | ||
171 | - tcg_temp_free(t); | ||
172 | } | ||
173 | |||
174 | static bool trans_add_uw(DisasContext *ctx, arg_add_uw *a) | ||
175 | @@ -XXX,XX +XXX,XX @@ static void gen_packh(TCGv ret, TCGv src1, TCGv src2) | ||
176 | |||
177 | tcg_gen_ext8u_tl(t, src2); | ||
178 | tcg_gen_deposit_tl(ret, src1, t, 8, TARGET_LONG_BITS - 8); | ||
179 | - tcg_temp_free(t); | ||
180 | } | ||
181 | |||
182 | static void gen_packw(TCGv ret, TCGv src1, TCGv src2) | ||
183 | @@ -XXX,XX +XXX,XX @@ static void gen_packw(TCGv ret, TCGv src1, TCGv src2) | ||
184 | |||
185 | tcg_gen_ext16s_tl(t, src2); | ||
186 | tcg_gen_deposit_tl(ret, src1, t, 16, TARGET_LONG_BITS - 16); | ||
187 | - tcg_temp_free(t); | ||
188 | } | ||
189 | |||
190 | static bool trans_brev8(DisasContext *ctx, arg_brev8 *a) | ||
191 | diff --git a/target/riscv/insn_trans/trans_rvd.c.inc b/target/riscv/insn_trans/trans_rvd.c.inc | ||
192 | index XXXXXXX..XXXXXXX 100644 | ||
193 | --- a/target/riscv/insn_trans/trans_rvd.c.inc | ||
194 | +++ b/target/riscv/insn_trans/trans_rvd.c.inc | ||
195 | @@ -XXX,XX +XXX,XX @@ static bool trans_fsgnjn_d(DisasContext *ctx, arg_fsgnjn_d *a) | ||
196 | TCGv_i64 t0 = tcg_temp_new_i64(); | ||
197 | tcg_gen_not_i64(t0, src2); | ||
198 | tcg_gen_deposit_i64(dest, t0, src1, 0, 63); | ||
199 | - tcg_temp_free_i64(t0); | ||
200 | } | ||
201 | gen_set_fpr_d(ctx, a->rd, dest); | ||
202 | mark_fs_dirty(ctx); | ||
203 | @@ -XXX,XX +XXX,XX @@ static bool trans_fsgnjx_d(DisasContext *ctx, arg_fsgnjx_d *a) | ||
204 | TCGv_i64 t0 = tcg_temp_new_i64(); | ||
205 | tcg_gen_andi_i64(t0, src2, INT64_MIN); | ||
206 | tcg_gen_xor_i64(dest, src1, t0); | ||
207 | - tcg_temp_free_i64(t0); | ||
208 | } | ||
209 | gen_set_fpr_d(ctx, a->rd, dest); | ||
210 | mark_fs_dirty(ctx); | ||
211 | diff --git a/target/riscv/insn_trans/trans_rvf.c.inc b/target/riscv/insn_trans/trans_rvf.c.inc | ||
212 | index XXXXXXX..XXXXXXX 100644 | ||
213 | --- a/target/riscv/insn_trans/trans_rvf.c.inc | ||
214 | +++ b/target/riscv/insn_trans/trans_rvf.c.inc | ||
215 | @@ -XXX,XX +XXX,XX @@ static bool trans_fsgnj_s(DisasContext *ctx, arg_fsgnj_s *a) | ||
216 | |||
217 | /* This formulation retains the nanboxing of rs2 in normal 'F'. */ | ||
218 | tcg_gen_deposit_i64(dest, rs2, rs1, 0, 31); | ||
219 | - | ||
220 | - tcg_temp_free_i64(rs1); | ||
221 | - tcg_temp_free_i64(rs2); | ||
222 | } else { | ||
223 | tcg_gen_deposit_i64(dest, src2, src1, 0, 31); | ||
224 | tcg_gen_ext32s_i64(dest, dest); | ||
225 | @@ -XXX,XX +XXX,XX @@ static bool trans_fsgnjn_s(DisasContext *ctx, arg_fsgnjn_s *a) | ||
226 | tcg_gen_nor_i64(rs2, rs2, mask); | ||
227 | tcg_gen_and_i64(dest, mask, rs1); | ||
228 | tcg_gen_or_i64(dest, dest, rs2); | ||
229 | - | ||
230 | - tcg_temp_free_i64(rs2); | ||
231 | } | ||
232 | /* signed-extended intead of nanboxing for result if enable zfinx */ | ||
233 | if (ctx->cfg_ptr->ext_zfinx) { | ||
234 | tcg_gen_ext32s_i64(dest, dest); | ||
235 | } | ||
236 | gen_set_fpr_hs(ctx, a->rd, dest); | ||
237 | - tcg_temp_free_i64(rs1); | ||
238 | mark_fs_dirty(ctx); | ||
239 | return true; | ||
240 | } | ||
241 | @@ -XXX,XX +XXX,XX @@ static bool trans_fsgnjx_s(DisasContext *ctx, arg_fsgnjx_s *a) | ||
242 | */ | ||
243 | tcg_gen_andi_i64(dest, rs2, MAKE_64BIT_MASK(31, 1)); | ||
244 | tcg_gen_xor_i64(dest, rs1, dest); | ||
245 | - | ||
246 | - tcg_temp_free_i64(rs2); | ||
247 | } | ||
248 | /* signed-extended intead of nanboxing for result if enable zfinx */ | ||
249 | if (ctx->cfg_ptr->ext_zfinx) { | ||
250 | tcg_gen_ext32s_i64(dest, dest); | ||
251 | } | ||
252 | - tcg_temp_free_i64(rs1); | ||
253 | gen_set_fpr_hs(ctx, a->rd, dest); | ||
254 | mark_fs_dirty(ctx); | ||
255 | return true; | ||
256 | diff --git a/target/riscv/insn_trans/trans_rvi.c.inc b/target/riscv/insn_trans/trans_rvi.c.inc | ||
257 | index XXXXXXX..XXXXXXX 100644 | ||
258 | --- a/target/riscv/insn_trans/trans_rvi.c.inc | ||
259 | +++ b/target/riscv/insn_trans/trans_rvi.c.inc | ||
260 | @@ -XXX,XX +XXX,XX @@ static bool trans_jalr(DisasContext *ctx, arg_jalr *a) | ||
261 | misaligned = gen_new_label(); | ||
262 | tcg_gen_andi_tl(t0, cpu_pc, 0x2); | ||
263 | tcg_gen_brcondi_tl(TCG_COND_NE, t0, 0x0, misaligned); | ||
264 | - tcg_temp_free(t0); | ||
265 | } | ||
266 | |||
267 | gen_set_gpri(ctx, a->rd, ctx->pc_succ_insn); | ||
268 | @@ -XXX,XX +XXX,XX @@ static TCGCond gen_compare_i128(bool bz, TCGv rl, | ||
269 | tcg_gen_xor_tl(tmp, ah, bh); | ||
270 | tcg_gen_and_tl(rl, rl, tmp); | ||
271 | tcg_gen_xor_tl(rl, rh, rl); | ||
272 | - | ||
273 | - tcg_temp_free(tmp); | ||
274 | } | ||
275 | break; | ||
276 | |||
277 | @@ -XXX,XX +XXX,XX @@ static TCGCond gen_compare_i128(bool bz, TCGv rl, | ||
278 | /* seed third word with 1, which will be result */ | ||
279 | tcg_gen_sub2_tl(tmp, rh, ah, one, tmp, zero); | ||
280 | tcg_gen_sub2_tl(tmp, rl, tmp, rh, bh, zero); | ||
281 | - | ||
282 | - tcg_temp_free(tmp); | ||
283 | } | ||
284 | break; | ||
285 | |||
286 | @@ -XXX,XX +XXX,XX @@ static TCGCond gen_compare_i128(bool bz, TCGv rl, | ||
287 | if (invert) { | ||
288 | cond = tcg_invert_cond(cond); | ||
289 | } | ||
290 | - | ||
291 | - tcg_temp_free(rh); | ||
292 | return cond; | ||
293 | } | ||
294 | |||
295 | @@ -XXX,XX +XXX,XX @@ static bool gen_branch(DisasContext *ctx, arg_b *a, TCGCond cond) | ||
296 | cond = gen_compare_i128(a->rs2 == 0, | ||
297 | tmp, src1, src1h, src2, src2h, cond); | ||
298 | tcg_gen_brcondi_tl(cond, tmp, 0, l); | ||
299 | - | ||
300 | - tcg_temp_free(tmp); | ||
301 | } else { | ||
302 | tcg_gen_brcond_tl(cond, src1, src2, l); | ||
303 | } | ||
304 | @@ -XXX,XX +XXX,XX @@ static bool gen_load_i128(DisasContext *ctx, arg_lb *a, MemOp memop) | ||
305 | } | ||
306 | |||
307 | gen_set_gpr128(ctx, a->rd, destl, desth); | ||
308 | - | ||
309 | - tcg_temp_free(addrl); | ||
310 | return true; | ||
311 | } | ||
312 | |||
313 | @@ -XXX,XX +XXX,XX @@ static bool gen_store_i128(DisasContext *ctx, arg_sb *a, MemOp memop) | ||
314 | tcg_gen_addi_tl(addrl, addrl, 8); | ||
315 | tcg_gen_qemu_st_tl(src2h, addrl, ctx->mem_idx, MO_TEUQ); | ||
316 | } | ||
317 | - | ||
318 | - tcg_temp_free(addrl); | ||
319 | return true; | ||
320 | } | ||
321 | |||
322 | @@ -XXX,XX +XXX,XX @@ static void gen_sll_i128(TCGv destl, TCGv desth, | ||
323 | |||
324 | tcg_gen_movcond_tl(TCG_COND_NE, destl, hs, zero, zero, ll); | ||
325 | tcg_gen_movcond_tl(TCG_COND_NE, desth, hs, zero, ll, h1); | ||
326 | - | ||
327 | - tcg_temp_free(ls); | ||
328 | - tcg_temp_free(rs); | ||
329 | - tcg_temp_free(hs); | ||
330 | - tcg_temp_free(ll); | ||
331 | - tcg_temp_free(lr); | ||
332 | - tcg_temp_free(h0); | ||
333 | - tcg_temp_free(h1); | ||
334 | } | ||
335 | |||
336 | static bool trans_sll(DisasContext *ctx, arg_sll *a) | ||
337 | @@ -XXX,XX +XXX,XX @@ static void gen_srl_i128(TCGv destl, TCGv desth, | ||
338 | |||
339 | tcg_gen_movcond_tl(TCG_COND_NE, destl, hs, zero, h1, h0); | ||
340 | tcg_gen_movcond_tl(TCG_COND_NE, desth, hs, zero, zero, h1); | ||
341 | - | ||
342 | - tcg_temp_free(ls); | ||
343 | - tcg_temp_free(rs); | ||
344 | - tcg_temp_free(hs); | ||
345 | - tcg_temp_free(ll); | ||
346 | - tcg_temp_free(lr); | ||
347 | - tcg_temp_free(h0); | ||
348 | - tcg_temp_free(h1); | ||
349 | } | ||
350 | |||
351 | static bool trans_srl(DisasContext *ctx, arg_srl *a) | ||
352 | @@ -XXX,XX +XXX,XX @@ static void gen_sra_i128(TCGv destl, TCGv desth, | ||
353 | |||
354 | tcg_gen_movcond_tl(TCG_COND_NE, destl, hs, zero, h1, h0); | ||
355 | tcg_gen_movcond_tl(TCG_COND_NE, desth, hs, zero, lr, h1); | ||
356 | - | ||
357 | - tcg_temp_free(ls); | ||
358 | - tcg_temp_free(rs); | ||
359 | - tcg_temp_free(hs); | ||
360 | - tcg_temp_free(ll); | ||
361 | - tcg_temp_free(lr); | ||
362 | - tcg_temp_free(h0); | ||
363 | - tcg_temp_free(h1); | ||
364 | } | ||
365 | |||
366 | static bool trans_sra(DisasContext *ctx, arg_sra *a) | ||
367 | diff --git a/target/riscv/insn_trans/trans_rvk.c.inc b/target/riscv/insn_trans/trans_rvk.c.inc | ||
368 | index XXXXXXX..XXXXXXX 100644 | ||
369 | --- a/target/riscv/insn_trans/trans_rvk.c.inc | ||
370 | +++ b/target/riscv/insn_trans/trans_rvk.c.inc | ||
371 | @@ -XXX,XX +XXX,XX @@ static bool gen_sha256(DisasContext *ctx, arg_r2 *a, DisasExtend ext, | ||
372 | tcg_gen_ext_i32_tl(dest, t1); | ||
373 | |||
374 | gen_set_gpr(ctx, a->rd, dest); | ||
375 | - tcg_temp_free_i32(t0); | ||
376 | - tcg_temp_free_i32(t1); | ||
377 | - tcg_temp_free_i32(t2); | ||
378 | return true; | ||
379 | } | ||
380 | |||
381 | @@ -XXX,XX +XXX,XX @@ static bool gen_sha512_rv32(DisasContext *ctx, arg_r *a, DisasExtend ext, | ||
382 | tcg_gen_trunc_i64_tl(dest, t1); | ||
383 | |||
384 | gen_set_gpr(ctx, a->rd, dest); | ||
385 | - tcg_temp_free_i64(t0); | ||
386 | - tcg_temp_free_i64(t1); | ||
387 | - tcg_temp_free_i64(t2); | ||
388 | return true; | ||
389 | } | ||
390 | |||
391 | @@ -XXX,XX +XXX,XX @@ static bool gen_sha512h_rv32(DisasContext *ctx, arg_r *a, DisasExtend ext, | ||
392 | tcg_gen_trunc_i64_tl(dest, t1); | ||
393 | |||
394 | gen_set_gpr(ctx, a->rd, dest); | ||
395 | - tcg_temp_free_i64(t0); | ||
396 | - tcg_temp_free_i64(t1); | ||
397 | - tcg_temp_free_i64(t2); | ||
398 | return true; | ||
399 | } | ||
400 | |||
401 | @@ -XXX,XX +XXX,XX @@ static bool gen_sha512_rv64(DisasContext *ctx, arg_r2 *a, DisasExtend ext, | ||
402 | tcg_gen_trunc_i64_tl(dest, t1); | ||
403 | |||
404 | gen_set_gpr(ctx, a->rd, dest); | ||
405 | - tcg_temp_free_i64(t0); | ||
406 | - tcg_temp_free_i64(t1); | ||
407 | - tcg_temp_free_i64(t2); | ||
408 | return true; | ||
409 | } | ||
410 | |||
411 | @@ -XXX,XX +XXX,XX @@ static bool gen_sm3(DisasContext *ctx, arg_r2 *a, int32_t b, int32_t c) | ||
412 | tcg_gen_xor_i32(t1, t1, t0); | ||
413 | tcg_gen_ext_i32_tl(dest, t1); | ||
414 | gen_set_gpr(ctx, a->rd, dest); | ||
415 | - | ||
416 | - tcg_temp_free_i32(t0); | ||
417 | - tcg_temp_free_i32(t1); | ||
418 | return true; | ||
419 | } | ||
420 | |||
421 | diff --git a/target/riscv/insn_trans/trans_rvm.c.inc b/target/riscv/insn_trans/trans_rvm.c.inc | ||
422 | index XXXXXXX..XXXXXXX 100644 | ||
423 | --- a/target/riscv/insn_trans/trans_rvm.c.inc | ||
424 | +++ b/target/riscv/insn_trans/trans_rvm.c.inc | ||
425 | @@ -XXX,XX +XXX,XX @@ static void gen_mulhu_i128(TCGv r2, TCGv r3, TCGv al, TCGv ah, TCGv bl, TCGv bh) | ||
426 | |||
427 | tcg_gen_mulu2_tl(tmpl, tmph, ah, bh); | ||
428 | tcg_gen_add2_tl(r2, r3, r2, r3, tmpl, tmph); | ||
429 | - | ||
430 | - tcg_temp_free(tmpl); | ||
431 | - tcg_temp_free(tmph); | ||
432 | } | ||
433 | |||
434 | static void gen_mul_i128(TCGv rl, TCGv rh, | ||
435 | @@ -XXX,XX +XXX,XX @@ static void gen_mul_i128(TCGv rl, TCGv rh, | ||
436 | tcg_gen_add2_tl(rh, tmpx, rh, zero, tmpl, tmph); | ||
437 | tcg_gen_mulu2_tl(tmpl, tmph, rs1h, rs2l); | ||
438 | tcg_gen_add2_tl(rh, tmph, rh, tmpx, tmpl, tmph); | ||
439 | - | ||
440 | - tcg_temp_free(tmpl); | ||
441 | - tcg_temp_free(tmph); | ||
442 | - tcg_temp_free(tmpx); | ||
443 | } | ||
444 | |||
445 | static bool trans_mul(DisasContext *ctx, arg_mul *a) | ||
446 | @@ -XXX,XX +XXX,XX @@ static void gen_mulh_i128(TCGv rl, TCGv rh, | ||
447 | tcg_gen_and_tl(t1h, t1h, rs1h); | ||
448 | tcg_gen_sub2_tl(t0l, t0h, rl, rh, t0l, t0h); | ||
449 | tcg_gen_sub2_tl(rl, rh, t0l, t0h, t1l, t1h); | ||
450 | - | ||
451 | - tcg_temp_free(t0l); | ||
452 | - tcg_temp_free(t0h); | ||
453 | - tcg_temp_free(t1l); | ||
454 | - tcg_temp_free(t1h); | ||
455 | } | ||
456 | |||
457 | static void gen_mulh(TCGv ret, TCGv s1, TCGv s2) | ||
458 | @@ -XXX,XX +XXX,XX @@ static void gen_mulh(TCGv ret, TCGv s1, TCGv s2) | ||
459 | TCGv discard = tcg_temp_new(); | ||
460 | |||
461 | tcg_gen_muls2_tl(discard, ret, s1, s2); | ||
462 | - tcg_temp_free(discard); | ||
463 | } | ||
464 | |||
465 | static void gen_mulh_w(TCGv ret, TCGv s1, TCGv s2) | ||
466 | @@ -XXX,XX +XXX,XX @@ static void gen_mulhsu_i128(TCGv rl, TCGv rh, | ||
467 | tcg_gen_and_tl(t0l, t0h, rs2l); | ||
468 | tcg_gen_and_tl(t0h, t0h, rs2h); | ||
469 | tcg_gen_sub2_tl(rl, rh, rl, rh, t0l, t0h); | ||
470 | - | ||
471 | - tcg_temp_free(t0l); | ||
472 | - tcg_temp_free(t0h); | ||
473 | } | ||
474 | |||
475 | static void gen_mulhsu(TCGv ret, TCGv arg1, TCGv arg2) | ||
476 | @@ -XXX,XX +XXX,XX @@ static void gen_mulhsu(TCGv ret, TCGv arg1, TCGv arg2) | ||
477 | tcg_gen_sari_tl(rl, arg1, TARGET_LONG_BITS - 1); | ||
478 | tcg_gen_and_tl(rl, rl, arg2); | ||
479 | tcg_gen_sub_tl(ret, rh, rl); | ||
480 | - | ||
481 | - tcg_temp_free(rl); | ||
482 | - tcg_temp_free(rh); | ||
483 | } | ||
484 | |||
485 | static void gen_mulhsu_w(TCGv ret, TCGv arg1, TCGv arg2) | ||
486 | @@ -XXX,XX +XXX,XX @@ static void gen_mulhsu_w(TCGv ret, TCGv arg1, TCGv arg2) | ||
487 | tcg_gen_ext32s_tl(t1, arg1); | ||
488 | tcg_gen_ext32u_tl(t2, arg2); | ||
489 | tcg_gen_mul_tl(ret, t1, t2); | ||
490 | - tcg_temp_free(t1); | ||
491 | - tcg_temp_free(t2); | ||
492 | tcg_gen_sari_tl(ret, ret, 32); | ||
493 | } | ||
494 | |||
495 | @@ -XXX,XX +XXX,XX @@ static void gen_mulhu(TCGv ret, TCGv s1, TCGv s2) | ||
496 | TCGv discard = tcg_temp_new(); | ||
497 | |||
498 | tcg_gen_mulu2_tl(discard, ret, s1, s2); | ||
499 | - tcg_temp_free(discard); | ||
500 | } | ||
501 | |||
502 | static bool trans_mulhu(DisasContext *ctx, arg_mulhu *a) | ||
503 | @@ -XXX,XX +XXX,XX @@ static void gen_div(TCGv ret, TCGv source1, TCGv source2) | ||
504 | tcg_gen_movcond_tl(TCG_COND_EQ, temp2, source2, zero, one, temp2); | ||
505 | |||
506 | tcg_gen_div_tl(ret, temp1, temp2); | ||
507 | - | ||
508 | - tcg_temp_free(temp1); | ||
509 | - tcg_temp_free(temp2); | ||
510 | } | ||
511 | |||
512 | static bool trans_div(DisasContext *ctx, arg_div *a) | ||
513 | @@ -XXX,XX +XXX,XX @@ static void gen_divu(TCGv ret, TCGv source1, TCGv source2) | ||
514 | tcg_gen_movcond_tl(TCG_COND_EQ, temp1, source2, zero, max, source1); | ||
515 | tcg_gen_movcond_tl(TCG_COND_EQ, temp2, source2, zero, one, source2); | ||
516 | tcg_gen_divu_tl(ret, temp1, temp2); | ||
517 | - | ||
518 | - tcg_temp_free(temp1); | ||
519 | - tcg_temp_free(temp2); | ||
520 | } | ||
521 | |||
522 | static bool trans_divu(DisasContext *ctx, arg_divu *a) | ||
523 | @@ -XXX,XX +XXX,XX @@ static void gen_rem(TCGv ret, TCGv source1, TCGv source2) | ||
524 | |||
525 | /* If div by zero, the required result is the original dividend. */ | ||
526 | tcg_gen_movcond_tl(TCG_COND_EQ, ret, source2, zero, source1, temp1); | ||
527 | - | ||
528 | - tcg_temp_free(temp1); | ||
529 | - tcg_temp_free(temp2); | ||
530 | } | ||
531 | |||
532 | static bool trans_rem(DisasContext *ctx, arg_rem *a) | ||
533 | @@ -XXX,XX +XXX,XX @@ static void gen_remu(TCGv ret, TCGv source1, TCGv source2) | ||
534 | |||
535 | /* If div by zero, the required result is the original dividend. */ | ||
536 | tcg_gen_movcond_tl(TCG_COND_EQ, ret, source2, zero, source1, temp); | ||
537 | - | ||
538 | - tcg_temp_free(temp); | ||
539 | } | ||
540 | |||
541 | static bool trans_remu(DisasContext *ctx, arg_remu *a) | ||
542 | diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc | ||
543 | index XXXXXXX..XXXXXXX 100644 | ||
544 | --- a/target/riscv/insn_trans/trans_rvv.c.inc | ||
545 | +++ b/target/riscv/insn_trans/trans_rvv.c.inc | ||
546 | @@ -XXX,XX +XXX,XX @@ static bool do_vsetvl(DisasContext *s, int rd, int rs1, TCGv s2) | ||
547 | gen_set_pc_imm(s, s->pc_succ_insn); | ||
548 | lookup_and_goto_ptr(s); | ||
549 | s->base.is_jmp = DISAS_NORETURN; | ||
550 | - | ||
551 | - if (rd == 0 && rs1 == 0) { | ||
552 | - tcg_temp_free(s1); | ||
553 | - } | ||
554 | - | ||
555 | return true; | ||
556 | } | ||
557 | |||
558 | @@ -XXX,XX +XXX,XX @@ static bool ldst_us_trans(uint32_t vd, uint32_t rs1, uint32_t data, | ||
559 | |||
560 | fn(dest, mask, base, cpu_env, desc); | ||
561 | |||
562 | - tcg_temp_free_ptr(dest); | ||
563 | - tcg_temp_free_ptr(mask); | ||
564 | - | ||
565 | if (!is_store) { | ||
566 | mark_vs_dirty(s); | ||
567 | } | ||
568 | @@ -XXX,XX +XXX,XX @@ static bool ldst_stride_trans(uint32_t vd, uint32_t rs1, uint32_t rs2, | ||
569 | |||
570 | fn(dest, mask, base, stride, cpu_env, desc); | ||
571 | |||
572 | - tcg_temp_free_ptr(dest); | ||
573 | - tcg_temp_free_ptr(mask); | ||
574 | - | ||
575 | if (!is_store) { | ||
576 | mark_vs_dirty(s); | ||
577 | } | ||
578 | @@ -XXX,XX +XXX,XX @@ static bool ldst_index_trans(uint32_t vd, uint32_t rs1, uint32_t vs2, | ||
579 | |||
580 | fn(dest, mask, base, index, cpu_env, desc); | ||
581 | |||
582 | - tcg_temp_free_ptr(dest); | ||
583 | - tcg_temp_free_ptr(mask); | ||
584 | - tcg_temp_free_ptr(index); | ||
585 | - | ||
586 | if (!is_store) { | ||
587 | mark_vs_dirty(s); | ||
588 | } | ||
589 | @@ -XXX,XX +XXX,XX @@ static bool ldff_trans(uint32_t vd, uint32_t rs1, uint32_t data, | ||
590 | |||
591 | fn(dest, mask, base, cpu_env, desc); | ||
592 | |||
593 | - tcg_temp_free_ptr(dest); | ||
594 | - tcg_temp_free_ptr(mask); | ||
595 | mark_vs_dirty(s); | ||
596 | gen_set_label(over); | ||
597 | return true; | ||
598 | @@ -XXX,XX +XXX,XX @@ static bool ldst_whole_trans(uint32_t vd, uint32_t rs1, uint32_t nf, | ||
599 | |||
600 | fn(dest, base, cpu_env, desc); | ||
601 | |||
602 | - tcg_temp_free_ptr(dest); | ||
603 | - | ||
604 | if (!is_store) { | ||
605 | mark_vs_dirty(s); | ||
606 | } | ||
607 | @@ -XXX,XX +XXX,XX @@ static bool opivx_trans(uint32_t vd, uint32_t rs1, uint32_t vs2, uint32_t vm, | ||
608 | |||
609 | fn(dest, mask, src1, src2, cpu_env, desc); | ||
610 | |||
611 | - tcg_temp_free_ptr(dest); | ||
612 | - tcg_temp_free_ptr(mask); | ||
613 | - tcg_temp_free_ptr(src2); | ||
614 | mark_vs_dirty(s); | ||
615 | gen_set_label(over); | ||
616 | return true; | ||
617 | @@ -XXX,XX +XXX,XX @@ do_opivx_gvec(DisasContext *s, arg_rmrr *a, GVecGen2sFn *gvec_fn, | ||
618 | gvec_fn(s->sew, vreg_ofs(s, a->rd), vreg_ofs(s, a->rs2), | ||
619 | src1, MAXSZ(s), MAXSZ(s)); | ||
620 | |||
621 | - tcg_temp_free_i64(src1); | ||
622 | mark_vs_dirty(s); | ||
623 | return true; | ||
624 | } | ||
625 | @@ -XXX,XX +XXX,XX @@ static bool opivi_trans(uint32_t vd, uint32_t imm, uint32_t vs2, uint32_t vm, | ||
626 | |||
627 | fn(dest, mask, src1, src2, cpu_env, desc); | ||
628 | |||
629 | - tcg_temp_free_ptr(dest); | ||
630 | - tcg_temp_free_ptr(mask); | ||
631 | - tcg_temp_free_ptr(src2); | ||
632 | mark_vs_dirty(s); | ||
633 | gen_set_label(over); | ||
634 | return true; | ||
635 | @@ -XXX,XX +XXX,XX @@ do_opivx_gvec_shift(DisasContext *s, arg_rmrr *a, GVecGen2sFn32 *gvec_fn, | ||
636 | gvec_fn(s->sew, vreg_ofs(s, a->rd), vreg_ofs(s, a->rs2), | ||
637 | src1, MAXSZ(s), MAXSZ(s)); | ||
638 | |||
639 | - tcg_temp_free_i32(src1); | ||
640 | mark_vs_dirty(s); | ||
641 | return true; | ||
642 | } | ||
643 | @@ -XXX,XX +XXX,XX @@ static bool trans_vmv_v_x(DisasContext *s, arg_vmv_v_x *a) | ||
644 | tcg_gen_ext_tl_i64(s1_i64, s1); | ||
645 | tcg_gen_gvec_dup_i64(s->sew, vreg_ofs(s, a->rd), | ||
646 | MAXSZ(s), MAXSZ(s), s1_i64); | ||
647 | - tcg_temp_free_i64(s1_i64); | ||
648 | } else { | ||
649 | tcg_gen_gvec_dup_tl(s->sew, vreg_ofs(s, a->rd), | ||
650 | MAXSZ(s), MAXSZ(s), s1); | ||
651 | @@ -XXX,XX +XXX,XX @@ static bool trans_vmv_v_x(DisasContext *s, arg_vmv_v_x *a) | ||
652 | s->cfg_ptr->vlen / 8, data)); | ||
653 | tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd)); | ||
654 | fns[s->sew](dest, s1_i64, cpu_env, desc); | ||
655 | - | ||
656 | - tcg_temp_free_ptr(dest); | ||
657 | - tcg_temp_free_i64(s1_i64); | ||
658 | } | ||
659 | |||
660 | mark_vs_dirty(s); | ||
661 | @@ -XXX,XX +XXX,XX @@ static bool trans_vmv_v_i(DisasContext *s, arg_vmv_v_i *a) | ||
662 | tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, a->rd)); | ||
663 | fns[s->sew](dest, s1, cpu_env, desc); | ||
664 | |||
665 | - tcg_temp_free_ptr(dest); | ||
666 | mark_vs_dirty(s); | ||
667 | gen_set_label(over); | ||
668 | } | ||
669 | @@ -XXX,XX +XXX,XX @@ static bool opfvf_trans(uint32_t vd, uint32_t rs1, uint32_t vs2, | ||
670 | |||
671 | fn(dest, mask, t1, src2, cpu_env, desc); | ||
672 | |||
673 | - tcg_temp_free_ptr(dest); | ||
674 | - tcg_temp_free_ptr(mask); | ||
675 | - tcg_temp_free_ptr(src2); | ||
676 | - tcg_temp_free_i64(t1); | ||
677 | mark_vs_dirty(s); | ||
678 | gen_set_label(over); | ||
679 | return true; | ||
680 | @@ -XXX,XX +XXX,XX @@ static bool trans_vfmv_v_f(DisasContext *s, arg_vfmv_v_f *a) | ||
681 | |||
682 | fns[s->sew - 1](dest, t1, cpu_env, desc); | ||
683 | |||
684 | - tcg_temp_free_ptr(dest); | ||
685 | mark_vs_dirty(s); | ||
686 | gen_set_label(over); | ||
687 | } | ||
688 | - tcg_temp_free_i64(t1); | ||
689 | return true; | ||
690 | } | ||
691 | return false; | ||
692 | @@ -XXX,XX +XXX,XX @@ static bool trans_vcpop_m(DisasContext *s, arg_rmr *a) | ||
693 | |||
694 | gen_helper_vcpop_m(dst, mask, src2, cpu_env, desc); | ||
695 | gen_set_gpr(s, a->rd, dst); | ||
696 | - | ||
697 | - tcg_temp_free_ptr(mask); | ||
698 | - tcg_temp_free_ptr(src2); | ||
699 | - | ||
700 | return true; | ||
701 | } | ||
702 | return false; | ||
703 | @@ -XXX,XX +XXX,XX @@ static bool trans_vfirst_m(DisasContext *s, arg_rmr *a) | ||
704 | |||
705 | gen_helper_vfirst_m(dst, mask, src2, cpu_env, desc); | ||
706 | gen_set_gpr(s, a->rd, dst); | ||
707 | - | ||
708 | - tcg_temp_free_ptr(mask); | ||
709 | - tcg_temp_free_ptr(src2); | ||
710 | return true; | ||
711 | } | ||
712 | return false; | ||
713 | @@ -XXX,XX +XXX,XX @@ static void vec_element_loadx(DisasContext *s, TCGv_i64 dest, | ||
714 | /* Perform the load. */ | ||
715 | load_element(dest, base, | ||
716 | vreg_ofs(s, vreg), s->sew, false); | ||
717 | - tcg_temp_free_ptr(base); | ||
718 | - tcg_temp_free_i32(ofs); | ||
719 | |||
720 | /* Flush out-of-range indexing to zero. */ | ||
721 | t_vlmax = tcg_constant_i64(vlmax); | ||
722 | @@ -XXX,XX +XXX,XX @@ static void vec_element_loadx(DisasContext *s, TCGv_i64 dest, | ||
723 | |||
724 | tcg_gen_movcond_i64(TCG_COND_LTU, dest, t_idx, | ||
725 | t_vlmax, dest, t_zero); | ||
726 | - | ||
727 | - tcg_temp_free_i64(t_idx); | ||
728 | } | ||
729 | |||
730 | static void vec_element_loadi(DisasContext *s, TCGv_i64 dest, | ||
731 | @@ -XXX,XX +XXX,XX @@ static bool trans_vmv_x_s(DisasContext *s, arg_vmv_x_s *a) | ||
732 | vec_element_loadi(s, t1, a->rs2, 0, true); | ||
733 | tcg_gen_trunc_i64_tl(dest, t1); | ||
734 | gen_set_gpr(s, a->rd, dest); | ||
735 | - tcg_temp_free_i64(t1); | ||
736 | - tcg_temp_free(dest); | ||
737 | - | ||
738 | return true; | ||
739 | } | ||
740 | return false; | ||
741 | @@ -XXX,XX +XXX,XX @@ static bool trans_vmv_s_x(DisasContext *s, arg_vmv_s_x *a) | ||
742 | s1 = get_gpr(s, a->rs1, EXT_NONE); | ||
743 | tcg_gen_ext_tl_i64(t1, s1); | ||
744 | vec_element_storei(s, a->rd, 0, t1); | ||
745 | - tcg_temp_free_i64(t1); | ||
746 | mark_vs_dirty(s); | ||
747 | gen_set_label(over); | ||
748 | return true; | ||
749 | @@ -XXX,XX +XXX,XX @@ static bool trans_vfmv_s_f(DisasContext *s, arg_vfmv_s_f *a) | ||
750 | do_nanbox(s, t1, cpu_fpr[a->rs1]); | ||
751 | |||
752 | vec_element_storei(s, a->rd, 0, t1); | ||
753 | - tcg_temp_free_i64(t1); | ||
754 | mark_vs_dirty(s); | ||
755 | gen_set_label(over); | ||
756 | return true; | ||
757 | @@ -XXX,XX +XXX,XX @@ static bool trans_vrgather_vx(DisasContext *s, arg_rmrr *a) | ||
758 | |||
759 | tcg_gen_gvec_dup_i64(s->sew, vreg_ofs(s, a->rd), | ||
760 | MAXSZ(s), MAXSZ(s), dest); | ||
761 | - tcg_temp_free_i64(dest); | ||
762 | mark_vs_dirty(s); | ||
763 | } else { | ||
764 | static gen_helper_opivx * const fns[4] = { | ||
765 | diff --git a/target/riscv/insn_trans/trans_rvzfh.c.inc b/target/riscv/insn_trans/trans_rvzfh.c.inc | ||
766 | index XXXXXXX..XXXXXXX 100644 | ||
767 | --- a/target/riscv/insn_trans/trans_rvzfh.c.inc | ||
768 | +++ b/target/riscv/insn_trans/trans_rvzfh.c.inc | ||
769 | @@ -XXX,XX +XXX,XX @@ static bool trans_fsgnj_h(DisasContext *ctx, arg_fsgnj_h *a) | ||
770 | |||
771 | /* This formulation retains the nanboxing of rs2 in normal 'Zfh'. */ | ||
772 | tcg_gen_deposit_i64(dest, rs2, rs1, 0, 15); | ||
773 | - | ||
774 | - tcg_temp_free_i64(rs1); | ||
775 | - tcg_temp_free_i64(rs2); | ||
776 | } else { | ||
777 | tcg_gen_deposit_i64(dest, src2, src1, 0, 15); | ||
778 | tcg_gen_ext16s_i64(dest, dest); | ||
779 | @@ -XXX,XX +XXX,XX @@ static bool trans_fsgnjn_h(DisasContext *ctx, arg_fsgnjn_h *a) | ||
780 | tcg_gen_andc_i64(rs2, rs2, mask); | ||
781 | tcg_gen_and_i64(dest, mask, rs1); | ||
782 | tcg_gen_or_i64(dest, dest, rs2); | ||
783 | - | ||
784 | - tcg_temp_free_i64(mask); | ||
785 | - tcg_temp_free_i64(rs2); | ||
786 | } | ||
787 | /* signed-extended intead of nanboxing for result if enable zfinx */ | ||
788 | if (ctx->cfg_ptr->ext_zfinx) { | ||
789 | tcg_gen_ext16s_i64(dest, dest); | ||
790 | } | ||
791 | - tcg_temp_free_i64(rs1); | ||
792 | mark_fs_dirty(ctx); | ||
793 | return true; | ||
794 | } | ||
795 | @@ -XXX,XX +XXX,XX @@ static bool trans_fsgnjx_h(DisasContext *ctx, arg_fsgnjx_h *a) | ||
796 | */ | ||
797 | tcg_gen_andi_i64(dest, rs2, MAKE_64BIT_MASK(15, 1)); | ||
798 | tcg_gen_xor_i64(dest, rs1, dest); | ||
799 | - | ||
800 | - tcg_temp_free_i64(rs2); | ||
801 | } | ||
802 | /* signed-extended intead of nanboxing for result if enable zfinx */ | ||
803 | if (ctx->cfg_ptr->ext_zfinx) { | ||
804 | tcg_gen_ext16s_i64(dest, dest); | ||
805 | } | ||
806 | - tcg_temp_free_i64(rs1); | ||
807 | mark_fs_dirty(ctx); | ||
808 | return true; | ||
809 | } | ||
810 | diff --git a/target/riscv/insn_trans/trans_xthead.c.inc b/target/riscv/insn_trans/trans_xthead.c.inc | ||
811 | index XXXXXXX..XXXXXXX 100644 | ||
812 | --- a/target/riscv/insn_trans/trans_xthead.c.inc | ||
813 | +++ b/target/riscv/insn_trans/trans_xthead.c.inc | ||
814 | @@ -XXX,XX +XXX,XX @@ static TCGv get_th_address_indexed(DisasContext *ctx, int rs1, int rs2, | ||
815 | tcg_gen_shli_tl(offs, src2, imm2); | ||
816 | } | ||
817 | |||
818 | - TCGv addr = get_address_indexed(ctx, rs1, offs); | ||
819 | - | ||
820 | - tcg_temp_free(offs); | ||
821 | - return addr; | ||
822 | + return get_address_indexed(ctx, rs1, offs); | ||
823 | } | ||
824 | |||
825 | /* XTheadBa */ | ||
826 | @@ -XXX,XX +XXX,XX @@ static void gen_th_addsl##SHAMT(TCGv ret, TCGv arg1, TCGv arg2) \ | ||
827 | TCGv t = tcg_temp_new(); \ | ||
828 | tcg_gen_shli_tl(t, arg2, SHAMT); \ | ||
829 | tcg_gen_add_tl(ret, t, arg1); \ | ||
830 | - tcg_temp_free(t); \ | ||
831 | } | ||
832 | |||
833 | GEN_TH_ADDSL(1) | ||
834 | @@ -XXX,XX +XXX,XX @@ static bool gen_th_ff0(DisasContext *ctx, arg_th_ff0 *a, DisasExtend ext) | ||
835 | gen_clz(dest, t); | ||
836 | } | ||
837 | |||
838 | - tcg_temp_free(t); | ||
839 | gen_set_gpr(ctx, a->rd, dest); | ||
840 | |||
841 | return true; | ||
842 | @@ -XXX,XX +XXX,XX @@ static bool trans_th_fmv_hw_x(DisasContext *ctx, arg_th_fmv_hw_x *a) | ||
843 | |||
844 | tcg_gen_extu_tl_i64(t1, src1); | ||
845 | tcg_gen_deposit_i64(cpu_fpr[a->rd], cpu_fpr[a->rd], t1, 32, 32); | ||
846 | - tcg_temp_free_i64(t1); | ||
847 | mark_fs_dirty(ctx); | ||
848 | return true; | ||
849 | } | ||
850 | @@ -XXX,XX +XXX,XX @@ static bool trans_th_fmv_x_hw(DisasContext *ctx, arg_th_fmv_x_hw *a) | ||
851 | tcg_gen_extract_i64(t1, cpu_fpr[a->rs1], 32, 32); | ||
852 | tcg_gen_trunc_i64_tl(dst, t1); | ||
853 | gen_set_gpr(ctx, a->rd, dst); | ||
854 | - tcg_temp_free_i64(t1); | ||
855 | mark_fs_dirty(ctx); | ||
856 | return true; | ||
857 | } | ||
858 | @@ -XXX,XX +XXX,XX @@ static bool gen_th_mac(DisasContext *ctx, arg_r *a, | ||
859 | extend_operand_func(tmp, src1); | ||
860 | extend_operand_func(tmp2, src2); | ||
861 | tcg_gen_mul_tl(tmp, tmp, tmp2); | ||
862 | - tcg_temp_free(tmp2); | ||
863 | } else { | ||
864 | tcg_gen_mul_tl(tmp, src1, src2); | ||
865 | } | ||
866 | |||
867 | accumulate_func(dest, src0, tmp); | ||
868 | gen_set_gpr(ctx, a->rd, dest); | ||
869 | - tcg_temp_free(tmp); | ||
870 | - | ||
871 | return true; | ||
872 | } | ||
873 | |||
874 | @@ -XXX,XX +XXX,XX @@ static bool gen_load_inc(DisasContext *ctx, arg_th_meminc *a, MemOp memop, | ||
875 | tcg_gen_addi_tl(rs1, rs1, imm); | ||
876 | gen_set_gpr(ctx, a->rd, rd); | ||
877 | gen_set_gpr(ctx, a->rs1, rs1); | ||
878 | - | ||
879 | - tcg_temp_free(addr); | ||
880 | return true; | ||
881 | } | ||
882 | |||
883 | @@ -XXX,XX +XXX,XX @@ static bool gen_store_inc(DisasContext *ctx, arg_th_meminc *a, MemOp memop, | ||
884 | tcg_gen_qemu_st_tl(data, addr, ctx->mem_idx, memop); | ||
885 | tcg_gen_addi_tl(rs1, rs1, imm); | ||
886 | gen_set_gpr(ctx, a->rs1, rs1); | ||
887 | - | ||
888 | - tcg_temp_free(addr); | ||
889 | return true; | ||
890 | } | ||
891 | |||
892 | @@ -XXX,XX +XXX,XX @@ static bool gen_loadpair_tl(DisasContext *ctx, arg_th_pair *a, MemOp memop, | ||
893 | tcg_gen_qemu_ld_tl(t2, addr2, ctx->mem_idx, memop); | ||
894 | gen_set_gpr(ctx, a->rd1, t1); | ||
895 | gen_set_gpr(ctx, a->rd2, t2); | ||
896 | - | ||
897 | - tcg_temp_free(t1); | ||
898 | - tcg_temp_free(t2); | ||
899 | - tcg_temp_free(addr1); | ||
900 | - tcg_temp_free(addr2); | ||
901 | return true; | ||
902 | } | ||
903 | |||
904 | @@ -XXX,XX +XXX,XX @@ static bool gen_storepair_tl(DisasContext *ctx, arg_th_pair *a, MemOp memop, | ||
905 | |||
906 | tcg_gen_qemu_st_tl(data1, addr1, ctx->mem_idx, memop); | ||
907 | tcg_gen_qemu_st_tl(data2, addr2, ctx->mem_idx, memop); | ||
908 | - | ||
909 | - tcg_temp_free(addr1); | ||
910 | - tcg_temp_free(addr2); | ||
911 | return true; | ||
912 | } | ||
913 | |||
914 | -- | ||
915 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/rx/translate.c | 84 ------------------------------------------- | ||
7 | 1 file changed, 84 deletions(-) | ||
8 | |||
9 | diff --git a/target/rx/translate.c b/target/rx/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/rx/translate.c | ||
12 | +++ b/target/rx/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOV_rm(DisasContext *ctx, arg_MOV_rm *a) | ||
14 | mem = tcg_temp_new(); | ||
15 | tcg_gen_addi_i32(mem, cpu_regs[a->rd], a->dsp << a->sz); | ||
16 | rx_gen_st(a->sz, cpu_regs[a->rs], mem); | ||
17 | - tcg_temp_free(mem); | ||
18 | return true; | ||
19 | } | ||
20 | |||
21 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOV_mr(DisasContext *ctx, arg_MOV_mr *a) | ||
22 | mem = tcg_temp_new(); | ||
23 | tcg_gen_addi_i32(mem, cpu_regs[a->rs], a->dsp << a->sz); | ||
24 | rx_gen_ld(a->sz, cpu_regs[a->rd], mem); | ||
25 | - tcg_temp_free(mem); | ||
26 | return true; | ||
27 | } | ||
28 | |||
29 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOV_im(DisasContext *ctx, arg_MOV_im *a) | ||
30 | mem = tcg_temp_new(); | ||
31 | tcg_gen_addi_i32(mem, cpu_regs[a->rd], a->dsp << a->sz); | ||
32 | rx_gen_st(a->sz, imm, mem); | ||
33 | - tcg_temp_free(imm); | ||
34 | - tcg_temp_free(mem); | ||
35 | return true; | ||
36 | } | ||
37 | |||
38 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOV_ar(DisasContext *ctx, arg_MOV_ar *a) | ||
39 | mem = tcg_temp_new(); | ||
40 | rx_gen_regindex(ctx, mem, a->sz, a->ri, a->rb); | ||
41 | rx_gen_ld(a->sz, cpu_regs[a->rd], mem); | ||
42 | - tcg_temp_free(mem); | ||
43 | return true; | ||
44 | } | ||
45 | |||
46 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOV_ra(DisasContext *ctx, arg_MOV_ra *a) | ||
47 | mem = tcg_temp_new(); | ||
48 | rx_gen_regindex(ctx, mem, a->sz, a->ri, a->rb); | ||
49 | rx_gen_st(a->sz, cpu_regs[a->rs], mem); | ||
50 | - tcg_temp_free(mem); | ||
51 | return true; | ||
52 | } | ||
53 | |||
54 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOV_mm(DisasContext *ctx, arg_MOV_mm *a) | ||
55 | rx_gen_ld(a->sz, tmp, addr); | ||
56 | addr = rx_index_addr(ctx, mem, a->ldd, a->sz, a->rd); | ||
57 | rx_gen_st(a->sz, tmp, addr); | ||
58 | - tcg_temp_free(tmp); | ||
59 | } | ||
60 | - tcg_temp_free(mem); | ||
61 | return true; | ||
62 | } | ||
63 | |||
64 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOV_rp(DisasContext *ctx, arg_MOV_rp *a) | ||
65 | if (a->ad == 0) { | ||
66 | tcg_gen_addi_i32(cpu_regs[a->rd], cpu_regs[a->rd], 1 << a->sz); | ||
67 | } | ||
68 | - tcg_temp_free(val); | ||
69 | return true; | ||
70 | } | ||
71 | |||
72 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOV_pr(DisasContext *ctx, arg_MOV_pr *a) | ||
73 | tcg_gen_addi_i32(cpu_regs[a->rd], cpu_regs[a->rd], 1 << a->sz); | ||
74 | } | ||
75 | tcg_gen_mov_i32(cpu_regs[a->rs], val); | ||
76 | - tcg_temp_free(val); | ||
77 | return true; | ||
78 | } | ||
79 | |||
80 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOVU_mr(DisasContext *ctx, arg_MOVU_mr *a) | ||
81 | mem = tcg_temp_new(); | ||
82 | tcg_gen_addi_i32(mem, cpu_regs[a->rs], a->dsp << a->sz); | ||
83 | rx_gen_ldu(a->sz, cpu_regs[a->rd], mem); | ||
84 | - tcg_temp_free(mem); | ||
85 | return true; | ||
86 | } | ||
87 | |||
88 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOVU_ar(DisasContext *ctx, arg_MOVU_ar *a) | ||
89 | mem = tcg_temp_new(); | ||
90 | rx_gen_regindex(ctx, mem, a->sz, a->ri, a->rb); | ||
91 | rx_gen_ldu(a->sz, cpu_regs[a->rd], mem); | ||
92 | - tcg_temp_free(mem); | ||
93 | return true; | ||
94 | } | ||
95 | |||
96 | @@ -XXX,XX +XXX,XX @@ static bool trans_MOVU_pr(DisasContext *ctx, arg_MOVU_pr *a) | ||
97 | tcg_gen_addi_i32(cpu_regs[a->rd], cpu_regs[a->rd], 1 << a->sz); | ||
98 | } | ||
99 | tcg_gen_mov_i32(cpu_regs[a->rs], val); | ||
100 | - tcg_temp_free(val); | ||
101 | return true; | ||
102 | } | ||
103 | |||
104 | @@ -XXX,XX +XXX,XX @@ static bool trans_POPC(DisasContext *ctx, arg_POPC *a) | ||
105 | val = tcg_temp_new(); | ||
106 | pop(val); | ||
107 | move_to_cr(ctx, val, a->cr); | ||
108 | - tcg_temp_free(val); | ||
109 | return true; | ||
110 | } | ||
111 | |||
112 | @@ -XXX,XX +XXX,XX @@ static bool trans_PUSH_r(DisasContext *ctx, arg_PUSH_r *a) | ||
113 | tcg_gen_mov_i32(val, cpu_regs[a->rs]); | ||
114 | tcg_gen_subi_i32(cpu_sp, cpu_sp, 4); | ||
115 | rx_gen_st(a->sz, val, cpu_sp); | ||
116 | - tcg_temp_free(val); | ||
117 | return true; | ||
118 | } | ||
119 | |||
120 | @@ -XXX,XX +XXX,XX @@ static bool trans_PUSH_m(DisasContext *ctx, arg_PUSH_m *a) | ||
121 | rx_gen_ld(a->sz, val, addr); | ||
122 | tcg_gen_subi_i32(cpu_sp, cpu_sp, 4); | ||
123 | rx_gen_st(a->sz, val, cpu_sp); | ||
124 | - tcg_temp_free(mem); | ||
125 | - tcg_temp_free(val); | ||
126 | return true; | ||
127 | } | ||
128 | |||
129 | @@ -XXX,XX +XXX,XX @@ static bool trans_PUSHC(DisasContext *ctx, arg_PUSHC *a) | ||
130 | val = tcg_temp_new(); | ||
131 | move_from_cr(ctx, val, a->cr, ctx->pc); | ||
132 | push(val); | ||
133 | - tcg_temp_free(val); | ||
134 | return true; | ||
135 | } | ||
136 | |||
137 | @@ -XXX,XX +XXX,XX @@ static bool trans_XCHG_rr(DisasContext *ctx, arg_XCHG_rr *a) | ||
138 | tcg_gen_mov_i32(tmp, cpu_regs[a->rs]); | ||
139 | tcg_gen_mov_i32(cpu_regs[a->rs], cpu_regs[a->rd]); | ||
140 | tcg_gen_mov_i32(cpu_regs[a->rd], tmp); | ||
141 | - tcg_temp_free(tmp); | ||
142 | return true; | ||
143 | } | ||
144 | |||
145 | @@ -XXX,XX +XXX,XX @@ static bool trans_XCHG_mr(DisasContext *ctx, arg_XCHG_mr *a) | ||
146 | } | ||
147 | tcg_gen_atomic_xchg_i32(cpu_regs[a->rd], addr, cpu_regs[a->rd], | ||
148 | 0, mi_to_mop(a->mi)); | ||
149 | - tcg_temp_free(mem); | ||
150 | return true; | ||
151 | } | ||
152 | |||
153 | @@ -XXX,XX +XXX,XX @@ static inline void stcond(TCGCond cond, int rd, int imm) | ||
154 | _imm = tcg_const_i32(imm); | ||
155 | tcg_gen_movcond_i32(cond, cpu_regs[rd], cpu_psw_z, z, | ||
156 | _imm, cpu_regs[rd]); | ||
157 | - tcg_temp_free(z); | ||
158 | - tcg_temp_free(_imm); | ||
159 | } | ||
160 | |||
161 | /* stz #imm,rd */ | ||
162 | @@ -XXX,XX +XXX,XX @@ static bool trans_SCCnd(DisasContext *ctx, arg_SCCnd *a) | ||
163 | tcg_gen_setcondi_i32(dc.cond, val, dc.value, 0); | ||
164 | addr = rx_index_addr(ctx, mem, a->sz, a->ld, a->rd); | ||
165 | rx_gen_st(a->sz, val, addr); | ||
166 | - tcg_temp_free(val); | ||
167 | - tcg_temp_free(mem); | ||
168 | } else { | ||
169 | tcg_gen_setcondi_i32(dc.cond, cpu_regs[a->rd], dc.value, 0); | ||
170 | } | ||
171 | - tcg_temp_free(dc.temp); | ||
172 | return true; | ||
173 | } | ||
174 | |||
175 | @@ -XXX,XX +XXX,XX @@ static inline void rx_gen_op_irr(op3fn opr, int dst, int src, uint32_t src2) | ||
176 | { | ||
177 | TCGv imm = tcg_const_i32(src2); | ||
178 | opr(cpu_regs[dst], cpu_regs[src], imm); | ||
179 | - tcg_temp_free(imm); | ||
180 | } | ||
181 | |||
182 | static inline void rx_gen_op_mr(op3fn opr, DisasContext *ctx, | ||
183 | @@ -XXX,XX +XXX,XX @@ static inline void rx_gen_op_mr(op3fn opr, DisasContext *ctx, | ||
184 | mem = tcg_temp_new(); | ||
185 | val = rx_load_source(ctx, mem, ld, mi, src); | ||
186 | opr(cpu_regs[dst], cpu_regs[dst], val); | ||
187 | - tcg_temp_free(mem); | ||
188 | } | ||
189 | |||
190 | static void rx_and(TCGv ret, TCGv arg1, TCGv arg2) | ||
191 | @@ -XXX,XX +XXX,XX @@ static void rx_adc(TCGv ret, TCGv arg1, TCGv arg2) | ||
192 | tcg_gen_xor_i32(z, arg1, arg2); | ||
193 | tcg_gen_andc_i32(cpu_psw_o, cpu_psw_o, z); | ||
194 | tcg_gen_mov_i32(ret, cpu_psw_s); | ||
195 | - tcg_temp_free(z); | ||
196 | } | ||
197 | |||
198 | /* adc #imm, rd */ | ||
199 | @@ -XXX,XX +XXX,XX @@ static void rx_add(TCGv ret, TCGv arg1, TCGv arg2) | ||
200 | tcg_gen_xor_i32(z, arg1, arg2); | ||
201 | tcg_gen_andc_i32(cpu_psw_o, cpu_psw_o, z); | ||
202 | tcg_gen_mov_i32(ret, cpu_psw_s); | ||
203 | - tcg_temp_free(z); | ||
204 | } | ||
205 | |||
206 | /* add #uimm4, rd */ | ||
207 | @@ -XXX,XX +XXX,XX @@ static void rx_sub(TCGv ret, TCGv arg1, TCGv arg2) | ||
208 | temp = tcg_temp_new_i32(); | ||
209 | tcg_gen_xor_i32(temp, arg1, arg2); | ||
210 | tcg_gen_and_i32(cpu_psw_o, cpu_psw_o, temp); | ||
211 | - tcg_temp_free_i32(temp); | ||
212 | /* CMP not required return */ | ||
213 | if (ret) { | ||
214 | tcg_gen_mov_i32(ret, cpu_psw_s); | ||
215 | @@ -XXX,XX +XXX,XX @@ static void rx_sbb(TCGv ret, TCGv arg1, TCGv arg2) | ||
216 | temp = tcg_temp_new(); | ||
217 | tcg_gen_not_i32(temp, arg2); | ||
218 | rx_adc(ret, arg1, temp); | ||
219 | - tcg_temp_free(temp); | ||
220 | } | ||
221 | |||
222 | /* cmp #imm4, rs2 */ | ||
223 | @@ -XXX,XX +XXX,XX @@ static void rx_abs(TCGv ret, TCGv arg1) | ||
224 | zero = tcg_const_i32(0); | ||
225 | tcg_gen_neg_i32(neg, arg1); | ||
226 | tcg_gen_movcond_i32(TCG_COND_LT, ret, arg1, zero, neg, arg1); | ||
227 | - tcg_temp_free(neg); | ||
228 | - tcg_temp_free(zero); | ||
229 | } | ||
230 | |||
231 | /* abs rd */ | ||
232 | @@ -XXX,XX +XXX,XX @@ static bool trans_EMUL_ir(DisasContext *ctx, arg_EMUL_ir *a) | ||
233 | } | ||
234 | tcg_gen_muls2_i32(cpu_regs[a->rd], cpu_regs[(a->rd + 1) & 15], | ||
235 | cpu_regs[a->rd], imm); | ||
236 | - tcg_temp_free(imm); | ||
237 | return true; | ||
238 | } | ||
239 | |||
240 | @@ -XXX,XX +XXX,XX @@ static bool trans_EMUL_mr(DisasContext *ctx, arg_EMUL_mr *a) | ||
241 | val = rx_load_source(ctx, mem, a->ld, a->mi, a->rs); | ||
242 | tcg_gen_muls2_i32(cpu_regs[a->rd], cpu_regs[(a->rd + 1) & 15], | ||
243 | cpu_regs[a->rd], val); | ||
244 | - tcg_temp_free(mem); | ||
245 | return true; | ||
246 | } | ||
247 | |||
248 | @@ -XXX,XX +XXX,XX @@ static bool trans_EMULU_ir(DisasContext *ctx, arg_EMULU_ir *a) | ||
249 | } | ||
250 | tcg_gen_mulu2_i32(cpu_regs[a->rd], cpu_regs[(a->rd + 1) & 15], | ||
251 | cpu_regs[a->rd], imm); | ||
252 | - tcg_temp_free(imm); | ||
253 | return true; | ||
254 | } | ||
255 | |||
256 | @@ -XXX,XX +XXX,XX @@ static bool trans_EMULU_mr(DisasContext *ctx, arg_EMULU_mr *a) | ||
257 | val = rx_load_source(ctx, mem, a->ld, a->mi, a->rs); | ||
258 | tcg_gen_mulu2_i32(cpu_regs[a->rd], cpu_regs[(a->rd + 1) & 15], | ||
259 | cpu_regs[a->rd], val); | ||
260 | - tcg_temp_free(mem); | ||
261 | return true; | ||
262 | } | ||
263 | |||
264 | @@ -XXX,XX +XXX,XX @@ static bool trans_SHLL_rr(DisasContext *ctx, arg_SHLL_rr *a) | ||
265 | gen_set_label(done); | ||
266 | tcg_gen_mov_i32(cpu_psw_z, cpu_regs[a->rd]); | ||
267 | tcg_gen_mov_i32(cpu_psw_s, cpu_regs[a->rd]); | ||
268 | - tcg_temp_free(count); | ||
269 | - tcg_temp_free(tmp); | ||
270 | return true; | ||
271 | } | ||
272 | |||
273 | @@ -XXX,XX +XXX,XX @@ static inline void shiftr_reg(uint32_t rd, uint32_t rs, unsigned int alith) | ||
274 | tcg_gen_movi_i32(cpu_psw_o, 0); | ||
275 | tcg_gen_mov_i32(cpu_psw_z, cpu_regs[rd]); | ||
276 | tcg_gen_mov_i32(cpu_psw_s, cpu_regs[rd]); | ||
277 | - tcg_temp_free(count); | ||
278 | } | ||
279 | |||
280 | /* shar #imm:5, rd */ | ||
281 | @@ -XXX,XX +XXX,XX @@ static bool trans_ROLC(DisasContext *ctx, arg_ROLC *a) | ||
282 | tcg_gen_mov_i32(cpu_psw_c, tmp); | ||
283 | tcg_gen_mov_i32(cpu_psw_z, cpu_regs[a->rd]); | ||
284 | tcg_gen_mov_i32(cpu_psw_s, cpu_regs[a->rd]); | ||
285 | - tcg_temp_free(tmp); | ||
286 | return true; | ||
287 | } | ||
288 | |||
289 | @@ -XXX,XX +XXX,XX @@ static bool trans_REVW(DisasContext *ctx, arg_REVW *a) | ||
290 | tcg_gen_shri_i32(cpu_regs[a->rd], cpu_regs[a->rs], 8); | ||
291 | tcg_gen_andi_i32(cpu_regs[a->rd], cpu_regs[a->rd], 0x00ff00ff); | ||
292 | tcg_gen_or_i32(cpu_regs[a->rd], cpu_regs[a->rd], tmp); | ||
293 | - tcg_temp_free(tmp); | ||
294 | return true; | ||
295 | } | ||
296 | |||
297 | @@ -XXX,XX +XXX,XX @@ static void rx_bcnd_main(DisasContext *ctx, int cd, int dst) | ||
298 | gen_set_label(t); | ||
299 | gen_goto_tb(ctx, 1, ctx->pc + dst); | ||
300 | gen_set_label(done); | ||
301 | - tcg_temp_free(dc.temp); | ||
302 | break; | ||
303 | case 14: | ||
304 | /* always true case */ | ||
305 | @@ -XXX,XX +XXX,XX @@ static inline void rx_save_pc(DisasContext *ctx) | ||
306 | { | ||
307 | TCGv pc = tcg_const_i32(ctx->base.pc_next); | ||
308 | push(pc); | ||
309 | - tcg_temp_free(pc); | ||
310 | } | ||
311 | |||
312 | /* jmp rs */ | ||
313 | @@ -XXX,XX +XXX,XX @@ static bool trans_SMOVB(DisasContext *ctx, arg_SMOVB *a) | ||
314 | do { \ | ||
315 | TCGv size = tcg_const_i32(a->sz); \ | ||
316 | gen_helper_##op(cpu_env, size); \ | ||
317 | - tcg_temp_free(size); \ | ||
318 | } while (0) | ||
319 | |||
320 | /* suntile.<bwl> */ | ||
321 | @@ -XXX,XX +XXX,XX @@ static void rx_mul64hi(TCGv_i64 ret, int rs, int rs2) | ||
322 | tcg_gen_sari_i64(tmp1, tmp1, 16); | ||
323 | tcg_gen_mul_i64(ret, tmp0, tmp1); | ||
324 | tcg_gen_shli_i64(ret, ret, 16); | ||
325 | - tcg_temp_free_i64(tmp0); | ||
326 | - tcg_temp_free_i64(tmp1); | ||
327 | } | ||
328 | |||
329 | static void rx_mul64lo(TCGv_i64 ret, int rs, int rs2) | ||
330 | @@ -XXX,XX +XXX,XX @@ static void rx_mul64lo(TCGv_i64 ret, int rs, int rs2) | ||
331 | tcg_gen_ext16s_i64(tmp1, tmp1); | ||
332 | tcg_gen_mul_i64(ret, tmp0, tmp1); | ||
333 | tcg_gen_shli_i64(ret, ret, 16); | ||
334 | - tcg_temp_free_i64(tmp0); | ||
335 | - tcg_temp_free_i64(tmp1); | ||
336 | } | ||
337 | |||
338 | /* mulhi rs,rs2 */ | ||
339 | @@ -XXX,XX +XXX,XX @@ static bool trans_MACHI(DisasContext *ctx, arg_MACHI *a) | ||
340 | tmp = tcg_temp_new_i64(); | ||
341 | rx_mul64hi(tmp, a->rs, a->rs2); | ||
342 | tcg_gen_add_i64(cpu_acc, cpu_acc, tmp); | ||
343 | - tcg_temp_free_i64(tmp); | ||
344 | return true; | ||
345 | } | ||
346 | |||
347 | @@ -XXX,XX +XXX,XX @@ static bool trans_MACLO(DisasContext *ctx, arg_MACLO *a) | ||
348 | tmp = tcg_temp_new_i64(); | ||
349 | rx_mul64lo(tmp, a->rs, a->rs2); | ||
350 | tcg_gen_add_i64(cpu_acc, cpu_acc, tmp); | ||
351 | - tcg_temp_free_i64(tmp); | ||
352 | return true; | ||
353 | } | ||
354 | |||
355 | @@ -XXX,XX +XXX,XX @@ static bool trans_MVFACMI(DisasContext *ctx, arg_MVFACMI *a) | ||
356 | rd64 = tcg_temp_new_i64(); | ||
357 | tcg_gen_extract_i64(rd64, cpu_acc, 16, 32); | ||
358 | tcg_gen_extrl_i64_i32(cpu_regs[a->rd], rd64); | ||
359 | - tcg_temp_free_i64(rd64); | ||
360 | return true; | ||
361 | } | ||
362 | |||
363 | @@ -XXX,XX +XXX,XX @@ static bool trans_MVTACHI(DisasContext *ctx, arg_MVTACHI *a) | ||
364 | rs64 = tcg_temp_new_i64(); | ||
365 | tcg_gen_extu_i32_i64(rs64, cpu_regs[a->rs]); | ||
366 | tcg_gen_deposit_i64(cpu_acc, cpu_acc, rs64, 32, 32); | ||
367 | - tcg_temp_free_i64(rs64); | ||
368 | return true; | ||
369 | } | ||
370 | |||
371 | @@ -XXX,XX +XXX,XX @@ static bool trans_MVTACLO(DisasContext *ctx, arg_MVTACLO *a) | ||
372 | rs64 = tcg_temp_new_i64(); | ||
373 | tcg_gen_extu_i32_i64(rs64, cpu_regs[a->rs]); | ||
374 | tcg_gen_deposit_i64(cpu_acc, cpu_acc, rs64, 0, 32); | ||
375 | - tcg_temp_free_i64(rs64); | ||
376 | return true; | ||
377 | } | ||
378 | |||
379 | @@ -XXX,XX +XXX,XX @@ static bool trans_RACW(DisasContext *ctx, arg_RACW *a) | ||
380 | { | ||
381 | TCGv imm = tcg_const_i32(a->imm + 1); | ||
382 | gen_helper_racw(cpu_env, imm); | ||
383 | - tcg_temp_free(imm); | ||
384 | return true; | ||
385 | } | ||
386 | |||
387 | @@ -XXX,XX +XXX,XX @@ static bool trans_SAT(DisasContext *ctx, arg_SAT *a) | ||
388 | tcg_gen_xori_i32(tmp, tmp, 0x80000000); | ||
389 | tcg_gen_movcond_i32(TCG_COND_LT, cpu_regs[a->rd], | ||
390 | cpu_psw_o, z, tmp, cpu_regs[a->rd]); | ||
391 | - tcg_temp_free(tmp); | ||
392 | - tcg_temp_free(z); | ||
393 | return true; | ||
394 | } | ||
395 | |||
396 | @@ -XXX,XX +XXX,XX @@ static bool trans_SATR(DisasContext *ctx, arg_SATR *a) | ||
397 | TCGv imm = tcg_const_i32(li(ctx, 0)); \ | ||
398 | gen_helper_##op(cpu_regs[a->rd], cpu_env, \ | ||
399 | cpu_regs[a->rd], imm); \ | ||
400 | - tcg_temp_free(imm); \ | ||
401 | return true; \ | ||
402 | } \ | ||
403 | static bool cat3(trans_, name, _mr)(DisasContext *ctx, \ | ||
404 | @@ -XXX,XX +XXX,XX @@ static bool trans_SATR(DisasContext *ctx, arg_SATR *a) | ||
405 | val = rx_load_source(ctx, mem, a->ld, MO_32, a->rs); \ | ||
406 | gen_helper_##op(cpu_regs[a->rd], cpu_env, \ | ||
407 | cpu_regs[a->rd], val); \ | ||
408 | - tcg_temp_free(mem); \ | ||
409 | return true; \ | ||
410 | } | ||
411 | |||
412 | @@ -XXX,XX +XXX,XX @@ static bool trans_SATR(DisasContext *ctx, arg_SATR *a) | ||
413 | mem = tcg_temp_new(); \ | ||
414 | val = rx_load_source(ctx, mem, a->ld, MO_32, a->rs); \ | ||
415 | gen_helper_##op(cpu_regs[a->rd], cpu_env, val); \ | ||
416 | - tcg_temp_free(mem); \ | ||
417 | return true; \ | ||
418 | } | ||
419 | |||
420 | @@ -XXX,XX +XXX,XX @@ static bool trans_FCMP_ir(DisasContext *ctx, arg_FCMP_ir * a) | ||
421 | { | ||
422 | TCGv imm = tcg_const_i32(li(ctx, 0)); | ||
423 | gen_helper_fcmp(cpu_env, cpu_regs[a->rd], imm); | ||
424 | - tcg_temp_free(imm); | ||
425 | return true; | ||
426 | } | ||
427 | |||
428 | @@ -XXX,XX +XXX,XX @@ static bool trans_FCMP_mr(DisasContext *ctx, arg_FCMP_mr *a) | ||
429 | mem = tcg_temp_new(); | ||
430 | val = rx_load_source(ctx, mem, a->ld, MO_32, a->rs); | ||
431 | gen_helper_fcmp(cpu_env, cpu_regs[a->rd], val); | ||
432 | - tcg_temp_free(mem); | ||
433 | return true; | ||
434 | } | ||
435 | |||
436 | @@ -XXX,XX +XXX,XX @@ static bool trans_ITOF(DisasContext *ctx, arg_ITOF * a) | ||
437 | mem = tcg_temp_new(); | ||
438 | val = rx_load_source(ctx, mem, a->ld, a->mi, a->rs); | ||
439 | gen_helper_itof(cpu_regs[a->rd], cpu_env, val); | ||
440 | - tcg_temp_free(mem); | ||
441 | return true; | ||
442 | } | ||
443 | |||
444 | @@ -XXX,XX +XXX,XX @@ static void rx_bsetm(TCGv mem, TCGv mask) | ||
445 | rx_gen_ld(MO_8, val, mem); | ||
446 | tcg_gen_or_i32(val, val, mask); | ||
447 | rx_gen_st(MO_8, val, mem); | ||
448 | - tcg_temp_free(val); | ||
449 | } | ||
450 | |||
451 | static void rx_bclrm(TCGv mem, TCGv mask) | ||
452 | @@ -XXX,XX +XXX,XX @@ static void rx_bclrm(TCGv mem, TCGv mask) | ||
453 | rx_gen_ld(MO_8, val, mem); | ||
454 | tcg_gen_andc_i32(val, val, mask); | ||
455 | rx_gen_st(MO_8, val, mem); | ||
456 | - tcg_temp_free(val); | ||
457 | } | ||
458 | |||
459 | static void rx_btstm(TCGv mem, TCGv mask) | ||
460 | @@ -XXX,XX +XXX,XX @@ static void rx_btstm(TCGv mem, TCGv mask) | ||
461 | tcg_gen_and_i32(val, val, mask); | ||
462 | tcg_gen_setcondi_i32(TCG_COND_NE, cpu_psw_c, val, 0); | ||
463 | tcg_gen_mov_i32(cpu_psw_z, cpu_psw_c); | ||
464 | - tcg_temp_free(val); | ||
465 | } | ||
466 | |||
467 | static void rx_bnotm(TCGv mem, TCGv mask) | ||
468 | @@ -XXX,XX +XXX,XX @@ static void rx_bnotm(TCGv mem, TCGv mask) | ||
469 | rx_gen_ld(MO_8, val, mem); | ||
470 | tcg_gen_xor_i32(val, val, mask); | ||
471 | rx_gen_st(MO_8, val, mem); | ||
472 | - tcg_temp_free(val); | ||
473 | } | ||
474 | |||
475 | static void rx_bsetr(TCGv reg, TCGv mask) | ||
476 | @@ -XXX,XX +XXX,XX @@ static inline void rx_btstr(TCGv reg, TCGv mask) | ||
477 | tcg_gen_and_i32(t0, reg, mask); | ||
478 | tcg_gen_setcondi_i32(TCG_COND_NE, cpu_psw_c, t0, 0); | ||
479 | tcg_gen_mov_i32(cpu_psw_z, cpu_psw_c); | ||
480 | - tcg_temp_free(t0); | ||
481 | } | ||
482 | |||
483 | static inline void rx_bnotr(TCGv reg, TCGv mask) | ||
484 | @@ -XXX,XX +XXX,XX @@ static inline void rx_bnotr(TCGv reg, TCGv mask) | ||
485 | mask = tcg_const_i32(1 << a->imm); \ | ||
486 | addr = rx_index_addr(ctx, mem, a->ld, MO_8, a->rs); \ | ||
487 | cat3(rx_, op, m)(addr, mask); \ | ||
488 | - tcg_temp_free(mask); \ | ||
489 | - tcg_temp_free(mem); \ | ||
490 | return true; \ | ||
491 | } \ | ||
492 | static bool cat3(trans_, name, _ir)(DisasContext *ctx, \ | ||
493 | @@ -XXX,XX +XXX,XX @@ static inline void rx_bnotr(TCGv reg, TCGv mask) | ||
494 | TCGv mask; \ | ||
495 | mask = tcg_const_i32(1 << a->imm); \ | ||
496 | cat3(rx_, op, r)(cpu_regs[a->rd], mask); \ | ||
497 | - tcg_temp_free(mask); \ | ||
498 | return true; \ | ||
499 | } \ | ||
500 | static bool cat3(trans_, name, _rr)(DisasContext *ctx, \ | ||
501 | @@ -XXX,XX +XXX,XX @@ static inline void rx_bnotr(TCGv reg, TCGv mask) | ||
502 | tcg_gen_andi_i32(b, cpu_regs[a->rs], 31); \ | ||
503 | tcg_gen_shl_i32(mask, mask, b); \ | ||
504 | cat3(rx_, op, r)(cpu_regs[a->rd], mask); \ | ||
505 | - tcg_temp_free(mask); \ | ||
506 | - tcg_temp_free(b); \ | ||
507 | return true; \ | ||
508 | } \ | ||
509 | static bool cat3(trans_, name, _rm)(DisasContext *ctx, \ | ||
510 | @@ -XXX,XX +XXX,XX @@ static inline void rx_bnotr(TCGv reg, TCGv mask) | ||
511 | mem = tcg_temp_new(); \ | ||
512 | addr = rx_index_addr(ctx, mem, a->ld, MO_8, a->rs); \ | ||
513 | cat3(rx_, op, m)(addr, mask); \ | ||
514 | - tcg_temp_free(mem); \ | ||
515 | - tcg_temp_free(mask); \ | ||
516 | - tcg_temp_free(b); \ | ||
517 | return true; \ | ||
518 | } | ||
519 | |||
520 | @@ -XXX,XX +XXX,XX @@ static inline void bmcnd_op(TCGv val, TCGCond cond, int pos) | ||
521 | tcg_gen_andi_i32(val, val, ~(1 << pos)); | ||
522 | tcg_gen_setcondi_i32(dc.cond, bit, dc.value, 0); | ||
523 | tcg_gen_deposit_i32(val, val, bit, pos, 1); | ||
524 | - tcg_temp_free(bit); | ||
525 | - tcg_temp_free(dc.temp); | ||
526 | } | ||
527 | |||
528 | /* bmcnd #imm, dsp[rd] */ | ||
529 | @@ -XXX,XX +XXX,XX @@ static bool trans_BMCnd_im(DisasContext *ctx, arg_BMCnd_im *a) | ||
530 | rx_gen_ld(MO_8, val, addr); | ||
531 | bmcnd_op(val, a->cd, a->imm); | ||
532 | rx_gen_st(MO_8, val, addr); | ||
533 | - tcg_temp_free(val); | ||
534 | - tcg_temp_free(mem); | ||
535 | return true; | ||
536 | } | ||
537 | |||
538 | @@ -XXX,XX +XXX,XX @@ static bool trans_MVTC_i(DisasContext *ctx, arg_MVTC_i *a) | ||
539 | |||
540 | imm = tcg_const_i32(a->imm); | ||
541 | move_to_cr(ctx, imm, a->cr); | ||
542 | - tcg_temp_free(imm); | ||
543 | return true; | ||
544 | } | ||
545 | |||
546 | @@ -XXX,XX +XXX,XX @@ static bool trans_RTFI(DisasContext *ctx, arg_RTFI *a) | ||
547 | tcg_gen_mov_i32(psw, cpu_bpsw); | ||
548 | gen_helper_set_psw_rte(cpu_env, psw); | ||
549 | ctx->base.is_jmp = DISAS_EXIT; | ||
550 | - tcg_temp_free(psw); | ||
551 | } | ||
552 | return true; | ||
553 | } | ||
554 | @@ -XXX,XX +XXX,XX @@ static bool trans_RTE(DisasContext *ctx, arg_RTE *a) | ||
555 | pop(psw); | ||
556 | gen_helper_set_psw_rte(cpu_env, psw); | ||
557 | ctx->base.is_jmp = DISAS_EXIT; | ||
558 | - tcg_temp_free(psw); | ||
559 | } | ||
560 | return true; | ||
561 | } | ||
562 | @@ -XXX,XX +XXX,XX @@ static bool trans_INT(DisasContext *ctx, arg_INT *a) | ||
563 | vec = tcg_const_i32(a->imm); | ||
564 | tcg_gen_movi_i32(cpu_pc, ctx->base.pc_next); | ||
565 | gen_helper_rxint(cpu_env, vec); | ||
566 | - tcg_temp_free(vec); | ||
567 | ctx->base.is_jmp = DISAS_NORETURN; | ||
568 | return true; | ||
569 | } | ||
570 | -- | ||
571 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/sh4/translate.c | 110 ----------------------------------------- | ||
7 | 1 file changed, 110 deletions(-) | ||
8 | |||
9 | diff --git a/target/sh4/translate.c b/target/sh4/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/sh4/translate.c | ||
12 | +++ b/target/sh4/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static void gen_read_sr(TCGv dst) | ||
14 | tcg_gen_or_i32(dst, dst, t0); | ||
15 | tcg_gen_shli_i32(t0, cpu_sr_t, SR_T); | ||
16 | tcg_gen_or_i32(dst, cpu_sr, t0); | ||
17 | - tcg_temp_free_i32(t0); | ||
18 | } | ||
19 | |||
20 | static void gen_write_sr(TCGv src) | ||
21 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
22 | tcg_gen_addi_i32(addr, REG(B11_8), B3_0 * 4); | ||
23 | tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, | ||
24 | MO_TEUL | UNALIGN(ctx)); | ||
25 | - tcg_temp_free(addr); | ||
26 | } | ||
27 | return; | ||
28 | case 0x5000: /* mov.l @(disp,Rm),Rn */ | ||
29 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
30 | tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 4); | ||
31 | tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, | ||
32 | MO_TESL | UNALIGN(ctx)); | ||
33 | - tcg_temp_free(addr); | ||
34 | } | ||
35 | return; | ||
36 | case 0xe000: /* mov #imm,Rn */ | ||
37 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
38 | { | ||
39 | TCGv addr = tcg_const_i32(ctx->base.pc_next + 4 + B7_0 * 2); | ||
40 | tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_TESW); | ||
41 | - tcg_temp_free(addr); | ||
42 | } | ||
43 | return; | ||
44 | case 0xd000: /* mov.l @(disp,PC),Rn */ | ||
45 | { | ||
46 | TCGv addr = tcg_const_i32((ctx->base.pc_next + 4 + B7_0 * 4) & ~3); | ||
47 | tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_TESL); | ||
48 | - tcg_temp_free(addr); | ||
49 | } | ||
50 | return; | ||
51 | case 0x7000: /* add #imm,Rn */ | ||
52 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
53 | /* might cause re-execution */ | ||
54 | tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, MO_UB); | ||
55 | tcg_gen_mov_i32(REG(B11_8), addr); /* modify register status */ | ||
56 | - tcg_temp_free(addr); | ||
57 | } | ||
58 | return; | ||
59 | case 0x2005: /* mov.w Rm,@-Rn */ | ||
60 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
61 | tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, | ||
62 | MO_TEUW | UNALIGN(ctx)); | ||
63 | tcg_gen_mov_i32(REG(B11_8), addr); | ||
64 | - tcg_temp_free(addr); | ||
65 | } | ||
66 | return; | ||
67 | case 0x2006: /* mov.l Rm,@-Rn */ | ||
68 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
69 | tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, | ||
70 | MO_TEUL | UNALIGN(ctx)); | ||
71 | tcg_gen_mov_i32(REG(B11_8), addr); | ||
72 | - tcg_temp_free(addr); | ||
73 | } | ||
74 | return; | ||
75 | case 0x6004: /* mov.b @Rm+,Rn */ | ||
76 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
77 | TCGv addr = tcg_temp_new(); | ||
78 | tcg_gen_add_i32(addr, REG(B11_8), REG(0)); | ||
79 | tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, MO_UB); | ||
80 | - tcg_temp_free(addr); | ||
81 | } | ||
82 | return; | ||
83 | case 0x0005: /* mov.w Rm,@(R0,Rn) */ | ||
84 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
85 | tcg_gen_add_i32(addr, REG(B11_8), REG(0)); | ||
86 | tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, | ||
87 | MO_TEUW | UNALIGN(ctx)); | ||
88 | - tcg_temp_free(addr); | ||
89 | } | ||
90 | return; | ||
91 | case 0x0006: /* mov.l Rm,@(R0,Rn) */ | ||
92 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
93 | tcg_gen_add_i32(addr, REG(B11_8), REG(0)); | ||
94 | tcg_gen_qemu_st_i32(REG(B7_4), addr, ctx->memidx, | ||
95 | MO_TEUL | UNALIGN(ctx)); | ||
96 | - tcg_temp_free(addr); | ||
97 | } | ||
98 | return; | ||
99 | case 0x000c: /* mov.b @(R0,Rm),Rn */ | ||
100 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
101 | TCGv addr = tcg_temp_new(); | ||
102 | tcg_gen_add_i32(addr, REG(B7_4), REG(0)); | ||
103 | tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, MO_SB); | ||
104 | - tcg_temp_free(addr); | ||
105 | } | ||
106 | return; | ||
107 | case 0x000d: /* mov.w @(R0,Rm),Rn */ | ||
108 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
109 | tcg_gen_add_i32(addr, REG(B7_4), REG(0)); | ||
110 | tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, | ||
111 | MO_TESW | UNALIGN(ctx)); | ||
112 | - tcg_temp_free(addr); | ||
113 | } | ||
114 | return; | ||
115 | case 0x000e: /* mov.l @(R0,Rm),Rn */ | ||
116 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
117 | tcg_gen_add_i32(addr, REG(B7_4), REG(0)); | ||
118 | tcg_gen_qemu_ld_i32(REG(B11_8), addr, ctx->memidx, | ||
119 | MO_TESL | UNALIGN(ctx)); | ||
120 | - tcg_temp_free(addr); | ||
121 | } | ||
122 | return; | ||
123 | case 0x6008: /* swap.b Rm,Rn */ | ||
124 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
125 | TCGv low = tcg_temp_new(); | ||
126 | tcg_gen_bswap16_i32(low, REG(B7_4), 0); | ||
127 | tcg_gen_deposit_i32(REG(B11_8), REG(B7_4), low, 0, 16); | ||
128 | - tcg_temp_free(low); | ||
129 | } | ||
130 | return; | ||
131 | case 0x6009: /* swap.w Rm,Rn */ | ||
132 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
133 | low = tcg_temp_new(); | ||
134 | tcg_gen_shri_i32(low, REG(B11_8), 16); | ||
135 | tcg_gen_or_i32(REG(B11_8), high, low); | ||
136 | - tcg_temp_free(low); | ||
137 | - tcg_temp_free(high); | ||
138 | } | ||
139 | return; | ||
140 | case 0x300c: /* add Rm,Rn */ | ||
141 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
142 | tcg_gen_add2_i32(t1, cpu_sr_t, cpu_sr_t, t0, REG(B7_4), t0); | ||
143 | tcg_gen_add2_i32(REG(B11_8), cpu_sr_t, | ||
144 | REG(B11_8), t0, t1, cpu_sr_t); | ||
145 | - tcg_temp_free(t0); | ||
146 | - tcg_temp_free(t1); | ||
147 | } | ||
148 | return; | ||
149 | case 0x300f: /* addv Rm,Rn */ | ||
150 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
151 | t2 = tcg_temp_new(); | ||
152 | tcg_gen_xor_i32(t2, REG(B7_4), REG(B11_8)); | ||
153 | tcg_gen_andc_i32(cpu_sr_t, t1, t2); | ||
154 | - tcg_temp_free(t2); | ||
155 | tcg_gen_shri_i32(cpu_sr_t, cpu_sr_t, 31); | ||
156 | - tcg_temp_free(t1); | ||
157 | tcg_gen_mov_i32(REG(B7_4), t0); | ||
158 | - tcg_temp_free(t0); | ||
159 | } | ||
160 | return; | ||
161 | case 0x2009: /* and Rm,Rn */ | ||
162 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
163 | tcg_gen_andc_i32(cmp1, cmp1, cmp2); | ||
164 | tcg_gen_andi_i32(cmp1, cmp1, 0x80808080); | ||
165 | tcg_gen_setcondi_i32(TCG_COND_NE, cpu_sr_t, cmp1, 0); | ||
166 | - tcg_temp_free(cmp2); | ||
167 | - tcg_temp_free(cmp1); | ||
168 | } | ||
169 | return; | ||
170 | case 0x2007: /* div0s Rm,Rn */ | ||
171 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
172 | tcg_gen_xor_i32(t1, t1, t0); | ||
173 | tcg_gen_xori_i32(cpu_sr_t, t1, 1); | ||
174 | tcg_gen_xor_i32(cpu_sr_q, cpu_sr_m, t1); | ||
175 | - | ||
176 | - tcg_temp_free(zero); | ||
177 | - tcg_temp_free(t2); | ||
178 | - tcg_temp_free(t1); | ||
179 | - tcg_temp_free(t0); | ||
180 | } | ||
181 | return; | ||
182 | case 0x300d: /* dmuls.l Rm,Rn */ | ||
183 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
184 | arg1 = tcg_temp_new(); | ||
185 | tcg_gen_qemu_ld_i32(arg1, REG(B11_8), ctx->memidx, MO_TESL); | ||
186 | gen_helper_macl(cpu_env, arg0, arg1); | ||
187 | - tcg_temp_free(arg1); | ||
188 | - tcg_temp_free(arg0); | ||
189 | tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 4); | ||
190 | tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4); | ||
191 | } | ||
192 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
193 | arg1 = tcg_temp_new(); | ||
194 | tcg_gen_qemu_ld_i32(arg1, REG(B11_8), ctx->memidx, MO_TESL); | ||
195 | gen_helper_macw(cpu_env, arg0, arg1); | ||
196 | - tcg_temp_free(arg1); | ||
197 | - tcg_temp_free(arg0); | ||
198 | tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 2); | ||
199 | tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 2); | ||
200 | } | ||
201 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
202 | arg1 = tcg_temp_new(); | ||
203 | tcg_gen_ext16s_i32(arg1, REG(B11_8)); | ||
204 | tcg_gen_mul_i32(cpu_macl, arg0, arg1); | ||
205 | - tcg_temp_free(arg1); | ||
206 | - tcg_temp_free(arg0); | ||
207 | } | ||
208 | return; | ||
209 | case 0x200e: /* mulu.w Rm,Rn */ | ||
210 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
211 | arg1 = tcg_temp_new(); | ||
212 | tcg_gen_ext16u_i32(arg1, REG(B11_8)); | ||
213 | tcg_gen_mul_i32(cpu_macl, arg0, arg1); | ||
214 | - tcg_temp_free(arg1); | ||
215 | - tcg_temp_free(arg0); | ||
216 | } | ||
217 | return; | ||
218 | case 0x600b: /* neg Rm,Rn */ | ||
219 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
220 | tcg_gen_sub2_i32(REG(B11_8), cpu_sr_t, | ||
221 | t0, t0, REG(B11_8), cpu_sr_t); | ||
222 | tcg_gen_andi_i32(cpu_sr_t, cpu_sr_t, 1); | ||
223 | - tcg_temp_free(t0); | ||
224 | } | ||
225 | return; | ||
226 | case 0x6007: /* not Rm,Rn */ | ||
227 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
228 | /* select between the two cases */ | ||
229 | tcg_gen_movi_i32(t0, 0); | ||
230 | tcg_gen_movcond_i32(TCG_COND_GE, REG(B11_8), REG(B7_4), t0, t1, t2); | ||
231 | - | ||
232 | - tcg_temp_free(t0); | ||
233 | - tcg_temp_free(t1); | ||
234 | - tcg_temp_free(t2); | ||
235 | } | ||
236 | return; | ||
237 | case 0x400d: /* shld Rm,Rn */ | ||
238 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
239 | /* select between the two cases */ | ||
240 | tcg_gen_movi_i32(t0, 0); | ||
241 | tcg_gen_movcond_i32(TCG_COND_GE, REG(B11_8), REG(B7_4), t0, t1, t2); | ||
242 | - | ||
243 | - tcg_temp_free(t0); | ||
244 | - tcg_temp_free(t1); | ||
245 | - tcg_temp_free(t2); | ||
246 | } | ||
247 | return; | ||
248 | case 0x3008: /* sub Rm,Rn */ | ||
249 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
250 | tcg_gen_sub2_i32(REG(B11_8), cpu_sr_t, | ||
251 | REG(B11_8), t0, t1, cpu_sr_t); | ||
252 | tcg_gen_andi_i32(cpu_sr_t, cpu_sr_t, 1); | ||
253 | - tcg_temp_free(t0); | ||
254 | - tcg_temp_free(t1); | ||
255 | } | ||
256 | return; | ||
257 | case 0x300b: /* subv Rm,Rn */ | ||
258 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
259 | t2 = tcg_temp_new(); | ||
260 | tcg_gen_xor_i32(t2, REG(B11_8), REG(B7_4)); | ||
261 | tcg_gen_and_i32(t1, t1, t2); | ||
262 | - tcg_temp_free(t2); | ||
263 | tcg_gen_shri_i32(cpu_sr_t, t1, 31); | ||
264 | - tcg_temp_free(t1); | ||
265 | tcg_gen_mov_i32(REG(B11_8), t0); | ||
266 | - tcg_temp_free(t0); | ||
267 | } | ||
268 | return; | ||
269 | case 0x2008: /* tst Rm,Rn */ | ||
270 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
271 | TCGv val = tcg_temp_new(); | ||
272 | tcg_gen_and_i32(val, REG(B7_4), REG(B11_8)); | ||
273 | tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0); | ||
274 | - tcg_temp_free(val); | ||
275 | } | ||
276 | return; | ||
277 | case 0x200a: /* xor Rm,Rn */ | ||
278 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
279 | TCGv_i64 fp = tcg_temp_new_i64(); | ||
280 | gen_load_fpr64(ctx, fp, XHACK(B7_4)); | ||
281 | tcg_gen_qemu_st_i64(fp, REG(B11_8), ctx->memidx, MO_TEUQ); | ||
282 | - tcg_temp_free_i64(fp); | ||
283 | } else { | ||
284 | tcg_gen_qemu_st_i32(FREG(B7_4), REG(B11_8), ctx->memidx, MO_TEUL); | ||
285 | } | ||
286 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
287 | TCGv_i64 fp = tcg_temp_new_i64(); | ||
288 | tcg_gen_qemu_ld_i64(fp, REG(B7_4), ctx->memidx, MO_TEUQ); | ||
289 | gen_store_fpr64(ctx, fp, XHACK(B11_8)); | ||
290 | - tcg_temp_free_i64(fp); | ||
291 | } else { | ||
292 | tcg_gen_qemu_ld_i32(FREG(B11_8), REG(B7_4), ctx->memidx, MO_TEUL); | ||
293 | } | ||
294 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
295 | TCGv_i64 fp = tcg_temp_new_i64(); | ||
296 | tcg_gen_qemu_ld_i64(fp, REG(B7_4), ctx->memidx, MO_TEUQ); | ||
297 | gen_store_fpr64(ctx, fp, XHACK(B11_8)); | ||
298 | - tcg_temp_free_i64(fp); | ||
299 | tcg_gen_addi_i32(REG(B7_4), REG(B7_4), 8); | ||
300 | } else { | ||
301 | tcg_gen_qemu_ld_i32(FREG(B11_8), REG(B7_4), ctx->memidx, MO_TEUL); | ||
302 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
303 | gen_load_fpr64(ctx, fp, XHACK(B7_4)); | ||
304 | tcg_gen_subi_i32(addr, REG(B11_8), 8); | ||
305 | tcg_gen_qemu_st_i64(fp, addr, ctx->memidx, MO_TEUQ); | ||
306 | - tcg_temp_free_i64(fp); | ||
307 | } else { | ||
308 | tcg_gen_subi_i32(addr, REG(B11_8), 4); | ||
309 | tcg_gen_qemu_st_i32(FREG(B7_4), addr, ctx->memidx, MO_TEUL); | ||
310 | } | ||
311 | tcg_gen_mov_i32(REG(B11_8), addr); | ||
312 | - tcg_temp_free(addr); | ||
313 | } | ||
314 | return; | ||
315 | case 0xf006: /* fmov @(R0,Rm),{F,D,X}Rm - FPSCR: Nothing */ | ||
316 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
317 | TCGv_i64 fp = tcg_temp_new_i64(); | ||
318 | tcg_gen_qemu_ld_i64(fp, addr, ctx->memidx, MO_TEUQ); | ||
319 | gen_store_fpr64(ctx, fp, XHACK(B11_8)); | ||
320 | - tcg_temp_free_i64(fp); | ||
321 | } else { | ||
322 | tcg_gen_qemu_ld_i32(FREG(B11_8), addr, ctx->memidx, MO_TEUL); | ||
323 | } | ||
324 | - tcg_temp_free(addr); | ||
325 | } | ||
326 | return; | ||
327 | case 0xf007: /* fmov {F,D,X}Rn,@(R0,Rn) - FPSCR: Nothing */ | ||
328 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
329 | TCGv_i64 fp = tcg_temp_new_i64(); | ||
330 | gen_load_fpr64(ctx, fp, XHACK(B7_4)); | ||
331 | tcg_gen_qemu_st_i64(fp, addr, ctx->memidx, MO_TEUQ); | ||
332 | - tcg_temp_free_i64(fp); | ||
333 | } else { | ||
334 | tcg_gen_qemu_st_i32(FREG(B7_4), addr, ctx->memidx, MO_TEUL); | ||
335 | } | ||
336 | - tcg_temp_free(addr); | ||
337 | } | ||
338 | return; | ||
339 | case 0xf000: /* fadd Rm,Rn - FPSCR: R[PR,Enable.O/U/I]/W[Cause,Flag] */ | ||
340 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
341 | return; | ||
342 | } | ||
343 | gen_store_fpr64(ctx, fp0, B11_8); | ||
344 | - tcg_temp_free_i64(fp0); | ||
345 | - tcg_temp_free_i64(fp1); | ||
346 | } else { | ||
347 | switch (ctx->opcode & 0xf00f) { | ||
348 | case 0xf000: /* fadd Rm,Rn */ | ||
349 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
350 | tcg_gen_qemu_ld_i32(val, addr, ctx->memidx, MO_UB); | ||
351 | tcg_gen_andi_i32(val, val, B7_0); | ||
352 | tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_UB); | ||
353 | - tcg_temp_free(val); | ||
354 | - tcg_temp_free(addr); | ||
355 | } | ||
356 | return; | ||
357 | case 0x8b00: /* bf label */ | ||
358 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
359 | TCGv addr = tcg_temp_new(); | ||
360 | tcg_gen_addi_i32(addr, cpu_gbr, B7_0); | ||
361 | tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_SB); | ||
362 | - tcg_temp_free(addr); | ||
363 | } | ||
364 | return; | ||
365 | case 0xc500: /* mov.w @(disp,GBR),R0 */ | ||
366 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
367 | TCGv addr = tcg_temp_new(); | ||
368 | tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 2); | ||
369 | tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_TESW); | ||
370 | - tcg_temp_free(addr); | ||
371 | } | ||
372 | return; | ||
373 | case 0xc600: /* mov.l @(disp,GBR),R0 */ | ||
374 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
375 | TCGv addr = tcg_temp_new(); | ||
376 | tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 4); | ||
377 | tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_TESL); | ||
378 | - tcg_temp_free(addr); | ||
379 | } | ||
380 | return; | ||
381 | case 0xc000: /* mov.b R0,@(disp,GBR) */ | ||
382 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
383 | TCGv addr = tcg_temp_new(); | ||
384 | tcg_gen_addi_i32(addr, cpu_gbr, B7_0); | ||
385 | tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_UB); | ||
386 | - tcg_temp_free(addr); | ||
387 | } | ||
388 | return; | ||
389 | case 0xc100: /* mov.w R0,@(disp,GBR) */ | ||
390 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
391 | TCGv addr = tcg_temp_new(); | ||
392 | tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 2); | ||
393 | tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_TEUW); | ||
394 | - tcg_temp_free(addr); | ||
395 | } | ||
396 | return; | ||
397 | case 0xc200: /* mov.l R0,@(disp,GBR) */ | ||
398 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
399 | TCGv addr = tcg_temp_new(); | ||
400 | tcg_gen_addi_i32(addr, cpu_gbr, B7_0 * 4); | ||
401 | tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_TEUL); | ||
402 | - tcg_temp_free(addr); | ||
403 | } | ||
404 | return; | ||
405 | case 0x8000: /* mov.b R0,@(disp,Rn) */ | ||
406 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
407 | TCGv addr = tcg_temp_new(); | ||
408 | tcg_gen_addi_i32(addr, REG(B7_4), B3_0); | ||
409 | tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, MO_UB); | ||
410 | - tcg_temp_free(addr); | ||
411 | } | ||
412 | return; | ||
413 | case 0x8100: /* mov.w R0,@(disp,Rn) */ | ||
414 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
415 | tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 2); | ||
416 | tcg_gen_qemu_st_i32(REG(0), addr, ctx->memidx, | ||
417 | MO_TEUW | UNALIGN(ctx)); | ||
418 | - tcg_temp_free(addr); | ||
419 | } | ||
420 | return; | ||
421 | case 0x8400: /* mov.b @(disp,Rn),R0 */ | ||
422 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
423 | TCGv addr = tcg_temp_new(); | ||
424 | tcg_gen_addi_i32(addr, REG(B7_4), B3_0); | ||
425 | tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, MO_SB); | ||
426 | - tcg_temp_free(addr); | ||
427 | } | ||
428 | return; | ||
429 | case 0x8500: /* mov.w @(disp,Rn),R0 */ | ||
430 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
431 | tcg_gen_addi_i32(addr, REG(B7_4), B3_0 * 2); | ||
432 | tcg_gen_qemu_ld_i32(REG(0), addr, ctx->memidx, | ||
433 | MO_TESW | UNALIGN(ctx)); | ||
434 | - tcg_temp_free(addr); | ||
435 | } | ||
436 | return; | ||
437 | case 0xc700: /* mova @(disp,PC),R0 */ | ||
438 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
439 | tcg_gen_qemu_ld_i32(val, addr, ctx->memidx, MO_UB); | ||
440 | tcg_gen_ori_i32(val, val, B7_0); | ||
441 | tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_UB); | ||
442 | - tcg_temp_free(val); | ||
443 | - tcg_temp_free(addr); | ||
444 | } | ||
445 | return; | ||
446 | case 0xc300: /* trapa #imm */ | ||
447 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
448 | gen_save_cpu_state(ctx, true); | ||
449 | imm = tcg_const_i32(B7_0); | ||
450 | gen_helper_trapa(cpu_env, imm); | ||
451 | - tcg_temp_free(imm); | ||
452 | ctx->base.is_jmp = DISAS_NORETURN; | ||
453 | } | ||
454 | return; | ||
455 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
456 | TCGv val = tcg_temp_new(); | ||
457 | tcg_gen_andi_i32(val, REG(0), B7_0); | ||
458 | tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0); | ||
459 | - tcg_temp_free(val); | ||
460 | } | ||
461 | return; | ||
462 | case 0xcc00: /* tst.b #imm,@(R0,GBR) */ | ||
463 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
464 | tcg_gen_qemu_ld_i32(val, val, ctx->memidx, MO_UB); | ||
465 | tcg_gen_andi_i32(val, val, B7_0); | ||
466 | tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0); | ||
467 | - tcg_temp_free(val); | ||
468 | } | ||
469 | return; | ||
470 | case 0xca00: /* xor #imm,R0 */ | ||
471 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
472 | tcg_gen_qemu_ld_i32(val, addr, ctx->memidx, MO_UB); | ||
473 | tcg_gen_xori_i32(val, val, B7_0); | ||
474 | tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_UB); | ||
475 | - tcg_temp_free(val); | ||
476 | - tcg_temp_free(addr); | ||
477 | } | ||
478 | return; | ||
479 | } | ||
480 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
481 | tcg_gen_subi_i32(addr, REG(B11_8), 4); | ||
482 | tcg_gen_qemu_st_i32(ALTREG(B6_4), addr, ctx->memidx, MO_TEUL); | ||
483 | tcg_gen_mov_i32(REG(B11_8), addr); | ||
484 | - tcg_temp_free(addr); | ||
485 | } | ||
486 | return; | ||
487 | } | ||
488 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
489 | TCGv val = tcg_temp_new(); | ||
490 | tcg_gen_andi_i32(val, REG(B11_8), 0x700083f3); | ||
491 | gen_write_sr(val); | ||
492 | - tcg_temp_free(val); | ||
493 | ctx->base.is_jmp = DISAS_STOP; | ||
494 | } | ||
495 | return; | ||
496 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
497 | tcg_gen_qemu_ld_i32(val, REG(B11_8), ctx->memidx, MO_TESL); | ||
498 | tcg_gen_andi_i32(val, val, 0x700083f3); | ||
499 | gen_write_sr(val); | ||
500 | - tcg_temp_free(val); | ||
501 | tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4); | ||
502 | ctx->base.is_jmp = DISAS_STOP; | ||
503 | } | ||
504 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
505 | gen_read_sr(val); | ||
506 | tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_TEUL); | ||
507 | tcg_gen_mov_i32(REG(B11_8), addr); | ||
508 | - tcg_temp_free(val); | ||
509 | - tcg_temp_free(addr); | ||
510 | } | ||
511 | return; | ||
512 | #define LD(reg,ldnum,ldpnum,prechk) \ | ||
513 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
514 | tcg_gen_subi_i32(addr, REG(B11_8), 4); \ | ||
515 | tcg_gen_qemu_st_i32(cpu_##reg, addr, ctx->memidx, MO_TEUL); \ | ||
516 | tcg_gen_mov_i32(REG(B11_8), addr); \ | ||
517 | - tcg_temp_free(addr); \ | ||
518 | } \ | ||
519 | return; | ||
520 | #define LDST(reg,ldnum,ldpnum,stnum,stpnum,prechk) \ | ||
521 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
522 | tcg_gen_qemu_ld_i32(addr, REG(B11_8), ctx->memidx, MO_TESL); | ||
523 | tcg_gen_addi_i32(REG(B11_8), REG(B11_8), 4); | ||
524 | gen_helper_ld_fpscr(cpu_env, addr); | ||
525 | - tcg_temp_free(addr); | ||
526 | ctx->base.is_jmp = DISAS_STOP; | ||
527 | } | ||
528 | return; | ||
529 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
530 | tcg_gen_subi_i32(addr, REG(B11_8), 4); | ||
531 | tcg_gen_qemu_st_i32(val, addr, ctx->memidx, MO_TEUL); | ||
532 | tcg_gen_mov_i32(REG(B11_8), addr); | ||
533 | - tcg_temp_free(addr); | ||
534 | - tcg_temp_free(val); | ||
535 | } | ||
536 | return; | ||
537 | case 0x00c3: /* movca.l R0,@Rm */ | ||
538 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
539 | tcg_gen_qemu_ld_i32(val, REG(B11_8), ctx->memidx, MO_TEUL); | ||
540 | gen_helper_movcal(cpu_env, REG(B11_8), val); | ||
541 | tcg_gen_qemu_st_i32(REG(0), REG(B11_8), ctx->memidx, MO_TEUL); | ||
542 | - tcg_temp_free(val); | ||
543 | } | ||
544 | ctx->has_movcal = 1; | ||
545 | return; | ||
546 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
547 | tcg_gen_atomic_cmpxchg_i32(tmp, REG(B11_8), cpu_lock_value, | ||
548 | REG(0), ctx->memidx, MO_TEUL); | ||
549 | tcg_gen_setcond_i32(TCG_COND_EQ, cpu_sr_t, tmp, cpu_lock_value); | ||
550 | - tcg_temp_free(tmp); | ||
551 | } else { | ||
552 | tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_lock_addr, -1, fail); | ||
553 | tcg_gen_qemu_st_i32(REG(0), REG(B11_8), ctx->memidx, MO_TEUL); | ||
554 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
555 | tcg_gen_qemu_ld_i32(REG(0), REG(B11_8), ctx->memidx, MO_TESL); | ||
556 | tcg_gen_mov_i32(cpu_lock_value, REG(0)); | ||
557 | tcg_gen_mov_i32(cpu_lock_addr, tmp); | ||
558 | - tcg_temp_free(tmp); | ||
559 | } else { | ||
560 | tcg_gen_qemu_ld_i32(REG(0), REG(B11_8), ctx->memidx, MO_TESL); | ||
561 | tcg_gen_movi_i32(cpu_lock_addr, 0); | ||
562 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
563 | tcg_gen_shri_i32(cpu_sr_t, REG(B11_8), 31); | ||
564 | tcg_gen_shli_i32(REG(B11_8), REG(B11_8), 1); | ||
565 | tcg_gen_or_i32(REG(B11_8), REG(B11_8), tmp); | ||
566 | - tcg_temp_free(tmp); | ||
567 | } | ||
568 | return; | ||
569 | case 0x4025: /* rotcr Rn */ | ||
570 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
571 | tcg_gen_andi_i32(cpu_sr_t, REG(B11_8), 1); | ||
572 | tcg_gen_shri_i32(REG(B11_8), REG(B11_8), 1); | ||
573 | tcg_gen_or_i32(REG(B11_8), REG(B11_8), tmp); | ||
574 | - tcg_temp_free(tmp); | ||
575 | } | ||
576 | return; | ||
577 | case 0x4004: /* rotl Rn */ | ||
578 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
579 | tcg_gen_atomic_fetch_or_i32(val, REG(B11_8), val, | ||
580 | ctx->memidx, MO_UB); | ||
581 | tcg_gen_setcondi_i32(TCG_COND_EQ, cpu_sr_t, val, 0); | ||
582 | - tcg_temp_free(val); | ||
583 | } | ||
584 | return; | ||
585 | case 0xf00d: /* fsts FPUL,FRn - FPSCR: Nothing */ | ||
586 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
587 | fp = tcg_temp_new_i64(); | ||
588 | gen_helper_float_DT(fp, cpu_env, cpu_fpul); | ||
589 | gen_store_fpr64(ctx, fp, B11_8); | ||
590 | - tcg_temp_free_i64(fp); | ||
591 | } | ||
592 | else { | ||
593 | gen_helper_float_FT(FREG(B11_8), cpu_env, cpu_fpul); | ||
594 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
595 | fp = tcg_temp_new_i64(); | ||
596 | gen_load_fpr64(ctx, fp, B11_8); | ||
597 | gen_helper_ftrc_DT(cpu_fpul, cpu_env, fp); | ||
598 | - tcg_temp_free_i64(fp); | ||
599 | } | ||
600 | else { | ||
601 | gen_helper_ftrc_FT(cpu_fpul, cpu_env, FREG(B11_8)); | ||
602 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
603 | gen_load_fpr64(ctx, fp, B11_8); | ||
604 | gen_helper_fsqrt_DT(fp, cpu_env, fp); | ||
605 | gen_store_fpr64(ctx, fp, B11_8); | ||
606 | - tcg_temp_free_i64(fp); | ||
607 | } else { | ||
608 | gen_helper_fsqrt_FT(FREG(B11_8), cpu_env, FREG(B11_8)); | ||
609 | } | ||
610 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
611 | TCGv_i64 fp = tcg_temp_new_i64(); | ||
612 | gen_helper_fcnvsd_FT_DT(fp, cpu_env, cpu_fpul); | ||
613 | gen_store_fpr64(ctx, fp, B11_8); | ||
614 | - tcg_temp_free_i64(fp); | ||
615 | } | ||
616 | return; | ||
617 | case 0xf0bd: /* fcnvds DRn,FPUL */ | ||
618 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
619 | TCGv_i64 fp = tcg_temp_new_i64(); | ||
620 | gen_load_fpr64(ctx, fp, B11_8); | ||
621 | gen_helper_fcnvds_DT_FT(cpu_fpul, cpu_env, fp); | ||
622 | - tcg_temp_free_i64(fp); | ||
623 | } | ||
624 | return; | ||
625 | case 0xf0ed: /* fipr FVm,FVn */ | ||
626 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
627 | TCGv m = tcg_const_i32((ctx->opcode >> 8) & 3); | ||
628 | TCGv n = tcg_const_i32((ctx->opcode >> 10) & 3); | ||
629 | gen_helper_fipr(cpu_env, m, n); | ||
630 | - tcg_temp_free(m); | ||
631 | - tcg_temp_free(n); | ||
632 | return; | ||
633 | } | ||
634 | break; | ||
635 | @@ -XXX,XX +XXX,XX @@ static void _decode_opc(DisasContext * ctx) | ||
636 | } | ||
637 | TCGv n = tcg_const_i32((ctx->opcode >> 10) & 3); | ||
638 | gen_helper_ftrv(cpu_env, n); | ||
639 | - tcg_temp_free(n); | ||
640 | return; | ||
641 | } | ||
642 | break; | ||
643 | @@ -XXX,XX +XXX,XX @@ static void decode_gusa(DisasContext *ctx, CPUSH4State *env) | ||
644 | g_assert_not_reached(); | ||
645 | } | ||
646 | |||
647 | - /* If op_src is not a valid register, then op_arg was a constant. */ | ||
648 | - if (op_src < 0 && op_arg) { | ||
649 | - tcg_temp_free_i32(op_arg); | ||
650 | - } | ||
651 | - | ||
652 | /* The entire region has been translated. */ | ||
653 | ctx->envflags &= ~TB_FLAG_GUSA_MASK; | ||
654 | ctx->base.pc_next = pc_end; | ||
655 | -- | ||
656 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries, | ||
2 | therefore there's no need to record temps for later freeing. | ||
3 | Replace the few uses with tcg_temp_new. | ||
4 | 1 | ||
5 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
6 | Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | ||
7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
8 | --- | ||
9 | target/sparc/translate.c | 53 ++++++++++++++-------------------------- | ||
10 | 1 file changed, 18 insertions(+), 35 deletions(-) | ||
11 | |||
12 | diff --git a/target/sparc/translate.c b/target/sparc/translate.c | ||
13 | index XXXXXXX..XXXXXXX 100644 | ||
14 | --- a/target/sparc/translate.c | ||
15 | +++ b/target/sparc/translate.c | ||
16 | @@ -XXX,XX +XXX,XX @@ typedef struct DisasContext { | ||
17 | uint32_t cc_op; /* current CC operation */ | ||
18 | sparc_def_t *def; | ||
19 | TCGv_i32 t32[3]; | ||
20 | - TCGv ttl[5]; | ||
21 | int n_t32; | ||
22 | - int n_ttl; | ||
23 | #ifdef TARGET_SPARC64 | ||
24 | int fprs_dirty; | ||
25 | int asi; | ||
26 | @@ -XXX,XX +XXX,XX @@ static inline TCGv_i32 get_temp_i32(DisasContext *dc) | ||
27 | return t; | ||
28 | } | ||
29 | |||
30 | -static inline TCGv get_temp_tl(DisasContext *dc) | ||
31 | -{ | ||
32 | - TCGv t; | ||
33 | - assert(dc->n_ttl < ARRAY_SIZE(dc->ttl)); | ||
34 | - dc->ttl[dc->n_ttl++] = t = tcg_temp_new(); | ||
35 | - return t; | ||
36 | -} | ||
37 | - | ||
38 | static inline void gen_update_fprs_dirty(DisasContext *dc, int rd) | ||
39 | { | ||
40 | #if defined(TARGET_SPARC64) | ||
41 | @@ -XXX,XX +XXX,XX @@ static inline TCGv gen_load_gpr(DisasContext *dc, int reg) | ||
42 | assert(reg < 32); | ||
43 | return cpu_regs[reg]; | ||
44 | } else { | ||
45 | - TCGv t = get_temp_tl(dc); | ||
46 | + TCGv t = tcg_temp_new(); | ||
47 | tcg_gen_movi_tl(t, 0); | ||
48 | return t; | ||
49 | } | ||
50 | @@ -XXX,XX +XXX,XX @@ static inline TCGv gen_dest_gpr(DisasContext *dc, int reg) | ||
51 | assert(reg < 32); | ||
52 | return cpu_regs[reg]; | ||
53 | } else { | ||
54 | - return get_temp_tl(dc); | ||
55 | + return tcg_temp_new(); | ||
56 | } | ||
57 | } | ||
58 | |||
59 | @@ -XXX,XX +XXX,XX @@ static TCGv get_src2(DisasContext *dc, unsigned int insn) | ||
60 | { | ||
61 | if (IS_IMM) { /* immediate */ | ||
62 | target_long simm = GET_FIELDs(insn, 19, 31); | ||
63 | - TCGv t = get_temp_tl(dc); | ||
64 | + TCGv t = tcg_temp_new(); | ||
65 | tcg_gen_movi_tl(t, simm); | ||
66 | return t; | ||
67 | } else { /* register */ | ||
68 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
69 | case 2: /* FPU & Logical Operations */ | ||
70 | { | ||
71 | unsigned int xop = GET_FIELD(insn, 7, 12); | ||
72 | - TCGv cpu_dst = get_temp_tl(dc); | ||
73 | + TCGv cpu_dst = tcg_temp_new(); | ||
74 | TCGv cpu_tmp0; | ||
75 | |||
76 | if (xop == 0x3a) { /* generate trap */ | ||
77 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
78 | if (!supervisor(dc)) { | ||
79 | goto priv_insn; | ||
80 | } | ||
81 | - cpu_tmp0 = get_temp_tl(dc); | ||
82 | + cpu_tmp0 = tcg_temp_new(); | ||
83 | #ifdef TARGET_SPARC64 | ||
84 | rs1 = GET_FIELD(insn, 13, 17); | ||
85 | switch (rs1) { | ||
86 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
87 | } else { /* register */ | ||
88 | rs2 = GET_FIELD(insn, 27, 31); | ||
89 | cpu_src2 = gen_load_gpr(dc, rs2); | ||
90 | - cpu_tmp0 = get_temp_tl(dc); | ||
91 | + cpu_tmp0 = tcg_temp_new(); | ||
92 | if (insn & (1 << 12)) { | ||
93 | tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f); | ||
94 | } else { | ||
95 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
96 | } else { /* register */ | ||
97 | rs2 = GET_FIELD(insn, 27, 31); | ||
98 | cpu_src2 = gen_load_gpr(dc, rs2); | ||
99 | - cpu_tmp0 = get_temp_tl(dc); | ||
100 | + cpu_tmp0 = tcg_temp_new(); | ||
101 | if (insn & (1 << 12)) { | ||
102 | tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f); | ||
103 | tcg_gen_shr_i64(cpu_dst, cpu_src1, cpu_tmp0); | ||
104 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
105 | } else { /* register */ | ||
106 | rs2 = GET_FIELD(insn, 27, 31); | ||
107 | cpu_src2 = gen_load_gpr(dc, rs2); | ||
108 | - cpu_tmp0 = get_temp_tl(dc); | ||
109 | + cpu_tmp0 = tcg_temp_new(); | ||
110 | if (insn & (1 << 12)) { | ||
111 | tcg_gen_andi_i64(cpu_tmp0, cpu_src2, 0x3f); | ||
112 | tcg_gen_sar_i64(cpu_dst, cpu_src1, cpu_tmp0); | ||
113 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
114 | simm = GET_FIELDs(insn, 20, 31); | ||
115 | tcg_gen_shli_tl(cpu_dst, cpu_src1, simm & 0x1f); | ||
116 | } else { /* register */ | ||
117 | - cpu_tmp0 = get_temp_tl(dc); | ||
118 | + cpu_tmp0 = tcg_temp_new(); | ||
119 | tcg_gen_andi_tl(cpu_tmp0, cpu_src2, 0x1f); | ||
120 | tcg_gen_shl_tl(cpu_dst, cpu_src1, cpu_tmp0); | ||
121 | } | ||
122 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
123 | simm = GET_FIELDs(insn, 20, 31); | ||
124 | tcg_gen_shri_tl(cpu_dst, cpu_src1, simm & 0x1f); | ||
125 | } else { /* register */ | ||
126 | - cpu_tmp0 = get_temp_tl(dc); | ||
127 | + cpu_tmp0 = tcg_temp_new(); | ||
128 | tcg_gen_andi_tl(cpu_tmp0, cpu_src2, 0x1f); | ||
129 | tcg_gen_shr_tl(cpu_dst, cpu_src1, cpu_tmp0); | ||
130 | } | ||
131 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
132 | simm = GET_FIELDs(insn, 20, 31); | ||
133 | tcg_gen_sari_tl(cpu_dst, cpu_src1, simm & 0x1f); | ||
134 | } else { /* register */ | ||
135 | - cpu_tmp0 = get_temp_tl(dc); | ||
136 | + cpu_tmp0 = tcg_temp_new(); | ||
137 | tcg_gen_andi_tl(cpu_tmp0, cpu_src2, 0x1f); | ||
138 | tcg_gen_sar_tl(cpu_dst, cpu_src1, cpu_tmp0); | ||
139 | } | ||
140 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
141 | #endif | ||
142 | case 0x30: | ||
143 | { | ||
144 | - cpu_tmp0 = get_temp_tl(dc); | ||
145 | + cpu_tmp0 = tcg_temp_new(); | ||
146 | switch(rd) { | ||
147 | case 0: /* wry */ | ||
148 | tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2); | ||
149 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
150 | goto illegal_insn; | ||
151 | } | ||
152 | #else | ||
153 | - cpu_tmp0 = get_temp_tl(dc); | ||
154 | + cpu_tmp0 = tcg_temp_new(); | ||
155 | tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2); | ||
156 | gen_helper_wrpsr(cpu_env, cpu_tmp0); | ||
157 | tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | ||
158 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
159 | { | ||
160 | if (!supervisor(dc)) | ||
161 | goto priv_insn; | ||
162 | - cpu_tmp0 = get_temp_tl(dc); | ||
163 | + cpu_tmp0 = tcg_temp_new(); | ||
164 | tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2); | ||
165 | #ifdef TARGET_SPARC64 | ||
166 | switch (rd) { | ||
167 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
168 | CHECK_IU_FEATURE(dc, HYPV); | ||
169 | if (!hypervisor(dc)) | ||
170 | goto priv_insn; | ||
171 | - cpu_tmp0 = get_temp_tl(dc); | ||
172 | + cpu_tmp0 = tcg_temp_new(); | ||
173 | tcg_gen_xor_tl(cpu_tmp0, cpu_src1, cpu_src2); | ||
174 | switch (rd) { | ||
175 | case 0: // hpstate | ||
176 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
177 | } else if (xop == 0x39) { /* V9 return */ | ||
178 | save_state(dc); | ||
179 | cpu_src1 = get_src1(dc, insn); | ||
180 | - cpu_tmp0 = get_temp_tl(dc); | ||
181 | + cpu_tmp0 = tcg_temp_new(); | ||
182 | if (IS_IMM) { /* immediate */ | ||
183 | simm = GET_FIELDs(insn, 19, 31); | ||
184 | tcg_gen_addi_tl(cpu_tmp0, cpu_src1, simm); | ||
185 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
186 | #endif | ||
187 | } else { | ||
188 | cpu_src1 = get_src1(dc, insn); | ||
189 | - cpu_tmp0 = get_temp_tl(dc); | ||
190 | + cpu_tmp0 = tcg_temp_new(); | ||
191 | if (IS_IMM) { /* immediate */ | ||
192 | simm = GET_FIELDs(insn, 19, 31); | ||
193 | tcg_gen_addi_tl(cpu_tmp0, cpu_src1, simm); | ||
194 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
195 | unsigned int xop = GET_FIELD(insn, 7, 12); | ||
196 | /* ??? gen_address_mask prevents us from using a source | ||
197 | register directly. Always generate a temporary. */ | ||
198 | - TCGv cpu_addr = get_temp_tl(dc); | ||
199 | + TCGv cpu_addr = tcg_temp_new(); | ||
200 | |||
201 | tcg_gen_mov_tl(cpu_addr, get_src1(dc, insn)); | ||
202 | if (xop == 0x3c || xop == 0x3e) { | ||
203 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
204 | } | ||
205 | dc->n_t32 = 0; | ||
206 | } | ||
207 | - if (dc->n_ttl != 0) { | ||
208 | - int i; | ||
209 | - for (i = dc->n_ttl - 1; i >= 0; --i) { | ||
210 | - tcg_temp_free(dc->ttl[i]); | ||
211 | - } | ||
212 | - dc->n_ttl = 0; | ||
213 | - } | ||
214 | } | ||
215 | |||
216 | static void sparc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) | ||
217 | -- | ||
218 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries, | ||
2 | therefore there's no need to record temps for later freeing. | ||
3 | Replace the few uses with tcg_temp_new_i32. | ||
4 | 1 | ||
5 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
6 | Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | ||
7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
8 | --- | ||
9 | target/sparc/translate.c | 23 +++-------------------- | ||
10 | 1 file changed, 3 insertions(+), 20 deletions(-) | ||
11 | |||
12 | diff --git a/target/sparc/translate.c b/target/sparc/translate.c | ||
13 | index XXXXXXX..XXXXXXX 100644 | ||
14 | --- a/target/sparc/translate.c | ||
15 | +++ b/target/sparc/translate.c | ||
16 | @@ -XXX,XX +XXX,XX @@ typedef struct DisasContext { | ||
17 | |||
18 | uint32_t cc_op; /* current CC operation */ | ||
19 | sparc_def_t *def; | ||
20 | - TCGv_i32 t32[3]; | ||
21 | - int n_t32; | ||
22 | #ifdef TARGET_SPARC64 | ||
23 | int fprs_dirty; | ||
24 | int asi; | ||
25 | @@ -XXX,XX +XXX,XX @@ static int sign_extend(int x, int len) | ||
26 | |||
27 | #define IS_IMM (insn & (1<<13)) | ||
28 | |||
29 | -static inline TCGv_i32 get_temp_i32(DisasContext *dc) | ||
30 | -{ | ||
31 | - TCGv_i32 t; | ||
32 | - assert(dc->n_t32 < ARRAY_SIZE(dc->t32)); | ||
33 | - dc->t32[dc->n_t32++] = t = tcg_temp_new_i32(); | ||
34 | - return t; | ||
35 | -} | ||
36 | - | ||
37 | static inline void gen_update_fprs_dirty(DisasContext *dc, int rd) | ||
38 | { | ||
39 | #if defined(TARGET_SPARC64) | ||
40 | @@ -XXX,XX +XXX,XX @@ static inline void gen_update_fprs_dirty(DisasContext *dc, int rd) | ||
41 | /* floating point registers moves */ | ||
42 | static TCGv_i32 gen_load_fpr_F(DisasContext *dc, unsigned int src) | ||
43 | { | ||
44 | - TCGv_i32 ret = get_temp_i32(dc); | ||
45 | + TCGv_i32 ret = tcg_temp_new_i32(); | ||
46 | if (src & 1) { | ||
47 | tcg_gen_extrl_i64_i32(ret, cpu_fpr[src / 2]); | ||
48 | } else { | ||
49 | @@ -XXX,XX +XXX,XX @@ static void gen_store_fpr_F(DisasContext *dc, unsigned int dst, TCGv_i32 v) | ||
50 | |||
51 | static TCGv_i32 gen_dest_fpr_F(DisasContext *dc) | ||
52 | { | ||
53 | - return get_temp_i32(dc); | ||
54 | + return tcg_temp_new_i32(); | ||
55 | } | ||
56 | |||
57 | static TCGv_i64 gen_load_fpr_D(DisasContext *dc, unsigned int src) | ||
58 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
59 | break; | ||
60 | } | ||
61 | #endif | ||
62 | - cpu_dst_32 = get_temp_i32(dc); | ||
63 | + cpu_dst_32 = tcg_temp_new_i32(); | ||
64 | tcg_gen_qemu_ld_i32(cpu_dst_32, cpu_addr, | ||
65 | dc->mem_idx, MO_TEUL); | ||
66 | gen_helper_ldfsr(cpu_fsr, cpu_env, cpu_fsr, cpu_dst_32); | ||
67 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
68 | goto egress; | ||
69 | #endif | ||
70 | egress: | ||
71 | - if (dc->n_t32 != 0) { | ||
72 | - int i; | ||
73 | - for (i = dc->n_t32 - 1; i >= 0; --i) { | ||
74 | - tcg_temp_free_i32(dc->t32[i]); | ||
75 | - } | ||
76 | - dc->n_t32 = 0; | ||
77 | - } | ||
78 | } | ||
79 | |||
80 | static void sparc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) | ||
81 | -- | ||
82 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
2 | Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | ||
3 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
4 | --- | ||
5 | target/sparc/translate.c | 15 +++++++-------- | ||
6 | 1 file changed, 7 insertions(+), 8 deletions(-) | ||
7 | 1 | ||
8 | diff --git a/target/sparc/translate.c b/target/sparc/translate.c | ||
9 | index XXXXXXX..XXXXXXX 100644 | ||
10 | --- a/target/sparc/translate.c | ||
11 | +++ b/target/sparc/translate.c | ||
12 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
13 | dc->npc = dc->npc + 4; | ||
14 | } | ||
15 | jmp_insn: | ||
16 | - goto egress; | ||
17 | + return; | ||
18 | illegal_insn: | ||
19 | gen_exception(dc, TT_ILL_INSN); | ||
20 | - goto egress; | ||
21 | + return; | ||
22 | unimp_flush: | ||
23 | gen_exception(dc, TT_UNIMP_FLUSH); | ||
24 | - goto egress; | ||
25 | + return; | ||
26 | #if !defined(CONFIG_USER_ONLY) | ||
27 | priv_insn: | ||
28 | gen_exception(dc, TT_PRIV_INSN); | ||
29 | - goto egress; | ||
30 | + return; | ||
31 | #endif | ||
32 | nfpu_insn: | ||
33 | gen_op_fpexception_im(dc, FSR_FTT_UNIMPFPOP); | ||
34 | - goto egress; | ||
35 | + return; | ||
36 | #if !defined(CONFIG_USER_ONLY) && !defined(TARGET_SPARC64) | ||
37 | nfq_insn: | ||
38 | gen_op_fpexception_im(dc, FSR_FTT_SEQ_ERROR); | ||
39 | - goto egress; | ||
40 | + return; | ||
41 | #endif | ||
42 | #ifndef TARGET_SPARC64 | ||
43 | ncp_insn: | ||
44 | gen_exception(dc, TT_NCP_INSN); | ||
45 | - goto egress; | ||
46 | + return; | ||
47 | #endif | ||
48 | - egress: | ||
49 | } | ||
50 | |||
51 | static void sparc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) | ||
52 | -- | ||
53 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | Remove the g1 and g2 members of DisasCompare, as they were | ||
3 | used to track which temps needed to be freed. | ||
4 | 1 | ||
5 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
6 | Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | ||
7 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
8 | --- | ||
9 | target/sparc/translate.c | 32 -------------------------------- | ||
10 | 1 file changed, 32 deletions(-) | ||
11 | |||
12 | diff --git a/target/sparc/translate.c b/target/sparc/translate.c | ||
13 | index XXXXXXX..XXXXXXX 100644 | ||
14 | --- a/target/sparc/translate.c | ||
15 | +++ b/target/sparc/translate.c | ||
16 | @@ -XXX,XX +XXX,XX @@ typedef struct DisasContext { | ||
17 | typedef struct { | ||
18 | TCGCond cond; | ||
19 | bool is_bool; | ||
20 | - bool g1, g2; | ||
21 | TCGv c1, c2; | ||
22 | } DisasCompare; | ||
23 | |||
24 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_next_insn(void) | ||
25 | tcg_gen_addi_tl(cpu_npc, cpu_npc, 4); | ||
26 | } | ||
27 | |||
28 | -static void free_compare(DisasCompare *cmp) | ||
29 | -{ | ||
30 | - if (!cmp->g1) { | ||
31 | - tcg_temp_free(cmp->c1); | ||
32 | - } | ||
33 | - if (!cmp->g2) { | ||
34 | - tcg_temp_free(cmp->c2); | ||
35 | - } | ||
36 | -} | ||
37 | - | ||
38 | static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond, | ||
39 | DisasContext *dc) | ||
40 | { | ||
41 | @@ -XXX,XX +XXX,XX @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond, | ||
42 | cmp->cond = logic_cond[cond]; | ||
43 | do_compare_dst_0: | ||
44 | cmp->is_bool = false; | ||
45 | - cmp->g2 = false; | ||
46 | cmp->c2 = tcg_const_tl(0); | ||
47 | #ifdef TARGET_SPARC64 | ||
48 | if (!xcc) { | ||
49 | - cmp->g1 = false; | ||
50 | cmp->c1 = tcg_temp_new(); | ||
51 | tcg_gen_ext32s_tl(cmp->c1, cpu_cc_dst); | ||
52 | break; | ||
53 | } | ||
54 | #endif | ||
55 | - cmp->g1 = true; | ||
56 | cmp->c1 = cpu_cc_dst; | ||
57 | break; | ||
58 | |||
59 | @@ -XXX,XX +XXX,XX @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond, | ||
60 | if (!xcc) { | ||
61 | /* Note that sign-extension works for unsigned compares as | ||
62 | long as both operands are sign-extended. */ | ||
63 | - cmp->g1 = cmp->g2 = false; | ||
64 | cmp->c1 = tcg_temp_new(); | ||
65 | cmp->c2 = tcg_temp_new(); | ||
66 | tcg_gen_ext32s_tl(cmp->c1, cpu_cc_src); | ||
67 | @@ -XXX,XX +XXX,XX @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond, | ||
68 | break; | ||
69 | } | ||
70 | #endif | ||
71 | - cmp->g1 = cmp->g2 = true; | ||
72 | cmp->c1 = cpu_cc_src; | ||
73 | cmp->c2 = cpu_cc_src2; | ||
74 | break; | ||
75 | @@ -XXX,XX +XXX,XX @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond, | ||
76 | /* We're going to generate a boolean result. */ | ||
77 | cmp->cond = TCG_COND_NE; | ||
78 | cmp->is_bool = true; | ||
79 | - cmp->g1 = cmp->g2 = false; | ||
80 | cmp->c1 = r_dst = tcg_temp_new(); | ||
81 | cmp->c2 = tcg_const_tl(0); | ||
82 | |||
83 | @@ -XXX,XX +XXX,XX @@ static void gen_fcompare(DisasCompare *cmp, unsigned int cc, unsigned int cond) | ||
84 | /* For now we still generate a straight boolean result. */ | ||
85 | cmp->cond = TCG_COND_NE; | ||
86 | cmp->is_bool = true; | ||
87 | - cmp->g1 = cmp->g2 = false; | ||
88 | cmp->c1 = r_dst = tcg_temp_new(); | ||
89 | cmp->c2 = tcg_const_tl(0); | ||
90 | |||
91 | @@ -XXX,XX +XXX,XX @@ static void gen_cond(TCGv r_dst, unsigned int cc, unsigned int cond, | ||
92 | } else { | ||
93 | tcg_gen_setcond_tl(cmp.cond, r_dst, cmp.c1, cmp.c2); | ||
94 | } | ||
95 | - | ||
96 | - free_compare(&cmp); | ||
97 | } | ||
98 | |||
99 | static void gen_fcond(TCGv r_dst, unsigned int cc, unsigned int cond) | ||
100 | @@ -XXX,XX +XXX,XX @@ static void gen_fcond(TCGv r_dst, unsigned int cc, unsigned int cond) | ||
101 | } else { | ||
102 | tcg_gen_setcond_tl(cmp.cond, r_dst, cmp.c1, cmp.c2); | ||
103 | } | ||
104 | - | ||
105 | - free_compare(&cmp); | ||
106 | } | ||
107 | |||
108 | #ifdef TARGET_SPARC64 | ||
109 | @@ -XXX,XX +XXX,XX @@ static void gen_compare_reg(DisasCompare *cmp, int cond, TCGv r_src) | ||
110 | { | ||
111 | cmp->cond = tcg_invert_cond(gen_tcg_cond_reg[cond]); | ||
112 | cmp->is_bool = false; | ||
113 | - cmp->g1 = true; | ||
114 | - cmp->g2 = false; | ||
115 | cmp->c1 = r_src; | ||
116 | cmp->c2 = tcg_const_tl(0); | ||
117 | } | ||
118 | @@ -XXX,XX +XXX,XX @@ static inline void gen_cond_reg(TCGv r_dst, int cond, TCGv r_src) | ||
119 | |||
120 | /* The interface is to return a boolean in r_dst. */ | ||
121 | tcg_gen_setcond_tl(cmp.cond, r_dst, cmp.c1, cmp.c2); | ||
122 | - | ||
123 | - free_compare(&cmp); | ||
124 | } | ||
125 | #endif | ||
126 | |||
127 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
128 | l1 = gen_new_label(); | ||
129 | tcg_gen_brcond_tl(tcg_invert_cond(cmp.cond), | ||
130 | cmp.c1, cmp.c2, l1); | ||
131 | - free_compare(&cmp); | ||
132 | } | ||
133 | |||
134 | mask = ((dc->def->features & CPU_FEATURE_HYPV) && supervisor(dc) | ||
135 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
136 | cpu_src1 = get_src1(dc, insn); \ | ||
137 | gen_compare_reg(&cmp, cond, cpu_src1); \ | ||
138 | gen_fmov##sz(dc, &cmp, rd, rs2); \ | ||
139 | - free_compare(&cmp); \ | ||
140 | } while (0) | ||
141 | |||
142 | if ((xop & 0x11f) == 0x005) { /* V9 fmovsr */ | ||
143 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
144 | cond = GET_FIELD_SP(insn, 14, 17); \ | ||
145 | gen_fcompare(&cmp, fcc, cond); \ | ||
146 | gen_fmov##sz(dc, &cmp, rd, rs2); \ | ||
147 | - free_compare(&cmp); \ | ||
148 | } while (0) | ||
149 | |||
150 | case 0x001: /* V9 fmovscc %fcc0 */ | ||
151 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
152 | cond = GET_FIELD_SP(insn, 14, 17); \ | ||
153 | gen_compare(&cmp, xcc, cond, dc); \ | ||
154 | gen_fmov##sz(dc, &cmp, rd, rs2); \ | ||
155 | - free_compare(&cmp); \ | ||
156 | } while (0) | ||
157 | |||
158 | case 0x101: /* V9 fmovscc %icc */ | ||
159 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
160 | tcg_gen_movcond_tl(cmp.cond, dst, | ||
161 | cmp.c1, cmp.c2, | ||
162 | cpu_src2, dst); | ||
163 | - free_compare(&cmp); | ||
164 | gen_store_gpr(dc, rd, dst); | ||
165 | break; | ||
166 | } | ||
167 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
168 | tcg_gen_movcond_tl(cmp.cond, dst, | ||
169 | cmp.c1, cmp.c2, | ||
170 | cpu_src2, dst); | ||
171 | - free_compare(&cmp); | ||
172 | gen_store_gpr(dc, rd, dst); | ||
173 | break; | ||
174 | } | ||
175 | -- | ||
176 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
6 | --- | ||
7 | target/sparc/translate.c | 136 --------------------------------------- | ||
8 | 1 file changed, 136 deletions(-) | ||
9 | |||
10 | diff --git a/target/sparc/translate.c b/target/sparc/translate.c | ||
11 | index XXXXXXX..XXXXXXX 100644 | ||
12 | --- a/target/sparc/translate.c | ||
13 | +++ b/target/sparc/translate.c | ||
14 | @@ -XXX,XX +XXX,XX @@ static void gen_store_fpr_F(DisasContext *dc, unsigned int dst, TCGv_i32 v) | ||
15 | tcg_gen_extu_i32_i64(t, v); | ||
16 | tcg_gen_deposit_i64(cpu_fpr[dst / 2], cpu_fpr[dst / 2], t, | ||
17 | (dst & 1 ? 0 : 32), 32); | ||
18 | - tcg_temp_free_i64(t); | ||
19 | gen_update_fprs_dirty(dc, dst); | ||
20 | } | ||
21 | |||
22 | @@ -XXX,XX +XXX,XX @@ static TCGv_i32 gen_add32_carry32(void) | ||
23 | carry_32 = tcg_temp_new_i32(); | ||
24 | tcg_gen_setcond_i32(TCG_COND_LTU, carry_32, cc_src1_32, cc_src2_32); | ||
25 | |||
26 | -#if TARGET_LONG_BITS == 64 | ||
27 | - tcg_temp_free_i32(cc_src1_32); | ||
28 | - tcg_temp_free_i32(cc_src2_32); | ||
29 | -#endif | ||
30 | - | ||
31 | return carry_32; | ||
32 | } | ||
33 | |||
34 | @@ -XXX,XX +XXX,XX @@ static TCGv_i32 gen_sub32_carry32(void) | ||
35 | carry_32 = tcg_temp_new_i32(); | ||
36 | tcg_gen_setcond_i32(TCG_COND_LTU, carry_32, cc_src1_32, cc_src2_32); | ||
37 | |||
38 | -#if TARGET_LONG_BITS == 64 | ||
39 | - tcg_temp_free_i32(cc_src1_32); | ||
40 | - tcg_temp_free_i32(cc_src2_32); | ||
41 | -#endif | ||
42 | - | ||
43 | return carry_32; | ||
44 | } | ||
45 | |||
46 | @@ -XXX,XX +XXX,XX @@ static void gen_op_addx_int(DisasContext *dc, TCGv dst, TCGv src1, | ||
47 | generated the carry in the first place. */ | ||
48 | carry = tcg_temp_new(); | ||
49 | tcg_gen_add2_tl(carry, dst, cpu_cc_src, src1, cpu_cc_src2, src2); | ||
50 | - tcg_temp_free(carry); | ||
51 | goto add_done; | ||
52 | } | ||
53 | carry_32 = gen_add32_carry32(); | ||
54 | @@ -XXX,XX +XXX,XX @@ static void gen_op_addx_int(DisasContext *dc, TCGv dst, TCGv src1, | ||
55 | tcg_gen_add_tl(dst, src1, src2); | ||
56 | tcg_gen_add_tl(dst, dst, carry); | ||
57 | |||
58 | - tcg_temp_free_i32(carry_32); | ||
59 | -#if TARGET_LONG_BITS == 64 | ||
60 | - tcg_temp_free(carry); | ||
61 | -#endif | ||
62 | - | ||
63 | add_done: | ||
64 | if (update_cc) { | ||
65 | tcg_gen_mov_tl(cpu_cc_src, src1); | ||
66 | @@ -XXX,XX +XXX,XX @@ static void gen_op_subx_int(DisasContext *dc, TCGv dst, TCGv src1, | ||
67 | generated the carry in the first place. */ | ||
68 | carry = tcg_temp_new(); | ||
69 | tcg_gen_sub2_tl(carry, dst, cpu_cc_src, src1, cpu_cc_src2, src2); | ||
70 | - tcg_temp_free(carry); | ||
71 | goto sub_done; | ||
72 | } | ||
73 | carry_32 = gen_sub32_carry32(); | ||
74 | @@ -XXX,XX +XXX,XX @@ static void gen_op_subx_int(DisasContext *dc, TCGv dst, TCGv src1, | ||
75 | tcg_gen_sub_tl(dst, src1, src2); | ||
76 | tcg_gen_sub_tl(dst, dst, carry); | ||
77 | |||
78 | - tcg_temp_free_i32(carry_32); | ||
79 | -#if TARGET_LONG_BITS == 64 | ||
80 | - tcg_temp_free(carry); | ||
81 | -#endif | ||
82 | - | ||
83 | sub_done: | ||
84 | if (update_cc) { | ||
85 | tcg_gen_mov_tl(cpu_cc_src, src1); | ||
86 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2) | ||
87 | tcg_gen_andi_tl(cpu_cc_src2, src2, 0xffffffff); | ||
88 | tcg_gen_movcond_tl(TCG_COND_EQ, cpu_cc_src2, r_temp, zero, | ||
89 | zero, cpu_cc_src2); | ||
90 | - tcg_temp_free(zero); | ||
91 | |||
92 | // b2 = T0 & 1; | ||
93 | // env->y = (b2 << 31) | (env->y >> 1); | ||
94 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2) | ||
95 | gen_mov_reg_N(t0, cpu_psr); | ||
96 | gen_mov_reg_V(r_temp, cpu_psr); | ||
97 | tcg_gen_xor_tl(t0, t0, r_temp); | ||
98 | - tcg_temp_free(r_temp); | ||
99 | |||
100 | // T0 = (b1 << 31) | (T0 >> 1); | ||
101 | // src1 = T0; | ||
102 | tcg_gen_shli_tl(t0, t0, 31); | ||
103 | tcg_gen_shri_tl(cpu_cc_src, cpu_cc_src, 1); | ||
104 | tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, t0); | ||
105 | - tcg_temp_free(t0); | ||
106 | |||
107 | tcg_gen_add_tl(cpu_cc_dst, cpu_cc_src, cpu_cc_src2); | ||
108 | |||
109 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_multiply(TCGv dst, TCGv src1, TCGv src2, int sign_ext) | ||
110 | } | ||
111 | |||
112 | tcg_gen_mul_i64(dst, t0, t1); | ||
113 | - tcg_temp_free(t0); | ||
114 | - tcg_temp_free(t1); | ||
115 | - | ||
116 | tcg_gen_shri_i64(cpu_y, dst, 32); | ||
117 | #endif | ||
118 | } | ||
119 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_ble(TCGv dst, TCGv_i32 src) | ||
120 | tcg_gen_xor_tl(dst, dst, t0); | ||
121 | gen_mov_reg_Z(t0, src); | ||
122 | tcg_gen_or_tl(dst, dst, t0); | ||
123 | - tcg_temp_free(t0); | ||
124 | } | ||
125 | |||
126 | // N ^ V | ||
127 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_bl(TCGv dst, TCGv_i32 src) | ||
128 | gen_mov_reg_V(t0, src); | ||
129 | gen_mov_reg_N(dst, src); | ||
130 | tcg_gen_xor_tl(dst, dst, t0); | ||
131 | - tcg_temp_free(t0); | ||
132 | } | ||
133 | |||
134 | // C | Z | ||
135 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_bleu(TCGv dst, TCGv_i32 src) | ||
136 | gen_mov_reg_Z(t0, src); | ||
137 | gen_mov_reg_C(dst, src); | ||
138 | tcg_gen_or_tl(dst, dst, t0); | ||
139 | - tcg_temp_free(t0); | ||
140 | } | ||
141 | |||
142 | // C | ||
143 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_fbne(TCGv dst, TCGv src, | ||
144 | gen_mov_reg_FCC0(dst, src, fcc_offset); | ||
145 | gen_mov_reg_FCC1(t0, src, fcc_offset); | ||
146 | tcg_gen_or_tl(dst, dst, t0); | ||
147 | - tcg_temp_free(t0); | ||
148 | } | ||
149 | |||
150 | // 1 or 2: FCC0 ^ FCC1 | ||
151 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_fblg(TCGv dst, TCGv src, | ||
152 | gen_mov_reg_FCC0(dst, src, fcc_offset); | ||
153 | gen_mov_reg_FCC1(t0, src, fcc_offset); | ||
154 | tcg_gen_xor_tl(dst, dst, t0); | ||
155 | - tcg_temp_free(t0); | ||
156 | } | ||
157 | |||
158 | // 1 or 3: FCC0 | ||
159 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_fbl(TCGv dst, TCGv src, | ||
160 | gen_mov_reg_FCC0(dst, src, fcc_offset); | ||
161 | gen_mov_reg_FCC1(t0, src, fcc_offset); | ||
162 | tcg_gen_andc_tl(dst, dst, t0); | ||
163 | - tcg_temp_free(t0); | ||
164 | } | ||
165 | |||
166 | // 2 or 3: FCC1 | ||
167 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_fbg(TCGv dst, TCGv src, | ||
168 | gen_mov_reg_FCC0(dst, src, fcc_offset); | ||
169 | gen_mov_reg_FCC1(t0, src, fcc_offset); | ||
170 | tcg_gen_andc_tl(dst, t0, dst); | ||
171 | - tcg_temp_free(t0); | ||
172 | } | ||
173 | |||
174 | // 3: FCC0 & FCC1 | ||
175 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_fbu(TCGv dst, TCGv src, | ||
176 | gen_mov_reg_FCC0(dst, src, fcc_offset); | ||
177 | gen_mov_reg_FCC1(t0, src, fcc_offset); | ||
178 | tcg_gen_and_tl(dst, dst, t0); | ||
179 | - tcg_temp_free(t0); | ||
180 | } | ||
181 | |||
182 | // 0: !(FCC0 | FCC1) | ||
183 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_fbe(TCGv dst, TCGv src, | ||
184 | gen_mov_reg_FCC1(t0, src, fcc_offset); | ||
185 | tcg_gen_or_tl(dst, dst, t0); | ||
186 | tcg_gen_xori_tl(dst, dst, 0x1); | ||
187 | - tcg_temp_free(t0); | ||
188 | } | ||
189 | |||
190 | // 0 or 3: !(FCC0 ^ FCC1) | ||
191 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_fbue(TCGv dst, TCGv src, | ||
192 | gen_mov_reg_FCC1(t0, src, fcc_offset); | ||
193 | tcg_gen_xor_tl(dst, dst, t0); | ||
194 | tcg_gen_xori_tl(dst, dst, 0x1); | ||
195 | - tcg_temp_free(t0); | ||
196 | } | ||
197 | |||
198 | // 0 or 2: !FCC0 | ||
199 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_fbuge(TCGv dst, TCGv src, | ||
200 | gen_mov_reg_FCC1(t0, src, fcc_offset); | ||
201 | tcg_gen_andc_tl(dst, dst, t0); | ||
202 | tcg_gen_xori_tl(dst, dst, 0x1); | ||
203 | - tcg_temp_free(t0); | ||
204 | } | ||
205 | |||
206 | // 0 or 1: !FCC1 | ||
207 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_fbule(TCGv dst, TCGv src, | ||
208 | gen_mov_reg_FCC1(t0, src, fcc_offset); | ||
209 | tcg_gen_andc_tl(dst, t0, dst); | ||
210 | tcg_gen_xori_tl(dst, dst, 0x1); | ||
211 | - tcg_temp_free(t0); | ||
212 | } | ||
213 | |||
214 | // !3: !(FCC0 & FCC1) | ||
215 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_eval_fbo(TCGv dst, TCGv src, | ||
216 | gen_mov_reg_FCC1(t0, src, fcc_offset); | ||
217 | tcg_gen_and_tl(dst, dst, t0); | ||
218 | tcg_gen_xori_tl(dst, dst, 0x1); | ||
219 | - tcg_temp_free(t0); | ||
220 | } | ||
221 | |||
222 | static inline void gen_branch2(DisasContext *dc, target_ulong pc1, | ||
223 | @@ -XXX,XX +XXX,XX @@ static void gen_branch_n(DisasContext *dc, target_ulong pc1) | ||
224 | t = tcg_const_tl(pc1); | ||
225 | z = tcg_const_tl(0); | ||
226 | tcg_gen_movcond_tl(TCG_COND_NE, cpu_npc, cpu_cond, z, t, cpu_npc); | ||
227 | - tcg_temp_free(t); | ||
228 | - tcg_temp_free(z); | ||
229 | |||
230 | dc->pc = DYNAMIC_PC; | ||
231 | } | ||
232 | @@ -XXX,XX +XXX,XX @@ static inline void gen_generic_branch(DisasContext *dc) | ||
233 | TCGv zero = tcg_const_tl(0); | ||
234 | |||
235 | tcg_gen_movcond_tl(TCG_COND_NE, cpu_npc, cpu_cond, zero, npc0, npc1); | ||
236 | - | ||
237 | - tcg_temp_free(npc0); | ||
238 | - tcg_temp_free(npc1); | ||
239 | - tcg_temp_free(zero); | ||
240 | } | ||
241 | |||
242 | /* call this function before using the condition register as it may | ||
243 | @@ -XXX,XX +XXX,XX @@ static void gen_exception(DisasContext *dc, int which) | ||
244 | save_state(dc); | ||
245 | t = tcg_const_i32(which); | ||
246 | gen_helper_raise_exception(cpu_env, t); | ||
247 | - tcg_temp_free_i32(t); | ||
248 | dc->base.is_jmp = DISAS_NORETURN; | ||
249 | } | ||
250 | |||
251 | @@ -XXX,XX +XXX,XX @@ static void gen_check_align(TCGv addr, int mask) | ||
252 | { | ||
253 | TCGv_i32 r_mask = tcg_const_i32(mask); | ||
254 | gen_helper_check_align(cpu_env, addr, r_mask); | ||
255 | - tcg_temp_free_i32(r_mask); | ||
256 | } | ||
257 | |||
258 | static inline void gen_mov_pc_npc(DisasContext *dc) | ||
259 | @@ -XXX,XX +XXX,XX @@ static void gen_ldstub(DisasContext *dc, TCGv dst, TCGv addr, int mmu_idx) | ||
260 | TCGv m1 = tcg_const_tl(0xff); | ||
261 | gen_address_mask(dc, addr); | ||
262 | tcg_gen_atomic_xchg_tl(dst, addr, m1, mmu_idx, MO_UB); | ||
263 | - tcg_temp_free(m1); | ||
264 | } | ||
265 | |||
266 | /* asi moves */ | ||
267 | @@ -XXX,XX +XXX,XX @@ static void gen_ld_asi(DisasContext *dc, TCGv dst, TCGv addr, | ||
268 | TCGv_i64 t64 = tcg_temp_new_i64(); | ||
269 | gen_helper_ld_asi(t64, cpu_env, addr, r_asi, r_mop); | ||
270 | tcg_gen_trunc_i64_tl(dst, t64); | ||
271 | - tcg_temp_free_i64(t64); | ||
272 | } | ||
273 | #endif | ||
274 | - tcg_temp_free_i32(r_mop); | ||
275 | - tcg_temp_free_i32(r_asi); | ||
276 | } | ||
277 | break; | ||
278 | } | ||
279 | @@ -XXX,XX +XXX,XX @@ static void gen_st_asi(DisasContext *dc, TCGv src, TCGv addr, | ||
280 | tcg_gen_add_tl(saddr, saddr, four); | ||
281 | tcg_gen_add_tl(daddr, daddr, four); | ||
282 | } | ||
283 | - | ||
284 | - tcg_temp_free(saddr); | ||
285 | - tcg_temp_free(daddr); | ||
286 | - tcg_temp_free(four); | ||
287 | - tcg_temp_free_i32(tmp); | ||
288 | } | ||
289 | break; | ||
290 | #endif | ||
291 | @@ -XXX,XX +XXX,XX @@ static void gen_st_asi(DisasContext *dc, TCGv src, TCGv addr, | ||
292 | TCGv_i64 t64 = tcg_temp_new_i64(); | ||
293 | tcg_gen_extu_tl_i64(t64, src); | ||
294 | gen_helper_st_asi(cpu_env, addr, t64, r_asi, r_mop); | ||
295 | - tcg_temp_free_i64(t64); | ||
296 | } | ||
297 | #endif | ||
298 | - tcg_temp_free_i32(r_mop); | ||
299 | - tcg_temp_free_i32(r_asi); | ||
300 | |||
301 | /* A write to a TLB register may alter page maps. End the TB. */ | ||
302 | dc->npc = DYNAMIC_PC; | ||
303 | @@ -XXX,XX +XXX,XX @@ static void gen_cas_asi(DisasContext *dc, TCGv addr, TCGv cmpv, | ||
304 | tcg_gen_atomic_cmpxchg_tl(oldv, addr, cmpv, gen_load_gpr(dc, rd), | ||
305 | da.mem_idx, da.memop); | ||
306 | gen_store_gpr(dc, rd, oldv); | ||
307 | - tcg_temp_free(oldv); | ||
308 | break; | ||
309 | default: | ||
310 | /* ??? Should be DAE_invalid_asi. */ | ||
311 | @@ -XXX,XX +XXX,XX @@ static void gen_ldstub_asi(DisasContext *dc, TCGv dst, TCGv addr, int insn) | ||
312 | |||
313 | s64 = tcg_const_i64(0xff); | ||
314 | gen_helper_st_asi(cpu_env, addr, s64, r_asi, r_mop); | ||
315 | - tcg_temp_free_i64(s64); | ||
316 | - tcg_temp_free_i32(r_mop); | ||
317 | - tcg_temp_free_i32(r_asi); | ||
318 | |||
319 | tcg_gen_trunc_i64_tl(dst, t64); | ||
320 | - tcg_temp_free_i64(t64); | ||
321 | |||
322 | /* End the TB. */ | ||
323 | dc->npc = DYNAMIC_PC; | ||
324 | @@ -XXX,XX +XXX,XX @@ static void gen_ldf_asi(DisasContext *dc, TCGv addr, | ||
325 | tcg_gen_qemu_ld_i64(cpu_fpr[rd/2+1], addr, da.mem_idx, | ||
326 | da.memop | MO_ALIGN_4); | ||
327 | tcg_gen_mov_i64(cpu_fpr[rd / 2], d64); | ||
328 | - tcg_temp_free_i64(d64); | ||
329 | break; | ||
330 | default: | ||
331 | g_assert_not_reached(); | ||
332 | @@ -XXX,XX +XXX,XX @@ static void gen_ldf_asi(DisasContext *dc, TCGv addr, | ||
333 | tcg_gen_add_tl(addr, addr, eight); | ||
334 | memop = da.memop; | ||
335 | } | ||
336 | - tcg_temp_free(eight); | ||
337 | } else { | ||
338 | gen_exception(dc, TT_ILL_INSN); | ||
339 | } | ||
340 | @@ -XXX,XX +XXX,XX @@ static void gen_ldf_asi(DisasContext *dc, TCGv addr, | ||
341 | gen_helper_ld_asi(d64, cpu_env, addr, r_asi, r_mop); | ||
342 | d32 = gen_dest_fpr_F(dc); | ||
343 | tcg_gen_extrl_i64_i32(d32, d64); | ||
344 | - tcg_temp_free_i64(d64); | ||
345 | gen_store_fpr_F(dc, rd, d32); | ||
346 | break; | ||
347 | case 8: | ||
348 | @@ -XXX,XX +XXX,XX @@ static void gen_ldf_asi(DisasContext *dc, TCGv addr, | ||
349 | tcg_gen_addi_tl(addr, addr, 8); | ||
350 | gen_helper_ld_asi(cpu_fpr[rd/2+1], cpu_env, addr, r_asi, r_mop); | ||
351 | tcg_gen_mov_i64(cpu_fpr[rd / 2], d64); | ||
352 | - tcg_temp_free_i64(d64); | ||
353 | break; | ||
354 | default: | ||
355 | g_assert_not_reached(); | ||
356 | } | ||
357 | - tcg_temp_free_i32(r_mop); | ||
358 | - tcg_temp_free_i32(r_asi); | ||
359 | } | ||
360 | break; | ||
361 | } | ||
362 | @@ -XXX,XX +XXX,XX @@ static void gen_stf_asi(DisasContext *dc, TCGv addr, | ||
363 | tcg_gen_add_tl(addr, addr, eight); | ||
364 | memop = da.memop; | ||
365 | } | ||
366 | - tcg_temp_free(eight); | ||
367 | } else { | ||
368 | gen_exception(dc, TT_ILL_INSN); | ||
369 | } | ||
370 | @@ -XXX,XX +XXX,XX @@ static void gen_ldda_asi(DisasContext *dc, TCGv addr, int insn, int rd) | ||
371 | } else { | ||
372 | tcg_gen_extr32_i64(hi, lo, tmp); | ||
373 | } | ||
374 | - tcg_temp_free_i64(tmp); | ||
375 | } | ||
376 | break; | ||
377 | |||
378 | @@ -XXX,XX +XXX,XX @@ static void gen_ldda_asi(DisasContext *dc, TCGv addr, int insn, int rd) | ||
379 | |||
380 | save_state(dc); | ||
381 | gen_helper_ld_asi(tmp, cpu_env, addr, r_asi, r_mop); | ||
382 | - tcg_temp_free_i32(r_asi); | ||
383 | - tcg_temp_free_i32(r_mop); | ||
384 | |||
385 | /* See above. */ | ||
386 | if ((da.memop & MO_BSWAP) == MO_TE) { | ||
387 | @@ -XXX,XX +XXX,XX @@ static void gen_ldda_asi(DisasContext *dc, TCGv addr, int insn, int rd) | ||
388 | } else { | ||
389 | tcg_gen_extr32_i64(hi, lo, tmp); | ||
390 | } | ||
391 | - tcg_temp_free_i64(tmp); | ||
392 | } | ||
393 | break; | ||
394 | } | ||
395 | @@ -XXX,XX +XXX,XX @@ static void gen_stda_asi(DisasContext *dc, TCGv hi, TCGv addr, | ||
396 | } | ||
397 | gen_address_mask(dc, addr); | ||
398 | tcg_gen_qemu_st_i64(t64, addr, da.mem_idx, da.memop); | ||
399 | - tcg_temp_free_i64(t64); | ||
400 | } | ||
401 | break; | ||
402 | |||
403 | @@ -XXX,XX +XXX,XX @@ static void gen_stda_asi(DisasContext *dc, TCGv hi, TCGv addr, | ||
404 | |||
405 | save_state(dc); | ||
406 | gen_helper_st_asi(cpu_env, addr, t64, r_asi, r_mop); | ||
407 | - tcg_temp_free_i32(r_mop); | ||
408 | - tcg_temp_free_i32(r_asi); | ||
409 | - tcg_temp_free_i64(t64); | ||
410 | } | ||
411 | break; | ||
412 | } | ||
413 | @@ -XXX,XX +XXX,XX @@ static void gen_casx_asi(DisasContext *dc, TCGv addr, TCGv cmpv, | ||
414 | tcg_gen_atomic_cmpxchg_tl(oldv, addr, cmpv, gen_load_gpr(dc, rd), | ||
415 | da.mem_idx, da.memop); | ||
416 | gen_store_gpr(dc, rd, oldv); | ||
417 | - tcg_temp_free(oldv); | ||
418 | break; | ||
419 | default: | ||
420 | /* ??? Should be DAE_invalid_asi. */ | ||
421 | @@ -XXX,XX +XXX,XX @@ static void gen_ldda_asi(DisasContext *dc, TCGv addr, int insn, int rd) | ||
422 | |||
423 | switch (da.type) { | ||
424 | case GET_ASI_EXCP: | ||
425 | - tcg_temp_free_i64(t64); | ||
426 | return; | ||
427 | case GET_ASI_DIRECT: | ||
428 | gen_address_mask(dc, addr); | ||
429 | @@ -XXX,XX +XXX,XX @@ static void gen_ldda_asi(DisasContext *dc, TCGv addr, int insn, int rd) | ||
430 | |||
431 | save_state(dc); | ||
432 | gen_helper_ld_asi(t64, cpu_env, addr, r_asi, r_mop); | ||
433 | - tcg_temp_free_i32(r_mop); | ||
434 | - tcg_temp_free_i32(r_asi); | ||
435 | } | ||
436 | break; | ||
437 | } | ||
438 | |||
439 | tcg_gen_extr_i64_i32(lo, hi, t64); | ||
440 | - tcg_temp_free_i64(t64); | ||
441 | gen_store_gpr(dc, rd | 1, lo); | ||
442 | gen_store_gpr(dc, rd, hi); | ||
443 | } | ||
444 | @@ -XXX,XX +XXX,XX @@ static void gen_stda_asi(DisasContext *dc, TCGv hi, TCGv addr, | ||
445 | tcg_gen_qemu_st_i64(t64, d_addr, da.mem_idx, da.memop); | ||
446 | tcg_gen_add_tl(d_addr, d_addr, eight); | ||
447 | } | ||
448 | - | ||
449 | - tcg_temp_free(d_addr); | ||
450 | - tcg_temp_free(eight); | ||
451 | } | ||
452 | break; | ||
453 | default: | ||
454 | @@ -XXX,XX +XXX,XX @@ static void gen_stda_asi(DisasContext *dc, TCGv hi, TCGv addr, | ||
455 | |||
456 | save_state(dc); | ||
457 | gen_helper_st_asi(cpu_env, addr, t64, r_asi, r_mop); | ||
458 | - tcg_temp_free_i32(r_mop); | ||
459 | - tcg_temp_free_i32(r_asi); | ||
460 | } | ||
461 | break; | ||
462 | } | ||
463 | - | ||
464 | - tcg_temp_free_i64(t64); | ||
465 | } | ||
466 | #endif | ||
467 | |||
468 | @@ -XXX,XX +XXX,XX @@ static void gen_fmovs(DisasContext *dc, DisasCompare *cmp, int rd, int rs) | ||
469 | TCGv_i64 c64 = tcg_temp_new_i64(); | ||
470 | tcg_gen_setcond_i64(cmp->cond, c64, cmp->c1, cmp->c2); | ||
471 | tcg_gen_extrl_i64_i32(c32, c64); | ||
472 | - tcg_temp_free_i64(c64); | ||
473 | } | ||
474 | |||
475 | s1 = gen_load_fpr_F(dc, rs); | ||
476 | @@ -XXX,XX +XXX,XX @@ static void gen_fmovs(DisasContext *dc, DisasCompare *cmp, int rd, int rs) | ||
477 | |||
478 | tcg_gen_movcond_i32(TCG_COND_NE, dst, c32, zero, s1, s2); | ||
479 | |||
480 | - tcg_temp_free_i32(c32); | ||
481 | - tcg_temp_free_i32(zero); | ||
482 | gen_store_fpr_F(dc, rd, dst); | ||
483 | } | ||
484 | |||
485 | @@ -XXX,XX +XXX,XX @@ static inline void gen_load_trap_state_at_tl(TCGv_ptr r_tsptr, TCGv_env cpu_env) | ||
486 | TCGv_ptr r_tl_tmp = tcg_temp_new_ptr(); | ||
487 | tcg_gen_ext_i32_ptr(r_tl_tmp, r_tl); | ||
488 | tcg_gen_add_ptr(r_tsptr, r_tsptr, r_tl_tmp); | ||
489 | - tcg_temp_free_ptr(r_tl_tmp); | ||
490 | } | ||
491 | - | ||
492 | - tcg_temp_free_i32(r_tl); | ||
493 | } | ||
494 | #endif | ||
495 | |||
496 | @@ -XXX,XX +XXX,XX @@ static void gen_edge(DisasContext *dc, TCGv dst, TCGv s1, TCGv s2, | ||
497 | tcg_gen_neg_tl(t1, t1); | ||
498 | tcg_gen_or_tl(lo2, lo2, t1); | ||
499 | tcg_gen_and_tl(dst, dst, lo2); | ||
500 | - | ||
501 | - tcg_temp_free(lo1); | ||
502 | - tcg_temp_free(lo2); | ||
503 | - tcg_temp_free(t1); | ||
504 | - tcg_temp_free(t2); | ||
505 | } | ||
506 | |||
507 | static void gen_alignaddr(TCGv dst, TCGv s1, TCGv s2, bool left) | ||
508 | @@ -XXX,XX +XXX,XX @@ static void gen_alignaddr(TCGv dst, TCGv s1, TCGv s2, bool left) | ||
509 | tcg_gen_neg_tl(tmp, tmp); | ||
510 | } | ||
511 | tcg_gen_deposit_tl(cpu_gsr, cpu_gsr, tmp, 0, 3); | ||
512 | - | ||
513 | - tcg_temp_free(tmp); | ||
514 | } | ||
515 | |||
516 | static void gen_faligndata(TCGv dst, TCGv gsr, TCGv s1, TCGv s2) | ||
517 | @@ -XXX,XX +XXX,XX @@ static void gen_faligndata(TCGv dst, TCGv gsr, TCGv s1, TCGv s2) | ||
518 | tcg_gen_shri_tl(t2, t2, 1); | ||
519 | |||
520 | tcg_gen_or_tl(dst, t1, t2); | ||
521 | - | ||
522 | - tcg_temp_free(t1); | ||
523 | - tcg_temp_free(t2); | ||
524 | - tcg_temp_free(shift); | ||
525 | } | ||
526 | #endif | ||
527 | |||
528 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
529 | } | ||
530 | |||
531 | gen_helper_raise_exception(cpu_env, trap); | ||
532 | - tcg_temp_free_i32(trap); | ||
533 | |||
534 | if (cond == 8) { | ||
535 | /* An unconditional trap ends the TB. */ | ||
536 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
537 | } | ||
538 | gen_helper_tick_get_count(cpu_dst, cpu_env, r_tickptr, | ||
539 | r_const); | ||
540 | - tcg_temp_free_ptr(r_tickptr); | ||
541 | - tcg_temp_free_i32(r_const); | ||
542 | gen_store_gpr(dc, rd, cpu_dst); | ||
543 | if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) { | ||
544 | /* I/O operations in icount mode must end the TB */ | ||
545 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
546 | } | ||
547 | gen_helper_tick_get_count(cpu_dst, cpu_env, r_tickptr, | ||
548 | r_const); | ||
549 | - tcg_temp_free_ptr(r_tickptr); | ||
550 | - tcg_temp_free_i32(r_const); | ||
551 | gen_store_gpr(dc, rd, cpu_dst); | ||
552 | if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) { | ||
553 | /* I/O operations in icount mode must end the TB */ | ||
554 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
555 | gen_load_trap_state_at_tl(r_tsptr, cpu_env); | ||
556 | tcg_gen_ld_tl(cpu_tmp0, r_tsptr, | ||
557 | offsetof(trap_state, tpc)); | ||
558 | - tcg_temp_free_ptr(r_tsptr); | ||
559 | } | ||
560 | break; | ||
561 | case 1: // tnpc | ||
562 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
563 | gen_load_trap_state_at_tl(r_tsptr, cpu_env); | ||
564 | tcg_gen_ld_tl(cpu_tmp0, r_tsptr, | ||
565 | offsetof(trap_state, tnpc)); | ||
566 | - tcg_temp_free_ptr(r_tsptr); | ||
567 | } | ||
568 | break; | ||
569 | case 2: // tstate | ||
570 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
571 | gen_load_trap_state_at_tl(r_tsptr, cpu_env); | ||
572 | tcg_gen_ld_tl(cpu_tmp0, r_tsptr, | ||
573 | offsetof(trap_state, tstate)); | ||
574 | - tcg_temp_free_ptr(r_tsptr); | ||
575 | } | ||
576 | break; | ||
577 | case 3: // tt | ||
578 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
579 | gen_load_trap_state_at_tl(r_tsptr, cpu_env); | ||
580 | tcg_gen_ld32s_tl(cpu_tmp0, r_tsptr, | ||
581 | offsetof(trap_state, tt)); | ||
582 | - tcg_temp_free_ptr(r_tsptr); | ||
583 | } | ||
584 | break; | ||
585 | case 4: // tick | ||
586 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
587 | } | ||
588 | gen_helper_tick_get_count(cpu_tmp0, cpu_env, | ||
589 | r_tickptr, r_const); | ||
590 | - tcg_temp_free_ptr(r_tickptr); | ||
591 | - tcg_temp_free_i32(r_const); | ||
592 | if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) { | ||
593 | /* I/O operations in icount mode must end the TB */ | ||
594 | dc->base.is_jmp = DISAS_EXIT; | ||
595 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
596 | } | ||
597 | gen_helper_tick_set_limit(r_tickptr, | ||
598 | cpu_tick_cmpr); | ||
599 | - tcg_temp_free_ptr(r_tickptr); | ||
600 | /* End TB to handle timer interrupt */ | ||
601 | dc->base.is_jmp = DISAS_EXIT; | ||
602 | } | ||
603 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
604 | } | ||
605 | gen_helper_tick_set_count(r_tickptr, | ||
606 | cpu_tmp0); | ||
607 | - tcg_temp_free_ptr(r_tickptr); | ||
608 | /* End TB to handle timer interrupt */ | ||
609 | dc->base.is_jmp = DISAS_EXIT; | ||
610 | } | ||
611 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
612 | } | ||
613 | gen_helper_tick_set_limit(r_tickptr, | ||
614 | cpu_stick_cmpr); | ||
615 | - tcg_temp_free_ptr(r_tickptr); | ||
616 | /* End TB to handle timer interrupt */ | ||
617 | dc->base.is_jmp = DISAS_EXIT; | ||
618 | } | ||
619 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
620 | gen_load_trap_state_at_tl(r_tsptr, cpu_env); | ||
621 | tcg_gen_st_tl(cpu_tmp0, r_tsptr, | ||
622 | offsetof(trap_state, tpc)); | ||
623 | - tcg_temp_free_ptr(r_tsptr); | ||
624 | } | ||
625 | break; | ||
626 | case 1: // tnpc | ||
627 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
628 | gen_load_trap_state_at_tl(r_tsptr, cpu_env); | ||
629 | tcg_gen_st_tl(cpu_tmp0, r_tsptr, | ||
630 | offsetof(trap_state, tnpc)); | ||
631 | - tcg_temp_free_ptr(r_tsptr); | ||
632 | } | ||
633 | break; | ||
634 | case 2: // tstate | ||
635 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
636 | tcg_gen_st_tl(cpu_tmp0, r_tsptr, | ||
637 | offsetof(trap_state, | ||
638 | tstate)); | ||
639 | - tcg_temp_free_ptr(r_tsptr); | ||
640 | } | ||
641 | break; | ||
642 | case 3: // tt | ||
643 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
644 | gen_load_trap_state_at_tl(r_tsptr, cpu_env); | ||
645 | tcg_gen_st32_tl(cpu_tmp0, r_tsptr, | ||
646 | offsetof(trap_state, tt)); | ||
647 | - tcg_temp_free_ptr(r_tsptr); | ||
648 | } | ||
649 | break; | ||
650 | case 4: // tick | ||
651 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
652 | } | ||
653 | gen_helper_tick_set_count(r_tickptr, | ||
654 | cpu_tmp0); | ||
655 | - tcg_temp_free_ptr(r_tickptr); | ||
656 | /* End TB to handle timer interrupt */ | ||
657 | dc->base.is_jmp = DISAS_EXIT; | ||
658 | } | ||
659 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
660 | } | ||
661 | gen_helper_tick_set_limit(r_tickptr, | ||
662 | cpu_hstick_cmpr); | ||
663 | - tcg_temp_free_ptr(r_tickptr); | ||
664 | /* End TB to handle timer interrupt */ | ||
665 | dc->base.is_jmp = DISAS_EXIT; | ||
666 | } | ||
667 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
668 | gen_store_gpr(dc, rd + 1, cpu_val); | ||
669 | tcg_gen_shri_i64(t64, t64, 32); | ||
670 | tcg_gen_trunc_i64_tl(cpu_val, t64); | ||
671 | - tcg_temp_free_i64(t64); | ||
672 | tcg_gen_ext32u_tl(cpu_val, cpu_val); | ||
673 | } | ||
674 | break; | ||
675 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
676 | tcg_gen_qemu_ld_i64(t64, cpu_addr, | ||
677 | dc->mem_idx, MO_TEUQ); | ||
678 | gen_helper_ldxfsr(cpu_fsr, cpu_env, cpu_fsr, t64); | ||
679 | - tcg_temp_free_i64(t64); | ||
680 | break; | ||
681 | } | ||
682 | #endif | ||
683 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
684 | tcg_gen_qemu_ld_i64(cpu_src2_64, cpu_addr, dc->mem_idx, | ||
685 | MO_TEUQ | MO_ALIGN_4); | ||
686 | gen_store_fpr_Q(dc, rd, cpu_src1_64, cpu_src2_64); | ||
687 | - tcg_temp_free_i64(cpu_src1_64); | ||
688 | - tcg_temp_free_i64(cpu_src2_64); | ||
689 | break; | ||
690 | case 0x23: /* lddf, load double fpreg */ | ||
691 | gen_address_mask(dc, cpu_addr); | ||
692 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
693 | t64 = tcg_temp_new_i64(); | ||
694 | tcg_gen_concat_tl_i64(t64, lo, cpu_val); | ||
695 | tcg_gen_qemu_st64(t64, cpu_addr, dc->mem_idx); | ||
696 | - tcg_temp_free_i64(t64); | ||
697 | } | ||
698 | break; | ||
699 | #if !defined(CONFIG_USER_ONLY) || defined(TARGET_SPARC64) | ||
700 | -- | ||
701 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | Remove sar_m32_allocated, as sar_m32 non-null is equivalent. | ||
3 | 1 | ||
4 | Reviewed-by: Max Filippov <jcmvbkbc@gmail.com> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
6 | --- | ||
7 | target/xtensa/translate.c | 14 ++------------ | ||
8 | 1 file changed, 2 insertions(+), 12 deletions(-) | ||
9 | |||
10 | diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c | ||
11 | index XXXXXXX..XXXXXXX 100644 | ||
12 | --- a/target/xtensa/translate.c | ||
13 | +++ b/target/xtensa/translate.c | ||
14 | @@ -XXX,XX +XXX,XX @@ struct DisasContext { | ||
15 | |||
16 | bool sar_5bit; | ||
17 | bool sar_m32_5bit; | ||
18 | - bool sar_m32_allocated; | ||
19 | TCGv_i32 sar_m32; | ||
20 | |||
21 | unsigned window; | ||
22 | @@ -XXX,XX +XXX,XX @@ static void init_sar_tracker(DisasContext *dc) | ||
23 | { | ||
24 | dc->sar_5bit = false; | ||
25 | dc->sar_m32_5bit = false; | ||
26 | - dc->sar_m32_allocated = false; | ||
27 | -} | ||
28 | - | ||
29 | -static void reset_sar_tracker(DisasContext *dc) | ||
30 | -{ | ||
31 | - if (dc->sar_m32_allocated) { | ||
32 | - tcg_temp_free(dc->sar_m32); | ||
33 | - } | ||
34 | + dc->sar_m32 = NULL; | ||
35 | } | ||
36 | |||
37 | static void gen_right_shift_sar(DisasContext *dc, TCGv_i32 sa) | ||
38 | @@ -XXX,XX +XXX,XX @@ static void gen_right_shift_sar(DisasContext *dc, TCGv_i32 sa) | ||
39 | |||
40 | static void gen_left_shift_sar(DisasContext *dc, TCGv_i32 sa) | ||
41 | { | ||
42 | - if (!dc->sar_m32_allocated) { | ||
43 | + if (!dc->sar_m32) { | ||
44 | dc->sar_m32 = tcg_temp_new_i32(); | ||
45 | - dc->sar_m32_allocated = true; | ||
46 | } | ||
47 | tcg_gen_andi_i32(dc->sar_m32, sa, 0x1f); | ||
48 | tcg_gen_sub_i32(cpu_SR[SAR], tcg_constant_i32(32), dc->sar_m32); | ||
49 | @@ -XXX,XX +XXX,XX @@ static void xtensa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu) | ||
50 | { | ||
51 | DisasContext *dc = container_of(dcbase, DisasContext, base); | ||
52 | |||
53 | - reset_sar_tracker(dc); | ||
54 | if (dc->icount) { | ||
55 | tcg_temp_free(dc->next_icount); | ||
56 | } | ||
57 | -- | ||
58 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Max Filippov <jcmvbkbc@gmail.com> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/xtensa/translate.c | 107 -------------------------------------- | ||
7 | 1 file changed, 107 deletions(-) | ||
8 | |||
9 | diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/xtensa/translate.c | ||
12 | +++ b/target/xtensa/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc) | ||
14 | ops->translate(dc, pslot->arg, ops->par); | ||
15 | } | ||
16 | |||
17 | - for (i = 0; i < n_arg_copy; ++i) { | ||
18 | - if (arg_copy[i].arg->num_bits <= 32) { | ||
19 | - tcg_temp_free_i32(arg_copy[i].temp); | ||
20 | - } else if (arg_copy[i].arg->num_bits <= 64) { | ||
21 | - tcg_temp_free_i64(arg_copy[i].temp); | ||
22 | - } else { | ||
23 | - g_assert_not_reached(); | ||
24 | - } | ||
25 | - } | ||
26 | - | ||
27 | if (dc->base.is_jmp == DISAS_NEXT) { | ||
28 | gen_postprocess(dc, 0); | ||
29 | dc->op_flags = 0; | ||
30 | @@ -XXX,XX +XXX,XX @@ static void xtensa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu) | ||
31 | { | ||
32 | DisasContext *dc = container_of(dcbase, DisasContext, base); | ||
33 | |||
34 | - if (dc->icount) { | ||
35 | - tcg_temp_free(dc->next_icount); | ||
36 | - } | ||
37 | - | ||
38 | switch (dc->base.is_jmp) { | ||
39 | case DISAS_NORETURN: | ||
40 | break; | ||
41 | @@ -XXX,XX +XXX,XX @@ static void translate_addx(DisasContext *dc, const OpcodeArg arg[], | ||
42 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
43 | tcg_gen_shli_i32(tmp, arg[1].in, par[0]); | ||
44 | tcg_gen_add_i32(arg[0].out, tmp, arg[2].in); | ||
45 | - tcg_temp_free(tmp); | ||
46 | } | ||
47 | |||
48 | static void translate_all(DisasContext *dc, const OpcodeArg arg[], | ||
49 | @@ -XXX,XX +XXX,XX @@ static void translate_all(DisasContext *dc, const OpcodeArg arg[], | ||
50 | tcg_gen_shri_i32(tmp, tmp, arg[1].imm + shift); | ||
51 | tcg_gen_deposit_i32(arg[0].out, arg[0].out, | ||
52 | tmp, arg[0].imm, 1); | ||
53 | - tcg_temp_free(mask); | ||
54 | - tcg_temp_free(tmp); | ||
55 | } | ||
56 | |||
57 | static void translate_and(DisasContext *dc, const OpcodeArg arg[], | ||
58 | @@ -XXX,XX +XXX,XX @@ static void translate_ball(DisasContext *dc, const OpcodeArg arg[], | ||
59 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
60 | tcg_gen_and_i32(tmp, arg[0].in, arg[1].in); | ||
61 | gen_brcond(dc, par[0], tmp, arg[1].in, arg[2].imm); | ||
62 | - tcg_temp_free(tmp); | ||
63 | } | ||
64 | |||
65 | static void translate_bany(DisasContext *dc, const OpcodeArg arg[], | ||
66 | @@ -XXX,XX +XXX,XX @@ static void translate_bany(DisasContext *dc, const OpcodeArg arg[], | ||
67 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
68 | tcg_gen_and_i32(tmp, arg[0].in, arg[1].in); | ||
69 | gen_brcondi(dc, par[0], tmp, 0, arg[2].imm); | ||
70 | - tcg_temp_free(tmp); | ||
71 | } | ||
72 | |||
73 | static void translate_b(DisasContext *dc, const OpcodeArg arg[], | ||
74 | @@ -XXX,XX +XXX,XX @@ static void translate_bb(DisasContext *dc, const OpcodeArg arg[], | ||
75 | #endif | ||
76 | tcg_gen_and_i32(tmp, arg[0].in, bit); | ||
77 | gen_brcondi(dc, par[0], tmp, 0, arg[2].imm); | ||
78 | - tcg_temp_free(tmp); | ||
79 | - tcg_temp_free(bit); | ||
80 | } | ||
81 | |||
82 | static void translate_bbi(DisasContext *dc, const OpcodeArg arg[], | ||
83 | @@ -XXX,XX +XXX,XX @@ static void translate_bbi(DisasContext *dc, const OpcodeArg arg[], | ||
84 | tcg_gen_andi_i32(tmp, arg[0].in, 0x00000001u << arg[1].imm); | ||
85 | #endif | ||
86 | gen_brcondi(dc, par[0], tmp, 0, arg[2].imm); | ||
87 | - tcg_temp_free(tmp); | ||
88 | } | ||
89 | |||
90 | static void translate_bi(DisasContext *dc, const OpcodeArg arg[], | ||
91 | @@ -XXX,XX +XXX,XX @@ static void translate_boolean(DisasContext *dc, const OpcodeArg arg[], | ||
92 | tcg_gen_shri_i32(tmp2, arg[2].in, arg[2].imm); | ||
93 | op[par[0]](tmp1, tmp1, tmp2); | ||
94 | tcg_gen_deposit_i32(arg[0].out, arg[0].out, tmp1, arg[0].imm, 1); | ||
95 | - tcg_temp_free(tmp1); | ||
96 | - tcg_temp_free(tmp2); | ||
97 | } | ||
98 | |||
99 | static void translate_bp(DisasContext *dc, const OpcodeArg arg[], | ||
100 | @@ -XXX,XX +XXX,XX @@ static void translate_bp(DisasContext *dc, const OpcodeArg arg[], | ||
101 | |||
102 | tcg_gen_andi_i32(tmp, arg[0].in, 1 << arg[0].imm); | ||
103 | gen_brcondi(dc, par[0], tmp, 0, arg[1].imm); | ||
104 | - tcg_temp_free(tmp); | ||
105 | } | ||
106 | |||
107 | static void translate_call0(DisasContext *dc, const OpcodeArg arg[], | ||
108 | @@ -XXX,XX +XXX,XX @@ static void translate_callw(DisasContext *dc, const OpcodeArg arg[], | ||
109 | { | ||
110 | TCGv_i32 tmp = tcg_const_i32(arg[0].imm); | ||
111 | gen_callw_slot(dc, par[0], tmp, adjust_jump_slot(dc, arg[0].imm, 0)); | ||
112 | - tcg_temp_free(tmp); | ||
113 | } | ||
114 | |||
115 | static void translate_callx0(DisasContext *dc, const OpcodeArg arg[], | ||
116 | @@ -XXX,XX +XXX,XX @@ static void translate_callx0(DisasContext *dc, const OpcodeArg arg[], | ||
117 | tcg_gen_mov_i32(tmp, arg[0].in); | ||
118 | tcg_gen_movi_i32(cpu_R[0], dc->base.pc_next); | ||
119 | gen_jump(dc, tmp); | ||
120 | - tcg_temp_free(tmp); | ||
121 | } | ||
122 | |||
123 | static void translate_callxw(DisasContext *dc, const OpcodeArg arg[], | ||
124 | @@ -XXX,XX +XXX,XX @@ static void translate_callxw(DisasContext *dc, const OpcodeArg arg[], | ||
125 | |||
126 | tcg_gen_mov_i32(tmp, arg[0].in); | ||
127 | gen_callw_slot(dc, par[0], tmp, -1); | ||
128 | - tcg_temp_free(tmp); | ||
129 | } | ||
130 | |||
131 | static void translate_clamps(DisasContext *dc, const OpcodeArg arg[], | ||
132 | @@ -XXX,XX +XXX,XX @@ static void translate_clamps(DisasContext *dc, const OpcodeArg arg[], | ||
133 | |||
134 | tcg_gen_smax_i32(tmp1, tmp1, arg[1].in); | ||
135 | tcg_gen_smin_i32(arg[0].out, tmp1, tmp2); | ||
136 | - tcg_temp_free(tmp1); | ||
137 | - tcg_temp_free(tmp2); | ||
138 | } | ||
139 | |||
140 | static void translate_clrb_expstate(DisasContext *dc, const OpcodeArg arg[], | ||
141 | @@ -XXX,XX +XXX,XX @@ static void translate_const16(DisasContext *dc, const OpcodeArg arg[], | ||
142 | TCGv_i32 c = tcg_const_i32(arg[1].imm); | ||
143 | |||
144 | tcg_gen_deposit_i32(arg[0].out, c, arg[0].in, 16, 16); | ||
145 | - tcg_temp_free(c); | ||
146 | } | ||
147 | |||
148 | static void translate_dcache(DisasContext *dc, const OpcodeArg arg[], | ||
149 | @@ -XXX,XX +XXX,XX @@ static void translate_dcache(DisasContext *dc, const OpcodeArg arg[], | ||
150 | |||
151 | tcg_gen_addi_i32(addr, arg[0].in, arg[1].imm); | ||
152 | tcg_gen_qemu_ld8u(res, addr, dc->cring); | ||
153 | - tcg_temp_free(addr); | ||
154 | - tcg_temp_free(res); | ||
155 | } | ||
156 | |||
157 | static void translate_depbits(DisasContext *dc, const OpcodeArg arg[], | ||
158 | @@ -XXX,XX +XXX,XX @@ static void translate_extui(DisasContext *dc, const OpcodeArg arg[], | ||
159 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
160 | tcg_gen_shri_i32(tmp, arg[1].in, arg[2].imm); | ||
161 | tcg_gen_andi_i32(arg[0].out, tmp, maskimm); | ||
162 | - tcg_temp_free(tmp); | ||
163 | } | ||
164 | |||
165 | static void translate_getex(DisasContext *dc, const OpcodeArg arg[], | ||
166 | @@ -XXX,XX +XXX,XX @@ static void translate_getex(DisasContext *dc, const OpcodeArg arg[], | ||
167 | tcg_gen_extract_i32(tmp, cpu_SR[ATOMCTL], 8, 1); | ||
168 | tcg_gen_deposit_i32(cpu_SR[ATOMCTL], cpu_SR[ATOMCTL], arg[0].in, 8, 1); | ||
169 | tcg_gen_mov_i32(arg[0].out, tmp); | ||
170 | - tcg_temp_free(tmp); | ||
171 | } | ||
172 | |||
173 | static void translate_icache(DisasContext *dc, const OpcodeArg arg[], | ||
174 | @@ -XXX,XX +XXX,XX @@ static void translate_icache(DisasContext *dc, const OpcodeArg arg[], | ||
175 | tcg_gen_movi_i32(cpu_pc, dc->pc); | ||
176 | tcg_gen_addi_i32(addr, arg[0].in, arg[1].imm); | ||
177 | gen_helper_itlb_hit_test(cpu_env, addr); | ||
178 | - tcg_temp_free(addr); | ||
179 | #endif | ||
180 | } | ||
181 | |||
182 | @@ -XXX,XX +XXX,XX @@ static void translate_l32e(DisasContext *dc, const OpcodeArg arg[], | ||
183 | tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm); | ||
184 | mop = gen_load_store_alignment(dc, MO_TEUL, addr); | ||
185 | tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->ring, mop); | ||
186 | - tcg_temp_free(addr); | ||
187 | } | ||
188 | |||
189 | #ifdef CONFIG_USER_ONLY | ||
190 | @@ -XXX,XX +XXX,XX @@ static void translate_l32ex(DisasContext *dc, const OpcodeArg arg[], | ||
191 | tcg_gen_qemu_ld_i32(arg[0].out, addr, dc->cring, mop); | ||
192 | tcg_gen_mov_i32(cpu_exclusive_addr, addr); | ||
193 | tcg_gen_mov_i32(cpu_exclusive_val, arg[0].out); | ||
194 | - tcg_temp_free(addr); | ||
195 | } | ||
196 | |||
197 | static void translate_ldst(DisasContext *dc, const OpcodeArg arg[], | ||
198 | @@ -XXX,XX +XXX,XX @@ static void translate_ldst(DisasContext *dc, const OpcodeArg arg[], | ||
199 | tcg_gen_mb(TCG_BAR_LDAQ | TCG_MO_ALL); | ||
200 | } | ||
201 | } | ||
202 | - tcg_temp_free(addr); | ||
203 | } | ||
204 | |||
205 | static void translate_lct(DisasContext *dc, const OpcodeArg arg[], | ||
206 | @@ -XXX,XX +XXX,XX @@ static void translate_l32r(DisasContext *dc, const OpcodeArg arg[], | ||
207 | tmp = tcg_const_i32(arg[1].imm); | ||
208 | } | ||
209 | tcg_gen_qemu_ld32u(arg[0].out, tmp, dc->cring); | ||
210 | - tcg_temp_free(tmp); | ||
211 | } | ||
212 | |||
213 | static void translate_loop(DisasContext *dc, const OpcodeArg arg[], | ||
214 | @@ -XXX,XX +XXX,XX @@ static void translate_mac16(DisasContext *dc, const OpcodeArg arg[], | ||
215 | lo, hi); | ||
216 | } | ||
217 | tcg_gen_ext8s_i32(cpu_SR[ACCHI], cpu_SR[ACCHI]); | ||
218 | - | ||
219 | - tcg_temp_free_i32(lo); | ||
220 | - tcg_temp_free_i32(hi); | ||
221 | } | ||
222 | - tcg_temp_free(m1); | ||
223 | - tcg_temp_free(m2); | ||
224 | } | ||
225 | if (ld_offset) { | ||
226 | tcg_gen_mov_i32(arg[1].out, vaddr); | ||
227 | tcg_gen_mov_i32(cpu_SR[MR + arg[0].imm], mem32); | ||
228 | } | ||
229 | - tcg_temp_free(vaddr); | ||
230 | - tcg_temp_free(mem32); | ||
231 | } | ||
232 | |||
233 | static void translate_memw(DisasContext *dc, const OpcodeArg arg[], | ||
234 | @@ -XXX,XX +XXX,XX @@ static void translate_movp(DisasContext *dc, const OpcodeArg arg[], | ||
235 | tcg_gen_movcond_i32(par[0], | ||
236 | arg[0].out, tmp, zero, | ||
237 | arg[1].in, arg[0].in); | ||
238 | - tcg_temp_free(tmp); | ||
239 | } | ||
240 | |||
241 | static void translate_movsp(DisasContext *dc, const OpcodeArg arg[], | ||
242 | @@ -XXX,XX +XXX,XX @@ static void translate_mul16(DisasContext *dc, const OpcodeArg arg[], | ||
243 | tcg_gen_ext16u_i32(v2, arg[2].in); | ||
244 | } | ||
245 | tcg_gen_mul_i32(arg[0].out, v1, v2); | ||
246 | - tcg_temp_free(v2); | ||
247 | - tcg_temp_free(v1); | ||
248 | } | ||
249 | |||
250 | static void translate_mull(DisasContext *dc, const OpcodeArg arg[], | ||
251 | @@ -XXX,XX +XXX,XX @@ static void translate_mulh(DisasContext *dc, const OpcodeArg arg[], | ||
252 | } else { | ||
253 | tcg_gen_mulu2_i32(lo, arg[0].out, arg[1].in, arg[2].in); | ||
254 | } | ||
255 | - tcg_temp_free(lo); | ||
256 | } | ||
257 | |||
258 | static void translate_neg(DisasContext *dc, const OpcodeArg arg[], | ||
259 | @@ -XXX,XX +XXX,XX @@ static void translate_retw(DisasContext *dc, const OpcodeArg arg[], | ||
260 | tcg_gen_deposit_i32(tmp, tmp, cpu_R[0], 0, 30); | ||
261 | gen_helper_retw(cpu_env, cpu_R[0]); | ||
262 | gen_jump(dc, tmp); | ||
263 | - tcg_temp_free(tmp); | ||
264 | } | ||
265 | |||
266 | static void translate_rfde(DisasContext *dc, const OpcodeArg arg[], | ||
267 | @@ -XXX,XX +XXX,XX @@ static void translate_rfw(DisasContext *dc, const OpcodeArg arg[], | ||
268 | cpu_SR[WINDOW_START], tmp); | ||
269 | } | ||
270 | |||
271 | - tcg_temp_free(tmp); | ||
272 | gen_helper_restore_owb(cpu_env); | ||
273 | gen_jump(dc, cpu_SR[EPC1]); | ||
274 | } | ||
275 | @@ -XXX,XX +XXX,XX @@ static void translate_rsr_ptevaddr(DisasContext *dc, const OpcodeArg arg[], | ||
276 | tcg_gen_shri_i32(tmp, cpu_SR[EXCVADDR], 10); | ||
277 | tcg_gen_or_i32(tmp, tmp, cpu_SR[PTEVADDR]); | ||
278 | tcg_gen_andi_i32(arg[0].out, tmp, 0xfffffffc); | ||
279 | - tcg_temp_free(tmp); | ||
280 | #endif | ||
281 | } | ||
282 | |||
283 | @@ -XXX,XX +XXX,XX @@ static void translate_s32c1i(DisasContext *dc, const OpcodeArg arg[], | ||
284 | gen_check_atomctl(dc, addr); | ||
285 | tcg_gen_atomic_cmpxchg_i32(arg[0].out, addr, cpu_SR[SCOMPARE1], | ||
286 | tmp, dc->cring, mop); | ||
287 | - tcg_temp_free(addr); | ||
288 | - tcg_temp_free(tmp); | ||
289 | } | ||
290 | |||
291 | static void translate_s32e(DisasContext *dc, const OpcodeArg arg[], | ||
292 | @@ -XXX,XX +XXX,XX @@ static void translate_s32e(DisasContext *dc, const OpcodeArg arg[], | ||
293 | tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm); | ||
294 | mop = gen_load_store_alignment(dc, MO_TEUL, addr); | ||
295 | tcg_gen_qemu_st_tl(arg[0].in, addr, dc->ring, mop); | ||
296 | - tcg_temp_free(addr); | ||
297 | } | ||
298 | |||
299 | static void translate_s32ex(DisasContext *dc, const OpcodeArg arg[], | ||
300 | @@ -XXX,XX +XXX,XX @@ static void translate_s32ex(DisasContext *dc, const OpcodeArg arg[], | ||
301 | gen_set_label(label); | ||
302 | tcg_gen_extract_i32(arg[0].out, cpu_SR[ATOMCTL], 8, 1); | ||
303 | tcg_gen_deposit_i32(cpu_SR[ATOMCTL], cpu_SR[ATOMCTL], res, 8, 1); | ||
304 | - tcg_temp_free(prev); | ||
305 | - tcg_temp_free(addr); | ||
306 | - tcg_temp_free(res); | ||
307 | } | ||
308 | |||
309 | static void translate_salt(DisasContext *dc, const OpcodeArg arg[], | ||
310 | @@ -XXX,XX +XXX,XX @@ static void translate_sext(DisasContext *dc, const OpcodeArg arg[], | ||
311 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
312 | tcg_gen_shli_i32(tmp, arg[1].in, shift); | ||
313 | tcg_gen_sari_i32(arg[0].out, tmp, shift); | ||
314 | - tcg_temp_free(tmp); | ||
315 | } | ||
316 | } | ||
317 | |||
318 | @@ -XXX,XX +XXX,XX @@ static void translate_simcall(DisasContext *dc, const OpcodeArg arg[], | ||
319 | tcg_gen_extu_i32_i64(tmp, reg); \ | ||
320 | tcg_gen_##cmd##_i64(v, v, tmp); \ | ||
321 | tcg_gen_extrl_i64_i32(arg[0].out, v); \ | ||
322 | - tcg_temp_free_i64(v); \ | ||
323 | - tcg_temp_free_i64(tmp); \ | ||
324 | } while (0) | ||
325 | |||
326 | #define gen_shift(cmd) gen_shift_reg(cmd, cpu_SR[SAR]) | ||
327 | @@ -XXX,XX +XXX,XX @@ static void translate_sll(DisasContext *dc, const OpcodeArg arg[], | ||
328 | tcg_gen_andi_i32(s, s, 0x3f); | ||
329 | tcg_gen_extu_i32_i64(v, arg[1].in); | ||
330 | gen_shift_reg(shl, s); | ||
331 | - tcg_temp_free(s); | ||
332 | } | ||
333 | } | ||
334 | |||
335 | @@ -XXX,XX +XXX,XX @@ static void translate_ssa8b(DisasContext *dc, const OpcodeArg arg[], | ||
336 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
337 | tcg_gen_shli_i32(tmp, arg[0].in, 3); | ||
338 | gen_left_shift_sar(dc, tmp); | ||
339 | - tcg_temp_free(tmp); | ||
340 | } | ||
341 | |||
342 | static void translate_ssa8l(DisasContext *dc, const OpcodeArg arg[], | ||
343 | @@ -XXX,XX +XXX,XX @@ static void translate_ssa8l(DisasContext *dc, const OpcodeArg arg[], | ||
344 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
345 | tcg_gen_shli_i32(tmp, arg[0].in, 3); | ||
346 | gen_right_shift_sar(dc, tmp); | ||
347 | - tcg_temp_free(tmp); | ||
348 | } | ||
349 | |||
350 | static void translate_ssai(DisasContext *dc, const OpcodeArg arg[], | ||
351 | @@ -XXX,XX +XXX,XX @@ static void translate_subx(DisasContext *dc, const OpcodeArg arg[], | ||
352 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
353 | tcg_gen_shli_i32(tmp, arg[1].in, par[0]); | ||
354 | tcg_gen_sub_i32(arg[0].out, tmp, arg[2].in); | ||
355 | - tcg_temp_free(tmp); | ||
356 | } | ||
357 | |||
358 | static void translate_waiti(DisasContext *dc, const OpcodeArg arg[], | ||
359 | @@ -XXX,XX +XXX,XX @@ static void translate_xsr(DisasContext *dc, const OpcodeArg arg[], | ||
360 | tcg_gen_mov_i32(tmp, arg[0].in); | ||
361 | tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]); | ||
362 | tcg_gen_mov_i32(cpu_SR[par[0]], tmp); | ||
363 | - tcg_temp_free(tmp); | ||
364 | } else { | ||
365 | tcg_gen_movi_i32(arg[0].out, 0); | ||
366 | } | ||
367 | @@ -XXX,XX +XXX,XX @@ static void translate_xsr_mask(DisasContext *dc, const OpcodeArg arg[], | ||
368 | tcg_gen_mov_i32(tmp, arg[0].in); | ||
369 | tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]); | ||
370 | tcg_gen_andi_i32(cpu_SR[par[0]], tmp, par[2]); | ||
371 | - tcg_temp_free(tmp); | ||
372 | } else { | ||
373 | tcg_gen_movi_i32(arg[0].out, 0); | ||
374 | } | ||
375 | @@ -XXX,XX +XXX,XX @@ static void translate_xsr_ccount(DisasContext *dc, const OpcodeArg arg[], | ||
376 | tcg_gen_mov_i32(tmp, cpu_SR[par[0]]); | ||
377 | gen_helper_wsr_ccount(cpu_env, arg[0].in); | ||
378 | tcg_gen_mov_i32(arg[0].out, tmp); | ||
379 | - tcg_temp_free(tmp); | ||
380 | |||
381 | #endif | ||
382 | } | ||
383 | @@ -XXX,XX +XXX,XX @@ static void translate_xsr_ccount(DisasContext *dc, const OpcodeArg arg[], | ||
384 | } \ | ||
385 | translate_wsr_##name(dc, arg, par); \ | ||
386 | tcg_gen_mov_i32(arg[0].out, tmp); \ | ||
387 | - tcg_temp_free(tmp); \ | ||
388 | } | ||
389 | |||
390 | gen_translate_xsr(acchi) | ||
391 | @@ -XXX,XX +XXX,XX @@ static inline void put_f32_o1_i3(const OpcodeArg *arg, const OpcodeArg *arg32, | ||
392 | (o0 >= 0 && arg[o0].num_bits == 64)) { | ||
393 | if (o0 >= 0) { | ||
394 | tcg_gen_extu_i32_i64(arg[o0].out, arg32[o0].out); | ||
395 | - tcg_temp_free_i32(arg32[o0].out); | ||
396 | - } | ||
397 | - if (i0 >= 0) { | ||
398 | - tcg_temp_free_i32(arg32[i0].in); | ||
399 | - } | ||
400 | - if (i1 >= 0) { | ||
401 | - tcg_temp_free_i32(arg32[i1].in); | ||
402 | - } | ||
403 | - if (i2 >= 0) { | ||
404 | - tcg_temp_free_i32(arg32[i2].in); | ||
405 | } | ||
406 | } | ||
407 | } | ||
408 | @@ -XXX,XX +XXX,XX @@ static void translate_compare_d(DisasContext *dc, const OpcodeArg arg[], | ||
409 | tcg_gen_movcond_i32(TCG_COND_NE, | ||
410 | arg[0].out, res, zero, | ||
411 | set_br, clr_br); | ||
412 | - tcg_temp_free(res); | ||
413 | - tcg_temp_free(set_br); | ||
414 | - tcg_temp_free(clr_br); | ||
415 | } | ||
416 | |||
417 | static void translate_compare_s(DisasContext *dc, const OpcodeArg arg[], | ||
418 | @@ -XXX,XX +XXX,XX @@ static void translate_compare_s(DisasContext *dc, const OpcodeArg arg[], | ||
419 | arg[0].out, res, zero, | ||
420 | set_br, clr_br); | ||
421 | put_f32_i2(arg, arg32, 1, 2); | ||
422 | - tcg_temp_free(res); | ||
423 | - tcg_temp_free(set_br); | ||
424 | - tcg_temp_free(clr_br); | ||
425 | } | ||
426 | |||
427 | static void translate_const_d(DisasContext *dc, const OpcodeArg arg[], | ||
428 | @@ -XXX,XX +XXX,XX @@ static void translate_ldsti(DisasContext *dc, const OpcodeArg arg[], | ||
429 | if (par[1]) { | ||
430 | tcg_gen_mov_i32(arg[1].out, addr); | ||
431 | } | ||
432 | - tcg_temp_free(addr); | ||
433 | } | ||
434 | |||
435 | static void translate_ldstx(DisasContext *dc, const OpcodeArg arg[], | ||
436 | @@ -XXX,XX +XXX,XX @@ static void translate_ldstx(DisasContext *dc, const OpcodeArg arg[], | ||
437 | if (par[1]) { | ||
438 | tcg_gen_mov_i32(arg[1].out, addr); | ||
439 | } | ||
440 | - tcg_temp_free(addr); | ||
441 | } | ||
442 | |||
443 | static void translate_fpu2k_madd_s(DisasContext *dc, const OpcodeArg arg[], | ||
444 | @@ -XXX,XX +XXX,XX @@ static void translate_movcond_d(DisasContext *dc, const OpcodeArg arg[], | ||
445 | tcg_gen_movcond_i64(par[0], arg[0].out, | ||
446 | arg2, zero, | ||
447 | arg[1].in, arg[0].in); | ||
448 | - tcg_temp_free_i64(arg2); | ||
449 | } | ||
450 | |||
451 | static void translate_movcond_s(DisasContext *dc, const OpcodeArg arg[], | ||
452 | @@ -XXX,XX +XXX,XX @@ static void translate_movp_d(DisasContext *dc, const OpcodeArg arg[], | ||
453 | tcg_gen_movcond_i64(par[0], | ||
454 | arg[0].out, tmp2, zero, | ||
455 | arg[1].in, arg[0].in); | ||
456 | - tcg_temp_free_i32(tmp1); | ||
457 | - tcg_temp_free_i64(tmp2); | ||
458 | } | ||
459 | |||
460 | static void translate_movp_s(DisasContext *dc, const OpcodeArg arg[], | ||
461 | @@ -XXX,XX +XXX,XX @@ static void translate_movp_s(DisasContext *dc, const OpcodeArg arg[], | ||
462 | tcg_gen_movcond_i32(par[0], | ||
463 | arg[0].out, tmp, zero, | ||
464 | arg[1].in, arg[0].in); | ||
465 | - tcg_temp_free(tmp); | ||
466 | } else { | ||
467 | translate_movp_d(dc, arg, par); | ||
468 | } | ||
469 | @@ -XXX,XX +XXX,XX @@ static void translate_cvtd_s(DisasContext *dc, const OpcodeArg arg[], | ||
470 | |||
471 | tcg_gen_extrl_i64_i32(v, arg[1].in); | ||
472 | gen_helper_cvtd_s(arg[0].out, cpu_env, v); | ||
473 | - tcg_temp_free_i32(v); | ||
474 | } | ||
475 | |||
476 | static void translate_cvts_d(DisasContext *dc, const OpcodeArg arg[], | ||
477 | @@ -XXX,XX +XXX,XX @@ static void translate_cvts_d(DisasContext *dc, const OpcodeArg arg[], | ||
478 | |||
479 | gen_helper_cvts_d(v, cpu_env, arg[1].in); | ||
480 | tcg_gen_extu_i32_i64(arg[0].out, v); | ||
481 | - tcg_temp_free_i32(v); | ||
482 | } | ||
483 | |||
484 | static void translate_ldsti_d(DisasContext *dc, const OpcodeArg arg[], | ||
485 | @@ -XXX,XX +XXX,XX @@ static void translate_ldsti_d(DisasContext *dc, const OpcodeArg arg[], | ||
486 | tcg_gen_addi_i32(arg[1].out, arg[1].in, arg[2].imm); | ||
487 | } | ||
488 | } | ||
489 | - if (par[1]) { | ||
490 | - tcg_temp_free(addr); | ||
491 | - } | ||
492 | } | ||
493 | |||
494 | static void translate_ldsti_s(DisasContext *dc, const OpcodeArg arg[], | ||
495 | @@ -XXX,XX +XXX,XX @@ static void translate_ldsti_s(DisasContext *dc, const OpcodeArg arg[], | ||
496 | tcg_gen_addi_i32(arg[1].out, arg[1].in, arg[2].imm); | ||
497 | } | ||
498 | } | ||
499 | - if (par[1]) { | ||
500 | - tcg_temp_free(addr); | ||
501 | - } | ||
502 | } | ||
503 | |||
504 | static void translate_ldstx_d(DisasContext *dc, const OpcodeArg arg[], | ||
505 | @@ -XXX,XX +XXX,XX @@ static void translate_ldstx_d(DisasContext *dc, const OpcodeArg arg[], | ||
506 | tcg_gen_add_i32(arg[1].out, arg[1].in, arg[2].in); | ||
507 | } | ||
508 | } | ||
509 | - if (par[1]) { | ||
510 | - tcg_temp_free(addr); | ||
511 | - } | ||
512 | } | ||
513 | |||
514 | static void translate_ldstx_s(DisasContext *dc, const OpcodeArg arg[], | ||
515 | @@ -XXX,XX +XXX,XX @@ static void translate_ldstx_s(DisasContext *dc, const OpcodeArg arg[], | ||
516 | tcg_gen_add_i32(arg[1].out, arg[1].in, arg[2].in); | ||
517 | } | ||
518 | } | ||
519 | - if (par[1]) { | ||
520 | - tcg_temp_free(addr); | ||
521 | - } | ||
522 | } | ||
523 | |||
524 | static void translate_madd_d(DisasContext *dc, const OpcodeArg arg[], | ||
525 | -- | ||
526 | 2.34.1 | diff view generated by jsdifflib |
1 | All uses are strictly read-only. | 1 | Replace target-specific 'Z' with generic 'z'. |
---|---|---|---|
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/microblaze/translate.c | 35 +++++++++++++++-------------------- | 6 | tcg/riscv/tcg-target-con-set.h | 10 +++++----- |
7 | 1 file changed, 15 insertions(+), 20 deletions(-) | 7 | tcg/riscv/tcg-target-con-str.h | 1 - |
8 | tcg/riscv/tcg-target.c.inc | 28 ++++++++++++---------------- | ||
9 | 3 files changed, 17 insertions(+), 22 deletions(-) | ||
8 | 10 | ||
9 | diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c | 11 | diff --git a/tcg/riscv/tcg-target-con-set.h b/tcg/riscv/tcg-target-con-set.h |
10 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
11 | --- a/target/microblaze/translate.c | 13 | --- a/tcg/riscv/tcg-target-con-set.h |
12 | +++ b/target/microblaze/translate.c | 14 | +++ b/tcg/riscv/tcg-target-con-set.h |
13 | @@ -XXX,XX +XXX,XX @@ static void t_sync_flags(DisasContext *dc) | 15 | @@ -XXX,XX +XXX,XX @@ |
14 | 16 | * tcg-target-con-str.h; the constraint combination is inclusive or. | |
15 | static void gen_raise_exception(DisasContext *dc, uint32_t index) | 17 | */ |
16 | { | 18 | C_O0_I1(r) |
17 | - TCGv_i32 tmp = tcg_const_i32(index); | 19 | -C_O0_I2(rZ, r) |
18 | - | 20 | -C_O0_I2(rZ, rZ) |
19 | - gen_helper_raise_exception(cpu_env, tmp); | 21 | +C_O0_I2(rz, r) |
20 | + gen_helper_raise_exception(cpu_env, tcg_constant_i32(index)); | 22 | +C_O0_I2(rz, rz) |
21 | dc->base.is_jmp = DISAS_NORETURN; | 23 | C_O1_I1(r, r) |
24 | C_O1_I2(r, r, ri) | ||
25 | C_O1_I2(r, r, rI) | ||
26 | C_O1_I2(r, r, rJ) | ||
27 | -C_O1_I2(r, rZ, rN) | ||
28 | -C_O1_I2(r, rZ, rZ) | ||
29 | +C_O1_I2(r, rz, rN) | ||
30 | +C_O1_I2(r, rz, rz) | ||
31 | C_N1_I2(r, r, rM) | ||
32 | C_O1_I4(r, r, rI, rM, rM) | ||
33 | -C_O2_I4(r, r, rZ, rZ, rM, rM) | ||
34 | +C_O2_I4(r, r, rz, rz, rM, rM) | ||
35 | C_O0_I2(v, r) | ||
36 | C_O1_I1(v, r) | ||
37 | C_O1_I1(v, v) | ||
38 | diff --git a/tcg/riscv/tcg-target-con-str.h b/tcg/riscv/tcg-target-con-str.h | ||
39 | index XXXXXXX..XXXXXXX 100644 | ||
40 | --- a/tcg/riscv/tcg-target-con-str.h | ||
41 | +++ b/tcg/riscv/tcg-target-con-str.h | ||
42 | @@ -XXX,XX +XXX,XX @@ CONST('K', TCG_CT_CONST_S5) | ||
43 | CONST('L', TCG_CT_CONST_CMP_VI) | ||
44 | CONST('N', TCG_CT_CONST_N12) | ||
45 | CONST('M', TCG_CT_CONST_M12) | ||
46 | -CONST('Z', TCG_CT_CONST_ZERO) | ||
47 | diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc | ||
48 | index XXXXXXX..XXXXXXX 100644 | ||
49 | --- a/tcg/riscv/tcg-target.c.inc | ||
50 | +++ b/tcg/riscv/tcg-target.c.inc | ||
51 | @@ -XXX,XX +XXX,XX @@ static TCGReg tcg_target_call_oarg_reg(TCGCallReturnKind kind, int slot) | ||
52 | return TCG_REG_A0 + slot; | ||
22 | } | 53 | } |
23 | 54 | ||
24 | @@ -XXX,XX +XXX,XX @@ static void gen_raise_exception_sync(DisasContext *dc, uint32_t index) | 55 | -#define TCG_CT_CONST_ZERO 0x100 |
25 | 56 | -#define TCG_CT_CONST_S12 0x200 | |
26 | static void gen_raise_hw_excp(DisasContext *dc, uint32_t esr_ec) | 57 | -#define TCG_CT_CONST_N12 0x400 |
27 | { | 58 | -#define TCG_CT_CONST_M12 0x800 |
28 | - TCGv_i32 tmp = tcg_const_i32(esr_ec); | 59 | -#define TCG_CT_CONST_J12 0x1000 |
29 | + TCGv_i32 tmp = tcg_constant_i32(esr_ec); | 60 | -#define TCG_CT_CONST_S5 0x2000 |
30 | tcg_gen_st_i32(tmp, cpu_env, offsetof(CPUMBState, esr)); | 61 | -#define TCG_CT_CONST_CMP_VI 0x4000 |
31 | 62 | +#define TCG_CT_CONST_S12 0x100 | |
32 | gen_raise_exception_sync(dc, EXCP_HW_EXCP); | 63 | +#define TCG_CT_CONST_N12 0x200 |
33 | @@ -XXX,XX +XXX,XX @@ static bool do_typeb_val(DisasContext *dc, arg_typeb *arg, bool side_effects, | 64 | +#define TCG_CT_CONST_M12 0x400 |
34 | 65 | +#define TCG_CT_CONST_J12 0x800 | |
35 | rd = reg_for_write(dc, arg->rd); | 66 | +#define TCG_CT_CONST_S5 0x1000 |
36 | ra = reg_for_read(dc, arg->ra); | 67 | +#define TCG_CT_CONST_CMP_VI 0x2000 |
37 | - imm = tcg_const_i32(arg->imm); | 68 | |
38 | + imm = tcg_constant_i32(arg->imm); | 69 | #define ALL_GENERAL_REGS MAKE_64BIT_MASK(0, 32) |
39 | 70 | #define ALL_VECTOR_REGS MAKE_64BIT_MASK(32, 32) | |
40 | fn(rd, ra, imm); | 71 | @@ -XXX,XX +XXX,XX @@ static bool tcg_target_const_match(int64_t val, int ct, |
41 | return true; | 72 | if (ct & TCG_CT_CONST) { |
42 | @@ -XXX,XX +XXX,XX @@ static bool do_typeb_val(DisasContext *dc, arg_typeb *arg, bool side_effects, | 73 | return 1; |
43 | /* No input carry, but output carry. */ | ||
44 | static void gen_add(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
45 | { | ||
46 | - TCGv_i32 zero = tcg_const_i32(0); | ||
47 | + TCGv_i32 zero = tcg_constant_i32(0); | ||
48 | |||
49 | tcg_gen_add2_i32(out, cpu_msr_c, ina, zero, inb, zero); | ||
50 | } | ||
51 | @@ -XXX,XX +XXX,XX @@ static void gen_add(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
52 | /* Input and output carry. */ | ||
53 | static void gen_addc(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
54 | { | ||
55 | - TCGv_i32 zero = tcg_const_i32(0); | ||
56 | + TCGv_i32 zero = tcg_constant_i32(0); | ||
57 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
58 | |||
59 | tcg_gen_add2_i32(tmp, cpu_msr_c, ina, zero, cpu_msr_c, zero); | ||
60 | @@ -XXX,XX +XXX,XX @@ static void gen_rsub(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
61 | /* Input and output carry. */ | ||
62 | static void gen_rsubc(TCGv_i32 out, TCGv_i32 ina, TCGv_i32 inb) | ||
63 | { | ||
64 | - TCGv_i32 zero = tcg_const_i32(0); | ||
65 | + TCGv_i32 zero = tcg_constant_i32(0); | ||
66 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
67 | |||
68 | tcg_gen_not_i32(tmp, ina); | ||
69 | @@ -XXX,XX +XXX,XX @@ static bool do_bcc(DisasContext *dc, int dest_rb, int dest_imm, | ||
70 | } | 74 | } |
71 | 75 | - if ((ct & TCG_CT_CONST_ZERO) && val == 0) { | |
72 | /* Compute the final destination into btarget. */ | 76 | - return 1; |
73 | - zero = tcg_const_i32(0); | 77 | - } |
74 | - next = tcg_const_i32(dc->base.pc_next + (delay + 1) * 4); | 78 | if (type >= TCG_TYPE_V64) { |
75 | + zero = tcg_constant_i32(0); | 79 | /* Val is replicated by VECE; extract the highest element. */ |
76 | + next = tcg_constant_i32(dc->base.pc_next + (delay + 1) * 4); | 80 | val >>= (-8 << vece) & 63; |
77 | tcg_gen_movcond_i32(dc->jmp_cond, cpu_btarget, | 81 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) |
78 | reg_for_read(dc, ra), zero, | 82 | case INDEX_op_st16_i64: |
79 | cpu_btarget, next); | 83 | case INDEX_op_st32_i64: |
80 | @@ -XXX,XX +XXX,XX @@ static bool trans_mbar(DisasContext *dc, arg_mbar *arg) | 84 | case INDEX_op_st_i64: |
81 | 85 | - return C_O0_I2(rZ, r); | |
82 | /* Sleep. */ | 86 | + return C_O0_I2(rz, r); |
83 | if (mbar_imm & 16) { | 87 | |
84 | - TCGv_i32 tmp_1; | 88 | case INDEX_op_add_i32: |
85 | - | 89 | case INDEX_op_and_i32: |
86 | if (trap_userspace(dc, true)) { | 90 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) |
87 | /* Sleep is a privileged instruction. */ | 91 | |
88 | return true; | 92 | case INDEX_op_sub_i32: |
89 | @@ -XXX,XX +XXX,XX @@ static bool trans_mbar(DisasContext *dc, arg_mbar *arg) | 93 | case INDEX_op_sub_i64: |
90 | 94 | - return C_O1_I2(r, rZ, rN); | |
91 | t_sync_flags(dc); | 95 | + return C_O1_I2(r, rz, rN); |
92 | 96 | ||
93 | - tmp_1 = tcg_const_i32(1); | 97 | case INDEX_op_mul_i32: |
94 | - tcg_gen_st_i32(tmp_1, cpu_env, | 98 | case INDEX_op_mulsh_i32: |
95 | + tcg_gen_st_i32(tcg_constant_i32(1), cpu_env, | 99 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) |
96 | -offsetof(MicroBlazeCPU, env) | 100 | case INDEX_op_divu_i64: |
97 | +offsetof(CPUState, halted)); | 101 | case INDEX_op_rem_i64: |
98 | 102 | case INDEX_op_remu_i64: | |
99 | @@ -XXX,XX +XXX,XX @@ static bool trans_mts(DisasContext *dc, arg_mts *arg) | 103 | - return C_O1_I2(r, rZ, rZ); |
100 | case 0x1004: /* TLBHI */ | 104 | + return C_O1_I2(r, rz, rz); |
101 | case 0x1005: /* TLBSX */ | 105 | |
102 | { | 106 | case INDEX_op_shl_i32: |
103 | - TCGv_i32 tmp_ext = tcg_const_i32(arg->e); | 107 | case INDEX_op_shr_i32: |
104 | - TCGv_i32 tmp_reg = tcg_const_i32(arg->rs & 7); | 108 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) |
105 | + TCGv_i32 tmp_ext = tcg_constant_i32(arg->e); | 109 | |
106 | + TCGv_i32 tmp_reg = tcg_constant_i32(arg->rs & 7); | 110 | case INDEX_op_brcond_i32: |
107 | 111 | case INDEX_op_brcond_i64: | |
108 | gen_helper_mmu_write(cpu_env, tmp_ext, tmp_reg, src); | 112 | - return C_O0_I2(rZ, rZ); |
109 | } | 113 | + return C_O0_I2(rz, rz); |
110 | @@ -XXX,XX +XXX,XX @@ static bool trans_mfs(DisasContext *dc, arg_mfs *arg) | 114 | |
111 | case 0x1004: /* TLBHI */ | 115 | case INDEX_op_movcond_i32: |
112 | case 0x1005: /* TLBSX */ | 116 | case INDEX_op_movcond_i64: |
113 | { | 117 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) |
114 | - TCGv_i32 tmp_ext = tcg_const_i32(arg->e); | 118 | case INDEX_op_add2_i64: |
115 | - TCGv_i32 tmp_reg = tcg_const_i32(arg->rs & 7); | 119 | case INDEX_op_sub2_i32: |
116 | + TCGv_i32 tmp_ext = tcg_constant_i32(arg->e); | 120 | case INDEX_op_sub2_i64: |
117 | + TCGv_i32 tmp_reg = tcg_constant_i32(arg->rs & 7); | 121 | - return C_O2_I4(r, r, rZ, rZ, rM, rM); |
118 | 122 | + return C_O2_I4(r, r, rz, rz, rM, rM); | |
119 | gen_helper_mmu_read(dest, cpu_env, tmp_ext, tmp_reg); | 123 | |
120 | } | 124 | case INDEX_op_qemu_ld_i32: |
121 | @@ -XXX,XX +XXX,XX @@ static bool do_get(DisasContext *dc, int rd, int rb, int imm, int ctrl) | 125 | case INDEX_op_qemu_ld_i64: |
122 | tcg_gen_movi_i32(t_id, imm); | 126 | return C_O1_I1(r, r); |
123 | } | 127 | case INDEX_op_qemu_st_i32: |
124 | 128 | case INDEX_op_qemu_st_i64: | |
125 | - t_ctrl = tcg_const_i32(ctrl); | 129 | - return C_O0_I2(rZ, r); |
126 | + t_ctrl = tcg_constant_i32(ctrl); | 130 | + return C_O0_I2(rz, r); |
127 | gen_helper_get(reg_for_write(dc, rd), t_id, t_ctrl); | 131 | |
128 | return true; | 132 | case INDEX_op_st_vec: |
129 | } | 133 | return C_O0_I2(v, r); |
130 | @@ -XXX,XX +XXX,XX @@ static bool do_put(DisasContext *dc, int ra, int rb, int imm, int ctrl) | ||
131 | tcg_gen_movi_i32(t_id, imm); | ||
132 | } | ||
133 | |||
134 | - t_ctrl = tcg_const_i32(ctrl); | ||
135 | + t_ctrl = tcg_constant_i32(ctrl); | ||
136 | gen_helper_put(t_id, t_ctrl, reg_for_read(dc, ra)); | ||
137 | return true; | ||
138 | } | ||
139 | -- | 134 | -- |
140 | 2.34.1 | 135 | 2.43.0 |
141 | 136 | ||
142 | 137 | diff view generated by jsdifflib |
1 | Use tcg_constant_i64. Adjust in2_mri2_* to allocate a new | 1 | Replace target-specific 'Z' with generic 'z'. |
---|---|---|---|
2 | temporary for the output, using gen_ri2 for the address. | ||
3 | 2 | ||
4 | Reviewed-by: Philippe Mathieu-Daudé <philmd@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 | target/s390x/tcg/translate.c | 23 ++++++++++++++--------- | 6 | tcg/sparc64/tcg-target-con-set.h | 12 ++++++------ |
8 | 1 file changed, 14 insertions(+), 9 deletions(-) | 7 | tcg/sparc64/tcg-target-con-str.h | 1 - |
8 | tcg/sparc64/tcg-target.c.inc | 17 +++++++---------- | ||
9 | 3 files changed, 13 insertions(+), 17 deletions(-) | ||
9 | 10 | ||
10 | diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c | 11 | diff --git a/tcg/sparc64/tcg-target-con-set.h b/tcg/sparc64/tcg-target-con-set.h |
11 | index XXXXXXX..XXXXXXX 100644 | 12 | index XXXXXXX..XXXXXXX 100644 |
12 | --- a/target/s390x/tcg/translate.c | 13 | --- a/tcg/sparc64/tcg-target-con-set.h |
13 | +++ b/target/s390x/tcg/translate.c | 14 | +++ b/tcg/sparc64/tcg-target-con-set.h |
14 | @@ -XXX,XX +XXX,XX @@ static void in2_a2(DisasContext *s, DisasOps *o) | 15 | @@ -XXX,XX +XXX,XX @@ |
15 | } | 16 | * tcg-target-con-str.h; the constraint combination is inclusive or. |
16 | #define SPEC_in2_a2 0 | 17 | */ |
17 | 18 | C_O0_I1(r) | |
18 | +static TCGv gen_ri2(DisasContext *s) | 19 | -C_O0_I2(rZ, r) |
19 | +{ | 20 | -C_O0_I2(rZ, rJ) |
20 | + return tcg_constant_i64(s->base.pc_next + (int64_t)get_field(s, i2) * 2); | 21 | +C_O0_I2(rz, r) |
21 | +} | 22 | +C_O0_I2(rz, rJ) |
22 | + | 23 | C_O1_I1(r, r) |
23 | static void in2_ri2(DisasContext *s, DisasOps *o) | 24 | C_O1_I2(r, r, r) |
24 | { | 25 | -C_O1_I2(r, rZ, rJ) |
25 | - o->in2 = tcg_const_i64(s->base.pc_next + (int64_t)get_field(s, i2) * 2); | 26 | -C_O1_I4(r, rZ, rJ, rI, 0) |
26 | + o->in2 = gen_ri2(s); | 27 | -C_O2_I2(r, r, rZ, rJ) |
27 | } | 28 | -C_O2_I4(r, r, rZ, rZ, rJ, rJ) |
28 | #define SPEC_in2_ri2 0 | 29 | +C_O1_I2(r, rz, rJ) |
29 | 30 | +C_O1_I4(r, rz, rJ, rI, 0) | |
30 | @@ -XXX,XX +XXX,XX @@ static void in2_m2_64a(DisasContext *s, DisasOps *o) | 31 | +C_O2_I2(r, r, rz, rJ) |
31 | 32 | +C_O2_I4(r, r, rz, rz, rJ, rJ) | |
32 | static void in2_mri2_16u(DisasContext *s, DisasOps *o) | 33 | diff --git a/tcg/sparc64/tcg-target-con-str.h b/tcg/sparc64/tcg-target-con-str.h |
33 | { | 34 | index XXXXXXX..XXXXXXX 100644 |
34 | - in2_ri2(s, o); | 35 | --- a/tcg/sparc64/tcg-target-con-str.h |
35 | - tcg_gen_qemu_ld16u(o->in2, o->in2, get_mem_index(s)); | 36 | +++ b/tcg/sparc64/tcg-target-con-str.h |
36 | + o->in2 = tcg_temp_new_i64(); | 37 | @@ -XXX,XX +XXX,XX @@ REGS('r', ALL_GENERAL_REGS) |
37 | + tcg_gen_qemu_ld16u(o->in2, gen_ri2(s), get_mem_index(s)); | 38 | */ |
38 | } | 39 | CONST('I', TCG_CT_CONST_S11) |
39 | #define SPEC_in2_mri2_16u 0 | 40 | CONST('J', TCG_CT_CONST_S13) |
40 | 41 | -CONST('Z', TCG_CT_CONST_ZERO) | |
41 | static void in2_mri2_32s(DisasContext *s, DisasOps *o) | 42 | diff --git a/tcg/sparc64/tcg-target.c.inc b/tcg/sparc64/tcg-target.c.inc |
42 | { | 43 | index XXXXXXX..XXXXXXX 100644 |
43 | - in2_ri2(s, o); | 44 | --- a/tcg/sparc64/tcg-target.c.inc |
44 | - tcg_gen_qemu_ld32s(o->in2, o->in2, get_mem_index(s)); | 45 | +++ b/tcg/sparc64/tcg-target.c.inc |
45 | + o->in2 = tcg_temp_new_i64(); | 46 | @@ -XXX,XX +XXX,XX @@ static const char * const tcg_target_reg_names[TCG_TARGET_NB_REGS] = { |
46 | + tcg_gen_qemu_ld32s(o->in2, gen_ri2(s), get_mem_index(s)); | 47 | |
47 | } | 48 | #define TCG_CT_CONST_S11 0x100 |
48 | #define SPEC_in2_mri2_32s 0 | 49 | #define TCG_CT_CONST_S13 0x200 |
49 | 50 | -#define TCG_CT_CONST_ZERO 0x400 | |
50 | static void in2_mri2_32u(DisasContext *s, DisasOps *o) | 51 | |
51 | { | 52 | #define ALL_GENERAL_REGS MAKE_64BIT_MASK(0, 32) |
52 | - in2_ri2(s, o); | 53 | |
53 | - tcg_gen_qemu_ld32u(o->in2, o->in2, get_mem_index(s)); | 54 | @@ -XXX,XX +XXX,XX @@ static bool tcg_target_const_match(int64_t val, int ct, |
54 | + o->in2 = tcg_temp_new_i64(); | 55 | val = (int32_t)val; |
55 | + tcg_gen_qemu_ld32u(o->in2, gen_ri2(s), get_mem_index(s)); | 56 | } |
56 | } | 57 | |
57 | #define SPEC_in2_mri2_32u 0 | 58 | - if ((ct & TCG_CT_CONST_ZERO) && val == 0) { |
58 | 59 | - return 1; | |
59 | static void in2_mri2_64(DisasContext *s, DisasOps *o) | 60 | - } else if ((ct & TCG_CT_CONST_S11) && check_fit_tl(val, 11)) { |
60 | { | 61 | + if ((ct & TCG_CT_CONST_S11) && check_fit_tl(val, 11)) { |
61 | - in2_ri2(s, o); | 62 | return 1; |
62 | - tcg_gen_qemu_ld64(o->in2, o->in2, get_mem_index(s)); | 63 | } else if ((ct & TCG_CT_CONST_S13) && check_fit_tl(val, 13)) { |
63 | + o->in2 = tcg_temp_new_i64(); | 64 | return 1; |
64 | + tcg_gen_qemu_ld64(o->in2, gen_ri2(s), get_mem_index(s)); | 65 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) |
65 | } | 66 | case INDEX_op_st_i64: |
66 | #define SPEC_in2_mri2_64 0 | 67 | case INDEX_op_qemu_st_i32: |
68 | case INDEX_op_qemu_st_i64: | ||
69 | - return C_O0_I2(rZ, r); | ||
70 | + return C_O0_I2(rz, r); | ||
71 | |||
72 | case INDEX_op_add_i32: | ||
73 | case INDEX_op_add_i64: | ||
74 | @@ -XXX,XX +XXX,XX @@ tcg_target_op_def(TCGOpcode op, TCGType type, unsigned flags) | ||
75 | case INDEX_op_setcond_i64: | ||
76 | case INDEX_op_negsetcond_i32: | ||
77 | case INDEX_op_negsetcond_i64: | ||
78 | - return C_O1_I2(r, rZ, rJ); | ||
79 | + return C_O1_I2(r, rz, rJ); | ||
80 | |||
81 | case INDEX_op_brcond_i32: | ||
82 | case INDEX_op_brcond_i64: | ||
83 | - return C_O0_I2(rZ, rJ); | ||
84 | + return C_O0_I2(rz, rJ); | ||
85 | case INDEX_op_movcond_i32: | ||
86 | case INDEX_op_movcond_i64: | ||
87 | - return C_O1_I4(r, rZ, rJ, rI, 0); | ||
88 | + return C_O1_I4(r, rz, rJ, rI, 0); | ||
89 | case INDEX_op_add2_i32: | ||
90 | case INDEX_op_add2_i64: | ||
91 | case INDEX_op_sub2_i32: | ||
92 | case INDEX_op_sub2_i64: | ||
93 | - return C_O2_I4(r, r, rZ, rZ, rJ, rJ); | ||
94 | + return C_O2_I4(r, r, rz, rz, rJ, rJ); | ||
95 | case INDEX_op_mulu2_i32: | ||
96 | case INDEX_op_muls2_i32: | ||
97 | - return C_O2_I2(r, r, rZ, rJ); | ||
98 | + return C_O2_I2(r, r, rz, rJ); | ||
99 | case INDEX_op_muluh_i64: | ||
100 | return C_O1_I2(r, r, r); | ||
67 | 101 | ||
68 | -- | 102 | -- |
69 | 2.34.1 | 103 | 2.43.0 |
70 | 104 | ||
71 | 105 | diff view generated by jsdifflib |
1 | Reviewed-by: Max Filippov <jcmvbkbc@gmail.com> | 1 | From: Fabiano Rosas <farosas@suse.de> |
---|---|---|---|
2 | |||
3 | When complying with the alignment requested in the ELF and unmapping | ||
4 | the excess reservation, having align_end not aligned to the guest page | ||
5 | causes the unmap to be rejected by the alignment check at | ||
6 | target_munmap and later brk adjustments hit an EEXIST. | ||
7 | |||
8 | Fix by aligning the start of region to be unmapped. | ||
9 | |||
10 | Fixes: c81d1fafa6 ("linux-user: Honor elf alignment when placing images") | ||
11 | Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1913 | ||
12 | Signed-off-by: Fabiano Rosas <farosas@suse.de> | ||
13 | [rth: Align load_end as well.] | ||
2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 14 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
15 | Message-ID: <20250213143558.10504-1-farosas@suse.de> | ||
3 | --- | 16 | --- |
4 | target/xtensa/translate.c | 4 ++-- | 17 | linux-user/elfload.c | 4 ++-- |
5 | 1 file changed, 2 insertions(+), 2 deletions(-) | 18 | 1 file changed, 2 insertions(+), 2 deletions(-) |
6 | 19 | ||
7 | diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c | 20 | diff --git a/linux-user/elfload.c b/linux-user/elfload.c |
8 | index XXXXXXX..XXXXXXX 100644 | 21 | index XXXXXXX..XXXXXXX 100644 |
9 | --- a/target/xtensa/translate.c | 22 | --- a/linux-user/elfload.c |
10 | +++ b/target/xtensa/translate.c | 23 | +++ b/linux-user/elfload.c |
11 | @@ -XXX,XX +XXX,XX @@ static void translate_sll(DisasContext *dc, const OpcodeArg arg[], | 24 | @@ -XXX,XX +XXX,XX @@ static void load_elf_image(const char *image_name, const ImageSource *src, |
12 | tcg_gen_shl_i32(arg[0].out, arg[1].in, dc->sar_m32); | 25 | |
13 | } else { | 26 | if (align_size != reserve_size) { |
14 | TCGv_i64 v = tcg_temp_new_i64(); | 27 | abi_ulong align_addr = ROUND_UP(load_addr, align); |
15 | - TCGv_i32 s = tcg_const_i32(32); | 28 | - abi_ulong align_end = align_addr + reserve_size; |
16 | - tcg_gen_sub_i32(s, s, cpu_SR[SAR]); | 29 | - abi_ulong load_end = load_addr + align_size; |
17 | + TCGv_i32 s = tcg_temp_new(); | 30 | + abi_ulong align_end = TARGET_PAGE_ALIGN(align_addr + reserve_size); |
18 | + tcg_gen_subfi_i32(s, 32, cpu_SR[SAR]); | 31 | + abi_ulong load_end = TARGET_PAGE_ALIGN(load_addr + align_size); |
19 | tcg_gen_andi_i32(s, s, 0x3f); | 32 | |
20 | tcg_gen_extu_i32_i64(v, arg[1].in); | 33 | if (align_addr != load_addr) { |
21 | gen_shift_reg(shl, s); | 34 | target_munmap(load_addr, align_addr - load_addr); |
22 | -- | 35 | -- |
23 | 2.34.1 | 36 | 2.43.0 | diff view generated by jsdifflib |
1 | This file, and a couple of uses, got left behind when the | 1 | From: Andreas Schwab <schwab@suse.de> |
---|---|---|---|
2 | tcg stuff was removed from tracetool. | ||
3 | 2 | ||
4 | Fixes: 126d4123c50a ("tracing: excise the tcg related from tracetool") | 3 | SA_RESTORER and the associated sa_restorer field of struct sigaction are |
5 | Reviewed-by: Alex Bennée <alex.bennee@linaro.org> | 4 | an obsolete feature, not expected to be used by future architectures. |
5 | They are also absent on RISC-V, LoongArch, Hexagon and OpenRISC, but | ||
6 | defined due to their use of generic/signal.h. This leads to corrupted | ||
7 | data and out-of-bounds accesses. | ||
8 | |||
9 | Move the definition of TARGET_SA_RESTORER out of generic/signal.h into the | ||
10 | target_signal.h files that need it. Note that m68k has the sa_restorer | ||
11 | field, but does not use it and does not define SA_RESTORER. | ||
12 | |||
13 | Reported-by: Thomas Weißschuh <thomas@t-8ch.de> | ||
14 | Signed-off-by: Andreas Schwab <schwab@suse.de> | ||
15 | Reviewed-by: Thomas Weißschuh <thomas@t-8ch.de> | ||
16 | Reviewed-by: Richard Henderson <richard.henderson@linaro.org> | ||
6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 17 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
18 | Message-ID: <mvmed060xc9.fsf@suse.de> | ||
7 | --- | 19 | --- |
8 | meson.build | 1 - | 20 | linux-user/aarch64/target_signal.h | 2 ++ |
9 | scripts/tracetool/__init__.py | 23 ----- | 21 | linux-user/arm/target_signal.h | 2 ++ |
10 | scripts/tracetool/transform.py | 168 --------------------------------- | 22 | linux-user/generic/signal.h | 1 - |
11 | 3 files changed, 192 deletions(-) | 23 | linux-user/i386/target_signal.h | 2 ++ |
12 | delete mode 100644 scripts/tracetool/transform.py | 24 | linux-user/m68k/target_signal.h | 1 + |
25 | linux-user/microblaze/target_signal.h | 2 ++ | ||
26 | linux-user/ppc/target_signal.h | 2 ++ | ||
27 | linux-user/s390x/target_signal.h | 2 ++ | ||
28 | linux-user/sh4/target_signal.h | 2 ++ | ||
29 | linux-user/x86_64/target_signal.h | 2 ++ | ||
30 | linux-user/xtensa/target_signal.h | 2 ++ | ||
31 | 11 files changed, 19 insertions(+), 1 deletion(-) | ||
13 | 32 | ||
14 | diff --git a/meson.build b/meson.build | 33 | diff --git a/linux-user/aarch64/target_signal.h b/linux-user/aarch64/target_signal.h |
15 | index XXXXXXX..XXXXXXX 100644 | 34 | index XXXXXXX..XXXXXXX 100644 |
16 | --- a/meson.build | 35 | --- a/linux-user/aarch64/target_signal.h |
17 | +++ b/meson.build | 36 | +++ b/linux-user/aarch64/target_signal.h |
18 | @@ -XXX,XX +XXX,XX @@ tracetool_depends = files( | 37 | @@ -XXX,XX +XXX,XX @@ |
19 | 'scripts/tracetool/format/log_stap.py', | 38 | |
20 | 'scripts/tracetool/format/stap.py', | 39 | #include "../generic/signal.h" |
21 | 'scripts/tracetool/__init__.py', | 40 | |
22 | - 'scripts/tracetool/transform.py', | 41 | +#define TARGET_SA_RESTORER 0x04000000 |
23 | 'scripts/tracetool/vcpu.py' | 42 | + |
24 | ) | 43 | #define TARGET_SEGV_MTEAERR 8 /* Asynchronous ARM MTE error */ |
25 | 44 | #define TARGET_SEGV_MTESERR 9 /* Synchronous ARM MTE exception */ | |
26 | diff --git a/scripts/tracetool/__init__.py b/scripts/tracetool/__init__.py | 45 | |
46 | diff --git a/linux-user/arm/target_signal.h b/linux-user/arm/target_signal.h | ||
27 | index XXXXXXX..XXXXXXX 100644 | 47 | index XXXXXXX..XXXXXXX 100644 |
28 | --- a/scripts/tracetool/__init__.py | 48 | --- a/linux-user/arm/target_signal.h |
29 | +++ b/scripts/tracetool/__init__.py | 49 | +++ b/linux-user/arm/target_signal.h |
30 | @@ -XXX,XX +XXX,XX @@ | 50 | @@ -XXX,XX +XXX,XX @@ |
31 | 51 | ||
32 | import tracetool.format | 52 | #include "../generic/signal.h" |
33 | import tracetool.backend | 53 | |
34 | -import tracetool.transform | 54 | +#define TARGET_SA_RESTORER 0x04000000 |
35 | 55 | + | |
36 | 56 | #define TARGET_ARCH_HAS_SETUP_FRAME | |
37 | def error_write(*lines): | 57 | #define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1 |
38 | @@ -XXX,XX +XXX,XX @@ def casted(self): | 58 | |
39 | """List of argument names casted to their type.""" | 59 | diff --git a/linux-user/generic/signal.h b/linux-user/generic/signal.h |
40 | return ["(%s)%s" % (type_, name) for type_, name in self._args] | 60 | index XXXXXXX..XXXXXXX 100644 |
41 | 61 | --- a/linux-user/generic/signal.h | |
42 | - def transform(self, *trans): | 62 | +++ b/linux-user/generic/signal.h |
43 | - """Return a new Arguments instance with transformed types. | ||
44 | - | ||
45 | - The types in the resulting Arguments instance are transformed according | ||
46 | - to tracetool.transform.transform_type. | ||
47 | - """ | ||
48 | - res = [] | ||
49 | - for type_, name in self._args: | ||
50 | - res.append((tracetool.transform.transform_type(type_, *trans), | ||
51 | - name)) | ||
52 | - return Arguments(res) | ||
53 | - | ||
54 | |||
55 | class Event(object): | ||
56 | """Event description. | ||
57 | @@ -XXX,XX +XXX,XX @@ def api(self, fmt=None): | ||
58 | fmt = Event.QEMU_TRACE | ||
59 | return fmt % {"name": self.name, "NAME": self.name.upper()} | ||
60 | |||
61 | - def transform(self, *trans): | ||
62 | - """Return a new Event with transformed Arguments.""" | ||
63 | - return Event(self.name, | ||
64 | - list(self.properties), | ||
65 | - self.fmt, | ||
66 | - self.args.transform(*trans), | ||
67 | - self.lineno, | ||
68 | - self.filename, | ||
69 | - self) | ||
70 | - | ||
71 | |||
72 | def read_events(fobj, fname): | ||
73 | """Generate the output for the given (format, backends) pair. | ||
74 | diff --git a/scripts/tracetool/transform.py b/scripts/tracetool/transform.py | ||
75 | deleted file mode 100644 | ||
76 | index XXXXXXX..XXXXXXX | ||
77 | --- a/scripts/tracetool/transform.py | ||
78 | +++ /dev/null | ||
79 | @@ -XXX,XX +XXX,XX @@ | 63 | @@ -XXX,XX +XXX,XX @@ |
80 | -# -*- coding: utf-8 -*- | 64 | #define TARGET_SA_RESTART 0x10000000 |
81 | - | 65 | #define TARGET_SA_NODEFER 0x40000000 |
82 | -""" | 66 | #define TARGET_SA_RESETHAND 0x80000000 |
83 | -Type-transformation rules. | 67 | -#define TARGET_SA_RESTORER 0x04000000 |
84 | -""" | 68 | |
85 | - | 69 | #define TARGET_SIGHUP 1 |
86 | -__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" | 70 | #define TARGET_SIGINT 2 |
87 | -__copyright__ = "Copyright 2012-2016, Lluís Vilanova <vilanova@ac.upc.edu>" | 71 | diff --git a/linux-user/i386/target_signal.h b/linux-user/i386/target_signal.h |
88 | -__license__ = "GPL version 2 or (at your option) any later version" | 72 | index XXXXXXX..XXXXXXX 100644 |
89 | - | 73 | --- a/linux-user/i386/target_signal.h |
90 | -__maintainer__ = "Stefan Hajnoczi" | 74 | +++ b/linux-user/i386/target_signal.h |
91 | -__email__ = "stefanha@redhat.com" | 75 | @@ -XXX,XX +XXX,XX @@ |
92 | - | 76 | |
93 | - | 77 | #include "../generic/signal.h" |
94 | -def _transform_type(type_, trans): | 78 | |
95 | - if isinstance(trans, str): | 79 | +#define TARGET_SA_RESTORER 0x04000000 |
96 | - return trans | 80 | + |
97 | - elif isinstance(trans, dict): | 81 | #define TARGET_ARCH_HAS_SETUP_FRAME |
98 | - if type_ in trans: | 82 | #define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1 |
99 | - return _transform_type(type_, trans[type_]) | 83 | |
100 | - elif None in trans: | 84 | diff --git a/linux-user/m68k/target_signal.h b/linux-user/m68k/target_signal.h |
101 | - return _transform_type(type_, trans[None]) | 85 | index XXXXXXX..XXXXXXX 100644 |
102 | - else: | 86 | --- a/linux-user/m68k/target_signal.h |
103 | - return type_ | 87 | +++ b/linux-user/m68k/target_signal.h |
104 | - elif callable(trans): | 88 | @@ -XXX,XX +XXX,XX @@ |
105 | - return trans(type_) | 89 | |
106 | - else: | 90 | #include "../generic/signal.h" |
107 | - raise ValueError("Invalid type transformation rule: %s" % trans) | 91 | |
108 | - | 92 | +#define TARGET_ARCH_HAS_SA_RESTORER 1 |
109 | - | 93 | #define TARGET_ARCH_HAS_SETUP_FRAME |
110 | -def transform_type(type_, *trans): | 94 | #define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1 |
111 | - """Return a new type transformed according to the given rules. | 95 | |
112 | - | 96 | diff --git a/linux-user/microblaze/target_signal.h b/linux-user/microblaze/target_signal.h |
113 | - Applies each of the transformation rules in trans in order. | 97 | index XXXXXXX..XXXXXXX 100644 |
114 | - | 98 | --- a/linux-user/microblaze/target_signal.h |
115 | - If an element of trans is a string, return it. | 99 | +++ b/linux-user/microblaze/target_signal.h |
116 | - | 100 | @@ -XXX,XX +XXX,XX @@ |
117 | - If an element of trans is a function, call it with type_ as its only | 101 | |
118 | - argument. | 102 | #include "../generic/signal.h" |
119 | - | 103 | |
120 | - If an element of trans is a dict, search type_ in its keys. If type_ is | 104 | +#define TARGET_SA_RESTORER 0x04000000 |
121 | - a key, use the value as a transformation rule for type_. Otherwise, if | 105 | + |
122 | - None is a key use the value as a transformation rule for type_. | 106 | #define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1 |
123 | - | 107 | |
124 | - Otherwise, return type_. | 108 | #endif /* MICROBLAZE_TARGET_SIGNAL_H */ |
125 | - | 109 | diff --git a/linux-user/ppc/target_signal.h b/linux-user/ppc/target_signal.h |
126 | - Parameters | 110 | index XXXXXXX..XXXXXXX 100644 |
127 | - ---------- | 111 | --- a/linux-user/ppc/target_signal.h |
128 | - type_ : str | 112 | +++ b/linux-user/ppc/target_signal.h |
129 | - Type to transform. | 113 | @@ -XXX,XX +XXX,XX @@ |
130 | - trans : list of function or dict | 114 | |
131 | - Type transformation rules. | 115 | #include "../generic/signal.h" |
132 | - """ | 116 | |
133 | - if len(trans) == 0: | 117 | +#define TARGET_SA_RESTORER 0x04000000 |
134 | - raise ValueError | 118 | + |
135 | - res = type_ | 119 | #if !defined(TARGET_PPC64) |
136 | - for t in trans: | 120 | #define TARGET_ARCH_HAS_SETUP_FRAME |
137 | - res = _transform_type(res, t) | 121 | #endif |
138 | - return res | 122 | diff --git a/linux-user/s390x/target_signal.h b/linux-user/s390x/target_signal.h |
139 | - | 123 | index XXXXXXX..XXXXXXX 100644 |
140 | - | 124 | --- a/linux-user/s390x/target_signal.h |
141 | -################################################## | 125 | +++ b/linux-user/s390x/target_signal.h |
142 | -# tcg -> host | 126 | @@ -XXX,XX +XXX,XX @@ |
143 | - | 127 | |
144 | -def _tcg_2_host(type_): | 128 | #include "../generic/signal.h" |
145 | - if type_ == "TCGv": | 129 | |
146 | - # force a fixed-size type (target-independent) | 130 | +#define TARGET_SA_RESTORER 0x04000000 |
147 | - return "uint64_t" | 131 | + |
148 | - else: | 132 | #define TARGET_ARCH_HAS_SETUP_FRAME |
149 | - return type_ | 133 | #define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1 |
150 | - | 134 | |
151 | -TCG_2_HOST = { | 135 | diff --git a/linux-user/sh4/target_signal.h b/linux-user/sh4/target_signal.h |
152 | - "TCGv_i32": "uint32_t", | 136 | index XXXXXXX..XXXXXXX 100644 |
153 | - "TCGv_i64": "uint64_t", | 137 | --- a/linux-user/sh4/target_signal.h |
154 | - "TCGv_ptr": "void *", | 138 | +++ b/linux-user/sh4/target_signal.h |
155 | - None: _tcg_2_host, | 139 | @@ -XXX,XX +XXX,XX @@ |
156 | - } | 140 | |
157 | - | 141 | #include "../generic/signal.h" |
158 | - | 142 | |
159 | -################################################## | 143 | +#define TARGET_SA_RESTORER 0x04000000 |
160 | -# host -> host compatible with tcg sizes | 144 | + |
161 | - | 145 | #define TARGET_ARCH_HAS_SETUP_FRAME |
162 | -HOST_2_TCG_COMPAT = { | 146 | #define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1 |
163 | - "uint8_t": "uint32_t", | 147 | |
164 | - "uint16_t": "uint32_t", | 148 | diff --git a/linux-user/x86_64/target_signal.h b/linux-user/x86_64/target_signal.h |
165 | - } | 149 | index XXXXXXX..XXXXXXX 100644 |
166 | - | 150 | --- a/linux-user/x86_64/target_signal.h |
167 | - | 151 | +++ b/linux-user/x86_64/target_signal.h |
168 | -################################################## | 152 | @@ -XXX,XX +XXX,XX @@ |
169 | -# host/tcg -> tcg | 153 | |
170 | - | 154 | #include "../generic/signal.h" |
171 | -def _host_2_tcg(type_): | 155 | |
172 | - if type_.startswith("TCGv"): | 156 | +#define TARGET_SA_RESTORER 0x04000000 |
173 | - return type_ | 157 | + |
174 | - raise ValueError("Don't know how to translate '%s' into a TCG type\n" % type_) | 158 | /* For x86_64, use of SA_RESTORER is mandatory. */ |
175 | - | 159 | #define TARGET_ARCH_HAS_SIGTRAMP_PAGE 0 |
176 | -HOST_2_TCG = { | 160 | |
177 | - "uint32_t": "TCGv_i32", | 161 | diff --git a/linux-user/xtensa/target_signal.h b/linux-user/xtensa/target_signal.h |
178 | - "uint64_t": "TCGv_i64", | 162 | index XXXXXXX..XXXXXXX 100644 |
179 | - "void *" : "TCGv_ptr", | 163 | --- a/linux-user/xtensa/target_signal.h |
180 | - "CPUArchState *": "TCGv_env", | 164 | +++ b/linux-user/xtensa/target_signal.h |
181 | - None: _host_2_tcg, | 165 | @@ -XXX,XX +XXX,XX @@ |
182 | - } | 166 | |
183 | - | 167 | #include "../generic/signal.h" |
184 | - | 168 | |
185 | -################################################## | 169 | +#define TARGET_SA_RESTORER 0x04000000 |
186 | -# tcg -> tcg helper definition | 170 | + |
187 | - | 171 | #define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1 |
188 | -def _tcg_2_helper_def(type_): | 172 | |
189 | - if type_ == "TCGv": | 173 | #endif |
190 | - return "target_ulong" | ||
191 | - else: | ||
192 | - return type_ | ||
193 | - | ||
194 | -TCG_2_TCG_HELPER_DEF = { | ||
195 | - "TCGv_i32": "uint32_t", | ||
196 | - "TCGv_i64": "uint64_t", | ||
197 | - "TCGv_ptr": "void *", | ||
198 | - None: _tcg_2_helper_def, | ||
199 | - } | ||
200 | - | ||
201 | - | ||
202 | -################################################## | ||
203 | -# tcg -> tcg helper declaration | ||
204 | - | ||
205 | -def _tcg_2_tcg_helper_decl_error(type_): | ||
206 | - raise ValueError("Don't know how to translate type '%s' into a TCG helper declaration type\n" % type_) | ||
207 | - | ||
208 | -TCG_2_TCG_HELPER_DECL = { | ||
209 | - "TCGv" : "tl", | ||
210 | - "TCGv_ptr": "ptr", | ||
211 | - "TCGv_i32": "i32", | ||
212 | - "TCGv_i64": "i64", | ||
213 | - "TCGv_env": "env", | ||
214 | - None: _tcg_2_tcg_helper_decl_error, | ||
215 | - } | ||
216 | - | ||
217 | - | ||
218 | -################################################## | ||
219 | -# host/tcg -> tcg temporal constant allocation | ||
220 | - | ||
221 | -def _host_2_tcg_tmp_new(type_): | ||
222 | - if type_.startswith("TCGv"): | ||
223 | - return "tcg_temp_new_nop" | ||
224 | - raise ValueError("Don't know how to translate type '%s' into a TCG temporal allocation" % type_) | ||
225 | - | ||
226 | -HOST_2_TCG_TMP_NEW = { | ||
227 | - "uint32_t": "tcg_const_i32", | ||
228 | - "uint64_t": "tcg_const_i64", | ||
229 | - "void *" : "tcg_const_ptr", | ||
230 | - None: _host_2_tcg_tmp_new, | ||
231 | - } | ||
232 | - | ||
233 | - | ||
234 | -################################################## | ||
235 | -# host/tcg -> tcg temporal constant deallocation | ||
236 | - | ||
237 | -def _host_2_tcg_tmp_free(type_): | ||
238 | - if type_.startswith("TCGv"): | ||
239 | - return "tcg_temp_free_nop" | ||
240 | - raise ValueError("Don't know how to translate type '%s' into a TCG temporal deallocation" % type_) | ||
241 | - | ||
242 | -HOST_2_TCG_TMP_FREE = { | ||
243 | - "uint32_t": "tcg_temp_free_i32", | ||
244 | - "uint64_t": "tcg_temp_free_i64", | ||
245 | - "void *" : "tcg_temp_free_ptr", | ||
246 | - None: _host_2_tcg_tmp_free, | ||
247 | - } | ||
248 | -- | 174 | -- |
249 | 2.34.1 | 175 | 2.43.0 |
250 | 176 | ||
251 | 177 | diff view generated by jsdifflib |
1 | All remaining uses are strictly read-only. | 1 | From: Mikael Szreder <git@miszr.win> |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Max Filippov <jcmvbkbc@gmail.com> | 3 | A bug was introduced in commit 0bba7572d40d which causes the fdtox |
4 | and fqtox instructions to incorrectly select the destination registers. | ||
5 | More information and a test program can be found in issue #2802. | ||
6 | |||
7 | Fixes: 0bba7572d40d ("target/sparc: Perform DFPREG/QFPREG in decodetree") | ||
8 | Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2802 | ||
9 | Signed-off-by: Mikael Szreder <git@miszr.win> | ||
10 | Acked-by: Artyom Tarasenko <atar4qemu@gmail.com> | ||
11 | [rth: Squash patches together, since the second fixes a typo in the first.] | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 12 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
13 | Message-ID: <20250205090333.19626-3-git@miszr.win> | ||
5 | --- | 14 | --- |
6 | target/xtensa/translate.c | 6 +++--- | 15 | target/sparc/insns.decode | 12 ++++++------ |
7 | 1 file changed, 3 insertions(+), 3 deletions(-) | 16 | 1 file changed, 6 insertions(+), 6 deletions(-) |
8 | 17 | ||
9 | diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c | 18 | diff --git a/target/sparc/insns.decode b/target/sparc/insns.decode |
10 | index XXXXXXX..XXXXXXX 100644 | 19 | index XXXXXXX..XXXXXXX 100644 |
11 | --- a/target/xtensa/translate.c | 20 | --- a/target/sparc/insns.decode |
12 | +++ b/target/xtensa/translate.c | 21 | +++ b/target/sparc/insns.decode |
13 | @@ -XXX,XX +XXX,XX @@ static void translate_all(DisasContext *dc, const OpcodeArg arg[], | 22 | @@ -XXX,XX +XXX,XX @@ FdMULq 10 ..... 110100 ..... 0 0110 1110 ..... @q_d_d |
14 | const uint32_t par[]) | 23 | FNHADDs 10 ..... 110100 ..... 0 0111 0001 ..... @r_r_r |
15 | { | 24 | FNHADDd 10 ..... 110100 ..... 0 0111 0010 ..... @d_d_d |
16 | uint32_t shift = par[1]; | 25 | FNsMULd 10 ..... 110100 ..... 0 0111 1001 ..... @d_r_r |
17 | - TCGv_i32 mask = tcg_const_i32(((1 << shift) - 1) << arg[1].imm); | 26 | -FsTOx 10 ..... 110100 00000 0 1000 0001 ..... @r_r2 |
18 | + TCGv_i32 mask = tcg_constant_i32(((1 << shift) - 1) << arg[1].imm); | 27 | -FdTOx 10 ..... 110100 00000 0 1000 0010 ..... @r_d2 |
19 | TCGv_i32 tmp = tcg_temp_new_i32(); | 28 | -FqTOx 10 ..... 110100 00000 0 1000 0011 ..... @r_q2 |
20 | 29 | -FxTOs 10 ..... 110100 00000 0 1000 0100 ..... @r_r2 | |
21 | tcg_gen_and_i32(tmp, arg[1].in, mask); | 30 | -FxTOd 10 ..... 110100 00000 0 1000 1000 ..... @d_r2 |
22 | @@ -XXX,XX +XXX,XX @@ static void translate_call0(DisasContext *dc, const OpcodeArg arg[], | 31 | -FxTOq 10 ..... 110100 00000 0 1000 1100 ..... @q_r2 |
23 | static void translate_callw(DisasContext *dc, const OpcodeArg arg[], | 32 | +FsTOx 10 ..... 110100 00000 0 1000 0001 ..... @d_r2 |
24 | const uint32_t par[]) | 33 | +FdTOx 10 ..... 110100 00000 0 1000 0010 ..... @d_d2 |
25 | { | 34 | +FqTOx 10 ..... 110100 00000 0 1000 0011 ..... @d_q2 |
26 | - TCGv_i32 tmp = tcg_const_i32(arg[0].imm); | 35 | +FxTOs 10 ..... 110100 00000 0 1000 0100 ..... @r_d2 |
27 | + TCGv_i32 tmp = tcg_constant_i32(arg[0].imm); | 36 | +FxTOd 10 ..... 110100 00000 0 1000 1000 ..... @d_d2 |
28 | gen_callw_slot(dc, par[0], tmp, adjust_jump_slot(dc, arg[0].imm, 0)); | 37 | +FxTOq 10 ..... 110100 00000 0 1000 1100 ..... @q_d2 |
29 | } | 38 | FiTOs 10 ..... 110100 00000 0 1100 0100 ..... @r_r2 |
30 | 39 | FdTOs 10 ..... 110100 00000 0 1100 0110 ..... @r_d2 | |
31 | @@ -XXX,XX +XXX,XX @@ static void translate_clrex(DisasContext *dc, const OpcodeArg arg[], | 40 | FqTOs 10 ..... 110100 00000 0 1100 0111 ..... @r_q2 |
32 | static void translate_const16(DisasContext *dc, const OpcodeArg arg[], | ||
33 | const uint32_t par[]) | ||
34 | { | ||
35 | - TCGv_i32 c = tcg_const_i32(arg[1].imm); | ||
36 | + TCGv_i32 c = tcg_constant_i32(arg[1].imm); | ||
37 | |||
38 | tcg_gen_deposit_i32(arg[0].out, c, arg[0].in, 16, 16); | ||
39 | } | ||
40 | -- | 41 | -- |
41 | 2.34.1 | 42 | 2.43.0 | diff view generated by jsdifflib |
1 | Translators are no longer required to free tcg temporaries. | 1 | From: Mikael Szreder <git@miszr.win> |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | 3 | The gdbstub implementation for the Sparc architecture would |
4 | incorrectly calculate the the floating point register offset. | ||
5 | This resulted in, for example, registers f32 and f34 to point to | ||
6 | the same value. | ||
7 | |||
8 | The issue was caused by the confusion between even register numbers | ||
9 | and even register indexes. For example, the register index of f32 is 64 | ||
10 | and f34 is 65. | ||
11 | |||
12 | Fixes: 30038fd81808 ("target-sparc: Change fpr representation to doubles.") | ||
13 | Signed-off-by: Mikael Szreder <git@miszr.win> | ||
14 | Reviewed-by: Richard Henderson <richard.henderson@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 15 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
16 | Message-ID: <20250214070343.11501-1-git@miszr.win> | ||
5 | --- | 17 | --- |
6 | target/i386/tcg/translate.c | 41 -------------------------------- | 18 | target/sparc/gdbstub.c | 18 ++++++++++++++---- |
7 | target/i386/tcg/decode-new.c.inc | 15 ------------ | 19 | 1 file changed, 14 insertions(+), 4 deletions(-) |
8 | target/i386/tcg/emit.c.inc | 6 ----- | ||
9 | 3 files changed, 62 deletions(-) | ||
10 | 20 | ||
11 | diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c | 21 | diff --git a/target/sparc/gdbstub.c b/target/sparc/gdbstub.c |
12 | index XXXXXXX..XXXXXXX 100644 | 22 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/target/i386/tcg/translate.c | 23 | --- a/target/sparc/gdbstub.c |
14 | +++ b/target/i386/tcg/translate.c | 24 | +++ b/target/sparc/gdbstub.c |
15 | @@ -XXX,XX +XXX,XX @@ static void gen_compute_eflags(DisasContext *s) | 25 | @@ -XXX,XX +XXX,XX @@ int sparc_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n) |
16 | gen_update_cc_op(s); | ||
17 | gen_helper_cc_compute_all(cpu_cc_src, dst, src1, src2, cpu_cc_op); | ||
18 | set_cc_op(s, CC_OP_EFLAGS); | ||
19 | - | ||
20 | - if (dead) { | ||
21 | - tcg_temp_free(zero); | ||
22 | - } | ||
23 | } | ||
24 | |||
25 | typedef struct CCPrepare { | ||
26 | @@ -XXX,XX +XXX,XX @@ static void gen_shift_flags(DisasContext *s, MemOp ot, TCGv result, | ||
27 | } else { | ||
28 | tcg_gen_mov_tl(cpu_cc_src, shm1); | ||
29 | } | ||
30 | - tcg_temp_free(z_tl); | ||
31 | |||
32 | /* Get the two potential CC_OP values into temporaries. */ | ||
33 | tcg_gen_movi_i32(s->tmp2_i32, (is_right ? CC_OP_SARB : CC_OP_SHLB) + ot); | ||
34 | @@ -XXX,XX +XXX,XX @@ static void gen_shift_flags(DisasContext *s, MemOp ot, TCGv result, | ||
35 | s32 = tcg_temp_new_i32(); | ||
36 | tcg_gen_trunc_tl_i32(s32, count); | ||
37 | tcg_gen_movcond_i32(TCG_COND_NE, cpu_cc_op, s32, z32, s->tmp2_i32, oldop); | ||
38 | - tcg_temp_free_i32(z32); | ||
39 | - tcg_temp_free_i32(s32); | ||
40 | |||
41 | /* The CC_OP value is no longer predictable. */ | ||
42 | set_cc_op(s, CC_OP_DYNAMIC); | ||
43 | @@ -XXX,XX +XXX,XX @@ static void gen_rot_rm_T1(DisasContext *s, MemOp ot, int op1, int is_right) | ||
44 | tcg_gen_movi_i32(s->tmp3_i32, CC_OP_EFLAGS); | ||
45 | tcg_gen_movcond_i32(TCG_COND_NE, cpu_cc_op, t1, t0, | ||
46 | s->tmp2_i32, s->tmp3_i32); | ||
47 | - tcg_temp_free_i32(t0); | ||
48 | - tcg_temp_free_i32(t1); | ||
49 | |||
50 | /* The CC_OP value is no longer predictable. */ | ||
51 | set_cc_op(s, CC_OP_DYNAMIC); | ||
52 | @@ -XXX,XX +XXX,XX @@ static void gen_shiftd_rm_T1(DisasContext *s, MemOp ot, int op1, | ||
53 | gen_op_st_rm_T0_A0(s, ot, op1); | ||
54 | |||
55 | gen_shift_flags(s, ot, s->T0, s->tmp0, count, is_right); | ||
56 | - tcg_temp_free(count); | ||
57 | } | ||
58 | |||
59 | static void gen_shift(DisasContext *s1, int op, MemOp ot, int d, int s) | ||
60 | @@ -XXX,XX +XXX,XX @@ static void gen_cmovcc1(CPUX86State *env, DisasContext *s, MemOp ot, int b, | ||
61 | tcg_gen_movcond_tl(cc.cond, s->T0, cc.reg, cc.reg2, | ||
62 | s->T0, cpu_regs[reg]); | ||
63 | gen_op_mov_reg_v(s, ot, reg, s->T0); | ||
64 | - | ||
65 | - if (cc.mask != -1) { | ||
66 | - tcg_temp_free(cc.reg); | ||
67 | - } | ||
68 | - if (!cc.use_reg2) { | ||
69 | - tcg_temp_free(cc.reg2); | ||
70 | - } | ||
71 | } | ||
72 | |||
73 | static inline void gen_op_movl_T0_seg(DisasContext *s, X86Seg seg_reg) | ||
74 | @@ -XXX,XX +XXX,XX @@ static void gen_set_hflag(DisasContext *s, uint32_t mask) | ||
75 | tcg_gen_ld_i32(t, cpu_env, offsetof(CPUX86State, hflags)); | ||
76 | tcg_gen_ori_i32(t, t, mask); | ||
77 | tcg_gen_st_i32(t, cpu_env, offsetof(CPUX86State, hflags)); | ||
78 | - tcg_temp_free_i32(t); | ||
79 | s->flags |= mask; | ||
80 | } | ||
81 | } | ||
82 | @@ -XXX,XX +XXX,XX @@ static void gen_reset_hflag(DisasContext *s, uint32_t mask) | ||
83 | tcg_gen_ld_i32(t, cpu_env, offsetof(CPUX86State, hflags)); | ||
84 | tcg_gen_andi_i32(t, t, ~mask); | ||
85 | tcg_gen_st_i32(t, cpu_env, offsetof(CPUX86State, hflags)); | ||
86 | - tcg_temp_free_i32(t); | ||
87 | s->flags &= ~mask; | ||
88 | } | ||
89 | } | ||
90 | @@ -XXX,XX +XXX,XX @@ static void gen_set_eflags(DisasContext *s, target_ulong mask) | ||
91 | tcg_gen_ld_tl(t, cpu_env, offsetof(CPUX86State, eflags)); | ||
92 | tcg_gen_ori_tl(t, t, mask); | ||
93 | tcg_gen_st_tl(t, cpu_env, offsetof(CPUX86State, eflags)); | ||
94 | - tcg_temp_free(t); | ||
95 | } | ||
96 | |||
97 | static void gen_reset_eflags(DisasContext *s, target_ulong mask) | ||
98 | @@ -XXX,XX +XXX,XX @@ static void gen_reset_eflags(DisasContext *s, target_ulong mask) | ||
99 | tcg_gen_ld_tl(t, cpu_env, offsetof(CPUX86State, eflags)); | ||
100 | tcg_gen_andi_tl(t, t, ~mask); | ||
101 | tcg_gen_st_tl(t, cpu_env, offsetof(CPUX86State, eflags)); | ||
102 | - tcg_temp_free(t); | ||
103 | } | ||
104 | |||
105 | /* Clear BND registers during legacy branches. */ | ||
106 | @@ -XXX,XX +XXX,XX @@ static void gen_cmpxchg8b(DisasContext *s, CPUX86State *env, int modrm) | ||
107 | tcg_gen_nonatomic_cmpxchg_i64(old, s->A0, cmp, val, | ||
108 | s->mem_index, MO_TEUQ); | ||
109 | } | ||
110 | - tcg_temp_free_i64(val); | ||
111 | |||
112 | /* Set tmp0 to match the required value of Z. */ | ||
113 | tcg_gen_setcond_i64(TCG_COND_EQ, cmp, old, cmp); | ||
114 | Z = tcg_temp_new(); | ||
115 | tcg_gen_trunc_i64_tl(Z, cmp); | ||
116 | - tcg_temp_free_i64(cmp); | ||
117 | |||
118 | /* | ||
119 | * Extract the result values for the register pair. | ||
120 | @@ -XXX,XX +XXX,XX @@ static void gen_cmpxchg8b(DisasContext *s, CPUX86State *env, int modrm) | ||
121 | tcg_gen_movcond_tl(TCG_COND_EQ, cpu_regs[R_EDX], Z, zero, | ||
122 | s->T1, cpu_regs[R_EDX]); | ||
123 | } | ||
124 | - tcg_temp_free_i64(old); | ||
125 | |||
126 | /* Update Z. */ | ||
127 | gen_compute_eflags(s); | ||
128 | tcg_gen_deposit_tl(cpu_cc_src, cpu_cc_src, Z, ctz32(CC_Z), 1); | ||
129 | - tcg_temp_free(Z); | ||
130 | } | ||
131 | |||
132 | #ifdef TARGET_X86_64 | ||
133 | @@ -XXX,XX +XXX,XX @@ static void gen_cmpxchg16b(DisasContext *s, CPUX86State *env, int modrm) | ||
134 | } | ||
135 | |||
136 | tcg_gen_extr_i128_i64(s->T0, s->T1, val); | ||
137 | - tcg_temp_free_i128(cmp); | ||
138 | - tcg_temp_free_i128(val); | ||
139 | |||
140 | /* Determine success after the fact. */ | ||
141 | t0 = tcg_temp_new_i64(); | ||
142 | @@ -XXX,XX +XXX,XX @@ static void gen_cmpxchg16b(DisasContext *s, CPUX86State *env, int modrm) | ||
143 | tcg_gen_xor_i64(t0, s->T0, cpu_regs[R_EAX]); | ||
144 | tcg_gen_xor_i64(t1, s->T1, cpu_regs[R_EDX]); | ||
145 | tcg_gen_or_i64(t0, t0, t1); | ||
146 | - tcg_temp_free_i64(t1); | ||
147 | |||
148 | /* Update Z. */ | ||
149 | gen_compute_eflags(s); | ||
150 | tcg_gen_setcondi_i64(TCG_COND_EQ, t0, t0, 0); | ||
151 | tcg_gen_deposit_tl(cpu_cc_src, cpu_cc_src, t0, ctz32(CC_Z), 1); | ||
152 | - tcg_temp_free_i64(t0); | ||
153 | |||
154 | /* | ||
155 | * Extract the result values for the register pair. We may do this | ||
156 | @@ -XXX,XX +XXX,XX @@ static bool disas_insn(DisasContext *s, CPUState *cpu) | ||
157 | tcg_gen_neg_tl(t1, t0); | ||
158 | tcg_gen_atomic_cmpxchg_tl(t0, a0, t0, t1, | ||
159 | s->mem_index, ot | MO_LE); | ||
160 | - tcg_temp_free(t1); | ||
161 | tcg_gen_brcond_tl(TCG_COND_NE, t0, t2, label1); | ||
162 | |||
163 | - tcg_temp_free(t2); | ||
164 | tcg_gen_neg_tl(s->T0, t0); | ||
165 | } else { | ||
166 | tcg_gen_neg_tl(s->T0, s->T0); | ||
167 | @@ -XXX,XX +XXX,XX @@ static bool disas_insn(DisasContext *s, CPUState *cpu) | ||
168 | tcg_gen_mov_tl(s->cc_srcT, cmpv); | ||
169 | tcg_gen_sub_tl(cpu_cc_dst, cmpv, oldv); | ||
170 | set_cc_op(s, CC_OP_SUBB + ot); | ||
171 | - tcg_temp_free(oldv); | ||
172 | - tcg_temp_free(newv); | ||
173 | - tcg_temp_free(cmpv); | ||
174 | } | ||
175 | break; | ||
176 | case 0x1c7: /* cmpxchg8b */ | ||
177 | @@ -XXX,XX +XXX,XX @@ static bool disas_insn(DisasContext *s, CPUState *cpu) | ||
178 | if (shift) { | ||
179 | TCGv imm = tcg_const_tl(x86_ldub_code(env, s)); | ||
180 | gen_shiftd_rm_T1(s, ot, opreg, op, imm); | ||
181 | - tcg_temp_free(imm); | ||
182 | } else { | ||
183 | gen_shiftd_rm_T1(s, ot, opreg, op, cpu_regs[R_ECX]); | ||
184 | } | ||
185 | @@ -XXX,XX +XXX,XX @@ static bool disas_insn(DisasContext *s, CPUState *cpu) | ||
186 | tcg_gen_st_tl(last_addr, cpu_env, | ||
187 | offsetof(CPUX86State, fpdp)); | ||
188 | } | ||
189 | - tcg_temp_free(last_addr); | ||
190 | } else { | ||
191 | /* register float ops */ | ||
192 | opreg = rm; | ||
193 | @@ -XXX,XX +XXX,XX @@ static bool disas_insn(DisasContext *s, CPUState *cpu) | ||
194 | gen_compute_eflags(s); | ||
195 | tcg_gen_andi_tl(cpu_cc_src, cpu_cc_src, ~CC_Z); | ||
196 | tcg_gen_or_tl(cpu_cc_src, cpu_cc_src, t2); | ||
197 | - tcg_temp_free(t0); | ||
198 | - tcg_temp_free(t1); | ||
199 | - tcg_temp_free(t2); | ||
200 | } | ||
201 | break; | ||
202 | case 0x102: /* lar */ | ||
203 | @@ -XXX,XX +XXX,XX @@ static bool disas_insn(DisasContext *s, CPUState *cpu) | ||
204 | gen_op_mov_reg_v(s, ot, reg, t0); | ||
205 | gen_set_label(label1); | ||
206 | set_cc_op(s, CC_OP_EFLAGS); | ||
207 | - tcg_temp_free(t0); | ||
208 | } | ||
209 | break; | ||
210 | case 0x118: | ||
211 | @@ -XXX,XX +XXX,XX @@ static bool disas_insn(DisasContext *s, CPUState *cpu) | ||
212 | TCGv_i64 notu = tcg_temp_new_i64(); | ||
213 | tcg_gen_not_i64(notu, cpu_bndu[reg]); | ||
214 | gen_bndck(env, s, modrm, TCG_COND_GTU, notu); | ||
215 | - tcg_temp_free_i64(notu); | ||
216 | } else if (prefixes & PREFIX_DATA) { | ||
217 | /* bndmov -- from reg/mem */ | ||
218 | if (reg >= 4 || s->aflag == MO_16) { | ||
219 | diff --git a/target/i386/tcg/decode-new.c.inc b/target/i386/tcg/decode-new.c.inc | ||
220 | index XXXXXXX..XXXXXXX 100644 | ||
221 | --- a/target/i386/tcg/decode-new.c.inc | ||
222 | +++ b/target/i386/tcg/decode-new.c.inc | ||
223 | @@ -XXX,XX +XXX,XX @@ illegal: | ||
224 | return false; | ||
225 | } | ||
226 | |||
227 | -static void decode_temp_free(X86DecodedOp *op) | ||
228 | -{ | ||
229 | - if (op->v_ptr) { | ||
230 | - tcg_temp_free_ptr(op->v_ptr); | ||
231 | - } | ||
232 | -} | ||
233 | - | ||
234 | -static void decode_temps_free(X86DecodedInsn *decode) | ||
235 | -{ | ||
236 | - decode_temp_free(&decode->op[0]); | ||
237 | - decode_temp_free(&decode->op[1]); | ||
238 | - decode_temp_free(&decode->op[2]); | ||
239 | -} | ||
240 | - | ||
241 | /* | ||
242 | * Convert one instruction. s->base.is_jmp is set if the translation must | ||
243 | * be stopped. | ||
244 | @@ -XXX,XX +XXX,XX @@ static void disas_insn_new(DisasContext *s, CPUState *cpu, int b) | ||
245 | decode.e.gen(s, env, &decode); | ||
246 | gen_writeback(s, &decode, 0, s->T0); | ||
247 | } | ||
248 | - decode_temps_free(&decode); | ||
249 | return; | ||
250 | illegal_op: | ||
251 | gen_illegal_opcode(s); | ||
252 | diff --git a/target/i386/tcg/emit.c.inc b/target/i386/tcg/emit.c.inc | ||
253 | index XXXXXXX..XXXXXXX 100644 | ||
254 | --- a/target/i386/tcg/emit.c.inc | ||
255 | +++ b/target/i386/tcg/emit.c.inc | ||
256 | @@ -XXX,XX +XXX,XX @@ static inline void gen_ternary_sse(DisasContext *s, CPUX86State *env, X86Decoded | ||
257 | /* The format of the fourth input is Lx */ | ||
258 | tcg_gen_addi_ptr(ptr3, cpu_env, ZMM_OFFSET(op3)); | ||
259 | fn(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2, ptr3); | ||
260 | - tcg_temp_free_ptr(ptr3); | ||
261 | } | ||
262 | #define TERNARY_SSE(uname, uvname, lname) \ | ||
263 | static void gen_##uvname(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) \ | ||
264 | @@ -XXX,XX +XXX,XX @@ static inline void gen_vsib_avx(DisasContext *s, CPUX86State *env, X86DecodedIns | ||
265 | int ymmh_ofs = vector_elem_offset(&decode->op[1], MO_128, 1); | ||
266 | tcg_gen_gvec_dup_imm(MO_64, ymmh_ofs, 16, 16, 0); | ||
267 | } | ||
268 | - tcg_temp_free_ptr(index); | ||
269 | } | ||
270 | #define VSIB_AVX(uname, lname) \ | ||
271 | static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) \ | ||
272 | @@ -XXX,XX +XXX,XX @@ static void gen_PMOVMSKB(DisasContext *s, CPUX86State *env, X86DecodedInsn *deco | ||
273 | tcg_gen_deposit_tl(s->T0, t, s->T0, 8, TARGET_LONG_BITS - 8); | ||
274 | } | 26 | } |
275 | } | 27 | } |
276 | - tcg_temp_free(t); | 28 | if (n < 80) { |
277 | } | 29 | - /* f32-f62 (double width, even numbers only) */ |
278 | 30 | - return gdb_get_reg64(mem_buf, env->fpr[(n - 32) / 2].ll); | |
279 | static void gen_PSHUFW(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) | 31 | + /* f32-f62 (16 double width registers, even register numbers only) |
280 | @@ -XXX,XX +XXX,XX @@ static void gen_PSRLDQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn *deco | 32 | + * n == 64: f32 : env->fpr[16] |
33 | + * n == 65: f34 : env->fpr[17] | ||
34 | + * etc... | ||
35 | + * n == 79: f62 : env->fpr[31] | ||
36 | + */ | ||
37 | + return gdb_get_reg64(mem_buf, env->fpr[(n - 64) + 16].ll); | ||
38 | } | ||
39 | switch (n) { | ||
40 | case 80: | ||
41 | @@ -XXX,XX +XXX,XX @@ int sparc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n) | ||
42 | } | ||
43 | return 4; | ||
44 | } else if (n < 80) { | ||
45 | - /* f32-f62 (double width, even numbers only) */ | ||
46 | - env->fpr[(n - 32) / 2].ll = tmp; | ||
47 | + /* f32-f62 (16 double width registers, even register numbers only) | ||
48 | + * n == 64: f32 : env->fpr[16] | ||
49 | + * n == 65: f34 : env->fpr[17] | ||
50 | + * etc... | ||
51 | + * n == 79: f62 : env->fpr[31] | ||
52 | + */ | ||
53 | + env->fpr[(n - 64) + 16].ll = tmp; | ||
281 | } else { | 54 | } else { |
282 | gen_helper_psrldq_xmm(cpu_env, OP_PTR0, OP_PTR1, imm_vec); | 55 | switch (n) { |
283 | } | 56 | case 80: |
284 | - tcg_temp_free_ptr(imm_vec); | ||
285 | } | ||
286 | |||
287 | static void gen_PSLLDQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) | ||
288 | @@ -XXX,XX +XXX,XX @@ static void gen_PSLLDQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn *deco | ||
289 | } else { | ||
290 | gen_helper_pslldq_xmm(cpu_env, OP_PTR0, OP_PTR1, imm_vec); | ||
291 | } | ||
292 | - tcg_temp_free_ptr(imm_vec); | ||
293 | } | ||
294 | |||
295 | static void gen_RORX(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) | ||
296 | @@ -XXX,XX +XXX,XX @@ static void gen_VZEROALL(DisasContext *s, CPUX86State *env, X86DecodedInsn *deco | ||
297 | tcg_gen_addi_ptr(ptr, cpu_env, offsetof(CPUX86State, xmm_t0)); | ||
298 | gen_helper_memset(ptr, ptr, tcg_constant_i32(0), | ||
299 | tcg_constant_ptr(CPU_NB_REGS * sizeof(ZMMReg))); | ||
300 | - tcg_temp_free_ptr(ptr); | ||
301 | } | ||
302 | |||
303 | static void gen_VZEROUPPER(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) | ||
304 | -- | 57 | -- |
305 | 2.34.1 | 58 | 2.43.0 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Jiaxun Yang <jiaxun.yang@flygoat.com> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/mips/tcg/mips16e_translate.c.inc | 6 ------ | ||
7 | 1 file changed, 6 deletions(-) | ||
8 | |||
9 | diff --git a/target/mips/tcg/mips16e_translate.c.inc b/target/mips/tcg/mips16e_translate.c.inc | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/mips/tcg/mips16e_translate.c.inc | ||
12 | +++ b/target/mips/tcg/mips16e_translate.c.inc | ||
13 | @@ -XXX,XX +XXX,XX @@ static void gen_mips16_save(DisasContext *ctx, | ||
14 | |||
15 | tcg_gen_movi_tl(t2, -framesize); | ||
16 | gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2); | ||
17 | - tcg_temp_free(t0); | ||
18 | - tcg_temp_free(t1); | ||
19 | - tcg_temp_free(t2); | ||
20 | } | ||
21 | |||
22 | static void gen_mips16_restore(DisasContext *ctx, | ||
23 | @@ -XXX,XX +XXX,XX @@ static void gen_mips16_restore(DisasContext *ctx, | ||
24 | |||
25 | tcg_gen_movi_tl(t2, framesize); | ||
26 | gen_op_addr_add(ctx, cpu_gpr[29], cpu_gpr[29], t2); | ||
27 | - tcg_temp_free(t0); | ||
28 | - tcg_temp_free(t1); | ||
29 | - tcg_temp_free(t2); | ||
30 | } | ||
31 | |||
32 | #if defined(TARGET_MIPS64) | ||
33 | -- | ||
34 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/tricore/translate.c | 540 +------------------------------------ | ||
7 | 1 file changed, 4 insertions(+), 536 deletions(-) | ||
8 | |||
9 | diff --git a/target/tricore/translate.c b/target/tricore/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/tricore/translate.c | ||
12 | +++ b/target/tricore/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ void tricore_cpu_dump_state(CPUState *cs, FILE *f, int flags) | ||
14 | #define gen_helper_1arg(name, arg) do { \ | ||
15 | TCGv_i32 helper_tmp = tcg_const_i32(arg); \ | ||
16 | gen_helper_##name(cpu_env, helper_tmp); \ | ||
17 | - tcg_temp_free_i32(helper_tmp); \ | ||
18 | } while (0) | ||
19 | |||
20 | #define GEN_HELPER_LL(name, ret, arg0, arg1, n) do { \ | ||
21 | @@ -XXX,XX +XXX,XX @@ void tricore_cpu_dump_state(CPUState *cs, FILE *f, int flags) | ||
22 | tcg_gen_ext16s_tl(arg01, arg0); \ | ||
23 | tcg_gen_ext16s_tl(arg11, arg1); \ | ||
24 | gen_helper_##name(ret, arg00, arg01, arg11, arg11, n); \ | ||
25 | - tcg_temp_free(arg00); \ | ||
26 | - tcg_temp_free(arg01); \ | ||
27 | - tcg_temp_free(arg11); \ | ||
28 | } while (0) | ||
29 | |||
30 | #define GEN_HELPER_LU(name, ret, arg0, arg1, n) do { \ | ||
31 | @@ -XXX,XX +XXX,XX @@ void tricore_cpu_dump_state(CPUState *cs, FILE *f, int flags) | ||
32 | tcg_gen_sari_tl(arg11, arg1, 16); \ | ||
33 | tcg_gen_ext16s_tl(arg10, arg1); \ | ||
34 | gen_helper_##name(ret, arg00, arg01, arg10, arg11, n); \ | ||
35 | - tcg_temp_free(arg00); \ | ||
36 | - tcg_temp_free(arg01); \ | ||
37 | - tcg_temp_free(arg10); \ | ||
38 | - tcg_temp_free(arg11); \ | ||
39 | } while (0) | ||
40 | |||
41 | #define GEN_HELPER_UL(name, ret, arg0, arg1, n) do { \ | ||
42 | @@ -XXX,XX +XXX,XX @@ void tricore_cpu_dump_state(CPUState *cs, FILE *f, int flags) | ||
43 | tcg_gen_sari_tl(arg10, arg1, 16); \ | ||
44 | tcg_gen_ext16s_tl(arg11, arg1); \ | ||
45 | gen_helper_##name(ret, arg00, arg01, arg10, arg11, n); \ | ||
46 | - tcg_temp_free(arg00); \ | ||
47 | - tcg_temp_free(arg01); \ | ||
48 | - tcg_temp_free(arg10); \ | ||
49 | - tcg_temp_free(arg11); \ | ||
50 | } while (0) | ||
51 | |||
52 | #define GEN_HELPER_UU(name, ret, arg0, arg1, n) do { \ | ||
53 | @@ -XXX,XX +XXX,XX @@ void tricore_cpu_dump_state(CPUState *cs, FILE *f, int flags) | ||
54 | tcg_gen_ext16s_tl(arg00, arg0); \ | ||
55 | tcg_gen_sari_tl(arg11, arg1, 16); \ | ||
56 | gen_helper_##name(ret, arg00, arg01, arg11, arg11, n); \ | ||
57 | - tcg_temp_free(arg00); \ | ||
58 | - tcg_temp_free(arg01); \ | ||
59 | - tcg_temp_free(arg11); \ | ||
60 | } while (0) | ||
61 | |||
62 | #define GEN_HELPER_RRR(name, rl, rh, al1, ah1, arg2) do { \ | ||
63 | @@ -XXX,XX +XXX,XX @@ void tricore_cpu_dump_state(CPUState *cs, FILE *f, int flags) | ||
64 | tcg_gen_concat_i32_i64(arg1, al1, ah1); \ | ||
65 | gen_helper_##name(ret, arg1, arg2); \ | ||
66 | tcg_gen_extr_i64_i32(rl, rh, ret); \ | ||
67 | - \ | ||
68 | - tcg_temp_free_i64(ret); \ | ||
69 | - tcg_temp_free_i64(arg1); \ | ||
70 | } while (0) | ||
71 | |||
72 | #define GEN_HELPER_RR(name, rl, rh, arg1, arg2) do { \ | ||
73 | @@ -XXX,XX +XXX,XX @@ void tricore_cpu_dump_state(CPUState *cs, FILE *f, int flags) | ||
74 | \ | ||
75 | gen_helper_##name(ret, cpu_env, arg1, arg2); \ | ||
76 | tcg_gen_extr_i64_i32(rl, rh, ret); \ | ||
77 | - \ | ||
78 | - tcg_temp_free_i64(ret); \ | ||
79 | } while (0) | ||
80 | |||
81 | #define EA_ABS_FORMAT(con) (((con & 0x3C000) << 14) + (con & 0x3FFF)) | ||
82 | @@ -XXX,XX +XXX,XX @@ static inline void gen_offset_ld(DisasContext *ctx, TCGv r1, TCGv r2, | ||
83 | TCGv temp = tcg_temp_new(); | ||
84 | tcg_gen_addi_tl(temp, r2, con); | ||
85 | tcg_gen_qemu_ld_tl(r1, temp, ctx->mem_idx, mop); | ||
86 | - tcg_temp_free(temp); | ||
87 | } | ||
88 | |||
89 | static inline void gen_offset_st(DisasContext *ctx, TCGv r1, TCGv r2, | ||
90 | @@ -XXX,XX +XXX,XX @@ static inline void gen_offset_st(DisasContext *ctx, TCGv r1, TCGv r2, | ||
91 | TCGv temp = tcg_temp_new(); | ||
92 | tcg_gen_addi_tl(temp, r2, con); | ||
93 | tcg_gen_qemu_st_tl(r1, temp, ctx->mem_idx, mop); | ||
94 | - tcg_temp_free(temp); | ||
95 | } | ||
96 | |||
97 | static void gen_st_2regs_64(TCGv rh, TCGv rl, TCGv address, DisasContext *ctx) | ||
98 | @@ -XXX,XX +XXX,XX @@ static void gen_st_2regs_64(TCGv rh, TCGv rl, TCGv address, DisasContext *ctx) | ||
99 | |||
100 | tcg_gen_concat_i32_i64(temp, rl, rh); | ||
101 | tcg_gen_qemu_st_i64(temp, address, ctx->mem_idx, MO_LEUQ); | ||
102 | - | ||
103 | - tcg_temp_free_i64(temp); | ||
104 | } | ||
105 | |||
106 | static void gen_offset_st_2regs(TCGv rh, TCGv rl, TCGv base, int16_t con, | ||
107 | @@ -XXX,XX +XXX,XX @@ static void gen_offset_st_2regs(TCGv rh, TCGv rl, TCGv base, int16_t con, | ||
108 | TCGv temp = tcg_temp_new(); | ||
109 | tcg_gen_addi_tl(temp, base, con); | ||
110 | gen_st_2regs_64(rh, rl, temp, ctx); | ||
111 | - tcg_temp_free(temp); | ||
112 | } | ||
113 | |||
114 | static void gen_ld_2regs_64(TCGv rh, TCGv rl, TCGv address, DisasContext *ctx) | ||
115 | @@ -XXX,XX +XXX,XX @@ static void gen_ld_2regs_64(TCGv rh, TCGv rl, TCGv address, DisasContext *ctx) | ||
116 | tcg_gen_qemu_ld_i64(temp, address, ctx->mem_idx, MO_LEUQ); | ||
117 | /* write back to two 32 bit regs */ | ||
118 | tcg_gen_extr_i64_i32(rl, rh, temp); | ||
119 | - | ||
120 | - tcg_temp_free_i64(temp); | ||
121 | } | ||
122 | |||
123 | static void gen_offset_ld_2regs(TCGv rh, TCGv rl, TCGv base, int16_t con, | ||
124 | @@ -XXX,XX +XXX,XX @@ static void gen_offset_ld_2regs(TCGv rh, TCGv rl, TCGv base, int16_t con, | ||
125 | TCGv temp = tcg_temp_new(); | ||
126 | tcg_gen_addi_tl(temp, base, con); | ||
127 | gen_ld_2regs_64(rh, rl, temp, ctx); | ||
128 | - tcg_temp_free(temp); | ||
129 | } | ||
130 | |||
131 | static void gen_st_preincr(DisasContext *ctx, TCGv r1, TCGv r2, int16_t off, | ||
132 | @@ -XXX,XX +XXX,XX @@ static void gen_st_preincr(DisasContext *ctx, TCGv r1, TCGv r2, int16_t off, | ||
133 | tcg_gen_addi_tl(temp, r2, off); | ||
134 | tcg_gen_qemu_st_tl(r1, temp, ctx->mem_idx, mop); | ||
135 | tcg_gen_mov_tl(r2, temp); | ||
136 | - tcg_temp_free(temp); | ||
137 | } | ||
138 | |||
139 | static void gen_ld_preincr(DisasContext *ctx, TCGv r1, TCGv r2, int16_t off, | ||
140 | @@ -XXX,XX +XXX,XX @@ static void gen_ld_preincr(DisasContext *ctx, TCGv r1, TCGv r2, int16_t off, | ||
141 | tcg_gen_addi_tl(temp, r2, off); | ||
142 | tcg_gen_qemu_ld_tl(r1, temp, ctx->mem_idx, mop); | ||
143 | tcg_gen_mov_tl(r2, temp); | ||
144 | - tcg_temp_free(temp); | ||
145 | } | ||
146 | |||
147 | /* M(EA, word) = (M(EA, word) & ~E[a][63:32]) | (E[a][31:0] & E[a][63:32]); */ | ||
148 | @@ -XXX,XX +XXX,XX @@ static void gen_ldmst(DisasContext *ctx, int ereg, TCGv ea) | ||
149 | tcg_gen_or_tl(temp, temp, temp2); | ||
150 | /* M(EA, word) = temp; */ | ||
151 | tcg_gen_qemu_st_tl(temp, ea, ctx->mem_idx, MO_LEUL); | ||
152 | - | ||
153 | - tcg_temp_free(temp); | ||
154 | - tcg_temp_free(temp2); | ||
155 | } | ||
156 | |||
157 | /* tmp = M(EA, word); | ||
158 | @@ -XXX,XX +XXX,XX @@ static void gen_swap(DisasContext *ctx, int reg, TCGv ea) | ||
159 | tcg_gen_qemu_ld_tl(temp, ea, ctx->mem_idx, MO_LEUL); | ||
160 | tcg_gen_qemu_st_tl(cpu_gpr_d[reg], ea, ctx->mem_idx, MO_LEUL); | ||
161 | tcg_gen_mov_tl(cpu_gpr_d[reg], temp); | ||
162 | - | ||
163 | - tcg_temp_free(temp); | ||
164 | } | ||
165 | |||
166 | static void gen_cmpswap(DisasContext *ctx, int reg, TCGv ea) | ||
167 | @@ -XXX,XX +XXX,XX @@ static void gen_cmpswap(DisasContext *ctx, int reg, TCGv ea) | ||
168 | cpu_gpr_d[reg], temp); | ||
169 | tcg_gen_qemu_st_tl(temp2, ea, ctx->mem_idx, MO_LEUL); | ||
170 | tcg_gen_mov_tl(cpu_gpr_d[reg], temp); | ||
171 | - | ||
172 | - tcg_temp_free(temp); | ||
173 | - tcg_temp_free(temp2); | ||
174 | } | ||
175 | |||
176 | static void gen_swapmsk(DisasContext *ctx, int reg, TCGv ea) | ||
177 | @@ -XXX,XX +XXX,XX @@ static void gen_swapmsk(DisasContext *ctx, int reg, TCGv ea) | ||
178 | tcg_gen_or_tl(temp2, temp2, temp3); | ||
179 | tcg_gen_qemu_st_tl(temp2, ea, ctx->mem_idx, MO_LEUL); | ||
180 | tcg_gen_mov_tl(cpu_gpr_d[reg], temp); | ||
181 | - | ||
182 | - tcg_temp_free(temp); | ||
183 | - tcg_temp_free(temp2); | ||
184 | - tcg_temp_free(temp3); | ||
185 | } | ||
186 | |||
187 | |||
188 | @@ -XXX,XX +XXX,XX @@ static inline void gen_add_d(TCGv ret, TCGv r1, TCGv r2) | ||
189 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
190 | /* write back result */ | ||
191 | tcg_gen_mov_tl(ret, result); | ||
192 | - | ||
193 | - tcg_temp_free(result); | ||
194 | - tcg_temp_free(t0); | ||
195 | } | ||
196 | |||
197 | static inline void | ||
198 | @@ -XXX,XX +XXX,XX @@ gen_add64_d(TCGv_i64 ret, TCGv_i64 r1, TCGv_i64 r2) | ||
199 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
200 | /* write back result */ | ||
201 | tcg_gen_mov_i64(ret, result); | ||
202 | - | ||
203 | - tcg_temp_free(temp); | ||
204 | - tcg_temp_free_i64(result); | ||
205 | - tcg_temp_free_i64(t0); | ||
206 | - tcg_temp_free_i64(t1); | ||
207 | } | ||
208 | |||
209 | static inline void | ||
210 | @@ -XXX,XX +XXX,XX @@ gen_addsub64_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
211 | tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp); | ||
212 | /* calc SAV bit */ | ||
213 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
214 | - | ||
215 | - tcg_temp_free(temp); | ||
216 | - tcg_temp_free(temp2); | ||
217 | - tcg_temp_free(temp3); | ||
218 | - tcg_temp_free(temp4); | ||
219 | } | ||
220 | |||
221 | /* ret = r2 + (r1 * r3); */ | ||
222 | @@ -XXX,XX +XXX,XX @@ static inline void gen_madd32_d(TCGv ret, TCGv r1, TCGv r2, TCGv r3) | ||
223 | tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV); | ||
224 | /* calc SAV */ | ||
225 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
226 | - | ||
227 | - tcg_temp_free_i64(t1); | ||
228 | - tcg_temp_free_i64(t2); | ||
229 | - tcg_temp_free_i64(t3); | ||
230 | } | ||
231 | |||
232 | static inline void gen_maddi32_d(TCGv ret, TCGv r1, TCGv r2, int32_t con) | ||
233 | { | ||
234 | TCGv temp = tcg_const_i32(con); | ||
235 | gen_madd32_d(ret, r1, r2, temp); | ||
236 | - tcg_temp_free(temp); | ||
237 | } | ||
238 | |||
239 | static inline void | ||
240 | @@ -XXX,XX +XXX,XX @@ gen_madd64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
241 | /* write back the result */ | ||
242 | tcg_gen_mov_tl(ret_low, t3); | ||
243 | tcg_gen_mov_tl(ret_high, t4); | ||
244 | - | ||
245 | - tcg_temp_free(t1); | ||
246 | - tcg_temp_free(t2); | ||
247 | - tcg_temp_free(t3); | ||
248 | - tcg_temp_free(t4); | ||
249 | } | ||
250 | |||
251 | static inline void | ||
252 | @@ -XXX,XX +XXX,XX @@ gen_maddu64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
253 | tcg_gen_xor_tl(cpu_PSW_AV, ret_high, cpu_PSW_AV); | ||
254 | /* calc SAV */ | ||
255 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
256 | - | ||
257 | - tcg_temp_free_i64(t1); | ||
258 | - tcg_temp_free_i64(t2); | ||
259 | - tcg_temp_free_i64(t3); | ||
260 | } | ||
261 | |||
262 | static inline void | ||
263 | @@ -XXX,XX +XXX,XX @@ gen_maddi64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
264 | { | ||
265 | TCGv temp = tcg_const_i32(con); | ||
266 | gen_madd64_d(ret_low, ret_high, r1, r2_low, r2_high, temp); | ||
267 | - tcg_temp_free(temp); | ||
268 | } | ||
269 | |||
270 | static inline void | ||
271 | @@ -XXX,XX +XXX,XX @@ gen_maddui64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
272 | { | ||
273 | TCGv temp = tcg_const_i32(con); | ||
274 | gen_maddu64_d(ret_low, ret_high, r1, r2_low, r2_high, temp); | ||
275 | - tcg_temp_free(temp); | ||
276 | } | ||
277 | |||
278 | static inline void | ||
279 | @@ -XXX,XX +XXX,XX @@ gen_madd_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
280 | tcg_gen_extr_i64_i32(temp, temp2, temp64); | ||
281 | gen_addsub64_h(ret_low, ret_high, r1_low, r1_high, temp, temp2, | ||
282 | tcg_gen_add_tl, tcg_gen_add_tl); | ||
283 | - tcg_temp_free(temp); | ||
284 | - tcg_temp_free(temp2); | ||
285 | - tcg_temp_free_i64(temp64); | ||
286 | } | ||
287 | |||
288 | static inline void | ||
289 | @@ -XXX,XX +XXX,XX @@ gen_maddsu_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
290 | tcg_gen_extr_i64_i32(temp, temp2, temp64); | ||
291 | gen_addsub64_h(ret_low, ret_high, r1_low, r1_high, temp, temp2, | ||
292 | tcg_gen_sub_tl, tcg_gen_add_tl); | ||
293 | - tcg_temp_free(temp); | ||
294 | - tcg_temp_free(temp2); | ||
295 | - tcg_temp_free_i64(temp64); | ||
296 | } | ||
297 | |||
298 | static inline void | ||
299 | @@ -XXX,XX +XXX,XX @@ gen_maddsum_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
300 | gen_add64_d(temp64_2, temp64_3, temp64); | ||
301 | /* write back result */ | ||
302 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_2); | ||
303 | - | ||
304 | - tcg_temp_free(temp); | ||
305 | - tcg_temp_free_i64(temp64); | ||
306 | - tcg_temp_free_i64(temp64_2); | ||
307 | - tcg_temp_free_i64(temp64_3); | ||
308 | } | ||
309 | |||
310 | static inline void gen_adds(TCGv ret, TCGv r1, TCGv r2); | ||
311 | @@ -XXX,XX +XXX,XX @@ gen_madds_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
312 | tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp); | ||
313 | /* combine av bits */ | ||
314 | tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3); | ||
315 | - | ||
316 | - tcg_temp_free(temp); | ||
317 | - tcg_temp_free(temp2); | ||
318 | - tcg_temp_free(temp3); | ||
319 | - tcg_temp_free_i64(temp64); | ||
320 | - | ||
321 | } | ||
322 | |||
323 | static inline void gen_subs(TCGv ret, TCGv r1, TCGv r2); | ||
324 | @@ -XXX,XX +XXX,XX @@ gen_maddsus_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
325 | tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp); | ||
326 | /* combine av bits */ | ||
327 | tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3); | ||
328 | - | ||
329 | - tcg_temp_free(temp); | ||
330 | - tcg_temp_free(temp2); | ||
331 | - tcg_temp_free(temp3); | ||
332 | - tcg_temp_free_i64(temp64); | ||
333 | - | ||
334 | } | ||
335 | |||
336 | static inline void | ||
337 | @@ -XXX,XX +XXX,XX @@ gen_maddsums_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
338 | |||
339 | gen_helper_add64_ssov(temp64, cpu_env, temp64_2, temp64); | ||
340 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64); | ||
341 | - | ||
342 | - tcg_temp_free(temp); | ||
343 | - tcg_temp_free_i64(temp64); | ||
344 | - tcg_temp_free_i64(temp64_2); | ||
345 | } | ||
346 | |||
347 | |||
348 | @@ -XXX,XX +XXX,XX @@ gen_maddm_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
349 | gen_add64_d(temp64_3, temp64_2, temp64); | ||
350 | /* write back result */ | ||
351 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_3); | ||
352 | - | ||
353 | - tcg_temp_free(temp); | ||
354 | - tcg_temp_free_i64(temp64); | ||
355 | - tcg_temp_free_i64(temp64_2); | ||
356 | - tcg_temp_free_i64(temp64_3); | ||
357 | } | ||
358 | |||
359 | static inline void | ||
360 | @@ -XXX,XX +XXX,XX @@ gen_maddms_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
361 | tcg_gen_concat_i32_i64(temp64_2, r1_low, r1_high); | ||
362 | gen_helper_add64_ssov(temp64, cpu_env, temp64_2, temp64); | ||
363 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64); | ||
364 | - | ||
365 | - tcg_temp_free(temp); | ||
366 | - tcg_temp_free_i64(temp64); | ||
367 | - tcg_temp_free_i64(temp64_2); | ||
368 | } | ||
369 | |||
370 | static inline void | ||
371 | @@ -XXX,XX +XXX,XX @@ gen_maddr64_h(TCGv ret, TCGv r1_low, TCGv r1_high, TCGv r2, TCGv r3, uint32_t n, | ||
372 | break; | ||
373 | } | ||
374 | gen_helper_addr_h(ret, cpu_env, temp64, r1_low, r1_high); | ||
375 | - | ||
376 | - tcg_temp_free(temp); | ||
377 | - tcg_temp_free_i64(temp64); | ||
378 | } | ||
379 | |||
380 | static inline void | ||
381 | @@ -XXX,XX +XXX,XX @@ gen_maddr32_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode) | ||
382 | tcg_gen_andi_tl(temp2, r1, 0xffff0000); | ||
383 | tcg_gen_shli_tl(temp, r1, 16); | ||
384 | gen_maddr64_h(ret, temp, temp2, r2, r3, n, mode); | ||
385 | - | ||
386 | - tcg_temp_free(temp); | ||
387 | - tcg_temp_free(temp2); | ||
388 | } | ||
389 | |||
390 | static inline void | ||
391 | @@ -XXX,XX +XXX,XX @@ gen_maddsur32_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode) | ||
392 | tcg_gen_andi_tl(temp2, r1, 0xffff0000); | ||
393 | tcg_gen_shli_tl(temp, r1, 16); | ||
394 | gen_helper_addsur_h(ret, cpu_env, temp64, temp, temp2); | ||
395 | - | ||
396 | - tcg_temp_free(temp); | ||
397 | - tcg_temp_free(temp2); | ||
398 | - tcg_temp_free_i64(temp64); | ||
399 | } | ||
400 | |||
401 | |||
402 | @@ -XXX,XX +XXX,XX @@ gen_maddr64s_h(TCGv ret, TCGv r1_low, TCGv r1_high, TCGv r2, TCGv r3, | ||
403 | break; | ||
404 | } | ||
405 | gen_helper_addr_h_ssov(ret, cpu_env, temp64, r1_low, r1_high); | ||
406 | - | ||
407 | - tcg_temp_free(temp); | ||
408 | - tcg_temp_free_i64(temp64); | ||
409 | } | ||
410 | |||
411 | static inline void | ||
412 | @@ -XXX,XX +XXX,XX @@ gen_maddr32s_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode) | ||
413 | tcg_gen_andi_tl(temp2, r1, 0xffff0000); | ||
414 | tcg_gen_shli_tl(temp, r1, 16); | ||
415 | gen_maddr64s_h(ret, temp, temp2, r2, r3, n, mode); | ||
416 | - | ||
417 | - tcg_temp_free(temp); | ||
418 | - tcg_temp_free(temp2); | ||
419 | } | ||
420 | |||
421 | static inline void | ||
422 | @@ -XXX,XX +XXX,XX @@ gen_maddsur32s_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode) | ||
423 | tcg_gen_andi_tl(temp2, r1, 0xffff0000); | ||
424 | tcg_gen_shli_tl(temp, r1, 16); | ||
425 | gen_helper_addsur_h_ssov(ret, cpu_env, temp64, temp, temp2); | ||
426 | - | ||
427 | - tcg_temp_free(temp); | ||
428 | - tcg_temp_free(temp2); | ||
429 | - tcg_temp_free_i64(temp64); | ||
430 | } | ||
431 | |||
432 | static inline void | ||
433 | @@ -XXX,XX +XXX,XX @@ gen_maddr_q(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n) | ||
434 | { | ||
435 | TCGv temp = tcg_const_i32(n); | ||
436 | gen_helper_maddr_q(ret, cpu_env, r1, r2, r3, temp); | ||
437 | - tcg_temp_free(temp); | ||
438 | } | ||
439 | |||
440 | static inline void | ||
441 | @@ -XXX,XX +XXX,XX @@ gen_maddrs_q(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n) | ||
442 | { | ||
443 | TCGv temp = tcg_const_i32(n); | ||
444 | gen_helper_maddr_q_ssov(ret, cpu_env, r1, r2, r3, temp); | ||
445 | - tcg_temp_free(temp); | ||
446 | } | ||
447 | |||
448 | static inline void | ||
449 | @@ -XXX,XX +XXX,XX @@ gen_madd32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n, | ||
450 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
451 | /* write back result */ | ||
452 | tcg_gen_mov_tl(ret, temp3); | ||
453 | - | ||
454 | - tcg_temp_free(temp); | ||
455 | - tcg_temp_free(temp2); | ||
456 | - tcg_temp_free(temp3); | ||
457 | - tcg_temp_free_i64(t1); | ||
458 | - tcg_temp_free_i64(t2); | ||
459 | - tcg_temp_free_i64(t3); | ||
460 | } | ||
461 | |||
462 | static inline void | ||
463 | @@ -XXX,XX +XXX,XX @@ gen_m16add32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n) | ||
464 | tcg_gen_sub_tl(temp, temp, temp2); | ||
465 | } | ||
466 | gen_add_d(ret, arg1, temp); | ||
467 | - | ||
468 | - tcg_temp_free(temp); | ||
469 | - tcg_temp_free(temp2); | ||
470 | } | ||
471 | |||
472 | static inline void | ||
473 | @@ -XXX,XX +XXX,XX @@ gen_m16adds32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n) | ||
474 | tcg_gen_sub_tl(temp, temp, temp2); | ||
475 | } | ||
476 | gen_adds(ret, arg1, temp); | ||
477 | - | ||
478 | - tcg_temp_free(temp); | ||
479 | - tcg_temp_free(temp2); | ||
480 | } | ||
481 | |||
482 | static inline void | ||
483 | @@ -XXX,XX +XXX,XX @@ gen_m16add64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2, | ||
484 | gen_add64_d(t3, t1, t2); | ||
485 | /* write back result */ | ||
486 | tcg_gen_extr_i64_i32(rl, rh, t3); | ||
487 | - | ||
488 | - tcg_temp_free_i64(t1); | ||
489 | - tcg_temp_free_i64(t2); | ||
490 | - tcg_temp_free_i64(t3); | ||
491 | - tcg_temp_free(temp); | ||
492 | - tcg_temp_free(temp2); | ||
493 | } | ||
494 | |||
495 | static inline void | ||
496 | @@ -XXX,XX +XXX,XX @@ gen_m16adds64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2, | ||
497 | |||
498 | gen_helper_add64_ssov(t1, cpu_env, t1, t2); | ||
499 | tcg_gen_extr_i64_i32(rl, rh, t1); | ||
500 | - | ||
501 | - tcg_temp_free(temp); | ||
502 | - tcg_temp_free(temp2); | ||
503 | - tcg_temp_free_i64(t1); | ||
504 | - tcg_temp_free_i64(t2); | ||
505 | } | ||
506 | |||
507 | static inline void | ||
508 | @@ -XXX,XX +XXX,XX @@ gen_madd64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2, | ||
509 | tcg_gen_shli_tl(temp, temp, 31); | ||
510 | /* negate v bit, if special condition */ | ||
511 | tcg_gen_xor_tl(cpu_PSW_V, cpu_PSW_V, temp); | ||
512 | - | ||
513 | - tcg_temp_free(temp); | ||
514 | - tcg_temp_free(temp2); | ||
515 | } | ||
516 | /* write back result */ | ||
517 | tcg_gen_extr_i64_i32(rl, rh, t4); | ||
518 | @@ -XXX,XX +XXX,XX @@ gen_madd64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2, | ||
519 | tcg_gen_xor_tl(cpu_PSW_AV, rh, cpu_PSW_AV); | ||
520 | /* calc SAV */ | ||
521 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
522 | - | ||
523 | - tcg_temp_free_i64(t1); | ||
524 | - tcg_temp_free_i64(t2); | ||
525 | - tcg_temp_free_i64(t3); | ||
526 | - tcg_temp_free_i64(t4); | ||
527 | } | ||
528 | |||
529 | static inline void | ||
530 | @@ -XXX,XX +XXX,XX @@ gen_madds32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n, | ||
531 | tcg_gen_sari_i64(t2, t2, up_shift - n); | ||
532 | |||
533 | gen_helper_madd32_q_add_ssov(ret, cpu_env, t1, t2); | ||
534 | - | ||
535 | - tcg_temp_free_i64(t1); | ||
536 | - tcg_temp_free_i64(t2); | ||
537 | - tcg_temp_free_i64(t3); | ||
538 | } | ||
539 | |||
540 | static inline void | ||
541 | @@ -XXX,XX +XXX,XX @@ gen_madds64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2, | ||
542 | tcg_gen_concat_i32_i64(r1, arg1_low, arg1_high); | ||
543 | gen_helper_madd64_q_ssov(r1, cpu_env, r1, arg2, arg3, temp); | ||
544 | tcg_gen_extr_i64_i32(rl, rh, r1); | ||
545 | - | ||
546 | - tcg_temp_free_i64(r1); | ||
547 | - tcg_temp_free(temp); | ||
548 | } | ||
549 | + | ||
550 | /* ret = r2 - (r1 * r3); */ | ||
551 | static inline void gen_msub32_d(TCGv ret, TCGv r1, TCGv r2, TCGv r3) | ||
552 | { | ||
553 | @@ -XXX,XX +XXX,XX @@ static inline void gen_msub32_d(TCGv ret, TCGv r1, TCGv r2, TCGv r3) | ||
554 | tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV); | ||
555 | /* calc SAV */ | ||
556 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
557 | - | ||
558 | - tcg_temp_free_i64(t1); | ||
559 | - tcg_temp_free_i64(t2); | ||
560 | - tcg_temp_free_i64(t3); | ||
561 | } | ||
562 | |||
563 | static inline void gen_msubi32_d(TCGv ret, TCGv r1, TCGv r2, int32_t con) | ||
564 | { | ||
565 | TCGv temp = tcg_const_i32(con); | ||
566 | gen_msub32_d(ret, r1, r2, temp); | ||
567 | - tcg_temp_free(temp); | ||
568 | } | ||
569 | |||
570 | static inline void | ||
571 | @@ -XXX,XX +XXX,XX @@ gen_msub64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
572 | /* write back the result */ | ||
573 | tcg_gen_mov_tl(ret_low, t3); | ||
574 | tcg_gen_mov_tl(ret_high, t4); | ||
575 | - | ||
576 | - tcg_temp_free(t1); | ||
577 | - tcg_temp_free(t2); | ||
578 | - tcg_temp_free(t3); | ||
579 | - tcg_temp_free(t4); | ||
580 | } | ||
581 | |||
582 | static inline void | ||
583 | @@ -XXX,XX +XXX,XX @@ gen_msubi64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
584 | { | ||
585 | TCGv temp = tcg_const_i32(con); | ||
586 | gen_msub64_d(ret_low, ret_high, r1, r2_low, r2_high, temp); | ||
587 | - tcg_temp_free(temp); | ||
588 | } | ||
589 | |||
590 | static inline void | ||
591 | @@ -XXX,XX +XXX,XX @@ gen_msubu64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
592 | tcg_gen_xor_tl(cpu_PSW_AV, ret_high, cpu_PSW_AV); | ||
593 | /* calc SAV */ | ||
594 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
595 | - | ||
596 | - tcg_temp_free_i64(t1); | ||
597 | - tcg_temp_free_i64(t2); | ||
598 | - tcg_temp_free_i64(t3); | ||
599 | } | ||
600 | |||
601 | static inline void | ||
602 | @@ -XXX,XX +XXX,XX @@ gen_msubui64_d(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
603 | { | ||
604 | TCGv temp = tcg_const_i32(con); | ||
605 | gen_msubu64_d(ret_low, ret_high, r1, r2_low, r2_high, temp); | ||
606 | - tcg_temp_free(temp); | ||
607 | } | ||
608 | |||
609 | static inline void gen_addi_d(TCGv ret, TCGv r1, target_ulong r2) | ||
610 | { | ||
611 | TCGv temp = tcg_const_i32(r2); | ||
612 | gen_add_d(ret, r1, temp); | ||
613 | - tcg_temp_free(temp); | ||
614 | } | ||
615 | + | ||
616 | /* calculate the carry bit too */ | ||
617 | static inline void gen_add_CC(TCGv ret, TCGv r1, TCGv r2) | ||
618 | { | ||
619 | @@ -XXX,XX +XXX,XX @@ static inline void gen_add_CC(TCGv ret, TCGv r1, TCGv r2) | ||
620 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
621 | /* write back result */ | ||
622 | tcg_gen_mov_tl(ret, result); | ||
623 | - | ||
624 | - tcg_temp_free(result); | ||
625 | - tcg_temp_free(t0); | ||
626 | } | ||
627 | |||
628 | static inline void gen_addi_CC(TCGv ret, TCGv r1, int32_t con) | ||
629 | { | ||
630 | TCGv temp = tcg_const_i32(con); | ||
631 | gen_add_CC(ret, r1, temp); | ||
632 | - tcg_temp_free(temp); | ||
633 | } | ||
634 | |||
635 | static inline void gen_addc_CC(TCGv ret, TCGv r1, TCGv r2) | ||
636 | @@ -XXX,XX +XXX,XX @@ static inline void gen_addc_CC(TCGv ret, TCGv r1, TCGv r2) | ||
637 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
638 | /* write back result */ | ||
639 | tcg_gen_mov_tl(ret, result); | ||
640 | - | ||
641 | - tcg_temp_free(result); | ||
642 | - tcg_temp_free(t0); | ||
643 | - tcg_temp_free(carry); | ||
644 | } | ||
645 | |||
646 | static inline void gen_addci_CC(TCGv ret, TCGv r1, int32_t con) | ||
647 | { | ||
648 | TCGv temp = tcg_const_i32(con); | ||
649 | gen_addc_CC(ret, r1, temp); | ||
650 | - tcg_temp_free(temp); | ||
651 | } | ||
652 | |||
653 | static inline void gen_cond_add(TCGCond cond, TCGv r1, TCGv r2, TCGv r3, | ||
654 | @@ -XXX,XX +XXX,XX @@ static inline void gen_cond_add(TCGCond cond, TCGv r1, TCGv r2, TCGv r3, | ||
655 | tcg_gen_or_tl(cpu_PSW_SAV, temp, cpu_PSW_SAV); | ||
656 | /* write back result */ | ||
657 | tcg_gen_movcond_tl(cond, r3, r4, t0, result, r1); | ||
658 | - | ||
659 | - tcg_temp_free(t0); | ||
660 | - tcg_temp_free(temp); | ||
661 | - tcg_temp_free(temp2); | ||
662 | - tcg_temp_free(result); | ||
663 | - tcg_temp_free(mask); | ||
664 | } | ||
665 | |||
666 | static inline void gen_condi_add(TCGCond cond, TCGv r1, int32_t r2, | ||
667 | @@ -XXX,XX +XXX,XX @@ static inline void gen_condi_add(TCGCond cond, TCGv r1, int32_t r2, | ||
668 | { | ||
669 | TCGv temp = tcg_const_i32(r2); | ||
670 | gen_cond_add(cond, r1, temp, r3, r4); | ||
671 | - tcg_temp_free(temp); | ||
672 | } | ||
673 | |||
674 | static inline void gen_sub_d(TCGv ret, TCGv r1, TCGv r2) | ||
675 | @@ -XXX,XX +XXX,XX @@ static inline void gen_sub_d(TCGv ret, TCGv r1, TCGv r2) | ||
676 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
677 | /* write back result */ | ||
678 | tcg_gen_mov_tl(ret, result); | ||
679 | - | ||
680 | - tcg_temp_free(temp); | ||
681 | - tcg_temp_free(result); | ||
682 | } | ||
683 | |||
684 | static inline void | ||
685 | @@ -XXX,XX +XXX,XX @@ gen_sub64_d(TCGv_i64 ret, TCGv_i64 r1, TCGv_i64 r2) | ||
686 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
687 | /* write back result */ | ||
688 | tcg_gen_mov_i64(ret, result); | ||
689 | - | ||
690 | - tcg_temp_free(temp); | ||
691 | - tcg_temp_free_i64(result); | ||
692 | - tcg_temp_free_i64(t0); | ||
693 | - tcg_temp_free_i64(t1); | ||
694 | } | ||
695 | |||
696 | static inline void gen_sub_CC(TCGv ret, TCGv r1, TCGv r2) | ||
697 | @@ -XXX,XX +XXX,XX @@ static inline void gen_sub_CC(TCGv ret, TCGv r1, TCGv r2) | ||
698 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
699 | /* write back result */ | ||
700 | tcg_gen_mov_tl(ret, result); | ||
701 | - | ||
702 | - tcg_temp_free(result); | ||
703 | - tcg_temp_free(temp); | ||
704 | } | ||
705 | |||
706 | static inline void gen_subc_CC(TCGv ret, TCGv r1, TCGv r2) | ||
707 | @@ -XXX,XX +XXX,XX @@ static inline void gen_subc_CC(TCGv ret, TCGv r1, TCGv r2) | ||
708 | TCGv temp = tcg_temp_new(); | ||
709 | tcg_gen_not_tl(temp, r2); | ||
710 | gen_addc_CC(ret, r1, temp); | ||
711 | - tcg_temp_free(temp); | ||
712 | } | ||
713 | |||
714 | static inline void gen_cond_sub(TCGCond cond, TCGv r1, TCGv r2, TCGv r3, | ||
715 | @@ -XXX,XX +XXX,XX @@ static inline void gen_cond_sub(TCGCond cond, TCGv r1, TCGv r2, TCGv r3, | ||
716 | tcg_gen_or_tl(cpu_PSW_SAV, temp, cpu_PSW_SAV); | ||
717 | /* write back result */ | ||
718 | tcg_gen_movcond_tl(cond, r3, r4, t0, result, r1); | ||
719 | - | ||
720 | - tcg_temp_free(t0); | ||
721 | - tcg_temp_free(temp); | ||
722 | - tcg_temp_free(temp2); | ||
723 | - tcg_temp_free(result); | ||
724 | - tcg_temp_free(mask); | ||
725 | } | ||
726 | |||
727 | static inline void | ||
728 | @@ -XXX,XX +XXX,XX @@ gen_msub_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
729 | tcg_gen_extr_i64_i32(temp, temp2, temp64); | ||
730 | gen_addsub64_h(ret_low, ret_high, r1_low, r1_high, temp, temp2, | ||
731 | tcg_gen_sub_tl, tcg_gen_sub_tl); | ||
732 | - tcg_temp_free(temp); | ||
733 | - tcg_temp_free(temp2); | ||
734 | - tcg_temp_free_i64(temp64); | ||
735 | } | ||
736 | |||
737 | static inline void | ||
738 | @@ -XXX,XX +XXX,XX @@ gen_msubs_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
739 | tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp); | ||
740 | /* combine av bits */ | ||
741 | tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3); | ||
742 | - | ||
743 | - tcg_temp_free(temp); | ||
744 | - tcg_temp_free(temp2); | ||
745 | - tcg_temp_free(temp3); | ||
746 | - tcg_temp_free_i64(temp64); | ||
747 | } | ||
748 | |||
749 | static inline void | ||
750 | @@ -XXX,XX +XXX,XX @@ gen_msubm_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
751 | gen_sub64_d(temp64_3, temp64_2, temp64); | ||
752 | /* write back result */ | ||
753 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_3); | ||
754 | - | ||
755 | - tcg_temp_free(temp); | ||
756 | - tcg_temp_free_i64(temp64); | ||
757 | - tcg_temp_free_i64(temp64_2); | ||
758 | - tcg_temp_free_i64(temp64_3); | ||
759 | } | ||
760 | |||
761 | static inline void | ||
762 | @@ -XXX,XX +XXX,XX @@ gen_msubms_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
763 | tcg_gen_concat_i32_i64(temp64_2, r1_low, r1_high); | ||
764 | gen_helper_sub64_ssov(temp64, cpu_env, temp64_2, temp64); | ||
765 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64); | ||
766 | - | ||
767 | - tcg_temp_free(temp); | ||
768 | - tcg_temp_free_i64(temp64); | ||
769 | - tcg_temp_free_i64(temp64_2); | ||
770 | } | ||
771 | |||
772 | static inline void | ||
773 | @@ -XXX,XX +XXX,XX @@ gen_msubr64_h(TCGv ret, TCGv r1_low, TCGv r1_high, TCGv r2, TCGv r3, uint32_t n, | ||
774 | break; | ||
775 | } | ||
776 | gen_helper_subr_h(ret, cpu_env, temp64, r1_low, r1_high); | ||
777 | - | ||
778 | - tcg_temp_free(temp); | ||
779 | - tcg_temp_free_i64(temp64); | ||
780 | } | ||
781 | |||
782 | static inline void | ||
783 | @@ -XXX,XX +XXX,XX @@ gen_msubr32_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode) | ||
784 | tcg_gen_andi_tl(temp2, r1, 0xffff0000); | ||
785 | tcg_gen_shli_tl(temp, r1, 16); | ||
786 | gen_msubr64_h(ret, temp, temp2, r2, r3, n, mode); | ||
787 | - | ||
788 | - tcg_temp_free(temp); | ||
789 | - tcg_temp_free(temp2); | ||
790 | } | ||
791 | |||
792 | static inline void | ||
793 | @@ -XXX,XX +XXX,XX @@ gen_msubr64s_h(TCGv ret, TCGv r1_low, TCGv r1_high, TCGv r2, TCGv r3, | ||
794 | break; | ||
795 | } | ||
796 | gen_helper_subr_h_ssov(ret, cpu_env, temp64, r1_low, r1_high); | ||
797 | - | ||
798 | - tcg_temp_free(temp); | ||
799 | - tcg_temp_free_i64(temp64); | ||
800 | } | ||
801 | |||
802 | static inline void | ||
803 | @@ -XXX,XX +XXX,XX @@ gen_msubr32s_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode) | ||
804 | tcg_gen_andi_tl(temp2, r1, 0xffff0000); | ||
805 | tcg_gen_shli_tl(temp, r1, 16); | ||
806 | gen_msubr64s_h(ret, temp, temp2, r2, r3, n, mode); | ||
807 | - | ||
808 | - tcg_temp_free(temp); | ||
809 | - tcg_temp_free(temp2); | ||
810 | } | ||
811 | |||
812 | static inline void | ||
813 | @@ -XXX,XX +XXX,XX @@ gen_msubr_q(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n) | ||
814 | { | ||
815 | TCGv temp = tcg_const_i32(n); | ||
816 | gen_helper_msubr_q(ret, cpu_env, r1, r2, r3, temp); | ||
817 | - tcg_temp_free(temp); | ||
818 | } | ||
819 | |||
820 | static inline void | ||
821 | @@ -XXX,XX +XXX,XX @@ gen_msubrs_q(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n) | ||
822 | { | ||
823 | TCGv temp = tcg_const_i32(n); | ||
824 | gen_helper_msubr_q_ssov(ret, cpu_env, r1, r2, r3, temp); | ||
825 | - tcg_temp_free(temp); | ||
826 | } | ||
827 | |||
828 | static inline void | ||
829 | gen_msub32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n, | ||
830 | uint32_t up_shift) | ||
831 | { | ||
832 | - TCGv temp = tcg_temp_new(); | ||
833 | - TCGv temp2 = tcg_temp_new(); | ||
834 | TCGv temp3 = tcg_temp_new(); | ||
835 | TCGv_i64 t1 = tcg_temp_new_i64(); | ||
836 | TCGv_i64 t2 = tcg_temp_new_i64(); | ||
837 | @@ -XXX,XX +XXX,XX @@ gen_msub32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n, | ||
838 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
839 | /* write back result */ | ||
840 | tcg_gen_mov_tl(ret, temp3); | ||
841 | - | ||
842 | - tcg_temp_free(temp); | ||
843 | - tcg_temp_free(temp2); | ||
844 | - tcg_temp_free(temp3); | ||
845 | - tcg_temp_free_i64(t1); | ||
846 | - tcg_temp_free_i64(t2); | ||
847 | - tcg_temp_free_i64(t3); | ||
848 | - tcg_temp_free_i64(t4); | ||
849 | } | ||
850 | |||
851 | static inline void | ||
852 | @@ -XXX,XX +XXX,XX @@ gen_m16sub32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n) | ||
853 | tcg_gen_sub_tl(temp, temp, temp2); | ||
854 | } | ||
855 | gen_sub_d(ret, arg1, temp); | ||
856 | - | ||
857 | - tcg_temp_free(temp); | ||
858 | - tcg_temp_free(temp2); | ||
859 | } | ||
860 | |||
861 | static inline void | ||
862 | @@ -XXX,XX +XXX,XX @@ gen_m16subs32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n) | ||
863 | tcg_gen_sub_tl(temp, temp, temp2); | ||
864 | } | ||
865 | gen_subs(ret, arg1, temp); | ||
866 | - | ||
867 | - tcg_temp_free(temp); | ||
868 | - tcg_temp_free(temp2); | ||
869 | } | ||
870 | |||
871 | static inline void | ||
872 | @@ -XXX,XX +XXX,XX @@ gen_m16sub64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2, | ||
873 | gen_sub64_d(t3, t1, t2); | ||
874 | /* write back result */ | ||
875 | tcg_gen_extr_i64_i32(rl, rh, t3); | ||
876 | - | ||
877 | - tcg_temp_free_i64(t1); | ||
878 | - tcg_temp_free_i64(t2); | ||
879 | - tcg_temp_free_i64(t3); | ||
880 | - tcg_temp_free(temp); | ||
881 | - tcg_temp_free(temp2); | ||
882 | } | ||
883 | |||
884 | static inline void | ||
885 | @@ -XXX,XX +XXX,XX @@ gen_m16subs64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2, | ||
886 | |||
887 | gen_helper_sub64_ssov(t1, cpu_env, t1, t2); | ||
888 | tcg_gen_extr_i64_i32(rl, rh, t1); | ||
889 | - | ||
890 | - tcg_temp_free(temp); | ||
891 | - tcg_temp_free(temp2); | ||
892 | - tcg_temp_free_i64(t1); | ||
893 | - tcg_temp_free_i64(t2); | ||
894 | } | ||
895 | |||
896 | static inline void | ||
897 | @@ -XXX,XX +XXX,XX @@ gen_msub64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2, | ||
898 | tcg_gen_shli_tl(temp, temp, 31); | ||
899 | /* negate v bit, if special condition */ | ||
900 | tcg_gen_xor_tl(cpu_PSW_V, cpu_PSW_V, temp); | ||
901 | - | ||
902 | - tcg_temp_free(temp); | ||
903 | - tcg_temp_free(temp2); | ||
904 | } | ||
905 | /* write back result */ | ||
906 | tcg_gen_extr_i64_i32(rl, rh, t4); | ||
907 | @@ -XXX,XX +XXX,XX @@ gen_msub64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2, | ||
908 | tcg_gen_xor_tl(cpu_PSW_AV, rh, cpu_PSW_AV); | ||
909 | /* calc SAV */ | ||
910 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
911 | - | ||
912 | - tcg_temp_free_i64(t1); | ||
913 | - tcg_temp_free_i64(t2); | ||
914 | - tcg_temp_free_i64(t3); | ||
915 | - tcg_temp_free_i64(t4); | ||
916 | } | ||
917 | |||
918 | static inline void | ||
919 | @@ -XXX,XX +XXX,XX @@ gen_msubs32_q(TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, uint32_t n, | ||
920 | tcg_gen_add_i64(t3, t3, t4); | ||
921 | |||
922 | gen_helper_msub32_q_sub_ssov(ret, cpu_env, t1, t3); | ||
923 | - | ||
924 | - tcg_temp_free_i64(t1); | ||
925 | - tcg_temp_free_i64(t2); | ||
926 | - tcg_temp_free_i64(t3); | ||
927 | - tcg_temp_free_i64(t4); | ||
928 | } | ||
929 | |||
930 | static inline void | ||
931 | @@ -XXX,XX +XXX,XX @@ gen_msubs64_q(TCGv rl, TCGv rh, TCGv arg1_low, TCGv arg1_high, TCGv arg2, | ||
932 | tcg_gen_concat_i32_i64(r1, arg1_low, arg1_high); | ||
933 | gen_helper_msub64_q_ssov(r1, cpu_env, r1, arg2, arg3, temp); | ||
934 | tcg_gen_extr_i64_i32(rl, rh, r1); | ||
935 | - | ||
936 | - tcg_temp_free_i64(r1); | ||
937 | - tcg_temp_free(temp); | ||
938 | } | ||
939 | |||
940 | static inline void | ||
941 | @@ -XXX,XX +XXX,XX @@ gen_msubad_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
942 | tcg_gen_extr_i64_i32(temp, temp2, temp64); | ||
943 | gen_addsub64_h(ret_low, ret_high, r1_low, r1_high, temp, temp2, | ||
944 | tcg_gen_add_tl, tcg_gen_sub_tl); | ||
945 | - tcg_temp_free(temp); | ||
946 | - tcg_temp_free(temp2); | ||
947 | - tcg_temp_free_i64(temp64); | ||
948 | } | ||
949 | |||
950 | static inline void | ||
951 | @@ -XXX,XX +XXX,XX @@ gen_msubadm_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
952 | gen_sub64_d(temp64_2, temp64_3, temp64); | ||
953 | /* write back result */ | ||
954 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64_2); | ||
955 | - | ||
956 | - tcg_temp_free(temp); | ||
957 | - tcg_temp_free_i64(temp64); | ||
958 | - tcg_temp_free_i64(temp64_2); | ||
959 | - tcg_temp_free_i64(temp64_3); | ||
960 | } | ||
961 | |||
962 | static inline void | ||
963 | @@ -XXX,XX +XXX,XX @@ gen_msubadr32_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode) | ||
964 | tcg_gen_andi_tl(temp2, r1, 0xffff0000); | ||
965 | tcg_gen_shli_tl(temp, r1, 16); | ||
966 | gen_helper_subadr_h(ret, cpu_env, temp64, temp, temp2); | ||
967 | - | ||
968 | - tcg_temp_free(temp); | ||
969 | - tcg_temp_free(temp2); | ||
970 | - tcg_temp_free_i64(temp64); | ||
971 | } | ||
972 | |||
973 | static inline void | ||
974 | @@ -XXX,XX +XXX,XX @@ gen_msubads_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
975 | tcg_gen_or_tl(cpu_PSW_V, cpu_PSW_V, temp); | ||
976 | /* combine av bits */ | ||
977 | tcg_gen_or_tl(cpu_PSW_AV, cpu_PSW_AV, temp3); | ||
978 | - | ||
979 | - tcg_temp_free(temp); | ||
980 | - tcg_temp_free(temp2); | ||
981 | - tcg_temp_free(temp3); | ||
982 | - tcg_temp_free_i64(temp64); | ||
983 | } | ||
984 | |||
985 | static inline void | ||
986 | @@ -XXX,XX +XXX,XX @@ gen_msubadms_h(TCGv ret_low, TCGv ret_high, TCGv r1_low, TCGv r1_high, TCGv r2, | ||
987 | |||
988 | gen_helper_sub64_ssov(temp64, cpu_env, temp64_2, temp64); | ||
989 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64); | ||
990 | - | ||
991 | - tcg_temp_free(temp); | ||
992 | - tcg_temp_free_i64(temp64); | ||
993 | - tcg_temp_free_i64(temp64_2); | ||
994 | } | ||
995 | |||
996 | static inline void | ||
997 | @@ -XXX,XX +XXX,XX @@ gen_msubadr32s_h(TCGv ret, TCGv r1, TCGv r2, TCGv r3, uint32_t n, uint32_t mode) | ||
998 | tcg_gen_andi_tl(temp2, r1, 0xffff0000); | ||
999 | tcg_gen_shli_tl(temp, r1, 16); | ||
1000 | gen_helper_subadr_h_ssov(ret, cpu_env, temp64, temp, temp2); | ||
1001 | - | ||
1002 | - tcg_temp_free(temp); | ||
1003 | - tcg_temp_free(temp2); | ||
1004 | - tcg_temp_free_i64(temp64); | ||
1005 | } | ||
1006 | |||
1007 | static inline void gen_abs(TCGv ret, TCGv r1) | ||
1008 | @@ -XXX,XX +XXX,XX @@ static inline void gen_absdif(TCGv ret, TCGv r1, TCGv r2) | ||
1009 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
1010 | /* write back result */ | ||
1011 | tcg_gen_mov_tl(ret, result); | ||
1012 | - | ||
1013 | - tcg_temp_free(temp); | ||
1014 | - tcg_temp_free(result); | ||
1015 | } | ||
1016 | |||
1017 | static inline void gen_absdifi(TCGv ret, TCGv r1, int32_t con) | ||
1018 | { | ||
1019 | TCGv temp = tcg_const_i32(con); | ||
1020 | gen_absdif(ret, r1, temp); | ||
1021 | - tcg_temp_free(temp); | ||
1022 | } | ||
1023 | |||
1024 | static inline void gen_absdifsi(TCGv ret, TCGv r1, int32_t con) | ||
1025 | { | ||
1026 | TCGv temp = tcg_const_i32(con); | ||
1027 | gen_helper_absdif_ssov(ret, cpu_env, r1, temp); | ||
1028 | - tcg_temp_free(temp); | ||
1029 | } | ||
1030 | |||
1031 | static inline void gen_mul_i32s(TCGv ret, TCGv r1, TCGv r2) | ||
1032 | @@ -XXX,XX +XXX,XX @@ static inline void gen_mul_i32s(TCGv ret, TCGv r1, TCGv r2) | ||
1033 | tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV); | ||
1034 | /* calc SAV bit */ | ||
1035 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
1036 | - | ||
1037 | - tcg_temp_free(high); | ||
1038 | - tcg_temp_free(low); | ||
1039 | } | ||
1040 | |||
1041 | static inline void gen_muli_i32s(TCGv ret, TCGv r1, int32_t con) | ||
1042 | { | ||
1043 | TCGv temp = tcg_const_i32(con); | ||
1044 | gen_mul_i32s(ret, r1, temp); | ||
1045 | - tcg_temp_free(temp); | ||
1046 | } | ||
1047 | |||
1048 | static inline void gen_mul_i64s(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2) | ||
1049 | @@ -XXX,XX +XXX,XX @@ static inline void gen_muli_i64s(TCGv ret_low, TCGv ret_high, TCGv r1, | ||
1050 | { | ||
1051 | TCGv temp = tcg_const_i32(con); | ||
1052 | gen_mul_i64s(ret_low, ret_high, r1, temp); | ||
1053 | - tcg_temp_free(temp); | ||
1054 | } | ||
1055 | |||
1056 | static inline void gen_mul_i64u(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2) | ||
1057 | @@ -XXX,XX +XXX,XX @@ static inline void gen_muli_i64u(TCGv ret_low, TCGv ret_high, TCGv r1, | ||
1058 | { | ||
1059 | TCGv temp = tcg_const_i32(con); | ||
1060 | gen_mul_i64u(ret_low, ret_high, r1, temp); | ||
1061 | - tcg_temp_free(temp); | ||
1062 | } | ||
1063 | |||
1064 | static inline void gen_mulsi_i32(TCGv ret, TCGv r1, int32_t con) | ||
1065 | { | ||
1066 | TCGv temp = tcg_const_i32(con); | ||
1067 | gen_helper_mul_ssov(ret, cpu_env, r1, temp); | ||
1068 | - tcg_temp_free(temp); | ||
1069 | } | ||
1070 | |||
1071 | static inline void gen_mulsui_i32(TCGv ret, TCGv r1, int32_t con) | ||
1072 | { | ||
1073 | TCGv temp = tcg_const_i32(con); | ||
1074 | gen_helper_mul_suov(ret, cpu_env, r1, temp); | ||
1075 | - tcg_temp_free(temp); | ||
1076 | } | ||
1077 | /* gen_maddsi_32(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r3], const9); */ | ||
1078 | static inline void gen_maddsi_32(TCGv ret, TCGv r1, TCGv r2, int32_t con) | ||
1079 | { | ||
1080 | TCGv temp = tcg_const_i32(con); | ||
1081 | gen_helper_madd32_ssov(ret, cpu_env, r1, r2, temp); | ||
1082 | - tcg_temp_free(temp); | ||
1083 | } | ||
1084 | |||
1085 | static inline void gen_maddsui_32(TCGv ret, TCGv r1, TCGv r2, int32_t con) | ||
1086 | { | ||
1087 | TCGv temp = tcg_const_i32(con); | ||
1088 | gen_helper_madd32_suov(ret, cpu_env, r1, r2, temp); | ||
1089 | - tcg_temp_free(temp); | ||
1090 | } | ||
1091 | |||
1092 | static void | ||
1093 | gen_mul_q(TCGv rl, TCGv rh, TCGv arg1, TCGv arg2, uint32_t n, uint32_t up_shift) | ||
1094 | { | ||
1095 | - TCGv temp = tcg_temp_new(); | ||
1096 | TCGv_i64 temp_64 = tcg_temp_new_i64(); | ||
1097 | TCGv_i64 temp2_64 = tcg_temp_new_i64(); | ||
1098 | |||
1099 | @@ -XXX,XX +XXX,XX @@ gen_mul_q(TCGv rl, TCGv rh, TCGv arg1, TCGv arg2, uint32_t n, uint32_t up_shift) | ||
1100 | } | ||
1101 | /* calc sav overflow bit */ | ||
1102 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
1103 | - tcg_temp_free(temp); | ||
1104 | - tcg_temp_free_i64(temp_64); | ||
1105 | - tcg_temp_free_i64(temp2_64); | ||
1106 | } | ||
1107 | |||
1108 | static void | ||
1109 | @@ -XXX,XX +XXX,XX @@ gen_mul_q_16(TCGv ret, TCGv arg1, TCGv arg2, uint32_t n) | ||
1110 | tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV); | ||
1111 | /* calc sav overflow bit */ | ||
1112 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
1113 | - | ||
1114 | - tcg_temp_free(temp); | ||
1115 | } | ||
1116 | |||
1117 | static void gen_mulr_q(TCGv ret, TCGv arg1, TCGv arg2, uint32_t n) | ||
1118 | @@ -XXX,XX +XXX,XX @@ static void gen_mulr_q(TCGv ret, TCGv arg1, TCGv arg2, uint32_t n) | ||
1119 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
1120 | /* cut halfword off */ | ||
1121 | tcg_gen_andi_tl(ret, ret, 0xffff0000); | ||
1122 | - | ||
1123 | - tcg_temp_free(temp); | ||
1124 | } | ||
1125 | |||
1126 | static inline void | ||
1127 | @@ -XXX,XX +XXX,XX @@ gen_madds_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
1128 | tcg_gen_concat_i32_i64(temp64, r2_low, r2_high); | ||
1129 | gen_helper_madd64_ssov(temp64, cpu_env, r1, temp64, r3); | ||
1130 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64); | ||
1131 | - tcg_temp_free_i64(temp64); | ||
1132 | } | ||
1133 | |||
1134 | static inline void | ||
1135 | @@ -XXX,XX +XXX,XX @@ gen_maddsi_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
1136 | { | ||
1137 | TCGv temp = tcg_const_i32(con); | ||
1138 | gen_madds_64(ret_low, ret_high, r1, r2_low, r2_high, temp); | ||
1139 | - tcg_temp_free(temp); | ||
1140 | } | ||
1141 | |||
1142 | static inline void | ||
1143 | @@ -XXX,XX +XXX,XX @@ gen_maddsu_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
1144 | tcg_gen_concat_i32_i64(temp64, r2_low, r2_high); | ||
1145 | gen_helper_madd64_suov(temp64, cpu_env, r1, temp64, r3); | ||
1146 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64); | ||
1147 | - tcg_temp_free_i64(temp64); | ||
1148 | } | ||
1149 | |||
1150 | static inline void | ||
1151 | @@ -XXX,XX +XXX,XX @@ gen_maddsui_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
1152 | { | ||
1153 | TCGv temp = tcg_const_i32(con); | ||
1154 | gen_maddsu_64(ret_low, ret_high, r1, r2_low, r2_high, temp); | ||
1155 | - tcg_temp_free(temp); | ||
1156 | } | ||
1157 | |||
1158 | static inline void gen_msubsi_32(TCGv ret, TCGv r1, TCGv r2, int32_t con) | ||
1159 | { | ||
1160 | TCGv temp = tcg_const_i32(con); | ||
1161 | gen_helper_msub32_ssov(ret, cpu_env, r1, r2, temp); | ||
1162 | - tcg_temp_free(temp); | ||
1163 | } | ||
1164 | |||
1165 | static inline void gen_msubsui_32(TCGv ret, TCGv r1, TCGv r2, int32_t con) | ||
1166 | { | ||
1167 | TCGv temp = tcg_const_i32(con); | ||
1168 | gen_helper_msub32_suov(ret, cpu_env, r1, r2, temp); | ||
1169 | - tcg_temp_free(temp); | ||
1170 | } | ||
1171 | |||
1172 | static inline void | ||
1173 | @@ -XXX,XX +XXX,XX @@ gen_msubs_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
1174 | tcg_gen_concat_i32_i64(temp64, r2_low, r2_high); | ||
1175 | gen_helper_msub64_ssov(temp64, cpu_env, r1, temp64, r3); | ||
1176 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64); | ||
1177 | - tcg_temp_free_i64(temp64); | ||
1178 | } | ||
1179 | |||
1180 | static inline void | ||
1181 | @@ -XXX,XX +XXX,XX @@ gen_msubsi_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
1182 | { | ||
1183 | TCGv temp = tcg_const_i32(con); | ||
1184 | gen_msubs_64(ret_low, ret_high, r1, r2_low, r2_high, temp); | ||
1185 | - tcg_temp_free(temp); | ||
1186 | } | ||
1187 | |||
1188 | static inline void | ||
1189 | @@ -XXX,XX +XXX,XX @@ gen_msubsu_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
1190 | tcg_gen_concat_i32_i64(temp64, r2_low, r2_high); | ||
1191 | gen_helper_msub64_suov(temp64, cpu_env, r1, temp64, r3); | ||
1192 | tcg_gen_extr_i64_i32(ret_low, ret_high, temp64); | ||
1193 | - tcg_temp_free_i64(temp64); | ||
1194 | } | ||
1195 | |||
1196 | static inline void | ||
1197 | @@ -XXX,XX +XXX,XX @@ gen_msubsui_64(TCGv ret_low, TCGv ret_high, TCGv r1, TCGv r2_low, TCGv r2_high, | ||
1198 | { | ||
1199 | TCGv temp = tcg_const_i32(con); | ||
1200 | gen_msubsu_64(ret_low, ret_high, r1, r2_low, r2_high, temp); | ||
1201 | - tcg_temp_free(temp); | ||
1202 | } | ||
1203 | |||
1204 | static void gen_saturate(TCGv ret, TCGv arg, int32_t up, int32_t low) | ||
1205 | @@ -XXX,XX +XXX,XX @@ static void gen_saturate(TCGv ret, TCGv arg, int32_t up, int32_t low) | ||
1206 | |||
1207 | /* ret = (sat_neg > up ) ? up : sat_neg; */ | ||
1208 | tcg_gen_movcond_tl(TCG_COND_GT, ret, sat_neg, temp, temp, sat_neg); | ||
1209 | - | ||
1210 | - tcg_temp_free(sat_neg); | ||
1211 | - tcg_temp_free(temp); | ||
1212 | } | ||
1213 | |||
1214 | static void gen_saturate_u(TCGv ret, TCGv arg, int32_t up) | ||
1215 | @@ -XXX,XX +XXX,XX @@ static void gen_saturate_u(TCGv ret, TCGv arg, int32_t up) | ||
1216 | TCGv temp = tcg_const_i32(up); | ||
1217 | /* sat_neg = (arg > up ) ? up : arg; */ | ||
1218 | tcg_gen_movcond_tl(TCG_COND_GTU, ret, arg, temp, temp, arg); | ||
1219 | - tcg_temp_free(temp); | ||
1220 | } | ||
1221 | |||
1222 | static void gen_shi(TCGv ret, TCGv r1, int32_t shift_count) | ||
1223 | @@ -XXX,XX +XXX,XX @@ static void gen_sh_hi(TCGv ret, TCGv r1, int32_t shiftcount) | ||
1224 | gen_shi(temp_low, temp_low, shiftcount); | ||
1225 | gen_shi(ret, temp_high, shiftcount); | ||
1226 | tcg_gen_deposit_tl(ret, ret, temp_low, 0, 16); | ||
1227 | - | ||
1228 | - tcg_temp_free(temp_low); | ||
1229 | - tcg_temp_free(temp_high); | ||
1230 | } | ||
1231 | } | ||
1232 | |||
1233 | @@ -XXX,XX +XXX,XX @@ static void gen_shaci(TCGv ret, TCGv r1, int32_t shift_count) | ||
1234 | uint32_t msk, msk_start; | ||
1235 | TCGv temp = tcg_temp_new(); | ||
1236 | TCGv temp2 = tcg_temp_new(); | ||
1237 | - TCGv t_0 = tcg_const_i32(0); | ||
1238 | |||
1239 | if (shift_count == 0) { | ||
1240 | /* Clear PSW.C and PSW.V */ | ||
1241 | @@ -XXX,XX +XXX,XX @@ static void gen_shaci(TCGv ret, TCGv r1, int32_t shift_count) | ||
1242 | tcg_gen_or_tl(cpu_PSW_SV, cpu_PSW_V, cpu_PSW_SV); | ||
1243 | /* do shift */ | ||
1244 | tcg_gen_shli_tl(ret, r1, shift_count); | ||
1245 | - | ||
1246 | - tcg_temp_free(t_max); | ||
1247 | - tcg_temp_free(t_min); | ||
1248 | } else { | ||
1249 | /* clear PSW.V */ | ||
1250 | tcg_gen_movi_tl(cpu_PSW_V, 0); | ||
1251 | @@ -XXX,XX +XXX,XX @@ static void gen_shaci(TCGv ret, TCGv r1, int32_t shift_count) | ||
1252 | tcg_gen_xor_tl(cpu_PSW_AV, ret, cpu_PSW_AV); | ||
1253 | /* calc sav overflow bit */ | ||
1254 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
1255 | - | ||
1256 | - tcg_temp_free(temp); | ||
1257 | - tcg_temp_free(temp2); | ||
1258 | - tcg_temp_free(t_0); | ||
1259 | } | ||
1260 | |||
1261 | static void gen_shas(TCGv ret, TCGv r1, TCGv r2) | ||
1262 | @@ -XXX,XX +XXX,XX @@ static void gen_shasi(TCGv ret, TCGv r1, int32_t con) | ||
1263 | { | ||
1264 | TCGv temp = tcg_const_i32(con); | ||
1265 | gen_shas(ret, r1, temp); | ||
1266 | - tcg_temp_free(temp); | ||
1267 | } | ||
1268 | |||
1269 | static void gen_sha_hi(TCGv ret, TCGv r1, int32_t shift_count) | ||
1270 | @@ -XXX,XX +XXX,XX @@ static void gen_sha_hi(TCGv ret, TCGv r1, int32_t shift_count) | ||
1271 | tcg_gen_shli_tl(low, r1, shift_count); | ||
1272 | tcg_gen_shli_tl(ret, high, shift_count); | ||
1273 | tcg_gen_deposit_tl(ret, ret, low, 0, 16); | ||
1274 | - | ||
1275 | - tcg_temp_free(low); | ||
1276 | - tcg_temp_free(high); | ||
1277 | } else { | ||
1278 | low = tcg_temp_new(); | ||
1279 | high = tcg_temp_new(); | ||
1280 | @@ -XXX,XX +XXX,XX @@ static void gen_sha_hi(TCGv ret, TCGv r1, int32_t shift_count) | ||
1281 | tcg_gen_sari_tl(low, low, -shift_count); | ||
1282 | tcg_gen_sari_tl(ret, r1, -shift_count); | ||
1283 | tcg_gen_deposit_tl(ret, ret, low, 0, 16); | ||
1284 | - | ||
1285 | - tcg_temp_free(low); | ||
1286 | - tcg_temp_free(high); | ||
1287 | } | ||
1288 | - | ||
1289 | } | ||
1290 | |||
1291 | /* ret = {ret[30:0], (r1 cond r2)}; */ | ||
1292 | @@ -XXX,XX +XXX,XX @@ static void gen_sh_cond(int cond, TCGv ret, TCGv r1, TCGv r2) | ||
1293 | tcg_gen_shli_tl(temp, ret, 1); | ||
1294 | tcg_gen_setcond_tl(cond, temp2, r1, r2); | ||
1295 | tcg_gen_or_tl(ret, temp, temp2); | ||
1296 | - | ||
1297 | - tcg_temp_free(temp); | ||
1298 | - tcg_temp_free(temp2); | ||
1299 | } | ||
1300 | |||
1301 | static void gen_sh_condi(int cond, TCGv ret, TCGv r1, int32_t con) | ||
1302 | { | ||
1303 | TCGv temp = tcg_const_i32(con); | ||
1304 | gen_sh_cond(cond, ret, r1, temp); | ||
1305 | - tcg_temp_free(temp); | ||
1306 | } | ||
1307 | |||
1308 | static inline void gen_adds(TCGv ret, TCGv r1, TCGv r2) | ||
1309 | @@ -XXX,XX +XXX,XX @@ static inline void gen_addsi(TCGv ret, TCGv r1, int32_t con) | ||
1310 | { | ||
1311 | TCGv temp = tcg_const_i32(con); | ||
1312 | gen_helper_add_ssov(ret, cpu_env, r1, temp); | ||
1313 | - tcg_temp_free(temp); | ||
1314 | } | ||
1315 | |||
1316 | static inline void gen_addsui(TCGv ret, TCGv r1, int32_t con) | ||
1317 | { | ||
1318 | TCGv temp = tcg_const_i32(con); | ||
1319 | gen_helper_add_suov(ret, cpu_env, r1, temp); | ||
1320 | - tcg_temp_free(temp); | ||
1321 | } | ||
1322 | |||
1323 | static inline void gen_subs(TCGv ret, TCGv r1, TCGv r2) | ||
1324 | @@ -XXX,XX +XXX,XX @@ static inline void gen_bit_2op(TCGv ret, TCGv r1, TCGv r2, | ||
1325 | (*op2)(temp1 , ret, temp1); | ||
1326 | |||
1327 | tcg_gen_deposit_tl(ret, ret, temp1, 0, 1); | ||
1328 | - | ||
1329 | - tcg_temp_free(temp1); | ||
1330 | - tcg_temp_free(temp2); | ||
1331 | } | ||
1332 | |||
1333 | /* ret = r1[pos1] op1 r2[pos2]; */ | ||
1334 | @@ -XXX,XX +XXX,XX @@ static inline void gen_bit_1op(TCGv ret, TCGv r1, TCGv r2, | ||
1335 | (*op1)(ret, temp1, temp2); | ||
1336 | |||
1337 | tcg_gen_andi_tl(ret, ret, 0x1); | ||
1338 | - | ||
1339 | - tcg_temp_free(temp1); | ||
1340 | - tcg_temp_free(temp2); | ||
1341 | } | ||
1342 | |||
1343 | static inline void gen_accumulating_cond(int cond, TCGv ret, TCGv r1, TCGv r2, | ||
1344 | @@ -XXX,XX +XXX,XX @@ static inline void gen_accumulating_cond(int cond, TCGv ret, TCGv r1, TCGv r2, | ||
1345 | (*op)(temp, temp, temp2); | ||
1346 | /* ret = {ret[31:1], temp} */ | ||
1347 | tcg_gen_deposit_tl(ret, ret, temp, 0, 1); | ||
1348 | - | ||
1349 | - tcg_temp_free(temp); | ||
1350 | - tcg_temp_free(temp2); | ||
1351 | } | ||
1352 | |||
1353 | static inline void | ||
1354 | @@ -XXX,XX +XXX,XX @@ gen_accumulating_condi(int cond, TCGv ret, TCGv r1, int32_t con, | ||
1355 | { | ||
1356 | TCGv temp = tcg_const_i32(con); | ||
1357 | gen_accumulating_cond(cond, ret, r1, temp, op); | ||
1358 | - tcg_temp_free(temp); | ||
1359 | } | ||
1360 | |||
1361 | /* ret = (r1 cond r2) ? 0xFFFFFFFF ? 0x00000000;*/ | ||
1362 | @@ -XXX,XX +XXX,XX @@ static inline void gen_eqany_bi(TCGv ret, TCGv r1, int32_t con) | ||
1363 | tcg_gen_or_tl(ret, b0, b1); | ||
1364 | tcg_gen_or_tl(ret, ret, b2); | ||
1365 | tcg_gen_or_tl(ret, ret, b3); | ||
1366 | - | ||
1367 | - tcg_temp_free(b0); | ||
1368 | - tcg_temp_free(b1); | ||
1369 | - tcg_temp_free(b2); | ||
1370 | - tcg_temp_free(b3); | ||
1371 | } | ||
1372 | |||
1373 | static inline void gen_eqany_hi(TCGv ret, TCGv r1, int32_t con) | ||
1374 | @@ -XXX,XX +XXX,XX @@ static inline void gen_eqany_hi(TCGv ret, TCGv r1, int32_t con) | ||
1375 | |||
1376 | /* combine them */ | ||
1377 | tcg_gen_or_tl(ret, h0, h1); | ||
1378 | - | ||
1379 | - tcg_temp_free(h0); | ||
1380 | - tcg_temp_free(h1); | ||
1381 | } | ||
1382 | + | ||
1383 | /* mask = ((1 << width) -1) << pos; | ||
1384 | ret = (r1 & ~mask) | (r2 << pos) & mask); */ | ||
1385 | static inline void gen_insert(TCGv ret, TCGv r1, TCGv r2, TCGv width, TCGv pos) | ||
1386 | @@ -XXX,XX +XXX,XX @@ static inline void gen_insert(TCGv ret, TCGv r1, TCGv r2, TCGv width, TCGv pos) | ||
1387 | tcg_gen_and_tl(temp, temp, mask); | ||
1388 | tcg_gen_andc_tl(temp2, r1, mask); | ||
1389 | tcg_gen_or_tl(ret, temp, temp2); | ||
1390 | - | ||
1391 | - tcg_temp_free(mask); | ||
1392 | - tcg_temp_free(temp); | ||
1393 | - tcg_temp_free(temp2); | ||
1394 | } | ||
1395 | |||
1396 | static inline void gen_bsplit(TCGv rl, TCGv rh, TCGv r1) | ||
1397 | @@ -XXX,XX +XXX,XX @@ static inline void gen_bsplit(TCGv rl, TCGv rh, TCGv r1) | ||
1398 | |||
1399 | gen_helper_bsplit(temp, r1); | ||
1400 | tcg_gen_extr_i64_i32(rl, rh, temp); | ||
1401 | - | ||
1402 | - tcg_temp_free_i64(temp); | ||
1403 | } | ||
1404 | |||
1405 | static inline void gen_unpack(TCGv rl, TCGv rh, TCGv r1) | ||
1406 | @@ -XXX,XX +XXX,XX @@ static inline void gen_unpack(TCGv rl, TCGv rh, TCGv r1) | ||
1407 | |||
1408 | gen_helper_unpack(temp, r1); | ||
1409 | tcg_gen_extr_i64_i32(rl, rh, temp); | ||
1410 | - | ||
1411 | - tcg_temp_free_i64(temp); | ||
1412 | } | ||
1413 | |||
1414 | static inline void | ||
1415 | @@ -XXX,XX +XXX,XX @@ gen_dvinit_b(DisasContext *ctx, TCGv rl, TCGv rh, TCGv r1, TCGv r2) | ||
1416 | gen_helper_dvinit_b_131(ret, cpu_env, r1, r2); | ||
1417 | } | ||
1418 | tcg_gen_extr_i64_i32(rl, rh, ret); | ||
1419 | - | ||
1420 | - tcg_temp_free_i64(ret); | ||
1421 | } | ||
1422 | |||
1423 | static inline void | ||
1424 | @@ -XXX,XX +XXX,XX @@ gen_dvinit_h(DisasContext *ctx, TCGv rl, TCGv rh, TCGv r1, TCGv r2) | ||
1425 | gen_helper_dvinit_h_131(ret, cpu_env, r1, r2); | ||
1426 | } | ||
1427 | tcg_gen_extr_i64_i32(rl, rh, ret); | ||
1428 | - | ||
1429 | - tcg_temp_free_i64(ret); | ||
1430 | } | ||
1431 | |||
1432 | static void gen_calc_usb_mul_h(TCGv arg_low, TCGv arg_high) | ||
1433 | @@ -XXX,XX +XXX,XX @@ static void gen_calc_usb_mul_h(TCGv arg_low, TCGv arg_high) | ||
1434 | /* calc SAV bit */ | ||
1435 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
1436 | tcg_gen_movi_tl(cpu_PSW_V, 0); | ||
1437 | - tcg_temp_free(temp); | ||
1438 | } | ||
1439 | |||
1440 | static void gen_calc_usb_mulr_h(TCGv arg) | ||
1441 | @@ -XXX,XX +XXX,XX @@ static void gen_calc_usb_mulr_h(TCGv arg) | ||
1442 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
1443 | /* clear V bit */ | ||
1444 | tcg_gen_movi_tl(cpu_PSW_V, 0); | ||
1445 | - tcg_temp_free(temp); | ||
1446 | } | ||
1447 | |||
1448 | /* helpers for generating program flow micro-ops */ | ||
1449 | @@ -XXX,XX +XXX,XX @@ static void generate_trap(DisasContext *ctx, int class, int tin) | ||
1450 | gen_save_pc(ctx->base.pc_next); | ||
1451 | gen_helper_raise_exception_sync(cpu_env, classtemp, tintemp); | ||
1452 | ctx->base.is_jmp = DISAS_NORETURN; | ||
1453 | - | ||
1454 | - tcg_temp_free(classtemp); | ||
1455 | - tcg_temp_free(tintemp); | ||
1456 | } | ||
1457 | |||
1458 | static inline void gen_branch_cond(DisasContext *ctx, TCGCond cond, TCGv r1, | ||
1459 | @@ -XXX,XX +XXX,XX @@ static inline void gen_branch_condi(DisasContext *ctx, TCGCond cond, TCGv r1, | ||
1460 | { | ||
1461 | TCGv temp = tcg_const_i32(r2); | ||
1462 | gen_branch_cond(ctx, cond, r1, temp, address); | ||
1463 | - tcg_temp_free(temp); | ||
1464 | } | ||
1465 | |||
1466 | static void gen_loop(DisasContext *ctx, int r1, int32_t offset) | ||
1467 | @@ -XXX,XX +XXX,XX @@ static void gen_fcall_save_ctx(DisasContext *ctx) | ||
1468 | tcg_gen_qemu_st_tl(cpu_gpr_a[11], temp, ctx->mem_idx, MO_LESL); | ||
1469 | tcg_gen_movi_tl(cpu_gpr_a[11], ctx->pc_succ_insn); | ||
1470 | tcg_gen_mov_tl(cpu_gpr_a[10], temp); | ||
1471 | - | ||
1472 | - tcg_temp_free(temp); | ||
1473 | } | ||
1474 | |||
1475 | static void gen_fret(DisasContext *ctx) | ||
1476 | @@ -XXX,XX +XXX,XX @@ static void gen_fret(DisasContext *ctx) | ||
1477 | tcg_gen_mov_tl(cpu_PC, temp); | ||
1478 | tcg_gen_exit_tb(NULL, 0); | ||
1479 | ctx->base.is_jmp = DISAS_NORETURN; | ||
1480 | - | ||
1481 | - tcg_temp_free(temp); | ||
1482 | } | ||
1483 | |||
1484 | static void gen_compute_branch(DisasContext *ctx, uint32_t opc, int r1, | ||
1485 | @@ -XXX,XX +XXX,XX @@ static void gen_compute_branch(DisasContext *ctx, uint32_t opc, int r1, | ||
1486 | temp = tcg_temp_new(); | ||
1487 | tcg_gen_andi_tl(temp, cpu_gpr_d[15], 0x1u << constant); | ||
1488 | gen_branch_condi(ctx, TCG_COND_EQ, temp, 0, offset); | ||
1489 | - tcg_temp_free(temp); | ||
1490 | break; | ||
1491 | case OPC1_16_SBRN_JNZ_T: | ||
1492 | temp = tcg_temp_new(); | ||
1493 | tcg_gen_andi_tl(temp, cpu_gpr_d[15], 0x1u << constant); | ||
1494 | gen_branch_condi(ctx, TCG_COND_NE, temp, 0, offset); | ||
1495 | - tcg_temp_free(temp); | ||
1496 | break; | ||
1497 | /* SBR-format jumps */ | ||
1498 | case OPC1_16_SBR_JEQ: | ||
1499 | @@ -XXX,XX +XXX,XX @@ static void gen_compute_branch(DisasContext *ctx, uint32_t opc, int r1, | ||
1500 | tcg_gen_addi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1); | ||
1501 | gen_branch_condi(ctx, TCG_COND_NE, temp, constant, offset); | ||
1502 | } | ||
1503 | - tcg_temp_free(temp); | ||
1504 | break; | ||
1505 | /* BRN format */ | ||
1506 | case OPCM_32_BRN_JTT: | ||
1507 | @@ -XXX,XX +XXX,XX @@ static void gen_compute_branch(DisasContext *ctx, uint32_t opc, int r1, | ||
1508 | } else { | ||
1509 | gen_branch_condi(ctx, TCG_COND_EQ, temp, 0, offset); | ||
1510 | } | ||
1511 | - tcg_temp_free(temp); | ||
1512 | break; | ||
1513 | /* BRR Format */ | ||
1514 | case OPCM_32_BRR_EQ_NEQ: | ||
1515 | @@ -XXX,XX +XXX,XX @@ static void gen_compute_branch(DisasContext *ctx, uint32_t opc, int r1, | ||
1516 | tcg_gen_addi_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 1); | ||
1517 | gen_branch_cond(ctx, TCG_COND_NE, temp, temp2, offset); | ||
1518 | } | ||
1519 | - tcg_temp_free(temp); | ||
1520 | - tcg_temp_free(temp2); | ||
1521 | break; | ||
1522 | case OPCM_32_BRR_JNZ: | ||
1523 | if (MASK_OP_BRR_OP2(ctx->opcode) == OPC2_32_BRR_JNZ_A) { | ||
1524 | @@ -XXX,XX +XXX,XX @@ static void decode_src_opc(DisasContext *ctx, int op1) | ||
1525 | temp2 = tcg_const_tl(const4); | ||
1526 | tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[15], temp, | ||
1527 | temp2, cpu_gpr_d[r1]); | ||
1528 | - tcg_temp_free(temp); | ||
1529 | - tcg_temp_free(temp2); | ||
1530 | break; | ||
1531 | case OPC1_16_SRC_CMOVN: | ||
1532 | temp = tcg_const_tl(0); | ||
1533 | temp2 = tcg_const_tl(const4); | ||
1534 | tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[15], temp, | ||
1535 | temp2, cpu_gpr_d[r1]); | ||
1536 | - tcg_temp_free(temp); | ||
1537 | - tcg_temp_free(temp2); | ||
1538 | break; | ||
1539 | case OPC1_16_SRC_EQ: | ||
1540 | tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_gpr_d[15], cpu_gpr_d[r1], | ||
1541 | @@ -XXX,XX +XXX,XX @@ static void decode_srr_opc(DisasContext *ctx, int op1) | ||
1542 | temp = tcg_const_tl(0); | ||
1543 | tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r1], cpu_gpr_d[15], temp, | ||
1544 | cpu_gpr_d[r2], cpu_gpr_d[r1]); | ||
1545 | - tcg_temp_free(temp); | ||
1546 | break; | ||
1547 | case OPC1_16_SRR_CMOVN: | ||
1548 | temp = tcg_const_tl(0); | ||
1549 | tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r1], cpu_gpr_d[15], temp, | ||
1550 | cpu_gpr_d[r2], cpu_gpr_d[r1]); | ||
1551 | - tcg_temp_free(temp); | ||
1552 | break; | ||
1553 | case OPC1_16_SRR_EQ: | ||
1554 | tcg_gen_setcond_tl(TCG_COND_EQ, cpu_gpr_d[15], cpu_gpr_d[r1], | ||
1555 | @@ -XXX,XX +XXX,XX @@ static void decode_sr_accu(DisasContext *ctx) | ||
1556 | tcg_gen_xor_tl(cpu_PSW_AV, cpu_gpr_d[r1], cpu_PSW_AV); | ||
1557 | /* calc sav */ | ||
1558 | tcg_gen_or_tl(cpu_PSW_SAV, cpu_PSW_SAV, cpu_PSW_AV); | ||
1559 | - tcg_temp_free(temp); | ||
1560 | break; | ||
1561 | case OPC2_16_SR_SAT_B: | ||
1562 | gen_saturate(cpu_gpr_d[r1], cpu_gpr_d[r1], 0x7f, -0x80); | ||
1563 | @@ -XXX,XX +XXX,XX @@ static void decode_16Bit_opc(DisasContext *ctx) | ||
1564 | temp = tcg_temp_new(); | ||
1565 | tcg_gen_shli_tl(temp, cpu_gpr_d[15], const16); | ||
1566 | tcg_gen_add_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], temp); | ||
1567 | - tcg_temp_free(temp); | ||
1568 | break; | ||
1569 | /* SLRO-format */ | ||
1570 | case OPC1_16_SLRO_LD_A: | ||
1571 | @@ -XXX,XX +XXX,XX @@ static void decode_abs_ldw(DisasContext *ctx) | ||
1572 | default: | ||
1573 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1574 | } | ||
1575 | - | ||
1576 | - tcg_temp_free(temp); | ||
1577 | } | ||
1578 | |||
1579 | static void decode_abs_ldb(DisasContext *ctx) | ||
1580 | @@ -XXX,XX +XXX,XX @@ static void decode_abs_ldb(DisasContext *ctx) | ||
1581 | default: | ||
1582 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1583 | } | ||
1584 | - | ||
1585 | - tcg_temp_free(temp); | ||
1586 | } | ||
1587 | |||
1588 | static void decode_abs_ldst_swap(DisasContext *ctx) | ||
1589 | @@ -XXX,XX +XXX,XX @@ static void decode_abs_ldst_swap(DisasContext *ctx) | ||
1590 | default: | ||
1591 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1592 | } | ||
1593 | - | ||
1594 | - tcg_temp_free(temp); | ||
1595 | } | ||
1596 | |||
1597 | static void decode_abs_ldst_context(DisasContext *ctx) | ||
1598 | @@ -XXX,XX +XXX,XX @@ static void decode_abs_store(DisasContext *ctx) | ||
1599 | default: | ||
1600 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1601 | } | ||
1602 | - tcg_temp_free(temp); | ||
1603 | } | ||
1604 | |||
1605 | static void decode_abs_storeb_h(DisasContext *ctx) | ||
1606 | @@ -XXX,XX +XXX,XX @@ static void decode_abs_storeb_h(DisasContext *ctx) | ||
1607 | default: | ||
1608 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1609 | } | ||
1610 | - tcg_temp_free(temp); | ||
1611 | } | ||
1612 | |||
1613 | /* Bit-format */ | ||
1614 | @@ -XXX,XX +XXX,XX @@ static void decode_bit_insert(DisasContext *ctx) | ||
1615 | tcg_gen_not_tl(temp, temp); | ||
1616 | } | ||
1617 | tcg_gen_deposit_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], temp, pos1, 1); | ||
1618 | - tcg_temp_free(temp); | ||
1619 | } | ||
1620 | |||
1621 | static void decode_bit_logical_t2(DisasContext *ctx) | ||
1622 | @@ -XXX,XX +XXX,XX @@ static void decode_bit_sh_logic1(DisasContext *ctx) | ||
1623 | } | ||
1624 | tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], 1); | ||
1625 | tcg_gen_add_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], temp); | ||
1626 | - tcg_temp_free(temp); | ||
1627 | } | ||
1628 | |||
1629 | static void decode_bit_sh_logic2(DisasContext *ctx) | ||
1630 | @@ -XXX,XX +XXX,XX @@ static void decode_bit_sh_logic2(DisasContext *ctx) | ||
1631 | } | ||
1632 | tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], 1); | ||
1633 | tcg_gen_add_tl(cpu_gpr_d[r3], cpu_gpr_d[r3], temp); | ||
1634 | - tcg_temp_free(temp); | ||
1635 | } | ||
1636 | |||
1637 | /* BO-format */ | ||
1638 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_post_pre_base(DisasContext *ctx) | ||
1639 | tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); | ||
1640 | gen_st_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp, ctx); | ||
1641 | tcg_gen_mov_tl(cpu_gpr_a[r2], temp); | ||
1642 | - tcg_temp_free(temp); | ||
1643 | break; | ||
1644 | case OPC2_32_BO_ST_DA_SHORTOFF: | ||
1645 | CHECK_REG_PAIR(r1); | ||
1646 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_post_pre_base(DisasContext *ctx) | ||
1647 | tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); | ||
1648 | gen_st_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp, ctx); | ||
1649 | tcg_gen_mov_tl(cpu_gpr_a[r2], temp); | ||
1650 | - tcg_temp_free(temp); | ||
1651 | break; | ||
1652 | case OPC2_32_BO_ST_H_SHORTOFF: | ||
1653 | gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUW); | ||
1654 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_post_pre_base(DisasContext *ctx) | ||
1655 | temp = tcg_temp_new(); | ||
1656 | tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16); | ||
1657 | gen_offset_st(ctx, temp, cpu_gpr_a[r2], off10, MO_LEUW); | ||
1658 | - tcg_temp_free(temp); | ||
1659 | break; | ||
1660 | case OPC2_32_BO_ST_Q_POSTINC: | ||
1661 | temp = tcg_temp_new(); | ||
1662 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_post_pre_base(DisasContext *ctx) | ||
1663 | tcg_gen_qemu_st_tl(temp, cpu_gpr_a[r2], ctx->mem_idx, | ||
1664 | MO_LEUW); | ||
1665 | tcg_gen_addi_tl(cpu_gpr_a[r2], cpu_gpr_a[r2], off10); | ||
1666 | - tcg_temp_free(temp); | ||
1667 | break; | ||
1668 | case OPC2_32_BO_ST_Q_PREINC: | ||
1669 | temp = tcg_temp_new(); | ||
1670 | tcg_gen_shri_tl(temp, cpu_gpr_d[r1], 16); | ||
1671 | gen_st_preincr(ctx, temp, cpu_gpr_a[r2], off10, MO_LEUW); | ||
1672 | - tcg_temp_free(temp); | ||
1673 | break; | ||
1674 | case OPC2_32_BO_ST_W_SHORTOFF: | ||
1675 | gen_offset_st(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LEUL); | ||
1676 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_bitreverse_circular(DisasContext *ctx) | ||
1677 | default: | ||
1678 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1679 | } | ||
1680 | - tcg_temp_free(temp); | ||
1681 | - tcg_temp_free(temp2); | ||
1682 | - tcg_temp_free(temp3); | ||
1683 | } | ||
1684 | |||
1685 | static void decode_bo_addrmode_ld_post_pre_base(DisasContext *ctx) | ||
1686 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_ld_post_pre_base(DisasContext *ctx) | ||
1687 | tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); | ||
1688 | gen_ld_2regs_64(cpu_gpr_d[r1+1], cpu_gpr_d[r1], temp, ctx); | ||
1689 | tcg_gen_mov_tl(cpu_gpr_a[r2], temp); | ||
1690 | - tcg_temp_free(temp); | ||
1691 | break; | ||
1692 | case OPC2_32_BO_LD_DA_SHORTOFF: | ||
1693 | CHECK_REG_PAIR(r1); | ||
1694 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_ld_post_pre_base(DisasContext *ctx) | ||
1695 | tcg_gen_addi_tl(temp, cpu_gpr_a[r2], off10); | ||
1696 | gen_ld_2regs_64(cpu_gpr_a[r1+1], cpu_gpr_a[r1], temp, ctx); | ||
1697 | tcg_gen_mov_tl(cpu_gpr_a[r2], temp); | ||
1698 | - tcg_temp_free(temp); | ||
1699 | break; | ||
1700 | case OPC2_32_BO_LD_H_SHORTOFF: | ||
1701 | gen_offset_ld(ctx, cpu_gpr_d[r1], cpu_gpr_a[r2], off10, MO_LESW); | ||
1702 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_ld_bitreverse_circular(DisasContext *ctx) | ||
1703 | default: | ||
1704 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1705 | } | ||
1706 | - tcg_temp_free(temp); | ||
1707 | - tcg_temp_free(temp2); | ||
1708 | - tcg_temp_free(temp3); | ||
1709 | } | ||
1710 | |||
1711 | static void decode_bo_addrmode_stctx_post_pre_base(DisasContext *ctx) | ||
1712 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_stctx_post_pre_base(DisasContext *ctx) | ||
1713 | uint32_t off10; | ||
1714 | int r1, r2; | ||
1715 | |||
1716 | - TCGv temp, temp2; | ||
1717 | + TCGv temp; | ||
1718 | |||
1719 | r1 = MASK_OP_BO_S1D(ctx->opcode); | ||
1720 | r2 = MASK_OP_BO_S2(ctx->opcode); | ||
1721 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_stctx_post_pre_base(DisasContext *ctx) | ||
1722 | |||
1723 | |||
1724 | temp = tcg_temp_new(); | ||
1725 | - temp2 = tcg_temp_new(); | ||
1726 | |||
1727 | switch (op2) { | ||
1728 | case OPC2_32_BO_LDLCX_SHORTOFF: | ||
1729 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_stctx_post_pre_base(DisasContext *ctx) | ||
1730 | default: | ||
1731 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1732 | } | ||
1733 | - tcg_temp_free(temp); | ||
1734 | - tcg_temp_free(temp2); | ||
1735 | } | ||
1736 | |||
1737 | static void decode_bo_addrmode_ldmst_bitreverse_circular(DisasContext *ctx) | ||
1738 | @@ -XXX,XX +XXX,XX @@ static void decode_bo_addrmode_ldmst_bitreverse_circular(DisasContext *ctx) | ||
1739 | default: | ||
1740 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1741 | } | ||
1742 | - | ||
1743 | - tcg_temp_free(temp); | ||
1744 | - tcg_temp_free(temp2); | ||
1745 | - tcg_temp_free(temp3); | ||
1746 | } | ||
1747 | |||
1748 | static void decode_bol_opc(DisasContext *ctx, int32_t op1) | ||
1749 | @@ -XXX,XX +XXX,XX @@ static void decode_bol_opc(DisasContext *ctx, int32_t op1) | ||
1750 | temp = tcg_temp_new(); | ||
1751 | tcg_gen_addi_tl(temp, cpu_gpr_a[r2], address); | ||
1752 | tcg_gen_qemu_ld_tl(cpu_gpr_a[r1], temp, ctx->mem_idx, MO_LEUL); | ||
1753 | - tcg_temp_free(temp); | ||
1754 | break; | ||
1755 | case OPC1_32_BOL_LD_W_LONGOFF: | ||
1756 | temp = tcg_temp_new(); | ||
1757 | tcg_gen_addi_tl(temp, cpu_gpr_a[r2], address); | ||
1758 | tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUL); | ||
1759 | - tcg_temp_free(temp); | ||
1760 | break; | ||
1761 | case OPC1_32_BOL_LEA_LONGOFF: | ||
1762 | tcg_gen_addi_tl(cpu_gpr_a[r1], cpu_gpr_a[r2], address); | ||
1763 | @@ -XXX,XX +XXX,XX @@ static void decode_rc_logical_shift(DisasContext *ctx) | ||
1764 | default: | ||
1765 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1766 | } | ||
1767 | - tcg_temp_free(temp); | ||
1768 | } | ||
1769 | |||
1770 | static void decode_rc_accumulator(DisasContext *ctx) | ||
1771 | @@ -XXX,XX +XXX,XX @@ static void decode_rc_accumulator(DisasContext *ctx) | ||
1772 | default: | ||
1773 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1774 | } | ||
1775 | - tcg_temp_free(temp); | ||
1776 | } | ||
1777 | |||
1778 | static void decode_rc_serviceroutine(DisasContext *ctx) | ||
1779 | @@ -XXX,XX +XXX,XX @@ static void decode_rcpw_insert(DisasContext *ctx) | ||
1780 | if (pos + width <= 32) { | ||
1781 | temp = tcg_const_i32(const4); | ||
1782 | tcg_gen_deposit_tl(cpu_gpr_d[r2], cpu_gpr_d[r1], temp, pos, width); | ||
1783 | - tcg_temp_free(temp); | ||
1784 | } | ||
1785 | break; | ||
1786 | default: | ||
1787 | @@ -XXX,XX +XXX,XX @@ static void decode_rcrw_insert(DisasContext *ctx) | ||
1788 | tcg_gen_movi_tl(temp2, const4); | ||
1789 | tcg_gen_andi_tl(temp3, cpu_gpr_d[r3], 0x1f); | ||
1790 | gen_insert(cpu_gpr_d[r4], cpu_gpr_d[r1], temp2, temp, temp3); | ||
1791 | - | ||
1792 | - tcg_temp_free(temp3); | ||
1793 | break; | ||
1794 | default: | ||
1795 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1796 | } | ||
1797 | - tcg_temp_free(temp); | ||
1798 | - tcg_temp_free(temp2); | ||
1799 | } | ||
1800 | |||
1801 | /* RCR format */ | ||
1802 | @@ -XXX,XX +XXX,XX @@ static void decode_rcr_cond_select(DisasContext *ctx) | ||
1803 | temp2 = tcg_const_i32(const9); | ||
1804 | tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r4], cpu_gpr_d[r3], temp, | ||
1805 | cpu_gpr_d[r1], temp2); | ||
1806 | - tcg_temp_free(temp); | ||
1807 | - tcg_temp_free(temp2); | ||
1808 | break; | ||
1809 | case OPC2_32_RCR_SELN: | ||
1810 | temp = tcg_const_i32(0); | ||
1811 | temp2 = tcg_const_i32(const9); | ||
1812 | tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r4], cpu_gpr_d[r3], temp, | ||
1813 | cpu_gpr_d[r1], temp2); | ||
1814 | - tcg_temp_free(temp); | ||
1815 | - tcg_temp_free(temp2); | ||
1816 | break; | ||
1817 | default: | ||
1818 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1819 | @@ -XXX,XX +XXX,XX @@ static void decode_rr_accumulator(DisasContext *ctx) | ||
1820 | tcg_gen_mov_tl(temp, cpu_gpr_d[r1]); | ||
1821 | tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r2]); | ||
1822 | tcg_gen_mov_tl(cpu_gpr_d[r3 + 1], temp); | ||
1823 | - | ||
1824 | - tcg_temp_free(temp); | ||
1825 | } else { | ||
1826 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1827 | } | ||
1828 | @@ -XXX,XX +XXX,XX @@ static void decode_rr_logical_shift(DisasContext *ctx) | ||
1829 | { | ||
1830 | uint32_t op2; | ||
1831 | int r3, r2, r1; | ||
1832 | - TCGv temp; | ||
1833 | |||
1834 | r3 = MASK_OP_RR_D(ctx->opcode); | ||
1835 | r2 = MASK_OP_RR_S2(ctx->opcode); | ||
1836 | r1 = MASK_OP_RR_S1(ctx->opcode); | ||
1837 | - | ||
1838 | - temp = tcg_temp_new(); | ||
1839 | op2 = MASK_OP_RR_OP2(ctx->opcode); | ||
1840 | |||
1841 | switch (op2) { | ||
1842 | @@ -XXX,XX +XXX,XX @@ static void decode_rr_logical_shift(DisasContext *ctx) | ||
1843 | default: | ||
1844 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1845 | } | ||
1846 | - tcg_temp_free(temp); | ||
1847 | } | ||
1848 | |||
1849 | static void decode_rr_address(DisasContext *ctx) | ||
1850 | @@ -XXX,XX +XXX,XX @@ static void decode_rr_address(DisasContext *ctx) | ||
1851 | temp = tcg_temp_new(); | ||
1852 | tcg_gen_shli_tl(temp, cpu_gpr_d[r1], n); | ||
1853 | tcg_gen_add_tl(cpu_gpr_a[r3], cpu_gpr_a[r2], temp); | ||
1854 | - tcg_temp_free(temp); | ||
1855 | break; | ||
1856 | case OPC2_32_RR_ADDSC_AT: | ||
1857 | temp = tcg_temp_new(); | ||
1858 | tcg_gen_sari_tl(temp, cpu_gpr_d[r1], 3); | ||
1859 | tcg_gen_add_tl(temp, cpu_gpr_a[r2], temp); | ||
1860 | tcg_gen_andi_tl(cpu_gpr_a[r3], temp, 0xFFFFFFFC); | ||
1861 | - tcg_temp_free(temp); | ||
1862 | break; | ||
1863 | case OPC2_32_RR_EQ_A: | ||
1864 | tcg_gen_setcond_tl(TCG_COND_EQ, cpu_gpr_d[r3], cpu_gpr_a[r1], | ||
1865 | @@ -XXX,XX +XXX,XX @@ static void decode_rr_divide(DisasContext *ctx) | ||
1866 | /* write result */ | ||
1867 | tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 24); | ||
1868 | tcg_gen_mov_tl(cpu_gpr_d[r3+1], temp3); | ||
1869 | - | ||
1870 | - tcg_temp_free(temp); | ||
1871 | - tcg_temp_free(temp2); | ||
1872 | - tcg_temp_free(temp3); | ||
1873 | break; | ||
1874 | case OPC2_32_RR_DVINIT_H: | ||
1875 | CHECK_REG_PAIR(r3); | ||
1876 | @@ -XXX,XX +XXX,XX @@ static void decode_rr_divide(DisasContext *ctx) | ||
1877 | /* write result */ | ||
1878 | tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r1], 16); | ||
1879 | tcg_gen_mov_tl(cpu_gpr_d[r3+1], temp3); | ||
1880 | - tcg_temp_free(temp); | ||
1881 | - tcg_temp_free(temp2); | ||
1882 | - tcg_temp_free(temp3); | ||
1883 | break; | ||
1884 | case OPC2_32_RR_DVINIT: | ||
1885 | temp = tcg_temp_new(); | ||
1886 | @@ -XXX,XX +XXX,XX @@ static void decode_rr_divide(DisasContext *ctx) | ||
1887 | tcg_gen_mov_tl(cpu_gpr_d[r3], cpu_gpr_d[r1]); | ||
1888 | /* sign extend to high reg */ | ||
1889 | tcg_gen_sari_tl(cpu_gpr_d[r3+1], cpu_gpr_d[r1], 31); | ||
1890 | - tcg_temp_free(temp); | ||
1891 | - tcg_temp_free(temp2); | ||
1892 | break; | ||
1893 | case OPC2_32_RR_DVINIT_U: | ||
1894 | /* overflow = (D[b] == 0) */ | ||
1895 | @@ -XXX,XX +XXX,XX @@ static void decode_rr1_mul(DisasContext *ctx) | ||
1896 | GEN_HELPER_LL(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); | ||
1897 | tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); | ||
1898 | gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]); | ||
1899 | - tcg_temp_free_i64(temp64); | ||
1900 | break; | ||
1901 | case OPC2_32_RR1_MUL_H_32_LU: | ||
1902 | temp64 = tcg_temp_new_i64(); | ||
1903 | @@ -XXX,XX +XXX,XX @@ static void decode_rr1_mul(DisasContext *ctx) | ||
1904 | GEN_HELPER_LU(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); | ||
1905 | tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); | ||
1906 | gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]); | ||
1907 | - tcg_temp_free_i64(temp64); | ||
1908 | break; | ||
1909 | case OPC2_32_RR1_MUL_H_32_UL: | ||
1910 | temp64 = tcg_temp_new_i64(); | ||
1911 | @@ -XXX,XX +XXX,XX @@ static void decode_rr1_mul(DisasContext *ctx) | ||
1912 | GEN_HELPER_UL(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); | ||
1913 | tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); | ||
1914 | gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]); | ||
1915 | - tcg_temp_free_i64(temp64); | ||
1916 | break; | ||
1917 | case OPC2_32_RR1_MUL_H_32_UU: | ||
1918 | temp64 = tcg_temp_new_i64(); | ||
1919 | @@ -XXX,XX +XXX,XX @@ static void decode_rr1_mul(DisasContext *ctx) | ||
1920 | GEN_HELPER_UU(mul_h, temp64, cpu_gpr_d[r1], cpu_gpr_d[r2], n); | ||
1921 | tcg_gen_extr_i64_i32(cpu_gpr_d[r3], cpu_gpr_d[r3+1], temp64); | ||
1922 | gen_calc_usb_mul_h(cpu_gpr_d[r3], cpu_gpr_d[r3+1]); | ||
1923 | - tcg_temp_free_i64(temp64); | ||
1924 | break; | ||
1925 | case OPC2_32_RR1_MULM_H_64_LL: | ||
1926 | temp64 = tcg_temp_new_i64(); | ||
1927 | @@ -XXX,XX +XXX,XX @@ static void decode_rr1_mul(DisasContext *ctx) | ||
1928 | tcg_gen_movi_tl(cpu_PSW_V, 0); | ||
1929 | /* reset AV bit */ | ||
1930 | tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V); | ||
1931 | - tcg_temp_free_i64(temp64); | ||
1932 | break; | ||
1933 | case OPC2_32_RR1_MULM_H_64_LU: | ||
1934 | temp64 = tcg_temp_new_i64(); | ||
1935 | @@ -XXX,XX +XXX,XX @@ static void decode_rr1_mul(DisasContext *ctx) | ||
1936 | tcg_gen_movi_tl(cpu_PSW_V, 0); | ||
1937 | /* reset AV bit */ | ||
1938 | tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V); | ||
1939 | - tcg_temp_free_i64(temp64); | ||
1940 | break; | ||
1941 | case OPC2_32_RR1_MULM_H_64_UL: | ||
1942 | temp64 = tcg_temp_new_i64(); | ||
1943 | @@ -XXX,XX +XXX,XX @@ static void decode_rr1_mul(DisasContext *ctx) | ||
1944 | tcg_gen_movi_tl(cpu_PSW_V, 0); | ||
1945 | /* reset AV bit */ | ||
1946 | tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V); | ||
1947 | - tcg_temp_free_i64(temp64); | ||
1948 | break; | ||
1949 | case OPC2_32_RR1_MULM_H_64_UU: | ||
1950 | temp64 = tcg_temp_new_i64(); | ||
1951 | @@ -XXX,XX +XXX,XX @@ static void decode_rr1_mul(DisasContext *ctx) | ||
1952 | tcg_gen_movi_tl(cpu_PSW_V, 0); | ||
1953 | /* reset AV bit */ | ||
1954 | tcg_gen_mov_tl(cpu_PSW_AV, cpu_PSW_V); | ||
1955 | - tcg_temp_free_i64(temp64); | ||
1956 | - | ||
1957 | break; | ||
1958 | case OPC2_32_RR1_MULR_H_16_LL: | ||
1959 | GEN_HELPER_LL(mulr_h, cpu_gpr_d[r3], cpu_gpr_d[r1], cpu_gpr_d[r2], n); | ||
1960 | @@ -XXX,XX +XXX,XX @@ static void decode_rr1_mul(DisasContext *ctx) | ||
1961 | default: | ||
1962 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1963 | } | ||
1964 | - tcg_temp_free(n); | ||
1965 | } | ||
1966 | |||
1967 | static void decode_rr1_mulq(DisasContext *ctx) | ||
1968 | @@ -XXX,XX +XXX,XX @@ static void decode_rr1_mulq(DisasContext *ctx) | ||
1969 | default: | ||
1970 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1971 | } | ||
1972 | - tcg_temp_free(temp); | ||
1973 | - tcg_temp_free(temp2); | ||
1974 | } | ||
1975 | |||
1976 | /* RR2 format */ | ||
1977 | @@ -XXX,XX +XXX,XX @@ static void decode_rrpw_extract_insert(DisasContext *ctx) | ||
1978 | tcg_gen_movi_tl(temp, ((1u << width) - 1) << pos); | ||
1979 | tcg_gen_shli_tl(cpu_gpr_d[r3], cpu_gpr_d[r2], pos); | ||
1980 | tcg_gen_mov_tl(cpu_gpr_d[r3 + 1], temp); | ||
1981 | - tcg_temp_free(temp); | ||
1982 | } | ||
1983 | |||
1984 | break; | ||
1985 | @@ -XXX,XX +XXX,XX @@ static void decode_rrr_cond_select(DisasContext *ctx) | ||
1986 | temp = tcg_const_i32(0); | ||
1987 | tcg_gen_movcond_tl(TCG_COND_NE, cpu_gpr_d[r4], cpu_gpr_d[r3], temp, | ||
1988 | cpu_gpr_d[r1], cpu_gpr_d[r2]); | ||
1989 | - tcg_temp_free(temp); | ||
1990 | break; | ||
1991 | case OPC2_32_RRR_SELN: | ||
1992 | temp = tcg_const_i32(0); | ||
1993 | tcg_gen_movcond_tl(TCG_COND_EQ, cpu_gpr_d[r4], cpu_gpr_d[r3], temp, | ||
1994 | cpu_gpr_d[r1], cpu_gpr_d[r2]); | ||
1995 | - tcg_temp_free(temp); | ||
1996 | break; | ||
1997 | default: | ||
1998 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
1999 | @@ -XXX,XX +XXX,XX @@ static void decode_rrr1_maddq_h(DisasContext *ctx) | ||
2000 | default: | ||
2001 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
2002 | } | ||
2003 | - tcg_temp_free(temp); | ||
2004 | - tcg_temp_free(temp2); | ||
2005 | } | ||
2006 | |||
2007 | static void decode_rrr1_maddsu_h(DisasContext *ctx) | ||
2008 | @@ -XXX,XX +XXX,XX @@ static void decode_rrr1_msubq_h(DisasContext *ctx) | ||
2009 | default: | ||
2010 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
2011 | } | ||
2012 | - tcg_temp_free(temp); | ||
2013 | - tcg_temp_free(temp2); | ||
2014 | } | ||
2015 | |||
2016 | static void decode_rrr1_msubad_h(DisasContext *ctx) | ||
2017 | @@ -XXX,XX +XXX,XX @@ static void decode_rrrr_extract_insert(DisasContext *ctx) | ||
2018 | */ | ||
2019 | tcg_gen_movcond_tl(TCG_COND_EQ, msw, tmp_pos, zero, zero, msw); | ||
2020 | tcg_gen_or_tl(cpu_gpr_d[r4], tmp_width, msw); | ||
2021 | - tcg_temp_free(msw); | ||
2022 | } | ||
2023 | break; | ||
2024 | case OPC2_32_RRRR_EXTR: | ||
2025 | @@ -XXX,XX +XXX,XX @@ static void decode_rrrr_extract_insert(DisasContext *ctx) | ||
2026 | default: | ||
2027 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
2028 | } | ||
2029 | - tcg_temp_free(tmp_pos); | ||
2030 | - tcg_temp_free(tmp_width); | ||
2031 | } | ||
2032 | |||
2033 | /* RRRW format */ | ||
2034 | @@ -XXX,XX +XXX,XX @@ static void decode_rrrw_extract_insert(DisasContext *ctx) | ||
2035 | tcg_gen_shl_tl(temp2, temp2, temp); | ||
2036 | tcg_gen_shl_tl(cpu_gpr_d[r4], cpu_gpr_d[r2], temp); | ||
2037 | tcg_gen_mov_tl(cpu_gpr_d[r4+1], temp2); | ||
2038 | - | ||
2039 | - tcg_temp_free(temp2); | ||
2040 | break; | ||
2041 | case OPC2_32_RRRW_INSERT: | ||
2042 | temp2 = tcg_temp_new(); | ||
2043 | @@ -XXX,XX +XXX,XX @@ static void decode_rrrw_extract_insert(DisasContext *ctx) | ||
2044 | tcg_gen_movi_tl(temp, width); | ||
2045 | tcg_gen_andi_tl(temp2, cpu_gpr_d[r3], 0x1f); | ||
2046 | gen_insert(cpu_gpr_d[r4], cpu_gpr_d[r1], cpu_gpr_d[r2], temp, temp2); | ||
2047 | - | ||
2048 | - tcg_temp_free(temp2); | ||
2049 | break; | ||
2050 | default: | ||
2051 | generate_trap(ctx, TRAPC_INSN_ERR, TIN2_IOPC); | ||
2052 | } | ||
2053 | - tcg_temp_free(temp); | ||
2054 | } | ||
2055 | |||
2056 | /* SYS Format*/ | ||
2057 | @@ -XXX,XX +XXX,XX @@ static void decode_sys_interrupts(DisasContext *ctx) | ||
2058 | gen_set_label(l1); | ||
2059 | tcg_gen_exit_tb(NULL, 0); | ||
2060 | ctx->base.is_jmp = DISAS_NORETURN; | ||
2061 | - tcg_temp_free(tmp); | ||
2062 | } else { | ||
2063 | /* generate privilege trap */ | ||
2064 | } | ||
2065 | @@ -XXX,XX +XXX,XX @@ static void decode_32Bit_opc(DisasContext *ctx) | ||
2066 | |||
2067 | tcg_gen_shri_tl(temp2, cpu_gpr_d[r1], 16); | ||
2068 | tcg_gen_qemu_st_tl(temp2, temp, ctx->mem_idx, MO_LEUW); | ||
2069 | - | ||
2070 | - tcg_temp_free(temp2); | ||
2071 | - tcg_temp_free(temp); | ||
2072 | break; | ||
2073 | case OPC1_32_ABS_LD_Q: | ||
2074 | address = MASK_OP_ABS_OFF18(ctx->opcode); | ||
2075 | @@ -XXX,XX +XXX,XX @@ static void decode_32Bit_opc(DisasContext *ctx) | ||
2076 | |||
2077 | tcg_gen_qemu_ld_tl(cpu_gpr_d[r1], temp, ctx->mem_idx, MO_LEUW); | ||
2078 | tcg_gen_shli_tl(cpu_gpr_d[r1], cpu_gpr_d[r1], 16); | ||
2079 | - | ||
2080 | - tcg_temp_free(temp); | ||
2081 | break; | ||
2082 | case OPC1_32_ABS_LEA: | ||
2083 | address = MASK_OP_ABS_OFF18(ctx->opcode); | ||
2084 | @@ -XXX,XX +XXX,XX @@ static void decode_32Bit_opc(DisasContext *ctx) | ||
2085 | tcg_gen_andi_tl(temp2, temp2, ~(0x1u << bpos)); | ||
2086 | tcg_gen_ori_tl(temp2, temp2, (b << bpos)); | ||
2087 | tcg_gen_qemu_st_tl(temp2, temp, ctx->mem_idx, MO_UB); | ||
2088 | - | ||
2089 | - tcg_temp_free(temp); | ||
2090 | - tcg_temp_free(temp2); | ||
2091 | break; | ||
2092 | /* B-format */ | ||
2093 | case OPC1_32_B_CALL: | ||
2094 | @@ -XXX,XX +XXX,XX @@ static void decode_32Bit_opc(DisasContext *ctx) | ||
2095 | tcg_gen_andi_tl(temp3, cpu_gpr_d[r3], 0x1f); | ||
2096 | |||
2097 | gen_insert(cpu_gpr_d[r2], cpu_gpr_d[r1], temp, temp2, temp3); | ||
2098 | - | ||
2099 | - tcg_temp_free(temp); | ||
2100 | - tcg_temp_free(temp2); | ||
2101 | - tcg_temp_free(temp3); | ||
2102 | break; | ||
2103 | /* RCRW Format */ | ||
2104 | case OPCM_32_RCRW_MASK_INSERT: | ||
2105 | -- | ||
2106 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Translators are no longer required to free tcg temporaries. | ||
2 | 1 | ||
3 | Reviewed-by: Peter Maydell <peter.maydell@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | include/exec/gen-icount.h | 2 -- | ||
7 | 1 file changed, 2 deletions(-) | ||
8 | |||
9 | diff --git a/include/exec/gen-icount.h b/include/exec/gen-icount.h | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/include/exec/gen-icount.h | ||
12 | +++ b/include/exec/gen-icount.h | ||
13 | @@ -XXX,XX +XXX,XX @@ static inline void gen_tb_start(const TranslationBlock *tb) | ||
14 | offsetof(ArchCPU, parent_obj.can_do_io) - | ||
15 | offsetof(ArchCPU, env)); | ||
16 | } | ||
17 | - | ||
18 | - tcg_temp_free_i32(count); | ||
19 | } | ||
20 | |||
21 | static inline void gen_tb_end(const TranslationBlock *tb, int num_insns) | ||
22 | -- | ||
23 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com> | ||
2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
3 | --- | ||
4 | docs/devel/tcg-ops.rst | 4 ---- | ||
5 | 1 file changed, 4 deletions(-) | ||
6 | 1 | ||
7 | diff --git a/docs/devel/tcg-ops.rst b/docs/devel/tcg-ops.rst | ||
8 | index XXXXXXX..XXXXXXX 100644 | ||
9 | --- a/docs/devel/tcg-ops.rst | ||
10 | +++ b/docs/devel/tcg-ops.rst | ||
11 | @@ -XXX,XX +XXX,XX @@ Recommended coding rules for best performance | ||
12 | often modified, e.g. the integer registers and the condition | ||
13 | codes. TCG will be able to use host registers to store them. | ||
14 | |||
15 | -- Free temporaries when they are no longer used (``tcg_temp_free``). | ||
16 | - Since ``tcg_const_x`` also creates a temporary, you should free it | ||
17 | - after it is used. | ||
18 | - | ||
19 | - Don't hesitate to use helpers for complicated or seldom used guest | ||
20 | instructions. There is little performance advantage in using TCG to | ||
21 | implement guest instructions taking more than about twenty TCG | ||
22 | -- | ||
23 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Rename from gen_tmp_value_from_imm to match gen_constant vs gen_tmp. | ||
2 | 1 | ||
3 | Reviewed-by: Taylor Simpson <tsimpson@quicinc.com> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/hexagon/idef-parser/parser-helpers.c | 15 +++++++-------- | ||
7 | 1 file changed, 7 insertions(+), 8 deletions(-) | ||
8 | |||
9 | diff --git a/target/hexagon/idef-parser/parser-helpers.c b/target/hexagon/idef-parser/parser-helpers.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/hexagon/idef-parser/parser-helpers.c | ||
12 | +++ b/target/hexagon/idef-parser/parser-helpers.c | ||
13 | @@ -XXX,XX +XXX,XX @@ HexValue gen_tmp_value(Context *c, | ||
14 | return rvalue; | ||
15 | } | ||
16 | |||
17 | -static HexValue gen_tmp_value_from_imm(Context *c, | ||
18 | - YYLTYPE *locp, | ||
19 | - HexValue *value) | ||
20 | +static HexValue gen_constant_from_imm(Context *c, | ||
21 | + YYLTYPE *locp, | ||
22 | + HexValue *value) | ||
23 | { | ||
24 | HexValue rvalue; | ||
25 | assert(value->type == IMMEDIATE); | ||
26 | @@ -XXX,XX +XXX,XX @@ static HexValue gen_tmp_value_from_imm(Context *c, | ||
27 | rvalue.is_dotnew = false; | ||
28 | rvalue.tmp.index = c->inst.tmp_count; | ||
29 | /* | ||
30 | - * Here we output the call to `tcg_const_i<width>` in | ||
31 | + * Here we output the call to `tcg_constant_i<width>` in | ||
32 | * order to create the temporary value. Note, that we | ||
33 | * add a cast | ||
34 | * | ||
35 | - * `tcg_const_i<width>`((int<width>_t) ...)` | ||
36 | + * `tcg_constant_i<width>`((int<width>_t) ...)` | ||
37 | * | ||
38 | * This cast is required to avoid implicit integer | ||
39 | * conversion warnings since all immediates are | ||
40 | @@ -XXX,XX +XXX,XX @@ static HexValue gen_tmp_value_from_imm(Context *c, | ||
41 | * integer is 32-bit. | ||
42 | */ | ||
43 | OUT(c, locp, "TCGv_i", &rvalue.bit_width, " tmp_", &c->inst.tmp_count); | ||
44 | - OUT(c, locp, " = tcg_const_i", &rvalue.bit_width, | ||
45 | + OUT(c, locp, " = tcg_constant_i", &rvalue.bit_width, | ||
46 | "((int", &rvalue.bit_width, "_t) (", value, "));\n"); | ||
47 | |||
48 | c->inst.tmp_count++; | ||
49 | @@ -XXX,XX +XXX,XX @@ HexValue gen_imm_qemu_tmp(Context *c, YYLTYPE *locp, unsigned bit_width, | ||
50 | HexValue rvalue_materialize(Context *c, YYLTYPE *locp, HexValue *rvalue) | ||
51 | { | ||
52 | if (rvalue->type == IMMEDIATE) { | ||
53 | - HexValue res = gen_tmp_value_from_imm(c, locp, rvalue); | ||
54 | - return res; | ||
55 | + return gen_constant_from_imm(c, locp, rvalue); | ||
56 | } | ||
57 | return *rvalue; | ||
58 | } | ||
59 | -- | ||
60 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | The GET_USR_FIELD macro initializes the output, so the initial assignment | ||
2 | of zero is discarded. This is the only use of get_tmp_value outside of | ||
3 | parser-helper.c, so make it static. | ||
4 | 1 | ||
5 | Reviewed-by: Taylor Simpson <tsimpson@quicinc.com> | ||
6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
7 | --- | ||
8 | target/hexagon/idef-parser/parser-helpers.h | 6 ------ | ||
9 | target/hexagon/idef-parser/parser-helpers.c | 2 +- | ||
10 | target/hexagon/idef-parser/idef-parser.y | 2 +- | ||
11 | 3 files changed, 2 insertions(+), 8 deletions(-) | ||
12 | |||
13 | diff --git a/target/hexagon/idef-parser/parser-helpers.h b/target/hexagon/idef-parser/parser-helpers.h | ||
14 | index XXXXXXX..XXXXXXX 100644 | ||
15 | --- a/target/hexagon/idef-parser/parser-helpers.h | ||
16 | +++ b/target/hexagon/idef-parser/parser-helpers.h | ||
17 | @@ -XXX,XX +XXX,XX @@ HexValue gen_tmp(Context *c, | ||
18 | unsigned bit_width, | ||
19 | HexSignedness signedness); | ||
20 | |||
21 | -HexValue gen_tmp_value(Context *c, | ||
22 | - YYLTYPE *locp, | ||
23 | - const char *value, | ||
24 | - unsigned bit_width, | ||
25 | - HexSignedness signedness); | ||
26 | - | ||
27 | HexValue gen_imm_value(Context *c __attribute__((unused)), | ||
28 | YYLTYPE *locp, | ||
29 | int value, | ||
30 | diff --git a/target/hexagon/idef-parser/parser-helpers.c b/target/hexagon/idef-parser/parser-helpers.c | ||
31 | index XXXXXXX..XXXXXXX 100644 | ||
32 | --- a/target/hexagon/idef-parser/parser-helpers.c | ||
33 | +++ b/target/hexagon/idef-parser/parser-helpers.c | ||
34 | @@ -XXX,XX +XXX,XX @@ HexValue gen_tmp(Context *c, | ||
35 | return rvalue; | ||
36 | } | ||
37 | |||
38 | -HexValue gen_tmp_value(Context *c, | ||
39 | +static HexValue gen_tmp_value(Context *c, | ||
40 | YYLTYPE *locp, | ||
41 | const char *value, | ||
42 | unsigned bit_width, | ||
43 | diff --git a/target/hexagon/idef-parser/idef-parser.y b/target/hexagon/idef-parser/idef-parser.y | ||
44 | index XXXXXXX..XXXXXXX 100644 | ||
45 | --- a/target/hexagon/idef-parser/idef-parser.y | ||
46 | +++ b/target/hexagon/idef-parser/idef-parser.y | ||
47 | @@ -XXX,XX +XXX,XX @@ rvalue : FAIL | ||
48 | } | ||
49 | | LPCFG | ||
50 | { | ||
51 | - $$ = gen_tmp_value(c, &@1, "0", 32, UNSIGNED); | ||
52 | + $$ = gen_tmp(c, &@1, 32, UNSIGNED); | ||
53 | OUT(c, &@1, "GET_USR_FIELD(USR_LPCFG, ", &$$, ");\n"); | ||
54 | } | ||
55 | | EXTRACT '(' rvalue ',' rvalue ')' | ||
56 | -- | ||
57 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | The allocation is immediately followed by tcg_gen_mov_i32, | ||
2 | so the initial assignment of zero is discarded. | ||
3 | 1 | ||
4 | Reviewed-by: Taylor Simpson <tsimpson@quicinc.com> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
6 | --- | ||
7 | target/hexagon/idef-parser/parser-helpers.c | 2 +- | ||
8 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
9 | |||
10 | diff --git a/target/hexagon/idef-parser/parser-helpers.c b/target/hexagon/idef-parser/parser-helpers.c | ||
11 | index XXXXXXX..XXXXXXX 100644 | ||
12 | --- a/target/hexagon/idef-parser/parser-helpers.c | ||
13 | +++ b/target/hexagon/idef-parser/parser-helpers.c | ||
14 | @@ -XXX,XX +XXX,XX @@ void gen_pred_assign(Context *c, YYLTYPE *locp, HexValue *left_pred, | ||
15 | "Predicate assign not allowed in ternary!"); | ||
16 | /* Extract predicate TCGv */ | ||
17 | if (is_direct) { | ||
18 | - *left_pred = gen_tmp_value(c, locp, "0", 32, UNSIGNED); | ||
19 | + *left_pred = gen_tmp(c, locp, 32, UNSIGNED); | ||
20 | } | ||
21 | /* Extract first 8 bits, and store new predicate value */ | ||
22 | OUT(c, locp, "tcg_gen_mov_i32(", left_pred, ", ", &r, ");\n"); | ||
23 | -- | ||
24 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | The allocation is immediately followed by either tcg_gen_mov_i32 | ||
2 | or gen_read_preg (which contains tcg_gen_mov_i32), so the zero | ||
3 | initialization is immediately discarded. | ||
4 | 1 | ||
5 | Reviewed-by: Taylor Simpson <tsimpson@quicinc.com> | ||
6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
7 | --- | ||
8 | target/hexagon/idef-parser/parser-helpers.c | 2 +- | ||
9 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
10 | |||
11 | diff --git a/target/hexagon/idef-parser/parser-helpers.c b/target/hexagon/idef-parser/parser-helpers.c | ||
12 | index XXXXXXX..XXXXXXX 100644 | ||
13 | --- a/target/hexagon/idef-parser/parser-helpers.c | ||
14 | +++ b/target/hexagon/idef-parser/parser-helpers.c | ||
15 | @@ -XXX,XX +XXX,XX @@ HexValue gen_rvalue_pred(Context *c, YYLTYPE *locp, HexValue *pred) | ||
16 | bool is_dotnew = pred->is_dotnew; | ||
17 | char predicate_id[2] = { pred->pred.id, '\0' }; | ||
18 | char *pred_str = (char *) &predicate_id; | ||
19 | - *pred = gen_tmp_value(c, locp, "0", 32, UNSIGNED); | ||
20 | + *pred = gen_tmp(c, locp, 32, UNSIGNED); | ||
21 | if (is_dotnew) { | ||
22 | OUT(c, locp, "tcg_gen_mov_i32(", pred, | ||
23 | ", hex_new_pred_value["); | ||
24 | -- | ||
25 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | We already have a temporary, res, which we can use for the intermediate | ||
2 | shift result. Simplify the constant to -1 instead of 0xf*f. | ||
3 | This was the last use of gen_tmp_value, so remove it. | ||
4 | 1 | ||
5 | Reviewed-by: Taylor Simpson <tsimpson@quicinc.com> | ||
6 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
7 | --- | ||
8 | target/hexagon/idef-parser/parser-helpers.c | 30 +++------------------ | ||
9 | 1 file changed, 3 insertions(+), 27 deletions(-) | ||
10 | |||
11 | diff --git a/target/hexagon/idef-parser/parser-helpers.c b/target/hexagon/idef-parser/parser-helpers.c | ||
12 | index XXXXXXX..XXXXXXX 100644 | ||
13 | --- a/target/hexagon/idef-parser/parser-helpers.c | ||
14 | +++ b/target/hexagon/idef-parser/parser-helpers.c | ||
15 | @@ -XXX,XX +XXX,XX @@ HexValue gen_tmp(Context *c, | ||
16 | return rvalue; | ||
17 | } | ||
18 | |||
19 | -static HexValue gen_tmp_value(Context *c, | ||
20 | - YYLTYPE *locp, | ||
21 | - const char *value, | ||
22 | - unsigned bit_width, | ||
23 | - HexSignedness signedness) | ||
24 | -{ | ||
25 | - HexValue rvalue; | ||
26 | - assert(bit_width == 32 || bit_width == 64); | ||
27 | - memset(&rvalue, 0, sizeof(HexValue)); | ||
28 | - rvalue.type = TEMP; | ||
29 | - rvalue.bit_width = bit_width; | ||
30 | - rvalue.signedness = signedness; | ||
31 | - rvalue.is_dotnew = false; | ||
32 | - rvalue.tmp.index = c->inst.tmp_count; | ||
33 | - OUT(c, locp, "TCGv_i", &bit_width, " tmp_", &c->inst.tmp_count, | ||
34 | - " = tcg_const_i", &bit_width, "(", value, ");\n"); | ||
35 | - c->inst.tmp_count++; | ||
36 | - return rvalue; | ||
37 | -} | ||
38 | - | ||
39 | static HexValue gen_constant_from_imm(Context *c, | ||
40 | YYLTYPE *locp, | ||
41 | HexValue *value) | ||
42 | @@ -XXX,XX +XXX,XX @@ static HexValue gen_extend_tcg_width_op(Context *c, | ||
43 | OUT(c, locp, "tcg_gen_subfi_i", &dst_width); | ||
44 | OUT(c, locp, "(", &shift, ", ", &dst_width, ", ", &src_width_m, ");\n"); | ||
45 | if (signedness == UNSIGNED) { | ||
46 | - const char *mask_str = (dst_width == 32) | ||
47 | - ? "0xffffffff" | ||
48 | - : "0xffffffffffffffff"; | ||
49 | - HexValue mask = gen_tmp_value(c, locp, mask_str, | ||
50 | - dst_width, UNSIGNED); | ||
51 | + HexValue mask = gen_constant(c, locp, "-1", dst_width, UNSIGNED); | ||
52 | OUT(c, locp, "tcg_gen_shr_i", &dst_width, "(", | ||
53 | - &mask, ", ", &mask, ", ", &shift, ");\n"); | ||
54 | + &res, ", ", &mask, ", ", &shift, ");\n"); | ||
55 | OUT(c, locp, "tcg_gen_and_i", &dst_width, "(", | ||
56 | - &res, ", ", value, ", ", &mask, ");\n"); | ||
57 | + &res, ", ", &res, ", ", value, ");\n"); | ||
58 | } else { | ||
59 | OUT(c, locp, "tcg_gen_shl_i", &dst_width, "(", | ||
60 | &res, ", ", value, ", ", &shift, ");\n"); | ||
61 | -- | ||
62 | 2.34.1 | diff view generated by jsdifflib |
1 | All remaining uses are strictly read-only. | 1 | From: Artyom Tarasenko <atar4qemu@gmail.com> |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | 3 | Fake access to |
4 | PCR Performance Control Register | ||
5 | and | ||
6 | PIC Performance Instrumentation Counter. | ||
7 | |||
8 | Ignore writes in privileged mode, and return 0 on reads. | ||
9 | |||
10 | This allows booting Tribblix, MilaX and v9os under Niagara target. | ||
11 | |||
12 | Signed-off-by: Artyom Tarasenko <atar4qemu@gmail.com> | ||
13 | Reviewed-by: Richard Henderson <richard.henderson@linaro.org> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | 14 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> |
15 | Message-ID: <20250209211248.50383-1-atar4qemu@gmail.com> | ||
5 | --- | 16 | --- |
6 | target/sparc/translate.c | 80 +++++++++++++++++++--------------------- | 17 | target/sparc/translate.c | 19 +++++++++++++++++++ |
7 | 1 file changed, 38 insertions(+), 42 deletions(-) | 18 | target/sparc/insns.decode | 7 ++++++- |
19 | 2 files changed, 25 insertions(+), 1 deletion(-) | ||
8 | 20 | ||
9 | diff --git a/target/sparc/translate.c b/target/sparc/translate.c | 21 | diff --git a/target/sparc/translate.c b/target/sparc/translate.c |
10 | index XXXXXXX..XXXXXXX 100644 | 22 | index XXXXXXX..XXXXXXX 100644 |
11 | --- a/target/sparc/translate.c | 23 | --- a/target/sparc/translate.c |
12 | +++ b/target/sparc/translate.c | 24 | +++ b/target/sparc/translate.c |
13 | @@ -XXX,XX +XXX,XX @@ static inline void gen_op_mulscc(TCGv dst, TCGv src1, TCGv src2) | 25 | @@ -XXX,XX +XXX,XX @@ static TCGv do_rd_leon3_config(DisasContext *dc, TCGv dst) |
14 | if (!(env->y & 1)) | 26 | |
15 | T1 = 0; | 27 | TRANS(RDASR17, ASR17, do_rd_special, true, a->rd, do_rd_leon3_config) |
16 | */ | 28 | |
17 | - zero = tcg_const_tl(0); | 29 | +static TCGv do_rdpic(DisasContext *dc, TCGv dst) |
18 | + zero = tcg_constant_tl(0); | 30 | +{ |
19 | tcg_gen_andi_tl(cpu_cc_src, src1, 0xffffffff); | 31 | + return tcg_constant_tl(0); |
20 | tcg_gen_andi_tl(r_temp, cpu_y, 0x1); | 32 | +} |
21 | tcg_gen_andi_tl(cpu_cc_src2, src2, 0xffffffff); | 33 | + |
22 | @@ -XXX,XX +XXX,XX @@ static void gen_branch_n(DisasContext *dc, target_ulong pc1) | 34 | +TRANS(RDPIC, HYPV, do_rd_special, supervisor(dc), a->rd, do_rdpic) |
23 | tcg_gen_mov_tl(cpu_pc, cpu_npc); | 35 | + |
24 | 36 | + | |
25 | tcg_gen_addi_tl(cpu_npc, cpu_npc, 4); | 37 | static TCGv do_rdccr(DisasContext *dc, TCGv dst) |
26 | - t = tcg_const_tl(pc1); | ||
27 | - z = tcg_const_tl(0); | ||
28 | + t = tcg_constant_tl(pc1); | ||
29 | + z = tcg_constant_tl(0); | ||
30 | tcg_gen_movcond_tl(TCG_COND_NE, cpu_npc, cpu_cond, z, t, cpu_npc); | ||
31 | |||
32 | dc->pc = DYNAMIC_PC; | ||
33 | @@ -XXX,XX +XXX,XX @@ static void gen_branch_n(DisasContext *dc, target_ulong pc1) | ||
34 | |||
35 | static inline void gen_generic_branch(DisasContext *dc) | ||
36 | { | 38 | { |
37 | - TCGv npc0 = tcg_const_tl(dc->jump_pc[0]); | 39 | gen_helper_rdccr(dst, tcg_env); |
38 | - TCGv npc1 = tcg_const_tl(dc->jump_pc[1]); | 40 | @@ -XXX,XX +XXX,XX @@ static void do_wrfprs(DisasContext *dc, TCGv src) |
39 | - TCGv zero = tcg_const_tl(0); | 41 | |
40 | + TCGv npc0 = tcg_constant_tl(dc->jump_pc[0]); | 42 | TRANS(WRFPRS, 64, do_wr_special, a, true, do_wrfprs) |
41 | + TCGv npc1 = tcg_constant_tl(dc->jump_pc[1]); | 43 | |
42 | + TCGv zero = tcg_constant_tl(0); | 44 | +static bool do_priv_nop(DisasContext *dc, bool priv) |
43 | 45 | +{ | |
44 | tcg_gen_movcond_tl(TCG_COND_NE, cpu_npc, cpu_cond, zero, npc0, npc1); | 46 | + if (!priv) { |
45 | } | 47 | + return raise_priv(dc); |
46 | @@ -XXX,XX +XXX,XX @@ static inline void save_state(DisasContext *dc) | 48 | + } |
47 | 49 | + return advance_pc(dc); | |
48 | static void gen_exception(DisasContext *dc, int which) | 50 | +} |
51 | + | ||
52 | +TRANS(WRPCR, HYPV, do_priv_nop, supervisor(dc)) | ||
53 | +TRANS(WRPIC, HYPV, do_priv_nop, supervisor(dc)) | ||
54 | + | ||
55 | static void do_wrgsr(DisasContext *dc, TCGv src) | ||
49 | { | 56 | { |
50 | - TCGv_i32 t; | 57 | gen_trap_ifnofpu(dc); |
51 | - | 58 | diff --git a/target/sparc/insns.decode b/target/sparc/insns.decode |
52 | save_state(dc); | 59 | index XXXXXXX..XXXXXXX 100644 |
53 | - t = tcg_const_i32(which); | 60 | --- a/target/sparc/insns.decode |
54 | - gen_helper_raise_exception(cpu_env, t); | 61 | +++ b/target/sparc/insns.decode |
55 | + gen_helper_raise_exception(cpu_env, tcg_constant_i32(which)); | 62 | @@ -XXX,XX +XXX,XX @@ CALL 01 i:s30 |
56 | dc->base.is_jmp = DISAS_NORETURN; | 63 | RDTICK 10 rd:5 101000 00100 0 0000000000000 |
57 | } | 64 | RDPC 10 rd:5 101000 00101 0 0000000000000 |
58 | 65 | RDFPRS 10 rd:5 101000 00110 0 0000000000000 | |
59 | static void gen_check_align(TCGv addr, int mask) | 66 | - RDASR17 10 rd:5 101000 10001 0 0000000000000 |
60 | { | 67 | + { |
61 | - TCGv_i32 r_mask = tcg_const_i32(mask); | 68 | + RDASR17 10 rd:5 101000 10001 0 0000000000000 |
62 | - gen_helper_check_align(cpu_env, addr, r_mask); | 69 | + RDPIC 10 rd:5 101000 10001 0 0000000000000 |
63 | + gen_helper_check_align(cpu_env, addr, tcg_constant_i32(mask)); | 70 | + } |
64 | } | 71 | RDGSR 10 rd:5 101000 10011 0 0000000000000 |
65 | 72 | RDSOFTINT 10 rd:5 101000 10110 0 0000000000000 | |
66 | static inline void gen_mov_pc_npc(DisasContext *dc) | 73 | RDTICK_CMPR 10 rd:5 101000 10111 0 0000000000000 |
67 | @@ -XXX,XX +XXX,XX @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond, | 74 | @@ -XXX,XX +XXX,XX @@ CALL 01 i:s30 |
68 | cmp->cond = logic_cond[cond]; | 75 | WRCCR 10 00010 110000 ..... . ............. @n_r_ri |
69 | do_compare_dst_0: | 76 | WRASI 10 00011 110000 ..... . ............. @n_r_ri |
70 | cmp->is_bool = false; | 77 | WRFPRS 10 00110 110000 ..... . ............. @n_r_ri |
71 | - cmp->c2 = tcg_const_tl(0); | 78 | + WRPCR 10 10000 110000 01000 0 0000000000000 |
72 | + cmp->c2 = tcg_constant_tl(0); | 79 | + WRPIC 10 10001 110000 01000 0 0000000000000 |
73 | #ifdef TARGET_SPARC64 | 80 | { |
74 | if (!xcc) { | 81 | WRGSR 10 10011 110000 ..... . ............. @n_r_ri |
75 | cmp->c1 = tcg_temp_new(); | 82 | WRPOWERDOWN 10 10011 110000 ..... . ............. @n_r_ri |
76 | @@ -XXX,XX +XXX,XX @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond, | ||
77 | cmp->cond = TCG_COND_NE; | ||
78 | cmp->is_bool = true; | ||
79 | cmp->c1 = r_dst = tcg_temp_new(); | ||
80 | - cmp->c2 = tcg_const_tl(0); | ||
81 | + cmp->c2 = tcg_constant_tl(0); | ||
82 | |||
83 | switch (cond) { | ||
84 | case 0x0: | ||
85 | @@ -XXX,XX +XXX,XX @@ static void gen_fcompare(DisasCompare *cmp, unsigned int cc, unsigned int cond) | ||
86 | cmp->cond = TCG_COND_NE; | ||
87 | cmp->is_bool = true; | ||
88 | cmp->c1 = r_dst = tcg_temp_new(); | ||
89 | - cmp->c2 = tcg_const_tl(0); | ||
90 | + cmp->c2 = tcg_constant_tl(0); | ||
91 | |||
92 | switch (cc) { | ||
93 | default: | ||
94 | @@ -XXX,XX +XXX,XX @@ static void gen_compare_reg(DisasCompare *cmp, int cond, TCGv r_src) | ||
95 | cmp->cond = tcg_invert_cond(gen_tcg_cond_reg[cond]); | ||
96 | cmp->is_bool = false; | ||
97 | cmp->c1 = r_src; | ||
98 | - cmp->c2 = tcg_const_tl(0); | ||
99 | + cmp->c2 = tcg_constant_tl(0); | ||
100 | } | ||
101 | |||
102 | static inline void gen_cond_reg(TCGv r_dst, int cond, TCGv r_src) | ||
103 | @@ -XXX,XX +XXX,XX @@ static void gen_swap(DisasContext *dc, TCGv dst, TCGv src, | ||
104 | |||
105 | static void gen_ldstub(DisasContext *dc, TCGv dst, TCGv addr, int mmu_idx) | ||
106 | { | ||
107 | - TCGv m1 = tcg_const_tl(0xff); | ||
108 | + TCGv m1 = tcg_constant_tl(0xff); | ||
109 | gen_address_mask(dc, addr); | ||
110 | tcg_gen_atomic_xchg_tl(dst, addr, m1, mmu_idx, MO_UB); | ||
111 | } | ||
112 | @@ -XXX,XX +XXX,XX @@ static void gen_ld_asi(DisasContext *dc, TCGv dst, TCGv addr, | ||
113 | break; | ||
114 | default: | ||
115 | { | ||
116 | - TCGv_i32 r_asi = tcg_const_i32(da.asi); | ||
117 | - TCGv_i32 r_mop = tcg_const_i32(memop); | ||
118 | + TCGv_i32 r_asi = tcg_constant_i32(da.asi); | ||
119 | + TCGv_i32 r_mop = tcg_constant_i32(memop); | ||
120 | |||
121 | save_state(dc); | ||
122 | #ifdef TARGET_SPARC64 | ||
123 | @@ -XXX,XX +XXX,XX @@ static void gen_st_asi(DisasContext *dc, TCGv src, TCGv addr, | ||
124 | { | ||
125 | TCGv saddr = tcg_temp_new(); | ||
126 | TCGv daddr = tcg_temp_new(); | ||
127 | - TCGv four = tcg_const_tl(4); | ||
128 | + TCGv four = tcg_constant_tl(4); | ||
129 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
130 | int i; | ||
131 | |||
132 | @@ -XXX,XX +XXX,XX @@ static void gen_st_asi(DisasContext *dc, TCGv src, TCGv addr, | ||
133 | #endif | ||
134 | default: | ||
135 | { | ||
136 | - TCGv_i32 r_asi = tcg_const_i32(da.asi); | ||
137 | - TCGv_i32 r_mop = tcg_const_i32(memop & MO_SIZE); | ||
138 | + TCGv_i32 r_asi = tcg_constant_i32(da.asi); | ||
139 | + TCGv_i32 r_mop = tcg_constant_i32(memop & MO_SIZE); | ||
140 | |||
141 | save_state(dc); | ||
142 | #ifdef TARGET_SPARC64 | ||
143 | @@ -XXX,XX +XXX,XX @@ static void gen_ldstub_asi(DisasContext *dc, TCGv dst, TCGv addr, int insn) | ||
144 | if (tb_cflags(dc->base.tb) & CF_PARALLEL) { | ||
145 | gen_helper_exit_atomic(cpu_env); | ||
146 | } else { | ||
147 | - TCGv_i32 r_asi = tcg_const_i32(da.asi); | ||
148 | - TCGv_i32 r_mop = tcg_const_i32(MO_UB); | ||
149 | + TCGv_i32 r_asi = tcg_constant_i32(da.asi); | ||
150 | + TCGv_i32 r_mop = tcg_constant_i32(MO_UB); | ||
151 | TCGv_i64 s64, t64; | ||
152 | |||
153 | save_state(dc); | ||
154 | t64 = tcg_temp_new_i64(); | ||
155 | gen_helper_ld_asi(t64, cpu_env, addr, r_asi, r_mop); | ||
156 | |||
157 | - s64 = tcg_const_i64(0xff); | ||
158 | + s64 = tcg_constant_i64(0xff); | ||
159 | gen_helper_st_asi(cpu_env, addr, s64, r_asi, r_mop); | ||
160 | |||
161 | tcg_gen_trunc_i64_tl(dst, t64); | ||
162 | @@ -XXX,XX +XXX,XX @@ static void gen_ldf_asi(DisasContext *dc, TCGv addr, | ||
163 | |||
164 | /* The first operation checks required alignment. */ | ||
165 | memop = da.memop | MO_ALIGN_64; | ||
166 | - eight = tcg_const_tl(8); | ||
167 | + eight = tcg_constant_tl(8); | ||
168 | for (i = 0; ; ++i) { | ||
169 | tcg_gen_qemu_ld_i64(cpu_fpr[rd / 2 + i], addr, | ||
170 | da.mem_idx, memop); | ||
171 | @@ -XXX,XX +XXX,XX @@ static void gen_ldf_asi(DisasContext *dc, TCGv addr, | ||
172 | |||
173 | default: | ||
174 | { | ||
175 | - TCGv_i32 r_asi = tcg_const_i32(da.asi); | ||
176 | - TCGv_i32 r_mop = tcg_const_i32(da.memop); | ||
177 | + TCGv_i32 r_asi = tcg_constant_i32(da.asi); | ||
178 | + TCGv_i32 r_mop = tcg_constant_i32(da.memop); | ||
179 | |||
180 | save_state(dc); | ||
181 | /* According to the table in the UA2011 manual, the only | ||
182 | @@ -XXX,XX +XXX,XX @@ static void gen_stf_asi(DisasContext *dc, TCGv addr, | ||
183 | |||
184 | /* The first operation checks required alignment. */ | ||
185 | memop = da.memop | MO_ALIGN_64; | ||
186 | - eight = tcg_const_tl(8); | ||
187 | + eight = tcg_constant_tl(8); | ||
188 | for (i = 0; ; ++i) { | ||
189 | tcg_gen_qemu_st_i64(cpu_fpr[rd / 2 + i], addr, | ||
190 | da.mem_idx, memop); | ||
191 | @@ -XXX,XX +XXX,XX @@ static void gen_ldda_asi(DisasContext *dc, TCGv addr, int insn, int rd) | ||
192 | real hardware allows others. This can be seen with e.g. | ||
193 | FreeBSD 10.3 wrt ASI_IC_TAG. */ | ||
194 | { | ||
195 | - TCGv_i32 r_asi = tcg_const_i32(da.asi); | ||
196 | - TCGv_i32 r_mop = tcg_const_i32(da.memop); | ||
197 | + TCGv_i32 r_asi = tcg_constant_i32(da.asi); | ||
198 | + TCGv_i32 r_mop = tcg_constant_i32(da.memop); | ||
199 | TCGv_i64 tmp = tcg_temp_new_i64(); | ||
200 | |||
201 | save_state(dc); | ||
202 | @@ -XXX,XX +XXX,XX @@ static void gen_stda_asi(DisasContext *dc, TCGv hi, TCGv addr, | ||
203 | /* ??? In theory we've handled all of the ASIs that are valid | ||
204 | for stda, and this should raise DAE_invalid_asi. */ | ||
205 | { | ||
206 | - TCGv_i32 r_asi = tcg_const_i32(da.asi); | ||
207 | - TCGv_i32 r_mop = tcg_const_i32(da.memop); | ||
208 | + TCGv_i32 r_asi = tcg_constant_i32(da.asi); | ||
209 | + TCGv_i32 r_mop = tcg_constant_i32(da.memop); | ||
210 | TCGv_i64 t64 = tcg_temp_new_i64(); | ||
211 | |||
212 | /* See above. */ | ||
213 | @@ -XXX,XX +XXX,XX @@ static void gen_ldda_asi(DisasContext *dc, TCGv addr, int insn, int rd) | ||
214 | break; | ||
215 | default: | ||
216 | { | ||
217 | - TCGv_i32 r_asi = tcg_const_i32(da.asi); | ||
218 | - TCGv_i32 r_mop = tcg_const_i32(MO_UQ); | ||
219 | + TCGv_i32 r_asi = tcg_constant_i32(da.asi); | ||
220 | + TCGv_i32 r_mop = tcg_constant_i32(MO_UQ); | ||
221 | |||
222 | save_state(dc); | ||
223 | gen_helper_ld_asi(t64, cpu_env, addr, r_asi, r_mop); | ||
224 | @@ -XXX,XX +XXX,XX @@ static void gen_stda_asi(DisasContext *dc, TCGv hi, TCGv addr, | ||
225 | as a cacheline-style operation. */ | ||
226 | { | ||
227 | TCGv d_addr = tcg_temp_new(); | ||
228 | - TCGv eight = tcg_const_tl(8); | ||
229 | + TCGv eight = tcg_constant_tl(8); | ||
230 | int i; | ||
231 | |||
232 | tcg_gen_andi_tl(d_addr, addr, -8); | ||
233 | @@ -XXX,XX +XXX,XX @@ static void gen_stda_asi(DisasContext *dc, TCGv hi, TCGv addr, | ||
234 | break; | ||
235 | default: | ||
236 | { | ||
237 | - TCGv_i32 r_asi = tcg_const_i32(da.asi); | ||
238 | - TCGv_i32 r_mop = tcg_const_i32(MO_UQ); | ||
239 | + TCGv_i32 r_asi = tcg_constant_i32(da.asi); | ||
240 | + TCGv_i32 r_mop = tcg_constant_i32(MO_UQ); | ||
241 | |||
242 | save_state(dc); | ||
243 | gen_helper_st_asi(cpu_env, addr, t64, r_asi, r_mop); | ||
244 | @@ -XXX,XX +XXX,XX @@ static void gen_fmovs(DisasContext *dc, DisasCompare *cmp, int rd, int rs) | ||
245 | s1 = gen_load_fpr_F(dc, rs); | ||
246 | s2 = gen_load_fpr_F(dc, rd); | ||
247 | dst = gen_dest_fpr_F(dc); | ||
248 | - zero = tcg_const_i32(0); | ||
249 | + zero = tcg_constant_i32(0); | ||
250 | |||
251 | tcg_gen_movcond_i32(TCG_COND_NE, dst, c32, zero, s1, s2); | ||
252 | |||
253 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
254 | TCGv_i32 r_const; | ||
255 | |||
256 | r_tickptr = tcg_temp_new_ptr(); | ||
257 | - r_const = tcg_const_i32(dc->mem_idx); | ||
258 | + r_const = tcg_constant_i32(dc->mem_idx); | ||
259 | tcg_gen_ld_ptr(r_tickptr, cpu_env, | ||
260 | offsetof(CPUSPARCState, tick)); | ||
261 | if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) { | ||
262 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
263 | TCGv_i32 r_const; | ||
264 | |||
265 | r_tickptr = tcg_temp_new_ptr(); | ||
266 | - r_const = tcg_const_i32(dc->mem_idx); | ||
267 | + r_const = tcg_constant_i32(dc->mem_idx); | ||
268 | tcg_gen_ld_ptr(r_tickptr, cpu_env, | ||
269 | offsetof(CPUSPARCState, stick)); | ||
270 | if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) { | ||
271 | @@ -XXX,XX +XXX,XX @@ static void disas_sparc_insn(DisasContext * dc, unsigned int insn) | ||
272 | TCGv_i32 r_const; | ||
273 | |||
274 | r_tickptr = tcg_temp_new_ptr(); | ||
275 | - r_const = tcg_const_i32(dc->mem_idx); | ||
276 | + r_const = tcg_constant_i32(dc->mem_idx); | ||
277 | tcg_gen_ld_ptr(r_tickptr, cpu_env, | ||
278 | offsetof(CPUSPARCState, tick)); | ||
279 | if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) { | ||
280 | -- | 83 | -- |
281 | 2.34.1 | 84 | 2.43.0 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Replace ifdefs with C, tcg_const_i32 with tcg_constant_i32. | ||
2 | We only need a single temporary for this. | ||
3 | 1 | ||
4 | Reviewed-by: Max Filippov <jcmvbkbc@gmail.com> | ||
5 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
6 | --- | ||
7 | target/xtensa/translate.c | 18 +++++++----------- | ||
8 | 1 file changed, 7 insertions(+), 11 deletions(-) | ||
9 | |||
10 | diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c | ||
11 | index XXXXXXX..XXXXXXX 100644 | ||
12 | --- a/target/xtensa/translate.c | ||
13 | +++ b/target/xtensa/translate.c | ||
14 | @@ -XXX,XX +XXX,XX @@ static void translate_b(DisasContext *dc, const OpcodeArg arg[], | ||
15 | static void translate_bb(DisasContext *dc, const OpcodeArg arg[], | ||
16 | const uint32_t par[]) | ||
17 | { | ||
18 | -#if TARGET_BIG_ENDIAN | ||
19 | - TCGv_i32 bit = tcg_const_i32(0x80000000u); | ||
20 | -#else | ||
21 | - TCGv_i32 bit = tcg_const_i32(0x00000001u); | ||
22 | -#endif | ||
23 | TCGv_i32 tmp = tcg_temp_new_i32(); | ||
24 | + | ||
25 | tcg_gen_andi_i32(tmp, arg[1].in, 0x1f); | ||
26 | -#if TARGET_BIG_ENDIAN | ||
27 | - tcg_gen_shr_i32(bit, bit, tmp); | ||
28 | -#else | ||
29 | - tcg_gen_shl_i32(bit, bit, tmp); | ||
30 | -#endif | ||
31 | - tcg_gen_and_i32(tmp, arg[0].in, bit); | ||
32 | + if (TARGET_BIG_ENDIAN) { | ||
33 | + tcg_gen_shr_i32(tmp, tcg_constant_i32(0x80000000u), tmp); | ||
34 | + } else { | ||
35 | + tcg_gen_shl_i32(tmp, tcg_constant_i32(0x00000001u), tmp); | ||
36 | + } | ||
37 | + tcg_gen_and_i32(tmp, arg[0].in, tmp); | ||
38 | gen_brcondi(dc, par[0], tmp, 0, arg[2].imm); | ||
39 | } | ||
40 | |||
41 | -- | ||
42 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | All writes to arg[0].out; use tcg_constant_i32. | ||
2 | 1 | ||
3 | Reviewed-by: Max Filippov <jcmvbkbc@gmail.com> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/xtensa/translate.c | 8 ++++---- | ||
7 | 1 file changed, 4 insertions(+), 4 deletions(-) | ||
8 | |||
9 | diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/xtensa/translate.c | ||
12 | +++ b/target/xtensa/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static void translate_callxw(DisasContext *dc, const OpcodeArg arg[], | ||
14 | static void translate_clamps(DisasContext *dc, const OpcodeArg arg[], | ||
15 | const uint32_t par[]) | ||
16 | { | ||
17 | - TCGv_i32 tmp1 = tcg_const_i32(-1u << arg[2].imm); | ||
18 | - TCGv_i32 tmp2 = tcg_const_i32((1 << arg[2].imm) - 1); | ||
19 | + TCGv_i32 tmp1 = tcg_constant_i32(-1u << arg[2].imm); | ||
20 | + TCGv_i32 tmp2 = tcg_constant_i32((1 << arg[2].imm) - 1); | ||
21 | |||
22 | - tcg_gen_smax_i32(tmp1, tmp1, arg[1].in); | ||
23 | - tcg_gen_smin_i32(arg[0].out, tmp1, tmp2); | ||
24 | + tcg_gen_smax_i32(arg[0].out, tmp1, arg[1].in); | ||
25 | + tcg_gen_smin_i32(arg[0].out, arg[0].out, tmp2); | ||
26 | } | ||
27 | |||
28 | static void translate_clrb_expstate(DisasContext *dc, const OpcodeArg arg[], | ||
29 | -- | ||
30 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Use addi on the addition side and tcg_constant_i32 on the other. | ||
2 | 1 | ||
3 | Reviewed-by: Max Filippov <jcmvbkbc@gmail.com> | ||
4 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
5 | --- | ||
6 | target/xtensa/translate.c | 6 +++--- | ||
7 | 1 file changed, 3 insertions(+), 3 deletions(-) | ||
8 | |||
9 | diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c | ||
10 | index XXXXXXX..XXXXXXX 100644 | ||
11 | --- a/target/xtensa/translate.c | ||
12 | +++ b/target/xtensa/translate.c | ||
13 | @@ -XXX,XX +XXX,XX @@ static void translate_l32r(DisasContext *dc, const OpcodeArg arg[], | ||
14 | TCGv_i32 tmp; | ||
15 | |||
16 | if (dc->base.tb->flags & XTENSA_TBFLAG_LITBASE) { | ||
17 | - tmp = tcg_const_i32(arg[1].raw_imm - 1); | ||
18 | - tcg_gen_add_i32(tmp, cpu_SR[LITBASE], tmp); | ||
19 | + tmp = tcg_temp_new(); | ||
20 | + tcg_gen_addi_i32(tmp, cpu_SR[LITBASE], arg[1].raw_imm - 1); | ||
21 | } else { | ||
22 | - tmp = tcg_const_i32(arg[1].imm); | ||
23 | + tmp = tcg_constant_i32(arg[1].imm); | ||
24 | } | ||
25 | tcg_gen_qemu_ld32u(arg[0].out, tmp, dc->cring); | ||
26 | } | ||
27 | -- | ||
28 | 2.34.1 | diff view generated by jsdifflib |
Deleted patch | |||
---|---|---|---|
1 | Reviewed-by: Max Filippov <jcmvbkbc@gmail.com> | ||
2 | Signed-off-by: Richard Henderson <richard.henderson@linaro.org> | ||
3 | --- | ||
4 | target/xtensa/translate.c | 8 ++++---- | ||
5 | 1 file changed, 4 insertions(+), 4 deletions(-) | ||
6 | 1 | ||
7 | diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c | ||
8 | index XXXXXXX..XXXXXXX 100644 | ||
9 | --- a/target/xtensa/translate.c | ||
10 | +++ b/target/xtensa/translate.c | ||
11 | @@ -XXX,XX +XXX,XX @@ static uint32_t test_exceptions_retw(DisasContext *dc, const OpcodeArg arg[], | ||
12 | static void translate_retw(DisasContext *dc, const OpcodeArg arg[], | ||
13 | const uint32_t par[]) | ||
14 | { | ||
15 | - TCGv_i32 tmp = tcg_const_i32(1); | ||
16 | - tcg_gen_shl_i32(tmp, tmp, cpu_SR[WINDOW_BASE]); | ||
17 | + TCGv_i32 tmp = tcg_temp_new(); | ||
18 | + tcg_gen_shl_i32(tmp, tcg_constant_i32(1), cpu_SR[WINDOW_BASE]); | ||
19 | tcg_gen_andc_i32(cpu_SR[WINDOW_START], | ||
20 | cpu_SR[WINDOW_START], tmp); | ||
21 | tcg_gen_movi_i32(tmp, dc->pc); | ||
22 | @@ -XXX,XX +XXX,XX @@ static void translate_rfi(DisasContext *dc, const OpcodeArg arg[], | ||
23 | static void translate_rfw(DisasContext *dc, const OpcodeArg arg[], | ||
24 | const uint32_t par[]) | ||
25 | { | ||
26 | - TCGv_i32 tmp = tcg_const_i32(1); | ||
27 | + TCGv_i32 tmp = tcg_temp_new(); | ||
28 | |||
29 | tcg_gen_andi_i32(cpu_SR[PS], cpu_SR[PS], ~PS_EXCM); | ||
30 | - tcg_gen_shl_i32(tmp, tmp, cpu_SR[WINDOW_BASE]); | ||
31 | + tcg_gen_shl_i32(tmp, tcg_constant_i32(1), cpu_SR[WINDOW_BASE]); | ||
32 | |||
33 | if (par[0]) { | ||
34 | tcg_gen_andc_i32(cpu_SR[WINDOW_START], | ||
35 | -- | ||
36 | 2.34.1 | diff view generated by jsdifflib |