1
The following changes since commit 14639717bf379480e937716fcaf1e72b47fd4c5f:
1
The following changes since commit aa3a285b5bc56a4208b3b57d4a55291e9c260107:
2
2
3
Merge tag 'pull-trivial-patches' of https://gitlab.com/mjt0k/qemu into staging (2024-01-31 19:53:45 +0000)
3
Merge tag 'mem-2024-12-21' of https://github.com/davidhildenbrand/qemu into staging (2024-12-22 14:33:27 -0500)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20240202
7
https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20241224
8
8
9
for you to fetch changes up to 73e095fc71dfeb8f5f767d9ac71078e562d935b0:
9
for you to fetch changes up to e4a8e093dc74be049f4829831dce76e5edab0003:
10
10
11
target/sparc: Remove FSR_FTT_NMASK, FSR_FTT_CEXC_NMASK (2024-02-02 14:40:06 +1000)
11
accel/tcg: Move gen_intermediate_code to TCGCPUOps.translate_core (2024-12-24 08:32:15 -0800)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
tests/tcg: Fix multiarch/gdbstub/prot-none.py
14
tcg/optimize: Remove in-flight mask data from OptContext
15
hw/core: Convert cpu_mmu_index to a CPUClass hook
15
fpu: Add float*_muladd_scalbn
16
tcg/loongarch64: Set vector registers call clobbered
16
fpu: Remove float_muladd_halve_result
17
target/sparc: floating-point cleanup
17
fpu: Add float_round_nearest_even_max
18
fpu: Add float_muladd_suppress_add_product_zero
19
target/hexagon: Use float32_muladd
20
accel/tcg: Move gen_intermediate_code to TCGCPUOps.translate_core
18
21
19
----------------------------------------------------------------
22
----------------------------------------------------------------
20
Ilya Leoshkevich (1):
23
Ilya Leoshkevich (1):
21
tests/tcg: Fix the /proc/self/mem probing in the PROT_NONE gdbstub test
24
tests/tcg: Do not use inttypes.h in multiarch/system/memory.c
22
25
23
Richard Henderson (56):
26
Pierrick Bouvier (1):
24
include/hw/core: Add mmu_index to CPUClass
27
plugins: optimize cpu_index code generation
25
target/alpha: Split out alpha_env_mmu_index
26
target/alpha: Populate CPUClass.mmu_index
27
target/arm: Split out arm_env_mmu_index
28
target/arm: Populate CPUClass.mmu_index
29
target/avr: Populate CPUClass.mmu_index
30
target/cris: Cache mem_index in DisasContext
31
target/cris: Populate CPUClass.mmu_index
32
target/hppa: Populate CPUClass.mmu_index
33
target/i386: Populate CPUClass.mmu_index
34
target/loongarch: Populate CPUClass.mmu_index
35
target/loongarch: Rename MMU_IDX_*
36
target/m68k: Populate CPUClass.mmu_index
37
target/microblaze: Populate CPUClass.mmu_index
38
target/mips: Pass ptw_mmu_idx down from mips_cpu_tlb_fill
39
target/mips: Split out mips_env_mmu_index
40
target/mips: Populate CPUClass.mmu_index
41
target/nios2: Populate CPUClass.mmu_index
42
target/openrisc: Populate CPUClass.mmu_index
43
target/ppc: Split out ppc_env_mmu_index
44
target/ppc: Populate CPUClass.mmu_index
45
target/riscv: Rename riscv_cpu_mmu_index to riscv_env_mmu_index
46
target/riscv: Replace cpu_mmu_index with riscv_env_mmu_index
47
target/riscv: Populate CPUClass.mmu_index
48
target/rx: Populate CPUClass.mmu_index
49
target/s390x: Split out s390x_env_mmu_index
50
target/s390x: Populate CPUClass.mmu_index
51
target/sh4: Populate CPUClass.mmu_index
52
target/sparc: Populate CPUClass.mmu_index
53
target/tricore: Populate CPUClass.mmu_index
54
target/xtensa: Populate CPUClass.mmu_index
55
include/exec: Implement cpu_mmu_index generically
56
include/exec: Change cpu_mmu_index argument to CPUState
57
tcg/loongarch64: Set vector registers call clobbered
58
target/sparc: Use tcg_gen_qemu_{ld, st}_i128 for ASI_M_BCOPY
59
target/sparc: Use tcg_gen_qemu_{ld, st}_i128 for ASI_M_BFILL
60
target/sparc: Remove gen_dest_fpr_F
61
target/sparc: Introduce gen_{load,store}_fpr_Q
62
target/sparc: Inline FNEG, FABS
63
target/sparc: Use i128 for FSQRTq
64
target/sparc: Use i128 for FADDq, FSUBq, FMULq, FDIVq
65
target/sparc: Use i128 for FqTOs, FqTOi
66
target/sparc: Use i128 for FqTOd, FqTOx
67
target/sparc: Use i128 for FCMPq, FCMPEq
68
target/sparc: Use i128 for FsTOq, FiTOq
69
target/sparc: Use i128 for FdTOq, FxTOq
70
target/sparc: Use i128 for Fdmulq
71
target/sparc: Remove qt0, qt1 temporaries
72
target/sparc: Introduce cpu_get_fsr, cpu_put_fsr
73
target/sparc: Split ver from env->fsr
74
target/sparc: Clear cexc and ftt in do_check_ieee_exceptions
75
target/sparc: Merge check_ieee_exceptions with FPop helpers
76
target/sparc: Split cexc and ftt from env->fsr
77
target/sparc: Remove cpu_fsr
78
target/sparc: Split fcc out of env->fsr
79
target/sparc: Remove FSR_FTT_NMASK, FSR_FTT_CEXC_NMASK
80
28
81
include/exec/cpu-all.h | 4 +
29
Richard Henderson (70):
82
include/exec/cpu-common.h | 21 +
30
tcg/optimize: Split out finish_bb, finish_ebb
83
include/hw/core/cpu.h | 3 +
31
tcg/optimize: Split out fold_affected_mask
84
target/alpha/cpu.h | 2 +-
32
tcg/optimize: Copy mask writeback to fold_masks
85
target/arm/cpu.h | 13 -
33
tcg/optimize: Split out fold_masks_zs
86
target/arm/internals.h | 5 +
34
tcg/optimize: Augment s_mask from z_mask in fold_masks_zs
87
target/avr/cpu.h | 7 -
35
tcg/optimize: Change representation of s_mask
88
target/cris/cpu.h | 4 -
36
tcg/optimize: Use finish_folding in fold_add, fold_add_vec, fold_addsub2
89
target/hexagon/cpu.h | 9 -
37
tcg/optimize: Introduce const value accessors for TempOptInfo
90
target/hppa/cpu.h | 13 -
38
tcg/optimize: Use fold_masks_zs in fold_and
91
target/i386/cpu.h | 7 -
39
tcg/optimize: Use fold_masks_zs in fold_andc
92
target/loongarch/cpu.h | 18 +-
40
tcg/optimize: Use fold_masks_zs in fold_bswap
93
target/m68k/cpu.h | 4 -
41
tcg/optimize: Use fold_masks_zs in fold_count_zeros
94
target/microblaze/cpu.h | 15 -
42
tcg/optimize: Use fold_masks_z in fold_ctpop
95
target/mips/cpu.h | 6 +-
43
tcg/optimize: Use fold_and and fold_masks_z in fold_deposit
96
target/nios2/cpu.h | 6 -
44
tcg/optimize: Compute sign mask in fold_deposit
97
target/openrisc/cpu.h | 12 -
45
tcg/optimize: Use finish_folding in fold_divide
98
target/ppc/cpu.h | 2 +-
46
tcg/optimize: Use finish_folding in fold_dup, fold_dup2
99
target/riscv/cpu.h | 4 +-
47
tcg/optimize: Use fold_masks_s in fold_eqv
100
target/rx/cpu.h | 5 -
48
tcg/optimize: Use fold_masks_z in fold_extract
101
target/s390x/cpu.h | 2 +-
49
tcg/optimize: Use finish_folding in fold_extract2
102
target/sh4/cpu.h | 10 -
50
tcg/optimize: Use fold_masks_zs in fold_exts
103
target/sparc/cpu.h | 69 +-
51
tcg/optimize: Use fold_masks_z in fold_extu
104
target/sparc/helper.h | 116 ++-
52
tcg/optimize: Use fold_masks_zs in fold_movcond
105
target/tricore/cpu.h | 5 -
53
tcg/optimize: Use finish_folding in fold_mul*
106
target/xtensa/cpu.h | 5 -
54
tcg/optimize: Use fold_masks_s in fold_nand
107
accel/tcg/cputlb.c | 22 +-
55
tcg/optimize: Use fold_masks_z in fold_neg_no_const
108
linux-user/sparc/cpu_loop.c | 2 +-
56
tcg/optimize: Use fold_masks_s in fold_nor
109
linux-user/sparc/signal.c | 14 +-
57
tcg/optimize: Use fold_masks_s in fold_not
110
semihosting/uaccess.c | 2 +-
58
tcg/optimize: Use fold_masks_zs in fold_or
111
target/alpha/cpu.c | 6 +
59
tcg/optimize: Use fold_masks_zs in fold_orc
112
target/alpha/translate.c | 2 +-
60
tcg/optimize: Use fold_masks_zs in fold_qemu_ld
113
target/arm/cpu.c | 6 +
61
tcg/optimize: Return true from fold_qemu_st, fold_tcg_st
114
target/arm/helper.c | 2 +-
62
tcg/optimize: Use finish_folding in fold_remainder
115
target/arm/tcg/helper-a64.c | 4 +-
63
tcg/optimize: Distinguish simplification in fold_setcond_zmask
116
target/arm/tcg/mte_helper.c | 18 +-
64
tcg/optimize: Use fold_masks_z in fold_setcond
117
target/arm/tcg/sve_helper.c | 8 +-
65
tcg/optimize: Use fold_masks_s in fold_negsetcond
118
target/arm/tcg/tlb_helper.c | 2 +-
66
tcg/optimize: Use fold_masks_z in fold_setcond2
119
target/avr/cpu.c | 6 +
67
tcg/optimize: Use finish_folding in fold_cmp_vec
120
target/cris/cpu.c | 6 +
68
tcg/optimize: Use finish_folding in fold_cmpsel_vec
121
target/cris/translate.c | 14 +-
69
tcg/optimize: Use fold_masks_zs in fold_sextract
122
target/hppa/cpu.c | 12 +
70
tcg/optimize: Use fold_masks_zs, fold_masks_s in fold_shift
123
target/hppa/mem_helper.c | 2 +-
71
tcg/optimize: Simplify sign bit test in fold_shift
124
target/hppa/op_helper.c | 8 +-
72
tcg/optimize: Use finish_folding in fold_sub, fold_sub_vec
125
target/i386/cpu.c | 10 +
73
tcg/optimize: Use fold_masks_zs in fold_tcg_ld
126
target/i386/tcg/translate.c | 2 +-
74
tcg/optimize: Use finish_folding in fold_tcg_ld_memcopy
127
target/loongarch/cpu.c | 11 +
75
tcg/optimize: Use fold_masks_zs in fold_xor
128
target/loongarch/tcg/tlb_helper.c | 8 +-
76
tcg/optimize: Use finish_folding in fold_bitsel_vec
129
target/loongarch/tcg/translate.c | 2 +-
77
tcg/optimize: Use finish_folding as default in tcg_optimize
130
target/m68k/cpu.c | 6 +
78
tcg/optimize: Remove z_mask, s_mask from OptContext
131
target/m68k/op_helper.c | 2 +-
79
tcg/optimize: Re-enable sign-mask optimizations
132
target/microblaze/cpu.c | 18 +-
80
tcg/optimize: Move fold_bitsel_vec into alphabetic sort
133
target/microblaze/helper.c | 3 +-
81
tcg/optimize: Move fold_cmp_vec, fold_cmpsel_vec into alphabetic sort
134
target/microblaze/mmu.c | 2 +-
82
softfloat: Add float{16,32,64}_muladd_scalbn
135
target/microblaze/translate.c | 2 +-
83
target/arm: Use float*_muladd_scalbn
136
target/mips/cpu.c | 6 +
84
target/sparc: Use float*_muladd_scalbn
137
target/mips/sysemu/physaddr.c | 2 +-
85
softfloat: Remove float_muladd_halve_result
138
target/mips/tcg/msa_helper.c | 10 +-
86
softfloat: Add float_round_nearest_even_max
139
target/mips/tcg/sysemu/cp0_helper.c | 2 +-
87
softfloat: Add float_muladd_suppress_add_product_zero
140
target/mips/tcg/sysemu/special_helper.c | 2 +-
88
target/hexagon: Use float32_mul in helper_sfmpy
141
target/mips/tcg/sysemu/tlb_helper.c | 34 +-
89
target/hexagon: Use float32_muladd for helper_sffma
142
target/nios2/cpu.c | 7 +
90
target/hexagon: Use float32_muladd for helper_sffms
143
target/nios2/translate.c | 2 +-
91
target/hexagon: Use float32_muladd_scalbn for helper_sffma_sc
144
target/openrisc/cpu.c | 13 +
92
target/hexagon: Use float32_muladd for helper_sffm[as]_lib
145
target/openrisc/translate.c | 2 +-
93
target/hexagon: Remove internal_fmafx
146
target/ppc/cpu_init.c | 8 +-
94
target/hexagon: Expand GEN_XF_ROUND
147
target/ppc/mem_helper.c | 10 +-
95
target/hexagon: Remove Float
148
target/ppc/mmu_common.c | 4 +-
96
target/hexagon: Remove Double
149
target/riscv/cpu.c | 6 +
97
target/hexagon: Use mulu64 for int128_mul_6464
150
target/riscv/cpu_helper.c | 6 +-
98
target/hexagon: Simplify internal_mpyhh setup
151
target/riscv/op_helper.c | 4 +-
99
accel/tcg: Move gen_intermediate_code to TCGCPUOps.translate_core
152
target/riscv/vector_helper.c | 9 +-
100
153
target/rx/cpu.c | 6 +
101
include/exec/translator.h | 14 -
154
target/s390x/cpu.c | 6 +
102
include/fpu/softfloat-types.h | 2 +
155
target/s390x/tcg/mem_helper.c | 34 +-
103
include/fpu/softfloat.h | 14 +-
156
target/sh4/cpu.c | 16 +
104
include/hw/core/tcg-cpu-ops.h | 13 +
157
target/sparc/cpu.c | 61 +-
105
target/alpha/cpu.h | 2 +
158
target/sparc/fop_helper.c | 510 +++++++------
106
target/arm/internals.h | 2 +
159
target/sparc/gdbstub.c | 8 +-
107
target/avr/cpu.h | 2 +
160
target/sparc/ldst_helper.c | 5 +-
108
target/hexagon/cpu.h | 2 +
161
target/sparc/machine.c | 36 +-
109
target/hexagon/fma_emu.h | 3 -
162
target/sparc/mmu_helper.c | 2 +-
110
target/hppa/cpu.h | 2 +
163
target/sparc/translate.c | 799 +++++++--------------
111
target/i386/tcg/helper-tcg.h | 2 +
164
target/tricore/cpu.c | 6 +
112
target/loongarch/internals.h | 2 +
165
target/tricore/helper.c | 2 +-
113
target/m68k/cpu.h | 2 +
166
target/tricore/translate.c | 2 +-
114
target/microblaze/cpu.h | 2 +
167
target/xtensa/cpu.c | 6 +
115
target/mips/tcg/tcg-internal.h | 2 +
168
target/xtensa/mmu_helper.c | 2 +-
116
target/openrisc/cpu.h | 2 +
169
accel/tcg/ldst_common.c.inc | 42 +-
117
target/ppc/cpu.h | 2 +
170
target/cris/translate_v10.c.inc | 6 +-
118
target/riscv/cpu.h | 3 +
171
.../tcg/insn_trans/trans_privileged.c.inc | 2 +-
119
target/rx/cpu.h | 2 +
172
tcg/loongarch64/tcg-target.c.inc | 2 +-
120
target/s390x/s390x-internal.h | 2 +
173
tests/tcg/multiarch/gdbstub/prot-none.py | 2 +-
121
target/sh4/cpu.h | 2 +
174
93 files changed, 1060 insertions(+), 1191 deletions(-)
122
target/sparc/cpu.h | 2 +
123
target/sparc/helper.h | 4 +-
124
target/tricore/cpu.h | 2 +
125
target/xtensa/cpu.h | 2 +
126
accel/tcg/cpu-exec.c | 8 +-
127
accel/tcg/plugin-gen.c | 9 +
128
accel/tcg/translate-all.c | 8 +-
129
fpu/softfloat.c | 63 +--
130
target/alpha/cpu.c | 1 +
131
target/alpha/translate.c | 4 +-
132
target/arm/cpu.c | 1 +
133
target/arm/tcg/cpu-v7m.c | 1 +
134
target/arm/tcg/helper-a64.c | 6 +-
135
target/arm/tcg/translate.c | 5 +-
136
target/avr/cpu.c | 1 +
137
target/avr/translate.c | 6 +-
138
target/hexagon/cpu.c | 1 +
139
target/hexagon/fma_emu.c | 496 ++++++---------------
140
target/hexagon/op_helper.c | 125 ++----
141
target/hexagon/translate.c | 4 +-
142
target/hppa/cpu.c | 1 +
143
target/hppa/translate.c | 4 +-
144
target/i386/tcg/tcg-cpu.c | 1 +
145
target/i386/tcg/translate.c | 5 +-
146
target/loongarch/cpu.c | 1 +
147
target/loongarch/tcg/translate.c | 4 +-
148
target/m68k/cpu.c | 1 +
149
target/m68k/translate.c | 4 +-
150
target/microblaze/cpu.c | 1 +
151
target/microblaze/translate.c | 4 +-
152
target/mips/cpu.c | 1 +
153
target/mips/tcg/translate.c | 4 +-
154
target/openrisc/cpu.c | 1 +
155
target/openrisc/translate.c | 4 +-
156
target/ppc/cpu_init.c | 1 +
157
target/ppc/translate.c | 4 +-
158
target/riscv/tcg/tcg-cpu.c | 1 +
159
target/riscv/translate.c | 4 +-
160
target/rx/cpu.c | 1 +
161
target/rx/translate.c | 4 +-
162
target/s390x/cpu.c | 1 +
163
target/s390x/tcg/translate.c | 4 +-
164
target/sh4/cpu.c | 1 +
165
target/sh4/translate.c | 4 +-
166
target/sparc/cpu.c | 1 +
167
target/sparc/fop_helper.c | 8 +-
168
target/sparc/translate.c | 84 ++--
169
target/tricore/cpu.c | 1 +
170
target/tricore/translate.c | 5 +-
171
target/xtensa/cpu.c | 1 +
172
target/xtensa/translate.c | 4 +-
173
tcg/optimize.c | 857 +++++++++++++++++++-----------------
174
tests/tcg/multiarch/system/memory.c | 9 +-
175
fpu/softfloat-parts.c.inc | 16 +-
176
75 files changed, 866 insertions(+), 1009 deletions(-)
diff view generated by jsdifflib
1
From: Ilya Leoshkevich <iii@linux.ibm.com>
1
From: Ilya Leoshkevich <iii@linux.ibm.com>
2
2
3
The `if not probe_proc_self_mem` check never passes, because
3
make check-tcg fails on Fedora with the following error message:
4
probe_proc_self_mem is a function object, which is a truthy value.
5
Add parentheses in order to perform a function call.
6
4
7
Fixes: dc84d50a7f9b ("tests/tcg: Add the PROT_NONE gdbstub test")
5
alpha-linux-gnu-gcc [...] qemu/tests/tcg/multiarch/system/memory.c -o memory [...]
6
qemu/tests/tcg/multiarch/system/memory.c:17:10: fatal error: inttypes.h: No such file or directory
7
17 | #include <inttypes.h>
8
| ^~~~~~~~~~~~
9
compilation terminated.
10
11
The reason is that Fedora has cross-compilers, but no cross-glibc
12
headers. Fix by hardcoding the format specifiers and dropping the
13
include.
14
15
An alternative fix would be to introduce a configure check for
16
inttypes.h. But this would make it impossible to use Fedora
17
cross-compilers for softmmu tests, which used to work so far.
18
19
Fixes: ecbcc9ead2f8 ("tests/tcg: add a system test to check memory instrumentation")
8
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
20
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
9
Message-Id: <20240131220245.235993-1-iii@linux.ibm.com>
21
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
22
Message-ID: <20241010085906.226249-1-iii@linux.ibm.com>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
23
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
---
24
---
12
tests/tcg/multiarch/gdbstub/prot-none.py | 2 +-
25
tests/tcg/multiarch/system/memory.c | 9 ++++-----
13
1 file changed, 1 insertion(+), 1 deletion(-)
26
1 file changed, 4 insertions(+), 5 deletions(-)
14
27
15
diff --git a/tests/tcg/multiarch/gdbstub/prot-none.py b/tests/tcg/multiarch/gdbstub/prot-none.py
28
diff --git a/tests/tcg/multiarch/system/memory.c b/tests/tcg/multiarch/system/memory.c
16
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/tcg/multiarch/gdbstub/prot-none.py
30
--- a/tests/tcg/multiarch/system/memory.c
18
+++ b/tests/tcg/multiarch/gdbstub/prot-none.py
31
+++ b/tests/tcg/multiarch/system/memory.c
19
@@ -XXX,XX +XXX,XX @@ def probe_proc_self_mem():
32
@@ -XXX,XX +XXX,XX @@
20
33
21
def run_test():
34
#include <stdint.h>
22
"""Run through the tests one by one"""
35
#include <stdbool.h>
23
- if not probe_proc_self_mem:
36
-#include <inttypes.h>
24
+ if not probe_proc_self_mem():
37
#include <minilib.h>
25
print("SKIP: /proc/self/mem is not usable")
38
26
exit(0)
39
#ifndef CHECK_UNALIGNED
27
gdb.Breakpoint("break_here")
40
@@ -XXX,XX +XXX,XX @@ int main(void)
41
int i;
42
bool ok = true;
43
44
- ml_printf("Test data start: 0x%"PRIxPTR"\n", &test_data[0]);
45
- ml_printf("Test data end: 0x%"PRIxPTR"\n", &test_data[TEST_SIZE]);
46
+ ml_printf("Test data start: 0x%lx\n", (unsigned long)&test_data[0]);
47
+ ml_printf("Test data end: 0x%lx\n", (unsigned long)&test_data[TEST_SIZE]);
48
49
/* Run through the unsigned tests first */
50
for (i = 0; i < ARRAY_SIZE(init_ufns) && ok; i++) {
51
@@ -XXX,XX +XXX,XX @@ int main(void)
52
ok = do_signed_reads(true);
53
}
54
55
- ml_printf("Test data read: %"PRId32"\n", test_read_count);
56
- ml_printf("Test data write: %"PRId32"\n", test_write_count);
57
+ ml_printf("Test data read: %lu\n", (unsigned long)test_read_count);
58
+ ml_printf("Test data write: %lu\n", (unsigned long)test_write_count);
59
ml_printf("Test complete: %s\n", ok ? "PASSED" : "FAILED");
60
return ok ? 0 : -1;
61
}
28
--
62
--
29
2.34.1
63
2.43.0
diff view generated by jsdifflib
New patch
1
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
2
3
When running with a single vcpu, we can return a constant instead of a
4
load when accessing cpu_index.
5
A side effect is that all tcg operations using it are optimized, most
6
notably scoreboard access.
7
When running a simple loop in user-mode, the speedup is around 20%.
8
9
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
10
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Message-ID: <20241128213843.1023080-1-pierrick.bouvier@linaro.org>
13
---
14
accel/tcg/plugin-gen.c | 9 +++++++++
15
1 file changed, 9 insertions(+)
16
17
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/accel/tcg/plugin-gen.c
20
+++ b/accel/tcg/plugin-gen.c
21
@@ -XXX,XX +XXX,XX @@ static void gen_disable_mem_helper(void)
22
23
static TCGv_i32 gen_cpu_index(void)
24
{
25
+ /*
26
+ * Optimize when we run with a single vcpu. All values using cpu_index,
27
+ * including scoreboard index, will be optimized out.
28
+ * User-mode calls tb_flush when setting this flag. In system-mode, all
29
+ * vcpus are created before generating code.
30
+ */
31
+ if (!tcg_cflags_has(current_cpu, CF_PARALLEL)) {
32
+ return tcg_constant_i32(current_cpu->cpu_index);
33
+ }
34
TCGv_i32 cpu_index = tcg_temp_ebb_new_i32();
35
tcg_gen_ld_i32(cpu_index, tcg_env,
36
-offsetof(ArchCPU, env) + offsetof(CPUState, cpu_index));
37
--
38
2.43.0
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Call them directly from the opcode switch statement in tcg_optimize,
2
rather than in finish_folding based on opcode flags. Adjust folding
3
of conditional branches to match.
4
5
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
7
---
4
target/openrisc/cpu.h | 10 ++--------
8
tcg/optimize.c | 47 +++++++++++++++++++++++++++++++----------------
5
target/openrisc/cpu.c | 13 +++++++++++++
9
1 file changed, 31 insertions(+), 16 deletions(-)
6
2 files changed, 15 insertions(+), 8 deletions(-)
7
10
8
diff --git a/target/openrisc/cpu.h b/target/openrisc/cpu.h
11
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
10
--- a/target/openrisc/cpu.h
13
--- a/tcg/optimize.c
11
+++ b/target/openrisc/cpu.h
14
+++ b/tcg/optimize.c
12
@@ -XXX,XX +XXX,XX @@ static inline void cpu_get_tb_cpu_state(CPUOpenRISCState *env, vaddr *pc,
15
@@ -XXX,XX +XXX,XX @@ static void copy_propagate(OptContext *ctx, TCGOp *op,
13
| (env->sr & (SR_SM | SR_DME | SR_IME | SR_OVE));
16
}
14
}
17
}
15
18
16
+int openrisc_cpu_mmu_index(CPUState *cs, bool ifetch);
19
+static void finish_bb(OptContext *ctx)
17
static inline int cpu_mmu_index(CPUOpenRISCState *env, bool ifetch)
20
+{
21
+ /* We only optimize memory barriers across basic blocks. */
22
+ ctx->prev_mb = NULL;
23
+}
24
+
25
+static void finish_ebb(OptContext *ctx)
26
+{
27
+ finish_bb(ctx);
28
+ /* We only optimize across extended basic blocks. */
29
+ memset(&ctx->temps_used, 0, sizeof(ctx->temps_used));
30
+ remove_mem_copy_all(ctx);
31
+}
32
+
33
static void finish_folding(OptContext *ctx, TCGOp *op)
18
{
34
{
19
- int ret = MMU_NOMMU_IDX; /* mmu is disabled */
35
const TCGOpDef *def = &tcg_op_defs[op->opc];
20
-
36
int i, nb_oargs;
21
- if (env->sr & (ifetch ? SR_IME : SR_DME)) {
37
22
- /* The mmu is enabled; test supervisor state. */
38
- /*
23
- ret = env->sr & SR_SM ? MMU_SUPERVISOR_IDX : MMU_USER_IDX;
39
- * We only optimize extended basic blocks. If the opcode ends a BB
40
- * and is not a conditional branch, reset all temp data.
41
- */
42
- if (def->flags & TCG_OPF_BB_END) {
43
- ctx->prev_mb = NULL;
44
- if (!(def->flags & TCG_OPF_COND_BRANCH)) {
45
- memset(&ctx->temps_used, 0, sizeof(ctx->temps_used));
46
- remove_mem_copy_all(ctx);
47
- }
48
- return;
24
- }
49
- }
25
-
50
-
26
- return ret;
51
nb_oargs = def->nb_oargs;
27
+ return openrisc_cpu_mmu_index(env_cpu(env), ifetch);
52
for (i = 0; i < nb_oargs; i++) {
53
TCGTemp *ts = arg_temp(op->args[i]);
54
@@ -XXX,XX +XXX,XX @@ static bool fold_brcond(OptContext *ctx, TCGOp *op)
55
if (i > 0) {
56
op->opc = INDEX_op_br;
57
op->args[0] = op->args[3];
58
+ finish_ebb(ctx);
59
+ } else {
60
+ finish_bb(ctx);
61
}
62
- return false;
63
+ return true;
28
}
64
}
29
65
30
static inline uint32_t cpu_get_sr(const CPUOpenRISCState *env)
66
static bool fold_brcond2(OptContext *ctx, TCGOp *op)
31
diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c
67
@@ -XXX,XX +XXX,XX @@ static bool fold_brcond2(OptContext *ctx, TCGOp *op)
32
index XXXXXXX..XXXXXXX 100644
68
}
33
--- a/target/openrisc/cpu.c
69
op->opc = INDEX_op_br;
34
+++ b/target/openrisc/cpu.c
70
op->args[0] = label;
35
@@ -XXX,XX +XXX,XX @@ static bool openrisc_cpu_has_work(CPUState *cs)
71
- break;
36
CPU_INTERRUPT_TIMER);
72
+ finish_ebb(ctx);
73
+ return true;
74
}
75
- return false;
76
+
77
+ finish_bb(ctx);
78
+ return true;
37
}
79
}
38
80
39
+int openrisc_cpu_mmu_index(CPUState *cs, bool ifetch)
81
static bool fold_bswap(OptContext *ctx, TCGOp *op)
40
+{
82
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
41
+ CPUOpenRISCState *env = cpu_env(cs);
83
CASE_OP_32_64_VEC(xor):
42
+
84
done = fold_xor(&ctx, op);
43
+ if (env->sr & (ifetch ? SR_IME : SR_DME)) {
85
break;
44
+ /* The mmu is enabled; test supervisor state. */
86
+ case INDEX_op_set_label:
45
+ return env->sr & SR_SM ? MMU_SUPERVISOR_IDX : MMU_USER_IDX;
87
+ case INDEX_op_br:
46
+ }
88
+ case INDEX_op_exit_tb:
47
+
89
+ case INDEX_op_goto_tb:
48
+ return MMU_NOMMU_IDX; /* mmu is disabled */
90
+ case INDEX_op_goto_ptr:
49
+}
91
+ finish_ebb(&ctx);
50
+
92
+ done = true;
51
static void openrisc_disas_set_info(CPUState *cpu, disassemble_info *info)
93
+ break;
52
{
94
default:
53
info->print_insn = print_insn_or1k;
95
break;
54
@@ -XXX,XX +XXX,XX @@ static void openrisc_cpu_class_init(ObjectClass *oc, void *data)
96
}
55
56
cc->class_by_name = openrisc_cpu_class_by_name;
57
cc->has_work = openrisc_cpu_has_work;
58
+ cc->mmu_index = openrisc_cpu_mmu_index;
59
cc->dump_state = openrisc_cpu_dump_state;
60
cc->set_pc = openrisc_cpu_set_pc;
61
cc->get_pc = openrisc_cpu_get_pc;
62
--
97
--
63
2.34.1
98
2.43.0
64
65
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
There are only a few logical operations which can compute
2
an "affected" mask. Split out handling of this optimization
3
to a separate function, only to be called when applicable.
4
5
Remove the a_mask field from OptContext, as the mask is
6
no longer stored anywhere.
7
8
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
10
---
4
target/alpha/cpu.h | 7 ++++++-
11
tcg/optimize.c | 42 +++++++++++++++++++++++++++---------------
5
target/alpha/translate.c | 2 +-
12
1 file changed, 27 insertions(+), 15 deletions(-)
6
2 files changed, 7 insertions(+), 2 deletions(-)
7
13
8
diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h
14
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
10
--- a/target/alpha/cpu.h
16
--- a/tcg/optimize.c
11
+++ b/target/alpha/cpu.h
17
+++ b/tcg/optimize.c
12
@@ -XXX,XX +XXX,XX @@ enum {
18
@@ -XXX,XX +XXX,XX @@ typedef struct OptContext {
13
19
QSIMPLEQ_HEAD(, MemCopyInfo) mem_free;
14
#define TB_FLAG_UNALIGN (1u << 1)
20
15
21
/* In flight values from optimization. */
16
-static inline int cpu_mmu_index(CPUAlphaState *env, bool ifetch)
22
- uint64_t a_mask; /* mask bit is 0 iff value identical to first input */
17
+static inline int alpha_env_mmu_index(CPUAlphaState *env)
23
uint64_t z_mask; /* mask bit is 0 iff value bit is 0 */
24
uint64_t s_mask; /* mask of clrsb(value) bits */
25
TCGType type;
26
@@ -XXX,XX +XXX,XX @@ static bool fold_const2_commutative(OptContext *ctx, TCGOp *op)
27
28
static bool fold_masks(OptContext *ctx, TCGOp *op)
18
{
29
{
19
int ret = env->flags & ENV_FLAG_PS_USER ? MMU_USER_IDX : MMU_KERNEL_IDX;
30
- uint64_t a_mask = ctx->a_mask;
20
if (env->flags & ENV_FLAG_PAL_MODE) {
31
uint64_t z_mask = ctx->z_mask;
21
@@ -XXX,XX +XXX,XX @@ static inline int cpu_mmu_index(CPUAlphaState *env, bool ifetch)
32
uint64_t s_mask = ctx->s_mask;
22
return ret;
33
23
}
34
@@ -XXX,XX +XXX,XX @@ static bool fold_masks(OptContext *ctx, TCGOp *op)
24
35
* type changing opcodes.
25
+static inline int cpu_mmu_index(CPUAlphaState *env, bool ifetch)
36
*/
26
+{
37
if (ctx->type == TCG_TYPE_I32) {
27
+ return alpha_env_mmu_index(env);
38
- a_mask = (int32_t)a_mask;
39
z_mask = (int32_t)z_mask;
40
s_mask |= MAKE_64BIT_MASK(32, 32);
41
ctx->z_mask = z_mask;
42
@@ -XXX,XX +XXX,XX @@ static bool fold_masks(OptContext *ctx, TCGOp *op)
43
if (z_mask == 0) {
44
return tcg_opt_gen_movi(ctx, op, op->args[0], 0);
45
}
46
+ return false;
28
+}
47
+}
29
+
48
+
30
enum {
49
+/*
31
IR_V0 = 0,
50
+ * An "affected" mask bit is 0 if and only if the result is identical
32
IR_T0 = 1,
51
+ * to the first input. Thus if the entire mask is 0, the operation
33
diff --git a/target/alpha/translate.c b/target/alpha/translate.c
52
+ * is equivalent to a copy.
34
index XXXXXXX..XXXXXXX 100644
53
+ */
35
--- a/target/alpha/translate.c
54
+static bool fold_affected_mask(OptContext *ctx, TCGOp *op, uint64_t a_mask)
36
+++ b/target/alpha/translate.c
55
+{
37
@@ -XXX,XX +XXX,XX @@ static void alpha_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu)
56
+ if (ctx->type == TCG_TYPE_I32) {
38
int64_t bound;
57
+ a_mask = (uint32_t)a_mask;
39
58
+ }
40
ctx->tbflags = ctx->base.tb->flags;
59
if (a_mask == 0) {
41
- ctx->mem_idx = cpu_mmu_index(env, false);
60
return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[1]);
42
+ ctx->mem_idx = alpha_env_mmu_index(env);
61
}
43
ctx->implver = env->implver;
62
@@ -XXX,XX +XXX,XX @@ static bool fold_and(OptContext *ctx, TCGOp *op)
44
ctx->amask = env->amask;
63
* Known-zeros does not imply known-ones. Therefore unless
64
* arg2 is constant, we can't infer affected bits from it.
65
*/
66
- if (arg_is_const(op->args[2])) {
67
- ctx->a_mask = z1 & ~z2;
68
+ if (arg_is_const(op->args[2]) &&
69
+ fold_affected_mask(ctx, op, z1 & ~z2)) {
70
+ return true;
71
}
72
73
return fold_masks(ctx, op);
74
@@ -XXX,XX +XXX,XX @@ static bool fold_andc(OptContext *ctx, TCGOp *op)
75
*/
76
if (arg_is_const(op->args[2])) {
77
uint64_t z2 = ~arg_info(op->args[2])->z_mask;
78
- ctx->a_mask = z1 & ~z2;
79
+ if (fold_affected_mask(ctx, op, z1 & ~z2)) {
80
+ return true;
81
+ }
82
z1 &= z2;
83
}
84
ctx->z_mask = z1;
85
@@ -XXX,XX +XXX,XX @@ static bool fold_extract(OptContext *ctx, TCGOp *op)
86
87
z_mask_old = arg_info(op->args[1])->z_mask;
88
z_mask = extract64(z_mask_old, pos, len);
89
- if (pos == 0) {
90
- ctx->a_mask = z_mask_old ^ z_mask;
91
+ if (pos == 0 && fold_affected_mask(ctx, op, z_mask_old ^ z_mask)) {
92
+ return true;
93
}
94
ctx->z_mask = z_mask;
95
ctx->s_mask = smask_from_zmask(z_mask);
96
@@ -XXX,XX +XXX,XX @@ static bool fold_exts(OptContext *ctx, TCGOp *op)
97
98
ctx->z_mask = z_mask;
99
ctx->s_mask = s_mask;
100
- if (!type_change) {
101
- ctx->a_mask = s_mask & ~s_mask_old;
102
+ if (!type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
103
+ return true;
104
}
105
106
return fold_masks(ctx, op);
107
@@ -XXX,XX +XXX,XX @@ static bool fold_extu(OptContext *ctx, TCGOp *op)
108
109
ctx->z_mask = z_mask;
110
ctx->s_mask = smask_from_zmask(z_mask);
111
- if (!type_change) {
112
- ctx->a_mask = z_mask_old ^ z_mask;
113
+ if (!type_change && fold_affected_mask(ctx, op, z_mask_old ^ z_mask)) {
114
+ return true;
115
}
116
return fold_masks(ctx, op);
117
}
118
@@ -XXX,XX +XXX,XX @@ static bool fold_sextract(OptContext *ctx, TCGOp *op)
119
s_mask |= MAKE_64BIT_MASK(len, 64 - len);
120
ctx->s_mask = s_mask;
121
122
- if (pos == 0) {
123
- ctx->a_mask = s_mask & ~s_mask_old;
124
+ if (pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
125
+ return true;
126
}
127
128
return fold_masks(ctx, op);
129
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
130
}
131
132
/* Assume all bits affected, no bits known zero, no sign reps. */
133
- ctx.a_mask = -1;
134
ctx.z_mask = -1;
135
ctx.s_mask = 0;
45
136
46
--
137
--
47
2.34.1
138
2.43.0
48
49
diff view generated by jsdifflib
New patch
1
Use of fold_masks should be restricted to those opcodes that
2
can reliably make use of it -- those with a single output,
3
and from higher-level folders that set up the masks.
4
Prepare for conversion of each folder in turn.
1
5
6
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
9
tcg/optimize.c | 17 ++++++++++++++---
10
1 file changed, 14 insertions(+), 3 deletions(-)
11
12
diff --git a/tcg/optimize.c b/tcg/optimize.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/tcg/optimize.c
15
+++ b/tcg/optimize.c
16
@@ -XXX,XX +XXX,XX @@ static bool fold_masks(OptContext *ctx, TCGOp *op)
17
{
18
uint64_t z_mask = ctx->z_mask;
19
uint64_t s_mask = ctx->s_mask;
20
+ const TCGOpDef *def = &tcg_op_defs[op->opc];
21
+ TCGTemp *ts;
22
+ TempOptInfo *ti;
23
+
24
+ /* Only single-output opcodes are supported here. */
25
+ tcg_debug_assert(def->nb_oargs == 1);
26
27
/*
28
* 32-bit ops generate 32-bit results, which for the purpose of
29
@@ -XXX,XX +XXX,XX @@ static bool fold_masks(OptContext *ctx, TCGOp *op)
30
if (ctx->type == TCG_TYPE_I32) {
31
z_mask = (int32_t)z_mask;
32
s_mask |= MAKE_64BIT_MASK(32, 32);
33
- ctx->z_mask = z_mask;
34
- ctx->s_mask = s_mask;
35
}
36
37
if (z_mask == 0) {
38
return tcg_opt_gen_movi(ctx, op, op->args[0], 0);
39
}
40
- return false;
41
+
42
+ ts = arg_temp(op->args[0]);
43
+ reset_ts(ctx, ts);
44
+
45
+ ti = ts_info(ts);
46
+ ti->z_mask = z_mask;
47
+ ti->s_mask = s_mask;
48
+ return true;
49
}
50
51
/*
52
--
53
2.43.0
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Add a routine to which masks can be passed directly, rather than
2
storing them into OptContext. To be used in upcoming patches.
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
6
---
4
target/mips/cpu.h | 7 ++++++-
7
tcg/optimize.c | 15 ++++++++++++---
5
target/mips/sysemu/physaddr.c | 2 +-
8
1 file changed, 12 insertions(+), 3 deletions(-)
6
target/mips/tcg/msa_helper.c | 10 +++++-----
7
target/mips/tcg/sysemu/cp0_helper.c | 2 +-
8
target/mips/tcg/sysemu/special_helper.c | 2 +-
9
target/mips/tcg/sysemu/tlb_helper.c | 2 +-
10
6 files changed, 15 insertions(+), 10 deletions(-)
11
9
12
diff --git a/target/mips/cpu.h b/target/mips/cpu.h
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
13
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
14
--- a/target/mips/cpu.h
12
--- a/tcg/optimize.c
15
+++ b/target/mips/cpu.h
13
+++ b/tcg/optimize.c
16
@@ -XXX,XX +XXX,XX @@ static inline int hflags_mmu_index(uint32_t hflags)
14
@@ -XXX,XX +XXX,XX @@ static bool fold_const2_commutative(OptContext *ctx, TCGOp *op)
17
}
15
return fold_const2(ctx, op);
18
}
16
}
19
17
20
-static inline int cpu_mmu_index(CPUMIPSState *env, bool ifetch)
18
-static bool fold_masks(OptContext *ctx, TCGOp *op)
21
+static inline int mips_env_mmu_index(CPUMIPSState *env)
19
+/*
20
+ * Record "zero" and "sign" masks for the single output of @op.
21
+ * See TempOptInfo definition of z_mask and s_mask.
22
+ * If z_mask allows, fold the output to constant zero.
23
+ */
24
+static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
25
+ uint64_t z_mask, uint64_t s_mask)
22
{
26
{
23
return hflags_mmu_index(env->hflags);
27
- uint64_t z_mask = ctx->z_mask;
28
- uint64_t s_mask = ctx->s_mask;
29
const TCGOpDef *def = &tcg_op_defs[op->opc];
30
TCGTemp *ts;
31
TempOptInfo *ti;
32
@@ -XXX,XX +XXX,XX @@ static bool fold_masks(OptContext *ctx, TCGOp *op)
33
return true;
24
}
34
}
25
35
26
+static inline int cpu_mmu_index(CPUMIPSState *env, bool ifetch)
36
+static bool fold_masks(OptContext *ctx, TCGOp *op)
27
+{
37
+{
28
+ return mips_env_mmu_index(env);
38
+ return fold_masks_zs(ctx, op, ctx->z_mask, ctx->s_mask);
29
+}
39
+}
30
+
40
+
31
#include "exec/cpu-all.h"
41
/*
32
42
* An "affected" mask bit is 0 if and only if the result is identical
33
/* Exceptions */
43
* to the first input. Thus if the entire mask is 0, the operation
34
diff --git a/target/mips/sysemu/physaddr.c b/target/mips/sysemu/physaddr.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/mips/sysemu/physaddr.c
37
+++ b/target/mips/sysemu/physaddr.c
38
@@ -XXX,XX +XXX,XX @@ hwaddr mips_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
39
int prot;
40
41
if (get_physical_address(env, &phys_addr, &prot, addr, MMU_DATA_LOAD,
42
- cpu_mmu_index(env, false)) != 0) {
43
+ mips_env_mmu_index(env)) != 0) {
44
return -1;
45
}
46
return phys_addr;
47
diff --git a/target/mips/tcg/msa_helper.c b/target/mips/tcg/msa_helper.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/target/mips/tcg/msa_helper.c
50
+++ b/target/mips/tcg/msa_helper.c
51
@@ -XXX,XX +XXX,XX @@ void helper_msa_ffint_u_df(CPUMIPSState *env, uint32_t df, uint32_t wd,
52
#if !defined(CONFIG_USER_ONLY)
53
#define MEMOP_IDX(DF) \
54
MemOpIdx oi = make_memop_idx(MO_TE | DF | MO_UNALN, \
55
- cpu_mmu_index(env, false));
56
+ mips_env_mmu_index(env));
57
#else
58
#define MEMOP_IDX(DF)
59
#endif
60
@@ -XXX,XX +XXX,XX @@ void helper_msa_st_b(CPUMIPSState *env, uint32_t wd,
61
target_ulong addr)
62
{
63
wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
64
- int mmu_idx = cpu_mmu_index(env, false);
65
+ int mmu_idx = mips_env_mmu_index(env);
66
uintptr_t ra = GETPC();
67
68
ensure_writable_pages(env, addr, mmu_idx, ra);
69
@@ -XXX,XX +XXX,XX @@ void helper_msa_st_h(CPUMIPSState *env, uint32_t wd,
70
target_ulong addr)
71
{
72
wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
73
- int mmu_idx = cpu_mmu_index(env, false);
74
+ int mmu_idx = mips_env_mmu_index(env);
75
uintptr_t ra = GETPC();
76
uint64_t d0, d1;
77
78
@@ -XXX,XX +XXX,XX @@ void helper_msa_st_w(CPUMIPSState *env, uint32_t wd,
79
target_ulong addr)
80
{
81
wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
82
- int mmu_idx = cpu_mmu_index(env, false);
83
+ int mmu_idx = mips_env_mmu_index(env);
84
uintptr_t ra = GETPC();
85
uint64_t d0, d1;
86
87
@@ -XXX,XX +XXX,XX @@ void helper_msa_st_d(CPUMIPSState *env, uint32_t wd,
88
target_ulong addr)
89
{
90
wr_t *pwd = &(env->active_fpu.fpr[wd].wr);
91
- int mmu_idx = cpu_mmu_index(env, false);
92
+ int mmu_idx = mips_env_mmu_index(env);
93
uintptr_t ra = GETPC();
94
95
ensure_writable_pages(env, addr, mmu_idx, GETPC());
96
diff --git a/target/mips/tcg/sysemu/cp0_helper.c b/target/mips/tcg/sysemu/cp0_helper.c
97
index XXXXXXX..XXXXXXX 100644
98
--- a/target/mips/tcg/sysemu/cp0_helper.c
99
+++ b/target/mips/tcg/sysemu/cp0_helper.c
100
@@ -XXX,XX +XXX,XX @@ void helper_mtc0_status(CPUMIPSState *env, target_ulong arg1)
101
old, old & env->CP0_Cause & CP0Ca_IP_mask,
102
val, val & env->CP0_Cause & CP0Ca_IP_mask,
103
env->CP0_Cause);
104
- switch (cpu_mmu_index(env, false)) {
105
+ switch (mips_env_mmu_index(env)) {
106
case 3:
107
qemu_log(", ERL\n");
108
break;
109
diff --git a/target/mips/tcg/sysemu/special_helper.c b/target/mips/tcg/sysemu/special_helper.c
110
index XXXXXXX..XXXXXXX 100644
111
--- a/target/mips/tcg/sysemu/special_helper.c
112
+++ b/target/mips/tcg/sysemu/special_helper.c
113
@@ -XXX,XX +XXX,XX @@ static void debug_post_eret(CPUMIPSState *env)
114
if (env->hflags & MIPS_HFLAG_DM) {
115
qemu_log(" DEPC " TARGET_FMT_lx, env->CP0_DEPC);
116
}
117
- switch (cpu_mmu_index(env, false)) {
118
+ switch (mips_env_mmu_index(env)) {
119
case 3:
120
qemu_log(", ERL\n");
121
break;
122
diff --git a/target/mips/tcg/sysemu/tlb_helper.c b/target/mips/tcg/sysemu/tlb_helper.c
123
index XXXXXXX..XXXXXXX 100644
124
--- a/target/mips/tcg/sysemu/tlb_helper.c
125
+++ b/target/mips/tcg/sysemu/tlb_helper.c
126
@@ -XXX,XX +XXX,XX @@ hwaddr cpu_mips_translate_address(CPUMIPSState *env, target_ulong address,
127
128
/* data access */
129
ret = get_physical_address(env, &physical, &prot, address, access_type,
130
- cpu_mmu_index(env, false));
131
+ mips_env_mmu_index(env));
132
if (ret == TLBRET_MATCH) {
133
return physical;
134
}
135
--
44
--
136
2.34.1
45
2.43.0
137
138
diff view generated by jsdifflib
1
Consider the passed s_mask to be a minimum deduced from
2
either existing s_mask or from a sign-extension operation.
3
We may be able to deduce more from the set of known zeros.
4
Remove identical logic from several opcode folders.
5
6
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
3
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
4
Message-Id: <20231103173841.33651-9-richard.henderson@linaro.org>
5
---
8
---
6
target/sparc/helper.h | 4 ++--
9
tcg/optimize.c | 21 ++++++---------------
7
target/sparc/fop_helper.c | 8 ++++----
10
1 file changed, 6 insertions(+), 15 deletions(-)
8
target/sparc/translate.c | 7 ++++---
9
3 files changed, 10 insertions(+), 9 deletions(-)
10
11
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
12
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
14
--- a/tcg/optimize.c
14
+++ b/target/sparc/helper.h
15
+++ b/tcg/optimize.c
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(fxtoq, TCG_CALL_NO_RWG, void, env, s64)
16
@@ -XXX,XX +XXX,XX @@ static bool fold_const2_commutative(OptContext *ctx, TCGOp *op)
16
#endif
17
* Record "zero" and "sign" masks for the single output of @op.
17
DEF_HELPER_FLAGS_2(fdtos, TCG_CALL_NO_RWG, f32, env, f64)
18
* See TempOptInfo definition of z_mask and s_mask.
18
DEF_HELPER_FLAGS_2(fstod, TCG_CALL_NO_RWG, f64, env, f32)
19
* If z_mask allows, fold the output to constant zero.
19
-DEF_HELPER_FLAGS_1(fqtos, TCG_CALL_NO_RWG, f32, env)
20
+ * The passed s_mask may be augmented by z_mask.
20
+DEF_HELPER_FLAGS_2(fqtos, TCG_CALL_NO_RWG, f32, env, i128)
21
*/
21
DEF_HELPER_FLAGS_2(fstoq, TCG_CALL_NO_RWG, void, env, f32)
22
static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
22
DEF_HELPER_FLAGS_1(fqtod, TCG_CALL_NO_RWG, f64, env)
23
uint64_t z_mask, uint64_t s_mask)
23
DEF_HELPER_FLAGS_2(fdtoq, TCG_CALL_NO_RWG, void, env, f64)
24
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
24
DEF_HELPER_FLAGS_2(fstoi, TCG_CALL_NO_RWG, s32, env, f32)
25
25
DEF_HELPER_FLAGS_2(fdtoi, TCG_CALL_NO_RWG, s32, env, f64)
26
ti = ts_info(ts);
26
-DEF_HELPER_FLAGS_1(fqtoi, TCG_CALL_NO_RWG, s32, env)
27
ti->z_mask = z_mask;
27
+DEF_HELPER_FLAGS_2(fqtoi, TCG_CALL_NO_RWG, s32, env, i128)
28
- ti->s_mask = s_mask;
28
#ifdef TARGET_SPARC64
29
+ ti->s_mask = s_mask | smask_from_zmask(z_mask);
29
DEF_HELPER_FLAGS_2(fstox, TCG_CALL_NO_RWG, s64, env, f32)
30
return true;
30
DEF_HELPER_FLAGS_2(fdtox, TCG_CALL_NO_RWG, s64, env, f64)
31
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/sparc/fop_helper.c
34
+++ b/target/sparc/fop_helper.c
35
@@ -XXX,XX +XXX,XX @@ float64 helper_fstod(CPUSPARCState *env, float32 src)
36
return float32_to_float64(src, &env->fp_status);
37
}
31
}
38
32
39
-float32 helper_fqtos(CPUSPARCState *env)
33
@@ -XXX,XX +XXX,XX @@ static bool fold_bswap(OptContext *ctx, TCGOp *op)
40
+float32 helper_fqtos(CPUSPARCState *env, Int128 src)
34
default:
41
{
35
g_assert_not_reached();
42
- return float128_to_float32(QT1, &env->fp_status);
36
}
43
+ return float128_to_float32(f128_in(src), &env->fp_status);
37
- s_mask = smask_from_zmask(z_mask);
38
39
+ s_mask = 0;
40
switch (op->args[2] & (TCG_BSWAP_OZ | TCG_BSWAP_OS)) {
41
case TCG_BSWAP_OZ:
42
break;
43
@@ -XXX,XX +XXX,XX @@ static bool fold_bswap(OptContext *ctx, TCGOp *op)
44
default:
45
/* The high bits are undefined: force all bits above the sign to 1. */
46
z_mask |= sign << 1;
47
- s_mask = 0;
48
break;
49
}
50
ctx->z_mask = z_mask;
51
@@ -XXX,XX +XXX,XX @@ static bool fold_count_zeros(OptContext *ctx, TCGOp *op)
52
g_assert_not_reached();
53
}
54
ctx->z_mask = arg_info(op->args[2])->z_mask | z_mask;
55
- ctx->s_mask = smask_from_zmask(ctx->z_mask);
56
return false;
44
}
57
}
45
58
46
void helper_fstoq(CPUSPARCState *env, float32 src)
59
@@ -XXX,XX +XXX,XX @@ static bool fold_ctpop(OptContext *ctx, TCGOp *op)
47
@@ -XXX,XX +XXX,XX @@ int32_t helper_fdtoi(CPUSPARCState *env, float64 src)
60
default:
48
return float64_to_int32_round_to_zero(src, &env->fp_status);
61
g_assert_not_reached();
62
}
63
- ctx->s_mask = smask_from_zmask(ctx->z_mask);
64
return false;
49
}
65
}
50
66
51
-int32_t helper_fqtoi(CPUSPARCState *env)
67
@@ -XXX,XX +XXX,XX @@ static bool fold_extract(OptContext *ctx, TCGOp *op)
52
+int32_t helper_fqtoi(CPUSPARCState *env, Int128 src)
68
return true;
53
{
69
}
54
- return float128_to_int32_round_to_zero(QT1, &env->fp_status);
70
ctx->z_mask = z_mask;
55
+ return float128_to_int32_round_to_zero(f128_in(src), &env->fp_status);
71
- ctx->s_mask = smask_from_zmask(z_mask);
72
73
return fold_masks(ctx, op);
56
}
74
}
57
75
@@ -XXX,XX +XXX,XX @@ static bool fold_extu(OptContext *ctx, TCGOp *op)
58
#ifdef TARGET_SPARC64
59
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
60
index XXXXXXX..XXXXXXX 100644
61
--- a/target/sparc/translate.c
62
+++ b/target/sparc/translate.c
63
@@ -XXX,XX +XXX,XX @@ static bool do_env_qq(DisasContext *dc, arg_r_r *a,
64
TRANS(FSQRTq, ALL, do_env_qq, a, gen_helper_fsqrtq)
65
66
static bool do_env_fq(DisasContext *dc, arg_r_r *a,
67
- void (*func)(TCGv_i32, TCGv_env))
68
+ void (*func)(TCGv_i32, TCGv_env, TCGv_i128))
69
{
70
+ TCGv_i128 src;
71
TCGv_i32 dst;
72
73
if (gen_trap_ifnofpu(dc)) {
74
@@ -XXX,XX +XXX,XX @@ static bool do_env_fq(DisasContext *dc, arg_r_r *a,
75
}
76
}
76
77
77
gen_op_clear_ieee_excp_and_FTT();
78
ctx->z_mask = z_mask;
78
- gen_op_load_fpr_QT1(QFPREG(a->rs));
79
- ctx->s_mask = smask_from_zmask(z_mask);
79
+ src = gen_load_fpr_Q(dc, a->rs);
80
if (!type_change && fold_affected_mask(ctx, op, z_mask_old ^ z_mask)) {
80
dst = tcg_temp_new_i32();
81
return true;
81
- func(dst, tcg_env);
82
}
82
+ func(dst, tcg_env, src);
83
@@ -XXX,XX +XXX,XX @@ static bool fold_qemu_ld(OptContext *ctx, TCGOp *op)
83
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
84
int width = 8 * memop_size(mop);
84
gen_store_fpr_F(dc, a->rd, dst);
85
85
return advance_pc(dc);
86
if (width < 64) {
87
- ctx->s_mask = MAKE_64BIT_MASK(width, 64 - width);
88
- if (!(mop & MO_SIGN)) {
89
+ if (mop & MO_SIGN) {
90
+ ctx->s_mask = MAKE_64BIT_MASK(width, 64 - width);
91
+ } else {
92
ctx->z_mask = MAKE_64BIT_MASK(0, width);
93
- ctx->s_mask <<= 1;
94
}
95
}
96
97
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond(OptContext *ctx, TCGOp *op)
98
fold_setcond_tst_pow2(ctx, op, false);
99
100
ctx->z_mask = 1;
101
- ctx->s_mask = smask_from_zmask(1);
102
return false;
103
}
104
105
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond2(OptContext *ctx, TCGOp *op)
106
}
107
108
ctx->z_mask = 1;
109
- ctx->s_mask = smask_from_zmask(1);
110
return false;
111
112
do_setcond_const:
113
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_ld(OptContext *ctx, TCGOp *op)
114
break;
115
CASE_OP_32_64(ld8u):
116
ctx->z_mask = MAKE_64BIT_MASK(0, 8);
117
- ctx->s_mask = MAKE_64BIT_MASK(9, 55);
118
break;
119
CASE_OP_32_64(ld16s):
120
ctx->s_mask = MAKE_64BIT_MASK(16, 48);
121
break;
122
CASE_OP_32_64(ld16u):
123
ctx->z_mask = MAKE_64BIT_MASK(0, 16);
124
- ctx->s_mask = MAKE_64BIT_MASK(17, 47);
125
break;
126
case INDEX_op_ld32s_i64:
127
ctx->s_mask = MAKE_64BIT_MASK(32, 32);
128
break;
129
case INDEX_op_ld32u_i64:
130
ctx->z_mask = MAKE_64BIT_MASK(0, 32);
131
- ctx->s_mask = MAKE_64BIT_MASK(33, 31);
132
break;
133
default:
134
g_assert_not_reached();
86
--
135
--
87
2.34.1
136
2.43.0
diff view generated by jsdifflib
1
Represent each fcc field separately from the rest of fsr.
1
Change the representation from sign bit repetitions to all bits equal
2
This vastly simplifies floating-point comparisons.
2
to the sign bit, including the sign bit itself.
3
3
4
The previous format has a problem in that it is difficult to recreate
5
a valid sign mask after a shift operation: the "repetitions" part of
6
the previous format meant that applying the same shift as for the value
7
lead to an off-by-one value.
8
9
The new format, including the sign bit itself, means that the sign mask
10
can be manipulated in exactly the same way as the value, canonicalization
11
is easier.
12
13
Canonicalize the s_mask in fold_masks_zs, rather than requiring callers
14
to do so. Treat 0 as a non-canonical but typeless input for no sign
15
information, which will be reset as appropriate for the data type.
16
We can easily fold in the data from z_mask while canonicalizing.
17
18
Temporarily disable optimizations using s_mask while each operation is
19
converted to use fold_masks_zs and to the new form.
20
21
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
22
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
6
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
7
Message-Id: <20231103173841.33651-22-richard.henderson@linaro.org>
8
---
23
---
9
target/sparc/cpu.h | 20 +-
24
tcg/optimize.c | 64 ++++++++++++--------------------------------------
10
target/sparc/helper.h | 34 +--
25
1 file changed, 15 insertions(+), 49 deletions(-)
11
target/sparc/fop_helper.c | 169 ++++++-------
12
target/sparc/translate.c | 503 +++++++++-----------------------------
13
4 files changed, 201 insertions(+), 525 deletions(-)
14
26
15
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
27
diff --git a/tcg/optimize.c b/tcg/optimize.c
16
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
17
--- a/target/sparc/cpu.h
29
--- a/tcg/optimize.c
18
+++ b/target/sparc/cpu.h
30
+++ b/tcg/optimize.c
19
@@ -XXX,XX +XXX,XX @@
31
@@ -XXX,XX +XXX,XX @@ typedef struct TempOptInfo {
20
32
QSIMPLEQ_HEAD(, MemCopyInfo) mem_copy;
21
#if !defined(TARGET_SPARC64)
33
uint64_t val;
22
#define TARGET_DPREGS 16
34
uint64_t z_mask; /* mask bit is 0 if and only if value bit is 0 */
23
+#define TARGET_FCCREGS 1
35
- uint64_t s_mask; /* a left-aligned mask of clrsb(value) bits. */
24
#else
36
+ uint64_t s_mask; /* mask bit is 1 if value bit matches msb */
25
#define TARGET_DPREGS 32
37
} TempOptInfo;
26
+#define TARGET_FCCREGS 4
38
27
#endif
39
typedef struct OptContext {
28
40
@@ -XXX,XX +XXX,XX @@ typedef struct OptContext {
29
/*#define EXCP_INTERRUPT 0x100*/
41
30
@@ -XXX,XX +XXX,XX @@ enum {
42
/* In flight values from optimization. */
31
#ifdef TARGET_SPARC64
43
uint64_t z_mask; /* mask bit is 0 iff value bit is 0 */
32
#define FSR_FTT_NMASK 0xfffffffffffe3fffULL
44
- uint64_t s_mask; /* mask of clrsb(value) bits */
33
#define FSR_FTT_CEXC_NMASK 0xfffffffffffe3fe0ULL
45
+ uint64_t s_mask; /* mask bit is 1 if value bit matches msb */
34
-#define FSR_LDFSR_OLDMASK 0x0000003f000fc000ULL
46
TCGType type;
35
-#define FSR_LDXFSR_MASK 0x0000003fcfc00fffULL
47
} OptContext;
36
-#define FSR_LDXFSR_OLDMASK 0x00000000000fc000ULL
48
37
#else
49
-/* Calculate the smask for a specific value. */
38
#define FSR_FTT_NMASK 0xfffe3fffULL
50
-static uint64_t smask_from_value(uint64_t value)
39
#define FSR_FTT_CEXC_NMASK 0xfffe3fe0ULL
40
-#define FSR_LDFSR_OLDMASK 0x000fc000ULL
41
#endif
42
-#define FSR_LDFSR_MASK 0xcfc00fffULL
43
#define FSR_FTT_IEEE_EXCP (1ULL << 14)
44
#define FSR_FTT_UNIMPFPOP (3ULL << 14)
45
#define FSR_FTT_SEQ_ERROR (4ULL << 14)
46
#define FSR_FTT_INVAL_FPR (6ULL << 14)
47
48
-#define FSR_FCC1_SHIFT 11
49
-#define FSR_FCC1 (1ULL << FSR_FCC1_SHIFT)
50
-#define FSR_FCC0_SHIFT 10
51
-#define FSR_FCC0 (1ULL << FSR_FCC0_SHIFT)
52
+#define FSR_FCC0_SHIFT 10
53
+#define FSR_FCC1_SHIFT 32
54
+#define FSR_FCC2_SHIFT 34
55
+#define FSR_FCC3_SHIFT 36
56
57
/* MMU */
58
#define MMU_E (1<<0)
59
@@ -XXX,XX +XXX,XX @@ struct CPUArchState {
60
temporary register when possible) */
61
62
/* FPU State Register, in parts */
63
- target_ulong fsr; /* rm, tem, aexc, fcc* */
64
- uint32_t fsr_cexc_ftt; /* cexc, ftt */
65
+ uint32_t fsr; /* rm, tem, aexc */
66
+ uint32_t fsr_cexc_ftt; /* cexc, ftt */
67
+ uint32_t fcc[TARGET_FCCREGS]; /* fcc* */
68
69
CPU_DoubleU fpr[TARGET_DPREGS]; /* floating point registers */
70
uint32_t cwp; /* index of current register window (extracted
71
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
72
index XXXXXXX..XXXXXXX 100644
73
--- a/target/sparc/helper.h
74
+++ b/target/sparc/helper.h
75
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(ld_asi, TCG_CALL_NO_WG, i64, env, tl, int, i32)
76
DEF_HELPER_FLAGS_5(st_asi, TCG_CALL_NO_WG, void, env, tl, i64, int, i32)
77
#endif
78
DEF_HELPER_FLAGS_1(get_fsr, TCG_CALL_NO_WG_SE, tl, env)
79
-DEF_HELPER_FLAGS_2(set_fsr_noftt, TCG_CALL_NO_RWG, void, env, tl)
80
+DEF_HELPER_FLAGS_2(set_fsr_nofcc_noftt, TCG_CALL_NO_RWG, void, env, i32)
81
DEF_HELPER_FLAGS_2(fsqrts, TCG_CALL_NO_WG, f32, env, f32)
82
DEF_HELPER_FLAGS_2(fsqrtd, TCG_CALL_NO_WG, f64, env, f64)
83
DEF_HELPER_FLAGS_2(fsqrtq, TCG_CALL_NO_WG, i128, env, i128)
84
-DEF_HELPER_FLAGS_3(fcmps, TCG_CALL_NO_WG, void, env, f32, f32)
85
-DEF_HELPER_FLAGS_3(fcmpd, TCG_CALL_NO_WG, void, env, f64, f64)
86
-DEF_HELPER_FLAGS_3(fcmpes, TCG_CALL_NO_WG, void, env, f32, f32)
87
-DEF_HELPER_FLAGS_3(fcmped, TCG_CALL_NO_WG, void, env, f64, f64)
88
-DEF_HELPER_FLAGS_3(fcmpq, TCG_CALL_NO_WG, void, env, i128, i128)
89
-DEF_HELPER_FLAGS_3(fcmpeq, TCG_CALL_NO_WG, void, env, i128, i128)
90
-#ifdef TARGET_SPARC64
91
-DEF_HELPER_FLAGS_3(fcmps_fcc1, TCG_CALL_NO_WG, void, env, f32, f32)
92
-DEF_HELPER_FLAGS_3(fcmps_fcc2, TCG_CALL_NO_WG, void, env, f32, f32)
93
-DEF_HELPER_FLAGS_3(fcmps_fcc3, TCG_CALL_NO_WG, void, env, f32, f32)
94
-DEF_HELPER_FLAGS_3(fcmpd_fcc1, TCG_CALL_NO_WG, void, env, f64, f64)
95
-DEF_HELPER_FLAGS_3(fcmpd_fcc2, TCG_CALL_NO_WG, void, env, f64, f64)
96
-DEF_HELPER_FLAGS_3(fcmpd_fcc3, TCG_CALL_NO_WG, void, env, f64, f64)
97
-DEF_HELPER_FLAGS_3(fcmpes_fcc1, TCG_CALL_NO_WG, void, env, f32, f32)
98
-DEF_HELPER_FLAGS_3(fcmpes_fcc2, TCG_CALL_NO_WG, void, env, f32, f32)
99
-DEF_HELPER_FLAGS_3(fcmpes_fcc3, TCG_CALL_NO_WG, void, env, f32, f32)
100
-DEF_HELPER_FLAGS_3(fcmped_fcc1, TCG_CALL_NO_WG, void, env, f64, f64)
101
-DEF_HELPER_FLAGS_3(fcmped_fcc2, TCG_CALL_NO_WG, void, env, f64, f64)
102
-DEF_HELPER_FLAGS_3(fcmped_fcc3, TCG_CALL_NO_WG, void, env, f64, f64)
103
-DEF_HELPER_FLAGS_3(fcmpq_fcc1, TCG_CALL_NO_WG, void, env, i128, i128)
104
-DEF_HELPER_FLAGS_3(fcmpq_fcc2, TCG_CALL_NO_WG, void, env, i128, i128)
105
-DEF_HELPER_FLAGS_3(fcmpq_fcc3, TCG_CALL_NO_WG, void, env, i128, i128)
106
-DEF_HELPER_FLAGS_3(fcmpeq_fcc1, TCG_CALL_NO_WG, void, env, i128, i128)
107
-DEF_HELPER_FLAGS_3(fcmpeq_fcc2, TCG_CALL_NO_WG, void, env, i128, i128)
108
-DEF_HELPER_FLAGS_3(fcmpeq_fcc3, TCG_CALL_NO_WG, void, env, i128, i128)
109
-#endif
110
+DEF_HELPER_FLAGS_3(fcmps, TCG_CALL_NO_WG, i32, env, f32, f32)
111
+DEF_HELPER_FLAGS_3(fcmpes, TCG_CALL_NO_WG, i32, env, f32, f32)
112
+DEF_HELPER_FLAGS_3(fcmpd, TCG_CALL_NO_WG, i32, env, f64, f64)
113
+DEF_HELPER_FLAGS_3(fcmped, TCG_CALL_NO_WG, i32, env, f64, f64)
114
+DEF_HELPER_FLAGS_3(fcmpq, TCG_CALL_NO_WG, i32, env, i128, i128)
115
+DEF_HELPER_FLAGS_3(fcmpeq, TCG_CALL_NO_WG, i32, env, i128, i128)
116
DEF_HELPER_2(raise_exception, noreturn, env, int)
117
118
DEF_HELPER_FLAGS_3(faddd, TCG_CALL_NO_WG, f64, env, f64, f64)
119
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
120
index XXXXXXX..XXXXXXX 100644
121
--- a/target/sparc/fop_helper.c
122
+++ b/target/sparc/fop_helper.c
123
@@ -XXX,XX +XXX,XX @@ Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
124
return f128_ret(ret);
125
}
126
127
-#define GEN_FCMP(name, size, FS, E) \
128
- void glue(helper_, name)(CPUSPARCState *env, Int128 src1, Int128 src2) \
129
- { \
130
- float128 reg1 = f128_in(src1); \
131
- float128 reg2 = f128_in(src2); \
132
- FloatRelation ret; \
133
- target_ulong fsr; \
134
- if (E) { \
135
- ret = glue(size, _compare)(reg1, reg2, &env->fp_status); \
136
- } else { \
137
- ret = glue(size, _compare_quiet)(reg1, reg2, \
138
- &env->fp_status); \
139
- } \
140
- check_ieee_exceptions(env, GETPC()); \
141
- fsr = env->fsr; \
142
- switch (ret) { \
143
- case float_relation_unordered: \
144
- fsr |= (FSR_FCC1 | FSR_FCC0) << FS; \
145
- fsr |= FSR_NVA; \
146
- break; \
147
- case float_relation_less: \
148
- fsr &= ~(FSR_FCC1) << FS; \
149
- fsr |= FSR_FCC0 << FS; \
150
- break; \
151
- case float_relation_greater: \
152
- fsr &= ~(FSR_FCC0) << FS; \
153
- fsr |= FSR_FCC1 << FS; \
154
- break; \
155
- default: \
156
- fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \
157
- break; \
158
- } \
159
- env->fsr = fsr; \
160
- }
161
-#define GEN_FCMP_T(name, size, FS, E) \
162
- void glue(helper_, name)(CPUSPARCState *env, size src1, size src2) \
163
- { \
164
- FloatRelation ret; \
165
- target_ulong fsr; \
166
- if (E) { \
167
- ret = glue(size, _compare)(src1, src2, &env->fp_status); \
168
- } else { \
169
- ret = glue(size, _compare_quiet)(src1, src2, \
170
- &env->fp_status); \
171
- } \
172
- check_ieee_exceptions(env, GETPC()); \
173
- fsr = env->fsr; \
174
- switch (ret) { \
175
- case float_relation_unordered: \
176
- fsr |= (FSR_FCC1 | FSR_FCC0) << FS; \
177
- break; \
178
- case float_relation_less: \
179
- fsr &= ~(FSR_FCC1 << FS); \
180
- fsr |= FSR_FCC0 << FS; \
181
- break; \
182
- case float_relation_greater: \
183
- fsr &= ~(FSR_FCC0 << FS); \
184
- fsr |= FSR_FCC1 << FS; \
185
- break; \
186
- default: \
187
- fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \
188
- break; \
189
- } \
190
- env->fsr = fsr; \
191
+static uint32_t finish_fcmp(CPUSPARCState *env, FloatRelation r, uintptr_t ra)
192
+{
193
+ check_ieee_exceptions(env, ra);
194
+
195
+ /*
196
+ * FCC values:
197
+ * 0 =
198
+ * 1 <
199
+ * 2 >
200
+ * 3 unordered
201
+ */
202
+ switch (r) {
203
+ case float_relation_equal:
204
+ return 0;
205
+ case float_relation_less:
206
+ return 1;
207
+ case float_relation_greater:
208
+ return 2;
209
+ case float_relation_unordered:
210
+ env->fsr |= FSR_NVA;
211
+ return 3;
212
}
213
+ g_assert_not_reached();
214
+}
215
216
-GEN_FCMP_T(fcmps, float32, 0, 0);
217
-GEN_FCMP_T(fcmpd, float64, 0, 0);
218
+uint32_t helper_fcmps(CPUSPARCState *env, float32 src1, float32 src2)
219
+{
220
+ FloatRelation r = float32_compare_quiet(src1, src2, &env->fp_status);
221
+ return finish_fcmp(env, r, GETPC());
222
+}
223
224
-GEN_FCMP_T(fcmpes, float32, 0, 1);
225
-GEN_FCMP_T(fcmped, float64, 0, 1);
226
+uint32_t helper_fcmpes(CPUSPARCState *env, float32 src1, float32 src2)
227
+{
228
+ FloatRelation r = float32_compare(src1, src2, &env->fp_status);
229
+ return finish_fcmp(env, r, GETPC());
230
+}
231
232
-GEN_FCMP(fcmpq, float128, 0, 0);
233
-GEN_FCMP(fcmpeq, float128, 0, 1);
234
+uint32_t helper_fcmpd(CPUSPARCState *env, float64 src1, float64 src2)
235
+{
236
+ FloatRelation r = float64_compare_quiet(src1, src2, &env->fp_status);
237
+ return finish_fcmp(env, r, GETPC());
238
+}
239
240
-#ifdef TARGET_SPARC64
241
-GEN_FCMP_T(fcmps_fcc1, float32, 22, 0);
242
-GEN_FCMP_T(fcmpd_fcc1, float64, 22, 0);
243
-GEN_FCMP(fcmpq_fcc1, float128, 22, 0);
244
+uint32_t helper_fcmped(CPUSPARCState *env, float64 src1, float64 src2)
245
+{
246
+ FloatRelation r = float64_compare(src1, src2, &env->fp_status);
247
+ return finish_fcmp(env, r, GETPC());
248
+}
249
250
-GEN_FCMP_T(fcmps_fcc2, float32, 24, 0);
251
-GEN_FCMP_T(fcmpd_fcc2, float64, 24, 0);
252
-GEN_FCMP(fcmpq_fcc2, float128, 24, 0);
253
+uint32_t helper_fcmpq(CPUSPARCState *env, Int128 src1, Int128 src2)
254
+{
255
+ FloatRelation r = float128_compare_quiet(f128_in(src1), f128_in(src2),
256
+ &env->fp_status);
257
+ return finish_fcmp(env, r, GETPC());
258
+}
259
260
-GEN_FCMP_T(fcmps_fcc3, float32, 26, 0);
261
-GEN_FCMP_T(fcmpd_fcc3, float64, 26, 0);
262
-GEN_FCMP(fcmpq_fcc3, float128, 26, 0);
263
-
264
-GEN_FCMP_T(fcmpes_fcc1, float32, 22, 1);
265
-GEN_FCMP_T(fcmped_fcc1, float64, 22, 1);
266
-GEN_FCMP(fcmpeq_fcc1, float128, 22, 1);
267
-
268
-GEN_FCMP_T(fcmpes_fcc2, float32, 24, 1);
269
-GEN_FCMP_T(fcmped_fcc2, float64, 24, 1);
270
-GEN_FCMP(fcmpeq_fcc2, float128, 24, 1);
271
-
272
-GEN_FCMP_T(fcmpes_fcc3, float32, 26, 1);
273
-GEN_FCMP_T(fcmped_fcc3, float64, 26, 1);
274
-GEN_FCMP(fcmpeq_fcc3, float128, 26, 1);
275
-#endif
276
-#undef GEN_FCMP_T
277
-#undef GEN_FCMP
278
+uint32_t helper_fcmpeq(CPUSPARCState *env, Int128 src1, Int128 src2)
279
+{
280
+ FloatRelation r = float128_compare(f128_in(src1), f128_in(src2),
281
+ &env->fp_status);
282
+ return finish_fcmp(env, r, GETPC());
283
+}
284
285
target_ulong cpu_get_fsr(CPUSPARCState *env)
286
{
287
target_ulong fsr = env->fsr | env->fsr_cexc_ftt;
288
289
+ fsr |= env->fcc[0] << FSR_FCC0_SHIFT;
290
+#ifdef TARGET_SPARC64
291
+ fsr |= (uint64_t)env->fcc[1] << FSR_FCC1_SHIFT;
292
+ fsr |= (uint64_t)env->fcc[2] << FSR_FCC2_SHIFT;
293
+ fsr |= (uint64_t)env->fcc[3] << FSR_FCC3_SHIFT;
294
+#endif
295
+
296
/* VER is kept completely separate until re-assembly. */
297
fsr |= env->def.fpu_version;
298
299
@@ -XXX,XX +XXX,XX @@ static void set_fsr_nonsplit(CPUSPARCState *env, target_ulong fsr)
300
{
301
int rnd_mode;
302
303
- env->fsr = fsr & ~(FSR_VER_MASK | FSR_CEXC_MASK | FSR_FTT_MASK);
304
+ env->fsr = fsr & (FSR_RD_MASK | FSR_TEM_MASK | FSR_AEXC_MASK);
305
306
switch (fsr & FSR_RD_MASK) {
307
case FSR_RD_NEAREST:
308
@@ -XXX,XX +XXX,XX @@ static void set_fsr_nonsplit(CPUSPARCState *env, target_ulong fsr)
309
void cpu_put_fsr(CPUSPARCState *env, target_ulong fsr)
310
{
311
env->fsr_cexc_ftt = fsr & (FSR_CEXC_MASK | FSR_FTT_MASK);
312
+
313
+ env->fcc[0] = extract32(fsr, FSR_FCC0_SHIFT, 2);
314
+#ifdef TARGET_SPARC64
315
+ env->fcc[1] = extract64(fsr, FSR_FCC1_SHIFT, 2);
316
+ env->fcc[2] = extract64(fsr, FSR_FCC2_SHIFT, 2);
317
+ env->fcc[3] = extract64(fsr, FSR_FCC3_SHIFT, 2);
318
+#endif
319
+
320
set_fsr_nonsplit(env, fsr);
321
}
322
323
-void helper_set_fsr_noftt(CPUSPARCState *env, target_ulong fsr)
324
+void helper_set_fsr_nofcc_noftt(CPUSPARCState *env, uint32_t fsr)
325
{
326
env->fsr_cexc_ftt &= FSR_FTT_MASK;
327
env->fsr_cexc_ftt |= fsr & FSR_CEXC_MASK;
328
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
329
index XXXXXXX..XXXXXXX 100644
330
--- a/target/sparc/translate.c
331
+++ b/target/sparc/translate.c
332
@@ -XXX,XX +XXX,XX @@
333
# define gen_helper_fxtoq ({ qemu_build_not_reached(); NULL; })
334
# define gen_helper_fxtos ({ qemu_build_not_reached(); NULL; })
335
# define gen_helper_pdist ({ qemu_build_not_reached(); NULL; })
336
-# define FSR_LDXFSR_MASK 0
337
-# define FSR_LDXFSR_OLDMASK 0
338
# define MAXTL_MASK 0
339
#endif
340
341
@@ -XXX,XX +XXX,XX @@ static TCGv cpu_gsr;
342
343
/* Floating point registers */
344
static TCGv_i64 cpu_fpr[TARGET_DPREGS];
345
+static TCGv_i32 cpu_fcc[TARGET_FCCREGS];
346
347
#define env_field_offsetof(X) offsetof(CPUSPARCState, X)
348
#ifdef TARGET_SPARC64
349
@@ -XXX,XX +XXX,XX @@ static void gen_op_bshuffle(TCGv_i64 dst, TCGv_i64 src1, TCGv_i64 src2)
350
#endif
351
}
352
353
-// 1
354
-static void gen_op_eval_ba(TCGv dst)
355
-{
51
-{
356
- tcg_gen_movi_tl(dst, 1);
52
- int rep = clrsb64(value);
357
-}
53
- return ~(~0ull >> rep);
358
-
359
-// 0
360
-static void gen_op_eval_bn(TCGv dst)
361
-{
362
- tcg_gen_movi_tl(dst, 0);
363
-}
54
-}
364
-
55
-
365
-/*
56
-/*
366
- FPSR bit field FCC1 | FCC0:
57
- * Calculate the smask for a given set of known-zeros.
367
- 0 =
58
- * If there are lots of zeros on the left, we can consider the remainder
368
- 1 <
59
- * an unsigned field, and thus the corresponding signed field is one bit
369
- 2 >
60
- * larger.
370
- 3 unordered
61
- */
371
-*/
62
-static uint64_t smask_from_zmask(uint64_t zmask)
372
-static void gen_mov_reg_FCC0(TCGv reg, TCGv src,
373
- unsigned int fcc_offset)
374
-{
63
-{
375
- tcg_gen_shri_tl(reg, src, FSR_FCC0_SHIFT + fcc_offset);
64
- /*
376
- tcg_gen_andi_tl(reg, reg, 0x1);
65
- * Only the 0 bits are significant for zmask, thus the msb itself
66
- * must be zero, else we have no sign information.
67
- */
68
- int rep = clz64(zmask);
69
- if (rep == 0) {
70
- return 0;
71
- }
72
- rep -= 1;
73
- return ~(~0ull >> rep);
377
-}
74
-}
378
-
75
-
379
-static void gen_mov_reg_FCC1(TCGv reg, TCGv src, unsigned int fcc_offset)
76
-/*
77
- * Recreate a properly left-aligned smask after manipulation.
78
- * Some bit-shuffling, particularly shifts and rotates, may
79
- * retain sign bits on the left, but may scatter disconnected
80
- * sign bits on the right. Retain only what remains to the left.
81
- */
82
-static uint64_t smask_from_smask(int64_t smask)
380
-{
83
-{
381
- tcg_gen_shri_tl(reg, src, FSR_FCC1_SHIFT + fcc_offset);
84
- /* Only the 1 bits are significant for smask */
382
- tcg_gen_andi_tl(reg, reg, 0x1);
85
- return smask_from_zmask(~smask);
383
-}
86
-}
384
-
87
-
385
-// !0: FCC0 | FCC1
88
static inline TempOptInfo *ts_info(TCGTemp *ts)
386
-static void gen_op_eval_fbne(TCGv dst, TCGv src, unsigned int fcc_offset)
387
-{
388
- TCGv t0 = tcg_temp_new();
389
- gen_mov_reg_FCC0(dst, src, fcc_offset);
390
- gen_mov_reg_FCC1(t0, src, fcc_offset);
391
- tcg_gen_or_tl(dst, dst, t0);
392
-}
393
-
394
-// 1 or 2: FCC0 ^ FCC1
395
-static void gen_op_eval_fblg(TCGv dst, TCGv src, unsigned int fcc_offset)
396
-{
397
- TCGv t0 = tcg_temp_new();
398
- gen_mov_reg_FCC0(dst, src, fcc_offset);
399
- gen_mov_reg_FCC1(t0, src, fcc_offset);
400
- tcg_gen_xor_tl(dst, dst, t0);
401
-}
402
-
403
-// 1 or 3: FCC0
404
-static void gen_op_eval_fbul(TCGv dst, TCGv src, unsigned int fcc_offset)
405
-{
406
- gen_mov_reg_FCC0(dst, src, fcc_offset);
407
-}
408
-
409
-// 1: FCC0 & !FCC1
410
-static void gen_op_eval_fbl(TCGv dst, TCGv src, unsigned int fcc_offset)
411
-{
412
- TCGv t0 = tcg_temp_new();
413
- gen_mov_reg_FCC0(dst, src, fcc_offset);
414
- gen_mov_reg_FCC1(t0, src, fcc_offset);
415
- tcg_gen_andc_tl(dst, dst, t0);
416
-}
417
-
418
-// 2 or 3: FCC1
419
-static void gen_op_eval_fbug(TCGv dst, TCGv src, unsigned int fcc_offset)
420
-{
421
- gen_mov_reg_FCC1(dst, src, fcc_offset);
422
-}
423
-
424
-// 2: !FCC0 & FCC1
425
-static void gen_op_eval_fbg(TCGv dst, TCGv src, unsigned int fcc_offset)
426
-{
427
- TCGv t0 = tcg_temp_new();
428
- gen_mov_reg_FCC0(dst, src, fcc_offset);
429
- gen_mov_reg_FCC1(t0, src, fcc_offset);
430
- tcg_gen_andc_tl(dst, t0, dst);
431
-}
432
-
433
-// 3: FCC0 & FCC1
434
-static void gen_op_eval_fbu(TCGv dst, TCGv src, unsigned int fcc_offset)
435
-{
436
- TCGv t0 = tcg_temp_new();
437
- gen_mov_reg_FCC0(dst, src, fcc_offset);
438
- gen_mov_reg_FCC1(t0, src, fcc_offset);
439
- tcg_gen_and_tl(dst, dst, t0);
440
-}
441
-
442
-// 0: !(FCC0 | FCC1)
443
-static void gen_op_eval_fbe(TCGv dst, TCGv src, unsigned int fcc_offset)
444
-{
445
- TCGv t0 = tcg_temp_new();
446
- gen_mov_reg_FCC0(dst, src, fcc_offset);
447
- gen_mov_reg_FCC1(t0, src, fcc_offset);
448
- tcg_gen_or_tl(dst, dst, t0);
449
- tcg_gen_xori_tl(dst, dst, 0x1);
450
-}
451
-
452
-// 0 or 3: !(FCC0 ^ FCC1)
453
-static void gen_op_eval_fbue(TCGv dst, TCGv src, unsigned int fcc_offset)
454
-{
455
- TCGv t0 = tcg_temp_new();
456
- gen_mov_reg_FCC0(dst, src, fcc_offset);
457
- gen_mov_reg_FCC1(t0, src, fcc_offset);
458
- tcg_gen_xor_tl(dst, dst, t0);
459
- tcg_gen_xori_tl(dst, dst, 0x1);
460
-}
461
-
462
-// 0 or 2: !FCC0
463
-static void gen_op_eval_fbge(TCGv dst, TCGv src, unsigned int fcc_offset)
464
-{
465
- gen_mov_reg_FCC0(dst, src, fcc_offset);
466
- tcg_gen_xori_tl(dst, dst, 0x1);
467
-}
468
-
469
-// !1: !(FCC0 & !FCC1)
470
-static void gen_op_eval_fbuge(TCGv dst, TCGv src, unsigned int fcc_offset)
471
-{
472
- TCGv t0 = tcg_temp_new();
473
- gen_mov_reg_FCC0(dst, src, fcc_offset);
474
- gen_mov_reg_FCC1(t0, src, fcc_offset);
475
- tcg_gen_andc_tl(dst, dst, t0);
476
- tcg_gen_xori_tl(dst, dst, 0x1);
477
-}
478
-
479
-// 0 or 1: !FCC1
480
-static void gen_op_eval_fble(TCGv dst, TCGv src, unsigned int fcc_offset)
481
-{
482
- gen_mov_reg_FCC1(dst, src, fcc_offset);
483
- tcg_gen_xori_tl(dst, dst, 0x1);
484
-}
485
-
486
-// !2: !(!FCC0 & FCC1)
487
-static void gen_op_eval_fbule(TCGv dst, TCGv src, unsigned int fcc_offset)
488
-{
489
- TCGv t0 = tcg_temp_new();
490
- gen_mov_reg_FCC0(dst, src, fcc_offset);
491
- gen_mov_reg_FCC1(t0, src, fcc_offset);
492
- tcg_gen_andc_tl(dst, t0, dst);
493
- tcg_gen_xori_tl(dst, dst, 0x1);
494
-}
495
-
496
-// !3: !(FCC0 & FCC1)
497
-static void gen_op_eval_fbo(TCGv dst, TCGv src, unsigned int fcc_offset)
498
-{
499
- TCGv t0 = tcg_temp_new();
500
- gen_mov_reg_FCC0(dst, src, fcc_offset);
501
- gen_mov_reg_FCC1(t0, src, fcc_offset);
502
- tcg_gen_and_tl(dst, dst, t0);
503
- tcg_gen_xori_tl(dst, dst, 0x1);
504
-}
505
-
506
static void finishing_insn(DisasContext *dc)
507
{
89
{
508
/*
90
return ts->state_ptr;
509
@@ -XXX,XX +XXX,XX @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond,
91
@@ -XXX,XX +XXX,XX @@ static void init_ts_info(OptContext *ctx, TCGTemp *ts)
510
92
ti->is_const = true;
511
static void gen_fcompare(DisasCompare *cmp, unsigned int cc, unsigned int cond)
93
ti->val = ts->val;
94
ti->z_mask = ts->val;
95
- ti->s_mask = smask_from_value(ts->val);
96
+ ti->s_mask = INT64_MIN >> clrsb64(ts->val);
97
} else {
98
ti->is_const = false;
99
ti->z_mask = -1;
100
@@ -XXX,XX +XXX,XX @@ static void finish_folding(OptContext *ctx, TCGOp *op)
101
*/
102
if (i == 0) {
103
ts_info(ts)->z_mask = ctx->z_mask;
104
- ts_info(ts)->s_mask = ctx->s_mask;
105
}
106
}
107
}
108
@@ -XXX,XX +XXX,XX @@ static bool fold_const2_commutative(OptContext *ctx, TCGOp *op)
109
* The passed s_mask may be augmented by z_mask.
110
*/
111
static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
112
- uint64_t z_mask, uint64_t s_mask)
113
+ uint64_t z_mask, int64_t s_mask)
512
{
114
{
513
- unsigned int offset;
115
const TCGOpDef *def = &tcg_op_defs[op->opc];
514
- TCGv r_dst, fsr;
116
TCGTemp *ts;
515
+ TCGv_i32 fcc = cpu_fcc[cc];
117
TempOptInfo *ti;
516
+ TCGv_i32 c1 = fcc;
118
+ int rep;
517
+ int c2 = 0;
119
518
+ TCGCond tcond;
120
/* Only single-output opcodes are supported here. */
519
121
tcg_debug_assert(def->nb_oargs == 1);
520
- /* For now we still generate a straight boolean result. */
122
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
521
- cmp->cond = TCG_COND_NE;
123
*/
522
- cmp->c1 = r_dst = tcg_temp_new();
124
if (ctx->type == TCG_TYPE_I32) {
523
- cmp->c2 = 0;
125
z_mask = (int32_t)z_mask;
524
-
126
- s_mask |= MAKE_64BIT_MASK(32, 32);
525
- switch (cc) {
127
+ s_mask |= INT32_MIN;
526
- default:
527
- case 0x0:
528
- offset = 0;
529
+ /*
530
+ * FCC values:
531
+ * 0 =
532
+ * 1 <
533
+ * 2 >
534
+ * 3 unordered
535
+ */
536
+ switch (cond & 7) {
537
+ case 0x0: /* fbn */
538
+ tcond = TCG_COND_NEVER;
539
break;
540
- case 0x1:
541
- offset = 32 - 10;
542
+ case 0x1: /* fbne : !0 */
543
+ tcond = TCG_COND_NE;
544
break;
545
- case 0x2:
546
- offset = 34 - 10;
547
+ case 0x2: /* fblg : 1 or 2 */
548
+ /* fcc in {1,2} - 1 -> fcc in {0,1} */
549
+ c1 = tcg_temp_new_i32();
550
+ tcg_gen_addi_i32(c1, fcc, -1);
551
+ c2 = 1;
552
+ tcond = TCG_COND_LEU;
553
break;
554
- case 0x3:
555
- offset = 36 - 10;
556
+ case 0x3: /* fbul : 1 or 3 */
557
+ c1 = tcg_temp_new_i32();
558
+ tcg_gen_andi_i32(c1, fcc, 1);
559
+ tcond = TCG_COND_NE;
560
+ break;
561
+ case 0x4: /* fbl : 1 */
562
+ c2 = 1;
563
+ tcond = TCG_COND_EQ;
564
+ break;
565
+ case 0x5: /* fbug : 2 or 3 */
566
+ c2 = 2;
567
+ tcond = TCG_COND_GEU;
568
+ break;
569
+ case 0x6: /* fbg : 2 */
570
+ c2 = 2;
571
+ tcond = TCG_COND_EQ;
572
+ break;
573
+ case 0x7: /* fbu : 3 */
574
+ c2 = 3;
575
+ tcond = TCG_COND_EQ;
576
break;
577
}
128
}
578
-
129
579
- fsr = tcg_temp_new();
130
if (z_mask == 0) {
580
- tcg_gen_ld_tl(fsr, tcg_env, offsetof(CPUSPARCState, fsr));
131
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
581
- switch (cond) {
132
582
- case 0x0:
133
ti = ts_info(ts);
583
- gen_op_eval_bn(r_dst);
134
ti->z_mask = z_mask;
584
- break;
135
- ti->s_mask = s_mask | smask_from_zmask(z_mask);
585
- case 0x1:
586
- gen_op_eval_fbne(r_dst, fsr, offset);
587
- break;
588
- case 0x2:
589
- gen_op_eval_fblg(r_dst, fsr, offset);
590
- break;
591
- case 0x3:
592
- gen_op_eval_fbul(r_dst, fsr, offset);
593
- break;
594
- case 0x4:
595
- gen_op_eval_fbl(r_dst, fsr, offset);
596
- break;
597
- case 0x5:
598
- gen_op_eval_fbug(r_dst, fsr, offset);
599
- break;
600
- case 0x6:
601
- gen_op_eval_fbg(r_dst, fsr, offset);
602
- break;
603
- case 0x7:
604
- gen_op_eval_fbu(r_dst, fsr, offset);
605
- break;
606
- case 0x8:
607
- gen_op_eval_ba(r_dst);
608
- break;
609
- case 0x9:
610
- gen_op_eval_fbe(r_dst, fsr, offset);
611
- break;
612
- case 0xa:
613
- gen_op_eval_fbue(r_dst, fsr, offset);
614
- break;
615
- case 0xb:
616
- gen_op_eval_fbge(r_dst, fsr, offset);
617
- break;
618
- case 0xc:
619
- gen_op_eval_fbuge(r_dst, fsr, offset);
620
- break;
621
- case 0xd:
622
- gen_op_eval_fble(r_dst, fsr, offset);
623
- break;
624
- case 0xe:
625
- gen_op_eval_fbule(r_dst, fsr, offset);
626
- break;
627
- case 0xf:
628
- gen_op_eval_fbo(r_dst, fsr, offset);
629
- break;
630
+ if (cond & 8) {
631
+ tcond = tcg_invert_cond(tcond);
632
}
633
+
136
+
634
+ cmp->cond = tcond;
137
+ /* Canonicalize s_mask and incorporate data from z_mask. */
635
+ cmp->c2 = c2;
138
+ rep = clz64(~s_mask);
636
+ cmp->c1 = tcg_temp_new();
139
+ rep = MAX(rep, clz64(z_mask));
637
+ tcg_gen_extu_i32_tl(cmp->c1, c1);
140
+ rep = MAX(rep - 1, 0);
638
}
141
+ ti->s_mask = INT64_MIN >> rep;
639
142
+
640
static bool gen_compare_reg(DisasCompare *cmp, int cond, TCGv r_src)
641
@@ -XXX,XX +XXX,XX @@ static void gen_op_fabsq(TCGv_i128 dst, TCGv_i128 src)
642
tcg_gen_concat_i64_i128(dst, l, h);
643
}
644
645
-#ifdef TARGET_SPARC64
646
-static void gen_op_fcmps(int fccno, TCGv_i32 r_rs1, TCGv_i32 r_rs2)
647
-{
648
- switch (fccno) {
649
- case 0:
650
- gen_helper_fcmps(tcg_env, r_rs1, r_rs2);
651
- break;
652
- case 1:
653
- gen_helper_fcmps_fcc1(tcg_env, r_rs1, r_rs2);
654
- break;
655
- case 2:
656
- gen_helper_fcmps_fcc2(tcg_env, r_rs1, r_rs2);
657
- break;
658
- case 3:
659
- gen_helper_fcmps_fcc3(tcg_env, r_rs1, r_rs2);
660
- break;
661
- }
662
-}
663
-
664
-static void gen_op_fcmpd(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
665
-{
666
- switch (fccno) {
667
- case 0:
668
- gen_helper_fcmpd(tcg_env, r_rs1, r_rs2);
669
- break;
670
- case 1:
671
- gen_helper_fcmpd_fcc1(tcg_env, r_rs1, r_rs2);
672
- break;
673
- case 2:
674
- gen_helper_fcmpd_fcc2(tcg_env, r_rs1, r_rs2);
675
- break;
676
- case 3:
677
- gen_helper_fcmpd_fcc3(tcg_env, r_rs1, r_rs2);
678
- break;
679
- }
680
-}
681
-
682
-static void gen_op_fcmpq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
683
-{
684
- switch (fccno) {
685
- case 0:
686
- gen_helper_fcmpq(tcg_env, r_rs1, r_rs2);
687
- break;
688
- case 1:
689
- gen_helper_fcmpq_fcc1(tcg_env, r_rs1, r_rs2);
690
- break;
691
- case 2:
692
- gen_helper_fcmpq_fcc2(tcg_env, r_rs1, r_rs2);
693
- break;
694
- case 3:
695
- gen_helper_fcmpq_fcc3(tcg_env, r_rs1, r_rs2);
696
- break;
697
- }
698
-}
699
-
700
-static void gen_op_fcmpes(int fccno, TCGv_i32 r_rs1, TCGv_i32 r_rs2)
701
-{
702
- switch (fccno) {
703
- case 0:
704
- gen_helper_fcmpes(tcg_env, r_rs1, r_rs2);
705
- break;
706
- case 1:
707
- gen_helper_fcmpes_fcc1(tcg_env, r_rs1, r_rs2);
708
- break;
709
- case 2:
710
- gen_helper_fcmpes_fcc2(tcg_env, r_rs1, r_rs2);
711
- break;
712
- case 3:
713
- gen_helper_fcmpes_fcc3(tcg_env, r_rs1, r_rs2);
714
- break;
715
- }
716
-}
717
-
718
-static void gen_op_fcmped(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
719
-{
720
- switch (fccno) {
721
- case 0:
722
- gen_helper_fcmped(tcg_env, r_rs1, r_rs2);
723
- break;
724
- case 1:
725
- gen_helper_fcmped_fcc1(tcg_env, r_rs1, r_rs2);
726
- break;
727
- case 2:
728
- gen_helper_fcmped_fcc2(tcg_env, r_rs1, r_rs2);
729
- break;
730
- case 3:
731
- gen_helper_fcmped_fcc3(tcg_env, r_rs1, r_rs2);
732
- break;
733
- }
734
-}
735
-
736
-static void gen_op_fcmpeq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
737
-{
738
- switch (fccno) {
739
- case 0:
740
- gen_helper_fcmpeq(tcg_env, r_rs1, r_rs2);
741
- break;
742
- case 1:
743
- gen_helper_fcmpeq_fcc1(tcg_env, r_rs1, r_rs2);
744
- break;
745
- case 2:
746
- gen_helper_fcmpeq_fcc2(tcg_env, r_rs1, r_rs2);
747
- break;
748
- case 3:
749
- gen_helper_fcmpeq_fcc3(tcg_env, r_rs1, r_rs2);
750
- break;
751
- }
752
-}
753
-
754
-#else
755
-
756
-static void gen_op_fcmps(int fccno, TCGv r_rs1, TCGv r_rs2)
757
-{
758
- gen_helper_fcmps(tcg_env, r_rs1, r_rs2);
759
-}
760
-
761
-static void gen_op_fcmpd(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
762
-{
763
- gen_helper_fcmpd(tcg_env, r_rs1, r_rs2);
764
-}
765
-
766
-static void gen_op_fcmpq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
767
-{
768
- gen_helper_fcmpq(tcg_env, r_rs1, r_rs2);
769
-}
770
-
771
-static void gen_op_fcmpes(int fccno, TCGv r_rs1, TCGv r_rs2)
772
-{
773
- gen_helper_fcmpes(tcg_env, r_rs1, r_rs2);
774
-}
775
-
776
-static void gen_op_fcmped(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
777
-{
778
- gen_helper_fcmped(tcg_env, r_rs1, r_rs2);
779
-}
780
-
781
-static void gen_op_fcmpeq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
782
-{
783
- gen_helper_fcmpeq(tcg_env, r_rs1, r_rs2);
784
-}
785
-#endif
786
-
787
static void gen_op_fpexception_im(DisasContext *dc, int ftt)
788
{
789
/*
790
@@ -XXX,XX +XXX,XX @@ static bool trans_STDFQ(DisasContext *dc, arg_STDFQ *a)
791
return true;
143
return true;
792
}
144
}
793
145
794
-static bool do_ldfsr(DisasContext *dc, arg_r_r_ri *a, MemOp mop,
146
@@ -XXX,XX +XXX,XX @@ static bool fold_exts(OptContext *ctx, TCGOp *op)
795
- target_ulong new_mask, target_ulong old_mask)
147
796
+static bool trans_LDFSR(DisasContext *dc, arg_r_r_ri *a)
148
ctx->z_mask = z_mask;
797
{
149
ctx->s_mask = s_mask;
798
TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm);
150
- if (!type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
799
- TCGv tnew, told;
151
+ if (0 && !type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
800
+ TCGv_i32 tmp;
801
802
if (addr == NULL) {
803
return false;
804
@@ -XXX,XX +XXX,XX @@ static bool do_ldfsr(DisasContext *dc, arg_r_r_ri *a, MemOp mop,
805
if (gen_trap_ifnofpu(dc)) {
806
return true;
152
return true;
807
}
153
}
808
- tnew = tcg_temp_new();
154
809
- told = tcg_temp_new();
155
@@ -XXX,XX +XXX,XX @@ static bool fold_sextract(OptContext *ctx, TCGOp *op)
810
- tcg_gen_qemu_ld_tl(tnew, addr, dc->mem_idx, mop | MO_ALIGN);
156
s_mask |= MAKE_64BIT_MASK(len, 64 - len);
811
- tcg_gen_ld_tl(told, tcg_env, offsetof(CPUSPARCState, fsr));
157
ctx->s_mask = s_mask;
812
- tcg_gen_andi_tl(tnew, tnew, new_mask);
158
813
- tcg_gen_andi_tl(told, told, old_mask);
159
- if (pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
814
- tcg_gen_or_tl(tnew, tnew, told);
160
+ if (0 && pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
815
- gen_helper_set_fsr_noftt(tcg_env, tnew);
161
return true;
816
+
817
+ tmp = tcg_temp_new_i32();
818
+ tcg_gen_qemu_ld_i32(tmp, addr, dc->mem_idx, MO_TEUL | MO_ALIGN);
819
+
820
+ tcg_gen_extract_i32(cpu_fcc[0], tmp, FSR_FCC0_SHIFT, 2);
821
+ /* LDFSR does not change FCC[1-3]. */
822
+
823
+ gen_helper_set_fsr_nofcc_noftt(tcg_env, tmp);
824
return advance_pc(dc);
825
}
826
827
-TRANS(LDFSR, ALL, do_ldfsr, a, MO_TEUL, FSR_LDFSR_MASK, FSR_LDFSR_OLDMASK)
828
-TRANS(LDXFSR, 64, do_ldfsr, a, MO_TEUQ, FSR_LDXFSR_MASK, FSR_LDXFSR_OLDMASK)
829
+static bool trans_LDXFSR(DisasContext *dc, arg_r_r_ri *a)
830
+{
831
+#ifdef TARGET_SPARC64
832
+ TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm);
833
+ TCGv_i64 t64;
834
+ TCGv_i32 lo, hi;
835
+
836
+ if (addr == NULL) {
837
+ return false;
838
+ }
839
+ if (gen_trap_ifnofpu(dc)) {
840
+ return true;
841
+ }
842
+
843
+ t64 = tcg_temp_new_i64();
844
+ tcg_gen_qemu_ld_i64(t64, addr, dc->mem_idx, MO_TEUQ | MO_ALIGN);
845
+
846
+ lo = tcg_temp_new_i32();
847
+ hi = cpu_fcc[3];
848
+ tcg_gen_extr_i64_i32(lo, hi, t64);
849
+ tcg_gen_extract_i32(cpu_fcc[0], lo, FSR_FCC0_SHIFT, 2);
850
+ tcg_gen_extract_i32(cpu_fcc[1], hi, FSR_FCC1_SHIFT - 32, 2);
851
+ tcg_gen_extract_i32(cpu_fcc[2], hi, FSR_FCC2_SHIFT - 32, 2);
852
+ tcg_gen_extract_i32(cpu_fcc[3], hi, FSR_FCC3_SHIFT - 32, 2);
853
+
854
+ gen_helper_set_fsr_nofcc_noftt(tcg_env, lo);
855
+ return advance_pc(dc);
856
+#else
857
+ return false;
858
+#endif
859
+}
860
861
static bool do_stfsr(DisasContext *dc, arg_r_r_ri *a, MemOp mop)
862
{
863
@@ -XXX,XX +XXX,XX @@ static bool do_fcmps(DisasContext *dc, arg_FCMPs *a, bool e)
864
src1 = gen_load_fpr_F(dc, a->rs1);
865
src2 = gen_load_fpr_F(dc, a->rs2);
866
if (e) {
867
- gen_op_fcmpes(a->cc, src1, src2);
868
+ gen_helper_fcmpes(cpu_fcc[a->cc], tcg_env, src1, src2);
869
} else {
870
- gen_op_fcmps(a->cc, src1, src2);
871
+ gen_helper_fcmps(cpu_fcc[a->cc], tcg_env, src1, src2);
872
}
162
}
873
return advance_pc(dc);
163
874
}
164
@@ -XXX,XX +XXX,XX @@ static bool fold_shift(OptContext *ctx, TCGOp *op)
875
@@ -XXX,XX +XXX,XX @@ static bool do_fcmpd(DisasContext *dc, arg_FCMPd *a, bool e)
165
ctx->z_mask = do_constant_folding(op->opc, ctx->type, z_mask, sh);
876
src1 = gen_load_fpr_D(dc, a->rs1);
166
877
src2 = gen_load_fpr_D(dc, a->rs2);
167
s_mask = do_constant_folding(op->opc, ctx->type, s_mask, sh);
878
if (e) {
168
- ctx->s_mask = smask_from_smask(s_mask);
879
- gen_op_fcmped(a->cc, src1, src2);
169
880
+ gen_helper_fcmped(cpu_fcc[a->cc], tcg_env, src1, src2);
170
return fold_masks(ctx, op);
881
} else {
882
- gen_op_fcmpd(a->cc, src1, src2);
883
+ gen_helper_fcmpd(cpu_fcc[a->cc], tcg_env, src1, src2);
884
}
171
}
885
return advance_pc(dc);
886
}
887
@@ -XXX,XX +XXX,XX @@ static bool do_fcmpq(DisasContext *dc, arg_FCMPq *a, bool e)
888
src1 = gen_load_fpr_Q(dc, a->rs1);
889
src2 = gen_load_fpr_Q(dc, a->rs2);
890
if (e) {
891
- gen_op_fcmpeq(a->cc, src1, src2);
892
+ gen_helper_fcmpeq(cpu_fcc[a->cc], tcg_env, src1, src2);
893
} else {
894
- gen_op_fcmpq(a->cc, src1, src2);
895
+ gen_helper_fcmpq(cpu_fcc[a->cc], tcg_env, src1, src2);
896
}
897
return advance_pc(dc);
898
}
899
@@ -XXX,XX +XXX,XX @@ void sparc_tcg_init(void)
900
"f48", "f50", "f52", "f54", "f56", "f58", "f60", "f62",
901
};
902
903
+ static const struct { TCGv_i32 *ptr; int off; const char *name; } r32[] = {
904
+#ifdef TARGET_SPARC64
905
+ { &cpu_fprs, offsetof(CPUSPARCState, fprs), "fprs" },
906
+ { &cpu_fcc[0], offsetof(CPUSPARCState, fcc[0]), "fcc0" },
907
+ { &cpu_fcc[1], offsetof(CPUSPARCState, fcc[1]), "fcc1" },
908
+ { &cpu_fcc[2], offsetof(CPUSPARCState, fcc[2]), "fcc2" },
909
+ { &cpu_fcc[3], offsetof(CPUSPARCState, fcc[3]), "fcc3" },
910
+#else
911
+ { &cpu_fcc[0], offsetof(CPUSPARCState, fcc[0]), "fcc" },
912
+#endif
913
+ };
914
+
915
static const struct { TCGv *ptr; int off; const char *name; } rtl[] = {
916
#ifdef TARGET_SPARC64
917
{ &cpu_gsr, offsetof(CPUSPARCState, gsr), "gsr" },
918
@@ -XXX,XX +XXX,XX @@ void sparc_tcg_init(void)
919
offsetof(CPUSPARCState, regwptr),
920
"regwptr");
921
922
+ for (i = 0; i < ARRAY_SIZE(r32); ++i) {
923
+ *r32[i].ptr = tcg_global_mem_new_i32(tcg_env, r32[i].off, r32[i].name);
924
+ }
925
+
926
for (i = 0; i < ARRAY_SIZE(rtl); ++i) {
927
*rtl[i].ptr = tcg_global_mem_new(tcg_env, rtl[i].off, rtl[i].name);
928
}
929
@@ -XXX,XX +XXX,XX @@ void sparc_tcg_init(void)
930
offsetof(CPUSPARCState, fpr[i]),
931
fregnames[i]);
932
}
933
-
934
-#ifdef TARGET_SPARC64
935
- cpu_fprs = tcg_global_mem_new_i32(tcg_env,
936
- offsetof(CPUSPARCState, fprs), "fprs");
937
-#endif
938
}
939
940
void sparc_restore_state_to_opc(CPUState *cs,
941
--
172
--
942
2.34.1
173
2.43.0
diff view generated by jsdifflib
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
3
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
4
Message-Id: <20231103173841.33651-13-richard.henderson@linaro.org>
5
---
3
---
6
target/sparc/helper.h | 4 ++--
4
tcg/optimize.c | 9 +++++----
7
target/sparc/fop_helper.c | 8 ++++----
5
1 file changed, 5 insertions(+), 4 deletions(-)
8
target/sparc/translate.c | 9 +++++----
9
3 files changed, 11 insertions(+), 10 deletions(-)
10
6
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
index XXXXXXX..XXXXXXX 100644
8
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
9
--- a/tcg/optimize.c
14
+++ b/target/sparc/helper.h
10
+++ b/tcg/optimize.c
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(fitos, TCG_CALL_NO_RWG, f32, env, s32)
11
@@ -XXX,XX +XXX,XX @@ static void finish_ebb(OptContext *ctx)
16
#ifdef TARGET_SPARC64
12
remove_mem_copy_all(ctx);
17
DEF_HELPER_FLAGS_2(fxtos, TCG_CALL_NO_RWG, f32, env, s64)
18
DEF_HELPER_FLAGS_2(fxtod, TCG_CALL_NO_RWG, f64, env, s64)
19
-DEF_HELPER_FLAGS_2(fxtoq, TCG_CALL_NO_RWG, void, env, s64)
20
+DEF_HELPER_FLAGS_2(fxtoq, TCG_CALL_NO_RWG, i128, env, s64)
21
#endif
22
DEF_HELPER_FLAGS_2(fdtos, TCG_CALL_NO_RWG, f32, env, f64)
23
DEF_HELPER_FLAGS_2(fstod, TCG_CALL_NO_RWG, f64, env, f32)
24
DEF_HELPER_FLAGS_2(fqtos, TCG_CALL_NO_RWG, f32, env, i128)
25
DEF_HELPER_FLAGS_2(fstoq, TCG_CALL_NO_RWG, i128, env, f32)
26
DEF_HELPER_FLAGS_2(fqtod, TCG_CALL_NO_RWG, f64, env, i128)
27
-DEF_HELPER_FLAGS_2(fdtoq, TCG_CALL_NO_RWG, void, env, f64)
28
+DEF_HELPER_FLAGS_2(fdtoq, TCG_CALL_NO_RWG, i128, env, f64)
29
DEF_HELPER_FLAGS_2(fstoi, TCG_CALL_NO_RWG, s32, env, f32)
30
DEF_HELPER_FLAGS_2(fdtoi, TCG_CALL_NO_RWG, s32, env, f64)
31
DEF_HELPER_FLAGS_2(fqtoi, TCG_CALL_NO_RWG, s32, env, i128)
32
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/sparc/fop_helper.c
35
+++ b/target/sparc/fop_helper.c
36
@@ -XXX,XX +XXX,XX @@ float64 helper_fxtod(CPUSPARCState *env, int64_t src)
37
return int64_to_float64(src, &env->fp_status);
38
}
13
}
39
14
40
-void helper_fxtoq(CPUSPARCState *env, int64_t src)
15
-static void finish_folding(OptContext *ctx, TCGOp *op)
41
+Int128 helper_fxtoq(CPUSPARCState *env, int64_t src)
16
+static bool finish_folding(OptContext *ctx, TCGOp *op)
42
{
17
{
43
- QT0 = int64_to_float128(src, &env->fp_status);
18
const TCGOpDef *def = &tcg_op_defs[op->opc];
44
+ return f128_ret(int64_to_float128(src, &env->fp_status));
19
int i, nb_oargs;
20
@@ -XXX,XX +XXX,XX @@ static void finish_folding(OptContext *ctx, TCGOp *op)
21
ts_info(ts)->z_mask = ctx->z_mask;
22
}
23
}
24
+ return true;
45
}
25
}
46
#endif
26
47
27
/*
48
@@ -XXX,XX +XXX,XX @@ float64 helper_fqtod(CPUSPARCState *env, Int128 src)
28
@@ -XXX,XX +XXX,XX @@ static bool fold_add(OptContext *ctx, TCGOp *op)
49
return float128_to_float64(f128_in(src), &env->fp_status);
29
fold_xi_to_x(ctx, op, 0)) {
30
return true;
31
}
32
- return false;
33
+ return finish_folding(ctx, op);
50
}
34
}
51
35
52
-void helper_fdtoq(CPUSPARCState *env, float64 src)
36
/* We cannot as yet do_constant_folding with vectors. */
53
+Int128 helper_fdtoq(CPUSPARCState *env, float64 src)
37
@@ -XXX,XX +XXX,XX @@ static bool fold_add_vec(OptContext *ctx, TCGOp *op)
54
{
38
fold_xi_to_x(ctx, op, 0)) {
55
- QT0 = float64_to_float128(src, &env->fp_status);
39
return true;
56
+ return f128_ret(float64_to_float128(src, &env->fp_status));
40
}
41
- return false;
42
+ return finish_folding(ctx, op);
57
}
43
}
58
44
59
/* Float to integer conversion. */
45
static bool fold_addsub2(OptContext *ctx, TCGOp *op, bool add)
60
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
46
@@ -XXX,XX +XXX,XX @@ static bool fold_addsub2(OptContext *ctx, TCGOp *op, bool add)
61
index XXXXXXX..XXXXXXX 100644
47
op->args[4] = arg_new_constant(ctx, bl);
62
--- a/target/sparc/translate.c
48
op->args[5] = arg_new_constant(ctx, bh);
63
+++ b/target/sparc/translate.c
49
}
64
@@ -XXX,XX +XXX,XX @@ TRANS(FiTOq, ALL, do_env_qf, a, gen_helper_fitoq)
50
- return false;
65
TRANS(FsTOq, ALL, do_env_qf, a, gen_helper_fstoq)
51
+ return finish_folding(ctx, op);
66
67
static bool do_env_qd(DisasContext *dc, arg_r_r *a,
68
- void (*func)(TCGv_env, TCGv_i64))
69
+ void (*func)(TCGv_i128, TCGv_env, TCGv_i64))
70
{
71
TCGv_i64 src;
72
+ TCGv_i128 dst;
73
74
if (gen_trap_ifnofpu(dc)) {
75
return true;
76
@@ -XXX,XX +XXX,XX @@ static bool do_env_qd(DisasContext *dc, arg_r_r *a,
77
78
gen_op_clear_ieee_excp_and_FTT();
79
src = gen_load_fpr_D(dc, a->rs);
80
- func(tcg_env, src);
81
- gen_op_store_QT0_fpr(QFPREG(a->rd));
82
- gen_update_fprs_dirty(dc, QFPREG(a->rd));
83
+ dst = tcg_temp_new_i128();
84
+ func(dst, tcg_env, src);
85
+ gen_store_fpr_Q(dc, a->rd, dst);
86
return advance_pc(dc);
87
}
52
}
88
53
54
static bool fold_add2(OptContext *ctx, TCGOp *op)
89
--
55
--
90
2.34.1
56
2.43.0
diff view generated by jsdifflib
1
These are simple bit manipulation insns.
1
Introduce ti_is_const, ti_const_val, ti_is_const_val.
2
Begin using i128 for float128.
3
Implement FMOVq with do_qq.
4
2
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
8
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
9
Message-Id: <20231103173841.33651-6-richard.henderson@linaro.org>
10
---
4
---
11
target/sparc/helper.h | 6 ----
5
tcg/optimize.c | 20 +++++++++++++++++---
12
target/sparc/fop_helper.c | 34 ---------------------
6
1 file changed, 17 insertions(+), 3 deletions(-)
13
target/sparc/translate.c | 62 +++++++++++++++++++--------------------
14
3 files changed, 30 insertions(+), 72 deletions(-)
15
7
16
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
8
diff --git a/tcg/optimize.c b/tcg/optimize.c
17
index XXXXXXX..XXXXXXX 100644
9
index XXXXXXX..XXXXXXX 100644
18
--- a/target/sparc/helper.h
10
--- a/tcg/optimize.c
19
+++ b/target/sparc/helper.h
11
+++ b/tcg/optimize.c
20
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(st_asi, TCG_CALL_NO_WG, void, env, tl, i64, int, i32)
12
@@ -XXX,XX +XXX,XX @@ static inline TempOptInfo *arg_info(TCGArg arg)
21
#endif
13
return ts_info(arg_temp(arg));
22
DEF_HELPER_FLAGS_1(check_ieee_exceptions, TCG_CALL_NO_WG, tl, env)
23
DEF_HELPER_FLAGS_2(set_fsr, TCG_CALL_NO_RWG, void, env, tl)
24
-DEF_HELPER_FLAGS_1(fabss, TCG_CALL_NO_RWG_SE, f32, f32)
25
DEF_HELPER_FLAGS_2(fsqrts, TCG_CALL_NO_RWG, f32, env, f32)
26
DEF_HELPER_FLAGS_2(fsqrtd, TCG_CALL_NO_RWG, f64, env, f64)
27
DEF_HELPER_FLAGS_3(fcmps, TCG_CALL_NO_WG, tl, env, f32, f32)
28
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_1(fsqrtq, TCG_CALL_NO_RWG, void, env)
29
DEF_HELPER_FLAGS_1(fcmpq, TCG_CALL_NO_WG, tl, env)
30
DEF_HELPER_FLAGS_1(fcmpeq, TCG_CALL_NO_WG, tl, env)
31
#ifdef TARGET_SPARC64
32
-DEF_HELPER_FLAGS_1(fabsd, TCG_CALL_NO_RWG_SE, f64, f64)
33
DEF_HELPER_FLAGS_3(fcmps_fcc1, TCG_CALL_NO_WG, tl, env, f32, f32)
34
DEF_HELPER_FLAGS_3(fcmps_fcc2, TCG_CALL_NO_WG, tl, env, f32, f32)
35
DEF_HELPER_FLAGS_3(fcmps_fcc3, TCG_CALL_NO_WG, tl, env, f32, f32)
36
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fcmpes_fcc3, TCG_CALL_NO_WG, tl, env, f32, f32)
37
DEF_HELPER_FLAGS_3(fcmped_fcc1, TCG_CALL_NO_WG, tl, env, f64, f64)
38
DEF_HELPER_FLAGS_3(fcmped_fcc2, TCG_CALL_NO_WG, tl, env, f64, f64)
39
DEF_HELPER_FLAGS_3(fcmped_fcc3, TCG_CALL_NO_WG, tl, env, f64, f64)
40
-DEF_HELPER_FLAGS_1(fabsq, TCG_CALL_NO_RWG, void, env)
41
DEF_HELPER_FLAGS_1(fcmpq_fcc1, TCG_CALL_NO_WG, tl, env)
42
DEF_HELPER_FLAGS_1(fcmpq_fcc2, TCG_CALL_NO_WG, tl, env)
43
DEF_HELPER_FLAGS_1(fcmpq_fcc3, TCG_CALL_NO_WG, tl, env)
44
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fdivs, TCG_CALL_NO_RWG, f32, env, f32, f32)
45
DEF_HELPER_FLAGS_3(fsmuld, TCG_CALL_NO_RWG, f64, env, f32, f32)
46
DEF_HELPER_FLAGS_3(fdmulq, TCG_CALL_NO_RWG, void, env, f64, f64)
47
48
-DEF_HELPER_FLAGS_1(fnegs, TCG_CALL_NO_RWG_SE, f32, f32)
49
DEF_HELPER_FLAGS_2(fitod, TCG_CALL_NO_RWG_SE, f64, env, s32)
50
DEF_HELPER_FLAGS_2(fitoq, TCG_CALL_NO_RWG, void, env, s32)
51
52
DEF_HELPER_FLAGS_2(fitos, TCG_CALL_NO_RWG, f32, env, s32)
53
54
#ifdef TARGET_SPARC64
55
-DEF_HELPER_FLAGS_1(fnegd, TCG_CALL_NO_RWG_SE, f64, f64)
56
-DEF_HELPER_FLAGS_1(fnegq, TCG_CALL_NO_RWG, void, env)
57
DEF_HELPER_FLAGS_2(fxtos, TCG_CALL_NO_RWG, f32, env, s64)
58
DEF_HELPER_FLAGS_2(fxtod, TCG_CALL_NO_RWG, f64, env, s64)
59
DEF_HELPER_FLAGS_2(fxtoq, TCG_CALL_NO_RWG, void, env, s64)
60
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/target/sparc/fop_helper.c
63
+++ b/target/sparc/fop_helper.c
64
@@ -XXX,XX +XXX,XX @@ void helper_fdmulq(CPUSPARCState *env, float64 src1, float64 src2)
65
&env->fp_status);
66
}
14
}
67
15
68
-float32 helper_fnegs(float32 src)
16
+static inline bool ti_is_const(TempOptInfo *ti)
69
-{
17
+{
70
- return float32_chs(src);
18
+ return ti->is_const;
71
-}
72
-
73
-#ifdef TARGET_SPARC64
74
-float64 helper_fnegd(float64 src)
75
-{
76
- return float64_chs(src);
77
-}
78
-
79
-F_HELPER(neg, q)
80
-{
81
- QT0 = float128_chs(QT1);
82
-}
83
-#endif
84
-
85
/* Integer to float conversion. */
86
float32 helper_fitos(CPUSPARCState *env, int32_t src)
87
{
88
@@ -XXX,XX +XXX,XX @@ int64_t helper_fqtox(CPUSPARCState *env)
89
}
90
#endif
91
92
-float32 helper_fabss(float32 src)
93
-{
94
- return float32_abs(src);
95
-}
96
-
97
-#ifdef TARGET_SPARC64
98
-float64 helper_fabsd(float64 src)
99
-{
100
- return float64_abs(src);
101
-}
102
-
103
-void helper_fabsq(CPUSPARCState *env)
104
-{
105
- QT0 = float128_abs(QT1);
106
-}
107
-#endif
108
-
109
float32 helper_fsqrts(CPUSPARCState *env, float32 src)
110
{
111
return float32_sqrt(src, &env->fp_status);
112
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
113
index XXXXXXX..XXXXXXX 100644
114
--- a/target/sparc/translate.c
115
+++ b/target/sparc/translate.c
116
@@ -XXX,XX +XXX,XX @@
117
#else
118
# define gen_helper_clear_softint(E, S) qemu_build_not_reached()
119
# define gen_helper_done(E) qemu_build_not_reached()
120
-# define gen_helper_fabsd(D, S) qemu_build_not_reached()
121
# define gen_helper_flushw(E) qemu_build_not_reached()
122
-# define gen_helper_fnegd(D, S) qemu_build_not_reached()
123
# define gen_helper_rdccr(D, E) qemu_build_not_reached()
124
# define gen_helper_rdcwp(D, E) qemu_build_not_reached()
125
# define gen_helper_restored(E) qemu_build_not_reached()
126
@@ -XXX,XX +XXX,XX @@
127
# define gen_helper_write_softint(E, S) qemu_build_not_reached()
128
# define gen_helper_wrpil(E, S) qemu_build_not_reached()
129
# define gen_helper_wrpstate(E, S) qemu_build_not_reached()
130
-# define gen_helper_fabsq ({ qemu_build_not_reached(); NULL; })
131
# define gen_helper_fcmpeq16 ({ qemu_build_not_reached(); NULL; })
132
# define gen_helper_fcmpeq32 ({ qemu_build_not_reached(); NULL; })
133
# define gen_helper_fcmpgt16 ({ qemu_build_not_reached(); NULL; })
134
@@ -XXX,XX +XXX,XX @@
135
# define gen_helper_fmul8x16 ({ qemu_build_not_reached(); NULL; })
136
# define gen_helper_fmuld8sux16 ({ qemu_build_not_reached(); NULL; })
137
# define gen_helper_fmuld8ulx16 ({ qemu_build_not_reached(); NULL; })
138
-# define gen_helper_fnegq ({ qemu_build_not_reached(); NULL; })
139
# define gen_helper_fpmerge ({ qemu_build_not_reached(); NULL; })
140
# define gen_helper_fqtox ({ qemu_build_not_reached(); NULL; })
141
# define gen_helper_fstox ({ qemu_build_not_reached(); NULL; })
142
@@ -XXX,XX +XXX,XX @@ static void gen_op_fmovs(TCGv_i32 dst, TCGv_i32 src)
143
static void gen_op_fnegs(TCGv_i32 dst, TCGv_i32 src)
144
{
145
gen_op_clear_ieee_excp_and_FTT();
146
- gen_helper_fnegs(dst, src);
147
+ tcg_gen_xori_i32(dst, src, 1u << 31);
148
}
149
150
static void gen_op_fabss(TCGv_i32 dst, TCGv_i32 src)
151
{
152
gen_op_clear_ieee_excp_and_FTT();
153
- gen_helper_fabss(dst, src);
154
+ tcg_gen_andi_i32(dst, src, ~(1u << 31));
155
}
156
157
static void gen_op_fmovd(TCGv_i64 dst, TCGv_i64 src)
158
@@ -XXX,XX +XXX,XX @@ static void gen_op_fmovd(TCGv_i64 dst, TCGv_i64 src)
159
static void gen_op_fnegd(TCGv_i64 dst, TCGv_i64 src)
160
{
161
gen_op_clear_ieee_excp_and_FTT();
162
- gen_helper_fnegd(dst, src);
163
+ tcg_gen_xori_i64(dst, src, 1ull << 63);
164
}
165
166
static void gen_op_fabsd(TCGv_i64 dst, TCGv_i64 src)
167
{
168
gen_op_clear_ieee_excp_and_FTT();
169
- gen_helper_fabsd(dst, src);
170
+ tcg_gen_andi_i64(dst, src, ~(1ull << 63));
171
+}
19
+}
172
+
20
+
173
+static void gen_op_fnegq(TCGv_i128 dst, TCGv_i128 src)
21
+static inline uint64_t ti_const_val(TempOptInfo *ti)
174
+{
22
+{
175
+ TCGv_i64 l = tcg_temp_new_i64();
23
+ return ti->val;
176
+ TCGv_i64 h = tcg_temp_new_i64();
177
+
178
+ tcg_gen_extr_i128_i64(l, h, src);
179
+ tcg_gen_xori_i64(h, h, 1ull << 63);
180
+ tcg_gen_concat_i64_i128(dst, l, h);
181
+}
24
+}
182
+
25
+
183
+static void gen_op_fabsq(TCGv_i128 dst, TCGv_i128 src)
26
+static inline bool ti_is_const_val(TempOptInfo *ti, uint64_t val)
184
+{
27
+{
185
+ TCGv_i64 l = tcg_temp_new_i64();
28
+ return ti_is_const(ti) && ti_const_val(ti) == val;
186
+ TCGv_i64 h = tcg_temp_new_i64();
29
+}
187
+
30
+
188
+ tcg_gen_extr_i128_i64(l, h, src);
31
static inline bool ts_is_const(TCGTemp *ts)
189
+ tcg_gen_andi_i64(h, h, ~(1ull << 63));
32
{
190
+ tcg_gen_concat_i64_i128(dst, l, h);
33
- return ts_info(ts)->is_const;
34
+ return ti_is_const(ts_info(ts));
191
}
35
}
192
36
193
#ifdef TARGET_SPARC64
37
static inline bool ts_is_const_val(TCGTemp *ts, uint64_t val)
194
@@ -XXX,XX +XXX,XX @@ TRANS(FiTOd, ALL, do_env_df, a, gen_helper_fitod)
195
TRANS(FsTOd, ALL, do_env_df, a, gen_helper_fstod)
196
TRANS(FsTOx, 64, do_env_df, a, gen_helper_fstox)
197
198
-static bool trans_FMOVq(DisasContext *dc, arg_FMOVq *a)
199
+static bool do_qq(DisasContext *dc, arg_r_r *a,
200
+ void (*func)(TCGv_i128, TCGv_i128))
201
{
38
{
202
TCGv_i128 t;
39
- TempOptInfo *ti = ts_info(ts);
203
40
- return ti->is_const && ti->val == val;
204
- if (!avail_64(dc)) {
41
+ return ti_is_const_val(ts_info(ts), val);
205
- return false;
206
- }
207
if (gen_trap_ifnofpu(dc)) {
208
return true;
209
}
210
@@ -XXX,XX +XXX,XX @@ static bool trans_FMOVq(DisasContext *dc, arg_FMOVq *a)
211
212
gen_op_clear_ieee_excp_and_FTT();
213
t = gen_load_fpr_Q(dc, a->rs);
214
+ func(t, t);
215
gen_store_fpr_Q(dc, a->rd, t);
216
return advance_pc(dc);
217
}
42
}
218
43
219
-static bool do_qq(DisasContext *dc, arg_r_r *a,
44
static inline bool arg_is_const(TCGArg arg)
220
- void (*func)(TCGv_env))
221
-{
222
- if (gen_trap_ifnofpu(dc)) {
223
- return true;
224
- }
225
- if (gen_trap_float128(dc)) {
226
- return true;
227
- }
228
-
229
- gen_op_clear_ieee_excp_and_FTT();
230
- gen_op_load_fpr_QT1(QFPREG(a->rs));
231
- func(tcg_env);
232
- gen_op_store_QT0_fpr(QFPREG(a->rd));
233
- gen_update_fprs_dirty(dc, QFPREG(a->rd));
234
- return advance_pc(dc);
235
-}
236
-
237
-TRANS(FNEGq, 64, do_qq, a, gen_helper_fnegq)
238
-TRANS(FABSq, 64, do_qq, a, gen_helper_fabsq)
239
+TRANS(FMOVq, 64, do_qq, a, tcg_gen_mov_i128)
240
+TRANS(FNEGq, 64, do_qq, a, gen_op_fnegq)
241
+TRANS(FABSq, 64, do_qq, a, gen_op_fabsq)
242
243
static bool do_env_qq(DisasContext *dc, arg_r_r *a,
244
void (*func)(TCGv_env))
245
--
45
--
246
2.34.1
46
2.43.0
247
248
diff view generated by jsdifflib
New patch
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
Sink mask computation below fold_affected_mask early exit.
1
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/optimize.c | 30 ++++++++++++++++--------------
8
1 file changed, 16 insertions(+), 14 deletions(-)
9
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
13
+++ b/tcg/optimize.c
14
@@ -XXX,XX +XXX,XX @@ static bool fold_add2(OptContext *ctx, TCGOp *op)
15
16
static bool fold_and(OptContext *ctx, TCGOp *op)
17
{
18
- uint64_t z1, z2;
19
+ uint64_t z1, z2, z_mask, s_mask;
20
+ TempOptInfo *t1, *t2;
21
22
if (fold_const2_commutative(ctx, op) ||
23
fold_xi_to_i(ctx, op, 0) ||
24
@@ -XXX,XX +XXX,XX @@ static bool fold_and(OptContext *ctx, TCGOp *op)
25
return true;
26
}
27
28
- z1 = arg_info(op->args[1])->z_mask;
29
- z2 = arg_info(op->args[2])->z_mask;
30
- ctx->z_mask = z1 & z2;
31
-
32
- /*
33
- * Sign repetitions are perforce all identical, whether they are 1 or 0.
34
- * Bitwise operations preserve the relative quantity of the repetitions.
35
- */
36
- ctx->s_mask = arg_info(op->args[1])->s_mask
37
- & arg_info(op->args[2])->s_mask;
38
+ t1 = arg_info(op->args[1]);
39
+ t2 = arg_info(op->args[2]);
40
+ z1 = t1->z_mask;
41
+ z2 = t2->z_mask;
42
43
/*
44
* Known-zeros does not imply known-ones. Therefore unless
45
* arg2 is constant, we can't infer affected bits from it.
46
*/
47
- if (arg_is_const(op->args[2]) &&
48
- fold_affected_mask(ctx, op, z1 & ~z2)) {
49
+ if (ti_is_const(t2) && fold_affected_mask(ctx, op, z1 & ~z2)) {
50
return true;
51
}
52
53
- return fold_masks(ctx, op);
54
+ z_mask = z1 & z2;
55
+
56
+ /*
57
+ * Sign repetitions are perforce all identical, whether they are 1 or 0.
58
+ * Bitwise operations preserve the relative quantity of the repetitions.
59
+ */
60
+ s_mask = t1->s_mask & t2->s_mask;
61
+
62
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
63
}
64
65
static bool fold_andc(OptContext *ctx, TCGOp *op)
66
--
67
2.43.0
diff view generated by jsdifflib
New patch
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
Avoid double inversion of the value of second const operand.
1
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/optimize.c | 21 +++++++++++----------
8
1 file changed, 11 insertions(+), 10 deletions(-)
9
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
13
+++ b/tcg/optimize.c
14
@@ -XXX,XX +XXX,XX @@ static bool fold_and(OptContext *ctx, TCGOp *op)
15
16
static bool fold_andc(OptContext *ctx, TCGOp *op)
17
{
18
- uint64_t z1;
19
+ uint64_t z_mask, s_mask;
20
+ TempOptInfo *t1, *t2;
21
22
if (fold_const2(ctx, op) ||
23
fold_xx_to_i(ctx, op, 0) ||
24
@@ -XXX,XX +XXX,XX @@ static bool fold_andc(OptContext *ctx, TCGOp *op)
25
return true;
26
}
27
28
- z1 = arg_info(op->args[1])->z_mask;
29
+ t1 = arg_info(op->args[1]);
30
+ t2 = arg_info(op->args[2]);
31
+ z_mask = t1->z_mask;
32
33
/*
34
* Known-zeros does not imply known-ones. Therefore unless
35
* arg2 is constant, we can't infer anything from it.
36
*/
37
- if (arg_is_const(op->args[2])) {
38
- uint64_t z2 = ~arg_info(op->args[2])->z_mask;
39
- if (fold_affected_mask(ctx, op, z1 & ~z2)) {
40
+ if (ti_is_const(t2)) {
41
+ uint64_t v2 = ti_const_val(t2);
42
+ if (fold_affected_mask(ctx, op, z_mask & v2)) {
43
return true;
44
}
45
- z1 &= z2;
46
+ z_mask &= ~v2;
47
}
48
- ctx->z_mask = z1;
49
50
- ctx->s_mask = arg_info(op->args[1])->s_mask
51
- & arg_info(op->args[2])->s_mask;
52
- return fold_masks(ctx, op);
53
+ s_mask = t1->s_mask & t2->s_mask;
54
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
55
}
56
57
static bool fold_brcond(OptContext *ctx, TCGOp *op)
58
--
59
2.43.0
diff view generated by jsdifflib
New patch
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
Always set s_mask along the BSWAP_OS path, since the result is
3
being explicitly sign-extended.
1
4
5
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
8
tcg/optimize.c | 21 ++++++++++-----------
9
1 file changed, 10 insertions(+), 11 deletions(-)
10
11
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/optimize.c
14
+++ b/tcg/optimize.c
15
@@ -XXX,XX +XXX,XX @@ static bool fold_brcond2(OptContext *ctx, TCGOp *op)
16
static bool fold_bswap(OptContext *ctx, TCGOp *op)
17
{
18
uint64_t z_mask, s_mask, sign;
19
+ TempOptInfo *t1 = arg_info(op->args[1]);
20
21
- if (arg_is_const(op->args[1])) {
22
- uint64_t t = arg_info(op->args[1])->val;
23
-
24
- t = do_constant_folding(op->opc, ctx->type, t, op->args[2]);
25
- return tcg_opt_gen_movi(ctx, op, op->args[0], t);
26
+ if (ti_is_const(t1)) {
27
+ return tcg_opt_gen_movi(ctx, op, op->args[0],
28
+ do_constant_folding(op->opc, ctx->type,
29
+ ti_const_val(t1),
30
+ op->args[2]));
31
}
32
33
- z_mask = arg_info(op->args[1])->z_mask;
34
-
35
+ z_mask = t1->z_mask;
36
switch (op->opc) {
37
case INDEX_op_bswap16_i32:
38
case INDEX_op_bswap16_i64:
39
@@ -XXX,XX +XXX,XX @@ static bool fold_bswap(OptContext *ctx, TCGOp *op)
40
/* If the sign bit may be 1, force all the bits above to 1. */
41
if (z_mask & sign) {
42
z_mask |= sign;
43
- s_mask = sign << 1;
44
}
45
+ /* The value and therefore s_mask is explicitly sign-extended. */
46
+ s_mask = sign;
47
break;
48
default:
49
/* The high bits are undefined: force all bits above the sign to 1. */
50
z_mask |= sign << 1;
51
break;
52
}
53
- ctx->z_mask = z_mask;
54
- ctx->s_mask = s_mask;
55
56
- return fold_masks(ctx, op);
57
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
58
}
59
60
static bool fold_call(OptContext *ctx, TCGOp *op)
61
--
62
2.43.0
diff view generated by jsdifflib
New patch
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
Compute s_mask from the union of the maximum count and the
3
op2 fallback for op1 being zero.
1
4
5
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
8
tcg/optimize.c | 15 ++++++++++-----
9
1 file changed, 10 insertions(+), 5 deletions(-)
10
11
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/tcg/optimize.c
14
+++ b/tcg/optimize.c
15
@@ -XXX,XX +XXX,XX @@ static bool fold_call(OptContext *ctx, TCGOp *op)
16
17
static bool fold_count_zeros(OptContext *ctx, TCGOp *op)
18
{
19
- uint64_t z_mask;
20
+ uint64_t z_mask, s_mask;
21
+ TempOptInfo *t1 = arg_info(op->args[1]);
22
+ TempOptInfo *t2 = arg_info(op->args[2]);
23
24
- if (arg_is_const(op->args[1])) {
25
- uint64_t t = arg_info(op->args[1])->val;
26
+ if (ti_is_const(t1)) {
27
+ uint64_t t = ti_const_val(t1);
28
29
if (t != 0) {
30
t = do_constant_folding(op->opc, ctx->type, t, 0);
31
@@ -XXX,XX +XXX,XX @@ static bool fold_count_zeros(OptContext *ctx, TCGOp *op)
32
default:
33
g_assert_not_reached();
34
}
35
- ctx->z_mask = arg_info(op->args[2])->z_mask | z_mask;
36
- return false;
37
+ s_mask = ~z_mask;
38
+ z_mask |= t2->z_mask;
39
+ s_mask &= t2->s_mask;
40
+
41
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
42
}
43
44
static bool fold_ctpop(OptContext *ctx, TCGOp *op)
45
--
46
2.43.0
diff view generated by jsdifflib
1
Use them for trans_FMOVq.
1
Add fold_masks_z as a trivial wrapper around fold_masks_zs.
2
Avoid the use of the OptContext slots.
2
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
6
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
7
Message-Id: <20231103173841.33651-5-richard.henderson@linaro.org>
8
---
6
---
9
target/sparc/translate.c | 25 +++++++++++++++++++------
7
tcg/optimize.c | 13 ++++++++++---
10
1 file changed, 19 insertions(+), 6 deletions(-)
8
1 file changed, 10 insertions(+), 3 deletions(-)
11
9
12
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
13
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
14
--- a/target/sparc/translate.c
12
--- a/tcg/optimize.c
15
+++ b/target/sparc/translate.c
13
+++ b/tcg/optimize.c
16
@@ -XXX,XX +XXX,XX @@ static TCGv_i64 gen_dest_fpr_D(DisasContext *dc, unsigned int dst)
14
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_zs(OptContext *ctx, TCGOp *op,
17
return cpu_fpr[DFPREG(dst) / 2];
15
return true;
18
}
16
}
19
17
20
+static TCGv_i128 gen_load_fpr_Q(DisasContext *dc, unsigned int src)
18
+static bool fold_masks_z(OptContext *ctx, TCGOp *op, uint64_t z_mask)
21
+{
19
+{
22
+ TCGv_i128 ret = tcg_temp_new_i128();
20
+ return fold_masks_zs(ctx, op, z_mask, 0);
23
+
24
+ src = QFPREG(src);
25
+ tcg_gen_concat_i64_i128(ret, cpu_fpr[src / 2 + 1], cpu_fpr[src / 2]);
26
+ return ret;
27
+}
21
+}
28
+
22
+
29
+static void gen_store_fpr_Q(DisasContext *dc, unsigned int dst, TCGv_i128 v)
23
static bool fold_masks(OptContext *ctx, TCGOp *op)
30
+{
24
{
31
+ dst = DFPREG(dst);
25
return fold_masks_zs(ctx, op, ctx->z_mask, ctx->s_mask);
32
+ tcg_gen_extr_i128_i64(cpu_fpr[dst / 2 + 1], cpu_fpr[dst / 2], v);
26
@@ -XXX,XX +XXX,XX @@ static bool fold_count_zeros(OptContext *ctx, TCGOp *op)
33
+ gen_update_fprs_dirty(dc, dst);
27
34
+}
28
static bool fold_ctpop(OptContext *ctx, TCGOp *op)
29
{
30
+ uint64_t z_mask;
35
+
31
+
36
static void gen_op_load_fpr_QT0(unsigned int src)
32
if (fold_const1(ctx, op)) {
37
{
33
return true;
38
tcg_gen_st_i64(cpu_fpr[src / 2], tcg_env, offsetof(CPUSPARCState, qt0) +
39
@@ -XXX,XX +XXX,XX @@ TRANS(FsTOx, 64, do_env_df, a, gen_helper_fstox)
40
41
static bool trans_FMOVq(DisasContext *dc, arg_FMOVq *a)
42
{
43
- int rd, rs;
44
+ TCGv_i128 t;
45
46
if (!avail_64(dc)) {
47
return false;
48
@@ -XXX,XX +XXX,XX @@ static bool trans_FMOVq(DisasContext *dc, arg_FMOVq *a)
49
}
34
}
50
35
51
gen_op_clear_ieee_excp_and_FTT();
36
switch (ctx->type) {
52
- rd = QFPREG(a->rd);
37
case TCG_TYPE_I32:
53
- rs = QFPREG(a->rs);
38
- ctx->z_mask = 32 | 31;
54
- tcg_gen_mov_i64(cpu_fpr[rd / 2], cpu_fpr[rs / 2]);
39
+ z_mask = 32 | 31;
55
- tcg_gen_mov_i64(cpu_fpr[rd / 2 + 1], cpu_fpr[rs / 2 + 1]);
40
break;
56
- gen_update_fprs_dirty(dc, rd);
41
case TCG_TYPE_I64:
57
+ t = gen_load_fpr_Q(dc, a->rs);
42
- ctx->z_mask = 64 | 63;
58
+ gen_store_fpr_Q(dc, a->rd, t);
43
+ z_mask = 64 | 63;
59
return advance_pc(dc);
44
break;
45
default:
46
g_assert_not_reached();
47
}
48
- return false;
49
+ return fold_masks_z(ctx, op, z_mask);
60
}
50
}
61
51
52
static bool fold_deposit(OptContext *ctx, TCGOp *op)
62
--
53
--
63
2.34.1
54
2.43.0
64
65
diff view generated by jsdifflib
New patch
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
When we fold to and, use fold_and.
1
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/optimize.c | 35 +++++++++++++++++------------------
8
1 file changed, 17 insertions(+), 18 deletions(-)
9
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
13
+++ b/tcg/optimize.c
14
@@ -XXX,XX +XXX,XX @@ static bool fold_ctpop(OptContext *ctx, TCGOp *op)
15
16
static bool fold_deposit(OptContext *ctx, TCGOp *op)
17
{
18
+ TempOptInfo *t1 = arg_info(op->args[1]);
19
+ TempOptInfo *t2 = arg_info(op->args[2]);
20
+ int ofs = op->args[3];
21
+ int len = op->args[4];
22
TCGOpcode and_opc;
23
+ uint64_t z_mask;
24
25
- if (arg_is_const(op->args[1]) && arg_is_const(op->args[2])) {
26
- uint64_t t1 = arg_info(op->args[1])->val;
27
- uint64_t t2 = arg_info(op->args[2])->val;
28
-
29
- t1 = deposit64(t1, op->args[3], op->args[4], t2);
30
- return tcg_opt_gen_movi(ctx, op, op->args[0], t1);
31
+ if (ti_is_const(t1) && ti_is_const(t2)) {
32
+ return tcg_opt_gen_movi(ctx, op, op->args[0],
33
+ deposit64(ti_const_val(t1), ofs, len,
34
+ ti_const_val(t2)));
35
}
36
37
switch (ctx->type) {
38
@@ -XXX,XX +XXX,XX @@ static bool fold_deposit(OptContext *ctx, TCGOp *op)
39
}
40
41
/* Inserting a value into zero at offset 0. */
42
- if (arg_is_const_val(op->args[1], 0) && op->args[3] == 0) {
43
- uint64_t mask = MAKE_64BIT_MASK(0, op->args[4]);
44
+ if (ti_is_const_val(t1, 0) && ofs == 0) {
45
+ uint64_t mask = MAKE_64BIT_MASK(0, len);
46
47
op->opc = and_opc;
48
op->args[1] = op->args[2];
49
op->args[2] = arg_new_constant(ctx, mask);
50
- ctx->z_mask = mask & arg_info(op->args[1])->z_mask;
51
- return false;
52
+ return fold_and(ctx, op);
53
}
54
55
/* Inserting zero into a value. */
56
- if (arg_is_const_val(op->args[2], 0)) {
57
- uint64_t mask = deposit64(-1, op->args[3], op->args[4], 0);
58
+ if (ti_is_const_val(t2, 0)) {
59
+ uint64_t mask = deposit64(-1, ofs, len, 0);
60
61
op->opc = and_opc;
62
op->args[2] = arg_new_constant(ctx, mask);
63
- ctx->z_mask = mask & arg_info(op->args[1])->z_mask;
64
- return false;
65
+ return fold_and(ctx, op);
66
}
67
68
- ctx->z_mask = deposit64(arg_info(op->args[1])->z_mask,
69
- op->args[3], op->args[4],
70
- arg_info(op->args[2])->z_mask);
71
- return false;
72
+ z_mask = deposit64(t1->z_mask, ofs, len, t2->z_mask);
73
+ return fold_masks_z(ctx, op, z_mask);
74
}
75
76
static bool fold_divide(OptContext *ctx, TCGOp *op)
77
--
78
2.43.0
diff view generated by jsdifflib
New patch
1
The input which overlaps the sign bit of the output can
2
have its input s_mask propagated to the output s_mask.
1
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
tcg/optimize.c | 14 ++++++++++++--
8
1 file changed, 12 insertions(+), 2 deletions(-)
9
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/tcg/optimize.c
13
+++ b/tcg/optimize.c
14
@@ -XXX,XX +XXX,XX @@ static bool fold_deposit(OptContext *ctx, TCGOp *op)
15
TempOptInfo *t2 = arg_info(op->args[2]);
16
int ofs = op->args[3];
17
int len = op->args[4];
18
+ int width;
19
TCGOpcode and_opc;
20
- uint64_t z_mask;
21
+ uint64_t z_mask, s_mask;
22
23
if (ti_is_const(t1) && ti_is_const(t2)) {
24
return tcg_opt_gen_movi(ctx, op, op->args[0],
25
@@ -XXX,XX +XXX,XX @@ static bool fold_deposit(OptContext *ctx, TCGOp *op)
26
switch (ctx->type) {
27
case TCG_TYPE_I32:
28
and_opc = INDEX_op_and_i32;
29
+ width = 32;
30
break;
31
case TCG_TYPE_I64:
32
and_opc = INDEX_op_and_i64;
33
+ width = 64;
34
break;
35
default:
36
g_assert_not_reached();
37
@@ -XXX,XX +XXX,XX @@ static bool fold_deposit(OptContext *ctx, TCGOp *op)
38
return fold_and(ctx, op);
39
}
40
41
+ /* The s_mask from the top portion of the deposit is still valid. */
42
+ if (ofs + len == width) {
43
+ s_mask = t2->s_mask << ofs;
44
+ } else {
45
+ s_mask = t1->s_mask & ~MAKE_64BIT_MASK(0, ofs + len);
46
+ }
47
+
48
z_mask = deposit64(t1->z_mask, ofs, len, t2->z_mask);
49
- return fold_masks_z(ctx, op, z_mask);
50
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
51
}
52
53
static bool fold_divide(OptContext *ctx, TCGOp *op)
54
--
55
2.43.0
diff view generated by jsdifflib
New patch
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
tcg/optimize.c | 2 +-
5
1 file changed, 1 insertion(+), 1 deletion(-)
1
6
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/optimize.c
10
+++ b/tcg/optimize.c
11
@@ -XXX,XX +XXX,XX @@ static bool fold_divide(OptContext *ctx, TCGOp *op)
12
fold_xi_to_x(ctx, op, 1)) {
13
return true;
14
}
15
- return false;
16
+ return finish_folding(ctx, op);
17
}
18
19
static bool fold_dup(OptContext *ctx, TCGOp *op)
20
--
21
2.43.0
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
3
---
4
target/microblaze/cpu.h | 13 ++-----------
4
tcg/optimize.c | 4 ++--
5
target/microblaze/cpu.c | 18 +++++++++++++++++-
5
1 file changed, 2 insertions(+), 2 deletions(-)
6
2 files changed, 19 insertions(+), 12 deletions(-)
7
6
8
diff --git a/target/microblaze/cpu.h b/target/microblaze/cpu.h
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
index XXXXXXX..XXXXXXX 100644
8
index XXXXXXX..XXXXXXX 100644
10
--- a/target/microblaze/cpu.h
9
--- a/tcg/optimize.c
11
+++ b/target/microblaze/cpu.h
10
+++ b/tcg/optimize.c
12
@@ -XXX,XX +XXX,XX @@ void mb_cpu_transaction_failed(CPUState *cs, hwaddr physaddr, vaddr addr,
11
@@ -XXX,XX +XXX,XX @@ static bool fold_dup(OptContext *ctx, TCGOp *op)
13
MemTxResult response, uintptr_t retaddr);
12
t = dup_const(TCGOP_VECE(op), t);
14
#endif
13
return tcg_opt_gen_movi(ctx, op, op->args[0], t);
15
14
}
16
+int mb_cpu_mmu_index(CPUState *cs, bool ifetch);
15
- return false;
17
static inline int cpu_mmu_index(CPUMBState *env, bool ifetch)
16
+ return finish_folding(ctx, op);
18
{
19
- MicroBlazeCPU *cpu = env_archcpu(env);
20
-
21
- /* Are we in nommu mode?. */
22
- if (!(env->msr & MSR_VM) || !cpu->cfg.use_mmu) {
23
- return MMU_NOMMU_IDX;
24
- }
25
-
26
- if (env->msr & MSR_UM) {
27
- return MMU_USER_IDX;
28
- }
29
- return MMU_KERNEL_IDX;
30
+ return mb_cpu_mmu_index(env_cpu(env), ifetch);
31
}
17
}
32
18
33
#ifndef CONFIG_USER_ONLY
19
static bool fold_dup2(OptContext *ctx, TCGOp *op)
34
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
20
@@ -XXX,XX +XXX,XX @@ static bool fold_dup2(OptContext *ctx, TCGOp *op)
35
index XXXXXXX..XXXXXXX 100644
21
op->opc = INDEX_op_dup_vec;
36
--- a/target/microblaze/cpu.c
22
TCGOP_VECE(op) = MO_32;
37
+++ b/target/microblaze/cpu.c
23
}
38
@@ -XXX,XX +XXX,XX @@ static bool mb_cpu_has_work(CPUState *cs)
24
- return false;
39
return cs->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI);
25
+ return finish_folding(ctx, op);
40
}
26
}
41
27
42
+int mb_cpu_mmu_index(CPUState *cs, bool ifetch)
28
static bool fold_eqv(OptContext *ctx, TCGOp *op)
43
+{
44
+ CPUMBState *env = cpu_env(cs);
45
+ MicroBlazeCPU *cpu = env_archcpu(env);
46
+
47
+ /* Are we in nommu mode?. */
48
+ if (!(env->msr & MSR_VM) || !cpu->cfg.use_mmu) {
49
+ return MMU_NOMMU_IDX;
50
+ }
51
+
52
+ if (env->msr & MSR_UM) {
53
+ return MMU_USER_IDX;
54
+ }
55
+ return MMU_KERNEL_IDX;
56
+}
57
+
58
#ifndef CONFIG_USER_ONLY
59
static void mb_cpu_ns_axi_dp(void *opaque, int irq, int level)
60
{
61
@@ -XXX,XX +XXX,XX @@ static void mb_cpu_class_init(ObjectClass *oc, void *data)
62
63
cc->class_by_name = mb_cpu_class_by_name;
64
cc->has_work = mb_cpu_has_work;
65
-
66
+ cc->mmu_index = mb_cpu_mmu_index;
67
cc->dump_state = mb_cpu_dump_state;
68
cc->set_pc = mb_cpu_set_pc;
69
cc->get_pc = mb_cpu_get_pc;
70
--
29
--
71
2.34.1
30
2.43.0
72
73
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Add fold_masks_s as a trivial wrapper around fold_masks_zs.
2
Avoid the use of the OptContext slots.
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
6
---
4
target/ppc/cpu.h | 7 ++++++-
7
tcg/optimize.c | 13 ++++++++++---
5
target/ppc/cpu_init.c | 2 +-
8
1 file changed, 10 insertions(+), 3 deletions(-)
6
target/ppc/mem_helper.c | 10 +++++-----
7
target/ppc/mmu_common.c | 4 ++--
8
4 files changed, 14 insertions(+), 9 deletions(-)
9
9
10
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
12
--- a/target/ppc/cpu.h
12
--- a/tcg/optimize.c
13
+++ b/target/ppc/cpu.h
13
+++ b/tcg/optimize.c
14
@@ -XXX,XX +XXX,XX @@ int ppc_dcr_write(ppc_dcr_t *dcr_env, int dcrn, uint32_t val);
14
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_z(OptContext *ctx, TCGOp *op, uint64_t z_mask)
15
15
return fold_masks_zs(ctx, op, z_mask, 0);
16
/* MMU modes definitions */
17
#define MMU_USER_IDX 0
18
-static inline int cpu_mmu_index(CPUPPCState *env, bool ifetch)
19
+static inline int ppc_env_mmu_index(CPUPPCState *env, bool ifetch)
20
{
21
#ifdef CONFIG_USER_ONLY
22
return MMU_USER_IDX;
23
@@ -XXX,XX +XXX,XX @@ static inline int cpu_mmu_index(CPUPPCState *env, bool ifetch)
24
#endif
25
}
16
}
26
17
27
+static inline int cpu_mmu_index(CPUPPCState *env, bool ifetch)
18
+static bool fold_masks_s(OptContext *ctx, TCGOp *op, uint64_t s_mask)
28
+{
19
+{
29
+ return ppc_env_mmu_index(env, ifetch);
20
+ return fold_masks_zs(ctx, op, -1, s_mask);
30
+}
21
+}
31
+
22
+
32
/* Compatibility modes */
23
static bool fold_masks(OptContext *ctx, TCGOp *op)
33
#if defined(TARGET_PPC64)
34
bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr,
35
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/ppc/cpu_init.c
38
+++ b/target/ppc/cpu_init.c
39
@@ -XXX,XX +XXX,XX @@ void ppc_cpu_dump_state(CPUState *cs, FILE *f, int flags)
40
qemu_fprintf(f, "MSR " TARGET_FMT_lx " HID0 " TARGET_FMT_lx " HF "
41
"%08x iidx %d didx %d\n",
42
env->msr, env->spr[SPR_HID0], env->hflags,
43
- cpu_mmu_index(env, true), cpu_mmu_index(env, false));
44
+ ppc_env_mmu_index(env, true), ppc_env_mmu_index(env, false));
45
#if !defined(CONFIG_USER_ONLY)
46
if (env->tb_env) {
47
qemu_fprintf(f, "TB %08" PRIu32 " %08" PRIu64
48
diff --git a/target/ppc/mem_helper.c b/target/ppc/mem_helper.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/target/ppc/mem_helper.c
51
+++ b/target/ppc/mem_helper.c
52
@@ -XXX,XX +XXX,XX @@ static void *probe_contiguous(CPUPPCState *env, target_ulong addr, uint32_t nb,
53
void helper_lmw(CPUPPCState *env, target_ulong addr, uint32_t reg)
54
{
24
{
55
uintptr_t raddr = GETPC();
25
return fold_masks_zs(ctx, op, ctx->z_mask, ctx->s_mask);
56
- int mmu_idx = cpu_mmu_index(env, false);
26
@@ -XXX,XX +XXX,XX @@ static bool fold_dup2(OptContext *ctx, TCGOp *op)
57
+ int mmu_idx = ppc_env_mmu_index(env, false);
27
58
void *host = probe_contiguous(env, addr, (32 - reg) * 4,
28
static bool fold_eqv(OptContext *ctx, TCGOp *op)
59
MMU_DATA_LOAD, mmu_idx, raddr);
60
61
@@ -XXX,XX +XXX,XX @@ void helper_lmw(CPUPPCState *env, target_ulong addr, uint32_t reg)
62
void helper_stmw(CPUPPCState *env, target_ulong addr, uint32_t reg)
63
{
29
{
64
uintptr_t raddr = GETPC();
30
+ uint64_t s_mask;
65
- int mmu_idx = cpu_mmu_index(env, false);
31
+
66
+ int mmu_idx = ppc_env_mmu_index(env, false);
32
if (fold_const2_commutative(ctx, op) ||
67
void *host = probe_contiguous(env, addr, (32 - reg) * 4,
33
fold_xi_to_x(ctx, op, -1) ||
68
MMU_DATA_STORE, mmu_idx, raddr);
34
fold_xi_to_not(ctx, op, 0)) {
69
35
return true;
70
@@ -XXX,XX +XXX,XX @@ static void do_lsw(CPUPPCState *env, target_ulong addr, uint32_t nb,
71
return;
72
}
36
}
73
37
74
- mmu_idx = cpu_mmu_index(env, false);
38
- ctx->s_mask = arg_info(op->args[1])->s_mask
75
+ mmu_idx = ppc_env_mmu_index(env, false);
39
- & arg_info(op->args[2])->s_mask;
76
host = probe_contiguous(env, addr, nb, MMU_DATA_LOAD, mmu_idx, raddr);
40
- return false;
77
41
+ s_mask = arg_info(op->args[1])->s_mask
78
if (likely(host)) {
42
+ & arg_info(op->args[2])->s_mask;
79
@@ -XXX,XX +XXX,XX @@ void helper_stsw(CPUPPCState *env, target_ulong addr, uint32_t nb,
43
+ return fold_masks_s(ctx, op, s_mask);
80
return;
44
}
81
}
45
82
46
static bool fold_extract(OptContext *ctx, TCGOp *op)
83
- mmu_idx = cpu_mmu_index(env, false);
84
+ mmu_idx = ppc_env_mmu_index(env, false);
85
host = probe_contiguous(env, addr, nb, MMU_DATA_STORE, mmu_idx, raddr);
86
87
if (likely(host)) {
88
@@ -XXX,XX +XXX,XX @@ static void dcbz_common(CPUPPCState *env, target_ulong addr,
89
target_ulong mask, dcbz_size = env->dcache_line_size;
90
uint32_t i;
91
void *haddr;
92
- int mmu_idx = epid ? PPC_TLB_EPID_STORE : cpu_mmu_index(env, false);
93
+ int mmu_idx = epid ? PPC_TLB_EPID_STORE : ppc_env_mmu_index(env, false);
94
95
#if defined(TARGET_PPC64)
96
/* Check for dcbz vs dcbzl on 970 */
97
diff --git a/target/ppc/mmu_common.c b/target/ppc/mmu_common.c
98
index XXXXXXX..XXXXXXX 100644
99
--- a/target/ppc/mmu_common.c
100
+++ b/target/ppc/mmu_common.c
101
@@ -XXX,XX +XXX,XX @@ hwaddr ppc_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
102
* mapped by code TLBs, so we also try a MMU_INST_FETCH.
103
*/
104
if (ppc_xlate(cpu, addr, MMU_DATA_LOAD, &raddr, &s, &p,
105
- cpu_mmu_index(&cpu->env, false), false) ||
106
+ ppc_env_mmu_index(&cpu->env, false), false) ||
107
ppc_xlate(cpu, addr, MMU_INST_FETCH, &raddr, &s, &p,
108
- cpu_mmu_index(&cpu->env, true), false)) {
109
+ ppc_env_mmu_index(&cpu->env, true), false)) {
110
return raddr & TARGET_PAGE_MASK;
111
}
112
return -1;
113
--
47
--
114
2.34.1
48
2.43.0
115
116
diff view generated by jsdifflib
1
These two fields are adjusted by all FPop insns.
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
Having them separate makes it easier to set without masking.
3
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
6
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
7
Message-Id: <20231103173841.33651-20-richard.henderson@linaro.org>
8
---
5
---
9
target/sparc/cpu.h | 7 +++++-
6
tcg/optimize.c | 15 ++++++---------
10
target/sparc/helper.h | 2 +-
7
1 file changed, 6 insertions(+), 9 deletions(-)
11
target/sparc/fop_helper.c | 46 ++++++++++++++++++---------------------
12
target/sparc/translate.c | 31 ++++++++++++++++----------
13
4 files changed, 48 insertions(+), 38 deletions(-)
14
8
15
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
16
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
17
--- a/target/sparc/cpu.h
11
--- a/tcg/optimize.c
18
+++ b/target/sparc/cpu.h
12
+++ b/tcg/optimize.c
19
@@ -XXX,XX +XXX,XX @@ enum {
13
@@ -XXX,XX +XXX,XX @@ static bool fold_eqv(OptContext *ctx, TCGOp *op)
20
#define FSR_DZM (1ULL << 24)
14
static bool fold_extract(OptContext *ctx, TCGOp *op)
21
#define FSR_NXM (1ULL << 23)
22
#define FSR_TEM_MASK (FSR_NVM | FSR_OFM | FSR_UFM | FSR_DZM | FSR_NXM)
23
+#define FSR_TEM_SHIFT 23
24
25
#define FSR_NVA (1ULL << 9)
26
#define FSR_OFA (1ULL << 8)
27
@@ -XXX,XX +XXX,XX @@ enum {
28
#define FSR_DZA (1ULL << 6)
29
#define FSR_NXA (1ULL << 5)
30
#define FSR_AEXC_MASK (FSR_NVA | FSR_OFA | FSR_UFA | FSR_DZA | FSR_NXA)
31
+#define FSR_AEXC_SHIFT 5
32
33
#define FSR_NVC (1ULL << 4)
34
#define FSR_OFC (1ULL << 3)
35
@@ -XXX,XX +XXX,XX @@ struct CPUArchState {
36
target_ulong cond; /* conditional branch result (XXX: save it in a
37
temporary register when possible) */
38
39
- target_ulong fsr; /* FPU state register */
40
+ /* FPU State Register, in parts */
41
+ target_ulong fsr; /* rm, tem, aexc, fcc* */
42
+ uint32_t fsr_cexc_ftt; /* cexc, ftt */
43
+
44
CPU_DoubleU fpr[TARGET_DPREGS]; /* floating point registers */
45
uint32_t cwp; /* index of current register window (extracted
46
from PSR) */
47
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
48
index XXXXXXX..XXXXXXX 100644
49
--- a/target/sparc/helper.h
50
+++ b/target/sparc/helper.h
51
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(ld_asi, TCG_CALL_NO_WG, i64, env, tl, int, i32)
52
DEF_HELPER_FLAGS_5(st_asi, TCG_CALL_NO_WG, void, env, tl, i64, int, i32)
53
#endif
54
DEF_HELPER_FLAGS_1(get_fsr, TCG_CALL_NO_WG_SE, tl, env)
55
-DEF_HELPER_FLAGS_2(set_fsr, TCG_CALL_NO_RWG, void, env, tl)
56
+DEF_HELPER_FLAGS_2(set_fsr_noftt, 0, void, env, tl)
57
DEF_HELPER_FLAGS_2(fsqrts, 0, f32, env, f32)
58
DEF_HELPER_FLAGS_2(fsqrtd, 0, f64, env, f64)
59
DEF_HELPER_FLAGS_2(fsqrtq, 0, i128, env, i128)
60
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/target/sparc/fop_helper.c
63
+++ b/target/sparc/fop_helper.c
64
@@ -XXX,XX +XXX,XX @@ static inline Int128 f128_ret(float128 f)
65
static void check_ieee_exceptions(CPUSPARCState *env, uintptr_t ra)
66
{
15
{
67
target_ulong status = get_float_exception_flags(&env->fp_status);
16
uint64_t z_mask_old, z_mask;
68
- target_ulong fsr = env->fsr;
17
+ TempOptInfo *t1 = arg_info(op->args[1]);
18
int pos = op->args[2];
19
int len = op->args[3];
20
21
- if (arg_is_const(op->args[1])) {
22
- uint64_t t;
69
-
23
-
70
- fsr &= FSR_FTT_CEXC_NMASK;
24
- t = arg_info(op->args[1])->val;
71
+ uint32_t cexc = 0;
25
- t = extract64(t, pos, len);
72
26
- return tcg_opt_gen_movi(ctx, op, op->args[0], t);
73
if (unlikely(status)) {
27
+ if (ti_is_const(t1)) {
74
/* Keep exception flags clear for next time. */
28
+ return tcg_opt_gen_movi(ctx, op, op->args[0],
75
@@ -XXX,XX +XXX,XX @@ static void check_ieee_exceptions(CPUSPARCState *env, uintptr_t ra)
29
+ extract64(ti_const_val(t1), pos, len));
76
77
/* Copy IEEE 754 flags into FSR */
78
if (status & float_flag_invalid) {
79
- fsr |= FSR_NVC;
80
+ cexc |= FSR_NVC;
81
}
82
if (status & float_flag_overflow) {
83
- fsr |= FSR_OFC;
84
+ cexc |= FSR_OFC;
85
}
86
if (status & float_flag_underflow) {
87
- fsr |= FSR_UFC;
88
+ cexc |= FSR_UFC;
89
}
90
if (status & float_flag_divbyzero) {
91
- fsr |= FSR_DZC;
92
+ cexc |= FSR_DZC;
93
}
94
if (status & float_flag_inexact) {
95
- fsr |= FSR_NXC;
96
+ cexc |= FSR_NXC;
97
}
98
99
- if ((fsr & FSR_CEXC_MASK) & ((fsr & FSR_TEM_MASK) >> 23)) {
100
- CPUState *cs = env_cpu(env);
101
-
102
- /* Unmasked exception, generate a trap. Note that while
103
- the helper is marked as NO_WG, we can get away with
104
- writing to cpu state along the exception path, since
105
- TCG generated code will never see the write. */
106
- env->fsr = fsr | FSR_FTT_IEEE_EXCP;
107
- cs->exception_index = TT_FP_EXCP;
108
- cpu_loop_exit_restore(cs, ra);
109
- } else {
110
- /* Accumulate exceptions */
111
- fsr |= (fsr & FSR_CEXC_MASK) << 5;
112
+ if (cexc & (env->fsr >> FSR_TEM_SHIFT)) {
113
+ /* Unmasked exception, generate an IEEE trap. */
114
+ env->fsr_cexc_ftt = cexc | FSR_FTT_IEEE_EXCP;
115
+ cpu_raise_exception_ra(env, TT_FP_EXCP, ra);
116
}
117
+
118
+ /* Accumulate exceptions */
119
+ env->fsr |= cexc << FSR_AEXC_SHIFT;
120
}
30
}
121
31
122
- env->fsr = fsr;
32
- z_mask_old = arg_info(op->args[1])->z_mask;
123
+ /* No trap, so FTT is cleared. */
33
+ z_mask_old = t1->z_mask;
124
+ env->fsr_cexc_ftt = cexc;
34
z_mask = extract64(z_mask_old, pos, len);
125
}
35
if (pos == 0 && fold_affected_mask(ctx, op, z_mask_old ^ z_mask)) {
126
127
float32 helper_fadds(CPUSPARCState *env, float32 src1, float32 src2)
128
@@ -XXX,XX +XXX,XX @@ GEN_FCMP(fcmpeq_fcc3, float128, 26, 1);
129
130
target_ulong cpu_get_fsr(CPUSPARCState *env)
131
{
132
- target_ulong fsr = env->fsr;
133
+ target_ulong fsr = env->fsr | env->fsr_cexc_ftt;
134
135
/* VER is kept completely separate until re-assembly. */
136
fsr |= env->def.fpu_version;
137
@@ -XXX,XX +XXX,XX @@ static void set_fsr_nonsplit(CPUSPARCState *env, target_ulong fsr)
138
{
139
int rnd_mode;
140
141
- env->fsr = fsr & ~FSR_VER_MASK;
142
+ env->fsr = fsr & ~(FSR_VER_MASK | FSR_CEXC_MASK | FSR_FTT_MASK);
143
144
switch (fsr & FSR_RD_MASK) {
145
case FSR_RD_NEAREST:
146
@@ -XXX,XX +XXX,XX @@ static void set_fsr_nonsplit(CPUSPARCState *env, target_ulong fsr)
147
148
void cpu_put_fsr(CPUSPARCState *env, target_ulong fsr)
149
{
150
+ env->fsr_cexc_ftt = fsr & (FSR_CEXC_MASK | FSR_FTT_MASK);
151
set_fsr_nonsplit(env, fsr);
152
}
153
154
-void helper_set_fsr(CPUSPARCState *env, target_ulong fsr)
155
+void helper_set_fsr_noftt(CPUSPARCState *env, target_ulong fsr)
156
{
157
+ env->fsr_cexc_ftt &= FSR_FTT_MASK;
158
+ env->fsr_cexc_ftt |= fsr & FSR_CEXC_MASK;
159
set_fsr_nonsplit(env, fsr);
160
}
161
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
162
index XXXXXXX..XXXXXXX 100644
163
--- a/target/sparc/translate.c
164
+++ b/target/sparc/translate.c
165
@@ -XXX,XX +XXX,XX @@ static bool gen_compare_reg(DisasCompare *cmp, int cond, TCGv r_src)
166
167
static void gen_op_clear_ieee_excp_and_FTT(void)
168
{
169
- tcg_gen_andi_tl(cpu_fsr, cpu_fsr, FSR_FTT_CEXC_NMASK);
170
+ tcg_gen_st_i32(tcg_constant_i32(0), tcg_env,
171
+ offsetof(CPUSPARCState, fsr_cexc_ftt));
172
}
173
174
static void gen_op_fmovs(TCGv_i32 dst, TCGv_i32 src)
175
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmpeq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
176
}
177
#endif
178
179
-static void gen_op_fpexception_im(DisasContext *dc, int fsr_flags)
180
+static void gen_op_fpexception_im(DisasContext *dc, int ftt)
181
{
182
- tcg_gen_andi_tl(cpu_fsr, cpu_fsr, FSR_FTT_NMASK);
183
- tcg_gen_ori_tl(cpu_fsr, cpu_fsr, fsr_flags);
184
+ /*
185
+ * CEXC is only set when succesfully completing an FPop,
186
+ * or when raising FSR_FTT_IEEE_EXCP, i.e. check_ieee_exception.
187
+ * Thus we can simply store FTT into this field.
188
+ */
189
+ tcg_gen_st_i32(tcg_constant_i32(ftt), tcg_env,
190
+ offsetof(CPUSPARCState, fsr_cexc_ftt));
191
gen_exception(dc, TT_FP_EXCP);
192
}
193
194
@@ -XXX,XX +XXX,XX @@ static bool trans_STDFQ(DisasContext *dc, arg_STDFQ *a)
195
static bool do_ldfsr(DisasContext *dc, arg_r_r_ri *a, MemOp mop,
196
target_ulong new_mask, target_ulong old_mask)
197
{
198
- TCGv tmp, addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm);
199
+ TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm);
200
+ TCGv tnew, told;
201
+
202
if (addr == NULL) {
203
return false;
204
}
205
if (gen_trap_ifnofpu(dc)) {
206
return true;
36
return true;
207
}
37
}
208
- tmp = tcg_temp_new();
38
- ctx->z_mask = z_mask;
209
- tcg_gen_qemu_ld_tl(tmp, addr, dc->mem_idx, mop | MO_ALIGN);
39
210
- tcg_gen_andi_tl(tmp, tmp, new_mask);
40
- return fold_masks(ctx, op);
211
- tcg_gen_andi_tl(cpu_fsr, cpu_fsr, old_mask);
41
+ return fold_masks_z(ctx, op, z_mask);
212
- tcg_gen_or_tl(cpu_fsr, cpu_fsr, tmp);
213
- gen_helper_set_fsr(tcg_env, cpu_fsr);
214
+ tnew = tcg_temp_new();
215
+ told = tcg_temp_new();
216
+ tcg_gen_qemu_ld_tl(tnew, addr, dc->mem_idx, mop | MO_ALIGN);
217
+ tcg_gen_andi_tl(tnew, tnew, new_mask);
218
+ tcg_gen_andi_tl(told, cpu_fsr, old_mask);
219
+ tcg_gen_or_tl(tnew, tnew, told);
220
+ gen_helper_set_fsr_noftt(tcg_env, tnew);
221
return advance_pc(dc);
222
}
42
}
223
43
44
static bool fold_extract2(OptContext *ctx, TCGOp *op)
224
--
45
--
225
2.34.1
46
2.43.0
diff view generated by jsdifflib
1
This field is read-only. It is easier to store it separately
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
and merge it only upon read.
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
tcg/optimize.c | 2 +-
5
1 file changed, 1 insertion(+), 1 deletion(-)
3
6
4
While we're at it, use FSR_VER_SHIFT to initialize fpu_version.
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
5
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
9
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
10
Message-Id: <20231103173841.33651-17-richard.henderson@linaro.org>
11
---
12
target/sparc/cpu.h | 3 +++
13
target/sparc/cpu.c | 27 +++++++++++++--------------
14
target/sparc/fop_helper.c | 9 +++++++--
15
3 files changed, 23 insertions(+), 16 deletions(-)
16
17
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
18
index XXXXXXX..XXXXXXX 100644
8
index XXXXXXX..XXXXXXX 100644
19
--- a/target/sparc/cpu.h
9
--- a/tcg/optimize.c
20
+++ b/target/sparc/cpu.h
10
+++ b/tcg/optimize.c
21
@@ -XXX,XX +XXX,XX @@ enum {
11
@@ -XXX,XX +XXX,XX @@ static bool fold_extract2(OptContext *ctx, TCGOp *op)
22
#define FSR_NXC (1ULL << 0)
12
}
23
#define FSR_CEXC_MASK (FSR_NVC | FSR_OFC | FSR_UFC | FSR_DZC | FSR_NXC)
13
return tcg_opt_gen_movi(ctx, op, op->args[0], v1 | v2);
24
14
}
25
+#define FSR_VER_SHIFT 17
15
- return false;
26
+#define FSR_VER_MASK (7 << FSR_VER_SHIFT)
16
+ return finish_folding(ctx, op);
27
+
28
#define FSR_FTT2 (1ULL << 16)
29
#define FSR_FTT1 (1ULL << 15)
30
#define FSR_FTT0 (1ULL << 14)
31
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/sparc/cpu.c
34
+++ b/target/sparc/cpu.c
35
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
36
{
37
.name = "Fujitsu MB86904",
38
.iu_version = 0x04 << 24, /* Impl 0, ver 4 */
39
- .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
40
+ .fpu_version = 4 << FSR_VER_SHIFT, /* FPU version 4 (Meiko) */
41
.mmu_version = 0x04 << 24, /* Impl 0, ver 4 */
42
.mmu_bm = 0x00004000,
43
.mmu_ctpr_mask = 0x00ffffc0,
44
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
45
{
46
.name = "Fujitsu MB86907",
47
.iu_version = 0x05 << 24, /* Impl 0, ver 5 */
48
- .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
49
+ .fpu_version = 4 << FSR_VER_SHIFT, /* FPU version 4 (Meiko) */
50
.mmu_version = 0x05 << 24, /* Impl 0, ver 5 */
51
.mmu_bm = 0x00004000,
52
.mmu_ctpr_mask = 0xffffffc0,
53
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
54
{
55
.name = "TI MicroSparc I",
56
.iu_version = 0x41000000,
57
- .fpu_version = 4 << 17,
58
+ .fpu_version = 4 << FSR_VER_SHIFT,
59
.mmu_version = 0x41000000,
60
.mmu_bm = 0x00004000,
61
.mmu_ctpr_mask = 0x007ffff0,
62
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
63
{
64
.name = "TI MicroSparc II",
65
.iu_version = 0x42000000,
66
- .fpu_version = 4 << 17,
67
+ .fpu_version = 4 << FSR_VER_SHIFT,
68
.mmu_version = 0x02000000,
69
.mmu_bm = 0x00004000,
70
.mmu_ctpr_mask = 0x00ffffc0,
71
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
72
{
73
.name = "TI MicroSparc IIep",
74
.iu_version = 0x42000000,
75
- .fpu_version = 4 << 17,
76
+ .fpu_version = 4 << FSR_VER_SHIFT,
77
.mmu_version = 0x04000000,
78
.mmu_bm = 0x00004000,
79
.mmu_ctpr_mask = 0x00ffffc0,
80
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
81
{
82
.name = "TI SuperSparc 40", /* STP1020NPGA */
83
.iu_version = 0x41000000, /* SuperSPARC 2.x */
84
- .fpu_version = 0 << 17,
85
+ .fpu_version = 0 << FSR_VER_SHIFT,
86
.mmu_version = 0x00000800, /* SuperSPARC 2.x, no MXCC */
87
.mmu_bm = 0x00002000,
88
.mmu_ctpr_mask = 0xffffffc0,
89
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
90
{
91
.name = "TI SuperSparc 50", /* STP1020PGA */
92
.iu_version = 0x40000000, /* SuperSPARC 3.x */
93
- .fpu_version = 0 << 17,
94
+ .fpu_version = 0 << FSR_VER_SHIFT,
95
.mmu_version = 0x01000800, /* SuperSPARC 3.x, no MXCC */
96
.mmu_bm = 0x00002000,
97
.mmu_ctpr_mask = 0xffffffc0,
98
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
99
{
100
.name = "TI SuperSparc 51",
101
.iu_version = 0x40000000, /* SuperSPARC 3.x */
102
- .fpu_version = 0 << 17,
103
+ .fpu_version = 0 << FSR_VER_SHIFT,
104
.mmu_version = 0x01000000, /* SuperSPARC 3.x, MXCC */
105
.mmu_bm = 0x00002000,
106
.mmu_ctpr_mask = 0xffffffc0,
107
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
108
{
109
.name = "TI SuperSparc 60", /* STP1020APGA */
110
.iu_version = 0x40000000, /* SuperSPARC 3.x */
111
- .fpu_version = 0 << 17,
112
+ .fpu_version = 0 << FSR_VER_SHIFT,
113
.mmu_version = 0x01000800, /* SuperSPARC 3.x, no MXCC */
114
.mmu_bm = 0x00002000,
115
.mmu_ctpr_mask = 0xffffffc0,
116
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
117
{
118
.name = "TI SuperSparc 61",
119
.iu_version = 0x44000000, /* SuperSPARC 3.x */
120
- .fpu_version = 0 << 17,
121
+ .fpu_version = 0 << FSR_VER_SHIFT,
122
.mmu_version = 0x01000000, /* SuperSPARC 3.x, MXCC */
123
.mmu_bm = 0x00002000,
124
.mmu_ctpr_mask = 0xffffffc0,
125
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
126
{
127
.name = "TI SuperSparc II",
128
.iu_version = 0x40000000, /* SuperSPARC II 1.x */
129
- .fpu_version = 0 << 17,
130
+ .fpu_version = 0 << FSR_VER_SHIFT,
131
.mmu_version = 0x08000000, /* SuperSPARC II 1.x, MXCC */
132
.mmu_bm = 0x00002000,
133
.mmu_ctpr_mask = 0xffffffc0,
134
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
135
{
136
.name = "LEON2",
137
.iu_version = 0xf2000000,
138
- .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
139
+ .fpu_version = 4 << FSR_VER_SHIFT, /* FPU version 4 (Meiko) */
140
.mmu_version = 0xf2000000,
141
.mmu_bm = 0x00004000,
142
.mmu_ctpr_mask = 0x007ffff0,
143
@@ -XXX,XX +XXX,XX @@ static const sparc_def_t sparc_defs[] = {
144
{
145
.name = "LEON3",
146
.iu_version = 0xf3000000,
147
- .fpu_version = 4 << 17, /* FPU version 4 (Meiko) */
148
+ .fpu_version = 4 << FSR_VER_SHIFT, /* FPU version 4 (Meiko) */
149
.mmu_version = 0xf3000000,
150
.mmu_bm = 0x00000000,
151
.mmu_ctpr_mask = 0xfffffffc,
152
@@ -XXX,XX +XXX,XX @@ static void sparc_cpu_realizefn(DeviceState *dev, Error **errp)
153
#endif
154
155
env->version = env->def.iu_version;
156
- env->fsr = env->def.fpu_version;
157
env->nwindows = env->def.nwindows;
158
#if !defined(TARGET_SPARC64)
159
env->mmuregs[0] |= env->def.mmu_version;
160
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
161
index XXXXXXX..XXXXXXX 100644
162
--- a/target/sparc/fop_helper.c
163
+++ b/target/sparc/fop_helper.c
164
@@ -XXX,XX +XXX,XX @@ GEN_FCMP(fcmpeq_fcc3, float128, 26, 1);
165
166
target_ulong cpu_get_fsr(CPUSPARCState *env)
167
{
168
- return env->fsr;
169
+ target_ulong fsr = env->fsr;
170
+
171
+ /* VER is kept completely separate until re-assembly. */
172
+ fsr |= env->def.fpu_version;
173
+
174
+ return fsr;
175
}
17
}
176
18
177
target_ulong helper_get_fsr(CPUSPARCState *env)
19
static bool fold_exts(OptContext *ctx, TCGOp *op)
178
@@ -XXX,XX +XXX,XX @@ static void set_fsr_nonsplit(CPUSPARCState *env, target_ulong fsr)
179
{
180
int rnd_mode;
181
182
- env->fsr = fsr;
183
+ env->fsr = fsr & ~FSR_VER_MASK;
184
185
switch (fsr & FSR_RD_MASK) {
186
case FSR_RD_NEAREST:
187
--
20
--
188
2.34.1
21
2.43.0
189
190
diff view generated by jsdifflib
1
Don't do the clearing explicitly before each FPop,
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
rather do it as part of the rest of exception handling.
2
Explicitly sign-extend z_mask instead of doing that manually.
3
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
6
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
7
Message-Id: <20231103173841.33651-18-richard.henderson@linaro.org>
8
---
6
---
9
target/sparc/fop_helper.c | 2 ++
7
tcg/optimize.c | 29 ++++++++++++-----------------
10
target/sparc/translate.c | 16 ----------------
8
1 file changed, 12 insertions(+), 17 deletions(-)
11
2 files changed, 2 insertions(+), 16 deletions(-)
12
9
13
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
14
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
15
--- a/target/sparc/fop_helper.c
12
--- a/tcg/optimize.c
16
+++ b/target/sparc/fop_helper.c
13
+++ b/tcg/optimize.c
17
@@ -XXX,XX +XXX,XX @@ static target_ulong do_check_ieee_exceptions(CPUSPARCState *env, uintptr_t ra)
14
@@ -XXX,XX +XXX,XX @@ static bool fold_extract2(OptContext *ctx, TCGOp *op)
18
target_ulong status = get_float_exception_flags(&env->fp_status);
15
19
target_ulong fsr = env->fsr;
16
static bool fold_exts(OptContext *ctx, TCGOp *op)
20
17
{
21
+ fsr &= FSR_FTT_CEXC_NMASK;
18
- uint64_t s_mask_old, s_mask, z_mask, sign;
22
+
19
+ uint64_t s_mask_old, s_mask, z_mask;
23
if (unlikely(status)) {
20
bool type_change = false;
24
/* Keep exception flags clear for next time. */
21
+ TempOptInfo *t1;
25
set_float_exception_flags(0, &env->fp_status);
22
26
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
23
if (fold_const1(ctx, op)) {
27
index XXXXXXX..XXXXXXX 100644
28
--- a/target/sparc/translate.c
29
+++ b/target/sparc/translate.c
30
@@ -XXX,XX +XXX,XX @@ static bool do_env_ff(DisasContext *dc, arg_r_r *a,
31
return true;
24
return true;
32
}
25
}
33
26
34
- gen_op_clear_ieee_excp_and_FTT();
27
- z_mask = arg_info(op->args[1])->z_mask;
35
tmp = gen_load_fpr_F(dc, a->rs);
28
- s_mask = arg_info(op->args[1])->s_mask;
36
func(tmp, tcg_env, tmp);
29
+ t1 = arg_info(op->args[1]);
37
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
30
+ z_mask = t1->z_mask;
38
@@ -XXX,XX +XXX,XX @@ static bool do_env_fd(DisasContext *dc, arg_r_r *a,
31
+ s_mask = t1->s_mask;
32
s_mask_old = s_mask;
33
34
switch (op->opc) {
35
CASE_OP_32_64(ext8s):
36
- sign = INT8_MIN;
37
- z_mask = (uint8_t)z_mask;
38
+ s_mask |= INT8_MIN;
39
+ z_mask = (int8_t)z_mask;
40
break;
41
CASE_OP_32_64(ext16s):
42
- sign = INT16_MIN;
43
- z_mask = (uint16_t)z_mask;
44
+ s_mask |= INT16_MIN;
45
+ z_mask = (int16_t)z_mask;
46
break;
47
case INDEX_op_ext_i32_i64:
48
type_change = true;
49
QEMU_FALLTHROUGH;
50
case INDEX_op_ext32s_i64:
51
- sign = INT32_MIN;
52
- z_mask = (uint32_t)z_mask;
53
+ s_mask |= INT32_MIN;
54
+ z_mask = (int32_t)z_mask;
55
break;
56
default:
57
g_assert_not_reached();
58
}
59
60
- if (z_mask & sign) {
61
- z_mask |= sign;
62
- }
63
- s_mask |= sign << 1;
64
-
65
- ctx->z_mask = z_mask;
66
- ctx->s_mask = s_mask;
67
if (0 && !type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
39
return true;
68
return true;
40
}
69
}
41
70
42
- gen_op_clear_ieee_excp_and_FTT();
71
- return fold_masks(ctx, op);
43
dst = tcg_temp_new_i32();
72
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
44
src = gen_load_fpr_D(dc, a->rs);
73
}
45
func(dst, tcg_env, src);
74
46
@@ -XXX,XX +XXX,XX @@ static bool do_env_dd(DisasContext *dc, arg_r_r *a,
75
static bool fold_extu(OptContext *ctx, TCGOp *op)
47
return true;
48
}
49
50
- gen_op_clear_ieee_excp_and_FTT();
51
dst = gen_dest_fpr_D(dc, a->rd);
52
src = gen_load_fpr_D(dc, a->rs);
53
func(dst, tcg_env, src);
54
@@ -XXX,XX +XXX,XX @@ static bool do_env_df(DisasContext *dc, arg_r_r *a,
55
return true;
56
}
57
58
- gen_op_clear_ieee_excp_and_FTT();
59
dst = gen_dest_fpr_D(dc, a->rd);
60
src = gen_load_fpr_F(dc, a->rs);
61
func(dst, tcg_env, src);
62
@@ -XXX,XX +XXX,XX @@ static bool do_env_qq(DisasContext *dc, arg_r_r *a,
63
return true;
64
}
65
66
- gen_op_clear_ieee_excp_and_FTT();
67
-
68
t = gen_load_fpr_Q(dc, a->rs);
69
func(t, tcg_env, t);
70
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
71
@@ -XXX,XX +XXX,XX @@ static bool do_env_fq(DisasContext *dc, arg_r_r *a,
72
return true;
73
}
74
75
- gen_op_clear_ieee_excp_and_FTT();
76
src = gen_load_fpr_Q(dc, a->rs);
77
dst = tcg_temp_new_i32();
78
func(dst, tcg_env, src);
79
@@ -XXX,XX +XXX,XX @@ static bool do_env_dq(DisasContext *dc, arg_r_r *a,
80
return true;
81
}
82
83
- gen_op_clear_ieee_excp_and_FTT();
84
src = gen_load_fpr_Q(dc, a->rs);
85
dst = gen_dest_fpr_D(dc, a->rd);
86
func(dst, tcg_env, src);
87
@@ -XXX,XX +XXX,XX @@ static bool do_env_fff(DisasContext *dc, arg_r_r_r *a,
88
return true;
89
}
90
91
- gen_op_clear_ieee_excp_and_FTT();
92
src1 = gen_load_fpr_F(dc, a->rs1);
93
src2 = gen_load_fpr_F(dc, a->rs2);
94
func(src1, tcg_env, src1, src2);
95
@@ -XXX,XX +XXX,XX @@ static bool do_env_ddd(DisasContext *dc, arg_r_r_r *a,
96
return true;
97
}
98
99
- gen_op_clear_ieee_excp_and_FTT();
100
dst = gen_dest_fpr_D(dc, a->rd);
101
src1 = gen_load_fpr_D(dc, a->rs1);
102
src2 = gen_load_fpr_D(dc, a->rs2);
103
@@ -XXX,XX +XXX,XX @@ static bool trans_FsMULd(DisasContext *dc, arg_r_r_r *a)
104
return raise_unimpfpop(dc);
105
}
106
107
- gen_op_clear_ieee_excp_and_FTT();
108
dst = gen_dest_fpr_D(dc, a->rd);
109
src1 = gen_load_fpr_F(dc, a->rs1);
110
src2 = gen_load_fpr_F(dc, a->rs2);
111
@@ -XXX,XX +XXX,XX @@ static bool do_env_qqq(DisasContext *dc, arg_r_r_r *a,
112
return true;
113
}
114
115
- gen_op_clear_ieee_excp_and_FTT();
116
src1 = gen_load_fpr_Q(dc, a->rs1);
117
src2 = gen_load_fpr_Q(dc, a->rs2);
118
func(src1, tcg_env, src1, src2);
119
@@ -XXX,XX +XXX,XX @@ static bool trans_FdMULq(DisasContext *dc, arg_r_r_r *a)
120
return true;
121
}
122
123
- gen_op_clear_ieee_excp_and_FTT();
124
src1 = gen_load_fpr_D(dc, a->rs1);
125
src2 = gen_load_fpr_D(dc, a->rs2);
126
dst = tcg_temp_new_i128();
127
@@ -XXX,XX +XXX,XX @@ static bool do_fcmps(DisasContext *dc, arg_FCMPs *a, bool e)
128
return true;
129
}
130
131
- gen_op_clear_ieee_excp_and_FTT();
132
src1 = gen_load_fpr_F(dc, a->rs1);
133
src2 = gen_load_fpr_F(dc, a->rs2);
134
if (e) {
135
@@ -XXX,XX +XXX,XX @@ static bool do_fcmpd(DisasContext *dc, arg_FCMPd *a, bool e)
136
return true;
137
}
138
139
- gen_op_clear_ieee_excp_and_FTT();
140
src1 = gen_load_fpr_D(dc, a->rs1);
141
src2 = gen_load_fpr_D(dc, a->rs2);
142
if (e) {
143
@@ -XXX,XX +XXX,XX @@ static bool do_fcmpq(DisasContext *dc, arg_FCMPq *a, bool e)
144
return true;
145
}
146
147
- gen_op_clear_ieee_excp_and_FTT();
148
src1 = gen_load_fpr_Q(dc, a->rs1);
149
src2 = gen_load_fpr_Q(dc, a->rs2);
150
if (e) {
151
--
76
--
152
2.34.1
77
2.43.0
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
3
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
4
Message-Id: <20231103173841.33651-8-richard.henderson@linaro.org>
5
---
5
---
6
target/sparc/helper.h | 12 +++++-------
6
tcg/optimize.c | 4 ++--
7
target/sparc/fop_helper.c | 29 ++++++++++++++---------------
7
1 file changed, 2 insertions(+), 2 deletions(-)
8
target/sparc/translate.c | 13 +++++++------
9
3 files changed, 26 insertions(+), 28 deletions(-)
10
8
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
11
--- a/tcg/optimize.c
14
+++ b/target/sparc/helper.h
12
+++ b/tcg/optimize.c
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_1(fcmpeq_fcc2, TCG_CALL_NO_WG, tl, env)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_extu(OptContext *ctx, TCGOp *op)
16
DEF_HELPER_FLAGS_1(fcmpeq_fcc3, TCG_CALL_NO_WG, tl, env)
14
g_assert_not_reached();
17
#endif
18
DEF_HELPER_2(raise_exception, noreturn, env, int)
19
-#define F_HELPER_0_1(name) \
20
- DEF_HELPER_FLAGS_1(f ## name, TCG_CALL_NO_RWG, void, env)
21
22
DEF_HELPER_FLAGS_3(faddd, TCG_CALL_NO_RWG, f64, env, f64, f64)
23
DEF_HELPER_FLAGS_3(fsubd, TCG_CALL_NO_RWG, f64, env, f64, f64)
24
DEF_HELPER_FLAGS_3(fmuld, TCG_CALL_NO_RWG, f64, env, f64, f64)
25
DEF_HELPER_FLAGS_3(fdivd, TCG_CALL_NO_RWG, f64, env, f64, f64)
26
-F_HELPER_0_1(addq)
27
-F_HELPER_0_1(subq)
28
-F_HELPER_0_1(mulq)
29
-F_HELPER_0_1(divq)
30
+
31
+DEF_HELPER_FLAGS_3(faddq, TCG_CALL_NO_RWG, i128, env, i128, i128)
32
+DEF_HELPER_FLAGS_3(fsubq, TCG_CALL_NO_RWG, i128, env, i128, i128)
33
+DEF_HELPER_FLAGS_3(fmulq, TCG_CALL_NO_RWG, i128, env, i128, i128)
34
+DEF_HELPER_FLAGS_3(fdivq, TCG_CALL_NO_RWG, i128, env, i128, i128)
35
36
DEF_HELPER_FLAGS_3(fadds, TCG_CALL_NO_RWG, f32, env, f32, f32)
37
DEF_HELPER_FLAGS_3(fsubs, TCG_CALL_NO_RWG, f32, env, f32, f32)
38
@@ -XXX,XX +XXX,XX @@ VIS_CMPHELPER(cmpeq)
39
VIS_CMPHELPER(cmple)
40
VIS_CMPHELPER(cmpne)
41
#endif
42
-#undef F_HELPER_0_1
43
#undef VIS_HELPER
44
#undef VIS_CMPHELPER
45
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/sparc/fop_helper.c
48
+++ b/target/sparc/fop_helper.c
49
@@ -XXX,XX +XXX,XX @@ target_ulong helper_check_ieee_exceptions(CPUSPARCState *env)
50
return do_check_ieee_exceptions(env, GETPC());
51
}
52
53
-#define F_HELPER(name, p) void helper_f##name##p(CPUSPARCState *env)
54
-
55
-#define F_BINOP(name) \
56
+#define F_BINOP(name) \
57
float32 helper_f ## name ## s (CPUSPARCState *env, float32 src1, \
58
- float32 src2) \
59
- { \
60
- return float32_ ## name (src1, src2, &env->fp_status); \
61
- } \
62
+ float32 src2) \
63
+ { \
64
+ return float32_ ## name (src1, src2, &env->fp_status); \
65
+ } \
66
float64 helper_f ## name ## d (CPUSPARCState * env, float64 src1,\
67
- float64 src2) \
68
- { \
69
- return float64_ ## name (src1, src2, &env->fp_status); \
70
- } \
71
- F_HELPER(name, q) \
72
- { \
73
- QT0 = float128_ ## name (QT0, QT1, &env->fp_status); \
74
+ float64 src2) \
75
+ { \
76
+ return float64_ ## name (src1, src2, &env->fp_status); \
77
+ } \
78
+ Int128 helper_f ## name ## q(CPUSPARCState * env, Int128 src1, \
79
+ Int128 src2) \
80
+ { \
81
+ return f128_ret(float128_ ## name (f128_in(src1), f128_in(src2), \
82
+ &env->fp_status)); \
83
}
15
}
84
16
85
F_BINOP(add);
17
- ctx->z_mask = z_mask;
86
@@ -XXX,XX +XXX,XX @@ void helper_fxtoq(CPUSPARCState *env, int64_t src)
18
if (!type_change && fold_affected_mask(ctx, op, z_mask_old ^ z_mask)) {
87
QT0 = int64_to_float128(src, &env->fp_status);
88
}
89
#endif
90
-#undef F_HELPER
91
92
/* floating point conversion */
93
float32 helper_fdtos(CPUSPARCState *env, float64 src)
94
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
95
index XXXXXXX..XXXXXXX 100644
96
--- a/target/sparc/translate.c
97
+++ b/target/sparc/translate.c
98
@@ -XXX,XX +XXX,XX @@ static bool do_dddd(DisasContext *dc, arg_r_r_r *a,
99
TRANS(PDIST, VIS1, do_dddd, a, gen_helper_pdist)
100
101
static bool do_env_qqq(DisasContext *dc, arg_r_r_r *a,
102
- void (*func)(TCGv_env))
103
+ void (*func)(TCGv_i128, TCGv_env, TCGv_i128, TCGv_i128))
104
{
105
+ TCGv_i128 src1, src2;
106
+
107
if (gen_trap_ifnofpu(dc)) {
108
return true;
19
return true;
109
}
20
}
110
@@ -XXX,XX +XXX,XX @@ static bool do_env_qqq(DisasContext *dc, arg_r_r_r *a,
21
- return fold_masks(ctx, op);
111
}
22
+
112
23
+ return fold_masks_z(ctx, op, z_mask);
113
gen_op_clear_ieee_excp_and_FTT();
114
- gen_op_load_fpr_QT0(QFPREG(a->rs1));
115
- gen_op_load_fpr_QT1(QFPREG(a->rs2));
116
- func(tcg_env);
117
+ src1 = gen_load_fpr_Q(dc, a->rs1);
118
+ src2 = gen_load_fpr_Q(dc, a->rs2);
119
+ func(src1, tcg_env, src1, src2);
120
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
121
- gen_op_store_QT0_fpr(QFPREG(a->rd));
122
- gen_update_fprs_dirty(dc, QFPREG(a->rd));
123
+ gen_store_fpr_Q(dc, a->rd, src1);
124
return advance_pc(dc);
125
}
24
}
126
25
26
static bool fold_mb(OptContext *ctx, TCGOp *op)
127
--
27
--
128
2.34.1
28
2.43.0
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
target/xtensa/cpu.c | 6 ++++++
6
tcg/optimize.c | 19 +++++++++++--------
5
1 file changed, 6 insertions(+)
7
1 file changed, 11 insertions(+), 8 deletions(-)
6
8
7
diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
9
--- a/target/xtensa/cpu.c
11
--- a/tcg/optimize.c
10
+++ b/target/xtensa/cpu.c
12
+++ b/tcg/optimize.c
11
@@ -XXX,XX +XXX,XX @@ static bool xtensa_cpu_has_work(CPUState *cs)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_mov(OptContext *ctx, TCGOp *op)
12
#endif
14
15
static bool fold_movcond(OptContext *ctx, TCGOp *op)
16
{
17
+ uint64_t z_mask, s_mask;
18
+ TempOptInfo *tt, *ft;
19
int i;
20
21
/* If true and false values are the same, eliminate the cmp. */
22
@@ -XXX,XX +XXX,XX @@ static bool fold_movcond(OptContext *ctx, TCGOp *op)
23
return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[4 - i]);
24
}
25
26
- ctx->z_mask = arg_info(op->args[3])->z_mask
27
- | arg_info(op->args[4])->z_mask;
28
- ctx->s_mask = arg_info(op->args[3])->s_mask
29
- & arg_info(op->args[4])->s_mask;
30
+ tt = arg_info(op->args[3]);
31
+ ft = arg_info(op->args[4]);
32
+ z_mask = tt->z_mask | ft->z_mask;
33
+ s_mask = tt->s_mask & ft->s_mask;
34
35
- if (arg_is_const(op->args[3]) && arg_is_const(op->args[4])) {
36
- uint64_t tv = arg_info(op->args[3])->val;
37
- uint64_t fv = arg_info(op->args[4])->val;
38
+ if (ti_is_const(tt) && ti_is_const(ft)) {
39
+ uint64_t tv = ti_const_val(tt);
40
+ uint64_t fv = ti_const_val(ft);
41
TCGOpcode opc, negopc = 0;
42
TCGCond cond = op->args[5];
43
44
@@ -XXX,XX +XXX,XX @@ static bool fold_movcond(OptContext *ctx, TCGOp *op)
45
}
46
}
47
}
48
- return false;
49
+
50
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
13
}
51
}
14
52
15
+static int xtensa_cpu_mmu_index(CPUState *cs, bool ifetch)
53
static bool fold_mul(OptContext *ctx, TCGOp *op)
16
+{
17
+ return xtensa_get_cring(cpu_env(cs));
18
+}
19
+
20
#ifdef CONFIG_USER_ONLY
21
static bool abi_call0;
22
23
@@ -XXX,XX +XXX,XX @@ static void xtensa_cpu_class_init(ObjectClass *oc, void *data)
24
25
cc->class_by_name = xtensa_cpu_class_by_name;
26
cc->has_work = xtensa_cpu_has_work;
27
+ cc->mmu_index = xtensa_cpu_mmu_index;
28
cc->dump_state = xtensa_cpu_dump_state;
29
cc->set_pc = xtensa_cpu_set_pc;
30
cc->get_pc = xtensa_cpu_get_pc;
31
--
54
--
32
2.34.1
55
2.43.0
33
34
diff view generated by jsdifflib
1
Reviewed-by: Helge Deller <deller@gmx.de>
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
3
---
5
target/hppa/cpu.h | 7 ++-----
4
tcg/optimize.c | 6 +++---
6
target/hppa/cpu.c | 12 ++++++++++++
5
1 file changed, 3 insertions(+), 3 deletions(-)
7
2 files changed, 14 insertions(+), 5 deletions(-)
8
6
9
diff --git a/target/hppa/cpu.h b/target/hppa/cpu.h
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
10
index XXXXXXX..XXXXXXX 100644
8
index XXXXXXX..XXXXXXX 100644
11
--- a/target/hppa/cpu.h
9
--- a/tcg/optimize.c
12
+++ b/target/hppa/cpu.h
10
+++ b/tcg/optimize.c
13
@@ -XXX,XX +XXX,XX @@ static inline int HPPA_BTLB_ENTRIES(CPUHPPAState *env)
11
@@ -XXX,XX +XXX,XX @@ static bool fold_mul(OptContext *ctx, TCGOp *op)
14
return hppa_is_pa20(env) ? 0 : PA10_BTLB_FIXED + PA10_BTLB_VARIABLE;
12
fold_xi_to_x(ctx, op, 1)) {
13
return true;
14
}
15
- return false;
16
+ return finish_folding(ctx, op);
15
}
17
}
16
18
17
+int hppa_cpu_mmu_index(CPUState *cs, bool ifetch);
19
static bool fold_mul_highpart(OptContext *ctx, TCGOp *op)
18
static inline int cpu_mmu_index(CPUHPPAState *env, bool ifetch)
20
@@ -XXX,XX +XXX,XX @@ static bool fold_mul_highpart(OptContext *ctx, TCGOp *op)
19
{
21
fold_xi_to_i(ctx, op, 0)) {
20
#ifdef CONFIG_USER_ONLY
22
return true;
21
return MMU_USER_IDX;
23
}
22
#else
24
- return false;
23
- if (env->psw & (ifetch ? PSW_C : PSW_D)) {
25
+ return finish_folding(ctx, op);
24
- return PRIV_P_TO_MMU_IDX(env->iaoq_f & 3, env->psw & PSW_P);
25
- }
26
- /* mmu disabled */
27
- return env->psw & PSW_W ? MMU_ABS_W_IDX : MMU_ABS_IDX;
28
+ return hppa_cpu_mmu_index(env_cpu(env), ifetch);
29
#endif
30
}
26
}
31
27
32
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
28
static bool fold_multiply2(OptContext *ctx, TCGOp *op)
33
index XXXXXXX..XXXXXXX 100644
29
@@ -XXX,XX +XXX,XX @@ static bool fold_multiply2(OptContext *ctx, TCGOp *op)
34
--- a/target/hppa/cpu.c
30
tcg_opt_gen_movi(ctx, op2, rh, h);
35
+++ b/target/hppa/cpu.c
31
return true;
36
@@ -XXX,XX +XXX,XX @@ static bool hppa_cpu_has_work(CPUState *cs)
32
}
37
return cs->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI);
33
- return false;
34
+ return finish_folding(ctx, op);
38
}
35
}
39
36
40
+int hppa_cpu_mmu_index(CPUState *cs, bool ifetch)
37
static bool fold_nand(OptContext *ctx, TCGOp *op)
41
+{
42
+ CPUHPPAState *env = cpu_env(cs);
43
+
44
+ if (env->psw & (ifetch ? PSW_C : PSW_D)) {
45
+ return PRIV_P_TO_MMU_IDX(env->iaoq_f & 3, env->psw & PSW_P);
46
+ }
47
+ /* mmu disabled */
48
+ return env->psw & PSW_W ? MMU_ABS_W_IDX : MMU_ABS_IDX;
49
+}
50
+
51
static void hppa_cpu_disas_set_info(CPUState *cs, disassemble_info *info)
52
{
53
info->mach = bfd_mach_hppa20;
54
@@ -XXX,XX +XXX,XX @@ static void hppa_cpu_class_init(ObjectClass *oc, void *data)
55
56
cc->class_by_name = hppa_cpu_class_by_name;
57
cc->has_work = hppa_cpu_has_work;
58
+ cc->mmu_index = hppa_cpu_mmu_index;
59
cc->dump_state = hppa_cpu_dump_state;
60
cc->set_pc = hppa_cpu_set_pc;
61
cc->get_pc = hppa_cpu_get_pc;
62
--
38
--
63
2.34.1
39
2.43.0
64
65
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Avoid the use of the OptContext slots.
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
target/s390x/cpu.c | 6 ++++++
6
tcg/optimize.c | 8 +++++---
5
1 file changed, 6 insertions(+)
7
1 file changed, 5 insertions(+), 3 deletions(-)
6
8
7
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
9
--- a/target/s390x/cpu.c
11
--- a/tcg/optimize.c
10
+++ b/target/s390x/cpu.c
12
+++ b/tcg/optimize.c
11
@@ -XXX,XX +XXX,XX @@ static bool s390_cpu_has_work(CPUState *cs)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_multiply2(OptContext *ctx, TCGOp *op)
12
return s390_cpu_has_int(cpu);
14
15
static bool fold_nand(OptContext *ctx, TCGOp *op)
16
{
17
+ uint64_t s_mask;
18
+
19
if (fold_const2_commutative(ctx, op) ||
20
fold_xi_to_not(ctx, op, -1)) {
21
return true;
22
}
23
24
- ctx->s_mask = arg_info(op->args[1])->s_mask
25
- & arg_info(op->args[2])->s_mask;
26
- return false;
27
+ s_mask = arg_info(op->args[1])->s_mask
28
+ & arg_info(op->args[2])->s_mask;
29
+ return fold_masks_s(ctx, op, s_mask);
13
}
30
}
14
31
15
+static int s390x_cpu_mmu_index(CPUState *cs, bool ifetch)
32
static bool fold_neg_no_const(OptContext *ctx, TCGOp *op)
16
+{
17
+ return s390x_env_mmu_index(cpu_env(cs), ifetch);
18
+}
19
+
20
static void s390_query_cpu_fast(CPUState *cpu, CpuInfoFast *value)
21
{
22
S390CPU *s390_cpu = S390_CPU(cpu);
23
@@ -XXX,XX +XXX,XX @@ static void s390_cpu_class_init(ObjectClass *oc, void *data)
24
scc->reset = s390_cpu_reset;
25
cc->class_by_name = s390_cpu_class_by_name,
26
cc->has_work = s390_cpu_has_work;
27
+ cc->mmu_index = s390x_cpu_mmu_index;
28
cc->dump_state = s390_cpu_dump_state;
29
cc->query_cpu_fast = s390_query_cpu_fast;
30
cc->set_pc = s390_cpu_set_pc;
31
--
33
--
32
2.34.1
34
2.43.0
33
34
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Avoid the use of the OptContext slots.
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
target/rx/cpu.c | 6 ++++++
6
tcg/optimize.c | 9 ++-------
5
1 file changed, 6 insertions(+)
7
1 file changed, 2 insertions(+), 7 deletions(-)
6
8
7
diff --git a/target/rx/cpu.c b/target/rx/cpu.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
9
--- a/target/rx/cpu.c
11
--- a/tcg/optimize.c
10
+++ b/target/rx/cpu.c
12
+++ b/tcg/optimize.c
11
@@ -XXX,XX +XXX,XX @@ static bool rx_cpu_has_work(CPUState *cs)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_neg_no_const(OptContext *ctx, TCGOp *op)
12
(CPU_INTERRUPT_HARD | CPU_INTERRUPT_FIR);
14
{
15
/* Set to 1 all bits to the left of the rightmost. */
16
uint64_t z_mask = arg_info(op->args[1])->z_mask;
17
- ctx->z_mask = -(z_mask & -z_mask);
18
+ z_mask = -(z_mask & -z_mask);
19
20
- /*
21
- * Because of fold_sub_to_neg, we want to always return true,
22
- * via finish_folding.
23
- */
24
- finish_folding(ctx, op);
25
- return true;
26
+ return fold_masks_z(ctx, op, z_mask);
13
}
27
}
14
28
15
+static int riscv_cpu_mmu_index(CPUState *cs, bool ifunc)
29
static bool fold_neg(OptContext *ctx, TCGOp *op)
16
+{
17
+ return 0;
18
+}
19
+
20
static void rx_cpu_reset_hold(Object *obj)
21
{
22
RXCPU *cpu = RX_CPU(obj);
23
@@ -XXX,XX +XXX,XX @@ static void rx_cpu_class_init(ObjectClass *klass, void *data)
24
25
cc->class_by_name = rx_cpu_class_by_name;
26
cc->has_work = rx_cpu_has_work;
27
+ cc->mmu_index = riscv_cpu_mmu_index;
28
cc->dump_state = rx_cpu_dump_state;
29
cc->set_pc = rx_cpu_set_pc;
30
cc->get_pc = rx_cpu_get_pc;
31
--
30
--
32
2.34.1
31
2.43.0
33
34
diff view generated by jsdifflib
1
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
1
Avoid the use of the OptContext slots.
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
5
---
5
target/riscv/cpu.c | 6 ++++++
6
tcg/optimize.c | 8 +++++---
6
1 file changed, 6 insertions(+)
7
1 file changed, 5 insertions(+), 3 deletions(-)
7
8
8
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
10
--- a/target/riscv/cpu.c
11
--- a/tcg/optimize.c
11
+++ b/target/riscv/cpu.c
12
+++ b/tcg/optimize.c
12
@@ -XXX,XX +XXX,XX @@ static bool riscv_cpu_has_work(CPUState *cs)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_neg(OptContext *ctx, TCGOp *op)
13
#endif
14
15
static bool fold_nor(OptContext *ctx, TCGOp *op)
16
{
17
+ uint64_t s_mask;
18
+
19
if (fold_const2_commutative(ctx, op) ||
20
fold_xi_to_not(ctx, op, 0)) {
21
return true;
22
}
23
24
- ctx->s_mask = arg_info(op->args[1])->s_mask
25
- & arg_info(op->args[2])->s_mask;
26
- return false;
27
+ s_mask = arg_info(op->args[1])->s_mask
28
+ & arg_info(op->args[2])->s_mask;
29
+ return fold_masks_s(ctx, op, s_mask);
14
}
30
}
15
31
16
+static int riscv_cpu_mmu_index(CPUState *cs, bool ifetch)
32
static bool fold_not(OptContext *ctx, TCGOp *op)
17
+{
18
+ return riscv_env_mmu_index(cpu_env(cs), ifetch);
19
+}
20
+
21
static void riscv_cpu_reset_hold(Object *obj)
22
{
23
#ifndef CONFIG_USER_ONLY
24
@@ -XXX,XX +XXX,XX @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
25
26
cc->class_by_name = riscv_cpu_class_by_name;
27
cc->has_work = riscv_cpu_has_work;
28
+ cc->mmu_index = riscv_cpu_mmu_index;
29
cc->dump_state = riscv_cpu_dump_state;
30
cc->set_pc = riscv_cpu_set_pc;
31
cc->get_pc = riscv_cpu_get_pc;
32
--
33
--
33
2.34.1
34
2.43.0
34
35
diff view generated by jsdifflib
1
Use the target-specific function name in preference
1
Avoid the use of the OptContext slots.
2
to the generic name.
3
2
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
5
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/riscv/cpu_helper.c | 4 ++--
6
tcg/optimize.c | 7 +------
9
target/riscv/op_helper.c | 4 ++--
7
1 file changed, 1 insertion(+), 6 deletions(-)
10
target/riscv/vector_helper.c | 9 +++++----
11
3 files changed, 9 insertions(+), 8 deletions(-)
12
8
13
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
14
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
15
--- a/target/riscv/cpu_helper.c
11
--- a/tcg/optimize.c
16
+++ b/target/riscv/cpu_helper.c
12
+++ b/tcg/optimize.c
17
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, vaddr *pc,
13
@@ -XXX,XX +XXX,XX @@ static bool fold_not(OptContext *ctx, TCGOp *op)
18
#else
14
if (fold_const1(ctx, op)) {
19
flags = FIELD_DP32(flags, TB_FLAGS, PRIV, env->priv);
15
return true;
20
21
- flags |= cpu_mmu_index(env, 0);
22
+ flags |= riscv_env_mmu_index(env, 0);
23
fs = get_field(env->mstatus, MSTATUS_FS);
24
vs = get_field(env->mstatus, MSTATUS_VS);
25
26
@@ -XXX,XX +XXX,XX @@ hwaddr riscv_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
27
CPURISCVState *env = &cpu->env;
28
hwaddr phys_addr;
29
int prot;
30
- int mmu_idx = cpu_mmu_index(&cpu->env, false);
31
+ int mmu_idx = riscv_env_mmu_index(&cpu->env, false);
32
33
if (get_physical_address(env, &phys_addr, &prot, addr, NULL, 0, mmu_idx,
34
true, env->virt_enabled, true)) {
35
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
36
index XXXXXXX..XXXXXXX 100644
37
--- a/target/riscv/op_helper.c
38
+++ b/target/riscv/op_helper.c
39
@@ -XXX,XX +XXX,XX @@ void helper_cbo_zero(CPURISCVState *env, target_ulong address)
40
{
41
RISCVCPU *cpu = env_archcpu(env);
42
uint16_t cbozlen = cpu->cfg.cboz_blocksize;
43
- int mmu_idx = cpu_mmu_index(env, false);
44
+ int mmu_idx = riscv_env_mmu_index(env, false);
45
uintptr_t ra = GETPC();
46
void *mem;
47
48
@@ -XXX,XX +XXX,XX @@ static void check_zicbom_access(CPURISCVState *env,
49
uintptr_t ra)
50
{
51
RISCVCPU *cpu = env_archcpu(env);
52
- int mmu_idx = cpu_mmu_index(env, false);
53
+ int mmu_idx = riscv_env_mmu_index(env, false);
54
uint16_t cbomlen = cpu->cfg.cbom_blocksize;
55
void *phost;
56
int ret;
57
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/target/riscv/vector_helper.c
60
+++ b/target/riscv/vector_helper.c
61
@@ -XXX,XX +XXX,XX @@ static void probe_pages(CPURISCVState *env, target_ulong addr,
62
{
63
target_ulong pagelen = -(addr | TARGET_PAGE_MASK);
64
target_ulong curlen = MIN(pagelen, len);
65
+ int mmu_index = riscv_env_mmu_index(env, false);
66
67
probe_access(env, adjust_addr(env, addr), curlen, access_type,
68
- cpu_mmu_index(env, false), ra);
69
+ mmu_index, ra);
70
if (len > curlen) {
71
addr += curlen;
72
curlen = len - curlen;
73
probe_access(env, adjust_addr(env, addr), curlen, access_type,
74
- cpu_mmu_index(env, false), ra);
75
+ mmu_index, ra);
76
}
16
}
17
-
18
- ctx->s_mask = arg_info(op->args[1])->s_mask;
19
-
20
- /* Because of fold_to_not, we want to always return true, via finish. */
21
- finish_folding(ctx, op);
22
- return true;
23
+ return fold_masks_s(ctx, op, arg_info(op->args[1])->s_mask);
77
}
24
}
78
25
79
@@ -XXX,XX +XXX,XX @@ vext_ldff(void *vd, void *v0, target_ulong base,
26
static bool fold_or(OptContext *ctx, TCGOp *op)
80
uint32_t esz = 1 << log2_esz;
81
uint32_t vma = vext_vma(desc);
82
target_ulong addr, offset, remain;
83
+ int mmu_index = riscv_env_mmu_index(env, false);
84
85
/* probe every access */
86
for (i = env->vstart; i < env->vl; i++) {
87
@@ -XXX,XX +XXX,XX @@ vext_ldff(void *vd, void *v0, target_ulong base,
88
remain = nf << log2_esz;
89
while (remain > 0) {
90
offset = -(addr | TARGET_PAGE_MASK);
91
- host = tlb_vaddr_to_host(env, addr, MMU_DATA_LOAD,
92
- cpu_mmu_index(env, false));
93
+ host = tlb_vaddr_to_host(env, addr, MMU_DATA_LOAD, mmu_index);
94
if (host) {
95
#ifdef CONFIG_USER_ONLY
96
if (!page_check_range(addr, offset, PAGE_READ)) {
97
--
27
--
98
2.34.1
28
2.43.0
99
100
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
target/ppc/cpu_init.c | 6 ++++++
6
tcg/optimize.c | 13 ++++++++-----
5
1 file changed, 6 insertions(+)
7
1 file changed, 8 insertions(+), 5 deletions(-)
6
8
7
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
9
--- a/target/ppc/cpu_init.c
11
--- a/tcg/optimize.c
10
+++ b/target/ppc/cpu_init.c
12
+++ b/tcg/optimize.c
11
@@ -XXX,XX +XXX,XX @@ static bool ppc_cpu_has_work(CPUState *cs)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_not(OptContext *ctx, TCGOp *op)
12
return cs->interrupt_request & CPU_INTERRUPT_HARD;
14
15
static bool fold_or(OptContext *ctx, TCGOp *op)
16
{
17
+ uint64_t z_mask, s_mask;
18
+ TempOptInfo *t1, *t2;
19
+
20
if (fold_const2_commutative(ctx, op) ||
21
fold_xi_to_x(ctx, op, 0) ||
22
fold_xx_to_x(ctx, op)) {
23
return true;
24
}
25
26
- ctx->z_mask = arg_info(op->args[1])->z_mask
27
- | arg_info(op->args[2])->z_mask;
28
- ctx->s_mask = arg_info(op->args[1])->s_mask
29
- & arg_info(op->args[2])->s_mask;
30
- return fold_masks(ctx, op);
31
+ t1 = arg_info(op->args[1]);
32
+ t2 = arg_info(op->args[2]);
33
+ z_mask = t1->z_mask | t2->z_mask;
34
+ s_mask = t1->s_mask & t2->s_mask;
35
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
13
}
36
}
14
37
15
+static int ppc_cpu_mmu_index(CPUState *cs, bool ifetch)
38
static bool fold_orc(OptContext *ctx, TCGOp *op)
16
+{
17
+ return ppc_env_mmu_index(cpu_env(cs), ifetch);
18
+}
19
+
20
static void ppc_cpu_reset_hold(Object *obj)
21
{
22
CPUState *s = CPU(obj);
23
@@ -XXX,XX +XXX,XX @@ static void ppc_cpu_class_init(ObjectClass *oc, void *data)
24
25
cc->class_by_name = ppc_cpu_class_by_name;
26
cc->has_work = ppc_cpu_has_work;
27
+ cc->mmu_index = ppc_cpu_mmu_index;
28
cc->dump_state = ppc_cpu_dump_state;
29
cc->set_pc = ppc_cpu_set_pc;
30
cc->get_pc = ppc_cpu_get_pc;
31
--
39
--
32
2.34.1
40
2.43.0
33
34
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Avoid the use of the OptContext slots.
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
target/nios2/cpu.h | 12 ++++++------
6
tcg/optimize.c | 8 +++++---
5
target/nios2/cpu.c | 7 +++++++
7
1 file changed, 5 insertions(+), 3 deletions(-)
6
2 files changed, 13 insertions(+), 6 deletions(-)
7
8
8
diff --git a/target/nios2/cpu.h b/target/nios2/cpu.h
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
10
--- a/target/nios2/cpu.h
11
--- a/tcg/optimize.c
11
+++ b/target/nios2/cpu.h
12
+++ b/tcg/optimize.c
12
@@ -XXX,XX +XXX,XX @@ void do_nios2_semihosting(CPUNios2State *env);
13
@@ -XXX,XX +XXX,XX @@ static bool fold_or(OptContext *ctx, TCGOp *op)
13
#define MMU_SUPERVISOR_IDX 0
14
14
#define MMU_USER_IDX 1
15
static bool fold_orc(OptContext *ctx, TCGOp *op)
15
16
{
16
-static inline int cpu_mmu_index(CPUNios2State *env, bool ifetch)
17
+ uint64_t s_mask;
17
-{
18
- return (env->ctrl[CR_STATUS] & CR_STATUS_U) ? MMU_USER_IDX :
19
- MMU_SUPERVISOR_IDX;
20
-}
21
-
22
#ifndef CONFIG_USER_ONLY
23
hwaddr nios2_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
24
bool nios2_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
25
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAGS, CRS0, 0, 1) /* Set if CRS == 0. */
26
FIELD(TBFLAGS, U, 1, 1) /* Overlaps CR_STATUS_U */
27
FIELD(TBFLAGS, R0_0, 2, 1) /* Set if R0 == 0. */
28
29
+int nios2_cpu_mmu_index(CPUState *cs, bool ifetch);
30
+static inline int cpu_mmu_index(CPUNios2State *env, bool ifetch)
31
+{
32
+ return nios2_cpu_mmu_index(env_cpu(env), ifetch);
33
+}
34
+
18
+
35
static inline void cpu_get_tb_cpu_state(CPUNios2State *env, vaddr *pc,
19
if (fold_const2(ctx, op) ||
36
uint64_t *cs_base, uint32_t *flags)
20
fold_xx_to_i(ctx, op, -1) ||
37
{
21
fold_xi_to_x(ctx, op, -1) ||
38
diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
22
@@ -XXX,XX +XXX,XX @@ static bool fold_orc(OptContext *ctx, TCGOp *op)
39
index XXXXXXX..XXXXXXX 100644
23
return true;
40
--- a/target/nios2/cpu.c
24
}
41
+++ b/target/nios2/cpu.c
25
42
@@ -XXX,XX +XXX,XX @@ static bool nios2_cpu_has_work(CPUState *cs)
26
- ctx->s_mask = arg_info(op->args[1])->s_mask
43
return cs->interrupt_request & CPU_INTERRUPT_HARD;
27
- & arg_info(op->args[2])->s_mask;
28
- return false;
29
+ s_mask = arg_info(op->args[1])->s_mask
30
+ & arg_info(op->args[2])->s_mask;
31
+ return fold_masks_s(ctx, op, s_mask);
44
}
32
}
45
33
46
+int nios2_cpu_mmu_index(CPUState *cs, bool ifetch)
34
static bool fold_qemu_ld(OptContext *ctx, TCGOp *op)
47
+{
48
+ return (cpu_env(cs)->ctrl[CR_STATUS] & CR_STATUS_U
49
+ ? MMU_USER_IDX : MMU_SUPERVISOR_IDX);
50
+}
51
+
52
static void nios2_cpu_reset_hold(Object *obj)
53
{
54
CPUState *cs = CPU(obj);
55
@@ -XXX,XX +XXX,XX @@ static void nios2_cpu_class_init(ObjectClass *oc, void *data)
56
57
cc->class_by_name = nios2_cpu_class_by_name;
58
cc->has_work = nios2_cpu_has_work;
59
+ cc->mmu_index = nios2_cpu_mmu_index;
60
cc->dump_state = nios2_cpu_dump_state;
61
cc->set_pc = nios2_cpu_set_pc;
62
cc->get_pc = nios2_cpu_get_pc;
63
--
35
--
64
2.34.1
36
2.43.0
65
66
diff view generated by jsdifflib
1
Avoid the use of the OptContext slots.
2
3
Be careful not to call fold_masks_zs when the memory operation
4
is wide enough to require multiple outputs, so split into two
5
functions: fold_qemu_ld_1reg and fold_qemu_ld_2reg.
6
7
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
4
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
5
Message-Id: <20231103173841.33651-16-richard.henderson@linaro.org>
6
---
9
---
7
target/sparc/cpu.h | 4 +++-
10
tcg/optimize.c | 26 +++++++++++++++++++++-----
8
target/sparc/helper.h | 1 +
11
1 file changed, 21 insertions(+), 5 deletions(-)
9
linux-user/sparc/cpu_loop.c | 2 +-
10
linux-user/sparc/signal.c | 14 +++++++++-----
11
target/sparc/cpu.c | 5 +++--
12
target/sparc/fop_helper.c | 21 +++++++++++++++++++--
13
target/sparc/gdbstub.c | 8 ++++----
14
target/sparc/machine.c | 36 ++++++++++++++++++++++++++++++++++--
15
target/sparc/translate.c | 7 ++++++-
16
9 files changed, 80 insertions(+), 18 deletions(-)
17
12
18
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
13
diff --git a/tcg/optimize.c b/tcg/optimize.c
19
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
20
--- a/target/sparc/cpu.h
15
--- a/tcg/optimize.c
21
+++ b/target/sparc/cpu.h
16
+++ b/tcg/optimize.c
22
@@ -XXX,XX +XXX,XX @@ void sparc_restore_state_to_opc(CPUState *cs,
17
@@ -XXX,XX +XXX,XX @@ static bool fold_orc(OptContext *ctx, TCGOp *op)
23
const TranslationBlock *tb,
18
return fold_masks_s(ctx, op, s_mask);
24
const uint64_t *data);
25
26
-/* cpu-exec.c */
27
+/* fop_helper.c */
28
+target_ulong cpu_get_fsr(CPUSPARCState *);
29
+void cpu_put_fsr(CPUSPARCState *, target_ulong);
30
31
/* win_helper.c */
32
target_ulong cpu_get_psr(CPUSPARCState *env1);
33
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/sparc/helper.h
36
+++ b/target/sparc/helper.h
37
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(ld_asi, TCG_CALL_NO_WG, i64, env, tl, int, i32)
38
DEF_HELPER_FLAGS_5(st_asi, TCG_CALL_NO_WG, void, env, tl, i64, int, i32)
39
#endif
40
DEF_HELPER_FLAGS_1(check_ieee_exceptions, TCG_CALL_NO_WG, tl, env)
41
+DEF_HELPER_FLAGS_1(get_fsr, TCG_CALL_NO_WG_SE, tl, env)
42
DEF_HELPER_FLAGS_2(set_fsr, TCG_CALL_NO_RWG, void, env, tl)
43
DEF_HELPER_FLAGS_2(fsqrts, TCG_CALL_NO_RWG, f32, env, f32)
44
DEF_HELPER_FLAGS_2(fsqrtd, TCG_CALL_NO_RWG, f64, env, f64)
45
diff --git a/linux-user/sparc/cpu_loop.c b/linux-user/sparc/cpu_loop.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/linux-user/sparc/cpu_loop.c
48
+++ b/linux-user/sparc/cpu_loop.c
49
@@ -XXX,XX +XXX,XX @@ void cpu_loop (CPUSPARCState *env)
50
case TT_FP_EXCP:
51
{
52
int code = TARGET_FPE_FLTUNK;
53
- target_ulong fsr = env->fsr;
54
+ target_ulong fsr = cpu_get_fsr(env);
55
56
if ((fsr & FSR_FTT_MASK) == FSR_FTT_IEEE_EXCP) {
57
if (fsr & FSR_NVC) {
58
diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
59
index XXXXXXX..XXXXXXX 100644
60
--- a/linux-user/sparc/signal.c
61
+++ b/linux-user/sparc/signal.c
62
@@ -XXX,XX +XXX,XX @@ static void save_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
63
for (i = 0; i < 32; ++i) {
64
__put_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
65
}
66
- __put_user(env->fsr, &fpu->si_fsr);
67
+ __put_user(cpu_get_fsr(env), &fpu->si_fsr);
68
__put_user(env->gsr, &fpu->si_gsr);
69
__put_user(env->fprs, &fpu->si_fprs);
70
#else
71
for (i = 0; i < 16; ++i) {
72
__put_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
73
}
74
- __put_user(env->fsr, &fpu->si_fsr);
75
+ __put_user(cpu_get_fsr(env), &fpu->si_fsr);
76
__put_user(0, &fpu->si_fpqdepth);
77
#endif
78
}
19
}
79
20
80
static void restore_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
21
-static bool fold_qemu_ld(OptContext *ctx, TCGOp *op)
22
+static bool fold_qemu_ld_1reg(OptContext *ctx, TCGOp *op)
81
{
23
{
82
+ target_ulong fsr;
24
const TCGOpDef *def = &tcg_op_defs[op->opc];
83
int i;
25
MemOpIdx oi = op->args[def->nb_oargs + def->nb_iargs];
84
26
MemOp mop = get_memop(oi);
85
#ifdef TARGET_SPARC64
27
int width = 8 * memop_size(mop);
86
@@ -XXX,XX +XXX,XX @@ static void restore_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
28
+ uint64_t z_mask = -1, s_mask = 0;
87
__get_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
29
30
if (width < 64) {
31
if (mop & MO_SIGN) {
32
- ctx->s_mask = MAKE_64BIT_MASK(width, 64 - width);
33
+ s_mask = MAKE_64BIT_MASK(width - 1, 64 - (width - 1));
34
} else {
35
- ctx->z_mask = MAKE_64BIT_MASK(0, width);
36
+ z_mask = MAKE_64BIT_MASK(0, width);
88
}
37
}
89
}
38
}
90
- __get_user(env->fsr, &fpu->si_fsr);
39
91
__get_user(env->gsr, &fpu->si_gsr);
40
/* Opcodes that touch guest memory stop the mb optimization. */
92
env->fprs |= fprs;
41
ctx->prev_mb = NULL;
93
#else
42
- return false;
94
for (i = 0; i < 16; ++i) {
95
__get_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
96
}
97
- __get_user(env->fsr, &fpu->si_fsr);
98
#endif
99
+
43
+
100
+ __get_user(fsr, &fpu->si_fsr);
44
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
101
+ cpu_put_fsr(env, fsr);
102
}
103
104
#ifdef TARGET_ARCH_HAS_SETUP_FRAME
105
@@ -XXX,XX +XXX,XX @@ void sparc64_set_context(CPUSPARCState *env)
106
__get_user(fenab, &(fpup->mcfpu_enab));
107
if (fenab) {
108
abi_ulong fprs;
109
+ abi_ulong fsr;
110
111
/*
112
* We use the FPRS from the guest only in deciding whether
113
@@ -XXX,XX +XXX,XX @@ void sparc64_set_context(CPUSPARCState *env)
114
__get_user(env->fpr[i].ll, &(fpup->mcfpu_fregs.dregs[i]));
115
}
116
}
117
- __get_user(env->fsr, &(fpup->mcfpu_fsr));
118
+ __get_user(fsr, &(fpup->mcfpu_fsr));
119
+ cpu_put_fsr(env, fsr);
120
__get_user(env->gsr, &(fpup->mcfpu_gsr));
121
}
122
unlock_user_struct(ucp, ucp_addr, 0);
123
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
124
index XXXXXXX..XXXXXXX 100644
125
--- a/target/sparc/cpu.c
126
+++ b/target/sparc/cpu.c
127
@@ -XXX,XX +XXX,XX @@ static void sparc_cpu_dump_state(CPUState *cs, FILE *f, int flags)
128
env->cansave, env->canrestore, env->otherwin, env->wstate,
129
env->cleanwin, env->nwindows - 1 - env->cwp);
130
qemu_fprintf(f, "fsr: " TARGET_FMT_lx " y: " TARGET_FMT_lx " fprs: %016x\n",
131
- env->fsr, env->y, env->fprs);
132
+ cpu_get_fsr(env), env->y, env->fprs);
133
134
#else
135
qemu_fprintf(f, "psr: %08x (icc: ", cpu_get_psr(env));
136
@@ -XXX,XX +XXX,XX @@ static void sparc_cpu_dump_state(CPUState *cs, FILE *f, int flags)
137
env->psrps ? 'P' : '-', env->psret ? 'E' : '-',
138
env->wim);
139
qemu_fprintf(f, "fsr: " TARGET_FMT_lx " y: " TARGET_FMT_lx "\n",
140
- env->fsr, env->y);
141
+ cpu_get_fsr(env), env->y);
142
#endif
143
qemu_fprintf(f, "\n");
144
}
145
@@ -XXX,XX +XXX,XX @@ static void sparc_cpu_realizefn(DeviceState *dev, Error **errp)
146
env->version |= env->def.maxtl << 8;
147
env->version |= env->def.nwindows - 1;
148
#endif
149
+ cpu_put_fsr(env, 0);
150
151
cpu_exec_realizefn(cs, &local_err);
152
if (local_err != NULL) {
153
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
154
index XXXXXXX..XXXXXXX 100644
155
--- a/target/sparc/fop_helper.c
156
+++ b/target/sparc/fop_helper.c
157
@@ -XXX,XX +XXX,XX @@ GEN_FCMP(fcmpeq_fcc3, float128, 26, 1);
158
#undef GEN_FCMP_T
159
#undef GEN_FCMP
160
161
-static void set_fsr(CPUSPARCState *env, target_ulong fsr)
162
+target_ulong cpu_get_fsr(CPUSPARCState *env)
163
+{
164
+ return env->fsr;
165
+}
45
+}
166
+
46
+
167
+target_ulong helper_get_fsr(CPUSPARCState *env)
47
+static bool fold_qemu_ld_2reg(OptContext *ctx, TCGOp *op)
168
+{
48
+{
169
+ return cpu_get_fsr(env);
49
+ /* Opcodes that touch guest memory stop the mb optimization. */
170
+}
50
+ ctx->prev_mb = NULL;
171
+
51
+ return finish_folding(ctx, op);
172
+static void set_fsr_nonsplit(CPUSPARCState *env, target_ulong fsr)
173
{
174
int rnd_mode;
175
176
+ env->fsr = fsr;
177
+
178
switch (fsr & FSR_RD_MASK) {
179
case FSR_RD_NEAREST:
180
rnd_mode = float_round_nearest_even;
181
@@ -XXX,XX +XXX,XX @@ static void set_fsr(CPUSPARCState *env, target_ulong fsr)
182
set_float_rounding_mode(rnd_mode, &env->fp_status);
183
}
52
}
184
53
185
+void cpu_put_fsr(CPUSPARCState *env, target_ulong fsr)
54
static bool fold_qemu_st(OptContext *ctx, TCGOp *op)
186
+{
55
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
187
+ set_fsr_nonsplit(env, fsr);
188
+}
189
+
190
void helper_set_fsr(CPUSPARCState *env, target_ulong fsr)
191
{
192
- set_fsr(env, fsr);
193
+ set_fsr_nonsplit(env, fsr);
194
}
195
diff --git a/target/sparc/gdbstub.c b/target/sparc/gdbstub.c
196
index XXXXXXX..XXXXXXX 100644
197
--- a/target/sparc/gdbstub.c
198
+++ b/target/sparc/gdbstub.c
199
@@ -XXX,XX +XXX,XX @@ int sparc_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
200
case 69:
201
return gdb_get_rega(mem_buf, env->npc);
202
case 70:
203
- return gdb_get_rega(mem_buf, env->fsr);
204
+ return gdb_get_rega(mem_buf, cpu_get_fsr(env));
205
case 71:
206
return gdb_get_rega(mem_buf, 0); /* csr */
207
default:
208
@@ -XXX,XX +XXX,XX @@ int sparc_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
209
((env->pstate & 0xfff) << 8) |
210
cpu_get_cwp64(env));
211
case 83:
212
- return gdb_get_regl(mem_buf, env->fsr);
213
+ return gdb_get_regl(mem_buf, cpu_get_fsr(env));
214
case 84:
215
return gdb_get_regl(mem_buf, env->fprs);
216
case 85:
217
@@ -XXX,XX +XXX,XX @@ int sparc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
218
env->npc = tmp;
219
break;
56
break;
220
case 70:
57
case INDEX_op_qemu_ld_a32_i32:
221
- env->fsr = tmp;
58
case INDEX_op_qemu_ld_a64_i32:
222
+ cpu_put_fsr(env, tmp);
59
+ done = fold_qemu_ld_1reg(&ctx, op);
60
+ break;
61
case INDEX_op_qemu_ld_a32_i64:
62
case INDEX_op_qemu_ld_a64_i64:
63
+ if (TCG_TARGET_REG_BITS == 64) {
64
+ done = fold_qemu_ld_1reg(&ctx, op);
65
+ break;
66
+ }
67
+ QEMU_FALLTHROUGH;
68
case INDEX_op_qemu_ld_a32_i128:
69
case INDEX_op_qemu_ld_a64_i128:
70
- done = fold_qemu_ld(&ctx, op);
71
+ done = fold_qemu_ld_2reg(&ctx, op);
223
break;
72
break;
224
default:
73
case INDEX_op_qemu_st8_a32_i32:
225
return 0;
74
case INDEX_op_qemu_st8_a64_i32:
226
@@ -XXX,XX +XXX,XX @@ int sparc_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
227
cpu_put_cwp64(env, tmp & 0xff);
228
break;
229
case 83:
230
- env->fsr = tmp;
231
+ cpu_put_fsr(env, tmp);
232
break;
233
case 84:
234
env->fprs = tmp;
235
diff --git a/target/sparc/machine.c b/target/sparc/machine.c
236
index XXXXXXX..XXXXXXX 100644
237
--- a/target/sparc/machine.c
238
+++ b/target/sparc/machine.c
239
@@ -XXX,XX +XXX,XX @@ static const VMStateInfo vmstate_psr = {
240
.put = put_psr,
241
};
242
243
+static int get_fsr(QEMUFile *f, void *opaque, size_t size,
244
+ const VMStateField *field)
245
+{
246
+ SPARCCPU *cpu = opaque;
247
+ target_ulong val = qemu_get_betl(f);
248
+
249
+ cpu_put_fsr(&cpu->env, val);
250
+ return 0;
251
+}
252
+
253
+static int put_fsr(QEMUFile *f, void *opaque, size_t size,
254
+ const VMStateField *field, JSONWriter *vmdesc)
255
+{
256
+ SPARCCPU *cpu = opaque;
257
+ target_ulong val = cpu_get_fsr(&cpu->env);
258
+
259
+ qemu_put_betl(f, val);
260
+ return 0;
261
+}
262
+
263
+static const VMStateInfo vmstate_fsr = {
264
+ .name = "fsr",
265
+ .get = get_fsr,
266
+ .put = put_fsr,
267
+};
268
+
269
#ifdef TARGET_SPARC64
270
static int get_xcc(QEMUFile *f, void *opaque, size_t size,
271
const VMStateField *field)
272
@@ -XXX,XX +XXX,XX @@ const VMStateDescription vmstate_sparc_cpu = {
273
VMSTATE_UINTTL(env.npc, SPARCCPU),
274
VMSTATE_UINTTL(env.y, SPARCCPU),
275
{
276
-
277
.name = "psr",
278
.version_id = 0,
279
.size = sizeof(uint32_t),
280
@@ -XXX,XX +XXX,XX @@ const VMStateDescription vmstate_sparc_cpu = {
281
.flags = VMS_SINGLE,
282
.offset = 0,
283
},
284
- VMSTATE_UINTTL(env.fsr, SPARCCPU),
285
+ {
286
+ .name = "fsr",
287
+ .version_id = 0,
288
+ .size = sizeof(target_ulong),
289
+ .info = &vmstate_fsr,
290
+ .flags = VMS_SINGLE,
291
+ .offset = 0,
292
+ },
293
VMSTATE_UINTTL(env.tbr, SPARCCPU),
294
VMSTATE_INT32(env.interrupt_index, SPARCCPU),
295
VMSTATE_UINT32(env.pil_in, SPARCCPU),
296
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
297
index XXXXXXX..XXXXXXX 100644
298
--- a/target/sparc/translate.c
299
+++ b/target/sparc/translate.c
300
@@ -XXX,XX +XXX,XX @@ TRANS(LDXFSR, 64, do_ldfsr, a, MO_TEUQ, FSR_LDXFSR_MASK, FSR_LDXFSR_OLDMASK)
301
static bool do_stfsr(DisasContext *dc, arg_r_r_ri *a, MemOp mop)
302
{
303
TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm);
304
+ TCGv fsr;
305
+
306
if (addr == NULL) {
307
return false;
308
}
309
if (gen_trap_ifnofpu(dc)) {
310
return true;
311
}
312
- tcg_gen_qemu_st_tl(cpu_fsr, addr, dc->mem_idx, mop | MO_ALIGN);
313
+
314
+ fsr = tcg_temp_new();
315
+ gen_helper_get_fsr(fsr, tcg_env);
316
+ tcg_gen_qemu_st_tl(fsr, addr, dc->mem_idx, mop | MO_ALIGN);
317
return advance_pc(dc);
318
}
319
320
--
75
--
321
2.34.1
76
2.43.0
322
323
diff view generated by jsdifflib
1
Compute this value once for each translation.
1
Stores have no output operands, and so need no further work.
2
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@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/cris/translate.c | 14 +++++---------
6
tcg/optimize.c | 11 +++++------
7
target/cris/translate_v10.c.inc | 6 ++----
7
1 file changed, 5 insertions(+), 6 deletions(-)
8
2 files changed, 7 insertions(+), 13 deletions(-)
9
8
10
diff --git a/target/cris/translate.c b/target/cris/translate.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
11
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
12
--- a/target/cris/translate.c
11
--- a/tcg/optimize.c
13
+++ b/target/cris/translate.c
12
+++ b/tcg/optimize.c
14
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
13
@@ -XXX,XX +XXX,XX @@ static bool fold_qemu_st(OptContext *ctx, TCGOp *op)
15
16
CRISCPU *cpu;
17
target_ulong pc, ppc;
18
+ int mem_index;
19
20
/* Decoder. */
21
unsigned int (*decoder)(CPUCRISState *env, struct DisasContext *dc);
22
@@ -XXX,XX +XXX,XX @@ static inline void cris_prepare_jmp (DisasContext *dc, unsigned int type)
23
24
static void gen_load64(DisasContext *dc, TCGv_i64 dst, TCGv addr)
25
{
14
{
26
- int mem_index = cpu_mmu_index(&dc->cpu->env, false);
15
/* Opcodes that touch guest memory stop the mb optimization. */
27
-
16
ctx->prev_mb = NULL;
28
/* If we get a fault on a delayslot we must keep the jmp state in
17
- return false;
29
the cpu-state to be able to re-execute the jmp. */
18
+ return true;
30
if (dc->delayed_branch == 1) {
19
}
31
cris_store_direct_jmp(dc);
20
21
static bool fold_remainder(OptContext *ctx, TCGOp *op)
22
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_st(OptContext *ctx, TCGOp *op)
23
24
if (op->args[1] != tcgv_ptr_arg(tcg_env)) {
25
remove_mem_copy_all(ctx);
26
- return false;
27
+ return true;
32
}
28
}
33
29
34
- tcg_gen_qemu_ld_i64(dst, addr, mem_index, MO_TEUQ);
30
switch (op->opc) {
35
+ tcg_gen_qemu_ld_i64(dst, addr, dc->mem_index, MO_TEUQ);
31
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_st(OptContext *ctx, TCGOp *op)
32
g_assert_not_reached();
33
}
34
remove_mem_copy_in(ctx, ofs, ofs + lm1);
35
- return false;
36
+ return true;
36
}
37
}
37
38
38
static void gen_load(DisasContext *dc, TCGv dst, TCGv addr,
39
static bool fold_tcg_st_memcopy(OptContext *ctx, TCGOp *op)
39
unsigned int size, int sign)
40
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_st_memcopy(OptContext *ctx, TCGOp *op)
40
{
41
TCGType type;
41
- int mem_index = cpu_mmu_index(&dc->cpu->env, false);
42
42
-
43
if (op->args[1] != tcgv_ptr_arg(tcg_env)) {
43
/* If we get a fault on a delayslot we must keep the jmp state in
44
- fold_tcg_st(ctx, op);
44
the cpu-state to be able to re-execute the jmp. */
45
- return false;
45
if (dc->delayed_branch == 1) {
46
+ return fold_tcg_st(ctx, op);
46
cris_store_direct_jmp(dc);
47
}
47
}
48
48
49
- tcg_gen_qemu_ld_tl(dst, addr, mem_index,
49
src = arg_temp(op->args[0]);
50
+ tcg_gen_qemu_ld_tl(dst, addr, dc->mem_index,
50
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_st_memcopy(OptContext *ctx, TCGOp *op)
51
MO_TE + ctz32(size) + (sign ? MO_SIGN : 0));
51
last = ofs + tcg_type_size(type) - 1;
52
remove_mem_copy_in(ctx, ofs, last);
53
record_mem_copy(ctx, type, src, ofs, last);
54
- return false;
55
+ return true;
52
}
56
}
53
57
54
static void gen_store (DisasContext *dc, TCGv addr, TCGv val,
58
static bool fold_xor(OptContext *ctx, TCGOp *op)
55
unsigned int size)
56
{
57
- int mem_index = cpu_mmu_index(&dc->cpu->env, false);
58
-
59
/* If we get a fault on a delayslot we must keep the jmp state in
60
the cpu-state to be able to re-execute the jmp. */
61
if (dc->delayed_branch == 1) {
62
@@ -XXX,XX +XXX,XX @@ static void gen_store (DisasContext *dc, TCGv addr, TCGv val,
63
return;
64
}
65
66
- tcg_gen_qemu_st_tl(val, addr, mem_index, MO_TE + ctz32(size));
67
+ tcg_gen_qemu_st_tl(val, addr, dc->mem_index, MO_TE + ctz32(size));
68
69
if (dc->flags_x) {
70
cris_evaluate_flags(dc);
71
@@ -XXX,XX +XXX,XX @@ static void cris_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
72
dc->cpu = env_archcpu(env);
73
dc->ppc = pc_start;
74
dc->pc = pc_start;
75
+ dc->mem_index = cpu_mmu_index(env, false);
76
dc->flags_uptodate = 1;
77
dc->flags_x = tb_flags & X_FLAG;
78
dc->cc_x_uptodate = 0;
79
diff --git a/target/cris/translate_v10.c.inc b/target/cris/translate_v10.c.inc
80
index XXXXXXX..XXXXXXX 100644
81
--- a/target/cris/translate_v10.c.inc
82
+++ b/target/cris/translate_v10.c.inc
83
@@ -XXX,XX +XXX,XX @@ static void gen_store_v10_conditional(DisasContext *dc, TCGv addr, TCGv val,
84
static void gen_store_v10(DisasContext *dc, TCGv addr, TCGv val,
85
unsigned int size)
86
{
87
- int mem_index = cpu_mmu_index(&dc->cpu->env, false);
88
-
89
/* If we get a fault on a delayslot we must keep the jmp state in
90
the cpu-state to be able to re-execute the jmp. */
91
if (dc->delayed_branch == 1) {
92
@@ -XXX,XX +XXX,XX @@ static void gen_store_v10(DisasContext *dc, TCGv addr, TCGv val,
93
94
/* Conditional writes. */
95
if (dc->flags_x) {
96
- gen_store_v10_conditional(dc, addr, val, size, mem_index);
97
+ gen_store_v10_conditional(dc, addr, val, size, dc->mem_index);
98
return;
99
}
100
101
- tcg_gen_qemu_st_tl(val, addr, mem_index, ctz32(size) | MO_TE);
102
+ tcg_gen_qemu_st_tl(val, addr, dc->mem_index, ctz32(size) | MO_TE);
103
}
104
105
106
--
59
--
107
2.34.1
60
2.43.0
108
109
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
3
---
4
target/mips/cpu.c | 6 ++++++
4
tcg/optimize.c | 2 +-
5
1 file changed, 6 insertions(+)
5
1 file changed, 1 insertion(+), 1 deletion(-)
6
6
7
diff --git a/target/mips/cpu.c b/target/mips/cpu.c
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
index XXXXXXX..XXXXXXX 100644
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/mips/cpu.c
9
--- a/tcg/optimize.c
10
+++ b/target/mips/cpu.c
10
+++ b/tcg/optimize.c
11
@@ -XXX,XX +XXX,XX @@ static bool mips_cpu_has_work(CPUState *cs)
11
@@ -XXX,XX +XXX,XX @@ static bool fold_remainder(OptContext *ctx, TCGOp *op)
12
return has_work;
12
fold_xx_to_i(ctx, op, 0)) {
13
return true;
14
}
15
- return false;
16
+ return finish_folding(ctx, op);
13
}
17
}
14
18
15
+static int mips_cpu_mmu_index(CPUState *cs, bool ifunc)
19
static bool fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
16
+{
17
+ return mips_env_mmu_index(cpu_env(cs));
18
+}
19
+
20
#include "cpu-defs.c.inc"
21
22
static void mips_cpu_reset_hold(Object *obj)
23
@@ -XXX,XX +XXX,XX @@ static void mips_cpu_class_init(ObjectClass *c, void *data)
24
25
cc->class_by_name = mips_cpu_class_by_name;
26
cc->has_work = mips_cpu_has_work;
27
+ cc->mmu_index = mips_cpu_mmu_index;
28
cc->dump_state = mips_cpu_dump_state;
29
cc->set_pc = mips_cpu_set_pc;
30
cc->get_pc = mips_cpu_get_pc;
31
--
20
--
32
2.34.1
21
2.43.0
33
34
diff view generated by jsdifflib
1
Change return from bool to int; distinguish between
2
complete folding, simplification, and no change.
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
3
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
4
Message-Id: <20231103173841.33651-10-richard.henderson@linaro.org>
5
---
6
---
6
target/sparc/helper.h | 4 ++--
7
tcg/optimize.c | 22 ++++++++++++++--------
7
target/sparc/fop_helper.c | 8 ++++----
8
1 file changed, 14 insertions(+), 8 deletions(-)
8
target/sparc/translate.c | 7 ++++---
9
3 files changed, 10 insertions(+), 9 deletions(-)
10
9
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
12
--- a/tcg/optimize.c
14
+++ b/target/sparc/helper.h
13
+++ b/tcg/optimize.c
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(fdtos, TCG_CALL_NO_RWG, f32, env, f64)
14
@@ -XXX,XX +XXX,XX @@ static bool fold_remainder(OptContext *ctx, TCGOp *op)
16
DEF_HELPER_FLAGS_2(fstod, TCG_CALL_NO_RWG, f64, env, f32)
15
return finish_folding(ctx, op);
17
DEF_HELPER_FLAGS_2(fqtos, TCG_CALL_NO_RWG, f32, env, i128)
18
DEF_HELPER_FLAGS_2(fstoq, TCG_CALL_NO_RWG, void, env, f32)
19
-DEF_HELPER_FLAGS_1(fqtod, TCG_CALL_NO_RWG, f64, env)
20
+DEF_HELPER_FLAGS_2(fqtod, TCG_CALL_NO_RWG, f64, env, i128)
21
DEF_HELPER_FLAGS_2(fdtoq, TCG_CALL_NO_RWG, void, env, f64)
22
DEF_HELPER_FLAGS_2(fstoi, TCG_CALL_NO_RWG, s32, env, f32)
23
DEF_HELPER_FLAGS_2(fdtoi, TCG_CALL_NO_RWG, s32, env, f64)
24
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(fqtoi, TCG_CALL_NO_RWG, s32, env, i128)
25
#ifdef TARGET_SPARC64
26
DEF_HELPER_FLAGS_2(fstox, TCG_CALL_NO_RWG, s64, env, f32)
27
DEF_HELPER_FLAGS_2(fdtox, TCG_CALL_NO_RWG, s64, env, f64)
28
-DEF_HELPER_FLAGS_1(fqtox, TCG_CALL_NO_RWG, s64, env)
29
+DEF_HELPER_FLAGS_2(fqtox, TCG_CALL_NO_RWG, s64, env, i128)
30
31
DEF_HELPER_FLAGS_2(fpmerge, TCG_CALL_NO_RWG_SE, i64, i64, i64)
32
DEF_HELPER_FLAGS_2(fmul8x16, TCG_CALL_NO_RWG_SE, i64, i64, i64)
33
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/sparc/fop_helper.c
36
+++ b/target/sparc/fop_helper.c
37
@@ -XXX,XX +XXX,XX @@ void helper_fstoq(CPUSPARCState *env, float32 src)
38
QT0 = float32_to_float128(src, &env->fp_status);
39
}
16
}
40
17
41
-float64 helper_fqtod(CPUSPARCState *env)
18
-static bool fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
42
+float64 helper_fqtod(CPUSPARCState *env, Int128 src)
19
+/* Return 1 if finished, -1 if simplified, 0 if unchanged. */
20
+static int fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
43
{
21
{
44
- return float128_to_float64(QT1, &env->fp_status);
22
uint64_t a_zmask, b_val;
45
+ return float128_to_float64(f128_in(src), &env->fp_status);
23
TCGCond cond;
24
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond_zmask(OptContext *ctx, TCGOp *op, bool neg)
25
op->opc = xor_opc;
26
op->args[2] = arg_new_constant(ctx, 1);
27
}
28
- return false;
29
+ return -1;
30
}
31
}
32
-
33
- return false;
34
+ return 0;
46
}
35
}
47
36
48
void helper_fdtoq(CPUSPARCState *env, float64 src)
37
static void fold_setcond_tst_pow2(OptContext *ctx, TCGOp *op, bool neg)
49
@@ -XXX,XX +XXX,XX @@ int64_t helper_fdtox(CPUSPARCState *env, float64 src)
38
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond(OptContext *ctx, TCGOp *op)
50
return float64_to_int64_round_to_zero(src, &env->fp_status);
39
return tcg_opt_gen_movi(ctx, op, op->args[0], i);
51
}
52
53
-int64_t helper_fqtox(CPUSPARCState *env)
54
+int64_t helper_fqtox(CPUSPARCState *env, Int128 src)
55
{
56
- return float128_to_int64_round_to_zero(QT1, &env->fp_status);
57
+ return float128_to_int64_round_to_zero(f128_in(src), &env->fp_status);
58
}
59
#endif
60
61
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
62
index XXXXXXX..XXXXXXX 100644
63
--- a/target/sparc/translate.c
64
+++ b/target/sparc/translate.c
65
@@ -XXX,XX +XXX,XX @@ TRANS(FqTOs, ALL, do_env_fq, a, gen_helper_fqtos)
66
TRANS(FqTOi, ALL, do_env_fq, a, gen_helper_fqtoi)
67
68
static bool do_env_dq(DisasContext *dc, arg_r_r *a,
69
- void (*func)(TCGv_i64, TCGv_env))
70
+ void (*func)(TCGv_i64, TCGv_env, TCGv_i128))
71
{
72
+ TCGv_i128 src;
73
TCGv_i64 dst;
74
75
if (gen_trap_ifnofpu(dc)) {
76
@@ -XXX,XX +XXX,XX @@ static bool do_env_dq(DisasContext *dc, arg_r_r *a,
77
}
40
}
78
41
79
gen_op_clear_ieee_excp_and_FTT();
42
- if (fold_setcond_zmask(ctx, op, false)) {
80
- gen_op_load_fpr_QT1(QFPREG(a->rs));
43
+ i = fold_setcond_zmask(ctx, op, false);
81
+ src = gen_load_fpr_Q(dc, a->rs);
44
+ if (i > 0) {
82
dst = gen_dest_fpr_D(dc, a->rd);
45
return true;
83
- func(dst, tcg_env);
46
}
84
+ func(dst, tcg_env, src);
47
- fold_setcond_tst_pow2(ctx, op, false);
85
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
48
+ if (i == 0) {
86
gen_store_fpr_D(dc, a->rd, dst);
49
+ fold_setcond_tst_pow2(ctx, op, false);
87
return advance_pc(dc);
50
+ }
51
52
ctx->z_mask = 1;
53
return false;
54
@@ -XXX,XX +XXX,XX @@ static bool fold_negsetcond(OptContext *ctx, TCGOp *op)
55
return tcg_opt_gen_movi(ctx, op, op->args[0], -i);
56
}
57
58
- if (fold_setcond_zmask(ctx, op, true)) {
59
+ i = fold_setcond_zmask(ctx, op, true);
60
+ if (i > 0) {
61
return true;
62
}
63
- fold_setcond_tst_pow2(ctx, op, true);
64
+ if (i == 0) {
65
+ fold_setcond_tst_pow2(ctx, op, true);
66
+ }
67
68
/* Value is {0,-1} so all bits are repetitions of the sign. */
69
ctx->s_mask = -1;
88
--
70
--
89
2.34.1
71
2.43.0
diff view generated by jsdifflib
1
Rather than adjust env->hflags so that the value computed
1
Avoid the use of the OptContext slots.
2
by cpu_mmu_index() changes, compute the mmu_idx that we
3
want directly and pass it down.
4
2
5
Introduce symbolic constants for MMU_{KERNEL,ERL}_IDX.
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
6
7
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
target/mips/cpu.h | 4 +++-
6
tcg/optimize.c | 3 +--
11
target/mips/tcg/sysemu/tlb_helper.c | 32 ++++++++++++-----------------
7
1 file changed, 1 insertion(+), 2 deletions(-)
12
2 files changed, 16 insertions(+), 20 deletions(-)
13
8
14
diff --git a/target/mips/cpu.h b/target/mips/cpu.h
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
15
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
16
--- a/target/mips/cpu.h
11
--- a/tcg/optimize.c
17
+++ b/target/mips/cpu.h
12
+++ b/tcg/optimize.c
18
@@ -XXX,XX +XXX,XX @@ uint32_t cpu_rddsp(uint32_t mask_num, CPUMIPSState *env);
13
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond(OptContext *ctx, TCGOp *op)
19
* MMU modes definitions. We carefully match the indices with our
14
fold_setcond_tst_pow2(ctx, op, false);
20
* hflags layout.
21
*/
22
+#define MMU_KERNEL_IDX 0
23
#define MMU_USER_IDX 2
24
+#define MMU_ERL_IDX 3
25
26
static inline int hflags_mmu_index(uint32_t hflags)
27
{
28
if (hflags & MIPS_HFLAG_ERL) {
29
- return 3; /* ERL */
30
+ return MMU_ERL_IDX;
31
} else {
32
return hflags & MIPS_HFLAG_KSU;
33
}
15
}
34
diff --git a/target/mips/tcg/sysemu/tlb_helper.c b/target/mips/tcg/sysemu/tlb_helper.c
16
35
index XXXXXXX..XXXXXXX 100644
17
- ctx->z_mask = 1;
36
--- a/target/mips/tcg/sysemu/tlb_helper.c
18
- return false;
37
+++ b/target/mips/tcg/sysemu/tlb_helper.c
19
+ return fold_masks_z(ctx, op, 1);
38
@@ -XXX,XX +XXX,XX @@ static uint64_t get_tlb_entry_layout(CPUMIPSState *env, uint64_t entry,
39
static int walk_directory(CPUMIPSState *env, uint64_t *vaddr,
40
int directory_index, bool *huge_page, bool *hgpg_directory_hit,
41
uint64_t *pw_entrylo0, uint64_t *pw_entrylo1,
42
- unsigned directory_shift, unsigned leaf_shift)
43
+ unsigned directory_shift, unsigned leaf_shift, int ptw_mmu_idx)
44
{
45
int dph = (env->CP0_PWCtl >> CP0PC_DPH) & 0x1;
46
int psn = (env->CP0_PWCtl >> CP0PC_PSN) & 0x3F;
47
@@ -XXX,XX +XXX,XX @@ static int walk_directory(CPUMIPSState *env, uint64_t *vaddr,
48
uint64_t w = 0;
49
50
if (get_physical_address(env, &paddr, &prot, *vaddr, MMU_DATA_LOAD,
51
- cpu_mmu_index(env, false)) !=
52
- TLBRET_MATCH) {
53
+ ptw_mmu_idx) != TLBRET_MATCH) {
54
/* wrong base address */
55
return 0;
56
}
57
@@ -XXX,XX +XXX,XX @@ static int walk_directory(CPUMIPSState *env, uint64_t *vaddr,
58
*pw_entrylo0 = entry;
59
}
60
if (get_physical_address(env, &paddr, &prot, vaddr2, MMU_DATA_LOAD,
61
- cpu_mmu_index(env, false)) !=
62
- TLBRET_MATCH) {
63
+ ptw_mmu_idx) != TLBRET_MATCH) {
64
return 0;
65
}
66
if (!get_pte(env, vaddr2, leafentry_size, &entry)) {
67
@@ -XXX,XX +XXX,XX @@ static int walk_directory(CPUMIPSState *env, uint64_t *vaddr,
68
}
20
}
69
21
70
static bool page_table_walk_refill(CPUMIPSState *env, vaddr address,
22
static bool fold_negsetcond(OptContext *ctx, TCGOp *op)
71
- int mmu_idx)
72
+ int ptw_mmu_idx)
73
{
74
int gdw = (env->CP0_PWSize >> CP0PS_GDW) & 0x3F;
75
int udw = (env->CP0_PWSize >> CP0PS_UDW) & 0x3F;
76
@@ -XXX,XX +XXX,XX @@ static bool page_table_walk_refill(CPUMIPSState *env, vaddr address,
77
vaddr |= goffset;
78
switch (walk_directory(env, &vaddr, pf_gdw, &huge_page, &hgpg_gdhit,
79
&pw_entrylo0, &pw_entrylo1,
80
- directory_shift, leaf_shift))
81
+ directory_shift, leaf_shift, ptw_mmu_idx))
82
{
83
case 0:
84
return false;
85
@@ -XXX,XX +XXX,XX @@ static bool page_table_walk_refill(CPUMIPSState *env, vaddr address,
86
vaddr |= uoffset;
87
switch (walk_directory(env, &vaddr, pf_udw, &huge_page, &hgpg_udhit,
88
&pw_entrylo0, &pw_entrylo1,
89
- directory_shift, leaf_shift))
90
+ directory_shift, leaf_shift, ptw_mmu_idx))
91
{
92
case 0:
93
return false;
94
@@ -XXX,XX +XXX,XX @@ static bool page_table_walk_refill(CPUMIPSState *env, vaddr address,
95
vaddr |= moffset;
96
switch (walk_directory(env, &vaddr, pf_mdw, &huge_page, &hgpg_mdhit,
97
&pw_entrylo0, &pw_entrylo1,
98
- directory_shift, leaf_shift))
99
+ directory_shift, leaf_shift, ptw_mmu_idx))
100
{
101
case 0:
102
return false;
103
@@ -XXX,XX +XXX,XX @@ static bool page_table_walk_refill(CPUMIPSState *env, vaddr address,
104
/* Leaf Level Page Table - First half of PTE pair */
105
vaddr |= ptoffset0;
106
if (get_physical_address(env, &paddr, &prot, vaddr, MMU_DATA_LOAD,
107
- cpu_mmu_index(env, false)) !=
108
- TLBRET_MATCH) {
109
+ ptw_mmu_idx) != TLBRET_MATCH) {
110
return false;
111
}
112
if (!get_pte(env, vaddr, leafentry_size, &dir_entry)) {
113
@@ -XXX,XX +XXX,XX @@ static bool page_table_walk_refill(CPUMIPSState *env, vaddr address,
114
/* Leaf Level Page Table - Second half of PTE pair */
115
vaddr |= ptoffset1;
116
if (get_physical_address(env, &paddr, &prot, vaddr, MMU_DATA_LOAD,
117
- cpu_mmu_index(env, false)) !=
118
- TLBRET_MATCH) {
119
+ ptw_mmu_idx) != TLBRET_MATCH) {
120
return false;
121
}
122
if (!get_pte(env, vaddr, leafentry_size, &dir_entry)) {
123
@@ -XXX,XX +XXX,XX @@ bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
124
* Memory reads during hardware page table walking are performed
125
* as if they were kernel-mode load instructions.
126
*/
127
- int mode = (env->hflags & MIPS_HFLAG_KSU);
128
- bool ret_walker;
129
- env->hflags &= ~MIPS_HFLAG_KSU;
130
- ret_walker = page_table_walk_refill(env, address, mmu_idx);
131
- env->hflags |= mode;
132
- if (ret_walker) {
133
+ int ptw_mmu_idx = (env->hflags & MIPS_HFLAG_ERL ?
134
+ MMU_ERL_IDX : MMU_KERNEL_IDX);
135
+
136
+ if (page_table_walk_refill(env, address, ptw_mmu_idx)) {
137
ret = get_physical_address(env, &physical, &prot, address,
138
access_type, mmu_idx);
139
if (ret == TLBRET_MATCH) {
140
--
23
--
141
2.34.1
24
2.43.0
142
143
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Avoid the use of the OptContext slots.
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
target/m68k/cpu.c | 6 ++++++
6
tcg/optimize.c | 3 +--
5
1 file changed, 6 insertions(+)
7
1 file changed, 1 insertion(+), 2 deletions(-)
6
8
7
diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
9
--- a/target/m68k/cpu.c
11
--- a/tcg/optimize.c
10
+++ b/target/m68k/cpu.c
12
+++ b/tcg/optimize.c
11
@@ -XXX,XX +XXX,XX @@ static bool m68k_cpu_has_work(CPUState *cs)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_negsetcond(OptContext *ctx, TCGOp *op)
12
return cs->interrupt_request & CPU_INTERRUPT_HARD;
14
}
15
16
/* Value is {0,-1} so all bits are repetitions of the sign. */
17
- ctx->s_mask = -1;
18
- return false;
19
+ return fold_masks_s(ctx, op, -1);
13
}
20
}
14
21
15
+static int m68k_cpu_mmu_index(CPUState *cs, bool ifetch)
22
static bool fold_setcond2(OptContext *ctx, TCGOp *op)
16
+{
17
+ return cpu_env(cs)->sr & SR_S ? MMU_KERNEL_IDX : MMU_USER_IDX;
18
+}
19
+
20
static void m68k_set_feature(CPUM68KState *env, int feature)
21
{
22
env->features |= BIT_ULL(feature);
23
@@ -XXX,XX +XXX,XX @@ static void m68k_cpu_class_init(ObjectClass *c, void *data)
24
25
cc->class_by_name = m68k_cpu_class_by_name;
26
cc->has_work = m68k_cpu_has_work;
27
+ cc->mmu_index = m68k_cpu_mmu_index;
28
cc->dump_state = m68k_cpu_dump_state;
29
cc->set_pc = m68k_cpu_set_pc;
30
cc->get_pc = m68k_cpu_get_pc;
31
--
23
--
32
2.34.1
24
2.43.0
33
34
diff view generated by jsdifflib
New patch
1
Avoid the use of the OptContext slots.
1
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
tcg/optimize.c | 3 +--
7
1 file changed, 1 insertion(+), 2 deletions(-)
8
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
12
+++ b/tcg/optimize.c
13
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond2(OptContext *ctx, TCGOp *op)
14
return fold_setcond(ctx, op);
15
}
16
17
- ctx->z_mask = 1;
18
- return false;
19
+ return fold_masks_z(ctx, op, 1);
20
21
do_setcond_const:
22
return tcg_opt_gen_movi(ctx, op, op->args[0], i);
23
--
24
2.43.0
diff view generated by jsdifflib
1
The expected form is MMU_FOO_IDX, not MMU_IDX_FOO.
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Rename to match generic code.
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
3
---
7
target/loongarch/cpu.h | 8 ++++----
4
tcg/optimize.c | 2 +-
8
target/loongarch/cpu.c | 2 +-
5
1 file changed, 1 insertion(+), 1 deletion(-)
9
target/loongarch/tcg/tlb_helper.c | 4 ++--
10
target/loongarch/tcg/translate.c | 2 +-
11
target/loongarch/tcg/insn_trans/trans_privileged.c.inc | 2 +-
12
5 files changed, 9 insertions(+), 9 deletions(-)
13
6
14
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
15
index XXXXXXX..XXXXXXX 100644
8
index XXXXXXX..XXXXXXX 100644
16
--- a/target/loongarch/cpu.h
9
--- a/tcg/optimize.c
17
+++ b/target/loongarch/cpu.h
10
+++ b/tcg/optimize.c
18
@@ -XXX,XX +XXX,XX @@ struct LoongArchCPUClass {
11
@@ -XXX,XX +XXX,XX @@ static bool fold_cmp_vec(OptContext *ctx, TCGOp *op)
19
*/
12
if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
20
#define MMU_PLV_KERNEL 0
13
op->args[3] = tcg_swap_cond(op->args[3]);
21
#define MMU_PLV_USER 3
22
-#define MMU_IDX_KERNEL MMU_PLV_KERNEL
23
-#define MMU_IDX_USER MMU_PLV_USER
24
-#define MMU_IDX_DA 4
25
+#define MMU_KERNEL_IDX MMU_PLV_KERNEL
26
+#define MMU_USER_IDX MMU_PLV_USER
27
+#define MMU_DA_IDX 4
28
29
int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch);
30
static inline int cpu_mmu_index(CPULoongArchState *env, bool ifetch)
31
{
32
#ifdef CONFIG_USER_ONLY
33
- return MMU_IDX_USER;
34
+ return MMU_USER_IDX;
35
#else
36
return loongarch_cpu_mmu_index(env_cpu(env), ifetch);
37
#endif
38
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/loongarch/cpu.c
41
+++ b/target/loongarch/cpu.c
42
@@ -XXX,XX +XXX,XX @@ int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch)
43
if (FIELD_EX64(env->CSR_CRMD, CSR_CRMD, PG)) {
44
return FIELD_EX64(env->CSR_CRMD, CSR_CRMD, PLV);
45
}
14
}
46
- return MMU_IDX_DA;
15
- return false;
47
+ return MMU_DA_IDX;
16
+ return finish_folding(ctx, op);
48
}
17
}
49
18
50
static void loongarch_la464_initfn(Object *obj)
19
static bool fold_cmpsel_vec(OptContext *ctx, TCGOp *op)
51
diff --git a/target/loongarch/tcg/tlb_helper.c b/target/loongarch/tcg/tlb_helper.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/target/loongarch/tcg/tlb_helper.c
54
+++ b/target/loongarch/tcg/tlb_helper.c
55
@@ -XXX,XX +XXX,XX @@ static int get_physical_address(CPULoongArchState *env, hwaddr *physical,
56
int *prot, target_ulong address,
57
MMUAccessType access_type, int mmu_idx)
58
{
59
- int user_mode = mmu_idx == MMU_IDX_USER;
60
- int kernel_mode = mmu_idx == MMU_IDX_KERNEL;
61
+ int user_mode = mmu_idx == MMU_USER_IDX;
62
+ int kernel_mode = mmu_idx == MMU_KERNEL_IDX;
63
uint32_t plv, base_c, base_v;
64
int64_t addr_high;
65
uint8_t da = FIELD_EX64(env->CSR_CRMD, CSR_CRMD, DA);
66
diff --git a/target/loongarch/tcg/translate.c b/target/loongarch/tcg/translate.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/target/loongarch/tcg/translate.c
69
+++ b/target/loongarch/tcg/translate.c
70
@@ -XXX,XX +XXX,XX @@ static void loongarch_tr_init_disas_context(DisasContextBase *dcbase,
71
if (ctx->base.tb->flags & HW_FLAGS_CRMD_PG) {
72
ctx->mem_idx = ctx->plv;
73
} else {
74
- ctx->mem_idx = MMU_IDX_DA;
75
+ ctx->mem_idx = MMU_DA_IDX;
76
}
77
78
/* Bound the number of insns to execute to those left on the page. */
79
diff --git a/target/loongarch/tcg/insn_trans/trans_privileged.c.inc b/target/loongarch/tcg/insn_trans/trans_privileged.c.inc
80
index XXXXXXX..XXXXXXX 100644
81
--- a/target/loongarch/tcg/insn_trans/trans_privileged.c.inc
82
+++ b/target/loongarch/tcg/insn_trans/trans_privileged.c.inc
83
@@ -XXX,XX +XXX,XX @@ TRANS(iocsrwr_d, IOCSR, gen_iocsrwr, gen_helper_iocsrwr_d)
84
85
static void check_mmu_idx(DisasContext *ctx)
86
{
87
- if (ctx->mem_idx != MMU_IDX_DA) {
88
+ if (ctx->mem_idx != MMU_DA_IDX) {
89
tcg_gen_movi_tl(cpu_pc, ctx->base.pc_next + 4);
90
ctx->base.is_jmp = DISAS_EXIT;
91
}
92
--
20
--
93
2.34.1
21
2.43.0
94
95
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
3
---
4
target/i386/cpu.h | 13 ++++++-------
4
tcg/optimize.c | 2 +-
5
target/i386/cpu.c | 10 ++++++++++
5
1 file changed, 1 insertion(+), 1 deletion(-)
6
2 files changed, 16 insertions(+), 7 deletions(-)
7
6
8
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
index XXXXXXX..XXXXXXX 100644
8
index XXXXXXX..XXXXXXX 100644
10
--- a/target/i386/cpu.h
9
--- a/tcg/optimize.c
11
+++ b/target/i386/cpu.h
10
+++ b/tcg/optimize.c
12
@@ -XXX,XX +XXX,XX @@ uint64_t cpu_get_tsc(CPUX86State *env);
11
@@ -XXX,XX +XXX,XX @@ static bool fold_cmpsel_vec(OptContext *ctx, TCGOp *op)
13
#define MMU_NESTED_IDX 3
12
if (swap_commutative(op->args[0], &op->args[4], &op->args[3])) {
14
#define MMU_PHYS_IDX 4
13
op->args[5] = tcg_invert_cond(op->args[5]);
15
14
}
16
-static inline int cpu_mmu_index(CPUX86State *env, bool ifetch)
15
- return false;
17
-{
16
+ return finish_folding(ctx, op);
18
- return (env->hflags & HF_CPL_MASK) == 3 ? MMU_USER_IDX :
19
- (!(env->hflags & HF_SMAP_MASK) || (env->eflags & AC_MASK))
20
- ? MMU_KNOSMAP_IDX : MMU_KSMAP_IDX;
21
-}
22
-
23
static inline int cpu_mmu_index_kernel(CPUX86State *env)
24
{
25
return !(env->hflags & HF_SMAP_MASK) ? MMU_KNOSMAP_IDX :
26
@@ -XXX,XX +XXX,XX @@ static inline int cpu_mmu_index_kernel(CPUX86State *env)
27
#include "hw/i386/apic.h"
28
#endif
29
30
+int x86_cpu_mmu_index(CPUState *cs, bool ifetch);
31
+static inline int cpu_mmu_index(CPUX86State *env, bool ifetch)
32
+{
33
+ return x86_cpu_mmu_index(env_cpu(env), ifetch);
34
+}
35
+
36
static inline void cpu_get_tb_cpu_state(CPUX86State *env, vaddr *pc,
37
uint64_t *cs_base, uint32_t *flags)
38
{
39
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
40
index XXXXXXX..XXXXXXX 100644
41
--- a/target/i386/cpu.c
42
+++ b/target/i386/cpu.c
43
@@ -XXX,XX +XXX,XX @@ static bool x86_cpu_has_work(CPUState *cs)
44
return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
45
}
17
}
46
18
47
+int x86_cpu_mmu_index(CPUState *cs, bool ifetch)
19
static bool fold_sextract(OptContext *ctx, TCGOp *op)
48
+{
49
+ CPUX86State *env = cpu_env(cs);
50
+
51
+ return (env->hflags & HF_CPL_MASK) == 3 ? MMU_USER_IDX :
52
+ (!(env->hflags & HF_SMAP_MASK) || (env->eflags & AC_MASK))
53
+ ? MMU_KNOSMAP_IDX : MMU_KSMAP_IDX;
54
+}
55
+
56
static void x86_disas_set_info(CPUState *cs, disassemble_info *info)
57
{
58
X86CPU *cpu = X86_CPU(cs);
59
@@ -XXX,XX +XXX,XX @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
60
cc->class_by_name = x86_cpu_class_by_name;
61
cc->parse_features = x86_cpu_parse_featurestr;
62
cc->has_work = x86_cpu_has_work;
63
+ cc->mmu_index = x86_cpu_mmu_index;
64
cc->dump_state = x86_cpu_dump_state;
65
cc->set_pc = x86_cpu_set_pc;
66
cc->get_pc = x86_cpu_get_pc;
67
--
20
--
68
2.34.1
21
2.43.0
69
70
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
target/cris/cpu.c | 6 ++++++
6
tcg/optimize.c | 24 +++++++++---------------
5
1 file changed, 6 insertions(+)
7
1 file changed, 9 insertions(+), 15 deletions(-)
6
8
7
diff --git a/target/cris/cpu.c b/target/cris/cpu.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
9
--- a/target/cris/cpu.c
11
--- a/tcg/optimize.c
10
+++ b/target/cris/cpu.c
12
+++ b/tcg/optimize.c
11
@@ -XXX,XX +XXX,XX @@ static bool cris_cpu_has_work(CPUState *cs)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_cmpsel_vec(OptContext *ctx, TCGOp *op)
12
return cs->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI);
14
static bool fold_sextract(OptContext *ctx, TCGOp *op)
15
{
16
uint64_t z_mask, s_mask, s_mask_old;
17
+ TempOptInfo *t1 = arg_info(op->args[1]);
18
int pos = op->args[2];
19
int len = op->args[3];
20
21
- if (arg_is_const(op->args[1])) {
22
- uint64_t t;
23
-
24
- t = arg_info(op->args[1])->val;
25
- t = sextract64(t, pos, len);
26
- return tcg_opt_gen_movi(ctx, op, op->args[0], t);
27
+ if (ti_is_const(t1)) {
28
+ return tcg_opt_gen_movi(ctx, op, op->args[0],
29
+ sextract64(ti_const_val(t1), pos, len));
30
}
31
32
- z_mask = arg_info(op->args[1])->z_mask;
33
- z_mask = sextract64(z_mask, pos, len);
34
- ctx->z_mask = z_mask;
35
-
36
- s_mask_old = arg_info(op->args[1])->s_mask;
37
- s_mask = sextract64(s_mask_old, pos, len);
38
- s_mask |= MAKE_64BIT_MASK(len, 64 - len);
39
- ctx->s_mask = s_mask;
40
+ s_mask_old = t1->s_mask;
41
+ s_mask = s_mask_old >> pos;
42
+ s_mask |= -1ull << (len - 1);
43
44
if (0 && pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
45
return true;
46
}
47
48
- return fold_masks(ctx, op);
49
+ z_mask = sextract64(t1->z_mask, pos, len);
50
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
13
}
51
}
14
52
15
+static int cris_cpu_mmu_index(CPUState *cs, bool ifetch)
53
static bool fold_shift(OptContext *ctx, TCGOp *op)
16
+{
17
+ return !!(cpu_env(cs)->pregs[PR_CCS] & U_FLAG);
18
+}
19
+
20
static void cris_cpu_reset_hold(Object *obj)
21
{
22
CPUState *s = CPU(obj);
23
@@ -XXX,XX +XXX,XX @@ static void cris_cpu_class_init(ObjectClass *oc, void *data)
24
25
cc->class_by_name = cris_cpu_class_by_name;
26
cc->has_work = cris_cpu_has_work;
27
+ cc->mmu_index = cris_cpu_mmu_index;
28
cc->dump_state = cris_cpu_dump_state;
29
cc->set_pc = cris_cpu_set_pc;
30
cc->get_pc = cris_cpu_get_pc;
31
--
54
--
32
2.34.1
55
2.43.0
33
34
diff view generated by jsdifflib
1
Align the operation to the 32-byte cacheline.
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
Use 2 pair of i128 instead of 8 pair of i32.
3
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
6
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
7
Message-Id: <20231103173841.33651-2-richard.henderson@linaro.org>
8
---
5
---
9
target/sparc/translate.c | 43 +++++++++++++++++++++++-----------------
6
tcg/optimize.c | 27 ++++++++++++++-------------
10
1 file changed, 25 insertions(+), 18 deletions(-)
7
1 file changed, 14 insertions(+), 13 deletions(-)
11
8
12
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
13
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
14
--- a/target/sparc/translate.c
11
--- a/tcg/optimize.c
15
+++ b/target/sparc/translate.c
12
+++ b/tcg/optimize.c
16
@@ -XXX,XX +XXX,XX @@ static void gen_st_asi(DisasContext *dc, DisasASI *da, TCGv src, TCGv addr)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_sextract(OptContext *ctx, TCGOp *op)
17
14
static bool fold_shift(OptContext *ctx, TCGOp *op)
18
case GET_ASI_BCOPY:
15
{
19
assert(TARGET_LONG_BITS == 32);
16
uint64_t s_mask, z_mask, sign;
20
- /* Copy 32 bytes from the address in SRC to ADDR. */
17
+ TempOptInfo *t1, *t2;
21
- /* ??? The original qemu code suggests 4-byte alignment, dropping
18
22
- the low bits, but the only place I can see this used is in the
19
if (fold_const2(ctx, op) ||
23
- Linux kernel with 32 byte alignment, which would make more sense
20
fold_ix_to_i(ctx, op, 0) ||
24
- as a cacheline-style operation. */
21
@@ -XXX,XX +XXX,XX @@ static bool fold_shift(OptContext *ctx, TCGOp *op)
25
+ /*
22
return true;
26
+ * Copy 32 bytes from the address in SRC to ADDR.
23
}
27
+ *
24
28
+ * From Ross RT625 hyperSPARC manual, section 4.6:
25
- s_mask = arg_info(op->args[1])->s_mask;
29
+ * "Block Copy and Block Fill will work only on cache line boundaries."
26
- z_mask = arg_info(op->args[1])->z_mask;
30
+ *
27
+ t1 = arg_info(op->args[1]);
31
+ * It does not specify if an unaliged address is truncated or trapped.
28
+ t2 = arg_info(op->args[2]);
32
+ * Previous qemu behaviour was to truncate to 4 byte alignment, which
29
+ s_mask = t1->s_mask;
33
+ * is obviously wrong. The only place I can see this used is in the
30
+ z_mask = t1->z_mask;
34
+ * Linux kernel which begins with page alignment, advancing by 32,
31
35
+ * so is always aligned. Assume truncation as the simpler option.
32
- if (arg_is_const(op->args[2])) {
36
+ *
33
- int sh = arg_info(op->args[2])->val;
37
+ * Since the loads and stores are paired, allow the copy to happen
34
-
38
+ * in the host endianness. The copy need not be atomic.
35
- ctx->z_mask = do_constant_folding(op->opc, ctx->type, z_mask, sh);
39
+ */
36
+ if (ti_is_const(t2)) {
40
{
37
+ int sh = ti_const_val(t2);
41
+ MemOp mop = MO_128 | MO_ATOM_IFALIGN_PAIR;
38
42
TCGv saddr = tcg_temp_new();
39
+ z_mask = do_constant_folding(op->opc, ctx->type, z_mask, sh);
43
TCGv daddr = tcg_temp_new();
40
s_mask = do_constant_folding(op->opc, ctx->type, s_mask, sh);
44
- TCGv four = tcg_constant_tl(4);
41
45
- TCGv_i32 tmp = tcg_temp_new_i32();
42
- return fold_masks(ctx, op);
46
- int i;
43
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
47
+ TCGv_i128 tmp = tcg_temp_new_i128();
44
}
48
45
49
- tcg_gen_andi_tl(saddr, src, -4);
46
switch (op->opc) {
50
- tcg_gen_andi_tl(daddr, addr, -4);
47
@@ -XXX,XX +XXX,XX @@ static bool fold_shift(OptContext *ctx, TCGOp *op)
51
- for (i = 0; i < 32; i += 4) {
48
* Arithmetic right shift will not reduce the number of
52
- /* Since the loads and stores are paired, allow the
49
* input sign repetitions.
53
- copy to happen in the host endianness. */
50
*/
54
- tcg_gen_qemu_ld_i32(tmp, saddr, da->mem_idx, MO_UL);
51
- ctx->s_mask = s_mask;
55
- tcg_gen_qemu_st_i32(tmp, daddr, da->mem_idx, MO_UL);
52
- break;
56
- tcg_gen_add_tl(saddr, saddr, four);
53
+ return fold_masks_s(ctx, op, s_mask);
57
- tcg_gen_add_tl(daddr, daddr, four);
54
CASE_OP_32_64(shr):
58
- }
55
/*
59
+ tcg_gen_andi_tl(saddr, src, -32);
56
* If the sign bit is known zero, then logical right shift
60
+ tcg_gen_andi_tl(daddr, addr, -32);
57
- * will not reduced the number of input sign repetitions.
61
+ tcg_gen_qemu_ld_i128(tmp, saddr, da->mem_idx, mop);
58
+ * will not reduce the number of input sign repetitions.
62
+ tcg_gen_qemu_st_i128(tmp, daddr, da->mem_idx, mop);
59
*/
63
+ tcg_gen_addi_tl(saddr, saddr, 16);
60
- sign = (s_mask & -s_mask) >> 1;
64
+ tcg_gen_addi_tl(daddr, daddr, 16);
61
+ sign = -s_mask;
65
+ tcg_gen_qemu_ld_i128(tmp, saddr, da->mem_idx, mop);
62
if (sign && !(z_mask & sign)) {
66
+ tcg_gen_qemu_st_i128(tmp, daddr, da->mem_idx, mop);
63
- ctx->s_mask = s_mask;
64
+ return fold_masks_s(ctx, op, s_mask);
67
}
65
}
68
break;
66
break;
69
67
default:
68
break;
69
}
70
71
- return false;
72
+ return finish_folding(ctx, op);
73
}
74
75
static bool fold_sub_to_neg(OptContext *ctx, TCGOp *op)
70
--
76
--
71
2.34.1
77
2.43.0
diff view generated by jsdifflib
1
Align the operation to the 32-byte cacheline.
1
Merge the two conditions, sign != 0 && !(z_mask & sign),
2
Use 2 i128 instead of 4 i64.
2
by testing ~z_mask & sign. If sign == 0, the logical and
3
will produce false.
3
4
5
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
6
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
7
Message-Id: <20231103173841.33651-3-richard.henderson@linaro.org>
8
---
7
---
9
target/sparc/translate.c | 29 ++++++++++++++---------------
8
tcg/optimize.c | 5 ++---
10
1 file changed, 14 insertions(+), 15 deletions(-)
9
1 file changed, 2 insertions(+), 3 deletions(-)
11
10
12
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
11
diff --git a/tcg/optimize.c b/tcg/optimize.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/target/sparc/translate.c
13
--- a/tcg/optimize.c
15
+++ b/target/sparc/translate.c
14
+++ b/tcg/optimize.c
16
@@ -XXX,XX +XXX,XX @@ static void gen_stda_asi(DisasContext *dc, DisasASI *da, TCGv addr, int rd)
15
@@ -XXX,XX +XXX,XX @@ static bool fold_sextract(OptContext *ctx, TCGOp *op)
17
16
18
case GET_ASI_BFILL:
17
static bool fold_shift(OptContext *ctx, TCGOp *op)
19
assert(TARGET_LONG_BITS == 32);
18
{
20
- /* Store 32 bytes of T64 to ADDR. */
19
- uint64_t s_mask, z_mask, sign;
21
- /* ??? The original qemu code suggests 8-byte alignment, dropping
20
+ uint64_t s_mask, z_mask;
22
- the low bits, but the only place I can see this used is in the
21
TempOptInfo *t1, *t2;
23
- Linux kernel with 32 byte alignment, which would make more sense
22
24
- as a cacheline-style operation. */
23
if (fold_const2(ctx, op) ||
25
+ /*
24
@@ -XXX,XX +XXX,XX @@ static bool fold_shift(OptContext *ctx, TCGOp *op)
26
+ * Store 32 bytes of [rd:rd+1] to ADDR.
25
* If the sign bit is known zero, then logical right shift
27
+ * See comments for GET_ASI_COPY above.
26
* will not reduce the number of input sign repetitions.
28
+ */
27
*/
29
{
28
- sign = -s_mask;
30
- TCGv_i64 t64 = tcg_temp_new_i64();
29
- if (sign && !(z_mask & sign)) {
31
- TCGv d_addr = tcg_temp_new();
30
+ if (~z_mask & -s_mask) {
32
- TCGv eight = tcg_constant_tl(8);
31
return fold_masks_s(ctx, op, s_mask);
33
- int i;
34
+ MemOp mop = MO_TE | MO_128 | MO_ATOM_IFALIGN_PAIR;
35
+ TCGv_i64 t8 = tcg_temp_new_i64();
36
+ TCGv_i128 t16 = tcg_temp_new_i128();
37
+ TCGv daddr = tcg_temp_new();
38
39
- tcg_gen_concat_tl_i64(t64, lo, hi);
40
- tcg_gen_andi_tl(d_addr, addr, -8);
41
- for (i = 0; i < 32; i += 8) {
42
- tcg_gen_qemu_st_i64(t64, d_addr, da->mem_idx, da->memop);
43
- tcg_gen_add_tl(d_addr, d_addr, eight);
44
- }
45
+ tcg_gen_concat_tl_i64(t8, lo, hi);
46
+ tcg_gen_concat_i64_i128(t16, t8, t8);
47
+ tcg_gen_andi_tl(daddr, addr, -32);
48
+ tcg_gen_qemu_st_i128(t16, daddr, da->mem_idx, mop);
49
+ tcg_gen_addi_tl(daddr, daddr, 16);
50
+ tcg_gen_qemu_st_i128(t16, daddr, da->mem_idx, mop);
51
}
32
}
52
break;
33
break;
53
54
--
34
--
55
2.34.1
35
2.43.0
diff view generated by jsdifflib
1
Duplicate fold_sub_vec into fold_sub instead of calling it,
2
now that fold_sub_vec always returns true.
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
3
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
4
Message-Id: <20231103173841.33651-7-richard.henderson@linaro.org>
5
---
6
---
6
target/sparc/helper.h | 2 +-
7
tcg/optimize.c | 9 ++++++---
7
target/sparc/fop_helper.c | 26 ++++++++++++++++++++++++--
8
1 file changed, 6 insertions(+), 3 deletions(-)
8
target/sparc/translate.c | 12 +++++++-----
9
3 files changed, 32 insertions(+), 8 deletions(-)
10
9
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
12
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
12
--- a/tcg/optimize.c
14
+++ b/target/sparc/helper.h
13
+++ b/tcg/optimize.c
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fcmps, TCG_CALL_NO_WG, tl, env, f32, f32)
14
@@ -XXX,XX +XXX,XX @@ static bool fold_sub_vec(OptContext *ctx, TCGOp *op)
16
DEF_HELPER_FLAGS_3(fcmpd, TCG_CALL_NO_WG, tl, env, f64, f64)
15
fold_sub_to_neg(ctx, op)) {
17
DEF_HELPER_FLAGS_3(fcmpes, TCG_CALL_NO_WG, tl, env, f32, f32)
18
DEF_HELPER_FLAGS_3(fcmped, TCG_CALL_NO_WG, tl, env, f64, f64)
19
-DEF_HELPER_FLAGS_1(fsqrtq, TCG_CALL_NO_RWG, void, env)
20
+DEF_HELPER_FLAGS_2(fsqrtq, TCG_CALL_NO_RWG, i128, env, i128)
21
DEF_HELPER_FLAGS_1(fcmpq, TCG_CALL_NO_WG, tl, env)
22
DEF_HELPER_FLAGS_1(fcmpeq, TCG_CALL_NO_WG, tl, env)
23
#ifdef TARGET_SPARC64
24
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/target/sparc/fop_helper.c
27
+++ b/target/sparc/fop_helper.c
28
@@ -XXX,XX +XXX,XX @@
29
#define QT0 (env->qt0)
30
#define QT1 (env->qt1)
31
32
+static inline float128 f128_in(Int128 i)
33
+{
34
+ union {
35
+ Int128 i;
36
+ float128 f;
37
+ } u;
38
+
39
+ u.i = i;
40
+ return u.f;
41
+}
42
+
43
+static inline Int128 f128_ret(float128 f)
44
+{
45
+ union {
46
+ Int128 i;
47
+ float128 f;
48
+ } u;
49
+
50
+ u.f = f;
51
+ return u.i;
52
+}
53
+
54
static target_ulong do_check_ieee_exceptions(CPUSPARCState *env, uintptr_t ra)
55
{
56
target_ulong status = get_float_exception_flags(&env->fp_status);
57
@@ -XXX,XX +XXX,XX @@ float64 helper_fsqrtd(CPUSPARCState *env, float64 src)
58
return float64_sqrt(src, &env->fp_status);
59
}
60
61
-void helper_fsqrtq(CPUSPARCState *env)
62
+Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
63
{
64
- QT0 = float128_sqrt(QT1, &env->fp_status);
65
+ return f128_ret(float128_sqrt(f128_in(src), &env->fp_status));
66
}
67
68
#define GEN_FCMP(name, size, reg1, reg2, FS, E) \
69
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
70
index XXXXXXX..XXXXXXX 100644
71
--- a/target/sparc/translate.c
72
+++ b/target/sparc/translate.c
73
@@ -XXX,XX +XXX,XX @@ TRANS(FNEGq, 64, do_qq, a, gen_op_fnegq)
74
TRANS(FABSq, 64, do_qq, a, gen_op_fabsq)
75
76
static bool do_env_qq(DisasContext *dc, arg_r_r *a,
77
- void (*func)(TCGv_env))
78
+ void (*func)(TCGv_i128, TCGv_env, TCGv_i128))
79
{
80
+ TCGv_i128 t;
81
+
82
if (gen_trap_ifnofpu(dc)) {
83
return true;
16
return true;
84
}
17
}
85
@@ -XXX,XX +XXX,XX @@ static bool do_env_qq(DisasContext *dc, arg_r_r *a,
18
- return false;
19
+ return finish_folding(ctx, op);
20
}
21
22
static bool fold_sub(OptContext *ctx, TCGOp *op)
23
{
24
- if (fold_const2(ctx, op) || fold_sub_vec(ctx, op)) {
25
+ if (fold_const2(ctx, op) ||
26
+ fold_xx_to_i(ctx, op, 0) ||
27
+ fold_xi_to_x(ctx, op, 0) ||
28
+ fold_sub_to_neg(ctx, op)) {
29
return true;
86
}
30
}
87
31
88
gen_op_clear_ieee_excp_and_FTT();
32
@@ -XXX,XX +XXX,XX @@ static bool fold_sub(OptContext *ctx, TCGOp *op)
89
- gen_op_load_fpr_QT1(QFPREG(a->rs));
33
? INDEX_op_add_i32 : INDEX_op_add_i64);
90
- func(tcg_env);
34
op->args[2] = arg_new_constant(ctx, -val);
91
+
35
}
92
+ t = gen_load_fpr_Q(dc, a->rs);
36
- return false;
93
+ func(t, tcg_env, t);
37
+ return finish_folding(ctx, op);
94
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
95
- gen_op_store_QT0_fpr(QFPREG(a->rd));
96
- gen_update_fprs_dirty(dc, QFPREG(a->rd));
97
+ gen_store_fpr_Q(dc, a->rd, t);
98
return advance_pc(dc);
99
}
38
}
100
39
40
static bool fold_sub2(OptContext *ctx, TCGOp *op)
101
--
41
--
102
2.34.1
42
2.43.0
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Avoid the use of the OptContext slots.
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
target/arm/cpu.c | 6 ++++++
6
tcg/optimize.c | 16 +++++++++-------
5
1 file changed, 6 insertions(+)
7
1 file changed, 9 insertions(+), 7 deletions(-)
6
8
7
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
9
--- a/target/arm/cpu.c
11
--- a/tcg/optimize.c
10
+++ b/target/arm/cpu.c
12
+++ b/tcg/optimize.c
11
@@ -XXX,XX +XXX,XX @@ static bool arm_cpu_has_work(CPUState *cs)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_sub2(OptContext *ctx, TCGOp *op)
12
| CPU_INTERRUPT_EXITTB);
14
15
static bool fold_tcg_ld(OptContext *ctx, TCGOp *op)
16
{
17
+ uint64_t z_mask = -1, s_mask = 0;
18
+
19
/* We can't do any folding with a load, but we can record bits. */
20
switch (op->opc) {
21
CASE_OP_32_64(ld8s):
22
- ctx->s_mask = MAKE_64BIT_MASK(8, 56);
23
+ s_mask = INT8_MIN;
24
break;
25
CASE_OP_32_64(ld8u):
26
- ctx->z_mask = MAKE_64BIT_MASK(0, 8);
27
+ z_mask = MAKE_64BIT_MASK(0, 8);
28
break;
29
CASE_OP_32_64(ld16s):
30
- ctx->s_mask = MAKE_64BIT_MASK(16, 48);
31
+ s_mask = INT16_MIN;
32
break;
33
CASE_OP_32_64(ld16u):
34
- ctx->z_mask = MAKE_64BIT_MASK(0, 16);
35
+ z_mask = MAKE_64BIT_MASK(0, 16);
36
break;
37
case INDEX_op_ld32s_i64:
38
- ctx->s_mask = MAKE_64BIT_MASK(32, 32);
39
+ s_mask = INT32_MIN;
40
break;
41
case INDEX_op_ld32u_i64:
42
- ctx->z_mask = MAKE_64BIT_MASK(0, 32);
43
+ z_mask = MAKE_64BIT_MASK(0, 32);
44
break;
45
default:
46
g_assert_not_reached();
47
}
48
- return false;
49
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
13
}
50
}
14
51
15
+static int arm_cpu_mmu_index(CPUState *cs, bool ifetch)
52
static bool fold_tcg_ld_memcopy(OptContext *ctx, TCGOp *op)
16
+{
17
+ return arm_env_mmu_index(cpu_env(cs));
18
+}
19
+
20
void arm_register_pre_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
21
void *opaque)
22
{
23
@@ -XXX,XX +XXX,XX @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
24
25
cc->class_by_name = arm_cpu_class_by_name;
26
cc->has_work = arm_cpu_has_work;
27
+ cc->mmu_index = arm_cpu_mmu_index;
28
cc->dump_state = arm_cpu_dump_state;
29
cc->set_pc = arm_cpu_set_pc;
30
cc->get_pc = arm_cpu_get_pc;
31
--
53
--
32
2.34.1
54
2.43.0
33
34
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
3
---
4
target/s390x/cpu.h | 4 +++-
4
tcg/optimize.c | 2 +-
5
target/s390x/tcg/mem_helper.c | 34 ++++++++++++++++++----------------
5
1 file changed, 1 insertion(+), 1 deletion(-)
6
2 files changed, 21 insertions(+), 17 deletions(-)
7
6
8
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
index XXXXXXX..XXXXXXX 100644
8
index XXXXXXX..XXXXXXX 100644
10
--- a/target/s390x/cpu.h
9
--- a/tcg/optimize.c
11
+++ b/target/s390x/cpu.h
10
+++ b/tcg/optimize.c
12
@@ -XXX,XX +XXX,XX @@ extern const VMStateDescription vmstate_s390_cpu;
11
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_ld_memcopy(OptContext *ctx, TCGOp *op)
13
#define MMU_HOME_IDX 2
12
TCGType type;
14
#define MMU_REAL_IDX 3
13
15
14
if (op->args[1] != tcgv_ptr_arg(tcg_env)) {
16
-static inline int cpu_mmu_index(CPUS390XState *env, bool ifetch)
15
- return false;
17
+static inline int s390x_env_mmu_index(CPUS390XState *env, bool ifetch)
16
+ return finish_folding(ctx, op);
18
{
19
#ifdef CONFIG_USER_ONLY
20
return MMU_USER_IDX;
21
@@ -XXX,XX +XXX,XX @@ static inline int cpu_mmu_index(CPUS390XState *env, bool ifetch)
22
#endif
23
}
24
25
+#define cpu_mmu_index s390x_env_mmu_index
26
+
27
#ifdef CONFIG_TCG
28
29
#include "tcg/tcg_s390x.h"
30
diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/s390x/tcg/mem_helper.c
33
+++ b/target/s390x/tcg/mem_helper.c
34
@@ -XXX,XX +XXX,XX @@ static int mmu_idx_from_as(uint8_t as)
35
static uint32_t do_helper_nc(CPUS390XState *env, uint32_t l, uint64_t dest,
36
uint64_t src, uintptr_t ra)
37
{
38
- const int mmu_idx = cpu_mmu_index(env, false);
39
+ const int mmu_idx = s390x_env_mmu_index(env, false);
40
S390Access srca1, srca2, desta;
41
uint32_t i;
42
uint8_t c = 0;
43
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(nc)(CPUS390XState *env, uint32_t l, uint64_t dest,
44
static uint32_t do_helper_xc(CPUS390XState *env, uint32_t l, uint64_t dest,
45
uint64_t src, uintptr_t ra)
46
{
47
- const int mmu_idx = cpu_mmu_index(env, false);
48
+ const int mmu_idx = s390x_env_mmu_index(env, false);
49
S390Access srca1, srca2, desta;
50
uint32_t i;
51
uint8_t c = 0;
52
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(xc)(CPUS390XState *env, uint32_t l, uint64_t dest,
53
static uint32_t do_helper_oc(CPUS390XState *env, uint32_t l, uint64_t dest,
54
uint64_t src, uintptr_t ra)
55
{
56
- const int mmu_idx = cpu_mmu_index(env, false);
57
+ const int mmu_idx = s390x_env_mmu_index(env, false);
58
S390Access srca1, srca2, desta;
59
uint32_t i;
60
uint8_t c = 0;
61
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(oc)(CPUS390XState *env, uint32_t l, uint64_t dest,
62
static uint32_t do_helper_mvc(CPUS390XState *env, uint32_t l, uint64_t dest,
63
uint64_t src, uintptr_t ra)
64
{
65
- const int mmu_idx = cpu_mmu_index(env, false);
66
+ const int mmu_idx = s390x_env_mmu_index(env, false);
67
S390Access srca, desta;
68
uint32_t i;
69
70
@@ -XXX,XX +XXX,XX @@ void HELPER(mvc)(CPUS390XState *env, uint32_t l, uint64_t dest, uint64_t src)
71
/* move right to left */
72
void HELPER(mvcrl)(CPUS390XState *env, uint64_t l, uint64_t dest, uint64_t src)
73
{
74
- const int mmu_idx = cpu_mmu_index(env, false);
75
+ const int mmu_idx = s390x_env_mmu_index(env, false);
76
const uint64_t ra = GETPC();
77
S390Access srca, desta;
78
int32_t i;
79
@@ -XXX,XX +XXX,XX @@ void HELPER(mvcrl)(CPUS390XState *env, uint64_t l, uint64_t dest, uint64_t src)
80
/* move inverse */
81
void HELPER(mvcin)(CPUS390XState *env, uint32_t l, uint64_t dest, uint64_t src)
82
{
83
- const int mmu_idx = cpu_mmu_index(env, false);
84
+ const int mmu_idx = s390x_env_mmu_index(env, false);
85
S390Access srca, desta;
86
uintptr_t ra = GETPC();
87
int i;
88
@@ -XXX,XX +XXX,XX @@ void HELPER(mvcin)(CPUS390XState *env, uint32_t l, uint64_t dest, uint64_t src)
89
/* move numerics */
90
void HELPER(mvn)(CPUS390XState *env, uint32_t l, uint64_t dest, uint64_t src)
91
{
92
- const int mmu_idx = cpu_mmu_index(env, false);
93
+ const int mmu_idx = s390x_env_mmu_index(env, false);
94
S390Access srca1, srca2, desta;
95
uintptr_t ra = GETPC();
96
int i;
97
@@ -XXX,XX +XXX,XX @@ void HELPER(mvn)(CPUS390XState *env, uint32_t l, uint64_t dest, uint64_t src)
98
/* move with offset */
99
void HELPER(mvo)(CPUS390XState *env, uint32_t l, uint64_t dest, uint64_t src)
100
{
101
- const int mmu_idx = cpu_mmu_index(env, false);
102
+ const int mmu_idx = s390x_env_mmu_index(env, false);
103
/* MVO always processes one more byte than specified - maximum is 16 */
104
const int len_dest = (l >> 4) + 1;
105
const int len_src = (l & 0xf) + 1;
106
@@ -XXX,XX +XXX,XX @@ void HELPER(mvo)(CPUS390XState *env, uint32_t l, uint64_t dest, uint64_t src)
107
/* move zones */
108
void HELPER(mvz)(CPUS390XState *env, uint32_t l, uint64_t dest, uint64_t src)
109
{
110
- const int mmu_idx = cpu_mmu_index(env, false);
111
+ const int mmu_idx = s390x_env_mmu_index(env, false);
112
S390Access srca1, srca2, desta;
113
uintptr_t ra = GETPC();
114
int i;
115
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(clm)(CPUS390XState *env, uint32_t r1, uint32_t mask,
116
117
if (!mask) {
118
/* Recognize access exceptions for the first byte */
119
- probe_read(env, addr, 1, cpu_mmu_index(env, false), ra);
120
+ probe_read(env, addr, 1, s390x_env_mmu_index(env, false), ra);
121
}
17
}
122
18
123
while (mask) {
19
type = ctx->type;
124
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(mvpg)(CPUS390XState *env, uint64_t r0, uint32_t r1, uint32_t r2)
125
{
126
const uint64_t src = get_address(env, r2) & TARGET_PAGE_MASK;
127
const uint64_t dst = get_address(env, r1) & TARGET_PAGE_MASK;
128
- const int mmu_idx = cpu_mmu_index(env, false);
129
+ const int mmu_idx = s390x_env_mmu_index(env, false);
130
const bool f = extract64(r0, 11, 1);
131
const bool s = extract64(r0, 10, 1);
132
const bool cco = extract64(r0, 8, 1);
133
@@ -XXX,XX +XXX,XX @@ inject_exc:
134
/* string copy */
135
uint32_t HELPER(mvst)(CPUS390XState *env, uint32_t r1, uint32_t r2)
136
{
137
- const int mmu_idx = cpu_mmu_index(env, false);
138
+ const int mmu_idx = s390x_env_mmu_index(env, false);
139
const uint64_t d = get_address(env, r1);
140
const uint64_t s = get_address(env, r2);
141
const uint8_t c = env->regs[0];
142
@@ -XXX,XX +XXX,XX @@ static inline uint32_t do_mvcl(CPUS390XState *env,
143
uint64_t *src, uint64_t *srclen,
144
uint16_t pad, int wordsize, uintptr_t ra)
145
{
146
- const int mmu_idx = cpu_mmu_index(env, false);
147
+ const int mmu_idx = s390x_env_mmu_index(env, false);
148
int len = MIN(*destlen, -(*dest | TARGET_PAGE_MASK));
149
S390Access srca, desta;
150
int i, cc;
151
@@ -XXX,XX +XXX,XX @@ static inline uint32_t do_mvcl(CPUS390XState *env,
152
/* move long */
153
uint32_t HELPER(mvcl)(CPUS390XState *env, uint32_t r1, uint32_t r2)
154
{
155
- const int mmu_idx = cpu_mmu_index(env, false);
156
+ const int mmu_idx = s390x_env_mmu_index(env, false);
157
uintptr_t ra = GETPC();
158
uint64_t destlen = env->regs[r1 + 1] & 0xffffff;
159
uint64_t dest = get_address(env, r1);
160
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(trXX)(CPUS390XState *env, uint32_t r1, uint32_t r2,
161
static uint32_t do_csst(CPUS390XState *env, uint32_t r3, uint64_t a1,
162
uint64_t a2, bool parallel)
163
{
164
- uint32_t mem_idx = cpu_mmu_index(env, false);
165
+ uint32_t mem_idx = s390x_env_mmu_index(env, false);
166
MemOpIdx oi16 = make_memop_idx(MO_TE | MO_128, mem_idx);
167
MemOpIdx oi8 = make_memop_idx(MO_TE | MO_64, mem_idx);
168
MemOpIdx oi4 = make_memop_idx(MO_TE | MO_32, mem_idx);
169
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(cu42)(CPUS390XState *env, uint32_t r1, uint32_t r2, uint32_t m3)
170
void probe_write_access(CPUS390XState *env, uint64_t addr, uint64_t len,
171
uintptr_t ra)
172
{
173
+ const int mmu_idx = s390x_env_mmu_index(env, false);
174
+
175
/* test the actual access, not just any access to the page due to LAP */
176
while (len) {
177
const uint64_t pagelen = -(addr | TARGET_PAGE_MASK);
178
const uint64_t curlen = MIN(pagelen, len);
179
180
- probe_write(env, addr, curlen, cpu_mmu_index(env, false), ra);
181
+ probe_write(env, addr, curlen, mmu_idx, ra);
182
addr = wrap_address(env, addr + curlen);
183
len -= curlen;
184
}
185
--
20
--
186
2.34.1
21
2.43.0
187
188
diff view generated by jsdifflib
1
Replace with tcg_temp_new_i32.
1
Avoid the use of the OptContext slots. Find TempOptInfo once.
2
Remove fold_masks as the function becomes unused.
2
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
6
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
7
Message-Id: <20231103173841.33651-4-richard.henderson@linaro.org>
8
---
6
---
9
target/sparc/translate.c | 17 ++++++-----------
7
tcg/optimize.c | 18 ++++++++----------
10
1 file changed, 6 insertions(+), 11 deletions(-)
8
1 file changed, 8 insertions(+), 10 deletions(-)
11
9
12
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
13
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
14
--- a/target/sparc/translate.c
12
--- a/tcg/optimize.c
15
+++ b/target/sparc/translate.c
13
+++ b/tcg/optimize.c
16
@@ -XXX,XX +XXX,XX @@ static void gen_store_fpr_F(DisasContext *dc, unsigned int dst, TCGv_i32 v)
14
@@ -XXX,XX +XXX,XX @@ static bool fold_masks_s(OptContext *ctx, TCGOp *op, uint64_t s_mask)
17
gen_update_fprs_dirty(dc, dst);
15
return fold_masks_zs(ctx, op, -1, s_mask);
18
}
16
}
19
17
20
-static TCGv_i32 gen_dest_fpr_F(DisasContext *dc)
18
-static bool fold_masks(OptContext *ctx, TCGOp *op)
21
-{
19
-{
22
- return tcg_temp_new_i32();
20
- return fold_masks_zs(ctx, op, ctx->z_mask, ctx->s_mask);
23
-}
21
-}
24
-
22
-
25
static TCGv_i64 gen_load_fpr_D(DisasContext *dc, unsigned int src)
23
/*
24
* An "affected" mask bit is 0 if and only if the result is identical
25
* to the first input. Thus if the entire mask is 0, the operation
26
@@ -XXX,XX +XXX,XX @@ static bool fold_tcg_st_memcopy(OptContext *ctx, TCGOp *op)
27
28
static bool fold_xor(OptContext *ctx, TCGOp *op)
26
{
29
{
27
src = DFPREG(src);
30
+ uint64_t z_mask, s_mask;
28
@@ -XXX,XX +XXX,XX @@ static void gen_ldf_asi(DisasContext *dc, DisasASI *da, MemOp orig_size,
31
+ TempOptInfo *t1, *t2;
29
memop |= MO_ALIGN_4;
32
+
30
switch (size) {
33
if (fold_const2_commutative(ctx, op) ||
31
case MO_32:
34
fold_xx_to_i(ctx, op, 0) ||
32
- d32 = gen_dest_fpr_F(dc);
35
fold_xi_to_x(ctx, op, 0) ||
33
+ d32 = tcg_temp_new_i32();
36
@@ -XXX,XX +XXX,XX @@ static bool fold_xor(OptContext *ctx, TCGOp *op)
34
tcg_gen_qemu_ld_i32(d32, addr, da->mem_idx, memop);
35
gen_store_fpr_F(dc, rd, d32);
36
break;
37
@@ -XXX,XX +XXX,XX @@ static void gen_ldf_asi(DisasContext *dc, DisasASI *da, MemOp orig_size,
38
case MO_32:
39
d64 = tcg_temp_new_i64();
40
gen_helper_ld_asi(d64, tcg_env, addr, r_asi, r_mop);
41
- d32 = gen_dest_fpr_F(dc);
42
+ d32 = tcg_temp_new_i32();
43
tcg_gen_extrl_i64_i32(d32, d64);
44
gen_store_fpr_F(dc, rd, d32);
45
break;
46
@@ -XXX,XX +XXX,XX @@ static void gen_fmovs(DisasContext *dc, DisasCompare *cmp, int rd, int rs)
47
48
s1 = gen_load_fpr_F(dc, rs);
49
s2 = gen_load_fpr_F(dc, rd);
50
- dst = gen_dest_fpr_F(dc);
51
+ dst = tcg_temp_new_i32();
52
zero = tcg_constant_i32(0);
53
54
tcg_gen_movcond_i32(TCG_COND_NE, dst, c32, zero, s1, s2);
55
@@ -XXX,XX +XXX,XX @@ static bool do_fd(DisasContext *dc, arg_r_r *a,
56
return true;
37
return true;
57
}
38
}
58
39
59
- dst = gen_dest_fpr_F(dc);
40
- ctx->z_mask = arg_info(op->args[1])->z_mask
60
+ dst = tcg_temp_new_i32();
41
- | arg_info(op->args[2])->z_mask;
61
src = gen_load_fpr_D(dc, a->rs);
42
- ctx->s_mask = arg_info(op->args[1])->s_mask
62
func(dst, src);
43
- & arg_info(op->args[2])->s_mask;
63
gen_store_fpr_F(dc, a->rd, dst);
44
- return fold_masks(ctx, op);
64
@@ -XXX,XX +XXX,XX @@ static bool do_env_fd(DisasContext *dc, arg_r_r *a,
45
+ t1 = arg_info(op->args[1]);
65
}
46
+ t2 = arg_info(op->args[2]);
66
47
+ z_mask = t1->z_mask | t2->z_mask;
67
gen_op_clear_ieee_excp_and_FTT();
48
+ s_mask = t1->s_mask & t2->s_mask;
68
- dst = gen_dest_fpr_F(dc);
49
+ return fold_masks_zs(ctx, op, z_mask, s_mask);
69
+ dst = tcg_temp_new_i32();
50
}
70
src = gen_load_fpr_D(dc, a->rs);
51
71
func(dst, tcg_env, src);
52
static bool fold_bitsel_vec(OptContext *ctx, TCGOp *op)
72
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
73
@@ -XXX,XX +XXX,XX @@ static bool do_env_fq(DisasContext *dc, arg_r_r *a,
74
75
gen_op_clear_ieee_excp_and_FTT();
76
gen_op_load_fpr_QT1(QFPREG(a->rs));
77
- dst = gen_dest_fpr_F(dc);
78
+ dst = tcg_temp_new_i32();
79
func(dst, tcg_env);
80
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
81
gen_store_fpr_F(dc, a->rd, dst);
82
--
53
--
83
2.34.1
54
2.43.0
84
85
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
3
---
4
target/alpha/cpu.c | 6 ++++++
4
tcg/optimize.c | 2 +-
5
1 file changed, 6 insertions(+)
5
1 file changed, 1 insertion(+), 1 deletion(-)
6
6
7
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
7
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
index XXXXXXX..XXXXXXX 100644
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/alpha/cpu.c
9
--- a/tcg/optimize.c
10
+++ b/target/alpha/cpu.c
10
+++ b/tcg/optimize.c
11
@@ -XXX,XX +XXX,XX @@ static bool alpha_cpu_has_work(CPUState *cs)
11
@@ -XXX,XX +XXX,XX @@ static bool fold_bitsel_vec(OptContext *ctx, TCGOp *op)
12
| CPU_INTERRUPT_MCHK);
12
return fold_orc(ctx, op);
13
}
14
}
15
- return false;
16
+ return finish_folding(ctx, op);
13
}
17
}
14
18
15
+static int alpha_cpu_mmu_index(CPUState *cs, bool ifetch)
19
/* Propagate constants and copies, fold constant expressions. */
16
+{
17
+ return alpha_env_mmu_index(cpu_env(cs));
18
+}
19
+
20
static void alpha_cpu_disas_set_info(CPUState *cpu, disassemble_info *info)
21
{
22
info->mach = bfd_mach_alpha_ev6;
23
@@ -XXX,XX +XXX,XX @@ static void alpha_cpu_class_init(ObjectClass *oc, void *data)
24
25
cc->class_by_name = alpha_cpu_class_by_name;
26
cc->has_work = alpha_cpu_has_work;
27
+ cc->mmu_index = alpha_cpu_mmu_index;
28
cc->dump_state = alpha_cpu_dump_state;
29
cc->set_pc = alpha_cpu_set_pc;
30
cc->get_pc = alpha_cpu_get_pc;
31
--
20
--
32
2.34.1
21
2.43.0
33
34
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
All non-default cases now finish folding within each function.
2
Do the same with the default case and assert it is done after.
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
6
---
4
include/exec/cpu-all.h | 2 +-
7
tcg/optimize.c | 6 ++----
5
include/exec/cpu-common.h | 3 +--
8
1 file changed, 2 insertions(+), 4 deletions(-)
6
target/sparc/cpu.h | 2 +-
7
accel/tcg/cputlb.c | 22 +++++++++-------
8
semihosting/uaccess.c | 2 +-
9
target/cris/translate.c | 2 +-
10
target/hppa/mem_helper.c | 2 +-
11
target/hppa/op_helper.c | 8 +++---
12
target/i386/tcg/translate.c | 2 +-
13
target/loongarch/tcg/tlb_helper.c | 4 +--
14
target/m68k/op_helper.c | 2 +-
15
target/microblaze/helper.c | 3 +--
16
target/microblaze/mmu.c | 2 +-
17
target/microblaze/translate.c | 2 +-
18
target/nios2/translate.c | 2 +-
19
target/openrisc/translate.c | 2 +-
20
target/sparc/ldst_helper.c | 2 +-
21
target/sparc/mmu_helper.c | 2 +-
22
target/tricore/helper.c | 2 +-
23
target/tricore/translate.c | 2 +-
24
target/xtensa/mmu_helper.c | 2 +-
25
accel/tcg/ldst_common.c.inc | 42 ++++++++++++++++++++-----------
26
22 files changed, 65 insertions(+), 49 deletions(-)
27
9
28
diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
29
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
30
--- a/include/exec/cpu-all.h
12
--- a/tcg/optimize.c
31
+++ b/include/exec/cpu-all.h
13
+++ b/tcg/optimize.c
32
@@ -XXX,XX +XXX,XX @@ CPUArchState *cpu_copy(CPUArchState *env);
14
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
33
#define TLB_MMIO (1 << (TARGET_PAGE_BITS_MIN - 2))
15
done = true;
34
#define TLB_WATCHPOINT 0
16
break;
35
17
default:
36
-static inline int cpu_mmu_index(CPUArchState *env, bool ifetch)
18
+ done = finish_folding(&ctx, op);
37
+static inline int cpu_mmu_index(CPUState *cs, bool ifetch)
19
break;
38
{
20
}
39
return MMU_USER_IDX;
21
-
40
}
22
- if (!done) {
41
diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
23
- finish_folding(&ctx, op);
42
index XXXXXXX..XXXXXXX 100644
24
- }
43
--- a/include/exec/cpu-common.h
25
+ tcg_debug_assert(done);
44
+++ b/include/exec/cpu-common.h
45
@@ -XXX,XX +XXX,XX @@ static inline CPUState *env_cpu(CPUArchState *env)
46
* The user-only version of this function is inline in cpu-all.h,
47
* where it always returns MMU_USER_IDX.
48
*/
49
-static inline int cpu_mmu_index(CPUArchState *env, bool ifetch)
50
+static inline int cpu_mmu_index(CPUState *cs, bool ifetch)
51
{
52
- CPUState *cs = env_cpu(env);
53
int ret = cs->cc->mmu_index(cs, ifetch);
54
tcg_debug_assert(ret >= 0 && ret < NB_MMU_MODES);
55
return ret;
56
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
57
index XXXXXXX..XXXXXXX 100644
58
--- a/target/sparc/cpu.h
59
+++ b/target/sparc/cpu.h
60
@@ -XXX,XX +XXX,XX @@ static inline void cpu_get_tb_cpu_state(CPUSPARCState *env, vaddr *pc,
61
uint32_t flags;
62
*pc = env->pc;
63
*cs_base = env->npc;
64
- flags = cpu_mmu_index(env, false);
65
+ flags = cpu_mmu_index(env_cpu(env), false);
66
#ifndef CONFIG_USER_ONLY
67
if (cpu_supervisor_mode(env)) {
68
flags |= TB_FLAG_SUPER;
69
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
70
index XXXXXXX..XXXXXXX 100644
71
--- a/accel/tcg/cputlb.c
72
+++ b/accel/tcg/cputlb.c
73
@@ -XXX,XX +XXX,XX @@ tb_page_addr_t get_page_addr_code_hostp(CPUArchState *env, vaddr addr,
74
void *p;
75
76
(void)probe_access_internal(env_cpu(env), addr, 1, MMU_INST_FETCH,
77
- cpu_mmu_index(env, true), false,
78
+ cpu_mmu_index(env_cpu(env), true), false,
79
&p, &full, 0, false);
80
if (p == NULL) {
81
return -1;
82
@@ -XXX,XX +XXX,XX @@ static void do_st16_mmu(CPUState *cpu, vaddr addr, Int128 val,
83
84
uint32_t cpu_ldub_code(CPUArchState *env, abi_ptr addr)
85
{
86
- MemOpIdx oi = make_memop_idx(MO_UB, cpu_mmu_index(env, true));
87
- return do_ld1_mmu(env_cpu(env), addr, oi, 0, MMU_INST_FETCH);
88
+ CPUState *cs = env_cpu(env);
89
+ MemOpIdx oi = make_memop_idx(MO_UB, cpu_mmu_index(cs, true));
90
+ return do_ld1_mmu(cs, addr, oi, 0, MMU_INST_FETCH);
91
}
92
93
uint32_t cpu_lduw_code(CPUArchState *env, abi_ptr addr)
94
{
95
- MemOpIdx oi = make_memop_idx(MO_TEUW, cpu_mmu_index(env, true));
96
- return do_ld2_mmu(env_cpu(env), addr, oi, 0, MMU_INST_FETCH);
97
+ CPUState *cs = env_cpu(env);
98
+ MemOpIdx oi = make_memop_idx(MO_TEUW, cpu_mmu_index(cs, true));
99
+ return do_ld2_mmu(cs, addr, oi, 0, MMU_INST_FETCH);
100
}
101
102
uint32_t cpu_ldl_code(CPUArchState *env, abi_ptr addr)
103
{
104
- MemOpIdx oi = make_memop_idx(MO_TEUL, cpu_mmu_index(env, true));
105
- return do_ld4_mmu(env_cpu(env), addr, oi, 0, MMU_INST_FETCH);
106
+ CPUState *cs = env_cpu(env);
107
+ MemOpIdx oi = make_memop_idx(MO_TEUL, cpu_mmu_index(cs, true));
108
+ return do_ld4_mmu(cs, addr, oi, 0, MMU_INST_FETCH);
109
}
110
111
uint64_t cpu_ldq_code(CPUArchState *env, abi_ptr addr)
112
{
113
- MemOpIdx oi = make_memop_idx(MO_TEUQ, cpu_mmu_index(env, true));
114
- return do_ld8_mmu(env_cpu(env), addr, oi, 0, MMU_INST_FETCH);
115
+ CPUState *cs = env_cpu(env);
116
+ MemOpIdx oi = make_memop_idx(MO_TEUQ, cpu_mmu_index(cs, true));
117
+ return do_ld8_mmu(cs, addr, oi, 0, MMU_INST_FETCH);
118
}
119
120
uint8_t cpu_ldb_code_mmu(CPUArchState *env, abi_ptr addr,
121
diff --git a/semihosting/uaccess.c b/semihosting/uaccess.c
122
index XXXXXXX..XXXXXXX 100644
123
--- a/semihosting/uaccess.c
124
+++ b/semihosting/uaccess.c
125
@@ -XXX,XX +XXX,XX @@ void *uaccess_lock_user(CPUArchState *env, target_ulong addr,
126
127
ssize_t uaccess_strlen_user(CPUArchState *env, target_ulong addr)
128
{
129
- int mmu_idx = cpu_mmu_index(env, false);
130
+ int mmu_idx = cpu_mmu_index(env_cpu(env), false);
131
size_t len = 0;
132
133
while (1) {
134
diff --git a/target/cris/translate.c b/target/cris/translate.c
135
index XXXXXXX..XXXXXXX 100644
136
--- a/target/cris/translate.c
137
+++ b/target/cris/translate.c
138
@@ -XXX,XX +XXX,XX @@ static void cris_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
139
dc->cpu = env_archcpu(env);
140
dc->ppc = pc_start;
141
dc->pc = pc_start;
142
- dc->mem_index = cpu_mmu_index(env, false);
143
+ dc->mem_index = cpu_mmu_index(cs, false);
144
dc->flags_uptodate = 1;
145
dc->flags_x = tb_flags & X_FLAG;
146
dc->cc_x_uptodate = 0;
147
diff --git a/target/hppa/mem_helper.c b/target/hppa/mem_helper.c
148
index XXXXXXX..XXXXXXX 100644
149
--- a/target/hppa/mem_helper.c
150
+++ b/target/hppa/mem_helper.c
151
@@ -XXX,XX +XXX,XX @@ int hppa_artype_for_page(CPUHPPAState *env, target_ulong vaddr)
152
void HELPER(diag_btlb)(CPUHPPAState *env)
153
{
154
unsigned int phys_page, len, slot;
155
- int mmu_idx = cpu_mmu_index(env, 0);
156
+ int mmu_idx = cpu_mmu_index(env_cpu(env), 0);
157
uintptr_t ra = GETPC();
158
HPPATLBEntry *btlb;
159
uint64_t virt_page;
160
diff --git a/target/hppa/op_helper.c b/target/hppa/op_helper.c
161
index XXXXXXX..XXXXXXX 100644
162
--- a/target/hppa/op_helper.c
163
+++ b/target/hppa/op_helper.c
164
@@ -XXX,XX +XXX,XX @@ void HELPER(tcond)(CPUHPPAState *env, target_ulong cond)
165
static void atomic_store_mask32(CPUHPPAState *env, target_ulong addr,
166
uint32_t val, uint32_t mask, uintptr_t ra)
167
{
168
- int mmu_idx = cpu_mmu_index(env, 0);
169
+ int mmu_idx = cpu_mmu_index(env_cpu(env), 0);
170
uint32_t old, new, cmp, *haddr;
171
void *vaddr;
172
173
@@ -XXX,XX +XXX,XX @@ static void atomic_store_mask64(CPUHPPAState *env, target_ulong addr,
174
int size, uintptr_t ra)
175
{
176
#ifdef CONFIG_ATOMIC64
177
- int mmu_idx = cpu_mmu_index(env, 0);
178
+ int mmu_idx = cpu_mmu_index(env_cpu(env), 0);
179
uint64_t old, new, cmp, *haddr;
180
void *vaddr;
181
182
@@ -XXX,XX +XXX,XX @@ static void do_stby_e(CPUHPPAState *env, target_ulong addr, target_ulong val,
183
default:
184
/* Nothing is stored, but protection is checked and the
185
cacheline is marked dirty. */
186
- probe_write(env, addr, 0, cpu_mmu_index(env, 0), ra);
187
+ probe_write(env, addr, 0, cpu_mmu_index(env_cpu(env), 0), ra);
188
break;
189
}
26
}
190
}
27
}
191
@@ -XXX,XX +XXX,XX @@ static void do_stdby_e(CPUHPPAState *env, target_ulong addr, uint64_t val,
192
default:
193
/* Nothing is stored, but protection is checked and the
194
cacheline is marked dirty. */
195
- probe_write(env, addr, 0, cpu_mmu_index(env, 0), ra);
196
+ probe_write(env, addr, 0, cpu_mmu_index(env_cpu(env), 0), ra);
197
break;
198
}
199
}
200
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
201
index XXXXXXX..XXXXXXX 100644
202
--- a/target/i386/tcg/translate.c
203
+++ b/target/i386/tcg/translate.c
204
@@ -XXX,XX +XXX,XX @@ static void i386_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu)
205
dc->cc_op_dirty = false;
206
dc->popl_esp_hack = 0;
207
/* select memory access functions */
208
- dc->mem_index = cpu_mmu_index(env, false);
209
+ dc->mem_index = cpu_mmu_index(cpu, false);
210
dc->cpuid_features = env->features[FEAT_1_EDX];
211
dc->cpuid_ext_features = env->features[FEAT_1_ECX];
212
dc->cpuid_ext2_features = env->features[FEAT_8000_0001_EDX];
213
diff --git a/target/loongarch/tcg/tlb_helper.c b/target/loongarch/tcg/tlb_helper.c
214
index XXXXXXX..XXXXXXX 100644
215
--- a/target/loongarch/tcg/tlb_helper.c
216
+++ b/target/loongarch/tcg/tlb_helper.c
217
@@ -XXX,XX +XXX,XX @@ hwaddr loongarch_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
218
int prot;
219
220
if (get_physical_address(env, &phys_addr, &prot, addr, MMU_DATA_LOAD,
221
- cpu_mmu_index(env, false)) != 0) {
222
+ cpu_mmu_index(cs, false)) != 0) {
223
return -1;
224
}
225
return phys_addr;
226
@@ -XXX,XX +XXX,XX @@ static void invalidate_tlb_entry(CPULoongArchState *env, int index)
227
uint8_t tlb_ps;
228
LoongArchTLB *tlb = &env->tlb[index];
229
230
- int mmu_idx = cpu_mmu_index(env, false);
231
+ int mmu_idx = cpu_mmu_index(env_cpu(env), false);
232
uint8_t tlb_v0 = FIELD_EX64(tlb->tlb_entry0, TLBENTRY, V);
233
uint8_t tlb_v1 = FIELD_EX64(tlb->tlb_entry1, TLBENTRY, V);
234
uint64_t tlb_vppn = FIELD_EX64(tlb->tlb_misc, TLB_MISC, VPPN);
235
diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c
236
index XXXXXXX..XXXXXXX 100644
237
--- a/target/m68k/op_helper.c
238
+++ b/target/m68k/op_helper.c
239
@@ -XXX,XX +XXX,XX @@ static void do_cas2l(CPUM68KState *env, uint32_t regs, uint32_t a1, uint32_t a2,
240
uint32_t l1, l2;
241
uintptr_t ra = GETPC();
242
#if defined(CONFIG_ATOMIC64)
243
- int mmu_idx = cpu_mmu_index(env, 0);
244
+ int mmu_idx = cpu_mmu_index(env_cpu(env), 0);
245
MemOpIdx oi = make_memop_idx(MO_BEUQ, mmu_idx);
246
#endif
247
248
diff --git a/target/microblaze/helper.c b/target/microblaze/helper.c
249
index XXXXXXX..XXXXXXX 100644
250
--- a/target/microblaze/helper.c
251
+++ b/target/microblaze/helper.c
252
@@ -XXX,XX +XXX,XX @@ hwaddr mb_cpu_get_phys_page_attrs_debug(CPUState *cs, vaddr addr,
253
MemTxAttrs *attrs)
254
{
255
MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs);
256
- CPUMBState *env = &cpu->env;
257
target_ulong vaddr, paddr = 0;
258
MicroBlazeMMULookup lu;
259
- int mmu_idx = cpu_mmu_index(env, false);
260
+ int mmu_idx = cpu_mmu_index(cs, false);
261
unsigned int hit;
262
263
/* Caller doesn't initialize */
264
diff --git a/target/microblaze/mmu.c b/target/microblaze/mmu.c
265
index XXXXXXX..XXXXXXX 100644
266
--- a/target/microblaze/mmu.c
267
+++ b/target/microblaze/mmu.c
268
@@ -XXX,XX +XXX,XX @@ void mmu_write(CPUMBState *env, bool ext, uint32_t rn, uint32_t v)
269
}
270
271
hit = mmu_translate(cpu, &lu, v & TLB_EPN_MASK,
272
- 0, cpu_mmu_index(env, false));
273
+ 0, cpu_mmu_index(env_cpu(env), false));
274
if (hit) {
275
env->mmu.regs[MMU_R_TLBX] = lu.idx;
276
} else {
277
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
278
index XXXXXXX..XXXXXXX 100644
279
--- a/target/microblaze/translate.c
280
+++ b/target/microblaze/translate.c
281
@@ -XXX,XX +XXX,XX @@ static void mb_tr_init_disas_context(DisasContextBase *dcb, CPUState *cs)
282
dc->ext_imm = dc->base.tb->cs_base;
283
dc->r0 = NULL;
284
dc->r0_set = false;
285
- dc->mem_index = cpu_mmu_index(&cpu->env, false);
286
+ dc->mem_index = cpu_mmu_index(cs, false);
287
dc->jmp_cond = dc->tb_flags & D_FLAG ? TCG_COND_ALWAYS : TCG_COND_NEVER;
288
dc->jmp_dest = -1;
289
290
diff --git a/target/nios2/translate.c b/target/nios2/translate.c
291
index XXXXXXX..XXXXXXX 100644
292
--- a/target/nios2/translate.c
293
+++ b/target/nios2/translate.c
294
@@ -XXX,XX +XXX,XX @@ static void nios2_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
295
Nios2CPU *cpu = env_archcpu(env);
296
int page_insns;
297
298
- dc->mem_idx = cpu_mmu_index(env, false);
299
+ dc->mem_idx = cpu_mmu_index(cs, false);
300
dc->cr_state = cpu->cr_state;
301
dc->tb_flags = dc->base.tb->flags;
302
dc->eic_present = cpu->eic_present;
303
diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c
304
index XXXXXXX..XXXXXXX 100644
305
--- a/target/openrisc/translate.c
306
+++ b/target/openrisc/translate.c
307
@@ -XXX,XX +XXX,XX @@ static void openrisc_tr_init_disas_context(DisasContextBase *dcb, CPUState *cs)
308
CPUOpenRISCState *env = cpu_env(cs);
309
int bound;
310
311
- dc->mem_idx = cpu_mmu_index(env, false);
312
+ dc->mem_idx = cpu_mmu_index(cs, false);
313
dc->tb_flags = dc->base.tb->flags;
314
dc->delayed_branch = (dc->tb_flags & TB_FLAGS_DFLAG) != 0;
315
dc->cpucfgr = env->cpucfgr;
316
diff --git a/target/sparc/ldst_helper.c b/target/sparc/ldst_helper.c
317
index XXXXXXX..XXXXXXX 100644
318
--- a/target/sparc/ldst_helper.c
319
+++ b/target/sparc/ldst_helper.c
320
@@ -XXX,XX +XXX,XX @@ uint64_t helper_ld_asi(CPUSPARCState *env, target_ulong addr,
321
case ASI_M_IODIAG: /* Turbosparc IOTLB Diagnostic */
322
break;
323
case ASI_KERNELTXT: /* Supervisor code access */
324
- oi = make_memop_idx(memop, cpu_mmu_index(env, true));
325
+ oi = make_memop_idx(memop, cpu_mmu_index(env_cpu(env), true));
326
switch (size) {
327
case 1:
328
ret = cpu_ldb_code_mmu(env, addr, oi, GETPC());
329
diff --git a/target/sparc/mmu_helper.c b/target/sparc/mmu_helper.c
330
index XXXXXXX..XXXXXXX 100644
331
--- a/target/sparc/mmu_helper.c
332
+++ b/target/sparc/mmu_helper.c
333
@@ -XXX,XX +XXX,XX @@ hwaddr sparc_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
334
SPARCCPU *cpu = SPARC_CPU(cs);
335
CPUSPARCState *env = &cpu->env;
336
hwaddr phys_addr;
337
- int mmu_idx = cpu_mmu_index(env, false);
338
+ int mmu_idx = cpu_mmu_index(cs, false);
339
340
if (cpu_sparc_get_phys_page(env, &phys_addr, addr, 2, mmu_idx) != 0) {
341
if (cpu_sparc_get_phys_page(env, &phys_addr, addr, 0, mmu_idx) != 0) {
342
diff --git a/target/tricore/helper.c b/target/tricore/helper.c
343
index XXXXXXX..XXXXXXX 100644
344
--- a/target/tricore/helper.c
345
+++ b/target/tricore/helper.c
346
@@ -XXX,XX +XXX,XX @@ hwaddr tricore_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
347
TriCoreCPU *cpu = TRICORE_CPU(cs);
348
hwaddr phys_addr;
349
int prot;
350
- int mmu_idx = cpu_mmu_index(&cpu->env, false);
351
+ int mmu_idx = cpu_mmu_index(cs, false);
352
353
if (get_physical_address(&cpu->env, &phys_addr, &prot, addr,
354
MMU_DATA_LOAD, mmu_idx)) {
355
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
356
index XXXXXXX..XXXXXXX 100644
357
--- a/target/tricore/translate.c
358
+++ b/target/tricore/translate.c
359
@@ -XXX,XX +XXX,XX @@ static void tricore_tr_init_disas_context(DisasContextBase *dcbase,
360
{
361
DisasContext *ctx = container_of(dcbase, DisasContext, base);
362
CPUTriCoreState *env = cpu_env(cs);
363
- ctx->mem_idx = cpu_mmu_index(env, false);
364
+ ctx->mem_idx = cpu_mmu_index(cs, false);
365
366
uint32_t tb_flags = (uint32_t)ctx->base.tb->flags;
367
ctx->priv = FIELD_EX32(tb_flags, TB_FLAGS, PRIV);
368
diff --git a/target/xtensa/mmu_helper.c b/target/xtensa/mmu_helper.c
369
index XXXXXXX..XXXXXXX 100644
370
--- a/target/xtensa/mmu_helper.c
371
+++ b/target/xtensa/mmu_helper.c
372
@@ -XXX,XX +XXX,XX @@ void HELPER(itlb_hit_test)(CPUXtensaState *env, uint32_t vaddr)
373
* only the side-effects (ie any MMU or other exception)
374
*/
375
probe_access(env, vaddr, 1, MMU_INST_FETCH,
376
- cpu_mmu_index(env, true), GETPC());
377
+ cpu_mmu_index(env_cpu(env), true), GETPC());
378
}
379
380
void HELPER(wsr_rasid)(CPUXtensaState *env, uint32_t v)
381
diff --git a/accel/tcg/ldst_common.c.inc b/accel/tcg/ldst_common.c.inc
382
index XXXXXXX..XXXXXXX 100644
383
--- a/accel/tcg/ldst_common.c.inc
384
+++ b/accel/tcg/ldst_common.c.inc
385
@@ -XXX,XX +XXX,XX @@ void cpu_stq_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint64_t val,
386
387
uint32_t cpu_ldub_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
388
{
389
- return cpu_ldub_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
390
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
391
+ return cpu_ldub_mmuidx_ra(env, addr, mmu_index, ra);
392
}
393
394
int cpu_ldsb_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
395
@@ -XXX,XX +XXX,XX @@ int cpu_ldsb_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
396
397
uint32_t cpu_lduw_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
398
{
399
- return cpu_lduw_be_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
400
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
401
+ return cpu_lduw_be_mmuidx_ra(env, addr, mmu_index, ra);
402
}
403
404
int cpu_ldsw_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
405
@@ -XXX,XX +XXX,XX @@ int cpu_ldsw_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
406
407
uint32_t cpu_ldl_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
408
{
409
- return cpu_ldl_be_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
410
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
411
+ return cpu_ldl_be_mmuidx_ra(env, addr, mmu_index, ra);
412
}
413
414
uint64_t cpu_ldq_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
415
{
416
- return cpu_ldq_be_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
417
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
418
+ return cpu_ldq_be_mmuidx_ra(env, addr, mmu_index, ra);
419
}
420
421
uint32_t cpu_lduw_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
422
{
423
- return cpu_lduw_le_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
424
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
425
+ return cpu_lduw_le_mmuidx_ra(env, addr, mmu_index, ra);
426
}
427
428
int cpu_ldsw_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
429
@@ -XXX,XX +XXX,XX @@ int cpu_ldsw_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
430
431
uint32_t cpu_ldl_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
432
{
433
- return cpu_ldl_le_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
434
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
435
+ return cpu_ldl_le_mmuidx_ra(env, addr, mmu_index, ra);
436
}
437
438
uint64_t cpu_ldq_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
439
{
440
- return cpu_ldq_le_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
441
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
442
+ return cpu_ldq_le_mmuidx_ra(env, addr, mmu_index, ra);
443
}
444
445
void cpu_stb_data_ra(CPUArchState *env, abi_ptr addr,
446
uint32_t val, uintptr_t ra)
447
{
448
- cpu_stb_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
449
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
450
+ cpu_stb_mmuidx_ra(env, addr, val, mmu_index, ra);
451
}
452
453
void cpu_stw_be_data_ra(CPUArchState *env, abi_ptr addr,
454
uint32_t val, uintptr_t ra)
455
{
456
- cpu_stw_be_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
457
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
458
+ cpu_stw_be_mmuidx_ra(env, addr, val, mmu_index, ra);
459
}
460
461
void cpu_stl_be_data_ra(CPUArchState *env, abi_ptr addr,
462
uint32_t val, uintptr_t ra)
463
{
464
- cpu_stl_be_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
465
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
466
+ cpu_stl_be_mmuidx_ra(env, addr, val, mmu_index, ra);
467
}
468
469
void cpu_stq_be_data_ra(CPUArchState *env, abi_ptr addr,
470
uint64_t val, uintptr_t ra)
471
{
472
- cpu_stq_be_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
473
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
474
+ cpu_stq_be_mmuidx_ra(env, addr, val, mmu_index, ra);
475
}
476
477
void cpu_stw_le_data_ra(CPUArchState *env, abi_ptr addr,
478
uint32_t val, uintptr_t ra)
479
{
480
- cpu_stw_le_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
481
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
482
+ cpu_stw_le_mmuidx_ra(env, addr, val, mmu_index, ra);
483
}
484
485
void cpu_stl_le_data_ra(CPUArchState *env, abi_ptr addr,
486
uint32_t val, uintptr_t ra)
487
{
488
- cpu_stl_le_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
489
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
490
+ cpu_stl_le_mmuidx_ra(env, addr, val, mmu_index, ra);
491
}
492
493
void cpu_stq_le_data_ra(CPUArchState *env, abi_ptr addr,
494
uint64_t val, uintptr_t ra)
495
{
496
- cpu_stq_le_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
497
+ int mmu_index = cpu_mmu_index(env_cpu(env), false);
498
+ cpu_stq_le_mmuidx_ra(env, addr, val, mmu_index, ra);
499
}
500
501
/*--------------------------*/
502
--
28
--
503
2.34.1
29
2.43.0
504
505
diff view generated by jsdifflib
New patch
1
All mask setting is now done with parameters via fold_masks_*.
1
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
tcg/optimize.c | 13 -------------
7
1 file changed, 13 deletions(-)
8
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/tcg/optimize.c
12
+++ b/tcg/optimize.c
13
@@ -XXX,XX +XXX,XX @@ typedef struct OptContext {
14
QSIMPLEQ_HEAD(, MemCopyInfo) mem_free;
15
16
/* In flight values from optimization. */
17
- uint64_t z_mask; /* mask bit is 0 iff value bit is 0 */
18
- uint64_t s_mask; /* mask bit is 1 if value bit matches msb */
19
TCGType type;
20
} OptContext;
21
22
@@ -XXX,XX +XXX,XX @@ static bool finish_folding(OptContext *ctx, TCGOp *op)
23
for (i = 0; i < nb_oargs; i++) {
24
TCGTemp *ts = arg_temp(op->args[i]);
25
reset_ts(ctx, ts);
26
- /*
27
- * Save the corresponding known-zero/sign bits mask for the
28
- * first output argument (only one supported so far).
29
- */
30
- if (i == 0) {
31
- ts_info(ts)->z_mask = ctx->z_mask;
32
- }
33
}
34
return true;
35
}
36
@@ -XXX,XX +XXX,XX @@ void tcg_optimize(TCGContext *s)
37
ctx.type = TCG_TYPE_I32;
38
}
39
40
- /* Assume all bits affected, no bits known zero, no sign reps. */
41
- ctx.z_mask = -1;
42
- ctx.s_mask = 0;
43
-
44
/*
45
* Process each opcode.
46
* Sorted alphabetically by opcode as much as possible.
47
--
48
2.43.0
diff view generated by jsdifflib
1
If an exception is to be raised, the destination fp register
1
All instances of s_mask have been converted to the new
2
should be unmodified. The current implementation is incorrect,
2
representation. We can now re-enable usage.
3
in that double results will be written back before calling
4
gen_helper_check_ieee_exceptions, despite the placement of
5
gen_store_fpr_D, since gen_dest_fpr_D returns cpu_fpr[].
6
3
7
We can simplify the entire implementation by having each
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
8
FPOp helper call check_ieee_exceptions. For the moment this
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
requires that all FPop helpers write to the TCG global cpu_fsr,
6
---
10
so remove TCG_CALL_NO_WG from the DEF_HELPER_FLAGS_*.
7
tcg/optimize.c | 4 ++--
8
1 file changed, 2 insertions(+), 2 deletions(-)
11
9
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
13
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
14
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
15
Message-Id: <20231103173841.33651-19-richard.henderson@linaro.org>
16
---
17
target/sparc/helper.h | 119 +++++++++++----------
18
target/sparc/fop_helper.c | 215 ++++++++++++++++++++++++++++----------
19
target/sparc/translate.c | 14 ---
20
3 files changed, 219 insertions(+), 129 deletions(-)
21
22
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
23
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
24
--- a/target/sparc/helper.h
12
--- a/tcg/optimize.c
25
+++ b/target/sparc/helper.h
13
+++ b/tcg/optimize.c
26
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(tsubcctv, tl, env, tl, tl)
14
@@ -XXX,XX +XXX,XX @@ static bool fold_exts(OptContext *ctx, TCGOp *op)
27
DEF_HELPER_FLAGS_4(ld_asi, TCG_CALL_NO_WG, i64, env, tl, int, i32)
15
g_assert_not_reached();
28
DEF_HELPER_FLAGS_5(st_asi, TCG_CALL_NO_WG, void, env, tl, i64, int, i32)
29
#endif
30
-DEF_HELPER_FLAGS_1(check_ieee_exceptions, TCG_CALL_NO_WG, tl, env)
31
DEF_HELPER_FLAGS_1(get_fsr, TCG_CALL_NO_WG_SE, tl, env)
32
DEF_HELPER_FLAGS_2(set_fsr, TCG_CALL_NO_RWG, void, env, tl)
33
-DEF_HELPER_FLAGS_2(fsqrts, TCG_CALL_NO_RWG, f32, env, f32)
34
-DEF_HELPER_FLAGS_2(fsqrtd, TCG_CALL_NO_RWG, f64, env, f64)
35
-DEF_HELPER_FLAGS_3(fcmps, TCG_CALL_NO_WG, tl, env, f32, f32)
36
-DEF_HELPER_FLAGS_3(fcmpd, TCG_CALL_NO_WG, tl, env, f64, f64)
37
-DEF_HELPER_FLAGS_3(fcmpes, TCG_CALL_NO_WG, tl, env, f32, f32)
38
-DEF_HELPER_FLAGS_3(fcmped, TCG_CALL_NO_WG, tl, env, f64, f64)
39
-DEF_HELPER_FLAGS_2(fsqrtq, TCG_CALL_NO_RWG, i128, env, i128)
40
-DEF_HELPER_FLAGS_3(fcmpq, TCG_CALL_NO_WG, tl, env, i128, i128)
41
-DEF_HELPER_FLAGS_3(fcmpeq, TCG_CALL_NO_WG, tl, env, i128, i128)
42
+DEF_HELPER_FLAGS_2(fsqrts, 0, f32, env, f32)
43
+DEF_HELPER_FLAGS_2(fsqrtd, 0, f64, env, f64)
44
+DEF_HELPER_FLAGS_2(fsqrtq, 0, i128, env, i128)
45
+DEF_HELPER_FLAGS_3(fcmps, 0, tl, env, f32, f32)
46
+DEF_HELPER_FLAGS_3(fcmpd, 0, tl, env, f64, f64)
47
+DEF_HELPER_FLAGS_3(fcmpes, 0, tl, env, f32, f32)
48
+DEF_HELPER_FLAGS_3(fcmped, 0, tl, env, f64, f64)
49
+DEF_HELPER_FLAGS_3(fcmpq, 0, tl, env, i128, i128)
50
+DEF_HELPER_FLAGS_3(fcmpeq, 0, tl, env, i128, i128)
51
#ifdef TARGET_SPARC64
52
-DEF_HELPER_FLAGS_3(fcmps_fcc1, TCG_CALL_NO_WG, tl, env, f32, f32)
53
-DEF_HELPER_FLAGS_3(fcmps_fcc2, TCG_CALL_NO_WG, tl, env, f32, f32)
54
-DEF_HELPER_FLAGS_3(fcmps_fcc3, TCG_CALL_NO_WG, tl, env, f32, f32)
55
-DEF_HELPER_FLAGS_3(fcmpd_fcc1, TCG_CALL_NO_WG, tl, env, f64, f64)
56
-DEF_HELPER_FLAGS_3(fcmpd_fcc2, TCG_CALL_NO_WG, tl, env, f64, f64)
57
-DEF_HELPER_FLAGS_3(fcmpd_fcc3, TCG_CALL_NO_WG, tl, env, f64, f64)
58
-DEF_HELPER_FLAGS_3(fcmpes_fcc1, TCG_CALL_NO_WG, tl, env, f32, f32)
59
-DEF_HELPER_FLAGS_3(fcmpes_fcc2, TCG_CALL_NO_WG, tl, env, f32, f32)
60
-DEF_HELPER_FLAGS_3(fcmpes_fcc3, TCG_CALL_NO_WG, tl, env, f32, f32)
61
-DEF_HELPER_FLAGS_3(fcmped_fcc1, TCG_CALL_NO_WG, tl, env, f64, f64)
62
-DEF_HELPER_FLAGS_3(fcmped_fcc2, TCG_CALL_NO_WG, tl, env, f64, f64)
63
-DEF_HELPER_FLAGS_3(fcmped_fcc3, TCG_CALL_NO_WG, tl, env, f64, f64)
64
-DEF_HELPER_FLAGS_3(fcmpq_fcc1, TCG_CALL_NO_WG, tl, env, i128, i128)
65
-DEF_HELPER_FLAGS_3(fcmpq_fcc2, TCG_CALL_NO_WG, tl, env, i128, i128)
66
-DEF_HELPER_FLAGS_3(fcmpq_fcc3, TCG_CALL_NO_WG, tl, env, i128, i128)
67
-DEF_HELPER_FLAGS_3(fcmpeq_fcc1, TCG_CALL_NO_WG, tl, env, i128, i128)
68
-DEF_HELPER_FLAGS_3(fcmpeq_fcc2, TCG_CALL_NO_WG, tl, env, i128, i128)
69
-DEF_HELPER_FLAGS_3(fcmpeq_fcc3, TCG_CALL_NO_WG, tl, env, i128, i128)
70
+DEF_HELPER_FLAGS_3(fcmps_fcc1, 0, tl, env, f32, f32)
71
+DEF_HELPER_FLAGS_3(fcmps_fcc2, 0, tl, env, f32, f32)
72
+DEF_HELPER_FLAGS_3(fcmps_fcc3, 0, tl, env, f32, f32)
73
+DEF_HELPER_FLAGS_3(fcmpd_fcc1, 0, tl, env, f64, f64)
74
+DEF_HELPER_FLAGS_3(fcmpd_fcc2, 0, tl, env, f64, f64)
75
+DEF_HELPER_FLAGS_3(fcmpd_fcc3, 0, tl, env, f64, f64)
76
+DEF_HELPER_FLAGS_3(fcmpes_fcc1, 0, tl, env, f32, f32)
77
+DEF_HELPER_FLAGS_3(fcmpes_fcc2, 0, tl, env, f32, f32)
78
+DEF_HELPER_FLAGS_3(fcmpes_fcc3, 0, tl, env, f32, f32)
79
+DEF_HELPER_FLAGS_3(fcmped_fcc1, 0, tl, env, f64, f64)
80
+DEF_HELPER_FLAGS_3(fcmped_fcc2, 0, tl, env, f64, f64)
81
+DEF_HELPER_FLAGS_3(fcmped_fcc3, 0, tl, env, f64, f64)
82
+DEF_HELPER_FLAGS_3(fcmpq_fcc1, 0, tl, env, i128, i128)
83
+DEF_HELPER_FLAGS_3(fcmpq_fcc2, 0, tl, env, i128, i128)
84
+DEF_HELPER_FLAGS_3(fcmpq_fcc3, 0, tl, env, i128, i128)
85
+DEF_HELPER_FLAGS_3(fcmpeq_fcc1, 0, tl, env, i128, i128)
86
+DEF_HELPER_FLAGS_3(fcmpeq_fcc2, 0, tl, env, i128, i128)
87
+DEF_HELPER_FLAGS_3(fcmpeq_fcc3, 0, tl, env, i128, i128)
88
#endif
89
DEF_HELPER_2(raise_exception, noreturn, env, int)
90
91
-DEF_HELPER_FLAGS_3(faddd, TCG_CALL_NO_RWG, f64, env, f64, f64)
92
-DEF_HELPER_FLAGS_3(fsubd, TCG_CALL_NO_RWG, f64, env, f64, f64)
93
-DEF_HELPER_FLAGS_3(fmuld, TCG_CALL_NO_RWG, f64, env, f64, f64)
94
-DEF_HELPER_FLAGS_3(fdivd, TCG_CALL_NO_RWG, f64, env, f64, f64)
95
+DEF_HELPER_FLAGS_3(faddd, 0, f64, env, f64, f64)
96
+DEF_HELPER_FLAGS_3(fsubd, 0, f64, env, f64, f64)
97
+DEF_HELPER_FLAGS_3(fmuld, 0, f64, env, f64, f64)
98
+DEF_HELPER_FLAGS_3(fdivd, 0, f64, env, f64, f64)
99
100
-DEF_HELPER_FLAGS_3(faddq, TCG_CALL_NO_RWG, i128, env, i128, i128)
101
-DEF_HELPER_FLAGS_3(fsubq, TCG_CALL_NO_RWG, i128, env, i128, i128)
102
-DEF_HELPER_FLAGS_3(fmulq, TCG_CALL_NO_RWG, i128, env, i128, i128)
103
-DEF_HELPER_FLAGS_3(fdivq, TCG_CALL_NO_RWG, i128, env, i128, i128)
104
+DEF_HELPER_FLAGS_3(faddq, 0, i128, env, i128, i128)
105
+DEF_HELPER_FLAGS_3(fsubq, 0, i128, env, i128, i128)
106
+DEF_HELPER_FLAGS_3(fmulq, 0, i128, env, i128, i128)
107
+DEF_HELPER_FLAGS_3(fdivq, 0, i128, env, i128, i128)
108
109
-DEF_HELPER_FLAGS_3(fadds, TCG_CALL_NO_RWG, f32, env, f32, f32)
110
-DEF_HELPER_FLAGS_3(fsubs, TCG_CALL_NO_RWG, f32, env, f32, f32)
111
-DEF_HELPER_FLAGS_3(fmuls, TCG_CALL_NO_RWG, f32, env, f32, f32)
112
-DEF_HELPER_FLAGS_3(fdivs, TCG_CALL_NO_RWG, f32, env, f32, f32)
113
+DEF_HELPER_FLAGS_3(fadds, 0, f32, env, f32, f32)
114
+DEF_HELPER_FLAGS_3(fsubs, 0, f32, env, f32, f32)
115
+DEF_HELPER_FLAGS_3(fmuls, 0, f32, env, f32, f32)
116
+DEF_HELPER_FLAGS_3(fdivs, 0, f32, env, f32, f32)
117
118
-DEF_HELPER_FLAGS_3(fsmuld, TCG_CALL_NO_RWG, f64, env, f32, f32)
119
-DEF_HELPER_FLAGS_3(fdmulq, TCG_CALL_NO_RWG, i128, env, f64, f64)
120
+DEF_HELPER_FLAGS_3(fsmuld, 0, f64, env, f32, f32)
121
+DEF_HELPER_FLAGS_3(fdmulq, 0, i128, env, f64, f64)
122
123
-DEF_HELPER_FLAGS_2(fitod, TCG_CALL_NO_RWG_SE, f64, env, s32)
124
-DEF_HELPER_FLAGS_2(fitoq, TCG_CALL_NO_RWG, i128, env, s32)
125
+DEF_HELPER_FLAGS_2(fitod, 0, f64, env, s32)
126
+DEF_HELPER_FLAGS_2(fitoq, 0, i128, env, s32)
127
128
-DEF_HELPER_FLAGS_2(fitos, TCG_CALL_NO_RWG, f32, env, s32)
129
+DEF_HELPER_FLAGS_2(fitos, 0, f32, env, s32)
130
131
#ifdef TARGET_SPARC64
132
-DEF_HELPER_FLAGS_2(fxtos, TCG_CALL_NO_RWG, f32, env, s64)
133
-DEF_HELPER_FLAGS_2(fxtod, TCG_CALL_NO_RWG, f64, env, s64)
134
-DEF_HELPER_FLAGS_2(fxtoq, TCG_CALL_NO_RWG, i128, env, s64)
135
+DEF_HELPER_FLAGS_2(fxtos, 0, f32, env, s64)
136
+DEF_HELPER_FLAGS_2(fxtod, 0, f64, env, s64)
137
+DEF_HELPER_FLAGS_2(fxtoq, 0, i128, env, s64)
138
#endif
139
-DEF_HELPER_FLAGS_2(fdtos, TCG_CALL_NO_RWG, f32, env, f64)
140
-DEF_HELPER_FLAGS_2(fstod, TCG_CALL_NO_RWG, f64, env, f32)
141
-DEF_HELPER_FLAGS_2(fqtos, TCG_CALL_NO_RWG, f32, env, i128)
142
-DEF_HELPER_FLAGS_2(fstoq, TCG_CALL_NO_RWG, i128, env, f32)
143
-DEF_HELPER_FLAGS_2(fqtod, TCG_CALL_NO_RWG, f64, env, i128)
144
-DEF_HELPER_FLAGS_2(fdtoq, TCG_CALL_NO_RWG, i128, env, f64)
145
-DEF_HELPER_FLAGS_2(fstoi, TCG_CALL_NO_RWG, s32, env, f32)
146
-DEF_HELPER_FLAGS_2(fdtoi, TCG_CALL_NO_RWG, s32, env, f64)
147
-DEF_HELPER_FLAGS_2(fqtoi, TCG_CALL_NO_RWG, s32, env, i128)
148
+DEF_HELPER_FLAGS_2(fdtos, 0, f32, env, f64)
149
+DEF_HELPER_FLAGS_2(fstod, 0, f64, env, f32)
150
+DEF_HELPER_FLAGS_2(fqtos, 0, f32, env, i128)
151
+DEF_HELPER_FLAGS_2(fstoq, 0, i128, env, f32)
152
+DEF_HELPER_FLAGS_2(fqtod, 0, f64, env, i128)
153
+DEF_HELPER_FLAGS_2(fdtoq, 0, i128, env, f64)
154
+DEF_HELPER_FLAGS_2(fstoi, 0, s32, env, f32)
155
+DEF_HELPER_FLAGS_2(fdtoi, 0, s32, env, f64)
156
+DEF_HELPER_FLAGS_2(fqtoi, 0, s32, env, i128)
157
#ifdef TARGET_SPARC64
158
-DEF_HELPER_FLAGS_2(fstox, TCG_CALL_NO_RWG, s64, env, f32)
159
-DEF_HELPER_FLAGS_2(fdtox, TCG_CALL_NO_RWG, s64, env, f64)
160
-DEF_HELPER_FLAGS_2(fqtox, TCG_CALL_NO_RWG, s64, env, i128)
161
+DEF_HELPER_FLAGS_2(fstox, 0, s64, env, f32)
162
+DEF_HELPER_FLAGS_2(fdtox, 0, s64, env, f64)
163
+DEF_HELPER_FLAGS_2(fqtox, 0, s64, env, i128)
164
165
DEF_HELPER_FLAGS_2(fpmerge, TCG_CALL_NO_RWG_SE, i64, i64, i64)
166
DEF_HELPER_FLAGS_2(fmul8x16, TCG_CALL_NO_RWG_SE, i64, i64, i64)
167
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
168
index XXXXXXX..XXXXXXX 100644
169
--- a/target/sparc/fop_helper.c
170
+++ b/target/sparc/fop_helper.c
171
@@ -XXX,XX +XXX,XX @@ static inline Int128 f128_ret(float128 f)
172
return u.i;
173
}
174
175
-static target_ulong do_check_ieee_exceptions(CPUSPARCState *env, uintptr_t ra)
176
+static void check_ieee_exceptions(CPUSPARCState *env, uintptr_t ra)
177
{
178
target_ulong status = get_float_exception_flags(&env->fp_status);
179
target_ulong fsr = env->fsr;
180
@@ -XXX,XX +XXX,XX @@ static target_ulong do_check_ieee_exceptions(CPUSPARCState *env, uintptr_t ra)
181
}
182
}
16
}
183
17
184
- return fsr;
18
- if (0 && !type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
185
+ env->fsr = fsr;
19
+ if (!type_change && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
186
}
187
188
-target_ulong helper_check_ieee_exceptions(CPUSPARCState *env)
189
+float32 helper_fadds(CPUSPARCState *env, float32 src1, float32 src2)
190
{
191
- return do_check_ieee_exceptions(env, GETPC());
192
+ float32 ret = float32_add(src1, src2, &env->fp_status);
193
+ check_ieee_exceptions(env, GETPC());
194
+ return ret;
195
}
196
197
-#define F_BINOP(name) \
198
- float32 helper_f ## name ## s (CPUSPARCState *env, float32 src1, \
199
- float32 src2) \
200
- { \
201
- return float32_ ## name (src1, src2, &env->fp_status); \
202
- } \
203
- float64 helper_f ## name ## d (CPUSPARCState * env, float64 src1,\
204
- float64 src2) \
205
- { \
206
- return float64_ ## name (src1, src2, &env->fp_status); \
207
- } \
208
- Int128 helper_f ## name ## q(CPUSPARCState * env, Int128 src1, \
209
- Int128 src2) \
210
- { \
211
- return f128_ret(float128_ ## name (f128_in(src1), f128_in(src2), \
212
- &env->fp_status)); \
213
- }
214
+float32 helper_fsubs(CPUSPARCState *env, float32 src1, float32 src2)
215
+{
216
+ float32 ret = float32_sub(src1, src2, &env->fp_status);
217
+ check_ieee_exceptions(env, GETPC());
218
+ return ret;
219
+}
220
221
-F_BINOP(add);
222
-F_BINOP(sub);
223
-F_BINOP(mul);
224
-F_BINOP(div);
225
-#undef F_BINOP
226
+float32 helper_fmuls(CPUSPARCState *env, float32 src1, float32 src2)
227
+{
228
+ float32 ret = float32_mul(src1, src2, &env->fp_status);
229
+ check_ieee_exceptions(env, GETPC());
230
+ return ret;
231
+}
232
+
233
+float32 helper_fdivs(CPUSPARCState *env, float32 src1, float32 src2)
234
+{
235
+ float32 ret = float32_div(src1, src2, &env->fp_status);
236
+ check_ieee_exceptions(env, GETPC());
237
+ return ret;
238
+}
239
+
240
+float64 helper_faddd(CPUSPARCState *env, float64 src1, float64 src2)
241
+{
242
+ float64 ret = float64_add(src1, src2, &env->fp_status);
243
+ check_ieee_exceptions(env, GETPC());
244
+ return ret;
245
+}
246
+
247
+float64 helper_fsubd(CPUSPARCState *env, float64 src1, float64 src2)
248
+{
249
+ float64 ret = float64_sub(src1, src2, &env->fp_status);
250
+ check_ieee_exceptions(env, GETPC());
251
+ return ret;
252
+}
253
+
254
+float64 helper_fmuld(CPUSPARCState *env, float64 src1, float64 src2)
255
+{
256
+ float64 ret = float64_mul(src1, src2, &env->fp_status);
257
+ check_ieee_exceptions(env, GETPC());
258
+ return ret;
259
+}
260
+
261
+float64 helper_fdivd(CPUSPARCState *env, float64 src1, float64 src2)
262
+{
263
+ float64 ret = float64_div(src1, src2, &env->fp_status);
264
+ check_ieee_exceptions(env, GETPC());
265
+ return ret;
266
+}
267
+
268
+Int128 helper_faddq(CPUSPARCState *env, Int128 src1, Int128 src2)
269
+{
270
+ float128 ret = float128_add(f128_in(src1), f128_in(src2), &env->fp_status);
271
+ check_ieee_exceptions(env, GETPC());
272
+ return f128_ret(ret);
273
+}
274
+
275
+Int128 helper_fsubq(CPUSPARCState *env, Int128 src1, Int128 src2)
276
+{
277
+ float128 ret = float128_sub(f128_in(src1), f128_in(src2), &env->fp_status);
278
+ check_ieee_exceptions(env, GETPC());
279
+ return f128_ret(ret);
280
+}
281
+
282
+Int128 helper_fmulq(CPUSPARCState *env, Int128 src1, Int128 src2)
283
+{
284
+ float128 ret = float128_mul(f128_in(src1), f128_in(src2), &env->fp_status);
285
+ check_ieee_exceptions(env, GETPC());
286
+ return f128_ret(ret);
287
+}
288
+
289
+Int128 helper_fdivq(CPUSPARCState *env, Int128 src1, Int128 src2)
290
+{
291
+ float128 ret = float128_div(f128_in(src1), f128_in(src2), &env->fp_status);
292
+ check_ieee_exceptions(env, GETPC());
293
+ return f128_ret(ret);
294
+}
295
296
float64 helper_fsmuld(CPUSPARCState *env, float32 src1, float32 src2)
297
{
298
- return float64_mul(float32_to_float64(src1, &env->fp_status),
299
- float32_to_float64(src2, &env->fp_status),
300
- &env->fp_status);
301
+ float64 ret = float64_mul(float32_to_float64(src1, &env->fp_status),
302
+ float32_to_float64(src2, &env->fp_status),
303
+ &env->fp_status);
304
+ check_ieee_exceptions(env, GETPC());
305
+ return ret;
306
}
307
308
Int128 helper_fdmulq(CPUSPARCState *env, float64 src1, float64 src2)
309
{
310
- return f128_ret(float128_mul(float64_to_float128(src1, &env->fp_status),
311
- float64_to_float128(src2, &env->fp_status),
312
- &env->fp_status));
313
+ float128 ret = float128_mul(float64_to_float128(src1, &env->fp_status),
314
+ float64_to_float128(src2, &env->fp_status),
315
+ &env->fp_status);
316
+ check_ieee_exceptions(env, GETPC());
317
+ return f128_ret(ret);
318
}
319
320
/* Integer to float conversion. */
321
float32 helper_fitos(CPUSPARCState *env, int32_t src)
322
{
323
- return int32_to_float32(src, &env->fp_status);
324
+ float32 ret = int32_to_float32(src, &env->fp_status);
325
+ check_ieee_exceptions(env, GETPC());
326
+ return ret;
327
}
328
329
float64 helper_fitod(CPUSPARCState *env, int32_t src)
330
{
331
- return int32_to_float64(src, &env->fp_status);
332
+ float64 ret = int32_to_float64(src, &env->fp_status);
333
+ check_ieee_exceptions(env, GETPC());
334
+ return ret;
335
}
336
337
Int128 helper_fitoq(CPUSPARCState *env, int32_t src)
338
{
339
- return f128_ret(int32_to_float128(src, &env->fp_status));
340
+ float128 ret = int32_to_float128(src, &env->fp_status);
341
+ check_ieee_exceptions(env, GETPC());
342
+ return f128_ret(ret);
343
}
344
345
#ifdef TARGET_SPARC64
346
float32 helper_fxtos(CPUSPARCState *env, int64_t src)
347
{
348
- return int64_to_float32(src, &env->fp_status);
349
+ float32 ret = int64_to_float32(src, &env->fp_status);
350
+ check_ieee_exceptions(env, GETPC());
351
+ return ret;
352
}
353
354
float64 helper_fxtod(CPUSPARCState *env, int64_t src)
355
{
356
- return int64_to_float64(src, &env->fp_status);
357
+ float64 ret = int64_to_float64(src, &env->fp_status);
358
+ check_ieee_exceptions(env, GETPC());
359
+ return ret;
360
}
361
362
Int128 helper_fxtoq(CPUSPARCState *env, int64_t src)
363
{
364
- return f128_ret(int64_to_float128(src, &env->fp_status));
365
+ float128 ret = int64_to_float128(src, &env->fp_status);
366
+ check_ieee_exceptions(env, GETPC());
367
+ return f128_ret(ret);
368
}
369
#endif
370
371
/* floating point conversion */
372
float32 helper_fdtos(CPUSPARCState *env, float64 src)
373
{
374
- return float64_to_float32(src, &env->fp_status);
375
+ float32 ret = float64_to_float32(src, &env->fp_status);
376
+ check_ieee_exceptions(env, GETPC());
377
+ return ret;
378
}
379
380
float64 helper_fstod(CPUSPARCState *env, float32 src)
381
{
382
- return float32_to_float64(src, &env->fp_status);
383
+ float64 ret = float32_to_float64(src, &env->fp_status);
384
+ check_ieee_exceptions(env, GETPC());
385
+ return ret;
386
}
387
388
float32 helper_fqtos(CPUSPARCState *env, Int128 src)
389
{
390
- return float128_to_float32(f128_in(src), &env->fp_status);
391
+ float32 ret = float128_to_float32(f128_in(src), &env->fp_status);
392
+ check_ieee_exceptions(env, GETPC());
393
+ return ret;
394
}
395
396
Int128 helper_fstoq(CPUSPARCState *env, float32 src)
397
{
398
- return f128_ret(float32_to_float128(src, &env->fp_status));
399
+ float128 ret = float32_to_float128(src, &env->fp_status);
400
+ check_ieee_exceptions(env, GETPC());
401
+ return f128_ret(ret);
402
}
403
404
float64 helper_fqtod(CPUSPARCState *env, Int128 src)
405
{
406
- return float128_to_float64(f128_in(src), &env->fp_status);
407
+ float64 ret = float128_to_float64(f128_in(src), &env->fp_status);
408
+ check_ieee_exceptions(env, GETPC());
409
+ return ret;
410
}
411
412
Int128 helper_fdtoq(CPUSPARCState *env, float64 src)
413
{
414
- return f128_ret(float64_to_float128(src, &env->fp_status));
415
+ float128 ret = float64_to_float128(src, &env->fp_status);
416
+ check_ieee_exceptions(env, GETPC());
417
+ return f128_ret(ret);
418
}
419
420
/* Float to integer conversion. */
421
int32_t helper_fstoi(CPUSPARCState *env, float32 src)
422
{
423
- return float32_to_int32_round_to_zero(src, &env->fp_status);
424
+ int32_t ret = float32_to_int32_round_to_zero(src, &env->fp_status);
425
+ check_ieee_exceptions(env, GETPC());
426
+ return ret;
427
}
428
429
int32_t helper_fdtoi(CPUSPARCState *env, float64 src)
430
{
431
- return float64_to_int32_round_to_zero(src, &env->fp_status);
432
+ int32_t ret = float64_to_int32_round_to_zero(src, &env->fp_status);
433
+ check_ieee_exceptions(env, GETPC());
434
+ return ret;
435
}
436
437
int32_t helper_fqtoi(CPUSPARCState *env, Int128 src)
438
{
439
- return float128_to_int32_round_to_zero(f128_in(src), &env->fp_status);
440
+ int32_t ret = float128_to_int32_round_to_zero(f128_in(src),
441
+ &env->fp_status);
442
+ check_ieee_exceptions(env, GETPC());
443
+ return ret;
444
}
445
446
#ifdef TARGET_SPARC64
447
int64_t helper_fstox(CPUSPARCState *env, float32 src)
448
{
449
- return float32_to_int64_round_to_zero(src, &env->fp_status);
450
+ int64_t ret = float32_to_int64_round_to_zero(src, &env->fp_status);
451
+ check_ieee_exceptions(env, GETPC());
452
+ return ret;
453
}
454
455
int64_t helper_fdtox(CPUSPARCState *env, float64 src)
456
{
457
- return float64_to_int64_round_to_zero(src, &env->fp_status);
458
+ int64_t ret = float64_to_int64_round_to_zero(src, &env->fp_status);
459
+ check_ieee_exceptions(env, GETPC());
460
+ return ret;
461
}
462
463
int64_t helper_fqtox(CPUSPARCState *env, Int128 src)
464
{
465
- return float128_to_int64_round_to_zero(f128_in(src), &env->fp_status);
466
+ int64_t ret = float128_to_int64_round_to_zero(f128_in(src),
467
+ &env->fp_status);
468
+ check_ieee_exceptions(env, GETPC());
469
+ return ret;
470
}
471
#endif
472
473
float32 helper_fsqrts(CPUSPARCState *env, float32 src)
474
{
475
- return float32_sqrt(src, &env->fp_status);
476
+ float32 ret = float32_sqrt(src, &env->fp_status);
477
+ check_ieee_exceptions(env, GETPC());
478
+ return ret;
479
}
480
481
float64 helper_fsqrtd(CPUSPARCState *env, float64 src)
482
{
483
- return float64_sqrt(src, &env->fp_status);
484
+ float64 ret = float64_sqrt(src, &env->fp_status);
485
+ check_ieee_exceptions(env, GETPC());
486
+ return ret;
487
}
488
489
Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
490
{
491
- return f128_ret(float128_sqrt(f128_in(src), &env->fp_status));
492
+ float128 ret = float128_sqrt(f128_in(src), &env->fp_status);
493
+ check_ieee_exceptions(env, GETPC());
494
+ return f128_ret(ret);
495
}
496
497
#define GEN_FCMP(name, size, FS, E) \
498
@@ -XXX,XX +XXX,XX @@ Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
499
ret = glue(size, _compare_quiet)(reg1, reg2, \
500
&env->fp_status); \
501
} \
502
- fsr = do_check_ieee_exceptions(env, GETPC()); \
503
+ check_ieee_exceptions(env, GETPC()); \
504
+ fsr = env->fsr; \
505
switch (ret) { \
506
case float_relation_unordered: \
507
fsr |= (FSR_FCC1 | FSR_FCC0) << FS; \
508
@@ -XXX,XX +XXX,XX @@ Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
509
ret = glue(size, _compare_quiet)(src1, src2, \
510
&env->fp_status); \
511
} \
512
- fsr = do_check_ieee_exceptions(env, GETPC()); \
513
+ check_ieee_exceptions(env, GETPC()); \
514
+ fsr = env->fsr; \
515
switch (ret) { \
516
case float_relation_unordered: \
517
fsr |= (FSR_FCC1 | FSR_FCC0) << FS; \
518
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
519
index XXXXXXX..XXXXXXX 100644
520
--- a/target/sparc/translate.c
521
+++ b/target/sparc/translate.c
522
@@ -XXX,XX +XXX,XX @@ static bool do_env_ff(DisasContext *dc, arg_r_r *a,
523
524
tmp = gen_load_fpr_F(dc, a->rs);
525
func(tmp, tcg_env, tmp);
526
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
527
gen_store_fpr_F(dc, a->rd, tmp);
528
return advance_pc(dc);
529
}
530
@@ -XXX,XX +XXX,XX @@ static bool do_env_fd(DisasContext *dc, arg_r_r *a,
531
dst = tcg_temp_new_i32();
532
src = gen_load_fpr_D(dc, a->rs);
533
func(dst, tcg_env, src);
534
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
535
gen_store_fpr_F(dc, a->rd, dst);
536
return advance_pc(dc);
537
}
538
@@ -XXX,XX +XXX,XX @@ static bool do_env_dd(DisasContext *dc, arg_r_r *a,
539
dst = gen_dest_fpr_D(dc, a->rd);
540
src = gen_load_fpr_D(dc, a->rs);
541
func(dst, tcg_env, src);
542
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
543
gen_store_fpr_D(dc, a->rd, dst);
544
return advance_pc(dc);
545
}
546
@@ -XXX,XX +XXX,XX @@ static bool do_env_df(DisasContext *dc, arg_r_r *a,
547
dst = gen_dest_fpr_D(dc, a->rd);
548
src = gen_load_fpr_F(dc, a->rs);
549
func(dst, tcg_env, src);
550
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
551
gen_store_fpr_D(dc, a->rd, dst);
552
return advance_pc(dc);
553
}
554
@@ -XXX,XX +XXX,XX @@ static bool do_env_qq(DisasContext *dc, arg_r_r *a,
555
556
t = gen_load_fpr_Q(dc, a->rs);
557
func(t, tcg_env, t);
558
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
559
gen_store_fpr_Q(dc, a->rd, t);
560
return advance_pc(dc);
561
}
562
@@ -XXX,XX +XXX,XX @@ static bool do_env_fq(DisasContext *dc, arg_r_r *a,
563
src = gen_load_fpr_Q(dc, a->rs);
564
dst = tcg_temp_new_i32();
565
func(dst, tcg_env, src);
566
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
567
gen_store_fpr_F(dc, a->rd, dst);
568
return advance_pc(dc);
569
}
570
@@ -XXX,XX +XXX,XX @@ static bool do_env_dq(DisasContext *dc, arg_r_r *a,
571
src = gen_load_fpr_Q(dc, a->rs);
572
dst = gen_dest_fpr_D(dc, a->rd);
573
func(dst, tcg_env, src);
574
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
575
gen_store_fpr_D(dc, a->rd, dst);
576
return advance_pc(dc);
577
}
578
@@ -XXX,XX +XXX,XX @@ static bool do_env_qf(DisasContext *dc, arg_r_r *a,
579
return true;
20
return true;
580
}
21
}
581
22
582
- gen_op_clear_ieee_excp_and_FTT();
23
@@ -XXX,XX +XXX,XX @@ static bool fold_sextract(OptContext *ctx, TCGOp *op)
583
src = gen_load_fpr_F(dc, a->rs);
24
s_mask = s_mask_old >> pos;
584
dst = tcg_temp_new_i128();
25
s_mask |= -1ull << (len - 1);
585
func(dst, tcg_env, src);
26
586
@@ -XXX,XX +XXX,XX @@ static bool do_env_qd(DisasContext *dc, arg_r_r *a,
27
- if (0 && pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
28
+ if (pos == 0 && fold_affected_mask(ctx, op, s_mask & ~s_mask_old)) {
587
return true;
29
return true;
588
}
30
}
589
31
590
- gen_op_clear_ieee_excp_and_FTT();
591
src = gen_load_fpr_D(dc, a->rs);
592
dst = tcg_temp_new_i128();
593
func(dst, tcg_env, src);
594
@@ -XXX,XX +XXX,XX @@ static bool do_env_fff(DisasContext *dc, arg_r_r_r *a,
595
src1 = gen_load_fpr_F(dc, a->rs1);
596
src2 = gen_load_fpr_F(dc, a->rs2);
597
func(src1, tcg_env, src1, src2);
598
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
599
gen_store_fpr_F(dc, a->rd, src1);
600
return advance_pc(dc);
601
}
602
@@ -XXX,XX +XXX,XX @@ static bool do_env_ddd(DisasContext *dc, arg_r_r_r *a,
603
src1 = gen_load_fpr_D(dc, a->rs1);
604
src2 = gen_load_fpr_D(dc, a->rs2);
605
func(dst, tcg_env, src1, src2);
606
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
607
gen_store_fpr_D(dc, a->rd, dst);
608
return advance_pc(dc);
609
}
610
@@ -XXX,XX +XXX,XX @@ static bool trans_FsMULd(DisasContext *dc, arg_r_r_r *a)
611
src1 = gen_load_fpr_F(dc, a->rs1);
612
src2 = gen_load_fpr_F(dc, a->rs2);
613
gen_helper_fsmuld(dst, tcg_env, src1, src2);
614
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
615
gen_store_fpr_D(dc, a->rd, dst);
616
return advance_pc(dc);
617
}
618
@@ -XXX,XX +XXX,XX @@ static bool do_env_qqq(DisasContext *dc, arg_r_r_r *a,
619
src1 = gen_load_fpr_Q(dc, a->rs1);
620
src2 = gen_load_fpr_Q(dc, a->rs2);
621
func(src1, tcg_env, src1, src2);
622
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
623
gen_store_fpr_Q(dc, a->rd, src1);
624
return advance_pc(dc);
625
}
626
@@ -XXX,XX +XXX,XX @@ static bool trans_FdMULq(DisasContext *dc, arg_r_r_r *a)
627
src2 = gen_load_fpr_D(dc, a->rs2);
628
dst = tcg_temp_new_i128();
629
gen_helper_fdmulq(dst, tcg_env, src1, src2);
630
- gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
631
gen_store_fpr_Q(dc, a->rd, dst);
632
return advance_pc(dc);
633
}
634
--
32
--
635
2.34.1
33
2.43.0
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
The big comment just above says functions should be sorted.
2
Add forward declarations as needed.
3
4
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
6
---
4
target/sh4/cpu.h | 16 ++++++----------
7
tcg/optimize.c | 114 +++++++++++++++++++++++++------------------------
5
target/sh4/cpu.c | 16 ++++++++++++++++
8
1 file changed, 59 insertions(+), 55 deletions(-)
6
2 files changed, 22 insertions(+), 10 deletions(-)
7
9
8
diff --git a/target/sh4/cpu.h b/target/sh4/cpu.h
10
diff --git a/tcg/optimize.c b/tcg/optimize.c
9
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
10
--- a/target/sh4/cpu.h
12
--- a/tcg/optimize.c
11
+++ b/target/sh4/cpu.h
13
+++ b/tcg/optimize.c
12
@@ -XXX,XX +XXX,XX @@ void cpu_load_tlb(CPUSH4State * env);
14
@@ -XXX,XX +XXX,XX @@ static bool fold_xx_to_x(OptContext *ctx, TCGOp *op)
13
15
* 3) those that produce information about the result value.
14
/* MMU modes definitions */
16
*/
15
#define MMU_USER_IDX 1
17
16
-static inline int cpu_mmu_index (CPUSH4State *env, bool ifetch)
18
+static bool fold_or(OptContext *ctx, TCGOp *op);
17
-{
19
+static bool fold_orc(OptContext *ctx, TCGOp *op);
18
- /* The instruction in a RTE delay slot is fetched in privileged
20
+static bool fold_xor(OptContext *ctx, TCGOp *op);
19
- mode, but executed in user mode. */
21
+
20
- if (ifetch && (env->flags & TB_FLAG_DELAY_SLOT_RTE)) {
22
static bool fold_add(OptContext *ctx, TCGOp *op)
21
- return 0;
23
{
22
- } else {
24
if (fold_const2_commutative(ctx, op) ||
23
- return (env->sr & (1u << SR_MD)) == 0 ? 1 : 0;
25
@@ -XXX,XX +XXX,XX @@ static bool fold_andc(OptContext *ctx, TCGOp *op)
24
- }
26
return fold_masks_zs(ctx, op, z_mask, s_mask);
25
-}
26
27
#include "exec/cpu-all.h"
28
29
@@ -XXX,XX +XXX,XX @@ static inline void cpu_write_sr(CPUSH4State *env, target_ulong sr)
30
env->sr = sr & ~((1u << SR_M) | (1u << SR_Q) | (1u << SR_T));
31
}
27
}
32
28
33
+int sh4_cpu_mmu_index(CPUState *cs, bool ifetch);
29
+static bool fold_bitsel_vec(OptContext *ctx, TCGOp *op)
34
+static inline int cpu_mmu_index(CPUSH4State *env, bool ifetch)
35
+{
30
+{
36
+ return sh4_cpu_mmu_index(env_cpu(env), ifetch);
31
+ /* If true and false values are the same, eliminate the cmp. */
32
+ if (args_are_copies(op->args[2], op->args[3])) {
33
+ return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[2]);
34
+ }
35
+
36
+ if (arg_is_const(op->args[2]) && arg_is_const(op->args[3])) {
37
+ uint64_t tv = arg_info(op->args[2])->val;
38
+ uint64_t fv = arg_info(op->args[3])->val;
39
+
40
+ if (tv == -1 && fv == 0) {
41
+ return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[1]);
42
+ }
43
+ if (tv == 0 && fv == -1) {
44
+ if (TCG_TARGET_HAS_not_vec) {
45
+ op->opc = INDEX_op_not_vec;
46
+ return fold_not(ctx, op);
47
+ } else {
48
+ op->opc = INDEX_op_xor_vec;
49
+ op->args[2] = arg_new_constant(ctx, -1);
50
+ return fold_xor(ctx, op);
51
+ }
52
+ }
53
+ }
54
+ if (arg_is_const(op->args[2])) {
55
+ uint64_t tv = arg_info(op->args[2])->val;
56
+ if (tv == -1) {
57
+ op->opc = INDEX_op_or_vec;
58
+ op->args[2] = op->args[3];
59
+ return fold_or(ctx, op);
60
+ }
61
+ if (tv == 0 && TCG_TARGET_HAS_andc_vec) {
62
+ op->opc = INDEX_op_andc_vec;
63
+ op->args[2] = op->args[1];
64
+ op->args[1] = op->args[3];
65
+ return fold_andc(ctx, op);
66
+ }
67
+ }
68
+ if (arg_is_const(op->args[3])) {
69
+ uint64_t fv = arg_info(op->args[3])->val;
70
+ if (fv == 0) {
71
+ op->opc = INDEX_op_and_vec;
72
+ return fold_and(ctx, op);
73
+ }
74
+ if (fv == -1 && TCG_TARGET_HAS_orc_vec) {
75
+ op->opc = INDEX_op_orc_vec;
76
+ op->args[2] = op->args[1];
77
+ op->args[1] = op->args[3];
78
+ return fold_orc(ctx, op);
79
+ }
80
+ }
81
+ return finish_folding(ctx, op);
37
+}
82
+}
38
+
83
+
39
static inline void cpu_get_tb_cpu_state(CPUSH4State *env, vaddr *pc,
84
static bool fold_brcond(OptContext *ctx, TCGOp *op)
40
uint64_t *cs_base, uint32_t *flags)
41
{
85
{
42
diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c
86
int i = do_constant_folding_cond1(ctx, op, NO_DEST, &op->args[0],
43
index XXXXXXX..XXXXXXX 100644
87
@@ -XXX,XX +XXX,XX @@ static bool fold_xor(OptContext *ctx, TCGOp *op)
44
--- a/target/sh4/cpu.c
88
return fold_masks_zs(ctx, op, z_mask, s_mask);
45
+++ b/target/sh4/cpu.c
46
@@ -XXX,XX +XXX,XX @@ static bool superh_cpu_has_work(CPUState *cs)
47
return cs->interrupt_request & CPU_INTERRUPT_HARD;
48
}
89
}
49
90
50
+int sh4_cpu_mmu_index(CPUState *cs, bool ifetch)
91
-static bool fold_bitsel_vec(OptContext *ctx, TCGOp *op)
51
+{
92
-{
52
+ CPUSH4State *env = cpu_env(cs);
93
- /* If true and false values are the same, eliminate the cmp. */
53
+
94
- if (args_are_copies(op->args[2], op->args[3])) {
54
+ /*
95
- return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[2]);
55
+ * The instruction in a RTE delay slot is fetched in privileged mode,
96
- }
56
+ * but executed in user mode.
97
-
57
+ */
98
- if (arg_is_const(op->args[2]) && arg_is_const(op->args[3])) {
58
+ if (ifetch && (env->flags & TB_FLAG_DELAY_SLOT_RTE)) {
99
- uint64_t tv = arg_info(op->args[2])->val;
59
+ return 0;
100
- uint64_t fv = arg_info(op->args[3])->val;
60
+ } else {
101
-
61
+ return (env->sr & (1u << SR_MD)) == 0 ? 1 : 0;
102
- if (tv == -1 && fv == 0) {
62
+ }
103
- return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[1]);
63
+}
104
- }
64
+
105
- if (tv == 0 && fv == -1) {
65
static void superh_cpu_reset_hold(Object *obj)
106
- if (TCG_TARGET_HAS_not_vec) {
107
- op->opc = INDEX_op_not_vec;
108
- return fold_not(ctx, op);
109
- } else {
110
- op->opc = INDEX_op_xor_vec;
111
- op->args[2] = arg_new_constant(ctx, -1);
112
- return fold_xor(ctx, op);
113
- }
114
- }
115
- }
116
- if (arg_is_const(op->args[2])) {
117
- uint64_t tv = arg_info(op->args[2])->val;
118
- if (tv == -1) {
119
- op->opc = INDEX_op_or_vec;
120
- op->args[2] = op->args[3];
121
- return fold_or(ctx, op);
122
- }
123
- if (tv == 0 && TCG_TARGET_HAS_andc_vec) {
124
- op->opc = INDEX_op_andc_vec;
125
- op->args[2] = op->args[1];
126
- op->args[1] = op->args[3];
127
- return fold_andc(ctx, op);
128
- }
129
- }
130
- if (arg_is_const(op->args[3])) {
131
- uint64_t fv = arg_info(op->args[3])->val;
132
- if (fv == 0) {
133
- op->opc = INDEX_op_and_vec;
134
- return fold_and(ctx, op);
135
- }
136
- if (fv == -1 && TCG_TARGET_HAS_orc_vec) {
137
- op->opc = INDEX_op_orc_vec;
138
- op->args[2] = op->args[1];
139
- op->args[1] = op->args[3];
140
- return fold_orc(ctx, op);
141
- }
142
- }
143
- return finish_folding(ctx, op);
144
-}
145
-
146
/* Propagate constants and copies, fold constant expressions. */
147
void tcg_optimize(TCGContext *s)
66
{
148
{
67
CPUState *s = CPU(obj);
68
@@ -XXX,XX +XXX,XX @@ static void superh_cpu_class_init(ObjectClass *oc, void *data)
69
70
cc->class_by_name = superh_cpu_class_by_name;
71
cc->has_work = superh_cpu_has_work;
72
+ cc->mmu_index = sh4_cpu_mmu_index;
73
cc->dump_state = superh_cpu_dump_state;
74
cc->set_pc = superh_cpu_set_pc;
75
cc->get_pc = superh_cpu_get_pc;
76
--
149
--
77
2.34.1
150
2.43.0
78
79
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
The big comment just above says functions should be sorted.
2
3
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
target/tricore/cpu.c | 6 ++++++
6
tcg/optimize.c | 60 +++++++++++++++++++++++++-------------------------
5
1 file changed, 6 insertions(+)
7
1 file changed, 30 insertions(+), 30 deletions(-)
6
8
7
diff --git a/target/tricore/cpu.c b/target/tricore/cpu.c
9
diff --git a/tcg/optimize.c b/tcg/optimize.c
8
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
9
--- a/target/tricore/cpu.c
11
--- a/tcg/optimize.c
10
+++ b/target/tricore/cpu.c
12
+++ b/tcg/optimize.c
11
@@ -XXX,XX +XXX,XX @@ static bool tricore_cpu_has_work(CPUState *cs)
13
@@ -XXX,XX +XXX,XX @@ static bool fold_call(OptContext *ctx, TCGOp *op)
12
return true;
14
return true;
13
}
15
}
14
16
15
+static int tricore_cpu_mmu_index(CPUState *cs, bool ifetch)
17
+static bool fold_cmp_vec(OptContext *ctx, TCGOp *op)
16
+{
18
+{
17
+ return 0;
19
+ /* Canonicalize the comparison to put immediate second. */
20
+ if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
21
+ op->args[3] = tcg_swap_cond(op->args[3]);
22
+ }
23
+ return finish_folding(ctx, op);
18
+}
24
+}
19
+
25
+
20
static void tricore_cpu_realizefn(DeviceState *dev, Error **errp)
26
+static bool fold_cmpsel_vec(OptContext *ctx, TCGOp *op)
27
+{
28
+ /* If true and false values are the same, eliminate the cmp. */
29
+ if (args_are_copies(op->args[3], op->args[4])) {
30
+ return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[3]);
31
+ }
32
+
33
+ /* Canonicalize the comparison to put immediate second. */
34
+ if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
35
+ op->args[5] = tcg_swap_cond(op->args[5]);
36
+ }
37
+ /*
38
+ * Canonicalize the "false" input reg to match the destination,
39
+ * so that the tcg backend can implement "move if true".
40
+ */
41
+ if (swap_commutative(op->args[0], &op->args[4], &op->args[3])) {
42
+ op->args[5] = tcg_invert_cond(op->args[5]);
43
+ }
44
+ return finish_folding(ctx, op);
45
+}
46
+
47
static bool fold_count_zeros(OptContext *ctx, TCGOp *op)
21
{
48
{
22
CPUState *cs = CPU(dev);
49
uint64_t z_mask, s_mask;
23
@@ -XXX,XX +XXX,XX @@ static void tricore_cpu_class_init(ObjectClass *c, void *data)
50
@@ -XXX,XX +XXX,XX @@ static bool fold_setcond2(OptContext *ctx, TCGOp *op)
24
&mcc->parent_phases);
51
return tcg_opt_gen_movi(ctx, op, op->args[0], i);
25
cc->class_by_name = tricore_cpu_class_by_name;
52
}
26
cc->has_work = tricore_cpu_has_work;
53
27
+ cc->mmu_index = tricore_cpu_mmu_index;
54
-static bool fold_cmp_vec(OptContext *ctx, TCGOp *op)
28
55
-{
29
cc->gdb_read_register = tricore_cpu_gdb_read_register;
56
- /* Canonicalize the comparison to put immediate second. */
30
cc->gdb_write_register = tricore_cpu_gdb_write_register;
57
- if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
58
- op->args[3] = tcg_swap_cond(op->args[3]);
59
- }
60
- return finish_folding(ctx, op);
61
-}
62
-
63
-static bool fold_cmpsel_vec(OptContext *ctx, TCGOp *op)
64
-{
65
- /* If true and false values are the same, eliminate the cmp. */
66
- if (args_are_copies(op->args[3], op->args[4])) {
67
- return tcg_opt_gen_mov(ctx, op, op->args[0], op->args[3]);
68
- }
69
-
70
- /* Canonicalize the comparison to put immediate second. */
71
- if (swap_commutative(NO_DEST, &op->args[1], &op->args[2])) {
72
- op->args[5] = tcg_swap_cond(op->args[5]);
73
- }
74
- /*
75
- * Canonicalize the "false" input reg to match the destination,
76
- * so that the tcg backend can implement "move if true".
77
- */
78
- if (swap_commutative(op->args[0], &op->args[4], &op->args[3])) {
79
- op->args[5] = tcg_invert_cond(op->args[5]);
80
- }
81
- return finish_folding(ctx, op);
82
-}
83
-
84
static bool fold_sextract(OptContext *ctx, TCGOp *op)
85
{
86
uint64_t z_mask, s_mask, s_mask_old;
31
--
87
--
32
2.34.1
88
2.43.0
33
34
diff view generated by jsdifflib
1
We currently have a flag, float_muladd_halve_result, to scale
2
the result by 2**-1. Extend this to handle arbitrary scaling.
3
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
6
---
4
target/sparc/cpu.h | 34 ++++++----------------------------
7
include/fpu/softfloat.h | 6 ++++
5
target/sparc/cpu.c | 29 +++++++++++++++++++++++++++++
8
fpu/softfloat.c | 58 ++++++++++++++++++++++-----------------
6
2 files changed, 35 insertions(+), 28 deletions(-)
9
fpu/softfloat-parts.c.inc | 7 +++--
7
10
3 files changed, 44 insertions(+), 27 deletions(-)
8
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
11
12
diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
9
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
10
--- a/target/sparc/cpu.h
14
--- a/include/fpu/softfloat.h
11
+++ b/target/sparc/cpu.h
15
+++ b/include/fpu/softfloat.h
12
@@ -XXX,XX +XXX,XX @@ static inline int cpu_supervisor_mode(CPUSPARCState *env1)
16
@@ -XXX,XX +XXX,XX @@ float16 float16_add(float16, float16, float_status *status);
13
}
17
float16 float16_sub(float16, float16, float_status *status);
14
#endif
18
float16 float16_mul(float16, float16, float_status *status);
15
19
float16 float16_muladd(float16, float16, float16, int, float_status *status);
16
-static inline int cpu_mmu_index(CPUSPARCState *env, bool ifetch)
20
+float16 float16_muladd_scalbn(float16, float16, float16,
17
-{
21
+ int, int, float_status *status);
18
-#if defined(CONFIG_USER_ONLY)
22
float16 float16_div(float16, float16, float_status *status);
19
- return MMU_USER_IDX;
23
float16 float16_scalbn(float16, int, float_status *status);
20
-#elif !defined(TARGET_SPARC64)
24
float16 float16_min(float16, float16, float_status *status);
21
- if ((env->mmuregs[0] & MMU_E) == 0) { /* MMU disabled */
25
@@ -XXX,XX +XXX,XX @@ float32 float32_mul(float32, float32, float_status *status);
22
- return MMU_PHYS_IDX;
26
float32 float32_div(float32, float32, float_status *status);
23
- } else {
27
float32 float32_rem(float32, float32, float_status *status);
24
- return env->psrs;
28
float32 float32_muladd(float32, float32, float32, int, float_status *status);
25
- }
29
+float32 float32_muladd_scalbn(float32, float32, float32,
26
-#else
30
+ int, int, float_status *status);
27
- /* IMMU or DMMU disabled. */
31
float32 float32_sqrt(float32, float_status *status);
28
- if (ifetch
32
float32 float32_exp2(float32, float_status *status);
29
- ? (env->lsu & IMMU_E) == 0 || (env->pstate & PS_RED) != 0
33
float32 float32_log2(float32, float_status *status);
30
- : (env->lsu & DMMU_E) == 0) {
34
@@ -XXX,XX +XXX,XX @@ float64 float64_mul(float64, float64, float_status *status);
31
- return MMU_PHYS_IDX;
35
float64 float64_div(float64, float64, float_status *status);
32
- } else if (cpu_hypervisor_mode(env)) {
36
float64 float64_rem(float64, float64, float_status *status);
33
- return MMU_PHYS_IDX;
37
float64 float64_muladd(float64, float64, float64, int, float_status *status);
34
- } else if (env->tl > 0) {
38
+float64 float64_muladd_scalbn(float64, float64, float64,
35
- return MMU_NUCLEUS_IDX;
39
+ int, int, float_status *status);
36
- } else if (cpu_supervisor_mode(env)) {
40
float64 float64_sqrt(float64, float_status *status);
37
- return MMU_KERNEL_IDX;
41
float64 float64_log2(float64, float_status *status);
38
- } else {
42
FloatRelation float64_compare(float64, float64, float_status *status);
39
- return MMU_USER_IDX;
43
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
40
- }
44
index XXXXXXX..XXXXXXX 100644
41
-#endif
45
--- a/fpu/softfloat.c
42
-}
46
+++ b/fpu/softfloat.c
43
-
47
@@ -XXX,XX +XXX,XX @@ static FloatParts128 *parts128_mul(FloatParts128 *a, FloatParts128 *b,
44
static inline int cpu_interrupts_enabled(CPUSPARCState *env1)
48
#define parts_mul(A, B, S) \
45
{
49
PARTS_GENERIC_64_128(mul, A)(A, B, S)
46
#if !defined (TARGET_SPARC64)
50
47
@@ -XXX,XX +XXX,XX @@ trap_state* cpu_tsptr(CPUSPARCState* env);
51
-static FloatParts64 *parts64_muladd(FloatParts64 *a, FloatParts64 *b,
48
#define TB_FLAG_HYPER (1 << 7)
52
- FloatParts64 *c, int flags,
49
#define TB_FLAG_ASI_SHIFT 24
53
- float_status *s);
50
54
-static FloatParts128 *parts128_muladd(FloatParts128 *a, FloatParts128 *b,
51
+int sparc_cpu_mmu_index(CPUState *cs, bool ifetch);
55
- FloatParts128 *c, int flags,
52
+static inline int cpu_mmu_index(CPUSPARCState *env, bool ifetch)
56
- float_status *s);
57
+static FloatParts64 *parts64_muladd_scalbn(FloatParts64 *a, FloatParts64 *b,
58
+ FloatParts64 *c, int scale,
59
+ int flags, float_status *s);
60
+static FloatParts128 *parts128_muladd_scalbn(FloatParts128 *a, FloatParts128 *b,
61
+ FloatParts128 *c, int scale,
62
+ int flags, float_status *s);
63
64
-#define parts_muladd(A, B, C, Z, S) \
65
- PARTS_GENERIC_64_128(muladd, A)(A, B, C, Z, S)
66
+#define parts_muladd_scalbn(A, B, C, Z, Y, S) \
67
+ PARTS_GENERIC_64_128(muladd_scalbn, A)(A, B, C, Z, Y, S)
68
69
static FloatParts64 *parts64_div(FloatParts64 *a, FloatParts64 *b,
70
float_status *s);
71
@@ -XXX,XX +XXX,XX @@ floatx80_mul(floatx80 a, floatx80 b, float_status *status)
72
* Fused multiply-add
73
*/
74
75
-float16 QEMU_FLATTEN float16_muladd(float16 a, float16 b, float16 c,
76
- int flags, float_status *status)
77
+float16 QEMU_FLATTEN
78
+float16_muladd_scalbn(float16 a, float16 b, float16 c,
79
+ int scale, int flags, float_status *status)
80
{
81
FloatParts64 pa, pb, pc, *pr;
82
83
float16_unpack_canonical(&pa, a, status);
84
float16_unpack_canonical(&pb, b, status);
85
float16_unpack_canonical(&pc, c, status);
86
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
87
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, scale, flags, status);
88
89
return float16_round_pack_canonical(pr, status);
90
}
91
92
-static float32 QEMU_SOFTFLOAT_ATTR
93
-soft_f32_muladd(float32 a, float32 b, float32 c, int flags,
94
- float_status *status)
95
+float16 float16_muladd(float16 a, float16 b, float16 c,
96
+ int flags, float_status *status)
53
+{
97
+{
54
+ return sparc_cpu_mmu_index(env_cpu(env), ifetch);
98
+ return float16_muladd_scalbn(a, b, c, 0, flags, status);
55
+}
99
+}
56
+
100
+
57
static inline void cpu_get_tb_cpu_state(CPUSPARCState *env, vaddr *pc,
101
+float32 QEMU_SOFTFLOAT_ATTR
58
uint64_t *cs_base, uint32_t *pflags)
102
+float32_muladd_scalbn(float32 a, float32 b, float32 c,
59
{
103
+ int scale, int flags, float_status *status)
60
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
104
{
105
FloatParts64 pa, pb, pc, *pr;
106
107
float32_unpack_canonical(&pa, a, status);
108
float32_unpack_canonical(&pb, b, status);
109
float32_unpack_canonical(&pc, c, status);
110
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
111
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, scale, flags, status);
112
113
return float32_round_pack_canonical(pr, status);
114
}
115
116
-static float64 QEMU_SOFTFLOAT_ATTR
117
-soft_f64_muladd(float64 a, float64 b, float64 c, int flags,
118
- float_status *status)
119
+float64 QEMU_SOFTFLOAT_ATTR
120
+float64_muladd_scalbn(float64 a, float64 b, float64 c,
121
+ int scale, int flags, float_status *status)
122
{
123
FloatParts64 pa, pb, pc, *pr;
124
125
float64_unpack_canonical(&pa, a, status);
126
float64_unpack_canonical(&pb, b, status);
127
float64_unpack_canonical(&pc, c, status);
128
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
129
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, scale, flags, status);
130
131
return float64_round_pack_canonical(pr, status);
132
}
133
@@ -XXX,XX +XXX,XX @@ float32_muladd(float32 xa, float32 xb, float32 xc, int flags, float_status *s)
134
return ur.s;
135
136
soft:
137
- return soft_f32_muladd(ua.s, ub.s, uc.s, flags, s);
138
+ return float32_muladd_scalbn(ua.s, ub.s, uc.s, 0, flags, s);
139
}
140
141
float64 QEMU_FLATTEN
142
@@ -XXX,XX +XXX,XX @@ float64_muladd(float64 xa, float64 xb, float64 xc, int flags, float_status *s)
143
return ur.s;
144
145
soft:
146
- return soft_f64_muladd(ua.s, ub.s, uc.s, flags, s);
147
+ return float64_muladd_scalbn(ua.s, ub.s, uc.s, 0, flags, s);
148
}
149
150
float64 float64r32_muladd(float64 a, float64 b, float64 c,
151
@@ -XXX,XX +XXX,XX @@ float64 float64r32_muladd(float64 a, float64 b, float64 c,
152
float64_unpack_canonical(&pa, a, status);
153
float64_unpack_canonical(&pb, b, status);
154
float64_unpack_canonical(&pc, c, status);
155
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
156
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, 0, flags, status);
157
158
return float64r32_round_pack_canonical(pr, status);
159
}
160
@@ -XXX,XX +XXX,XX @@ bfloat16 QEMU_FLATTEN bfloat16_muladd(bfloat16 a, bfloat16 b, bfloat16 c,
161
bfloat16_unpack_canonical(&pa, a, status);
162
bfloat16_unpack_canonical(&pb, b, status);
163
bfloat16_unpack_canonical(&pc, c, status);
164
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
165
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, 0, flags, status);
166
167
return bfloat16_round_pack_canonical(pr, status);
168
}
169
@@ -XXX,XX +XXX,XX @@ float128 QEMU_FLATTEN float128_muladd(float128 a, float128 b, float128 c,
170
float128_unpack_canonical(&pa, a, status);
171
float128_unpack_canonical(&pb, b, status);
172
float128_unpack_canonical(&pc, c, status);
173
- pr = parts_muladd(&pa, &pb, &pc, flags, status);
174
+ pr = parts_muladd_scalbn(&pa, &pb, &pc, 0, flags, status);
175
176
return float128_round_pack_canonical(pr, status);
177
}
178
@@ -XXX,XX +XXX,XX @@ float32 float32_exp2(float32 a, float_status *status)
179
180
float64_unpack_canonical(&rp, float64_one, status);
181
for (i = 0 ; i < 15 ; i++) {
182
+
183
float64_unpack_canonical(&tp, float32_exp2_coefficients[i], status);
184
- rp = *parts_muladd(&tp, &xnp, &rp, 0, status);
185
+ rp = *parts_muladd_scalbn(&tp, &xnp, &rp, 0, 0, status);
186
xnp = *parts_mul(&xnp, &xp, status);
187
}
188
189
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
61
index XXXXXXX..XXXXXXX 100644
190
index XXXXXXX..XXXXXXX 100644
62
--- a/target/sparc/cpu.c
191
--- a/fpu/softfloat-parts.c.inc
63
+++ b/target/sparc/cpu.c
192
+++ b/fpu/softfloat-parts.c.inc
64
@@ -XXX,XX +XXX,XX @@ static bool sparc_cpu_has_work(CPUState *cs)
193
@@ -XXX,XX +XXX,XX @@ static FloatPartsN *partsN(mul)(FloatPartsN *a, FloatPartsN *b,
65
cpu_interrupts_enabled(env);
194
* Requires A and C extracted into a double-sized structure to provide the
66
}
195
* extra space for the widening multiply.
67
196
*/
68
+int sparc_cpu_mmu_index(CPUState *cs, bool ifetch)
197
-static FloatPartsN *partsN(muladd)(FloatPartsN *a, FloatPartsN *b,
69
+{
198
- FloatPartsN *c, int flags, float_status *s)
70
+ CPUSPARCState *env = cpu_env(cs);
199
+static FloatPartsN *partsN(muladd_scalbn)(FloatPartsN *a, FloatPartsN *b,
71
+
200
+ FloatPartsN *c, int scale,
72
+#ifndef TARGET_SPARC64
201
+ int flags, float_status *s)
73
+ if ((env->mmuregs[0] & MMU_E) == 0) { /* MMU disabled */
202
{
74
+ return MMU_PHYS_IDX;
203
int ab_mask, abc_mask;
75
+ } else {
204
FloatPartsW p_widen, c_widen;
76
+ return env->psrs;
205
@@ -XXX,XX +XXX,XX @@ static FloatPartsN *partsN(muladd)(FloatPartsN *a, FloatPartsN *b,
77
+ }
206
a->exp = p_widen.exp;
78
+#else
207
79
+ /* IMMU or DMMU disabled. */
208
return_normal:
80
+ if (ifetch
209
+ /* TODO: Replace all use of float_muladd_halve_result with scale. */
81
+ ? (env->lsu & IMMU_E) == 0 || (env->pstate & PS_RED) != 0
210
if (flags & float_muladd_halve_result) {
82
+ : (env->lsu & DMMU_E) == 0) {
211
a->exp -= 1;
83
+ return MMU_PHYS_IDX;
212
}
84
+ } else if (cpu_hypervisor_mode(env)) {
213
+ a->exp += scale;
85
+ return MMU_PHYS_IDX;
214
finish_sign:
86
+ } else if (env->tl > 0) {
215
if (flags & float_muladd_negate_result) {
87
+ return MMU_NUCLEUS_IDX;
216
a->sign ^= 1;
88
+ } else if (cpu_supervisor_mode(env)) {
89
+ return MMU_KERNEL_IDX;
90
+ } else {
91
+ return MMU_USER_IDX;
92
+ }
93
+#endif
94
+}
95
+
96
static char *sparc_cpu_type_name(const char *cpu_model)
97
{
98
char *name = g_strdup_printf(SPARC_CPU_TYPE_NAME("%s"), cpu_model);
99
@@ -XXX,XX +XXX,XX @@ static void sparc_cpu_class_init(ObjectClass *oc, void *data)
100
cc->class_by_name = sparc_cpu_class_by_name;
101
cc->parse_features = sparc_cpu_parse_features;
102
cc->has_work = sparc_cpu_has_work;
103
+ cc->mmu_index = sparc_cpu_mmu_index;
104
cc->dump_state = sparc_cpu_dump_state;
105
#if !defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY)
106
cc->memory_rw_debug = sparc_cpu_memory_rw_debug;
107
--
217
--
108
2.34.1
218
2.43.0
109
219
110
220
diff view generated by jsdifflib
1
Use the scalbn interface instead of float_muladd_halve_result.
2
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
5
---
4
target/arm/internals.h | 5 +++++
6
target/arm/tcg/helper-a64.c | 6 +++---
5
target/arm/helper.c | 2 +-
7
1 file changed, 3 insertions(+), 3 deletions(-)
6
target/arm/tcg/helper-a64.c | 4 ++--
7
target/arm/tcg/mte_helper.c | 18 +++++++++---------
8
target/arm/tcg/sve_helper.c | 8 ++++----
9
target/arm/tcg/tlb_helper.c | 2 +-
10
6 files changed, 22 insertions(+), 17 deletions(-)
11
8
12
diff --git a/target/arm/internals.h b/target/arm/internals.h
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/internals.h
15
+++ b/target/arm/internals.h
16
@@ -XXX,XX +XXX,XX @@
17
#define BANK_HYP 6
18
#define BANK_MON 7
19
20
+static inline int arm_env_mmu_index(CPUARMState *env)
21
+{
22
+ return EX_TBFLAG_ANY(env->hflags, MMUIDX);
23
+}
24
+
25
static inline bool excp_is_internal(int excp)
26
{
27
/* Return true if this exception number represents a QEMU-internal
28
diff --git a/target/arm/helper.c b/target/arm/helper.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/helper.c
31
+++ b/target/arm/helper.c
32
@@ -XXX,XX +XXX,XX @@ static void dccvap_writefn(CPUARMState *env, const ARMCPRegInfo *opaque,
33
uint64_t vaddr_in = (uint64_t) value;
34
uint64_t vaddr = vaddr_in & ~(dline_size - 1);
35
void *haddr;
36
- int mem_idx = cpu_mmu_index(env, false);
37
+ int mem_idx = arm_env_mmu_index(env);
38
39
/* This won't be crossing page boundaries */
40
haddr = probe_read(env, vaddr, dline_size, mem_idx, GETPC());
41
diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
9
diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
42
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
43
--- a/target/arm/tcg/helper-a64.c
11
--- a/target/arm/tcg/helper-a64.c
44
+++ b/target/arm/tcg/helper-a64.c
12
+++ b/target/arm/tcg/helper-a64.c
45
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
13
@@ -XXX,XX +XXX,XX @@ uint32_t HELPER(rsqrtsf_f16)(uint32_t a, uint32_t b, float_status *fpst)
46
tbii = EX_TBFLAG_A64(env->hflags, TBII);
14
(float16_is_infinity(b) && float16_is_zero(a))) {
47
if ((tbii >> extract64(new_pc, 55, 1)) & 1) {
15
return float16_one_point_five;
48
/* TBI is enabled. */
49
- int core_mmu_idx = cpu_mmu_index(env, false);
50
+ int core_mmu_idx = arm_env_mmu_index(env);
51
if (regime_has_2_ranges(core_to_aa64_mmu_idx(core_mmu_idx))) {
52
new_pc = sextract64(new_pc, 0, 56);
53
} else {
54
@@ -XXX,XX +XXX,XX @@ void HELPER(dc_zva)(CPUARMState *env, uint64_t vaddr_in)
55
*/
56
int blocklen = 4 << env_archcpu(env)->dcz_blocksize;
57
uint64_t vaddr = vaddr_in & ~(blocklen - 1);
58
- int mmu_idx = cpu_mmu_index(env, false);
59
+ int mmu_idx = arm_env_mmu_index(env);
60
void *mem;
61
62
/*
63
diff --git a/target/arm/tcg/mte_helper.c b/target/arm/tcg/mte_helper.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/target/arm/tcg/mte_helper.c
66
+++ b/target/arm/tcg/mte_helper.c
67
@@ -XXX,XX +XXX,XX @@ static int load_tag1(uint64_t ptr, uint8_t *mem)
68
69
uint64_t HELPER(ldg)(CPUARMState *env, uint64_t ptr, uint64_t xt)
70
{
71
- int mmu_idx = cpu_mmu_index(env, false);
72
+ int mmu_idx = arm_env_mmu_index(env);
73
uint8_t *mem;
74
int rtag = 0;
75
76
@@ -XXX,XX +XXX,XX @@ static void check_tag_aligned(CPUARMState *env, uint64_t ptr, uintptr_t ra)
77
{
78
if (unlikely(!QEMU_IS_ALIGNED(ptr, TAG_GRANULE))) {
79
arm_cpu_do_unaligned_access(env_cpu(env), ptr, MMU_DATA_STORE,
80
- cpu_mmu_index(env, false), ra);
81
+ arm_env_mmu_index(env), ra);
82
g_assert_not_reached();
83
}
16
}
17
- return float16_muladd(a, b, float16_three, float_muladd_halve_result, fpst);
18
+ return float16_muladd_scalbn(a, b, float16_three, -1, 0, fpst);
84
}
19
}
85
@@ -XXX,XX +XXX,XX @@ typedef void stg_store1(uint64_t, uint8_t *, int);
20
86
static inline void do_stg(CPUARMState *env, uint64_t ptr, uint64_t xt,
21
float32 HELPER(rsqrtsf_f32)(float32 a, float32 b, float_status *fpst)
87
uintptr_t ra, stg_store1 store1)
22
@@ -XXX,XX +XXX,XX @@ float32 HELPER(rsqrtsf_f32)(float32 a, float32 b, float_status *fpst)
88
{
23
(float32_is_infinity(b) && float32_is_zero(a))) {
89
- int mmu_idx = cpu_mmu_index(env, false);
24
return float32_one_point_five;
90
+ int mmu_idx = arm_env_mmu_index(env);
25
}
91
uint8_t *mem;
26
- return float32_muladd(a, b, float32_three, float_muladd_halve_result, fpst);
92
27
+ return float32_muladd_scalbn(a, b, float32_three, -1, 0, fpst);
93
check_tag_aligned(env, ptr, ra);
28
}
94
@@ -XXX,XX +XXX,XX @@ void HELPER(stg_parallel)(CPUARMState *env, uint64_t ptr, uint64_t xt)
29
95
30
float64 HELPER(rsqrtsf_f64)(float64 a, float64 b, float_status *fpst)
96
void HELPER(stg_stub)(CPUARMState *env, uint64_t ptr)
31
@@ -XXX,XX +XXX,XX @@ float64 HELPER(rsqrtsf_f64)(float64 a, float64 b, float_status *fpst)
97
{
32
(float64_is_infinity(b) && float64_is_zero(a))) {
98
- int mmu_idx = cpu_mmu_index(env, false);
33
return float64_one_point_five;
99
+ int mmu_idx = arm_env_mmu_index(env);
34
}
100
uintptr_t ra = GETPC();
35
- return float64_muladd(a, b, float64_three, float_muladd_halve_result, fpst);
101
36
+ return float64_muladd_scalbn(a, b, float64_three, -1, 0, fpst);
102
check_tag_aligned(env, ptr, ra);
37
}
103
@@ -XXX,XX +XXX,XX @@ void HELPER(stg_stub)(CPUARMState *env, uint64_t ptr)
38
104
static inline void do_st2g(CPUARMState *env, uint64_t ptr, uint64_t xt,
39
/* Floating-point reciprocal exponent - see FPRecpX in ARM ARM */
105
uintptr_t ra, stg_store1 store1)
106
{
107
- int mmu_idx = cpu_mmu_index(env, false);
108
+ int mmu_idx = arm_env_mmu_index(env);
109
int tag = allocation_tag_from_addr(xt);
110
uint8_t *mem1, *mem2;
111
112
@@ -XXX,XX +XXX,XX @@ void HELPER(st2g_parallel)(CPUARMState *env, uint64_t ptr, uint64_t xt)
113
114
void HELPER(st2g_stub)(CPUARMState *env, uint64_t ptr)
115
{
116
- int mmu_idx = cpu_mmu_index(env, false);
117
+ int mmu_idx = arm_env_mmu_index(env);
118
uintptr_t ra = GETPC();
119
int in_page = -(ptr | TARGET_PAGE_MASK);
120
121
@@ -XXX,XX +XXX,XX @@ void HELPER(st2g_stub)(CPUARMState *env, uint64_t ptr)
122
123
uint64_t HELPER(ldgm)(CPUARMState *env, uint64_t ptr)
124
{
125
- int mmu_idx = cpu_mmu_index(env, false);
126
+ int mmu_idx = arm_env_mmu_index(env);
127
uintptr_t ra = GETPC();
128
int gm_bs = env_archcpu(env)->gm_blocksize;
129
int gm_bs_bytes = 4 << gm_bs;
130
@@ -XXX,XX +XXX,XX @@ uint64_t HELPER(ldgm)(CPUARMState *env, uint64_t ptr)
131
132
void HELPER(stgm)(CPUARMState *env, uint64_t ptr, uint64_t val)
133
{
134
- int mmu_idx = cpu_mmu_index(env, false);
135
+ int mmu_idx = arm_env_mmu_index(env);
136
uintptr_t ra = GETPC();
137
int gm_bs = env_archcpu(env)->gm_blocksize;
138
int gm_bs_bytes = 4 << gm_bs;
139
@@ -XXX,XX +XXX,XX @@ void HELPER(stgm)(CPUARMState *env, uint64_t ptr, uint64_t val)
140
void HELPER(stzgm_tags)(CPUARMState *env, uint64_t ptr, uint64_t val)
141
{
142
uintptr_t ra = GETPC();
143
- int mmu_idx = cpu_mmu_index(env, false);
144
+ int mmu_idx = arm_env_mmu_index(env);
145
int log2_dcz_bytes, log2_tag_bytes;
146
intptr_t dcz_bytes, tag_bytes;
147
uint8_t *mem;
148
diff --git a/target/arm/tcg/sve_helper.c b/target/arm/tcg/sve_helper.c
149
index XXXXXXX..XXXXXXX 100644
150
--- a/target/arm/tcg/sve_helper.c
151
+++ b/target/arm/tcg/sve_helper.c
152
@@ -XXX,XX +XXX,XX @@ bool sve_cont_ldst_pages(SVEContLdSt *info, SVEContFault fault,
153
CPUARMState *env, target_ulong addr,
154
MMUAccessType access_type, uintptr_t retaddr)
155
{
156
- int mmu_idx = cpu_mmu_index(env, false);
157
+ int mmu_idx = arm_env_mmu_index(env);
158
int mem_off = info->mem_off_first[0];
159
bool nofault = fault == FAULT_NO;
160
bool have_work = true;
161
@@ -XXX,XX +XXX,XX @@ void sve_ld1_z(CPUARMState *env, void *vd, uint64_t *vg, void *vm,
162
sve_ldst1_host_fn *host_fn,
163
sve_ldst1_tlb_fn *tlb_fn)
164
{
165
- const int mmu_idx = cpu_mmu_index(env, false);
166
+ const int mmu_idx = arm_env_mmu_index(env);
167
const intptr_t reg_max = simd_oprsz(desc);
168
const int scale = simd_data(desc);
169
ARMVectorReg scratch;
170
@@ -XXX,XX +XXX,XX @@ void sve_ldff1_z(CPUARMState *env, void *vd, uint64_t *vg, void *vm,
171
sve_ldst1_host_fn *host_fn,
172
sve_ldst1_tlb_fn *tlb_fn)
173
{
174
- const int mmu_idx = cpu_mmu_index(env, false);
175
+ const int mmu_idx = arm_env_mmu_index(env);
176
const intptr_t reg_max = simd_oprsz(desc);
177
const int scale = simd_data(desc);
178
const int esize = 1 << esz;
179
@@ -XXX,XX +XXX,XX @@ void sve_st1_z(CPUARMState *env, void *vd, uint64_t *vg, void *vm,
180
sve_ldst1_host_fn *host_fn,
181
sve_ldst1_tlb_fn *tlb_fn)
182
{
183
- const int mmu_idx = cpu_mmu_index(env, false);
184
+ const int mmu_idx = arm_env_mmu_index(env);
185
const intptr_t reg_max = simd_oprsz(desc);
186
const int scale = simd_data(desc);
187
void *host[ARM_MAX_VQ * 4];
188
diff --git a/target/arm/tcg/tlb_helper.c b/target/arm/tcg/tlb_helper.c
189
index XXXXXXX..XXXXXXX 100644
190
--- a/target/arm/tcg/tlb_helper.c
191
+++ b/target/arm/tcg/tlb_helper.c
192
@@ -XXX,XX +XXX,XX @@ void helper_exception_pc_alignment(CPUARMState *env, target_ulong pc)
193
{
194
ARMMMUFaultInfo fi = { .type = ARMFault_Alignment };
195
int target_el = exception_target_el(env);
196
- int mmu_idx = cpu_mmu_index(env, true);
197
+ int mmu_idx = arm_env_mmu_index(env);
198
uint32_t fsc;
199
200
env->exception.vaddress = pc;
201
--
40
--
202
2.34.1
41
2.43.0
203
42
204
43
diff view generated by jsdifflib
1
Drop this field as a tcg global, loading it explicitly in the
1
Use the scalbn interface instead of float_muladd_halve_result.
2
few places required. This means that all FPop helpers may
2
3
once again be TCG_CALL_NO_WG.
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
7
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
8
Message-Id: <20231103173841.33651-21-richard.henderson@linaro.org>
9
---
5
---
10
target/sparc/helper.h | 120 +++++++++++++++++++-------------------
6
target/sparc/helper.h | 4 +-
11
target/sparc/fop_helper.c | 9 ++-
7
target/sparc/fop_helper.c | 8 ++--
12
target/sparc/translate.c | 98 ++++++++++++++++---------------
8
target/sparc/translate.c | 80 +++++++++++++++++++++++----------------
13
3 files changed, 114 insertions(+), 113 deletions(-)
9
3 files changed, 54 insertions(+), 38 deletions(-)
14
10
15
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
16
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
17
--- a/target/sparc/helper.h
13
--- a/target/sparc/helper.h
18
+++ b/target/sparc/helper.h
14
+++ b/target/sparc/helper.h
19
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_4(ld_asi, TCG_CALL_NO_WG, i64, env, tl, int, i32)
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(faddd, TCG_CALL_NO_WG, f64, env, f64, f64)
20
DEF_HELPER_FLAGS_5(st_asi, TCG_CALL_NO_WG, void, env, tl, i64, int, i32)
16
DEF_HELPER_FLAGS_3(fsubd, TCG_CALL_NO_WG, f64, env, f64, f64)
21
#endif
17
DEF_HELPER_FLAGS_3(fmuld, TCG_CALL_NO_WG, f64, env, f64, f64)
22
DEF_HELPER_FLAGS_1(get_fsr, TCG_CALL_NO_WG_SE, tl, env)
18
DEF_HELPER_FLAGS_3(fdivd, TCG_CALL_NO_WG, f64, env, f64, f64)
23
-DEF_HELPER_FLAGS_2(set_fsr_noftt, 0, void, env, tl)
19
-DEF_HELPER_FLAGS_5(fmaddd, TCG_CALL_NO_WG, f64, env, f64, f64, f64, i32)
24
-DEF_HELPER_FLAGS_2(fsqrts, 0, f32, env, f32)
20
+DEF_HELPER_FLAGS_6(fmaddd, TCG_CALL_NO_WG, f64, env, f64, f64, f64, s32, i32)
25
-DEF_HELPER_FLAGS_2(fsqrtd, 0, f64, env, f64)
21
DEF_HELPER_FLAGS_3(fnaddd, TCG_CALL_NO_WG, f64, env, f64, f64)
26
-DEF_HELPER_FLAGS_2(fsqrtq, 0, i128, env, i128)
22
DEF_HELPER_FLAGS_3(fnmuld, TCG_CALL_NO_WG, f64, env, f64, f64)
27
-DEF_HELPER_FLAGS_3(fcmps, 0, tl, env, f32, f32)
23
28
-DEF_HELPER_FLAGS_3(fcmpd, 0, tl, env, f64, f64)
24
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fadds, TCG_CALL_NO_WG, f32, env, f32, f32)
29
-DEF_HELPER_FLAGS_3(fcmpes, 0, tl, env, f32, f32)
25
DEF_HELPER_FLAGS_3(fsubs, TCG_CALL_NO_WG, f32, env, f32, f32)
30
-DEF_HELPER_FLAGS_3(fcmped, 0, tl, env, f64, f64)
26
DEF_HELPER_FLAGS_3(fmuls, TCG_CALL_NO_WG, f32, env, f32, f32)
31
-DEF_HELPER_FLAGS_3(fcmpq, 0, tl, env, i128, i128)
27
DEF_HELPER_FLAGS_3(fdivs, TCG_CALL_NO_WG, f32, env, f32, f32)
32
-DEF_HELPER_FLAGS_3(fcmpeq, 0, tl, env, i128, i128)
28
-DEF_HELPER_FLAGS_5(fmadds, TCG_CALL_NO_WG, f32, env, f32, f32, f32, i32)
33
+DEF_HELPER_FLAGS_2(set_fsr_noftt, TCG_CALL_NO_RWG, void, env, tl)
29
+DEF_HELPER_FLAGS_6(fmadds, TCG_CALL_NO_WG, f32, env, f32, f32, f32, s32, i32)
34
+DEF_HELPER_FLAGS_2(fsqrts, TCG_CALL_NO_WG, f32, env, f32)
30
DEF_HELPER_FLAGS_3(fnadds, TCG_CALL_NO_WG, f32, env, f32, f32)
35
+DEF_HELPER_FLAGS_2(fsqrtd, TCG_CALL_NO_WG, f64, env, f64)
31
DEF_HELPER_FLAGS_3(fnmuls, TCG_CALL_NO_WG, f32, env, f32, f32)
36
+DEF_HELPER_FLAGS_2(fsqrtq, TCG_CALL_NO_WG, i128, env, i128)
32
37
+DEF_HELPER_FLAGS_3(fcmps, TCG_CALL_NO_WG, void, env, f32, f32)
38
+DEF_HELPER_FLAGS_3(fcmpd, TCG_CALL_NO_WG, void, env, f64, f64)
39
+DEF_HELPER_FLAGS_3(fcmpes, TCG_CALL_NO_WG, void, env, f32, f32)
40
+DEF_HELPER_FLAGS_3(fcmped, TCG_CALL_NO_WG, void, env, f64, f64)
41
+DEF_HELPER_FLAGS_3(fcmpq, TCG_CALL_NO_WG, void, env, i128, i128)
42
+DEF_HELPER_FLAGS_3(fcmpeq, TCG_CALL_NO_WG, void, env, i128, i128)
43
#ifdef TARGET_SPARC64
44
-DEF_HELPER_FLAGS_3(fcmps_fcc1, 0, tl, env, f32, f32)
45
-DEF_HELPER_FLAGS_3(fcmps_fcc2, 0, tl, env, f32, f32)
46
-DEF_HELPER_FLAGS_3(fcmps_fcc3, 0, tl, env, f32, f32)
47
-DEF_HELPER_FLAGS_3(fcmpd_fcc1, 0, tl, env, f64, f64)
48
-DEF_HELPER_FLAGS_3(fcmpd_fcc2, 0, tl, env, f64, f64)
49
-DEF_HELPER_FLAGS_3(fcmpd_fcc3, 0, tl, env, f64, f64)
50
-DEF_HELPER_FLAGS_3(fcmpes_fcc1, 0, tl, env, f32, f32)
51
-DEF_HELPER_FLAGS_3(fcmpes_fcc2, 0, tl, env, f32, f32)
52
-DEF_HELPER_FLAGS_3(fcmpes_fcc3, 0, tl, env, f32, f32)
53
-DEF_HELPER_FLAGS_3(fcmped_fcc1, 0, tl, env, f64, f64)
54
-DEF_HELPER_FLAGS_3(fcmped_fcc2, 0, tl, env, f64, f64)
55
-DEF_HELPER_FLAGS_3(fcmped_fcc3, 0, tl, env, f64, f64)
56
-DEF_HELPER_FLAGS_3(fcmpq_fcc1, 0, tl, env, i128, i128)
57
-DEF_HELPER_FLAGS_3(fcmpq_fcc2, 0, tl, env, i128, i128)
58
-DEF_HELPER_FLAGS_3(fcmpq_fcc3, 0, tl, env, i128, i128)
59
-DEF_HELPER_FLAGS_3(fcmpeq_fcc1, 0, tl, env, i128, i128)
60
-DEF_HELPER_FLAGS_3(fcmpeq_fcc2, 0, tl, env, i128, i128)
61
-DEF_HELPER_FLAGS_3(fcmpeq_fcc3, 0, tl, env, i128, i128)
62
+DEF_HELPER_FLAGS_3(fcmps_fcc1, TCG_CALL_NO_WG, void, env, f32, f32)
63
+DEF_HELPER_FLAGS_3(fcmps_fcc2, TCG_CALL_NO_WG, void, env, f32, f32)
64
+DEF_HELPER_FLAGS_3(fcmps_fcc3, TCG_CALL_NO_WG, void, env, f32, f32)
65
+DEF_HELPER_FLAGS_3(fcmpd_fcc1, TCG_CALL_NO_WG, void, env, f64, f64)
66
+DEF_HELPER_FLAGS_3(fcmpd_fcc2, TCG_CALL_NO_WG, void, env, f64, f64)
67
+DEF_HELPER_FLAGS_3(fcmpd_fcc3, TCG_CALL_NO_WG, void, env, f64, f64)
68
+DEF_HELPER_FLAGS_3(fcmpes_fcc1, TCG_CALL_NO_WG, void, env, f32, f32)
69
+DEF_HELPER_FLAGS_3(fcmpes_fcc2, TCG_CALL_NO_WG, void, env, f32, f32)
70
+DEF_HELPER_FLAGS_3(fcmpes_fcc3, TCG_CALL_NO_WG, void, env, f32, f32)
71
+DEF_HELPER_FLAGS_3(fcmped_fcc1, TCG_CALL_NO_WG, void, env, f64, f64)
72
+DEF_HELPER_FLAGS_3(fcmped_fcc2, TCG_CALL_NO_WG, void, env, f64, f64)
73
+DEF_HELPER_FLAGS_3(fcmped_fcc3, TCG_CALL_NO_WG, void, env, f64, f64)
74
+DEF_HELPER_FLAGS_3(fcmpq_fcc1, TCG_CALL_NO_WG, void, env, i128, i128)
75
+DEF_HELPER_FLAGS_3(fcmpq_fcc2, TCG_CALL_NO_WG, void, env, i128, i128)
76
+DEF_HELPER_FLAGS_3(fcmpq_fcc3, TCG_CALL_NO_WG, void, env, i128, i128)
77
+DEF_HELPER_FLAGS_3(fcmpeq_fcc1, TCG_CALL_NO_WG, void, env, i128, i128)
78
+DEF_HELPER_FLAGS_3(fcmpeq_fcc2, TCG_CALL_NO_WG, void, env, i128, i128)
79
+DEF_HELPER_FLAGS_3(fcmpeq_fcc3, TCG_CALL_NO_WG, void, env, i128, i128)
80
#endif
81
DEF_HELPER_2(raise_exception, noreturn, env, int)
82
83
-DEF_HELPER_FLAGS_3(faddd, 0, f64, env, f64, f64)
84
-DEF_HELPER_FLAGS_3(fsubd, 0, f64, env, f64, f64)
85
-DEF_HELPER_FLAGS_3(fmuld, 0, f64, env, f64, f64)
86
-DEF_HELPER_FLAGS_3(fdivd, 0, f64, env, f64, f64)
87
+DEF_HELPER_FLAGS_3(faddd, TCG_CALL_NO_WG, f64, env, f64, f64)
88
+DEF_HELPER_FLAGS_3(fsubd, TCG_CALL_NO_WG, f64, env, f64, f64)
89
+DEF_HELPER_FLAGS_3(fmuld, TCG_CALL_NO_WG, f64, env, f64, f64)
90
+DEF_HELPER_FLAGS_3(fdivd, TCG_CALL_NO_WG, f64, env, f64, f64)
91
92
-DEF_HELPER_FLAGS_3(faddq, 0, i128, env, i128, i128)
93
-DEF_HELPER_FLAGS_3(fsubq, 0, i128, env, i128, i128)
94
-DEF_HELPER_FLAGS_3(fmulq, 0, i128, env, i128, i128)
95
-DEF_HELPER_FLAGS_3(fdivq, 0, i128, env, i128, i128)
96
+DEF_HELPER_FLAGS_3(faddq, TCG_CALL_NO_WG, i128, env, i128, i128)
97
+DEF_HELPER_FLAGS_3(fsubq, TCG_CALL_NO_WG, i128, env, i128, i128)
98
+DEF_HELPER_FLAGS_3(fmulq, TCG_CALL_NO_WG, i128, env, i128, i128)
99
+DEF_HELPER_FLAGS_3(fdivq, TCG_CALL_NO_WG, i128, env, i128, i128)
100
101
-DEF_HELPER_FLAGS_3(fadds, 0, f32, env, f32, f32)
102
-DEF_HELPER_FLAGS_3(fsubs, 0, f32, env, f32, f32)
103
-DEF_HELPER_FLAGS_3(fmuls, 0, f32, env, f32, f32)
104
-DEF_HELPER_FLAGS_3(fdivs, 0, f32, env, f32, f32)
105
+DEF_HELPER_FLAGS_3(fadds, TCG_CALL_NO_WG, f32, env, f32, f32)
106
+DEF_HELPER_FLAGS_3(fsubs, TCG_CALL_NO_WG, f32, env, f32, f32)
107
+DEF_HELPER_FLAGS_3(fmuls, TCG_CALL_NO_WG, f32, env, f32, f32)
108
+DEF_HELPER_FLAGS_3(fdivs, TCG_CALL_NO_WG, f32, env, f32, f32)
109
110
-DEF_HELPER_FLAGS_3(fsmuld, 0, f64, env, f32, f32)
111
-DEF_HELPER_FLAGS_3(fdmulq, 0, i128, env, f64, f64)
112
+DEF_HELPER_FLAGS_3(fsmuld, TCG_CALL_NO_WG, f64, env, f32, f32)
113
+DEF_HELPER_FLAGS_3(fdmulq, TCG_CALL_NO_WG, i128, env, f64, f64)
114
115
-DEF_HELPER_FLAGS_2(fitod, 0, f64, env, s32)
116
-DEF_HELPER_FLAGS_2(fitoq, 0, i128, env, s32)
117
+DEF_HELPER_FLAGS_2(fitod, TCG_CALL_NO_WG, f64, env, s32)
118
+DEF_HELPER_FLAGS_2(fitoq, TCG_CALL_NO_WG, i128, env, s32)
119
120
-DEF_HELPER_FLAGS_2(fitos, 0, f32, env, s32)
121
+DEF_HELPER_FLAGS_2(fitos, TCG_CALL_NO_WG, f32, env, s32)
122
123
#ifdef TARGET_SPARC64
124
-DEF_HELPER_FLAGS_2(fxtos, 0, f32, env, s64)
125
-DEF_HELPER_FLAGS_2(fxtod, 0, f64, env, s64)
126
-DEF_HELPER_FLAGS_2(fxtoq, 0, i128, env, s64)
127
+DEF_HELPER_FLAGS_2(fxtos, TCG_CALL_NO_WG, f32, env, s64)
128
+DEF_HELPER_FLAGS_2(fxtod, TCG_CALL_NO_WG, f64, env, s64)
129
+DEF_HELPER_FLAGS_2(fxtoq, TCG_CALL_NO_WG, i128, env, s64)
130
#endif
131
-DEF_HELPER_FLAGS_2(fdtos, 0, f32, env, f64)
132
-DEF_HELPER_FLAGS_2(fstod, 0, f64, env, f32)
133
-DEF_HELPER_FLAGS_2(fqtos, 0, f32, env, i128)
134
-DEF_HELPER_FLAGS_2(fstoq, 0, i128, env, f32)
135
-DEF_HELPER_FLAGS_2(fqtod, 0, f64, env, i128)
136
-DEF_HELPER_FLAGS_2(fdtoq, 0, i128, env, f64)
137
-DEF_HELPER_FLAGS_2(fstoi, 0, s32, env, f32)
138
-DEF_HELPER_FLAGS_2(fdtoi, 0, s32, env, f64)
139
-DEF_HELPER_FLAGS_2(fqtoi, 0, s32, env, i128)
140
+DEF_HELPER_FLAGS_2(fdtos, TCG_CALL_NO_WG, f32, env, f64)
141
+DEF_HELPER_FLAGS_2(fstod, TCG_CALL_NO_WG, f64, env, f32)
142
+DEF_HELPER_FLAGS_2(fqtos, TCG_CALL_NO_WG, f32, env, i128)
143
+DEF_HELPER_FLAGS_2(fstoq, TCG_CALL_NO_WG, i128, env, f32)
144
+DEF_HELPER_FLAGS_2(fqtod, TCG_CALL_NO_WG, f64, env, i128)
145
+DEF_HELPER_FLAGS_2(fdtoq, TCG_CALL_NO_WG, i128, env, f64)
146
+DEF_HELPER_FLAGS_2(fstoi, TCG_CALL_NO_WG, s32, env, f32)
147
+DEF_HELPER_FLAGS_2(fdtoi, TCG_CALL_NO_WG, s32, env, f64)
148
+DEF_HELPER_FLAGS_2(fqtoi, TCG_CALL_NO_WG, s32, env, i128)
149
#ifdef TARGET_SPARC64
150
-DEF_HELPER_FLAGS_2(fstox, 0, s64, env, f32)
151
-DEF_HELPER_FLAGS_2(fdtox, 0, s64, env, f64)
152
-DEF_HELPER_FLAGS_2(fqtox, 0, s64, env, i128)
153
+DEF_HELPER_FLAGS_2(fstox, TCG_CALL_NO_WG, s64, env, f32)
154
+DEF_HELPER_FLAGS_2(fdtox, TCG_CALL_NO_WG, s64, env, f64)
155
+DEF_HELPER_FLAGS_2(fqtox, TCG_CALL_NO_WG, s64, env, i128)
156
157
DEF_HELPER_FLAGS_2(fpmerge, TCG_CALL_NO_RWG_SE, i64, i64, i64)
158
DEF_HELPER_FLAGS_2(fmul8x16, TCG_CALL_NO_RWG_SE, i64, i64, i64)
159
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
33
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
160
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
161
--- a/target/sparc/fop_helper.c
35
--- a/target/sparc/fop_helper.c
162
+++ b/target/sparc/fop_helper.c
36
+++ b/target/sparc/fop_helper.c
163
@@ -XXX,XX +XXX,XX @@ Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
37
@@ -XXX,XX +XXX,XX @@ Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
164
}
38
}
165
39
166
#define GEN_FCMP(name, size, FS, E) \
40
float32 helper_fmadds(CPUSPARCState *env, float32 s1,
167
- target_ulong glue(helper_, name) (CPUSPARCState *env, \
41
- float32 s2, float32 s3, uint32_t op)
168
- Int128 src1, Int128 src2) \
42
+ float32 s2, float32 s3, int32_t sc, uint32_t op)
169
+ void glue(helper_, name)(CPUSPARCState *env, Int128 src1, Int128 src2) \
43
{
170
{ \
44
- float32 ret = float32_muladd(s1, s2, s3, op, &env->fp_status);
171
float128 reg1 = f128_in(src1); \
45
+ float32 ret = float32_muladd_scalbn(s1, s2, s3, sc, op, &env->fp_status);
172
float128 reg2 = f128_in(src2); \
46
check_ieee_exceptions(env, GETPC());
173
@@ -XXX,XX +XXX,XX @@ Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
47
return ret;
174
fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \
48
}
175
break; \
49
176
} \
50
float64 helper_fmaddd(CPUSPARCState *env, float64 s1,
177
- return fsr; \
51
- float64 s2, float64 s3, uint32_t op)
178
+ env->fsr = fsr; \
52
+ float64 s2, float64 s3, int32_t sc, uint32_t op)
179
}
53
{
180
#define GEN_FCMP_T(name, size, FS, E) \
54
- float64 ret = float64_muladd(s1, s2, s3, op, &env->fp_status);
181
- target_ulong glue(helper_, name)(CPUSPARCState *env, size src1, size src2)\
55
+ float64 ret = float64_muladd_scalbn(s1, s2, s3, sc, op, &env->fp_status);
182
+ void glue(helper_, name)(CPUSPARCState *env, size src1, size src2) \
56
check_ieee_exceptions(env, GETPC());
183
{ \
57
return ret;
184
FloatRelation ret; \
58
}
185
target_ulong fsr; \
186
@@ -XXX,XX +XXX,XX @@ Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
187
fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \
188
break; \
189
} \
190
- return fsr; \
191
+ env->fsr = fsr; \
192
}
193
194
GEN_FCMP_T(fcmps, float32, 0, 0);
195
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
59
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
196
index XXXXXXX..XXXXXXX 100644
60
index XXXXXXX..XXXXXXX 100644
197
--- a/target/sparc/translate.c
61
--- a/target/sparc/translate.c
198
+++ b/target/sparc/translate.c
62
+++ b/target/sparc/translate.c
199
@@ -XXX,XX +XXX,XX @@
63
@@ -XXX,XX +XXX,XX @@ static void gen_op_fabsq(TCGv_i128 dst, TCGv_i128 src)
200
64
201
/* global register indexes */
65
static void gen_op_fmadds(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2, TCGv_i32 s3)
202
static TCGv_ptr cpu_regwptr;
66
{
203
-static TCGv cpu_fsr, cpu_pc, cpu_npc;
67
- gen_helper_fmadds(d, tcg_env, s1, s2, s3, tcg_constant_i32(0));
204
+static TCGv cpu_pc, cpu_npc;
68
+ TCGv_i32 z = tcg_constant_i32(0);
205
static TCGv cpu_regs[32];
69
+ gen_helper_fmadds(d, tcg_env, s1, s2, s3, z, z);
206
static TCGv cpu_y;
70
}
207
static TCGv cpu_tbr;
71
208
@@ -XXX,XX +XXX,XX @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond,
72
static void gen_op_fmaddd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2, TCGv_i64 s3)
209
static void gen_fcompare(DisasCompare *cmp, unsigned int cc, unsigned int cond)
73
{
210
{
74
- gen_helper_fmaddd(d, tcg_env, s1, s2, s3, tcg_constant_i32(0));
211
unsigned int offset;
75
+ TCGv_i32 z = tcg_constant_i32(0);
212
- TCGv r_dst;
76
+ gen_helper_fmaddd(d, tcg_env, s1, s2, s3, z, z);
213
+ TCGv r_dst, fsr;
77
}
214
78
215
/* For now we still generate a straight boolean result. */
79
static void gen_op_fmsubs(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2, TCGv_i32 s3)
216
cmp->cond = TCG_COND_NE;
80
{
217
@@ -XXX,XX +XXX,XX @@ static void gen_fcompare(DisasCompare *cmp, unsigned int cc, unsigned int cond)
81
- int op = float_muladd_negate_c;
218
break;
82
- gen_helper_fmadds(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
219
}
83
+ TCGv_i32 z = tcg_constant_i32(0);
220
84
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c);
221
+ fsr = tcg_temp_new();
85
+ gen_helper_fmadds(d, tcg_env, s1, s2, s3, z, op);
222
+ tcg_gen_ld_tl(fsr, tcg_env, offsetof(CPUSPARCState, fsr));
86
}
223
switch (cond) {
87
224
case 0x0:
88
static void gen_op_fmsubd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2, TCGv_i64 s3)
225
gen_op_eval_bn(r_dst);
89
{
226
break;
90
- int op = float_muladd_negate_c;
227
case 0x1:
91
- gen_helper_fmaddd(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
228
- gen_op_eval_fbne(r_dst, cpu_fsr, offset);
92
+ TCGv_i32 z = tcg_constant_i32(0);
229
+ gen_op_eval_fbne(r_dst, fsr, offset);
93
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c);
230
break;
94
+ gen_helper_fmaddd(d, tcg_env, s1, s2, s3, z, op);
231
case 0x2:
95
}
232
- gen_op_eval_fblg(r_dst, cpu_fsr, offset);
96
233
+ gen_op_eval_fblg(r_dst, fsr, offset);
97
static void gen_op_fnmsubs(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2, TCGv_i32 s3)
234
break;
98
{
235
case 0x3:
99
- int op = float_muladd_negate_c | float_muladd_negate_result;
236
- gen_op_eval_fbul(r_dst, cpu_fsr, offset);
100
- gen_helper_fmadds(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
237
+ gen_op_eval_fbul(r_dst, fsr, offset);
101
+ TCGv_i32 z = tcg_constant_i32(0);
238
break;
102
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c |
239
case 0x4:
103
+ float_muladd_negate_result);
240
- gen_op_eval_fbl(r_dst, cpu_fsr, offset);
104
+ gen_helper_fmadds(d, tcg_env, s1, s2, s3, z, op);
241
+ gen_op_eval_fbl(r_dst, fsr, offset);
105
}
242
break;
106
243
case 0x5:
107
static void gen_op_fnmsubd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2, TCGv_i64 s3)
244
- gen_op_eval_fbug(r_dst, cpu_fsr, offset);
108
{
245
+ gen_op_eval_fbug(r_dst, fsr, offset);
109
- int op = float_muladd_negate_c | float_muladd_negate_result;
246
break;
110
- gen_helper_fmaddd(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
247
case 0x6:
111
+ TCGv_i32 z = tcg_constant_i32(0);
248
- gen_op_eval_fbg(r_dst, cpu_fsr, offset);
112
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c |
249
+ gen_op_eval_fbg(r_dst, fsr, offset);
113
+ float_muladd_negate_result);
250
break;
114
+ gen_helper_fmaddd(d, tcg_env, s1, s2, s3, z, op);
251
case 0x7:
115
}
252
- gen_op_eval_fbu(r_dst, cpu_fsr, offset);
116
253
+ gen_op_eval_fbu(r_dst, fsr, offset);
117
static void gen_op_fnmadds(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2, TCGv_i32 s3)
254
break;
118
{
255
case 0x8:
119
- int op = float_muladd_negate_result;
256
gen_op_eval_ba(r_dst);
120
- gen_helper_fmadds(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
257
break;
121
+ TCGv_i32 z = tcg_constant_i32(0);
258
case 0x9:
122
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_result);
259
- gen_op_eval_fbe(r_dst, cpu_fsr, offset);
123
+ gen_helper_fmadds(d, tcg_env, s1, s2, s3, z, op);
260
+ gen_op_eval_fbe(r_dst, fsr, offset);
124
}
261
break;
125
262
case 0xa:
126
static void gen_op_fnmaddd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2, TCGv_i64 s3)
263
- gen_op_eval_fbue(r_dst, cpu_fsr, offset);
127
{
264
+ gen_op_eval_fbue(r_dst, fsr, offset);
128
- int op = float_muladd_negate_result;
265
break;
129
- gen_helper_fmaddd(d, tcg_env, s1, s2, s3, tcg_constant_i32(op));
266
case 0xb:
130
+ TCGv_i32 z = tcg_constant_i32(0);
267
- gen_op_eval_fbge(r_dst, cpu_fsr, offset);
131
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_result);
268
+ gen_op_eval_fbge(r_dst, fsr, offset);
132
+ gen_helper_fmaddd(d, tcg_env, s1, s2, s3, z, op);
269
break;
133
}
270
case 0xc:
134
271
- gen_op_eval_fbuge(r_dst, cpu_fsr, offset);
135
/* Use muladd to compute (1 * src1) + src2 / 2 with one rounding. */
272
+ gen_op_eval_fbuge(r_dst, fsr, offset);
136
static void gen_op_fhadds(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2)
273
break;
137
{
274
case 0xd:
138
- TCGv_i32 one = tcg_constant_i32(float32_one);
275
- gen_op_eval_fble(r_dst, cpu_fsr, offset);
139
- int op = float_muladd_halve_result;
276
+ gen_op_eval_fble(r_dst, fsr, offset);
140
- gen_helper_fmadds(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
277
break;
141
+ TCGv_i32 fone = tcg_constant_i32(float32_one);
278
case 0xe:
142
+ TCGv_i32 mone = tcg_constant_i32(-1);
279
- gen_op_eval_fbule(r_dst, cpu_fsr, offset);
143
+ TCGv_i32 op = tcg_constant_i32(0);
280
+ gen_op_eval_fbule(r_dst, fsr, offset);
144
+ gen_helper_fmadds(d, tcg_env, fone, s1, s2, mone, op);
281
break;
145
}
282
case 0xf:
146
283
- gen_op_eval_fbo(r_dst, cpu_fsr, offset);
147
static void gen_op_fhaddd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2)
284
+ gen_op_eval_fbo(r_dst, fsr, offset);
148
{
285
break;
149
- TCGv_i64 one = tcg_constant_i64(float64_one);
286
}
150
- int op = float_muladd_halve_result;
287
}
151
- gen_helper_fmaddd(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
288
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmps(int fccno, TCGv_i32 r_rs1, TCGv_i32 r_rs2)
152
+ TCGv_i64 fone = tcg_constant_i64(float64_one);
289
{
153
+ TCGv_i32 mone = tcg_constant_i32(-1);
290
switch (fccno) {
154
+ TCGv_i32 op = tcg_constant_i32(0);
291
case 0:
155
+ gen_helper_fmaddd(d, tcg_env, fone, s1, s2, mone, op);
292
- gen_helper_fcmps(cpu_fsr, tcg_env, r_rs1, r_rs2);
156
}
293
+ gen_helper_fcmps(tcg_env, r_rs1, r_rs2);
157
294
break;
158
/* Use muladd to compute (1 * src1) - src2 / 2 with one rounding. */
295
case 1:
159
static void gen_op_fhsubs(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2)
296
- gen_helper_fcmps_fcc1(cpu_fsr, tcg_env, r_rs1, r_rs2);
160
{
297
+ gen_helper_fcmps_fcc1(tcg_env, r_rs1, r_rs2);
161
- TCGv_i32 one = tcg_constant_i32(float32_one);
298
break;
162
- int op = float_muladd_negate_c | float_muladd_halve_result;
299
case 2:
163
- gen_helper_fmadds(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
300
- gen_helper_fcmps_fcc2(cpu_fsr, tcg_env, r_rs1, r_rs2);
164
+ TCGv_i32 fone = tcg_constant_i32(float32_one);
301
+ gen_helper_fcmps_fcc2(tcg_env, r_rs1, r_rs2);
165
+ TCGv_i32 mone = tcg_constant_i32(-1);
302
break;
166
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c);
303
case 3:
167
+ gen_helper_fmadds(d, tcg_env, fone, s1, s2, mone, op);
304
- gen_helper_fcmps_fcc3(cpu_fsr, tcg_env, r_rs1, r_rs2);
168
}
305
+ gen_helper_fcmps_fcc3(tcg_env, r_rs1, r_rs2);
169
306
break;
170
static void gen_op_fhsubd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2)
307
}
171
{
308
}
172
- TCGv_i64 one = tcg_constant_i64(float64_one);
309
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmpd(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
173
- int op = float_muladd_negate_c | float_muladd_halve_result;
310
{
174
- gen_helper_fmaddd(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
311
switch (fccno) {
175
+ TCGv_i64 fone = tcg_constant_i64(float64_one);
312
case 0:
176
+ TCGv_i32 mone = tcg_constant_i32(-1);
313
- gen_helper_fcmpd(cpu_fsr, tcg_env, r_rs1, r_rs2);
177
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_c);
314
+ gen_helper_fcmpd(tcg_env, r_rs1, r_rs2);
178
+ gen_helper_fmaddd(d, tcg_env, fone, s1, s2, mone, op);
315
break;
179
}
316
case 1:
180
317
- gen_helper_fcmpd_fcc1(cpu_fsr, tcg_env, r_rs1, r_rs2);
181
/* Use muladd to compute -((1 * src1) + src2 / 2) with one rounding. */
318
+ gen_helper_fcmpd_fcc1(tcg_env, r_rs1, r_rs2);
182
static void gen_op_fnhadds(TCGv_i32 d, TCGv_i32 s1, TCGv_i32 s2)
319
break;
183
{
320
case 2:
184
- TCGv_i32 one = tcg_constant_i32(float32_one);
321
- gen_helper_fcmpd_fcc2(cpu_fsr, tcg_env, r_rs1, r_rs2);
185
- int op = float_muladd_negate_result | float_muladd_halve_result;
322
+ gen_helper_fcmpd_fcc2(tcg_env, r_rs1, r_rs2);
186
- gen_helper_fmadds(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
323
break;
187
+ TCGv_i32 fone = tcg_constant_i32(float32_one);
324
case 3:
188
+ TCGv_i32 mone = tcg_constant_i32(-1);
325
- gen_helper_fcmpd_fcc3(cpu_fsr, tcg_env, r_rs1, r_rs2);
189
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_result);
326
+ gen_helper_fcmpd_fcc3(tcg_env, r_rs1, r_rs2);
190
+ gen_helper_fmadds(d, tcg_env, fone, s1, s2, mone, op);
327
break;
191
}
328
}
192
329
}
193
static void gen_op_fnhaddd(TCGv_i64 d, TCGv_i64 s1, TCGv_i64 s2)
330
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmpq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
194
{
331
{
195
- TCGv_i64 one = tcg_constant_i64(float64_one);
332
switch (fccno) {
196
- int op = float_muladd_negate_result | float_muladd_halve_result;
333
case 0:
197
- gen_helper_fmaddd(d, tcg_env, one, s1, s2, tcg_constant_i32(op));
334
- gen_helper_fcmpq(cpu_fsr, tcg_env, r_rs1, r_rs2);
198
+ TCGv_i64 fone = tcg_constant_i64(float64_one);
335
+ gen_helper_fcmpq(tcg_env, r_rs1, r_rs2);
199
+ TCGv_i32 mone = tcg_constant_i32(-1);
336
break;
200
+ TCGv_i32 op = tcg_constant_i32(float_muladd_negate_result);
337
case 1:
201
+ gen_helper_fmaddd(d, tcg_env, fone, s1, s2, mone, op);
338
- gen_helper_fcmpq_fcc1(cpu_fsr, tcg_env, r_rs1, r_rs2);
202
}
339
+ gen_helper_fcmpq_fcc1(tcg_env, r_rs1, r_rs2);
203
340
break;
204
static void gen_op_fpexception_im(DisasContext *dc, int ftt)
341
case 2:
342
- gen_helper_fcmpq_fcc2(cpu_fsr, tcg_env, r_rs1, r_rs2);
343
+ gen_helper_fcmpq_fcc2(tcg_env, r_rs1, r_rs2);
344
break;
345
case 3:
346
- gen_helper_fcmpq_fcc3(cpu_fsr, tcg_env, r_rs1, r_rs2);
347
+ gen_helper_fcmpq_fcc3(tcg_env, r_rs1, r_rs2);
348
break;
349
}
350
}
351
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmpes(int fccno, TCGv_i32 r_rs1, TCGv_i32 r_rs2)
352
{
353
switch (fccno) {
354
case 0:
355
- gen_helper_fcmpes(cpu_fsr, tcg_env, r_rs1, r_rs2);
356
+ gen_helper_fcmpes(tcg_env, r_rs1, r_rs2);
357
break;
358
case 1:
359
- gen_helper_fcmpes_fcc1(cpu_fsr, tcg_env, r_rs1, r_rs2);
360
+ gen_helper_fcmpes_fcc1(tcg_env, r_rs1, r_rs2);
361
break;
362
case 2:
363
- gen_helper_fcmpes_fcc2(cpu_fsr, tcg_env, r_rs1, r_rs2);
364
+ gen_helper_fcmpes_fcc2(tcg_env, r_rs1, r_rs2);
365
break;
366
case 3:
367
- gen_helper_fcmpes_fcc3(cpu_fsr, tcg_env, r_rs1, r_rs2);
368
+ gen_helper_fcmpes_fcc3(tcg_env, r_rs1, r_rs2);
369
break;
370
}
371
}
372
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmped(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
373
{
374
switch (fccno) {
375
case 0:
376
- gen_helper_fcmped(cpu_fsr, tcg_env, r_rs1, r_rs2);
377
+ gen_helper_fcmped(tcg_env, r_rs1, r_rs2);
378
break;
379
case 1:
380
- gen_helper_fcmped_fcc1(cpu_fsr, tcg_env, r_rs1, r_rs2);
381
+ gen_helper_fcmped_fcc1(tcg_env, r_rs1, r_rs2);
382
break;
383
case 2:
384
- gen_helper_fcmped_fcc2(cpu_fsr, tcg_env, r_rs1, r_rs2);
385
+ gen_helper_fcmped_fcc2(tcg_env, r_rs1, r_rs2);
386
break;
387
case 3:
388
- gen_helper_fcmped_fcc3(cpu_fsr, tcg_env, r_rs1, r_rs2);
389
+ gen_helper_fcmped_fcc3(tcg_env, r_rs1, r_rs2);
390
break;
391
}
392
}
393
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmpeq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
394
{
395
switch (fccno) {
396
case 0:
397
- gen_helper_fcmpeq(cpu_fsr, tcg_env, r_rs1, r_rs2);
398
+ gen_helper_fcmpeq(tcg_env, r_rs1, r_rs2);
399
break;
400
case 1:
401
- gen_helper_fcmpeq_fcc1(cpu_fsr, tcg_env, r_rs1, r_rs2);
402
+ gen_helper_fcmpeq_fcc1(tcg_env, r_rs1, r_rs2);
403
break;
404
case 2:
405
- gen_helper_fcmpeq_fcc2(cpu_fsr, tcg_env, r_rs1, r_rs2);
406
+ gen_helper_fcmpeq_fcc2(tcg_env, r_rs1, r_rs2);
407
break;
408
case 3:
409
- gen_helper_fcmpeq_fcc3(cpu_fsr, tcg_env, r_rs1, r_rs2);
410
+ gen_helper_fcmpeq_fcc3(tcg_env, r_rs1, r_rs2);
411
break;
412
}
413
}
414
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmpeq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
415
416
static void gen_op_fcmps(int fccno, TCGv r_rs1, TCGv r_rs2)
417
{
418
- gen_helper_fcmps(cpu_fsr, tcg_env, r_rs1, r_rs2);
419
+ gen_helper_fcmps(tcg_env, r_rs1, r_rs2);
420
}
421
422
static void gen_op_fcmpd(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
423
{
424
- gen_helper_fcmpd(cpu_fsr, tcg_env, r_rs1, r_rs2);
425
+ gen_helper_fcmpd(tcg_env, r_rs1, r_rs2);
426
}
427
428
static void gen_op_fcmpq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
429
{
430
- gen_helper_fcmpq(cpu_fsr, tcg_env, r_rs1, r_rs2);
431
+ gen_helper_fcmpq(tcg_env, r_rs1, r_rs2);
432
}
433
434
static void gen_op_fcmpes(int fccno, TCGv r_rs1, TCGv r_rs2)
435
{
436
- gen_helper_fcmpes(cpu_fsr, tcg_env, r_rs1, r_rs2);
437
+ gen_helper_fcmpes(tcg_env, r_rs1, r_rs2);
438
}
439
440
static void gen_op_fcmped(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
441
{
442
- gen_helper_fcmped(cpu_fsr, tcg_env, r_rs1, r_rs2);
443
+ gen_helper_fcmped(tcg_env, r_rs1, r_rs2);
444
}
445
446
static void gen_op_fcmpeq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
447
{
448
- gen_helper_fcmpeq(cpu_fsr, tcg_env, r_rs1, r_rs2);
449
+ gen_helper_fcmpeq(tcg_env, r_rs1, r_rs2);
450
}
451
#endif
452
453
@@ -XXX,XX +XXX,XX @@ static bool do_ldfsr(DisasContext *dc, arg_r_r_ri *a, MemOp mop,
454
tnew = tcg_temp_new();
455
told = tcg_temp_new();
456
tcg_gen_qemu_ld_tl(tnew, addr, dc->mem_idx, mop | MO_ALIGN);
457
+ tcg_gen_ld_tl(told, tcg_env, offsetof(CPUSPARCState, fsr));
458
tcg_gen_andi_tl(tnew, tnew, new_mask);
459
- tcg_gen_andi_tl(told, cpu_fsr, old_mask);
460
+ tcg_gen_andi_tl(told, told, old_mask);
461
tcg_gen_or_tl(tnew, tnew, told);
462
gen_helper_set_fsr_noftt(tcg_env, tnew);
463
return advance_pc(dc);
464
@@ -XXX,XX +XXX,XX @@ void sparc_tcg_init(void)
465
{ &cpu_icc_Z, offsetof(CPUSPARCState, icc_Z), "icc_Z" },
466
{ &cpu_icc_C, offsetof(CPUSPARCState, icc_C), "icc_C" },
467
{ &cpu_cond, offsetof(CPUSPARCState, cond), "cond" },
468
- { &cpu_fsr, offsetof(CPUSPARCState, fsr), "fsr" },
469
{ &cpu_pc, offsetof(CPUSPARCState, pc), "pc" },
470
{ &cpu_npc, offsetof(CPUSPARCState, npc), "npc" },
471
{ &cpu_y, offsetof(CPUSPARCState, y), "y" },
472
--
205
--
473
2.34.1
206
2.43.0
207
208
diff view generated by jsdifflib
1
To be used after all targets have populated the hook.
1
All uses have been convered to float*_muladd_scalbn.
2
2
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
5
---
6
include/hw/core/cpu.h | 3 +++
6
include/fpu/softfloat.h | 3 ---
7
1 file changed, 3 insertions(+)
7
fpu/softfloat.c | 6 ------
8
fpu/softfloat-parts.c.inc | 4 ----
9
3 files changed, 13 deletions(-)
8
10
9
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
11
diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
10
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
11
--- a/include/hw/core/cpu.h
13
--- a/include/fpu/softfloat.h
12
+++ b/include/hw/core/cpu.h
14
+++ b/include/fpu/softfloat.h
13
@@ -XXX,XX +XXX,XX @@ struct SysemuCPUOps;
15
@@ -XXX,XX +XXX,XX @@ bfloat16 bfloat16_squash_input_denormal(bfloat16 a, float_status *status);
14
* @parse_features: Callback to parse command line arguments.
16
| Using these differs from negating an input or output before calling
15
* @reset_dump_flags: #CPUDumpFlags to use for reset logging.
17
| the muladd function in that this means that a NaN doesn't have its
16
* @has_work: Callback for checking if there is work to do.
18
| sign bit inverted before it is propagated.
17
+ * @mmu_index: Callback for choosing softmmu mmu index;
19
-| We also support halving the result before rounding, as a special
18
+ * may be used internally by memory_rw_debug without TCG.
20
-| case to support the ARM fused-sqrt-step instruction FRSQRTS.
19
* @memory_rw_debug: Callback for GDB memory access.
21
*----------------------------------------------------------------------------*/
20
* @dump_state: Callback for dumping state.
22
enum {
21
* @query_cpu_fast:
23
float_muladd_negate_c = 1,
22
@@ -XXX,XX +XXX,XX @@ struct CPUClass {
24
float_muladd_negate_product = 2,
23
void (*parse_features)(const char *typename, char *str, Error **errp);
25
float_muladd_negate_result = 4,
24
26
- float_muladd_halve_result = 8,
25
bool (*has_work)(CPUState *cpu);
27
};
26
+ int (*mmu_index)(CPUState *cpu, bool ifetch);
28
27
int (*memory_rw_debug)(CPUState *cpu, vaddr addr,
29
/*----------------------------------------------------------------------------
28
uint8_t *buf, int len, bool is_write);
30
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
29
void (*dump_state)(CPUState *cpu, FILE *, int flags);
31
index XXXXXXX..XXXXXXX 100644
32
--- a/fpu/softfloat.c
33
+++ b/fpu/softfloat.c
34
@@ -XXX,XX +XXX,XX @@ float32_muladd(float32 xa, float32 xb, float32 xc, int flags, float_status *s)
35
if (unlikely(!can_use_fpu(s))) {
36
goto soft;
37
}
38
- if (unlikely(flags & float_muladd_halve_result)) {
39
- goto soft;
40
- }
41
42
float32_input_flush3(&ua.s, &ub.s, &uc.s, s);
43
if (unlikely(!f32_is_zon3(ua, ub, uc))) {
44
@@ -XXX,XX +XXX,XX @@ float64_muladd(float64 xa, float64 xb, float64 xc, int flags, float_status *s)
45
if (unlikely(!can_use_fpu(s))) {
46
goto soft;
47
}
48
- if (unlikely(flags & float_muladd_halve_result)) {
49
- goto soft;
50
- }
51
52
float64_input_flush3(&ua.s, &ub.s, &uc.s, s);
53
if (unlikely(!f64_is_zon3(ua, ub, uc))) {
54
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
55
index XXXXXXX..XXXXXXX 100644
56
--- a/fpu/softfloat-parts.c.inc
57
+++ b/fpu/softfloat-parts.c.inc
58
@@ -XXX,XX +XXX,XX @@ static FloatPartsN *partsN(muladd_scalbn)(FloatPartsN *a, FloatPartsN *b,
59
a->exp = p_widen.exp;
60
61
return_normal:
62
- /* TODO: Replace all use of float_muladd_halve_result with scale. */
63
- if (flags & float_muladd_halve_result) {
64
- a->exp -= 1;
65
- }
66
a->exp += scale;
67
finish_sign:
68
if (flags & float_muladd_negate_result) {
30
--
69
--
31
2.34.1
70
2.43.0
32
71
33
72
diff view generated by jsdifflib
1
These macros are no longer used.
1
This rounding mode is used by Hexagon.
2
2
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
5
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
6
Message-Id: <20231103173841.33651-23-richard.henderson@linaro.org>
7
---
4
---
8
target/sparc/cpu.h | 7 -------
5
include/fpu/softfloat-types.h | 2 ++
9
1 file changed, 7 deletions(-)
6
fpu/softfloat-parts.c.inc | 3 +++
7
2 files changed, 5 insertions(+)
10
8
11
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
9
diff --git a/include/fpu/softfloat-types.h b/include/fpu/softfloat-types.h
12
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/cpu.h
11
--- a/include/fpu/softfloat-types.h
14
+++ b/target/sparc/cpu.h
12
+++ b/include/fpu/softfloat-types.h
15
@@ -XXX,XX +XXX,XX @@ enum {
13
@@ -XXX,XX +XXX,XX @@ typedef enum __attribute__((__packed__)) {
16
#define FSR_FTT1 (1ULL << 15)
14
float_round_to_odd = 5,
17
#define FSR_FTT0 (1ULL << 14)
15
/* Not an IEEE rounding mode: round to closest odd, overflow to inf */
18
#define FSR_FTT_MASK (FSR_FTT2 | FSR_FTT1 | FSR_FTT0)
16
float_round_to_odd_inf = 6,
19
-#ifdef TARGET_SPARC64
17
+ /* Not an IEEE rounding mode: round to nearest even, overflow to max */
20
-#define FSR_FTT_NMASK 0xfffffffffffe3fffULL
18
+ float_round_nearest_even_max = 7,
21
-#define FSR_FTT_CEXC_NMASK 0xfffffffffffe3fe0ULL
19
} FloatRoundMode;
22
-#else
20
23
-#define FSR_FTT_NMASK 0xfffe3fffULL
21
/*
24
-#define FSR_FTT_CEXC_NMASK 0xfffe3fe0ULL
22
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
25
-#endif
23
index XXXXXXX..XXXXXXX 100644
26
#define FSR_FTT_IEEE_EXCP (1ULL << 14)
24
--- a/fpu/softfloat-parts.c.inc
27
#define FSR_FTT_UNIMPFPOP (3ULL << 14)
25
+++ b/fpu/softfloat-parts.c.inc
28
#define FSR_FTT_SEQ_ERROR (4ULL << 14)
26
@@ -XXX,XX +XXX,XX @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
27
int exp, flags = 0;
28
29
switch (s->float_rounding_mode) {
30
+ case float_round_nearest_even_max:
31
+ overflow_norm = true;
32
+ /* fall through */
33
case float_round_nearest_even:
34
if (N > 64 && frac_lsb == 0) {
35
inc = ((p->frac_hi & 1) || (p->frac_lo & round_mask) != frac_lsbm1
29
--
36
--
30
2.34.1
37
2.43.0
diff view generated by jsdifflib
1
These are no longer used for passing data to/from helpers.
1
Certain Hexagon instructions suppress changes to the result
2
when the product of fma() is a true zero.
2
3
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
5
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
6
Message-Id: <20231103173841.33651-15-richard.henderson@linaro.org>
7
---
5
---
8
target/sparc/cpu.h | 2 --
6
include/fpu/softfloat.h | 5 +++++
9
target/sparc/fop_helper.c | 3 ---
7
fpu/softfloat.c | 3 +++
10
target/sparc/ldst_helper.c | 3 ---
8
fpu/softfloat-parts.c.inc | 4 +++-
11
3 files changed, 8 deletions(-)
9
3 files changed, 11 insertions(+), 1 deletion(-)
12
10
13
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
11
diff --git a/include/fpu/softfloat.h b/include/fpu/softfloat.h
14
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
15
--- a/target/sparc/cpu.h
13
--- a/include/fpu/softfloat.h
16
+++ b/target/sparc/cpu.h
14
+++ b/include/fpu/softfloat.h
17
@@ -XXX,XX +XXX,XX @@ struct CPUArchState {
15
@@ -XXX,XX +XXX,XX @@ bfloat16 bfloat16_squash_input_denormal(bfloat16 a, float_status *status);
18
uint64_t mmubpregs[4];
16
| Using these differs from negating an input or output before calling
19
uint64_t prom_addr;
17
| the muladd function in that this means that a NaN doesn't have its
20
#endif
18
| sign bit inverted before it is propagated.
21
- /* temporary float registers */
19
+|
22
- float128 qt0, qt1;
20
+| With float_muladd_suppress_add_product_zero, if A or B is zero
23
float_status fp_status;
21
+| such that the product is a true zero, then return C without addition.
24
#if defined(TARGET_SPARC64)
22
+| This preserves the sign of C when C is +/- 0. Used for Hexagon.
25
#define MAXTL_MAX 8
23
*----------------------------------------------------------------------------*/
26
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
24
enum {
25
float_muladd_negate_c = 1,
26
float_muladd_negate_product = 2,
27
float_muladd_negate_result = 4,
28
+ float_muladd_suppress_add_product_zero = 8,
29
};
30
31
/*----------------------------------------------------------------------------
32
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
27
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
28
--- a/target/sparc/fop_helper.c
34
--- a/fpu/softfloat.c
29
+++ b/target/sparc/fop_helper.c
35
+++ b/fpu/softfloat.c
30
@@ -XXX,XX +XXX,XX @@
36
@@ -XXX,XX +XXX,XX @@ float32_muladd(float32 xa, float32 xb, float32 xc, int flags, float_status *s)
31
#include "exec/helper-proto.h"
37
if (unlikely(!can_use_fpu(s))) {
32
#include "fpu/softfloat.h"
38
goto soft;
33
39
}
34
-#define QT0 (env->qt0)
40
+ if (unlikely(flags & float_muladd_suppress_add_product_zero)) {
35
-#define QT1 (env->qt1)
41
+ goto soft;
36
-
42
+ }
37
static inline float128 f128_in(Int128 i)
43
38
{
44
float32_input_flush3(&ua.s, &ub.s, &uc.s, s);
39
union {
45
if (unlikely(!f32_is_zon3(ua, ub, uc))) {
40
diff --git a/target/sparc/ldst_helper.c b/target/sparc/ldst_helper.c
46
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
41
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
42
--- a/target/sparc/ldst_helper.c
48
--- a/fpu/softfloat-parts.c.inc
43
+++ b/target/sparc/ldst_helper.c
49
+++ b/fpu/softfloat-parts.c.inc
44
@@ -XXX,XX +XXX,XX @@
50
@@ -XXX,XX +XXX,XX @@ static FloatPartsN *partsN(muladd_scalbn)(FloatPartsN *a, FloatPartsN *b,
45
#endif
51
goto return_normal;
46
#endif
52
}
47
53
if (c->cls == float_class_zero) {
48
-#define QT0 (env->qt0)
54
- if (a->sign != c->sign) {
49
-#define QT1 (env->qt1)
55
+ if (flags & float_muladd_suppress_add_product_zero) {
50
-
56
+ a->sign = c->sign;
51
#if defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY)
57
+ } else if (a->sign != c->sign) {
52
/* Calculates TSB pointer value for fault page size
58
goto return_sub_zero;
53
* UltraSPARC IIi has fixed sizes (8k or 64k) for the page pointers
59
}
60
goto return_zero;
54
--
61
--
55
2.34.1
62
2.43.0
diff view generated by jsdifflib
1
There are no special cases for this instruction.
2
Remove internal_mpyf as unused.
3
4
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
3
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
4
Message-Id: <20231103173841.33651-14-richard.henderson@linaro.org>
5
---
6
---
6
target/sparc/helper.h | 2 +-
7
target/hexagon/fma_emu.h | 1 -
7
target/sparc/fop_helper.c | 8 ++++----
8
target/hexagon/fma_emu.c | 8 --------
8
target/sparc/translate.c | 15 ++++-----------
9
target/hexagon/op_helper.c | 2 +-
9
3 files changed, 9 insertions(+), 16 deletions(-)
10
3 files changed, 1 insertion(+), 10 deletions(-)
10
11
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
12
diff --git a/target/hexagon/fma_emu.h b/target/hexagon/fma_emu.h
12
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
14
--- a/target/hexagon/fma_emu.h
14
+++ b/target/sparc/helper.h
15
+++ b/target/hexagon/fma_emu.h
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fmuls, TCG_CALL_NO_RWG, f32, env, f32, f32)
16
@@ -XXX,XX +XXX,XX @@ int32_t float32_getexp(float32 f32);
16
DEF_HELPER_FLAGS_3(fdivs, TCG_CALL_NO_RWG, f32, env, f32, f32)
17
float32 infinite_float32(uint8_t sign);
17
18
float32 internal_fmafx(float32 a, float32 b, float32 c,
18
DEF_HELPER_FLAGS_3(fsmuld, TCG_CALL_NO_RWG, f64, env, f32, f32)
19
int scale, float_status *fp_status);
19
-DEF_HELPER_FLAGS_3(fdmulq, TCG_CALL_NO_RWG, void, env, f64, f64)
20
-float32 internal_mpyf(float32 a, float32 b, float_status *fp_status);
20
+DEF_HELPER_FLAGS_3(fdmulq, TCG_CALL_NO_RWG, i128, env, f64, f64)
21
float64 internal_mpyhh(float64 a, float64 b,
21
22
unsigned long long int accumulated,
22
DEF_HELPER_FLAGS_2(fitod, TCG_CALL_NO_RWG_SE, f64, env, s32)
23
float_status *fp_status);
23
DEF_HELPER_FLAGS_2(fitoq, TCG_CALL_NO_RWG, i128, env, s32)
24
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
24
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
25
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
26
--- a/target/sparc/fop_helper.c
26
--- a/target/hexagon/fma_emu.c
27
+++ b/target/sparc/fop_helper.c
27
+++ b/target/hexagon/fma_emu.c
28
@@ -XXX,XX +XXX,XX @@ float64 helper_fsmuld(CPUSPARCState *env, float32 src1, float32 src2)
28
@@ -XXX,XX +XXX,XX @@ float32 internal_fmafx(float32 a, float32 b, float32 c, int scale,
29
&env->fp_status);
29
return accum_round_float32(result, fp_status);
30
}
30
}
31
31
32
-void helper_fdmulq(CPUSPARCState *env, float64 src1, float64 src2)
32
-float32 internal_mpyf(float32 a, float32 b, float_status *fp_status)
33
+Int128 helper_fdmulq(CPUSPARCState *env, float64 src1, float64 src2)
34
{
35
- QT0 = float128_mul(float64_to_float128(src1, &env->fp_status),
36
- float64_to_float128(src2, &env->fp_status),
37
- &env->fp_status);
38
+ return f128_ret(float128_mul(float64_to_float128(src1, &env->fp_status),
39
+ float64_to_float128(src2, &env->fp_status),
40
+ &env->fp_status));
41
}
42
43
/* Integer to float conversion. */
44
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
45
index XXXXXXX..XXXXXXX 100644
46
--- a/target/sparc/translate.c
47
+++ b/target/sparc/translate.c
48
@@ -XXX,XX +XXX,XX @@ static void gen_store_fpr_Q(DisasContext *dc, unsigned int dst, TCGv_i128 v)
49
gen_update_fprs_dirty(dc, dst);
50
}
51
52
-static void gen_op_store_QT0_fpr(unsigned int dst)
53
-{
33
-{
54
- tcg_gen_ld_i64(cpu_fpr[dst / 2], tcg_env, offsetof(CPUSPARCState, qt0) +
34
- if (float32_is_zero(a) || float32_is_zero(b)) {
55
- offsetof(CPU_QuadU, ll.upper));
35
- return float32_mul(a, b, fp_status);
56
- tcg_gen_ld_i64(cpu_fpr[dst/2 + 1], tcg_env, offsetof(CPUSPARCState, qt0) +
36
- }
57
- offsetof(CPU_QuadU, ll.lower));
37
- return internal_fmafx(a, b, float32_zero, 0, fp_status);
58
-}
38
-}
59
-
39
-
60
/* moves */
40
float64 internal_mpyhh(float64 a, float64 b,
61
#ifdef CONFIG_USER_ONLY
41
unsigned long long int accumulated,
62
#define supervisor(dc) 0
42
float_status *fp_status)
63
@@ -XXX,XX +XXX,XX @@ TRANS(FDIVq, ALL, do_env_qqq, a, gen_helper_fdivq)
43
diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
64
static bool trans_FdMULq(DisasContext *dc, arg_r_r_r *a)
44
index XXXXXXX..XXXXXXX 100644
45
--- a/target/hexagon/op_helper.c
46
+++ b/target/hexagon/op_helper.c
47
@@ -XXX,XX +XXX,XX @@ float32 HELPER(sfmpy)(CPUHexagonState *env, float32 RsV, float32 RtV)
65
{
48
{
66
TCGv_i64 src1, src2;
49
float32 RdV;
67
+ TCGv_i128 dst;
50
arch_fpop_start(env);
68
51
- RdV = internal_mpyf(RsV, RtV, &env->fp_status);
69
if (gen_trap_ifnofpu(dc)) {
52
+ RdV = float32_mul(RsV, RtV, &env->fp_status);
70
return true;
53
arch_fpop_end(env);
71
@@ -XXX,XX +XXX,XX @@ static bool trans_FdMULq(DisasContext *dc, arg_r_r_r *a)
54
return RdV;
72
gen_op_clear_ieee_excp_and_FTT();
73
src1 = gen_load_fpr_D(dc, a->rs1);
74
src2 = gen_load_fpr_D(dc, a->rs2);
75
- gen_helper_fdmulq(tcg_env, src1, src2);
76
+ dst = tcg_temp_new_i128();
77
+ gen_helper_fdmulq(dst, tcg_env, src1, src2);
78
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
79
- gen_op_store_QT0_fpr(QFPREG(a->rd));
80
- gen_update_fprs_dirty(dc, QFPREG(a->rd));
81
+ gen_store_fpr_Q(dc, a->rd, dst);
82
return advance_pc(dc);
83
}
55
}
84
85
--
56
--
86
2.34.1
57
2.43.0
diff view generated by jsdifflib
New patch
1
There are no special cases for this instruction.
1
2
3
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/hexagon/op_helper.c | 2 +-
7
1 file changed, 1 insertion(+), 1 deletion(-)
8
9
diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/hexagon/op_helper.c
12
+++ b/target/hexagon/op_helper.c
13
@@ -XXX,XX +XXX,XX @@ float32 HELPER(sffma)(CPUHexagonState *env, float32 RxV,
14
float32 RsV, float32 RtV)
15
{
16
arch_fpop_start(env);
17
- RxV = internal_fmafx(RsV, RtV, RxV, 0, &env->fp_status);
18
+ RxV = float32_muladd(RsV, RtV, RxV, 0, &env->fp_status);
19
arch_fpop_end(env);
20
return RxV;
21
}
22
--
23
2.43.0
diff view generated by jsdifflib
New patch
1
There are no special cases for this instruction. Since hexagon
2
always uses default-nan mode, explicitly negating the first
3
input is unnecessary. Use float_muladd_negate_product instead.
1
4
5
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
8
target/hexagon/op_helper.c | 5 ++---
9
1 file changed, 2 insertions(+), 3 deletions(-)
10
11
diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/hexagon/op_helper.c
14
+++ b/target/hexagon/op_helper.c
15
@@ -XXX,XX +XXX,XX @@ float32 HELPER(sffma_sc)(CPUHexagonState *env, float32 RxV,
16
float32 HELPER(sffms)(CPUHexagonState *env, float32 RxV,
17
float32 RsV, float32 RtV)
18
{
19
- float32 neg_RsV;
20
arch_fpop_start(env);
21
- neg_RsV = float32_set_sign(RsV, float32_is_neg(RsV) ? 0 : 1);
22
- RxV = internal_fmafx(neg_RsV, RtV, RxV, 0, &env->fp_status);
23
+ RxV = float32_muladd(RsV, RtV, RxV, float_muladd_negate_product,
24
+ &env->fp_status);
25
arch_fpop_end(env);
26
return RxV;
27
}
28
--
29
2.43.0
diff view generated by jsdifflib
New patch
1
This instruction has a special case that 0 * x + c returns c
2
without the normal sign folding that comes with 0 + -0.
3
Use the new float_muladd_suppress_add_product_zero to
4
describe this.
1
5
6
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
7
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
8
---
9
target/hexagon/op_helper.c | 11 +++--------
10
1 file changed, 3 insertions(+), 8 deletions(-)
11
12
diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/hexagon/op_helper.c
15
+++ b/target/hexagon/op_helper.c
16
@@ -XXX,XX +XXX,XX @@ static float32 check_nan(float32 dst, float32 x, float_status *fp_status)
17
float32 HELPER(sffma_sc)(CPUHexagonState *env, float32 RxV,
18
float32 RsV, float32 RtV, float32 PuV)
19
{
20
- size4s_t tmp;
21
arch_fpop_start(env);
22
- RxV = check_nan(RxV, RxV, &env->fp_status);
23
- RxV = check_nan(RxV, RsV, &env->fp_status);
24
- RxV = check_nan(RxV, RtV, &env->fp_status);
25
- tmp = internal_fmafx(RsV, RtV, RxV, fSXTN(8, 64, PuV), &env->fp_status);
26
- if (!(float32_is_zero(RxV) && is_zero_prod(RsV, RtV))) {
27
- RxV = tmp;
28
- }
29
+ RxV = float32_muladd_scalbn(RsV, RtV, RxV, fSXTN(8, 64, PuV),
30
+ float_muladd_suppress_add_product_zero,
31
+ &env->fp_status);
32
arch_fpop_end(env);
33
return RxV;
34
}
35
--
36
2.43.0
diff view generated by jsdifflib
1
There are multiple special cases for this instruction.
2
(1) The saturate to normal maximum instead of overflow to infinity is
3
handled by the new float_round_nearest_even_max rounding mode.
4
(2) The 0 * n + c special case is handled by the new
5
float_muladd_suppress_add_product_zero flag.
6
(3) The Inf - Inf -> 0 special case can be detected after the fact
7
by examining float_flag_invalid_isi.
8
9
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
3
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
4
Message-Id: <20231103173841.33651-12-richard.henderson@linaro.org>
5
---
11
---
6
target/sparc/helper.h | 4 ++--
12
target/hexagon/op_helper.c | 105 +++++++++----------------------------
7
target/sparc/fop_helper.c | 8 ++++----
13
1 file changed, 26 insertions(+), 79 deletions(-)
8
target/sparc/translate.c | 9 +++++----
9
3 files changed, 11 insertions(+), 10 deletions(-)
10
14
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
15
diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
17
--- a/target/hexagon/op_helper.c
14
+++ b/target/sparc/helper.h
18
+++ b/target/hexagon/op_helper.c
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fsmuld, TCG_CALL_NO_RWG, f64, env, f32, f32)
19
@@ -XXX,XX +XXX,XX @@ float32 HELPER(sffma)(CPUHexagonState *env, float32 RxV,
16
DEF_HELPER_FLAGS_3(fdmulq, TCG_CALL_NO_RWG, void, env, f64, f64)
20
return RxV;
17
18
DEF_HELPER_FLAGS_2(fitod, TCG_CALL_NO_RWG_SE, f64, env, s32)
19
-DEF_HELPER_FLAGS_2(fitoq, TCG_CALL_NO_RWG, void, env, s32)
20
+DEF_HELPER_FLAGS_2(fitoq, TCG_CALL_NO_RWG, i128, env, s32)
21
22
DEF_HELPER_FLAGS_2(fitos, TCG_CALL_NO_RWG, f32, env, s32)
23
24
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(fxtoq, TCG_CALL_NO_RWG, void, env, s64)
25
DEF_HELPER_FLAGS_2(fdtos, TCG_CALL_NO_RWG, f32, env, f64)
26
DEF_HELPER_FLAGS_2(fstod, TCG_CALL_NO_RWG, f64, env, f32)
27
DEF_HELPER_FLAGS_2(fqtos, TCG_CALL_NO_RWG, f32, env, i128)
28
-DEF_HELPER_FLAGS_2(fstoq, TCG_CALL_NO_RWG, void, env, f32)
29
+DEF_HELPER_FLAGS_2(fstoq, TCG_CALL_NO_RWG, i128, env, f32)
30
DEF_HELPER_FLAGS_2(fqtod, TCG_CALL_NO_RWG, f64, env, i128)
31
DEF_HELPER_FLAGS_2(fdtoq, TCG_CALL_NO_RWG, void, env, f64)
32
DEF_HELPER_FLAGS_2(fstoi, TCG_CALL_NO_RWG, s32, env, f32)
33
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/sparc/fop_helper.c
36
+++ b/target/sparc/fop_helper.c
37
@@ -XXX,XX +XXX,XX @@ float64 helper_fitod(CPUSPARCState *env, int32_t src)
38
return int32_to_float64(src, &env->fp_status);
39
}
21
}
40
22
41
-void helper_fitoq(CPUSPARCState *env, int32_t src)
23
-static bool is_zero_prod(float32 a, float32 b)
42
+Int128 helper_fitoq(CPUSPARCState *env, int32_t src)
24
-{
25
- return ((float32_is_zero(a) && is_finite(b)) ||
26
- (float32_is_zero(b) && is_finite(a)));
27
-}
28
-
29
-static float32 check_nan(float32 dst, float32 x, float_status *fp_status)
30
-{
31
- float32 ret = dst;
32
- if (float32_is_any_nan(x)) {
33
- if (extract32(x, 22, 1) == 0) {
34
- float_raise(float_flag_invalid, fp_status);
35
- }
36
- ret = make_float32(0xffffffff); /* nan */
37
- }
38
- return ret;
39
-}
40
-
41
float32 HELPER(sffma_sc)(CPUHexagonState *env, float32 RxV,
42
float32 RsV, float32 RtV, float32 PuV)
43
{
43
{
44
- QT0 = int32_to_float128(src, &env->fp_status);
44
@@ -XXX,XX +XXX,XX @@ float32 HELPER(sffms)(CPUHexagonState *env, float32 RxV,
45
+ return f128_ret(int32_to_float128(src, &env->fp_status));
45
return RxV;
46
}
46
}
47
47
48
#ifdef TARGET_SPARC64
48
-static bool is_inf_prod(int32_t a, int32_t b)
49
@@ -XXX,XX +XXX,XX @@ float32 helper_fqtos(CPUSPARCState *env, Int128 src)
49
+static float32 do_sffma_lib(CPUHexagonState *env, float32 RxV,
50
return float128_to_float32(f128_in(src), &env->fp_status);
50
+ float32 RsV, float32 RtV, int negate)
51
{
52
- return (float32_is_infinity(a) && float32_is_infinity(b)) ||
53
- (float32_is_infinity(a) && is_finite(b) && !float32_is_zero(b)) ||
54
- (float32_is_infinity(b) && is_finite(a) && !float32_is_zero(a));
55
+ int flags;
56
+
57
+ arch_fpop_start(env);
58
+
59
+ set_float_rounding_mode(float_round_nearest_even_max, &env->fp_status);
60
+ RxV = float32_muladd(RsV, RtV, RxV,
61
+ negate | float_muladd_suppress_add_product_zero,
62
+ &env->fp_status);
63
+
64
+ flags = get_float_exception_flags(&env->fp_status);
65
+ if (flags) {
66
+ /* Flags are suppressed by this instruction. */
67
+ set_float_exception_flags(0, &env->fp_status);
68
+
69
+ /* Return 0 for Inf - Inf. */
70
+ if (flags & float_flag_invalid_isi) {
71
+ RxV = 0;
72
+ }
73
+ }
74
+
75
+ arch_fpop_end(env);
76
+ return RxV;
51
}
77
}
52
78
53
-void helper_fstoq(CPUSPARCState *env, float32 src)
79
float32 HELPER(sffma_lib)(CPUHexagonState *env, float32 RxV,
54
+Int128 helper_fstoq(CPUSPARCState *env, float32 src)
80
float32 RsV, float32 RtV)
55
{
81
{
56
- QT0 = float32_to_float128(src, &env->fp_status);
82
- bool infinp;
57
+ return f128_ret(float32_to_float128(src, &env->fp_status));
83
- bool infminusinf;
84
- float32 tmp;
85
-
86
- arch_fpop_start(env);
87
- set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
88
- infminusinf = float32_is_infinity(RxV) &&
89
- is_inf_prod(RsV, RtV) &&
90
- (fGETBIT(31, RsV ^ RxV ^ RtV) != 0);
91
- infinp = float32_is_infinity(RxV) ||
92
- float32_is_infinity(RtV) ||
93
- float32_is_infinity(RsV);
94
- RxV = check_nan(RxV, RxV, &env->fp_status);
95
- RxV = check_nan(RxV, RsV, &env->fp_status);
96
- RxV = check_nan(RxV, RtV, &env->fp_status);
97
- tmp = internal_fmafx(RsV, RtV, RxV, 0, &env->fp_status);
98
- if (!(float32_is_zero(RxV) && is_zero_prod(RsV, RtV))) {
99
- RxV = tmp;
100
- }
101
- set_float_exception_flags(0, &env->fp_status);
102
- if (float32_is_infinity(RxV) && !infinp) {
103
- RxV = RxV - 1;
104
- }
105
- if (infminusinf) {
106
- RxV = 0;
107
- }
108
- arch_fpop_end(env);
109
- return RxV;
110
+ return do_sffma_lib(env, RxV, RsV, RtV, 0);
58
}
111
}
59
112
60
float64 helper_fqtod(CPUSPARCState *env, Int128 src)
113
float32 HELPER(sffms_lib)(CPUHexagonState *env, float32 RxV,
61
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
114
float32 RsV, float32 RtV)
62
index XXXXXXX..XXXXXXX 100644
63
--- a/target/sparc/translate.c
64
+++ b/target/sparc/translate.c
65
@@ -XXX,XX +XXX,XX @@ TRANS(FqTOd, ALL, do_env_dq, a, gen_helper_fqtod)
66
TRANS(FqTOx, 64, do_env_dq, a, gen_helper_fqtox)
67
68
static bool do_env_qf(DisasContext *dc, arg_r_r *a,
69
- void (*func)(TCGv_env, TCGv_i32))
70
+ void (*func)(TCGv_i128, TCGv_env, TCGv_i32))
71
{
115
{
72
TCGv_i32 src;
116
- bool infinp;
73
+ TCGv_i128 dst;
117
- bool infminusinf;
74
118
- float32 tmp;
75
if (gen_trap_ifnofpu(dc)) {
119
-
76
return true;
120
- arch_fpop_start(env);
77
@@ -XXX,XX +XXX,XX @@ static bool do_env_qf(DisasContext *dc, arg_r_r *a,
121
- set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
78
122
- infminusinf = float32_is_infinity(RxV) &&
79
gen_op_clear_ieee_excp_and_FTT();
123
- is_inf_prod(RsV, RtV) &&
80
src = gen_load_fpr_F(dc, a->rs);
124
- (fGETBIT(31, RsV ^ RxV ^ RtV) == 0);
81
- func(tcg_env, src);
125
- infinp = float32_is_infinity(RxV) ||
82
- gen_op_store_QT0_fpr(QFPREG(a->rd));
126
- float32_is_infinity(RtV) ||
83
- gen_update_fprs_dirty(dc, QFPREG(a->rd));
127
- float32_is_infinity(RsV);
84
+ dst = tcg_temp_new_i128();
128
- RxV = check_nan(RxV, RxV, &env->fp_status);
85
+ func(dst, tcg_env, src);
129
- RxV = check_nan(RxV, RsV, &env->fp_status);
86
+ gen_store_fpr_Q(dc, a->rd, dst);
130
- RxV = check_nan(RxV, RtV, &env->fp_status);
87
return advance_pc(dc);
131
- float32 minus_RsV = float32_sub(float32_zero, RsV, &env->fp_status);
132
- tmp = internal_fmafx(minus_RsV, RtV, RxV, 0, &env->fp_status);
133
- if (!(float32_is_zero(RxV) && is_zero_prod(RsV, RtV))) {
134
- RxV = tmp;
135
- }
136
- set_float_exception_flags(0, &env->fp_status);
137
- if (float32_is_infinity(RxV) && !infinp) {
138
- RxV = RxV - 1;
139
- }
140
- if (infminusinf) {
141
- RxV = 0;
142
- }
143
- arch_fpop_end(env);
144
- return RxV;
145
+ return do_sffma_lib(env, RxV, RsV, RtV, float_muladd_negate_product);
88
}
146
}
89
147
148
float64 HELPER(dfmpyfix)(CPUHexagonState *env, float64 RssV, float64 RttV)
90
--
149
--
91
2.34.1
150
2.43.0
diff view generated by jsdifflib
1
Without this padding, an unwind through the signal handler
1
The function is now unused.
2
will pick up the unwind info for the preceding syscall.
3
2
4
This fixes gcc's 30_threads/thread/native_handle/cancel.cc.
3
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
5
6
Cc: qemu-stable@nongnu.org
7
Fixes: ee95fae075c6 ("linux-user/aarch64: Add vdso")
8
Resolves: https://linaro.atlassian.net/browse/GNU-974
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
---
5
---
11
linux-user/aarch64/vdso-be.so | Bin 3216 -> 3224 bytes
6
target/hexagon/fma_emu.h | 2 -
12
linux-user/aarch64/vdso-le.so | Bin 3216 -> 3224 bytes
7
target/hexagon/fma_emu.c | 171 ---------------------------------------
13
linux-user/aarch64/vdso.S | 4 ++++
8
2 files changed, 173 deletions(-)
14
3 files changed, 4 insertions(+)
15
9
16
diff --git a/linux-user/aarch64/vdso-be.so b/linux-user/aarch64/vdso-be.so
10
diff --git a/target/hexagon/fma_emu.h b/target/hexagon/fma_emu.h
17
index XXXXXXX..XXXXXXX 100755
18
GIT binary patch
19
delta 121
20
zcmbOrIYV-SKI4pu2Kk&{7{Gw#%fuBAMC1c?^>~k}v|avdxNjSSLfftVb3bgJ!|2S&
21
z_-6A1CJrVZc?IUH8G;R$7#SF@Om<{a*v!K!&BXX-vIe^~TWO|cva$K*Om;sOMw`hy
22
ZxXl@VO#Z-a&zLdUfXALuXmSCM0s#EKC)of1
23
24
delta 116
25
zcmbOsIYDxQKI4Rm2Kk&H7{Gw#!^9O2L>8U?-5V_M@!kH(Sx4vJn|*ujLPgija~Pc&
26
z8DDIEz{J5c`3;N8W)W6tCdL<&4cM*OEF8_<v%@zRviq?xT1-B`ZO-^%@(*r%#)Qch
27
RJocPi5ThAdCO2?N002V6C;<Qf
28
29
diff --git a/linux-user/aarch64/vdso-le.so b/linux-user/aarch64/vdso-le.so
30
index XXXXXXX..XXXXXXX 100755
31
GIT binary patch
32
delta 129
33
zcmbOrIYV-S2IGv0n)#exSQx<I%fyAxMZTVBQ(04AP_*V|Vxp|@=@;x8zb9;-!)U|E
34
z_-6A>CVnO!c?IUH8G;R$7#SF@Om<{a*v!K!!o>JyvLd?^n`3BUW_royOm=q`Mw`hS
35
dxy>1WOn%92&zLb;lgFM@hy!9z%j7~Xc>tTxDQW-!
36
37
delta 108
38
zcmbOsIYDxQ2IGW@n)#d`SQx<I!^DNpMK&+G&+g_}w9WI@dn@@euKVesZ-h6`VYFdn
39
ze6jf^6F<}BH!LcfMOa0c7+*}*WOrgKEO1Fl%G+GX?#{w!F?lDqIpc@PAGz%r6DAw-
40
M*fVlXF62=M06owo?*IS*
41
42
diff --git a/linux-user/aarch64/vdso.S b/linux-user/aarch64/vdso.S
43
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
44
--- a/linux-user/aarch64/vdso.S
12
--- a/target/hexagon/fma_emu.h
45
+++ b/linux-user/aarch64/vdso.S
13
+++ b/target/hexagon/fma_emu.h
46
@@ -XXX,XX +XXX,XX @@ vdso_syscall __kernel_clock_getres, __NR_clock_getres
14
@@ -XXX,XX +XXX,XX @@ static inline uint32_t float32_getexp_raw(float32 f32)
47
* For now, elide the unwind info for __kernel_rt_sigreturn and rely on
15
}
48
* the libgcc fallback routine as we have always done. This requires
16
int32_t float32_getexp(float32 f32);
49
* that the code sequence used be exact.
17
float32 infinite_float32(uint8_t sign);
50
+ *
18
-float32 internal_fmafx(float32 a, float32 b, float32 c,
51
+ * Add a nop as a spacer to ensure that unwind does not pick up the
19
- int scale, float_status *fp_status);
52
+ * unwind info from the preceding syscall.
20
float64 internal_mpyhh(float64 a, float64 b,
53
*/
21
unsigned long long int accumulated,
54
+    nop
22
float_status *fp_status);
55
__kernel_rt_sigreturn:
23
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
56
    /* No BTI C insn here -- we arrive via RET. */
24
index XXXXXXX..XXXXXXX 100644
57
    mov    x8, #__NR_rt_sigreturn
25
--- a/target/hexagon/fma_emu.c
26
+++ b/target/hexagon/fma_emu.c
27
@@ -XXX,XX +XXX,XX @@ int32_t float64_getexp(float64 f64)
28
return -1;
29
}
30
31
-static uint64_t float32_getmant(float32 f32)
32
-{
33
- Float a = { .i = f32 };
34
- if (float32_is_normal(f32)) {
35
- return a.mant | 1ULL << 23;
36
- }
37
- if (float32_is_zero(f32)) {
38
- return 0;
39
- }
40
- if (float32_is_denormal(f32)) {
41
- return a.mant;
42
- }
43
- return ~0ULL;
44
-}
45
-
46
int32_t float32_getexp(float32 f32)
47
{
48
Float a = { .i = f32 };
49
@@ -XXX,XX +XXX,XX @@ float32 infinite_float32(uint8_t sign)
50
}
51
52
/* Return a maximum finite value with the requested sign */
53
-static float32 maxfinite_float32(uint8_t sign)
54
-{
55
- if (sign) {
56
- return make_float32(SF_MINUS_MAXF);
57
- } else {
58
- return make_float32(SF_MAXF);
59
- }
60
-}
61
-
62
-/* Return a zero value with requested sign */
63
-static float32 zero_float32(uint8_t sign)
64
-{
65
- if (sign) {
66
- return make_float32(0x80000000);
67
- } else {
68
- return float32_zero;
69
- }
70
-}
71
-
72
#define GEN_XF_ROUND(SUFFIX, MANTBITS, INF_EXP, INTERNAL_TYPE) \
73
static SUFFIX accum_round_##SUFFIX(Accum a, float_status * fp_status) \
74
{ \
75
@@ -XXX,XX +XXX,XX @@ static SUFFIX accum_round_##SUFFIX(Accum a, float_status * fp_status) \
76
}
77
78
GEN_XF_ROUND(float64, DF_MANTBITS, DF_INF_EXP, Double)
79
-GEN_XF_ROUND(float32, SF_MANTBITS, SF_INF_EXP, Float)
80
-
81
-static bool is_inf_prod(float64 a, float64 b)
82
-{
83
- return ((float64_is_infinity(a) && float64_is_infinity(b)) ||
84
- (float64_is_infinity(a) && is_finite(b) && (!float64_is_zero(b))) ||
85
- (float64_is_infinity(b) && is_finite(a) && (!float64_is_zero(a))));
86
-}
87
-
88
-static float64 special_fma(float64 a, float64 b, float64 c,
89
- float_status *fp_status)
90
-{
91
- float64 ret = make_float64(0);
92
-
93
- /*
94
- * If A multiplied by B is an exact infinity and C is also an infinity
95
- * but with the opposite sign, FMA returns NaN and raises invalid.
96
- */
97
- uint8_t a_sign = float64_is_neg(a);
98
- uint8_t b_sign = float64_is_neg(b);
99
- uint8_t c_sign = float64_is_neg(c);
100
- if (is_inf_prod(a, b) && float64_is_infinity(c)) {
101
- if ((a_sign ^ b_sign) != c_sign) {
102
- ret = make_float64(DF_NAN);
103
- float_raise(float_flag_invalid, fp_status);
104
- return ret;
105
- }
106
- }
107
- if ((float64_is_infinity(a) && float64_is_zero(b)) ||
108
- (float64_is_zero(a) && float64_is_infinity(b))) {
109
- ret = make_float64(DF_NAN);
110
- float_raise(float_flag_invalid, fp_status);
111
- return ret;
112
- }
113
- /*
114
- * If none of the above checks are true and C is a NaN,
115
- * a NaN shall be returned
116
- * If A or B are NaN, a NAN shall be returned.
117
- */
118
- if (float64_is_any_nan(a) ||
119
- float64_is_any_nan(b) ||
120
- float64_is_any_nan(c)) {
121
- if (float64_is_any_nan(a) && (fGETBIT(51, a) == 0)) {
122
- float_raise(float_flag_invalid, fp_status);
123
- }
124
- if (float64_is_any_nan(b) && (fGETBIT(51, b) == 0)) {
125
- float_raise(float_flag_invalid, fp_status);
126
- }
127
- if (float64_is_any_nan(c) && (fGETBIT(51, c) == 0)) {
128
- float_raise(float_flag_invalid, fp_status);
129
- }
130
- ret = make_float64(DF_NAN);
131
- return ret;
132
- }
133
- /*
134
- * We have checked for adding opposite-signed infinities.
135
- * Other infinities return infinity with the correct sign
136
- */
137
- if (float64_is_infinity(c)) {
138
- ret = infinite_float64(c_sign);
139
- return ret;
140
- }
141
- if (float64_is_infinity(a) || float64_is_infinity(b)) {
142
- ret = infinite_float64(a_sign ^ b_sign);
143
- return ret;
144
- }
145
- g_assert_not_reached();
146
-}
147
-
148
-static float32 special_fmaf(float32 a, float32 b, float32 c,
149
- float_status *fp_status)
150
-{
151
- float64 aa, bb, cc;
152
- aa = float32_to_float64(a, fp_status);
153
- bb = float32_to_float64(b, fp_status);
154
- cc = float32_to_float64(c, fp_status);
155
- return float64_to_float32(special_fma(aa, bb, cc, fp_status), fp_status);
156
-}
157
-
158
-float32 internal_fmafx(float32 a, float32 b, float32 c, int scale,
159
- float_status *fp_status)
160
-{
161
- Accum prod;
162
- Accum acc;
163
- Accum result;
164
- accum_init(&prod);
165
- accum_init(&acc);
166
- accum_init(&result);
167
-
168
- uint8_t a_sign = float32_is_neg(a);
169
- uint8_t b_sign = float32_is_neg(b);
170
- uint8_t c_sign = float32_is_neg(c);
171
- if (float32_is_infinity(a) ||
172
- float32_is_infinity(b) ||
173
- float32_is_infinity(c)) {
174
- return special_fmaf(a, b, c, fp_status);
175
- }
176
- if (float32_is_any_nan(a) ||
177
- float32_is_any_nan(b) ||
178
- float32_is_any_nan(c)) {
179
- return special_fmaf(a, b, c, fp_status);
180
- }
181
- if ((scale == 0) && (float32_is_zero(a) || float32_is_zero(b))) {
182
- float32 tmp = float32_mul(a, b, fp_status);
183
- tmp = float32_add(tmp, c, fp_status);
184
- return tmp;
185
- }
186
-
187
- /* (a * 2**b) * (c * 2**d) == a*c * 2**(b+d) */
188
- prod.mant = int128_mul_6464(float32_getmant(a), float32_getmant(b));
189
-
190
- /*
191
- * Note: extracting the mantissa into an int is multiplying by
192
- * 2**23, so adjust here
193
- */
194
- prod.exp = float32_getexp(a) + float32_getexp(b) - SF_BIAS - 23;
195
- prod.sign = a_sign ^ b_sign;
196
- if (float32_is_zero(a) || float32_is_zero(b)) {
197
- prod.exp = -2 * WAY_BIG_EXP;
198
- }
199
- if ((scale > 0) && float32_is_denormal(c)) {
200
- acc.mant = int128_mul_6464(0, 0);
201
- acc.exp = -WAY_BIG_EXP;
202
- acc.sign = c_sign;
203
- acc.sticky = 1;
204
- result = accum_add(prod, acc);
205
- } else if (!float32_is_zero(c)) {
206
- acc.mant = int128_mul_6464(float32_getmant(c), 1);
207
- acc.exp = float32_getexp(c);
208
- acc.sign = c_sign;
209
- result = accum_add(prod, acc);
210
- } else {
211
- result = prod;
212
- }
213
- result.exp += scale;
214
- return accum_round_float32(result, fp_status);
215
-}
216
217
float64 internal_mpyhh(float64 a, float64 b,
218
unsigned long long int accumulated,
58
--
219
--
59
2.34.1
220
2.43.0
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
This massive macro is now only used once.
2
Expand it for use only by float64.
3
4
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
6
---
4
target/loongarch/cpu.h | 6 ++----
7
target/hexagon/fma_emu.c | 255 +++++++++++++++++++--------------------
5
target/loongarch/cpu.c | 11 +++++++++++
8
1 file changed, 127 insertions(+), 128 deletions(-)
6
2 files changed, 13 insertions(+), 4 deletions(-)
7
9
8
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
10
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
9
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
10
--- a/target/loongarch/cpu.h
12
--- a/target/hexagon/fma_emu.c
11
+++ b/target/loongarch/cpu.h
13
+++ b/target/hexagon/fma_emu.c
12
@@ -XXX,XX +XXX,XX @@ struct LoongArchCPUClass {
14
@@ -XXX,XX +XXX,XX @@ float32 infinite_float32(uint8_t sign)
13
#define MMU_IDX_USER MMU_PLV_USER
14
#define MMU_IDX_DA 4
15
16
+int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch);
17
static inline int cpu_mmu_index(CPULoongArchState *env, bool ifetch)
18
{
19
#ifdef CONFIG_USER_ONLY
20
return MMU_IDX_USER;
21
#else
22
- if (FIELD_EX64(env->CSR_CRMD, CSR_CRMD, PG)) {
23
- return FIELD_EX64(env->CSR_CRMD, CSR_CRMD, PLV);
24
- }
25
- return MMU_IDX_DA;
26
+ return loongarch_cpu_mmu_index(env_cpu(env), ifetch);
27
#endif
28
}
15
}
29
16
30
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
17
/* Return a maximum finite value with the requested sign */
31
index XXXXXXX..XXXXXXX 100644
18
-#define GEN_XF_ROUND(SUFFIX, MANTBITS, INF_EXP, INTERNAL_TYPE) \
32
--- a/target/loongarch/cpu.c
19
-static SUFFIX accum_round_##SUFFIX(Accum a, float_status * fp_status) \
33
+++ b/target/loongarch/cpu.c
20
-{ \
34
@@ -XXX,XX +XXX,XX @@ static bool loongarch_cpu_has_work(CPUState *cs)
21
- if ((int128_gethi(a.mant) == 0) && (int128_getlo(a.mant) == 0) \
35
#endif
22
- && ((a.guard | a.round | a.sticky) == 0)) { \
23
- /* result zero */ \
24
- switch (fp_status->float_rounding_mode) { \
25
- case float_round_down: \
26
- return zero_##SUFFIX(1); \
27
- default: \
28
- return zero_##SUFFIX(0); \
29
- } \
30
- } \
31
- /* Normalize right */ \
32
- /* We want MANTBITS bits of mantissa plus the leading one. */ \
33
- /* That means that we want MANTBITS+1 bits, or 0x000000000000FF_FFFF */ \
34
- /* So we need to normalize right while the high word is non-zero and \
35
- * while the low word is nonzero when masked with 0xffe0_0000_0000_0000 */ \
36
- while ((int128_gethi(a.mant) != 0) || \
37
- ((int128_getlo(a.mant) >> (MANTBITS + 1)) != 0)) { \
38
- a = accum_norm_right(a, 1); \
39
- } \
40
- /* \
41
- * OK, now normalize left \
42
- * We want to normalize left until we have a leading one in bit 24 \
43
- * Theoretically, we only need to shift a maximum of one to the left if we \
44
- * shifted out lots of bits from B, or if we had no shift / 1 shift sticky \
45
- * should be 0 \
46
- */ \
47
- while ((int128_getlo(a.mant) & (1ULL << MANTBITS)) == 0) { \
48
- a = accum_norm_left(a); \
49
- } \
50
- /* \
51
- * OK, now we might need to denormalize because of potential underflow. \
52
- * We need to do this before rounding, and rounding might make us normal \
53
- * again \
54
- */ \
55
- while (a.exp <= 0) { \
56
- a = accum_norm_right(a, 1 - a.exp); \
57
- /* \
58
- * Do we have underflow? \
59
- * That's when we get an inexact answer because we ran out of bits \
60
- * in a denormal. \
61
- */ \
62
- if (a.guard || a.round || a.sticky) { \
63
- float_raise(float_flag_underflow, fp_status); \
64
- } \
65
- } \
66
- /* OK, we're relatively canonical... now we need to round */ \
67
- if (a.guard || a.round || a.sticky) { \
68
- float_raise(float_flag_inexact, fp_status); \
69
- switch (fp_status->float_rounding_mode) { \
70
- case float_round_to_zero: \
71
- /* Chop and we're done */ \
72
- break; \
73
- case float_round_up: \
74
- if (a.sign == 0) { \
75
- a.mant = int128_add(a.mant, int128_one()); \
76
- } \
77
- break; \
78
- case float_round_down: \
79
- if (a.sign != 0) { \
80
- a.mant = int128_add(a.mant, int128_one()); \
81
- } \
82
- break; \
83
- default: \
84
- if (a.round || a.sticky) { \
85
- /* round up if guard is 1, down if guard is zero */ \
86
- a.mant = int128_add(a.mant, int128_make64(a.guard)); \
87
- } else if (a.guard) { \
88
- /* exactly .5, round up if odd */ \
89
- a.mant = int128_add(a.mant, int128_and(a.mant, int128_one())); \
90
- } \
91
- break; \
92
- } \
93
- } \
94
- /* \
95
- * OK, now we might have carried all the way up. \
96
- * So we might need to shr once \
97
- * at least we know that the lsb should be zero if we rounded and \
98
- * got a carry out... \
99
- */ \
100
- if ((int128_getlo(a.mant) >> (MANTBITS + 1)) != 0) { \
101
- a = accum_norm_right(a, 1); \
102
- } \
103
- /* Overflow? */ \
104
- if (a.exp >= INF_EXP) { \
105
- /* Yep, inf result */ \
106
- float_raise(float_flag_overflow, fp_status); \
107
- float_raise(float_flag_inexact, fp_status); \
108
- switch (fp_status->float_rounding_mode) { \
109
- case float_round_to_zero: \
110
- return maxfinite_##SUFFIX(a.sign); \
111
- case float_round_up: \
112
- if (a.sign == 0) { \
113
- return infinite_##SUFFIX(a.sign); \
114
- } else { \
115
- return maxfinite_##SUFFIX(a.sign); \
116
- } \
117
- case float_round_down: \
118
- if (a.sign != 0) { \
119
- return infinite_##SUFFIX(a.sign); \
120
- } else { \
121
- return maxfinite_##SUFFIX(a.sign); \
122
- } \
123
- default: \
124
- return infinite_##SUFFIX(a.sign); \
125
- } \
126
- } \
127
- /* Underflow? */ \
128
- if (int128_getlo(a.mant) & (1ULL << MANTBITS)) { \
129
- /* Leading one means: No, we're normal. So, we should be done... */ \
130
- INTERNAL_TYPE ret; \
131
- ret.i = 0; \
132
- ret.sign = a.sign; \
133
- ret.exp = a.exp; \
134
- ret.mant = int128_getlo(a.mant); \
135
- return ret.i; \
136
- } \
137
- assert(a.exp == 1); \
138
- INTERNAL_TYPE ret; \
139
- ret.i = 0; \
140
- ret.sign = a.sign; \
141
- ret.exp = 0; \
142
- ret.mant = int128_getlo(a.mant); \
143
- return ret.i; \
144
+static float64 accum_round_float64(Accum a, float_status *fp_status)
145
+{
146
+ if ((int128_gethi(a.mant) == 0) && (int128_getlo(a.mant) == 0)
147
+ && ((a.guard | a.round | a.sticky) == 0)) {
148
+ /* result zero */
149
+ switch (fp_status->float_rounding_mode) {
150
+ case float_round_down:
151
+ return zero_float64(1);
152
+ default:
153
+ return zero_float64(0);
154
+ }
155
+ }
156
+ /*
157
+ * Normalize right
158
+ * We want DF_MANTBITS bits of mantissa plus the leading one.
159
+ * That means that we want DF_MANTBITS+1 bits, or 0x000000000000FF_FFFF
160
+ * So we need to normalize right while the high word is non-zero and
161
+ * while the low word is nonzero when masked with 0xffe0_0000_0000_0000
162
+ */
163
+ while ((int128_gethi(a.mant) != 0) ||
164
+ ((int128_getlo(a.mant) >> (DF_MANTBITS + 1)) != 0)) {
165
+ a = accum_norm_right(a, 1);
166
+ }
167
+ /*
168
+ * OK, now normalize left
169
+ * We want to normalize left until we have a leading one in bit 24
170
+ * Theoretically, we only need to shift a maximum of one to the left if we
171
+ * shifted out lots of bits from B, or if we had no shift / 1 shift sticky
172
+ * should be 0
173
+ */
174
+ while ((int128_getlo(a.mant) & (1ULL << DF_MANTBITS)) == 0) {
175
+ a = accum_norm_left(a);
176
+ }
177
+ /*
178
+ * OK, now we might need to denormalize because of potential underflow.
179
+ * We need to do this before rounding, and rounding might make us normal
180
+ * again
181
+ */
182
+ while (a.exp <= 0) {
183
+ a = accum_norm_right(a, 1 - a.exp);
184
+ /*
185
+ * Do we have underflow?
186
+ * That's when we get an inexact answer because we ran out of bits
187
+ * in a denormal.
188
+ */
189
+ if (a.guard || a.round || a.sticky) {
190
+ float_raise(float_flag_underflow, fp_status);
191
+ }
192
+ }
193
+ /* OK, we're relatively canonical... now we need to round */
194
+ if (a.guard || a.round || a.sticky) {
195
+ float_raise(float_flag_inexact, fp_status);
196
+ switch (fp_status->float_rounding_mode) {
197
+ case float_round_to_zero:
198
+ /* Chop and we're done */
199
+ break;
200
+ case float_round_up:
201
+ if (a.sign == 0) {
202
+ a.mant = int128_add(a.mant, int128_one());
203
+ }
204
+ break;
205
+ case float_round_down:
206
+ if (a.sign != 0) {
207
+ a.mant = int128_add(a.mant, int128_one());
208
+ }
209
+ break;
210
+ default:
211
+ if (a.round || a.sticky) {
212
+ /* round up if guard is 1, down if guard is zero */
213
+ a.mant = int128_add(a.mant, int128_make64(a.guard));
214
+ } else if (a.guard) {
215
+ /* exactly .5, round up if odd */
216
+ a.mant = int128_add(a.mant, int128_and(a.mant, int128_one()));
217
+ }
218
+ break;
219
+ }
220
+ }
221
+ /*
222
+ * OK, now we might have carried all the way up.
223
+ * So we might need to shr once
224
+ * at least we know that the lsb should be zero if we rounded and
225
+ * got a carry out...
226
+ */
227
+ if ((int128_getlo(a.mant) >> (DF_MANTBITS + 1)) != 0) {
228
+ a = accum_norm_right(a, 1);
229
+ }
230
+ /* Overflow? */
231
+ if (a.exp >= DF_INF_EXP) {
232
+ /* Yep, inf result */
233
+ float_raise(float_flag_overflow, fp_status);
234
+ float_raise(float_flag_inexact, fp_status);
235
+ switch (fp_status->float_rounding_mode) {
236
+ case float_round_to_zero:
237
+ return maxfinite_float64(a.sign);
238
+ case float_round_up:
239
+ if (a.sign == 0) {
240
+ return infinite_float64(a.sign);
241
+ } else {
242
+ return maxfinite_float64(a.sign);
243
+ }
244
+ case float_round_down:
245
+ if (a.sign != 0) {
246
+ return infinite_float64(a.sign);
247
+ } else {
248
+ return maxfinite_float64(a.sign);
249
+ }
250
+ default:
251
+ return infinite_float64(a.sign);
252
+ }
253
+ }
254
+ /* Underflow? */
255
+ if (int128_getlo(a.mant) & (1ULL << DF_MANTBITS)) {
256
+ /* Leading one means: No, we're normal. So, we should be done... */
257
+ Double ret;
258
+ ret.i = 0;
259
+ ret.sign = a.sign;
260
+ ret.exp = a.exp;
261
+ ret.mant = int128_getlo(a.mant);
262
+ return ret.i;
263
+ }
264
+ assert(a.exp == 1);
265
+ Double ret;
266
+ ret.i = 0;
267
+ ret.sign = a.sign;
268
+ ret.exp = 0;
269
+ ret.mant = int128_getlo(a.mant);
270
+ return ret.i;
36
}
271
}
37
272
38
+int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch)
273
-GEN_XF_ROUND(float64, DF_MANTBITS, DF_INF_EXP, Double)
39
+{
274
-
40
+ CPULoongArchState *env = cpu_env(cs);
275
float64 internal_mpyhh(float64 a, float64 b,
41
+
276
unsigned long long int accumulated,
42
+ if (FIELD_EX64(env->CSR_CRMD, CSR_CRMD, PG)) {
277
float_status *fp_status)
43
+ return FIELD_EX64(env->CSR_CRMD, CSR_CRMD, PLV);
44
+ }
45
+ return MMU_IDX_DA;
46
+}
47
+
48
static void loongarch_la464_initfn(Object *obj)
49
{
50
LoongArchCPU *cpu = LOONGARCH_CPU(obj);
51
@@ -XXX,XX +XXX,XX @@ static void loongarch_cpu_class_init(ObjectClass *c, void *data)
52
53
cc->class_by_name = loongarch_cpu_class_by_name;
54
cc->has_work = loongarch_cpu_has_work;
55
+ cc->mmu_index = loongarch_cpu_mmu_index;
56
cc->dump_state = loongarch_cpu_dump_state;
57
cc->set_pc = loongarch_cpu_set_pc;
58
cc->get_pc = loongarch_cpu_get_pc;
59
--
278
--
60
2.34.1
279
2.43.0
61
62
diff view generated by jsdifflib
1
Free up the riscv_cpu_mmu_index name for other usage;
1
This structure, with bitfields, is incorrect for big-endian.
2
emphasize that the argument is 'env'.
2
Use the existing float32_getexp_raw which uses extract32.
3
3
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
4
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
6
---
8
target/riscv/cpu.h | 4 ++--
7
target/hexagon/fma_emu.c | 16 +++-------------
9
target/riscv/cpu_helper.c | 2 +-
8
1 file changed, 3 insertions(+), 13 deletions(-)
10
2 files changed, 3 insertions(+), 3 deletions(-)
11
9
12
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
10
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
13
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
14
--- a/target/riscv/cpu.h
12
--- a/target/hexagon/fma_emu.c
15
+++ b/target/riscv/cpu.h
13
+++ b/target/hexagon/fma_emu.c
16
@@ -XXX,XX +XXX,XX @@ target_ulong riscv_cpu_get_geilen(CPURISCVState *env);
14
@@ -XXX,XX +XXX,XX @@ typedef union {
17
void riscv_cpu_set_geilen(CPURISCVState *env, target_ulong geilen);
15
};
18
bool riscv_cpu_vector_enabled(CPURISCVState *env);
16
} Double;
19
void riscv_cpu_set_virt_enabled(CPURISCVState *env, bool enable);
17
20
-int riscv_cpu_mmu_index(CPURISCVState *env, bool ifetch);
18
-typedef union {
21
+int riscv_env_mmu_index(CPURISCVState *env, bool ifetch);
19
- float f;
22
G_NORETURN void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
20
- uint32_t i;
23
MMUAccessType access_type,
21
- struct {
24
int mmu_idx, uintptr_t retaddr);
22
- uint32_t mant:23;
25
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
23
- uint32_t exp:8;
26
bool probe, uintptr_t retaddr);
24
- uint32_t sign:1;
27
char *riscv_isa_string(RISCVCPU *cpu);
25
- };
28
26
-} Float;
29
-#define cpu_mmu_index riscv_cpu_mmu_index
27
-
30
+#define cpu_mmu_index riscv_env_mmu_index
28
static uint64_t float64_getmant(float64 f64)
31
32
#ifndef CONFIG_USER_ONLY
33
void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
34
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/riscv/cpu_helper.c
37
+++ b/target/riscv/cpu_helper.c
38
@@ -XXX,XX +XXX,XX @@
39
#include "debug.h"
40
#include "tcg/oversized-guest.h"
41
42
-int riscv_cpu_mmu_index(CPURISCVState *env, bool ifetch)
43
+int riscv_env_mmu_index(CPURISCVState *env, bool ifetch)
44
{
29
{
45
#ifdef CONFIG_USER_ONLY
30
Double a = { .i = f64 };
46
return 0;
31
@@ -XXX,XX +XXX,XX @@ int32_t float64_getexp(float64 f64)
32
33
int32_t float32_getexp(float32 f32)
34
{
35
- Float a = { .i = f32 };
36
+ int exp = float32_getexp_raw(f32);
37
if (float32_is_normal(f32)) {
38
- return a.exp;
39
+ return exp;
40
}
41
if (float32_is_denormal(f32)) {
42
- return a.exp + 1;
43
+ return exp + 1;
44
}
45
return -1;
46
}
47
--
47
--
48
2.34.1
48
2.43.0
49
50
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
This structure, with bitfields, is incorrect for big-endian.
2
Use extract64 and deposit64 instead.
3
4
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
6
---
4
target/avr/cpu.h | 4 +---
7
target/hexagon/fma_emu.c | 46 ++++++++++++++--------------------------
5
target/avr/cpu.c | 6 ++++++
8
1 file changed, 16 insertions(+), 30 deletions(-)
6
2 files changed, 7 insertions(+), 3 deletions(-)
7
9
8
diff --git a/target/avr/cpu.h b/target/avr/cpu.h
10
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
9
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
10
--- a/target/avr/cpu.h
12
--- a/target/hexagon/fma_emu.c
11
+++ b/target/avr/cpu.h
13
+++ b/target/hexagon/fma_emu.c
12
@@ -XXX,XX +XXX,XX @@ static inline void set_avr_feature(CPUAVRState *env, int feature)
14
@@ -XXX,XX +XXX,XX @@
13
env->features |= (1U << feature);
15
16
#define WAY_BIG_EXP 4096
17
18
-typedef union {
19
- double f;
20
- uint64_t i;
21
- struct {
22
- uint64_t mant:52;
23
- uint64_t exp:11;
24
- uint64_t sign:1;
25
- };
26
-} Double;
27
-
28
static uint64_t float64_getmant(float64 f64)
29
{
30
- Double a = { .i = f64 };
31
+ uint64_t mant = extract64(f64, 0, 52);
32
if (float64_is_normal(f64)) {
33
- return a.mant | 1ULL << 52;
34
+ return mant | 1ULL << 52;
35
}
36
if (float64_is_zero(f64)) {
37
return 0;
38
}
39
if (float64_is_denormal(f64)) {
40
- return a.mant;
41
+ return mant;
42
}
43
return ~0ULL;
14
}
44
}
15
45
16
-#define cpu_mmu_index avr_cpu_mmu_index
46
int32_t float64_getexp(float64 f64)
17
-
18
-static inline int avr_cpu_mmu_index(CPUAVRState *env, bool ifetch)
19
+static inline int cpu_mmu_index(CPUAVRState *env, bool ifetch)
20
{
47
{
21
return ifetch ? MMU_CODE_IDX : MMU_DATA_IDX;
48
- Double a = { .i = f64 };
49
+ int exp = extract64(f64, 52, 11);
50
if (float64_is_normal(f64)) {
51
- return a.exp;
52
+ return exp;
53
}
54
if (float64_is_denormal(f64)) {
55
- return a.exp + 1;
56
+ return exp + 1;
57
}
58
return -1;
22
}
59
}
23
diff --git a/target/avr/cpu.c b/target/avr/cpu.c
60
@@ -XXX,XX +XXX,XX @@ float32 infinite_float32(uint8_t sign)
24
index XXXXXXX..XXXXXXX 100644
61
/* Return a maximum finite value with the requested sign */
25
--- a/target/avr/cpu.c
62
static float64 accum_round_float64(Accum a, float_status *fp_status)
26
+++ b/target/avr/cpu.c
63
{
27
@@ -XXX,XX +XXX,XX @@ static bool avr_cpu_has_work(CPUState *cs)
64
+ uint64_t ret;
28
&& cpu_interrupts_enabled(env);
65
+
66
if ((int128_gethi(a.mant) == 0) && (int128_getlo(a.mant) == 0)
67
&& ((a.guard | a.round | a.sticky) == 0)) {
68
/* result zero */
69
@@ -XXX,XX +XXX,XX @@ static float64 accum_round_float64(Accum a, float_status *fp_status)
70
}
71
}
72
/* Underflow? */
73
- if (int128_getlo(a.mant) & (1ULL << DF_MANTBITS)) {
74
+ ret = int128_getlo(a.mant);
75
+ if (ret & (1ULL << DF_MANTBITS)) {
76
/* Leading one means: No, we're normal. So, we should be done... */
77
- Double ret;
78
- ret.i = 0;
79
- ret.sign = a.sign;
80
- ret.exp = a.exp;
81
- ret.mant = int128_getlo(a.mant);
82
- return ret.i;
83
+ ret = deposit64(ret, 52, 11, a.exp);
84
+ } else {
85
+ assert(a.exp == 1);
86
+ ret = deposit64(ret, 52, 11, 0);
87
}
88
- assert(a.exp == 1);
89
- Double ret;
90
- ret.i = 0;
91
- ret.sign = a.sign;
92
- ret.exp = 0;
93
- ret.mant = int128_getlo(a.mant);
94
- return ret.i;
95
+ ret = deposit64(ret, 63, 1, a.sign);
96
+ return ret;
29
}
97
}
30
98
31
+static int avr_cpu_mmu_index(CPUState *cs, bool ifetch)
99
float64 internal_mpyhh(float64 a, float64 b,
32
+{
33
+ return ifetch ? MMU_CODE_IDX : MMU_DATA_IDX;
34
+}
35
+
36
static void avr_cpu_synchronize_from_tb(CPUState *cs,
37
const TranslationBlock *tb)
38
{
39
@@ -XXX,XX +XXX,XX @@ static void avr_cpu_class_init(ObjectClass *oc, void *data)
40
cc->class_by_name = avr_cpu_class_by_name;
41
42
cc->has_work = avr_cpu_has_work;
43
+ cc->mmu_index = avr_cpu_mmu_index;
44
cc->dump_state = avr_cpu_dump_state;
45
cc->set_pc = avr_cpu_set_pc;
46
cc->get_pc = avr_cpu_get_pc;
47
--
100
--
48
2.34.1
101
2.43.0
49
50
diff view generated by jsdifflib
1
No need to open-code 64x64->128-bit multiplication.
2
3
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
3
Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
4
Message-Id: <20231103173841.33651-11-richard.henderson@linaro.org>
5
---
5
---
6
target/sparc/helper.h | 16 ++++++------
6
target/hexagon/fma_emu.c | 32 +++-----------------------------
7
target/sparc/fop_helper.c | 23 +++++++++--------
7
1 file changed, 3 insertions(+), 29 deletions(-)
8
target/sparc/translate.c | 54 +++++++++++++++------------------------
9
3 files changed, 41 insertions(+), 52 deletions(-)
10
8
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
9
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
12
index XXXXXXX..XXXXXXX 100644
10
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
11
--- a/target/hexagon/fma_emu.c
14
+++ b/target/sparc/helper.h
12
+++ b/target/hexagon/fma_emu.c
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fcmpd, TCG_CALL_NO_WG, tl, env, f64, f64)
13
@@ -XXX,XX +XXX,XX @@ int32_t float32_getexp(float32 f32)
16
DEF_HELPER_FLAGS_3(fcmpes, TCG_CALL_NO_WG, tl, env, f32, f32)
14
return -1;
17
DEF_HELPER_FLAGS_3(fcmped, TCG_CALL_NO_WG, tl, env, f64, f64)
18
DEF_HELPER_FLAGS_2(fsqrtq, TCG_CALL_NO_RWG, i128, env, i128)
19
-DEF_HELPER_FLAGS_1(fcmpq, TCG_CALL_NO_WG, tl, env)
20
-DEF_HELPER_FLAGS_1(fcmpeq, TCG_CALL_NO_WG, tl, env)
21
+DEF_HELPER_FLAGS_3(fcmpq, TCG_CALL_NO_WG, tl, env, i128, i128)
22
+DEF_HELPER_FLAGS_3(fcmpeq, TCG_CALL_NO_WG, tl, env, i128, i128)
23
#ifdef TARGET_SPARC64
24
DEF_HELPER_FLAGS_3(fcmps_fcc1, TCG_CALL_NO_WG, tl, env, f32, f32)
25
DEF_HELPER_FLAGS_3(fcmps_fcc2, TCG_CALL_NO_WG, tl, env, f32, f32)
26
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fcmpes_fcc3, TCG_CALL_NO_WG, tl, env, f32, f32)
27
DEF_HELPER_FLAGS_3(fcmped_fcc1, TCG_CALL_NO_WG, tl, env, f64, f64)
28
DEF_HELPER_FLAGS_3(fcmped_fcc2, TCG_CALL_NO_WG, tl, env, f64, f64)
29
DEF_HELPER_FLAGS_3(fcmped_fcc3, TCG_CALL_NO_WG, tl, env, f64, f64)
30
-DEF_HELPER_FLAGS_1(fcmpq_fcc1, TCG_CALL_NO_WG, tl, env)
31
-DEF_HELPER_FLAGS_1(fcmpq_fcc2, TCG_CALL_NO_WG, tl, env)
32
-DEF_HELPER_FLAGS_1(fcmpq_fcc3, TCG_CALL_NO_WG, tl, env)
33
-DEF_HELPER_FLAGS_1(fcmpeq_fcc1, TCG_CALL_NO_WG, tl, env)
34
-DEF_HELPER_FLAGS_1(fcmpeq_fcc2, TCG_CALL_NO_WG, tl, env)
35
-DEF_HELPER_FLAGS_1(fcmpeq_fcc3, TCG_CALL_NO_WG, tl, env)
36
+DEF_HELPER_FLAGS_3(fcmpq_fcc1, TCG_CALL_NO_WG, tl, env, i128, i128)
37
+DEF_HELPER_FLAGS_3(fcmpq_fcc2, TCG_CALL_NO_WG, tl, env, i128, i128)
38
+DEF_HELPER_FLAGS_3(fcmpq_fcc3, TCG_CALL_NO_WG, tl, env, i128, i128)
39
+DEF_HELPER_FLAGS_3(fcmpeq_fcc1, TCG_CALL_NO_WG, tl, env, i128, i128)
40
+DEF_HELPER_FLAGS_3(fcmpeq_fcc2, TCG_CALL_NO_WG, tl, env, i128, i128)
41
+DEF_HELPER_FLAGS_3(fcmpeq_fcc3, TCG_CALL_NO_WG, tl, env, i128, i128)
42
#endif
43
DEF_HELPER_2(raise_exception, noreturn, env, int)
44
45
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/target/sparc/fop_helper.c
48
+++ b/target/sparc/fop_helper.c
49
@@ -XXX,XX +XXX,XX @@ Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
50
return f128_ret(float128_sqrt(f128_in(src), &env->fp_status));
51
}
15
}
52
16
53
-#define GEN_FCMP(name, size, reg1, reg2, FS, E) \
17
-static uint32_t int128_getw0(Int128 x)
54
- target_ulong glue(helper_, name) (CPUSPARCState *env) \
55
+#define GEN_FCMP(name, size, FS, E) \
56
+ target_ulong glue(helper_, name) (CPUSPARCState *env, \
57
+ Int128 src1, Int128 src2) \
58
{ \
59
+ float128 reg1 = f128_in(src1); \
60
+ float128 reg2 = f128_in(src2); \
61
FloatRelation ret; \
62
target_ulong fsr; \
63
if (E) { \
64
@@ -XXX,XX +XXX,XX @@ GEN_FCMP_T(fcmpd, float64, 0, 0);
65
GEN_FCMP_T(fcmpes, float32, 0, 1);
66
GEN_FCMP_T(fcmped, float64, 0, 1);
67
68
-GEN_FCMP(fcmpq, float128, QT0, QT1, 0, 0);
69
-GEN_FCMP(fcmpeq, float128, QT0, QT1, 0, 1);
70
+GEN_FCMP(fcmpq, float128, 0, 0);
71
+GEN_FCMP(fcmpeq, float128, 0, 1);
72
73
#ifdef TARGET_SPARC64
74
GEN_FCMP_T(fcmps_fcc1, float32, 22, 0);
75
GEN_FCMP_T(fcmpd_fcc1, float64, 22, 0);
76
-GEN_FCMP(fcmpq_fcc1, float128, QT0, QT1, 22, 0);
77
+GEN_FCMP(fcmpq_fcc1, float128, 22, 0);
78
79
GEN_FCMP_T(fcmps_fcc2, float32, 24, 0);
80
GEN_FCMP_T(fcmpd_fcc2, float64, 24, 0);
81
-GEN_FCMP(fcmpq_fcc2, float128, QT0, QT1, 24, 0);
82
+GEN_FCMP(fcmpq_fcc2, float128, 24, 0);
83
84
GEN_FCMP_T(fcmps_fcc3, float32, 26, 0);
85
GEN_FCMP_T(fcmpd_fcc3, float64, 26, 0);
86
-GEN_FCMP(fcmpq_fcc3, float128, QT0, QT1, 26, 0);
87
+GEN_FCMP(fcmpq_fcc3, float128, 26, 0);
88
89
GEN_FCMP_T(fcmpes_fcc1, float32, 22, 1);
90
GEN_FCMP_T(fcmped_fcc1, float64, 22, 1);
91
-GEN_FCMP(fcmpeq_fcc1, float128, QT0, QT1, 22, 1);
92
+GEN_FCMP(fcmpeq_fcc1, float128, 22, 1);
93
94
GEN_FCMP_T(fcmpes_fcc2, float32, 24, 1);
95
GEN_FCMP_T(fcmped_fcc2, float64, 24, 1);
96
-GEN_FCMP(fcmpeq_fcc2, float128, QT0, QT1, 24, 1);
97
+GEN_FCMP(fcmpeq_fcc2, float128, 24, 1);
98
99
GEN_FCMP_T(fcmpes_fcc3, float32, 26, 1);
100
GEN_FCMP_T(fcmped_fcc3, float64, 26, 1);
101
-GEN_FCMP(fcmpeq_fcc3, float128, QT0, QT1, 26, 1);
102
+GEN_FCMP(fcmpeq_fcc3, float128, 26, 1);
103
#endif
104
#undef GEN_FCMP_T
105
#undef GEN_FCMP
106
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
107
index XXXXXXX..XXXXXXX 100644
108
--- a/target/sparc/translate.c
109
+++ b/target/sparc/translate.c
110
@@ -XXX,XX +XXX,XX @@ static void gen_store_fpr_Q(DisasContext *dc, unsigned int dst, TCGv_i128 v)
111
gen_update_fprs_dirty(dc, dst);
112
}
113
114
-static void gen_op_load_fpr_QT0(unsigned int src)
115
-{
18
-{
116
- tcg_gen_st_i64(cpu_fpr[src / 2], tcg_env, offsetof(CPUSPARCState, qt0) +
19
- return int128_getlo(x);
117
- offsetof(CPU_QuadU, ll.upper));
118
- tcg_gen_st_i64(cpu_fpr[src/2 + 1], tcg_env, offsetof(CPUSPARCState, qt0) +
119
- offsetof(CPU_QuadU, ll.lower));
120
-}
20
-}
121
-
21
-
122
-static void gen_op_load_fpr_QT1(unsigned int src)
22
-static uint32_t int128_getw1(Int128 x)
123
-{
23
-{
124
- tcg_gen_st_i64(cpu_fpr[src / 2], tcg_env, offsetof(CPUSPARCState, qt1) +
24
- return int128_getlo(x) >> 32;
125
- offsetof(CPU_QuadU, ll.upper));
126
- tcg_gen_st_i64(cpu_fpr[src/2 + 1], tcg_env, offsetof(CPUSPARCState, qt1) +
127
- offsetof(CPU_QuadU, ll.lower));
128
-}
25
-}
129
-
26
-
130
static void gen_op_store_QT0_fpr(unsigned int dst)
27
static Int128 int128_mul_6464(uint64_t ai, uint64_t bi)
131
{
28
{
132
tcg_gen_ld_i64(cpu_fpr[dst / 2], tcg_env, offsetof(CPUSPARCState, qt0) +
29
- Int128 a, b;
133
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmpd(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
30
- uint64_t pp0, pp1a, pp1b, pp1s, pp2;
134
}
31
+ uint64_t l, h;
32
33
- a = int128_make64(ai);
34
- b = int128_make64(bi);
35
- pp0 = (uint64_t)int128_getw0(a) * (uint64_t)int128_getw0(b);
36
- pp1a = (uint64_t)int128_getw1(a) * (uint64_t)int128_getw0(b);
37
- pp1b = (uint64_t)int128_getw1(b) * (uint64_t)int128_getw0(a);
38
- pp2 = (uint64_t)int128_getw1(a) * (uint64_t)int128_getw1(b);
39
-
40
- pp1s = pp1a + pp1b;
41
- if ((pp1s < pp1a) || (pp1s < pp1b)) {
42
- pp2 += (1ULL << 32);
43
- }
44
- uint64_t ret_low = pp0 + (pp1s << 32);
45
- if ((ret_low < pp0) || (ret_low < (pp1s << 32))) {
46
- pp2 += 1;
47
- }
48
-
49
- return int128_make128(ret_low, pp2 + (pp1s >> 32));
50
+ mulu64(&l, &h, ai, bi);
51
+ return int128_make128(l, h);
135
}
52
}
136
53
137
-static void gen_op_fcmpq(int fccno)
54
static Int128 int128_sub_borrow(Int128 a, Int128 b, int borrow)
138
+static void gen_op_fcmpq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
139
{
140
switch (fccno) {
141
case 0:
142
- gen_helper_fcmpq(cpu_fsr, tcg_env);
143
+ gen_helper_fcmpq(cpu_fsr, tcg_env, r_rs1, r_rs2);
144
break;
145
case 1:
146
- gen_helper_fcmpq_fcc1(cpu_fsr, tcg_env);
147
+ gen_helper_fcmpq_fcc1(cpu_fsr, tcg_env, r_rs1, r_rs2);
148
break;
149
case 2:
150
- gen_helper_fcmpq_fcc2(cpu_fsr, tcg_env);
151
+ gen_helper_fcmpq_fcc2(cpu_fsr, tcg_env, r_rs1, r_rs2);
152
break;
153
case 3:
154
- gen_helper_fcmpq_fcc3(cpu_fsr, tcg_env);
155
+ gen_helper_fcmpq_fcc3(cpu_fsr, tcg_env, r_rs1, r_rs2);
156
break;
157
}
158
}
159
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmped(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
160
}
161
}
162
163
-static void gen_op_fcmpeq(int fccno)
164
+static void gen_op_fcmpeq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
165
{
166
switch (fccno) {
167
case 0:
168
- gen_helper_fcmpeq(cpu_fsr, tcg_env);
169
+ gen_helper_fcmpeq(cpu_fsr, tcg_env, r_rs1, r_rs2);
170
break;
171
case 1:
172
- gen_helper_fcmpeq_fcc1(cpu_fsr, tcg_env);
173
+ gen_helper_fcmpeq_fcc1(cpu_fsr, tcg_env, r_rs1, r_rs2);
174
break;
175
case 2:
176
- gen_helper_fcmpeq_fcc2(cpu_fsr, tcg_env);
177
+ gen_helper_fcmpeq_fcc2(cpu_fsr, tcg_env, r_rs1, r_rs2);
178
break;
179
case 3:
180
- gen_helper_fcmpeq_fcc3(cpu_fsr, tcg_env);
181
+ gen_helper_fcmpeq_fcc3(cpu_fsr, tcg_env, r_rs1, r_rs2);
182
break;
183
}
184
}
185
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmpd(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
186
gen_helper_fcmpd(cpu_fsr, tcg_env, r_rs1, r_rs2);
187
}
188
189
-static void gen_op_fcmpq(int fccno)
190
+static void gen_op_fcmpq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
191
{
192
- gen_helper_fcmpq(cpu_fsr, tcg_env);
193
+ gen_helper_fcmpq(cpu_fsr, tcg_env, r_rs1, r_rs2);
194
}
195
196
static void gen_op_fcmpes(int fccno, TCGv r_rs1, TCGv r_rs2)
197
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmped(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
198
gen_helper_fcmped(cpu_fsr, tcg_env, r_rs1, r_rs2);
199
}
200
201
-static void gen_op_fcmpeq(int fccno)
202
+static void gen_op_fcmpeq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
203
{
204
- gen_helper_fcmpeq(cpu_fsr, tcg_env);
205
+ gen_helper_fcmpeq(cpu_fsr, tcg_env, r_rs1, r_rs2);
206
}
207
#endif
208
209
@@ -XXX,XX +XXX,XX @@ TRANS(FCMPEd, ALL, do_fcmpd, a, true)
210
211
static bool do_fcmpq(DisasContext *dc, arg_FCMPq *a, bool e)
212
{
213
+ TCGv_i128 src1, src2;
214
+
215
if (avail_32(dc) && a->cc != 0) {
216
return false;
217
}
218
@@ -XXX,XX +XXX,XX @@ static bool do_fcmpq(DisasContext *dc, arg_FCMPq *a, bool e)
219
}
220
221
gen_op_clear_ieee_excp_and_FTT();
222
- gen_op_load_fpr_QT0(QFPREG(a->rs1));
223
- gen_op_load_fpr_QT1(QFPREG(a->rs2));
224
+ src1 = gen_load_fpr_Q(dc, a->rs1);
225
+ src2 = gen_load_fpr_Q(dc, a->rs2);
226
if (e) {
227
- gen_op_fcmpeq(a->cc);
228
+ gen_op_fcmpeq(a->cc, src1, src2);
229
} else {
230
- gen_op_fcmpq(a->cc);
231
+ gen_op_fcmpq(a->cc, src1, src2);
232
}
233
return advance_pc(dc);
234
}
235
--
55
--
236
2.34.1
56
2.43.0
diff view generated by jsdifflib
1
Because there are more call clobbered registers than
1
Initialize x with accumulated via direct assignment,
2
call saved registers, we begin with all registers as
2
rather than multiplying by 1.
3
call clobbered and then reset those that are saved.
4
3
5
This was missed when we introduced the LSX support.
4
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
6
7
Cc: qemu-stable@nongnu.org
8
Fixes: 16288ded944 ("tcg/loongarch64: Lower basic tcg vec ops to LSX")
9
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2136
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Reviewed-by: Song Gao <gaosong@loongson.cn>
12
Message-Id: <20240201233414.500588-1-richard.henderson@linaro.org>
13
---
6
---
14
tcg/loongarch64/tcg-target.c.inc | 2 +-
7
target/hexagon/fma_emu.c | 2 +-
15
1 file changed, 1 insertion(+), 1 deletion(-)
8
1 file changed, 1 insertion(+), 1 deletion(-)
16
9
17
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
10
diff --git a/target/hexagon/fma_emu.c b/target/hexagon/fma_emu.c
18
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
19
--- a/tcg/loongarch64/tcg-target.c.inc
12
--- a/target/hexagon/fma_emu.c
20
+++ b/tcg/loongarch64/tcg-target.c.inc
13
+++ b/target/hexagon/fma_emu.c
21
@@ -XXX,XX +XXX,XX @@ static void tcg_target_init(TCGContext *s)
14
@@ -XXX,XX +XXX,XX @@ float64 internal_mpyhh(float64 a, float64 b,
22
tcg_target_available_regs[TCG_TYPE_I32] = ALL_GENERAL_REGS;
15
float64_is_infinity(b)) {
23
tcg_target_available_regs[TCG_TYPE_I64] = ALL_GENERAL_REGS;
16
return float64_mul(a, b, fp_status);
24
17
}
25
- tcg_target_call_clobber_regs = ALL_GENERAL_REGS;
18
- x.mant = int128_mul_6464(accumulated, 1);
26
+ tcg_target_call_clobber_regs = ALL_GENERAL_REGS | ALL_VECTOR_REGS;
19
+ x.mant = int128_make64(accumulated);
27
tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S0);
20
x.sticky = sticky;
28
tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S1);
21
prod = fGETUWORD(1, float64_getmant(a)) * fGETUWORD(1, float64_getmant(b));
29
tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S2);
22
x.mant = int128_add(x.mant, int128_mul_6464(prod, 0x100000000ULL));
30
--
23
--
31
2.34.1
24
2.43.0
diff view generated by jsdifflib
1
For user-only mode, use MMU_USER_IDX.
1
Convert all targets simultaneously, as the gen_intermediate_code
2
For system mode, use CPUClass.mmu_index.
2
function disappears from the target. While there are possible
3
workarounds, they're larger than simply performing the conversion.
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
include/exec/cpu-all.h | 4 ++++
8
include/exec/translator.h | 14 --------------
8
include/exec/cpu-common.h | 22 ++++++++++++++++++++++
9
include/hw/core/tcg-cpu-ops.h | 13 +++++++++++++
9
target/alpha/cpu.h | 5 -----
10
target/alpha/cpu.h | 2 ++
10
target/arm/cpu.h | 13 -------------
11
target/arm/internals.h | 2 ++
11
target/avr/cpu.h | 5 -----
12
target/avr/cpu.h | 2 ++
12
target/cris/cpu.h | 4 ----
13
target/hexagon/cpu.h | 2 ++
13
target/hexagon/cpu.h | 9 ---------
14
target/hppa/cpu.h | 2 ++
14
target/hppa/cpu.h | 10 ----------
15
target/i386/tcg/helper-tcg.h | 2 ++
15
target/i386/cpu.h | 6 ------
16
target/loongarch/internals.h | 2 ++
16
target/loongarch/cpu.h | 10 ----------
17
target/m68k/cpu.h | 2 ++
17
target/m68k/cpu.h | 4 ----
18
target/microblaze/cpu.h | 2 ++
18
target/microblaze/cpu.h | 6 ------
19
target/mips/tcg/tcg-internal.h | 2 ++
19
target/mips/cpu.h | 5 -----
20
target/openrisc/cpu.h | 2 ++
20
target/nios2/cpu.h | 6 ------
21
target/ppc/cpu.h | 2 ++
21
target/openrisc/cpu.h | 6 ------
22
target/riscv/cpu.h | 3 +++
22
target/ppc/cpu.h | 5 -----
23
target/rx/cpu.h | 2 ++
23
target/riscv/cpu.h | 2 --
24
target/s390x/s390x-internal.h | 2 ++
24
target/rx/cpu.h | 5 -----
25
target/sh4/cpu.h | 2 ++
25
target/s390x/cpu.h | 2 --
26
target/sparc/cpu.h | 2 ++
26
target/sh4/cpu.h | 6 ------
27
target/tricore/cpu.h | 2 ++
27
target/sparc/cpu.h | 6 ------
28
target/xtensa/cpu.h | 2 ++
28
target/tricore/cpu.h | 5 -----
29
accel/tcg/cpu-exec.c | 8 +++++---
29
target/xtensa/cpu.h | 5 -----
30
accel/tcg/translate-all.c | 8 +++++---
30
target/hppa/cpu.c | 2 +-
31
target/alpha/cpu.c | 1 +
31
target/i386/cpu.c | 2 +-
32
target/alpha/translate.c | 4 ++--
32
target/loongarch/cpu.c | 2 +-
33
target/arm/cpu.c | 1 +
33
target/microblaze/cpu.c | 2 +-
34
target/arm/tcg/cpu-v7m.c | 1 +
34
target/nios2/cpu.c | 2 +-
35
target/arm/tcg/translate.c | 5 ++---
35
target/openrisc/cpu.c | 2 +-
36
target/avr/cpu.c | 1 +
36
target/sh4/cpu.c | 2 +-
37
target/avr/translate.c | 6 +++---
37
target/sparc/cpu.c | 2 +-
38
target/hexagon/cpu.c | 1 +
38
31 files changed, 34 insertions(+), 133 deletions(-)
39
target/hexagon/translate.c | 4 ++--
40
target/hppa/cpu.c | 1 +
41
target/hppa/translate.c | 4 ++--
42
target/i386/tcg/tcg-cpu.c | 1 +
43
target/i386/tcg/translate.c | 5 ++---
44
target/loongarch/cpu.c | 1 +
45
target/loongarch/tcg/translate.c | 4 ++--
46
target/m68k/cpu.c | 1 +
47
target/m68k/translate.c | 4 ++--
48
target/microblaze/cpu.c | 1 +
49
target/microblaze/translate.c | 4 ++--
50
target/mips/cpu.c | 1 +
51
target/mips/tcg/translate.c | 4 ++--
52
target/openrisc/cpu.c | 1 +
53
target/openrisc/translate.c | 4 ++--
54
target/ppc/cpu_init.c | 1 +
55
target/ppc/translate.c | 4 ++--
56
target/riscv/tcg/tcg-cpu.c | 1 +
57
target/riscv/translate.c | 4 ++--
58
target/rx/cpu.c | 1 +
59
target/rx/translate.c | 4 ++--
60
target/s390x/cpu.c | 1 +
61
target/s390x/tcg/translate.c | 4 ++--
62
target/sh4/cpu.c | 1 +
63
target/sh4/translate.c | 4 ++--
64
target/sparc/cpu.c | 1 +
65
target/sparc/translate.c | 4 ++--
66
target/tricore/cpu.c | 1 +
67
target/tricore/translate.c | 5 ++---
68
target/xtensa/cpu.c | 1 +
69
target/xtensa/translate.c | 4 ++--
70
62 files changed, 121 insertions(+), 62 deletions(-)
39
71
40
diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h
72
diff --git a/include/exec/translator.h b/include/exec/translator.h
41
index XXXXXXX..XXXXXXX 100644
73
index XXXXXXX..XXXXXXX 100644
42
--- a/include/exec/cpu-all.h
74
--- a/include/exec/translator.h
43
+++ b/include/exec/cpu-all.h
75
+++ b/include/exec/translator.h
44
@@ -XXX,XX +XXX,XX @@ CPUArchState *cpu_copy(CPUArchState *env);
45
#define TLB_MMIO (1 << (TARGET_PAGE_BITS_MIN - 2))
46
#define TLB_WATCHPOINT 0
47
48
+static inline int cpu_mmu_index(CPUArchState *env, bool ifetch)
49
+{
50
+ return MMU_USER_IDX;
51
+}
52
#else
53
54
/*
55
diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
56
index XXXXXXX..XXXXXXX 100644
57
--- a/include/exec/cpu-common.h
58
+++ b/include/exec/cpu-common.h
59
@@ -XXX,XX +XXX,XX @@
76
@@ -XXX,XX +XXX,XX @@
60
#include "exec/hwaddr.h"
77
#include "qemu/bswap.h"
61
#endif
78
#include "exec/vaddr.h"
62
#include "hw/core/cpu.h"
79
63
+#include "tcg/debug-assert.h"
80
-/**
64
81
- * gen_intermediate_code
65
#define EXCP_INTERRUPT 0x10000 /* async interruption */
82
- * @cpu: cpu context
66
#define EXCP_HLT 0x10001 /* hlt instruction reached */
83
- * @tb: translation block
67
@@ -XXX,XX +XXX,XX @@ static inline CPUState *env_cpu(CPUArchState *env)
84
- * @max_insns: max number of instructions to translate
68
return (void *)env - sizeof(CPUState);
85
- * @pc: guest virtual program counter address
69
}
86
- * @host_pc: host physical program counter address
70
87
- *
71
+#ifndef CONFIG_USER_ONLY
88
- * This function must be provided by the target, which should create
72
+/**
89
- * the target-specific DisasContext, and then invoke translator_loop.
73
+ * cpu_mmu_index:
90
- */
74
+ * @env: The cpu environment
91
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
75
+ * @ifetch: True for code access, false for data access.
92
- vaddr pc, void *host_pc);
76
+ *
93
-
77
+ * Return the core mmu index for the current translation regime.
94
/**
78
+ * This function is used by generic TCG code paths.
95
* DisasJumpType:
79
+ *
96
* @DISAS_NEXT: Next instruction in program order.
80
+ * The user-only version of this function is inline in cpu-all.h,
97
diff --git a/include/hw/core/tcg-cpu-ops.h b/include/hw/core/tcg-cpu-ops.h
81
+ * where it always returns MMU_USER_IDX.
98
index XXXXXXX..XXXXXXX 100644
82
+ */
99
--- a/include/hw/core/tcg-cpu-ops.h
83
+static inline int cpu_mmu_index(CPUArchState *env, bool ifetch)
100
+++ b/include/hw/core/tcg-cpu-ops.h
84
+{
101
@@ -XXX,XX +XXX,XX @@ struct TCGCPUOps {
85
+ CPUState *cs = env_cpu(env);
102
* Called when the first CPU is realized.
86
+ int ret = cs->cc->mmu_index(cs, ifetch);
103
*/
87
+ tcg_debug_assert(ret >= 0 && ret < NB_MMU_MODES);
104
void (*initialize)(void);
88
+ return ret;
105
+ /**
89
+}
106
+ * @translate_code: Translate guest instructions to TCGOps
90
+#endif /* !CONFIG_USER_ONLY */
107
+ * @cpu: cpu context
91
+
108
+ * @tb: translation block
92
#endif /* CPU_COMMON_H */
109
+ * @max_insns: max number of instructions to translate
110
+ * @pc: guest virtual program counter address
111
+ * @host_pc: host physical program counter address
112
+ *
113
+ * This function must be provided by the target, which should create
114
+ * the target-specific DisasContext, and then invoke translator_loop.
115
+ */
116
+ void (*translate_code)(CPUState *cpu, TranslationBlock *tb,
117
+ int *max_insns, vaddr pc, void *host_pc);
118
/**
119
* @synchronize_from_tb: Synchronize state from a TCG #TranslationBlock
120
*
93
diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h
121
diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h
94
index XXXXXXX..XXXXXXX 100644
122
index XXXXXXX..XXXXXXX 100644
95
--- a/target/alpha/cpu.h
123
--- a/target/alpha/cpu.h
96
+++ b/target/alpha/cpu.h
124
+++ b/target/alpha/cpu.h
97
@@ -XXX,XX +XXX,XX @@ static inline int alpha_env_mmu_index(CPUAlphaState *env)
125
@@ -XXX,XX +XXX,XX @@ enum {
98
return ret;
126
};
99
}
127
100
128
void alpha_translate_init(void);
101
-static inline int cpu_mmu_index(CPUAlphaState *env, bool ifetch)
129
+void alpha_translate_code(CPUState *cs, TranslationBlock *tb,
102
-{
130
+ int *max_insns, vaddr pc, void *host_pc);
103
- return alpha_env_mmu_index(env);
131
104
-}
132
#define CPU_RESOLVING_TYPE TYPE_ALPHA_CPU
105
-
133
106
enum {
134
diff --git a/target/arm/internals.h b/target/arm/internals.h
107
IR_V0 = 0,
135
index XXXXXXX..XXXXXXX 100644
108
IR_T0 = 1,
136
--- a/target/arm/internals.h
109
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
137
+++ b/target/arm/internals.h
110
index XXXXXXX..XXXXXXX 100644
138
@@ -XXX,XX +XXX,XX @@ void init_cpreg_list(ARMCPU *cpu);
111
--- a/target/arm/cpu.h
139
112
+++ b/target/arm/cpu.h
140
void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu);
113
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAG_A64, NV2_MEM_BE, 36, 1)
141
void arm_translate_init(void);
114
#define EX_TBFLAG_M32(IN, WHICH) FIELD_EX32(IN.flags2, TBFLAG_M32, WHICH)
142
+void arm_translate_code(CPUState *cs, TranslationBlock *tb,
115
#define EX_TBFLAG_AM32(IN, WHICH) FIELD_EX32(IN.flags2, TBFLAG_AM32, WHICH)
143
+ int *max_insns, vaddr pc, void *host_pc);
116
144
117
-/**
145
void arm_cpu_register_gdb_commands(ARMCPU *cpu);
118
- * cpu_mmu_index:
146
void aarch64_cpu_register_gdb_commands(ARMCPU *cpu, GString *,
119
- * @env: The cpu environment
120
- * @ifetch: True for code access, false for data access.
121
- *
122
- * Return the core mmu index for the current translation regime.
123
- * This function is used by generic TCG code paths.
124
- */
125
-static inline int cpu_mmu_index(CPUARMState *env, bool ifetch)
126
-{
127
- return EX_TBFLAG_ANY(env->hflags, MMUIDX);
128
-}
129
-
130
/**
131
* sve_vq
132
* @env: the cpu context
133
diff --git a/target/avr/cpu.h b/target/avr/cpu.h
147
diff --git a/target/avr/cpu.h b/target/avr/cpu.h
134
index XXXXXXX..XXXXXXX 100644
148
index XXXXXXX..XXXXXXX 100644
135
--- a/target/avr/cpu.h
149
--- a/target/avr/cpu.h
136
+++ b/target/avr/cpu.h
150
+++ b/target/avr/cpu.h
137
@@ -XXX,XX +XXX,XX @@ static inline void set_avr_feature(CPUAVRState *env, int feature)
151
@@ -XXX,XX +XXX,XX @@ static inline void set_avr_feature(CPUAVRState *env, int feature)
138
env->features |= (1U << feature);
139
}
152
}
140
153
141
-static inline int cpu_mmu_index(CPUAVRState *env, bool ifetch)
142
-{
143
- return ifetch ? MMU_CODE_IDX : MMU_DATA_IDX;
144
-}
145
-
146
void avr_cpu_tcg_init(void);
154
void avr_cpu_tcg_init(void);
155
+void avr_cpu_translate_code(CPUState *cs, TranslationBlock *tb,
156
+ int *max_insns, vaddr pc, void *host_pc);
147
157
148
int cpu_avr_exec(CPUState *cpu);
158
int cpu_avr_exec(CPUState *cpu);
149
diff --git a/target/cris/cpu.h b/target/cris/cpu.h
159
150
index XXXXXXX..XXXXXXX 100644
151
--- a/target/cris/cpu.h
152
+++ b/target/cris/cpu.h
153
@@ -XXX,XX +XXX,XX @@ enum {
154
155
/* MMU modes definitions */
156
#define MMU_USER_IDX 1
157
-static inline int cpu_mmu_index (CPUCRISState *env, bool ifetch)
158
-{
159
-    return !!(env->pregs[PR_CCS] & U_FLAG);
160
-}
161
162
/* Support function regs. */
163
#define SFR_RW_GC_CFG 0][0
164
diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h
160
diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h
165
index XXXXXXX..XXXXXXX 100644
161
index XXXXXXX..XXXXXXX 100644
166
--- a/target/hexagon/cpu.h
162
--- a/target/hexagon/cpu.h
167
+++ b/target/hexagon/cpu.h
163
+++ b/target/hexagon/cpu.h
168
@@ -XXX,XX +XXX,XX @@ static inline void cpu_get_tb_cpu_state(CPUHexagonState *env, vaddr *pc,
164
@@ -XXX,XX +XXX,XX @@ static inline void cpu_get_tb_cpu_state(CPUHexagonState *env, vaddr *pc,
169
*flags = hex_flags;
170
}
171
172
-static inline int cpu_mmu_index(CPUHexagonState *env, bool ifetch)
173
-{
174
-#ifdef CONFIG_USER_ONLY
175
- return MMU_USER_IDX;
176
-#else
177
-#error System mode not supported on Hexagon yet
178
-#endif
179
-}
180
-
181
typedef HexagonCPU ArchCPU;
165
typedef HexagonCPU ArchCPU;
182
166
183
void hexagon_translate_init(void);
167
void hexagon_translate_init(void);
168
+void hexagon_translate_code(CPUState *cs, TranslationBlock *tb,
169
+ int *max_insns, vaddr pc, void *host_pc);
170
171
#include "exec/cpu-all.h"
172
184
diff --git a/target/hppa/cpu.h b/target/hppa/cpu.h
173
diff --git a/target/hppa/cpu.h b/target/hppa/cpu.h
185
index XXXXXXX..XXXXXXX 100644
174
index XXXXXXX..XXXXXXX 100644
186
--- a/target/hppa/cpu.h
175
--- a/target/hppa/cpu.h
187
+++ b/target/hppa/cpu.h
176
+++ b/target/hppa/cpu.h
188
@@ -XXX,XX +XXX,XX @@ static inline int HPPA_BTLB_ENTRIES(CPUHPPAState *env)
177
@@ -XXX,XX +XXX,XX @@ static inline int HPPA_BTLB_ENTRIES(CPUHPPAState *env)
189
return hppa_is_pa20(env) ? 0 : PA10_BTLB_FIXED + PA10_BTLB_VARIABLE;
190
}
178
}
191
179
192
-int hppa_cpu_mmu_index(CPUState *cs, bool ifetch);
193
-static inline int cpu_mmu_index(CPUHPPAState *env, bool ifetch)
194
-{
195
-#ifdef CONFIG_USER_ONLY
196
- return MMU_USER_IDX;
197
-#else
198
- return hppa_cpu_mmu_index(env_cpu(env), ifetch);
199
-#endif
200
-}
201
-
202
void hppa_translate_init(void);
180
void hppa_translate_init(void);
181
+void hppa_translate_code(CPUState *cs, TranslationBlock *tb,
182
+ int *max_insns, vaddr pc, void *host_pc);
203
183
204
#define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
184
#define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
205
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
185
206
index XXXXXXX..XXXXXXX 100644
186
diff --git a/target/i386/tcg/helper-tcg.h b/target/i386/tcg/helper-tcg.h
207
--- a/target/i386/cpu.h
187
index XXXXXXX..XXXXXXX 100644
208
+++ b/target/i386/cpu.h
188
--- a/target/i386/tcg/helper-tcg.h
209
@@ -XXX,XX +XXX,XX @@ static inline int cpu_mmu_index_kernel(CPUX86State *env)
189
+++ b/target/i386/tcg/helper-tcg.h
210
#include "hw/i386/apic.h"
190
@@ -XXX,XX +XXX,XX @@ static inline target_long lshift(target_long x, int n)
211
#endif
191
212
192
/* translate.c */
213
-int x86_cpu_mmu_index(CPUState *cs, bool ifetch);
193
void tcg_x86_init(void);
214
-static inline int cpu_mmu_index(CPUX86State *env, bool ifetch)
194
+void x86_translate_code(CPUState *cs, TranslationBlock *tb,
215
-{
195
+ int *max_insns, vaddr pc, void *host_pc);
216
- return x86_cpu_mmu_index(env_cpu(env), ifetch);
196
217
-}
197
/* excp_helper.c */
218
-
198
G_NORETURN void raise_exception(CPUX86State *env, int exception_index);
219
static inline void cpu_get_tb_cpu_state(CPUX86State *env, vaddr *pc,
199
diff --git a/target/loongarch/internals.h b/target/loongarch/internals.h
220
uint64_t *cs_base, uint32_t *flags)
200
index XXXXXXX..XXXXXXX 100644
221
{
201
--- a/target/loongarch/internals.h
222
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
202
+++ b/target/loongarch/internals.h
223
index XXXXXXX..XXXXXXX 100644
203
@@ -XXX,XX +XXX,XX @@
224
--- a/target/loongarch/cpu.h
204
#define TARGET_VIRT_MASK MAKE_64BIT_MASK(0, TARGET_VIRT_ADDR_SPACE_BITS)
225
+++ b/target/loongarch/cpu.h
205
226
@@ -XXX,XX +XXX,XX @@ struct LoongArchCPUClass {
206
void loongarch_translate_init(void);
227
#define MMU_USER_IDX MMU_PLV_USER
207
+void loongarch_translate_code(CPUState *cs, TranslationBlock *tb,
228
#define MMU_DA_IDX 4
208
+ int *max_insns, vaddr pc, void *host_pc);
229
209
230
-int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch);
210
void G_NORETURN do_raise_exception(CPULoongArchState *env,
231
-static inline int cpu_mmu_index(CPULoongArchState *env, bool ifetch)
211
uint32_t exception,
232
-{
233
-#ifdef CONFIG_USER_ONLY
234
- return MMU_USER_IDX;
235
-#else
236
- return loongarch_cpu_mmu_index(env_cpu(env), ifetch);
237
-#endif
238
-}
239
-
240
static inline bool is_la64(CPULoongArchState *env)
241
{
242
return FIELD_EX32(env->cpucfg[1], CPUCFG1, ARCH) == CPUCFG1_ARCH_LA64;
243
diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h
212
diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h
244
index XXXXXXX..XXXXXXX 100644
213
index XXXXXXX..XXXXXXX 100644
245
--- a/target/m68k/cpu.h
214
--- a/target/m68k/cpu.h
246
+++ b/target/m68k/cpu.h
215
+++ b/target/m68k/cpu.h
247
@@ -XXX,XX +XXX,XX @@ enum {
216
@@ -XXX,XX +XXX,XX @@ int m68k_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
248
/* MMU modes definitions */
217
int m68k_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
249
#define MMU_KERNEL_IDX 0
218
250
#define MMU_USER_IDX 1
219
void m68k_tcg_init(void);
251
-static inline int cpu_mmu_index (CPUM68KState *env, bool ifetch)
220
+void m68k_translate_code(CPUState *cs, TranslationBlock *tb,
252
-{
221
+ int *max_insns, vaddr pc, void *host_pc);
253
- return (env->sr & SR_S) == 0 ? 1 : 0;
222
void m68k_cpu_init_gdb(M68kCPU *cpu);
254
-}
223
uint32_t cpu_m68k_get_ccr(CPUM68KState *env);
255
224
void cpu_m68k_set_ccr(CPUM68KState *env, uint32_t);
256
bool m68k_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
257
MMUAccessType access_type, int mmu_idx,
258
diff --git a/target/microblaze/cpu.h b/target/microblaze/cpu.h
225
diff --git a/target/microblaze/cpu.h b/target/microblaze/cpu.h
259
index XXXXXXX..XXXXXXX 100644
226
index XXXXXXX..XXXXXXX 100644
260
--- a/target/microblaze/cpu.h
227
--- a/target/microblaze/cpu.h
261
+++ b/target/microblaze/cpu.h
228
+++ b/target/microblaze/cpu.h
262
@@ -XXX,XX +XXX,XX @@ void mb_cpu_transaction_failed(CPUState *cs, hwaddr physaddr, vaddr addr,
229
@@ -XXX,XX +XXX,XX @@ static inline void mb_cpu_write_msr(CPUMBState *env, uint32_t val)
263
MemTxResult response, uintptr_t retaddr);
264
#endif
265
266
-int mb_cpu_mmu_index(CPUState *cs, bool ifetch);
267
-static inline int cpu_mmu_index(CPUMBState *env, bool ifetch)
268
-{
269
- return mb_cpu_mmu_index(env_cpu(env), ifetch);
270
-}
271
-
272
#ifndef CONFIG_USER_ONLY
273
extern const VMStateDescription vmstate_mb_cpu;
274
#endif
275
diff --git a/target/mips/cpu.h b/target/mips/cpu.h
276
index XXXXXXX..XXXXXXX 100644
277
--- a/target/mips/cpu.h
278
+++ b/target/mips/cpu.h
279
@@ -XXX,XX +XXX,XX @@ static inline int mips_env_mmu_index(CPUMIPSState *env)
280
return hflags_mmu_index(env->hflags);
281
}
230
}
282
231
283
-static inline int cpu_mmu_index(CPUMIPSState *env, bool ifetch)
232
void mb_tcg_init(void);
284
-{
233
+void mb_translate_code(CPUState *cs, TranslationBlock *tb,
285
- return mips_env_mmu_index(env);
234
+ int *max_insns, vaddr pc, void *host_pc);
286
-}
235
287
-
236
#define CPU_RESOLVING_TYPE TYPE_MICROBLAZE_CPU
288
#include "exec/cpu-all.h"
237
289
238
diff --git a/target/mips/tcg/tcg-internal.h b/target/mips/tcg/tcg-internal.h
290
/* Exceptions */
239
index XXXXXXX..XXXXXXX 100644
291
diff --git a/target/nios2/cpu.h b/target/nios2/cpu.h
240
--- a/target/mips/tcg/tcg-internal.h
292
index XXXXXXX..XXXXXXX 100644
241
+++ b/target/mips/tcg/tcg-internal.h
293
--- a/target/nios2/cpu.h
242
@@ -XXX,XX +XXX,XX @@
294
+++ b/target/nios2/cpu.h
243
#include "cpu.h"
295
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAGS, CRS0, 0, 1) /* Set if CRS == 0. */
244
296
FIELD(TBFLAGS, U, 1, 1) /* Overlaps CR_STATUS_U */
245
void mips_tcg_init(void);
297
FIELD(TBFLAGS, R0_0, 2, 1) /* Set if R0 == 0. */
246
+void mips_translate_code(CPUState *cs, TranslationBlock *tb,
298
247
+ int *max_insns, vaddr pc, void *host_pc);
299
-int nios2_cpu_mmu_index(CPUState *cs, bool ifetch);
248
300
-static inline int cpu_mmu_index(CPUNios2State *env, bool ifetch)
249
void mips_cpu_synchronize_from_tb(CPUState *cs, const TranslationBlock *tb);
301
-{
250
G_NORETURN void mips_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
302
- return nios2_cpu_mmu_index(env_cpu(env), ifetch);
303
-}
304
-
305
static inline void cpu_get_tb_cpu_state(CPUNios2State *env, vaddr *pc,
306
uint64_t *cs_base, uint32_t *flags)
307
{
308
diff --git a/target/openrisc/cpu.h b/target/openrisc/cpu.h
251
diff --git a/target/openrisc/cpu.h b/target/openrisc/cpu.h
309
index XXXXXXX..XXXXXXX 100644
252
index XXXXXXX..XXXXXXX 100644
310
--- a/target/openrisc/cpu.h
253
--- a/target/openrisc/cpu.h
311
+++ b/target/openrisc/cpu.h
254
+++ b/target/openrisc/cpu.h
312
@@ -XXX,XX +XXX,XX @@ static inline void cpu_get_tb_cpu_state(CPUOpenRISCState *env, vaddr *pc,
255
@@ -XXX,XX +XXX,XX @@ void openrisc_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
313
| (env->sr & (SR_SM | SR_DME | SR_IME | SR_OVE));
256
int openrisc_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
314
}
257
int openrisc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
315
258
void openrisc_translate_init(void);
316
-int openrisc_cpu_mmu_index(CPUState *cs, bool ifetch);
259
+void openrisc_translate_code(CPUState *cs, TranslationBlock *tb,
317
-static inline int cpu_mmu_index(CPUOpenRISCState *env, bool ifetch)
260
+ int *max_insns, vaddr pc, void *host_pc);
318
-{
261
int print_insn_or1k(bfd_vma addr, disassemble_info *info);
319
- return openrisc_cpu_mmu_index(env_cpu(env), ifetch);
262
320
-}
263
#ifndef CONFIG_USER_ONLY
321
-
322
static inline uint32_t cpu_get_sr(const CPUOpenRISCState *env)
323
{
324
return (env->sr
325
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
264
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
326
index XXXXXXX..XXXXXXX 100644
265
index XXXXXXX..XXXXXXX 100644
327
--- a/target/ppc/cpu.h
266
--- a/target/ppc/cpu.h
328
+++ b/target/ppc/cpu.h
267
+++ b/target/ppc/cpu.h
329
@@ -XXX,XX +XXX,XX @@ static inline int ppc_env_mmu_index(CPUPPCState *env, bool ifetch)
268
@@ -XXX,XX +XXX,XX @@ extern const VMStateDescription vmstate_ppc_cpu;
330
#endif
269
331
}
270
/*****************************************************************************/
332
271
void ppc_translate_init(void);
333
-static inline int cpu_mmu_index(CPUPPCState *env, bool ifetch)
272
+void ppc_translate_code(CPUState *cs, TranslationBlock *tb,
334
-{
273
+ int *max_insns, vaddr pc, void *host_pc);
335
- return ppc_env_mmu_index(env, ifetch);
274
336
-}
275
#if !defined(CONFIG_USER_ONLY)
337
-
276
void ppc_store_sdr1(CPUPPCState *env, target_ulong value);
338
/* Compatibility modes */
339
#if defined(TARGET_PPC64)
340
bool ppc_check_compat(PowerPCCPU *cpu, uint32_t compat_pvr,
341
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
277
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
342
index XXXXXXX..XXXXXXX 100644
278
index XXXXXXX..XXXXXXX 100644
343
--- a/target/riscv/cpu.h
279
--- a/target/riscv/cpu.h
344
+++ b/target/riscv/cpu.h
280
+++ b/target/riscv/cpu.h
345
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
281
@@ -XXX,XX +XXX,XX @@ RISCVException smstateen_acc_ok(CPURISCVState *env, int index, uint64_t bit);
346
bool probe, uintptr_t retaddr);
282
void riscv_cpu_set_mode(CPURISCVState *env, target_ulong newpriv, bool virt_en);
347
char *riscv_isa_string(RISCVCPU *cpu);
283
348
284
void riscv_translate_init(void);
349
-#define cpu_mmu_index riscv_env_mmu_index
285
+void riscv_translate_code(CPUState *cs, TranslationBlock *tb,
350
-
286
+ int *max_insns, vaddr pc, void *host_pc);
351
#ifndef CONFIG_USER_ONLY
287
+
352
void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
288
G_NORETURN void riscv_raise_exception(CPURISCVState *env,
353
vaddr addr, unsigned size,
289
uint32_t exception, uintptr_t pc);
290
354
diff --git a/target/rx/cpu.h b/target/rx/cpu.h
291
diff --git a/target/rx/cpu.h b/target/rx/cpu.h
355
index XXXXXXX..XXXXXXX 100644
292
index XXXXXXX..XXXXXXX 100644
356
--- a/target/rx/cpu.h
293
--- a/target/rx/cpu.h
357
+++ b/target/rx/cpu.h
294
+++ b/target/rx/cpu.h
358
@@ -XXX,XX +XXX,XX @@ static inline void cpu_get_tb_cpu_state(CPURXState *env, vaddr *pc,
295
@@ -XXX,XX +XXX,XX @@ int rx_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
359
*flags = FIELD_DP32(*flags, PSW, U, env->psw_u);
296
int rx_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
360
}
297
361
298
void rx_translate_init(void);
362
-static inline int cpu_mmu_index(CPURXState *env, bool ifetch)
299
+void rx_translate_code(CPUState *cs, TranslationBlock *tb,
363
-{
300
+ int *max_insns, vaddr pc, void *host_pc);
364
- return 0;
301
void rx_cpu_unpack_psw(CPURXState *env, uint32_t psw, int rte);
365
-}
302
366
-
303
#include "exec/cpu-all.h"
367
static inline uint32_t rx_cpu_pack_psw(CPURXState *env)
304
diff --git a/target/s390x/s390x-internal.h b/target/s390x/s390x-internal.h
368
{
305
index XXXXXXX..XXXXXXX 100644
369
uint32_t psw = 0;
306
--- a/target/s390x/s390x-internal.h
370
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
307
+++ b/target/s390x/s390x-internal.h
371
index XXXXXXX..XXXXXXX 100644
308
@@ -XXX,XX +XXX,XX @@ void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3,
372
--- a/target/s390x/cpu.h
309
373
+++ b/target/s390x/cpu.h
310
/* translate.c */
374
@@ -XXX,XX +XXX,XX @@ static inline int s390x_env_mmu_index(CPUS390XState *env, bool ifetch)
311
void s390x_translate_init(void);
375
#endif
312
+void s390x_translate_code(CPUState *cs, TranslationBlock *tb,
376
}
313
+ int *max_insns, vaddr pc, void *host_pc);
377
314
void s390x_restore_state_to_opc(CPUState *cs,
378
-#define cpu_mmu_index s390x_env_mmu_index
315
const TranslationBlock *tb,
379
-
316
const uint64_t *data);
380
#ifdef CONFIG_TCG
381
382
#include "tcg/tcg_s390x.h"
383
diff --git a/target/sh4/cpu.h b/target/sh4/cpu.h
317
diff --git a/target/sh4/cpu.h b/target/sh4/cpu.h
384
index XXXXXXX..XXXXXXX 100644
318
index XXXXXXX..XXXXXXX 100644
385
--- a/target/sh4/cpu.h
319
--- a/target/sh4/cpu.h
386
+++ b/target/sh4/cpu.h
320
+++ b/target/sh4/cpu.h
387
@@ -XXX,XX +XXX,XX @@ static inline void cpu_write_sr(CPUSH4State *env, target_ulong sr)
321
@@ -XXX,XX +XXX,XX @@ G_NORETURN void superh_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
388
env->sr = sr & ~((1u << SR_M) | (1u << SR_Q) | (1u << SR_T));
322
uintptr_t retaddr);
389
}
323
390
324
void sh4_translate_init(void);
391
-int sh4_cpu_mmu_index(CPUState *cs, bool ifetch);
325
+void sh4_translate_code(CPUState *cs, TranslationBlock *tb,
392
-static inline int cpu_mmu_index(CPUSH4State *env, bool ifetch)
326
+ int *max_insns, vaddr pc, void *host_pc);
393
-{
327
394
- return sh4_cpu_mmu_index(env_cpu(env), ifetch);
328
#if !defined(CONFIG_USER_ONLY)
395
-}
329
hwaddr superh_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
396
-
397
static inline void cpu_get_tb_cpu_state(CPUSH4State *env, vaddr *pc,
398
uint64_t *cs_base, uint32_t *flags)
399
{
400
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
330
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
401
index XXXXXXX..XXXXXXX 100644
331
index XXXXXXX..XXXXXXX 100644
402
--- a/target/sparc/cpu.h
332
--- a/target/sparc/cpu.h
403
+++ b/target/sparc/cpu.h
333
+++ b/target/sparc/cpu.h
404
@@ -XXX,XX +XXX,XX @@ trap_state* cpu_tsptr(CPUSPARCState* env);
334
@@ -XXX,XX +XXX,XX @@ int sparc_cpu_memory_rw_debug(CPUState *cpu, vaddr addr,
405
#define TB_FLAG_HYPER (1 << 7)
335
406
#define TB_FLAG_ASI_SHIFT 24
336
/* translate.c */
407
337
void sparc_tcg_init(void);
408
-int sparc_cpu_mmu_index(CPUState *cs, bool ifetch);
338
+void sparc_translate_code(CPUState *cs, TranslationBlock *tb,
409
-static inline int cpu_mmu_index(CPUSPARCState *env, bool ifetch)
339
+ int *max_insns, vaddr pc, void *host_pc);
410
-{
340
411
- return sparc_cpu_mmu_index(env_cpu(env), ifetch);
341
/* fop_helper.c */
412
-}
342
target_ulong cpu_get_fsr(CPUSPARCState *);
413
-
414
static inline void cpu_get_tb_cpu_state(CPUSPARCState *env, vaddr *pc,
415
uint64_t *cs_base, uint32_t *pflags)
416
{
417
diff --git a/target/tricore/cpu.h b/target/tricore/cpu.h
343
diff --git a/target/tricore/cpu.h b/target/tricore/cpu.h
418
index XXXXXXX..XXXXXXX 100644
344
index XXXXXXX..XXXXXXX 100644
419
--- a/target/tricore/cpu.h
345
--- a/target/tricore/cpu.h
420
+++ b/target/tricore/cpu.h
346
+++ b/target/tricore/cpu.h
421
@@ -XXX,XX +XXX,XX @@ void fpu_set_state(CPUTriCoreState *env);
347
@@ -XXX,XX +XXX,XX @@ FIELD(TB_FLAGS, PRIV, 0, 2)
422
348
423
#define MMU_USER_IDX 2
349
void cpu_state_reset(CPUTriCoreState *s);
424
350
void tricore_tcg_init(void);
425
-static inline int cpu_mmu_index(CPUTriCoreState *env, bool ifetch)
351
+void tricore_translate_code(CPUState *cs, TranslationBlock *tb,
426
-{
352
+ int *max_insns, vaddr pc, void *host_pc);
427
- return 0;
353
428
-}
354
static inline void cpu_get_tb_cpu_state(CPUTriCoreState *env, vaddr *pc,
429
-
355
uint64_t *cs_base, uint32_t *flags)
430
#include "exec/cpu-all.h"
431
432
FIELD(TB_FLAGS, PRIV, 0, 2)
433
diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h
356
diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h
434
index XXXXXXX..XXXXXXX 100644
357
index XXXXXXX..XXXXXXX 100644
435
--- a/target/xtensa/cpu.h
358
--- a/target/xtensa/cpu.h
436
+++ b/target/xtensa/cpu.h
359
+++ b/target/xtensa/cpu.h
437
@@ -XXX,XX +XXX,XX @@ static inline uint32_t xtensa_replicate_windowstart(CPUXtensaState *env)
360
@@ -XXX,XX +XXX,XX @@ G_NORETURN void xtensa_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
438
/* MMU modes definitions */
361
439
#define MMU_USER_IDX 3
362
void xtensa_collect_sr_names(const XtensaConfig *config);
440
363
void xtensa_translate_init(void);
441
-static inline int cpu_mmu_index(CPUXtensaState *env, bool ifetch)
364
+void xtensa_translate_code(CPUState *cs, TranslationBlock *tb,
442
-{
365
+ int *max_insns, vaddr pc, void *host_pc);
443
- return xtensa_get_cring(env);
366
void **xtensa_get_regfile_by_name(const char *name, int entries, int bits);
444
-}
367
void xtensa_breakpoint_handler(CPUState *cs);
445
-
368
void xtensa_register_core(XtensaConfigList *node);
446
#define XTENSA_TBFLAG_RING_MASK 0x3
369
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
447
#define XTENSA_TBFLAG_EXCM 0x4
370
index XXXXXXX..XXXXXXX 100644
448
#define XTENSA_TBFLAG_LITBASE 0x8
371
--- a/accel/tcg/cpu-exec.c
372
+++ b/accel/tcg/cpu-exec.c
373
@@ -XXX,XX +XXX,XX @@ bool tcg_exec_realizefn(CPUState *cpu, Error **errp)
374
375
if (!tcg_target_initialized) {
376
/* Check mandatory TCGCPUOps handlers */
377
+ const TCGCPUOps *tcg_ops = cpu->cc->tcg_ops;
378
#ifndef CONFIG_USER_ONLY
379
- assert(cpu->cc->tcg_ops->cpu_exec_halt);
380
- assert(cpu->cc->tcg_ops->cpu_exec_interrupt);
381
+ assert(tcg_ops->cpu_exec_halt);
382
+ assert(tcg_ops->cpu_exec_interrupt);
383
#endif /* !CONFIG_USER_ONLY */
384
- cpu->cc->tcg_ops->initialize();
385
+ assert(tcg_ops->translate_code);
386
+ tcg_ops->initialize();
387
tcg_target_initialized = true;
388
}
389
390
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
391
index XXXXXXX..XXXXXXX 100644
392
--- a/accel/tcg/translate-all.c
393
+++ b/accel/tcg/translate-all.c
394
@@ -XXX,XX +XXX,XX @@ static int setjmp_gen_code(CPUArchState *env, TranslationBlock *tb,
395
396
tcg_func_start(tcg_ctx);
397
398
- tcg_ctx->cpu = env_cpu(env);
399
- gen_intermediate_code(env_cpu(env), tb, max_insns, pc, host_pc);
400
+ CPUState *cs = env_cpu(env);
401
+ tcg_ctx->cpu = cs;
402
+ cs->cc->tcg_ops->translate_code(cs, tb, max_insns, pc, host_pc);
403
+
404
assert(tb->size != 0);
405
tcg_ctx->cpu = NULL;
406
*max_insns = tb->icount;
407
@@ -XXX,XX +XXX,XX @@ TranslationBlock *tb_gen_code(CPUState *cpu,
408
/*
409
* Overflow of code_gen_buffer, or the current slice of it.
410
*
411
- * TODO: We don't need to re-do gen_intermediate_code, nor
412
+ * TODO: We don't need to re-do tcg_ops->translate_code, nor
413
* should we re-do the tcg optimization currently hidden
414
* inside tcg_gen_code. All that should be required is to
415
* flush the TBs, allocate a new TB, re-initialize it per
416
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
417
index XXXXXXX..XXXXXXX 100644
418
--- a/target/alpha/cpu.c
419
+++ b/target/alpha/cpu.c
420
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps alpha_sysemu_ops = {
421
422
static const TCGCPUOps alpha_tcg_ops = {
423
.initialize = alpha_translate_init,
424
+ .translate_code = alpha_translate_code,
425
.synchronize_from_tb = alpha_cpu_synchronize_from_tb,
426
.restore_state_to_opc = alpha_restore_state_to_opc,
427
428
diff --git a/target/alpha/translate.c b/target/alpha/translate.c
429
index XXXXXXX..XXXXXXX 100644
430
--- a/target/alpha/translate.c
431
+++ b/target/alpha/translate.c
432
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps alpha_tr_ops = {
433
.tb_stop = alpha_tr_tb_stop,
434
};
435
436
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
437
- vaddr pc, void *host_pc)
438
+void alpha_translate_code(CPUState *cpu, TranslationBlock *tb,
439
+ int *max_insns, vaddr pc, void *host_pc)
440
{
441
DisasContext dc;
442
translator_loop(cpu, tb, max_insns, pc, host_pc, &alpha_tr_ops, &dc.base);
443
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
444
index XXXXXXX..XXXXXXX 100644
445
--- a/target/arm/cpu.c
446
+++ b/target/arm/cpu.c
447
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps arm_sysemu_ops = {
448
#ifdef CONFIG_TCG
449
static const TCGCPUOps arm_tcg_ops = {
450
.initialize = arm_translate_init,
451
+ .translate_code = arm_translate_code,
452
.synchronize_from_tb = arm_cpu_synchronize_from_tb,
453
.debug_excp_handler = arm_debug_excp_handler,
454
.restore_state_to_opc = arm_restore_state_to_opc,
455
diff --git a/target/arm/tcg/cpu-v7m.c b/target/arm/tcg/cpu-v7m.c
456
index XXXXXXX..XXXXXXX 100644
457
--- a/target/arm/tcg/cpu-v7m.c
458
+++ b/target/arm/tcg/cpu-v7m.c
459
@@ -XXX,XX +XXX,XX @@ static void cortex_m55_initfn(Object *obj)
460
461
static const TCGCPUOps arm_v7m_tcg_ops = {
462
.initialize = arm_translate_init,
463
+ .translate_code = arm_translate_code,
464
.synchronize_from_tb = arm_cpu_synchronize_from_tb,
465
.debug_excp_handler = arm_debug_excp_handler,
466
.restore_state_to_opc = arm_restore_state_to_opc,
467
diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c
468
index XXXXXXX..XXXXXXX 100644
469
--- a/target/arm/tcg/translate.c
470
+++ b/target/arm/tcg/translate.c
471
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps thumb_translator_ops = {
472
.tb_stop = arm_tr_tb_stop,
473
};
474
475
-/* generate intermediate code for basic block 'tb'. */
476
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
477
- vaddr pc, void *host_pc)
478
+void arm_translate_code(CPUState *cpu, TranslationBlock *tb,
479
+ int *max_insns, vaddr pc, void *host_pc)
480
{
481
DisasContext dc = { };
482
const TranslatorOps *ops = &arm_translator_ops;
483
diff --git a/target/avr/cpu.c b/target/avr/cpu.c
484
index XXXXXXX..XXXXXXX 100644
485
--- a/target/avr/cpu.c
486
+++ b/target/avr/cpu.c
487
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps avr_sysemu_ops = {
488
489
static const TCGCPUOps avr_tcg_ops = {
490
.initialize = avr_cpu_tcg_init,
491
+ .translate_code = avr_cpu_translate_code,
492
.synchronize_from_tb = avr_cpu_synchronize_from_tb,
493
.restore_state_to_opc = avr_restore_state_to_opc,
494
.cpu_exec_interrupt = avr_cpu_exec_interrupt,
495
diff --git a/target/avr/translate.c b/target/avr/translate.c
496
index XXXXXXX..XXXXXXX 100644
497
--- a/target/avr/translate.c
498
+++ b/target/avr/translate.c
499
@@ -XXX,XX +XXX,XX @@ static bool trans_WDR(DisasContext *ctx, arg_WDR *a)
500
*
501
* - translate()
502
* - canonicalize_skip()
503
- * - gen_intermediate_code()
504
+ * - translate_code()
505
* - restore_state_to_opc()
506
*
507
*/
508
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps avr_tr_ops = {
509
.tb_stop = avr_tr_tb_stop,
510
};
511
512
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
513
- vaddr pc, void *host_pc)
514
+void avr_cpu_translate_code(CPUState *cs, TranslationBlock *tb,
515
+ int *max_insns, vaddr pc, void *host_pc)
516
{
517
DisasContext dc = { };
518
translator_loop(cs, tb, max_insns, pc, host_pc, &avr_tr_ops, &dc.base);
519
diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c
520
index XXXXXXX..XXXXXXX 100644
521
--- a/target/hexagon/cpu.c
522
+++ b/target/hexagon/cpu.c
523
@@ -XXX,XX +XXX,XX @@ static void hexagon_cpu_init(Object *obj)
524
525
static const TCGCPUOps hexagon_tcg_ops = {
526
.initialize = hexagon_translate_init,
527
+ .translate_code = hexagon_translate_code,
528
.synchronize_from_tb = hexagon_cpu_synchronize_from_tb,
529
.restore_state_to_opc = hexagon_restore_state_to_opc,
530
};
531
diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c
532
index XXXXXXX..XXXXXXX 100644
533
--- a/target/hexagon/translate.c
534
+++ b/target/hexagon/translate.c
535
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps hexagon_tr_ops = {
536
.tb_stop = hexagon_tr_tb_stop,
537
};
538
539
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
540
- vaddr pc, void *host_pc)
541
+void hexagon_translate_code(CPUState *cs, TranslationBlock *tb,
542
+ int *max_insns, vaddr pc, void *host_pc)
543
{
544
DisasContext ctx;
545
449
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
546
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
450
index XXXXXXX..XXXXXXX 100644
547
index XXXXXXX..XXXXXXX 100644
451
--- a/target/hppa/cpu.c
548
--- a/target/hppa/cpu.c
452
+++ b/target/hppa/cpu.c
549
+++ b/target/hppa/cpu.c
453
@@ -XXX,XX +XXX,XX @@ static bool hppa_cpu_has_work(CPUState *cs)
550
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps hppa_sysemu_ops = {
454
return cs->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI);
551
455
}
552
static const TCGCPUOps hppa_tcg_ops = {
456
553
.initialize = hppa_translate_init,
457
-int hppa_cpu_mmu_index(CPUState *cs, bool ifetch)
554
+ .translate_code = hppa_translate_code,
458
+static int hppa_cpu_mmu_index(CPUState *cs, bool ifetch)
555
.synchronize_from_tb = hppa_cpu_synchronize_from_tb,
459
{
556
.restore_state_to_opc = hppa_restore_state_to_opc,
460
CPUHPPAState *env = cpu_env(cs);
557
461
558
diff --git a/target/hppa/translate.c b/target/hppa/translate.c
462
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
559
index XXXXXXX..XXXXXXX 100644
463
index XXXXXXX..XXXXXXX 100644
560
--- a/target/hppa/translate.c
464
--- a/target/i386/cpu.c
561
+++ b/target/hppa/translate.c
465
+++ b/target/i386/cpu.c
562
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps hppa_tr_ops = {
466
@@ -XXX,XX +XXX,XX @@ static bool x86_cpu_has_work(CPUState *cs)
563
#endif
467
return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
564
};
468
}
565
469
566
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
470
-int x86_cpu_mmu_index(CPUState *cs, bool ifetch)
567
- vaddr pc, void *host_pc)
471
+static int x86_cpu_mmu_index(CPUState *cs, bool ifetch)
568
+void hppa_translate_code(CPUState *cs, TranslationBlock *tb,
472
{
569
+ int *max_insns, vaddr pc, void *host_pc)
473
CPUX86State *env = cpu_env(cs);
570
{
571
DisasContext ctx = { };
572
translator_loop(cs, tb, max_insns, pc, host_pc, &hppa_tr_ops, &ctx.base);
573
diff --git a/target/i386/tcg/tcg-cpu.c b/target/i386/tcg/tcg-cpu.c
574
index XXXXXXX..XXXXXXX 100644
575
--- a/target/i386/tcg/tcg-cpu.c
576
+++ b/target/i386/tcg/tcg-cpu.c
577
@@ -XXX,XX +XXX,XX @@ static bool x86_debug_check_breakpoint(CPUState *cs)
578
579
static const TCGCPUOps x86_tcg_ops = {
580
.initialize = tcg_x86_init,
581
+ .translate_code = x86_translate_code,
582
.synchronize_from_tb = x86_cpu_synchronize_from_tb,
583
.restore_state_to_opc = x86_restore_state_to_opc,
584
.cpu_exec_enter = x86_cpu_exec_enter,
585
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
586
index XXXXXXX..XXXXXXX 100644
587
--- a/target/i386/tcg/translate.c
588
+++ b/target/i386/tcg/translate.c
589
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps i386_tr_ops = {
590
.tb_stop = i386_tr_tb_stop,
591
};
592
593
-/* generate intermediate code for basic block 'tb'. */
594
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
595
- vaddr pc, void *host_pc)
596
+void x86_translate_code(CPUState *cpu, TranslationBlock *tb,
597
+ int *max_insns, vaddr pc, void *host_pc)
598
{
599
DisasContext dc;
474
600
475
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
601
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
476
index XXXXXXX..XXXXXXX 100644
602
index XXXXXXX..XXXXXXX 100644
477
--- a/target/loongarch/cpu.c
603
--- a/target/loongarch/cpu.c
478
+++ b/target/loongarch/cpu.c
604
+++ b/target/loongarch/cpu.c
479
@@ -XXX,XX +XXX,XX @@ static bool loongarch_cpu_has_work(CPUState *cs)
605
@@ -XXX,XX +XXX,XX @@ static void loongarch_cpu_dump_state(CPUState *cs, FILE *f, int flags)
480
#endif
606
481
}
607
static const TCGCPUOps loongarch_tcg_ops = {
482
608
.initialize = loongarch_translate_init,
483
-int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch)
609
+ .translate_code = loongarch_translate_code,
484
+static int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch)
610
.synchronize_from_tb = loongarch_cpu_synchronize_from_tb,
485
{
611
.restore_state_to_opc = loongarch_restore_state_to_opc,
486
CPULoongArchState *env = cpu_env(cs);
612
487
613
diff --git a/target/loongarch/tcg/translate.c b/target/loongarch/tcg/translate.c
614
index XXXXXXX..XXXXXXX 100644
615
--- a/target/loongarch/tcg/translate.c
616
+++ b/target/loongarch/tcg/translate.c
617
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps loongarch_tr_ops = {
618
.tb_stop = loongarch_tr_tb_stop,
619
};
620
621
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
622
- vaddr pc, void *host_pc)
623
+void loongarch_translate_code(CPUState *cs, TranslationBlock *tb,
624
+ int *max_insns, vaddr pc, void *host_pc)
625
{
626
DisasContext ctx;
627
628
diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c
629
index XXXXXXX..XXXXXXX 100644
630
--- a/target/m68k/cpu.c
631
+++ b/target/m68k/cpu.c
632
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps m68k_sysemu_ops = {
633
634
static const TCGCPUOps m68k_tcg_ops = {
635
.initialize = m68k_tcg_init,
636
+ .translate_code = m68k_translate_code,
637
.restore_state_to_opc = m68k_restore_state_to_opc,
638
639
#ifndef CONFIG_USER_ONLY
640
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
641
index XXXXXXX..XXXXXXX 100644
642
--- a/target/m68k/translate.c
643
+++ b/target/m68k/translate.c
644
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps m68k_tr_ops = {
645
.tb_stop = m68k_tr_tb_stop,
646
};
647
648
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
649
- vaddr pc, void *host_pc)
650
+void m68k_translate_code(CPUState *cpu, TranslationBlock *tb,
651
+ int *max_insns, vaddr pc, void *host_pc)
652
{
653
DisasContext dc;
654
translator_loop(cpu, tb, max_insns, pc, host_pc, &m68k_tr_ops, &dc.base);
488
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
655
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
489
index XXXXXXX..XXXXXXX 100644
656
index XXXXXXX..XXXXXXX 100644
490
--- a/target/microblaze/cpu.c
657
--- a/target/microblaze/cpu.c
491
+++ b/target/microblaze/cpu.c
658
+++ b/target/microblaze/cpu.c
492
@@ -XXX,XX +XXX,XX @@ static bool mb_cpu_has_work(CPUState *cs)
659
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps mb_sysemu_ops = {
493
return cs->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI);
660
494
}
661
static const TCGCPUOps mb_tcg_ops = {
495
662
.initialize = mb_tcg_init,
496
-int mb_cpu_mmu_index(CPUState *cs, bool ifetch)
663
+ .translate_code = mb_translate_code,
497
+static int mb_cpu_mmu_index(CPUState *cs, bool ifetch)
664
.synchronize_from_tb = mb_cpu_synchronize_from_tb,
498
{
665
.restore_state_to_opc = mb_restore_state_to_opc,
499
CPUMBState *env = cpu_env(cs);
666
500
MicroBlazeCPU *cpu = env_archcpu(env);
667
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
501
diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
668
index XXXXXXX..XXXXXXX 100644
502
index XXXXXXX..XXXXXXX 100644
669
--- a/target/microblaze/translate.c
503
--- a/target/nios2/cpu.c
670
+++ b/target/microblaze/translate.c
504
+++ b/target/nios2/cpu.c
671
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps mb_tr_ops = {
505
@@ -XXX,XX +XXX,XX @@ static bool nios2_cpu_has_work(CPUState *cs)
672
.tb_stop = mb_tr_tb_stop,
506
return cs->interrupt_request & CPU_INTERRUPT_HARD;
673
};
507
}
674
508
675
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
509
-int nios2_cpu_mmu_index(CPUState *cs, bool ifetch)
676
- vaddr pc, void *host_pc)
510
+static int nios2_cpu_mmu_index(CPUState *cs, bool ifetch)
677
+void mb_translate_code(CPUState *cpu, TranslationBlock *tb,
511
{
678
+ int *max_insns, vaddr pc, void *host_pc)
512
return (cpu_env(cs)->ctrl[CR_STATUS] & CR_STATUS_U
679
{
513
? MMU_USER_IDX : MMU_SUPERVISOR_IDX);
680
DisasContext dc;
681
translator_loop(cpu, tb, max_insns, pc, host_pc, &mb_tr_ops, &dc.base);
682
diff --git a/target/mips/cpu.c b/target/mips/cpu.c
683
index XXXXXXX..XXXXXXX 100644
684
--- a/target/mips/cpu.c
685
+++ b/target/mips/cpu.c
686
@@ -XXX,XX +XXX,XX @@ static const Property mips_cpu_properties[] = {
687
#include "hw/core/tcg-cpu-ops.h"
688
static const TCGCPUOps mips_tcg_ops = {
689
.initialize = mips_tcg_init,
690
+ .translate_code = mips_translate_code,
691
.synchronize_from_tb = mips_cpu_synchronize_from_tb,
692
.restore_state_to_opc = mips_restore_state_to_opc,
693
694
diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c
695
index XXXXXXX..XXXXXXX 100644
696
--- a/target/mips/tcg/translate.c
697
+++ b/target/mips/tcg/translate.c
698
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps mips_tr_ops = {
699
.tb_stop = mips_tr_tb_stop,
700
};
701
702
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
703
- vaddr pc, void *host_pc)
704
+void mips_translate_code(CPUState *cs, TranslationBlock *tb,
705
+ int *max_insns, vaddr pc, void *host_pc)
706
{
707
DisasContext ctx;
708
514
diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c
709
diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c
515
index XXXXXXX..XXXXXXX 100644
710
index XXXXXXX..XXXXXXX 100644
516
--- a/target/openrisc/cpu.c
711
--- a/target/openrisc/cpu.c
517
+++ b/target/openrisc/cpu.c
712
+++ b/target/openrisc/cpu.c
518
@@ -XXX,XX +XXX,XX @@ static bool openrisc_cpu_has_work(CPUState *cs)
713
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps openrisc_sysemu_ops = {
519
CPU_INTERRUPT_TIMER);
714
520
}
715
static const TCGCPUOps openrisc_tcg_ops = {
521
716
.initialize = openrisc_translate_init,
522
-int openrisc_cpu_mmu_index(CPUState *cs, bool ifetch)
717
+ .translate_code = openrisc_translate_code,
523
+static int openrisc_cpu_mmu_index(CPUState *cs, bool ifetch)
718
.synchronize_from_tb = openrisc_cpu_synchronize_from_tb,
524
{
719
.restore_state_to_opc = openrisc_restore_state_to_opc,
525
CPUOpenRISCState *env = cpu_env(cs);
720
721
diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c
722
index XXXXXXX..XXXXXXX 100644
723
--- a/target/openrisc/translate.c
724
+++ b/target/openrisc/translate.c
725
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps openrisc_tr_ops = {
726
.tb_stop = openrisc_tr_tb_stop,
727
};
728
729
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
730
- vaddr pc, void *host_pc)
731
+void openrisc_translate_code(CPUState *cs, TranslationBlock *tb,
732
+ int *max_insns, vaddr pc, void *host_pc)
733
{
734
DisasContext ctx;
735
736
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
737
index XXXXXXX..XXXXXXX 100644
738
--- a/target/ppc/cpu_init.c
739
+++ b/target/ppc/cpu_init.c
740
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps ppc_sysemu_ops = {
741
742
static const TCGCPUOps ppc_tcg_ops = {
743
.initialize = ppc_translate_init,
744
+ .translate_code = ppc_translate_code,
745
.restore_state_to_opc = ppc_restore_state_to_opc,
746
747
#ifdef CONFIG_USER_ONLY
748
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
749
index XXXXXXX..XXXXXXX 100644
750
--- a/target/ppc/translate.c
751
+++ b/target/ppc/translate.c
752
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps ppc_tr_ops = {
753
.tb_stop = ppc_tr_tb_stop,
754
};
755
756
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
757
- vaddr pc, void *host_pc)
758
+void ppc_translate_code(CPUState *cs, TranslationBlock *tb,
759
+ int *max_insns, vaddr pc, void *host_pc)
760
{
761
DisasContext ctx;
762
763
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
764
index XXXXXXX..XXXXXXX 100644
765
--- a/target/riscv/tcg/tcg-cpu.c
766
+++ b/target/riscv/tcg/tcg-cpu.c
767
@@ -XXX,XX +XXX,XX @@ static void riscv_restore_state_to_opc(CPUState *cs,
768
769
static const TCGCPUOps riscv_tcg_ops = {
770
.initialize = riscv_translate_init,
771
+ .translate_code = riscv_translate_code,
772
.synchronize_from_tb = riscv_cpu_synchronize_from_tb,
773
.restore_state_to_opc = riscv_restore_state_to_opc,
774
775
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
776
index XXXXXXX..XXXXXXX 100644
777
--- a/target/riscv/translate.c
778
+++ b/target/riscv/translate.c
779
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps riscv_tr_ops = {
780
.tb_stop = riscv_tr_tb_stop,
781
};
782
783
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
784
- vaddr pc, void *host_pc)
785
+void riscv_translate_code(CPUState *cs, TranslationBlock *tb,
786
+ int *max_insns, vaddr pc, void *host_pc)
787
{
788
DisasContext ctx;
789
790
diff --git a/target/rx/cpu.c b/target/rx/cpu.c
791
index XXXXXXX..XXXXXXX 100644
792
--- a/target/rx/cpu.c
793
+++ b/target/rx/cpu.c
794
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps rx_sysemu_ops = {
795
796
static const TCGCPUOps rx_tcg_ops = {
797
.initialize = rx_translate_init,
798
+ .translate_code = rx_translate_code,
799
.synchronize_from_tb = rx_cpu_synchronize_from_tb,
800
.restore_state_to_opc = rx_restore_state_to_opc,
801
.tlb_fill = rx_cpu_tlb_fill,
802
diff --git a/target/rx/translate.c b/target/rx/translate.c
803
index XXXXXXX..XXXXXXX 100644
804
--- a/target/rx/translate.c
805
+++ b/target/rx/translate.c
806
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps rx_tr_ops = {
807
.tb_stop = rx_tr_tb_stop,
808
};
809
810
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
811
- vaddr pc, void *host_pc)
812
+void rx_translate_code(CPUState *cs, TranslationBlock *tb,
813
+ int *max_insns, vaddr pc, void *host_pc)
814
{
815
DisasContext dc;
816
817
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
818
index XXXXXXX..XXXXXXX 100644
819
--- a/target/s390x/cpu.c
820
+++ b/target/s390x/cpu.c
821
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPUS390XState *env, vaddr *pc,
822
823
static const TCGCPUOps s390_tcg_ops = {
824
.initialize = s390x_translate_init,
825
+ .translate_code = s390x_translate_code,
826
.restore_state_to_opc = s390x_restore_state_to_opc,
827
828
#ifdef CONFIG_USER_ONLY
829
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
830
index XXXXXXX..XXXXXXX 100644
831
--- a/target/s390x/tcg/translate.c
832
+++ b/target/s390x/tcg/translate.c
833
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps s390x_tr_ops = {
834
.disas_log = s390x_tr_disas_log,
835
};
836
837
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
838
- vaddr pc, void *host_pc)
839
+void s390x_translate_code(CPUState *cs, TranslationBlock *tb,
840
+ int *max_insns, vaddr pc, void *host_pc)
841
{
842
DisasContext dc;
526
843
527
diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c
844
diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c
528
index XXXXXXX..XXXXXXX 100644
845
index XXXXXXX..XXXXXXX 100644
529
--- a/target/sh4/cpu.c
846
--- a/target/sh4/cpu.c
530
+++ b/target/sh4/cpu.c
847
+++ b/target/sh4/cpu.c
531
@@ -XXX,XX +XXX,XX @@ static bool superh_cpu_has_work(CPUState *cs)
848
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps sh4_sysemu_ops = {
532
return cs->interrupt_request & CPU_INTERRUPT_HARD;
849
533
}
850
static const TCGCPUOps superh_tcg_ops = {
534
851
.initialize = sh4_translate_init,
535
-int sh4_cpu_mmu_index(CPUState *cs, bool ifetch)
852
+ .translate_code = sh4_translate_code,
536
+static int sh4_cpu_mmu_index(CPUState *cs, bool ifetch)
853
.synchronize_from_tb = superh_cpu_synchronize_from_tb,
537
{
854
.restore_state_to_opc = superh_restore_state_to_opc,
538
CPUSH4State *env = cpu_env(cs);
855
856
diff --git a/target/sh4/translate.c b/target/sh4/translate.c
857
index XXXXXXX..XXXXXXX 100644
858
--- a/target/sh4/translate.c
859
+++ b/target/sh4/translate.c
860
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps sh4_tr_ops = {
861
.tb_stop = sh4_tr_tb_stop,
862
};
863
864
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
865
- vaddr pc, void *host_pc)
866
+void sh4_translate_code(CPUState *cs, TranslationBlock *tb,
867
+ int *max_insns, vaddr pc, void *host_pc)
868
{
869
DisasContext ctx;
539
870
540
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
871
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
541
index XXXXXXX..XXXXXXX 100644
872
index XXXXXXX..XXXXXXX 100644
542
--- a/target/sparc/cpu.c
873
--- a/target/sparc/cpu.c
543
+++ b/target/sparc/cpu.c
874
+++ b/target/sparc/cpu.c
544
@@ -XXX,XX +XXX,XX @@ static bool sparc_cpu_has_work(CPUState *cs)
875
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps sparc_sysemu_ops = {
545
cpu_interrupts_enabled(env);
876
546
}
877
static const TCGCPUOps sparc_tcg_ops = {
547
878
.initialize = sparc_tcg_init,
548
-int sparc_cpu_mmu_index(CPUState *cs, bool ifetch)
879
+ .translate_code = sparc_translate_code,
549
+static int sparc_cpu_mmu_index(CPUState *cs, bool ifetch)
880
.synchronize_from_tb = sparc_cpu_synchronize_from_tb,
550
{
881
.restore_state_to_opc = sparc_restore_state_to_opc,
551
CPUSPARCState *env = cpu_env(cs);
882
552
883
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
884
index XXXXXXX..XXXXXXX 100644
885
--- a/target/sparc/translate.c
886
+++ b/target/sparc/translate.c
887
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps sparc_tr_ops = {
888
.tb_stop = sparc_tr_tb_stop,
889
};
890
891
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
892
- vaddr pc, void *host_pc)
893
+void sparc_translate_code(CPUState *cs, TranslationBlock *tb,
894
+ int *max_insns, vaddr pc, void *host_pc)
895
{
896
DisasContext dc = {};
897
898
diff --git a/target/tricore/cpu.c b/target/tricore/cpu.c
899
index XXXXXXX..XXXXXXX 100644
900
--- a/target/tricore/cpu.c
901
+++ b/target/tricore/cpu.c
902
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps tricore_sysemu_ops = {
903
904
static const TCGCPUOps tricore_tcg_ops = {
905
.initialize = tricore_tcg_init,
906
+ .translate_code = tricore_translate_code,
907
.synchronize_from_tb = tricore_cpu_synchronize_from_tb,
908
.restore_state_to_opc = tricore_restore_state_to_opc,
909
.tlb_fill = tricore_cpu_tlb_fill,
910
diff --git a/target/tricore/translate.c b/target/tricore/translate.c
911
index XXXXXXX..XXXXXXX 100644
912
--- a/target/tricore/translate.c
913
+++ b/target/tricore/translate.c
914
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps tricore_tr_ops = {
915
.tb_stop = tricore_tr_tb_stop,
916
};
917
918
-
919
-void gen_intermediate_code(CPUState *cs, TranslationBlock *tb, int *max_insns,
920
- vaddr pc, void *host_pc)
921
+void tricore_translate_code(CPUState *cs, TranslationBlock *tb,
922
+ int *max_insns, vaddr pc, void *host_pc)
923
{
924
DisasContext ctx;
925
translator_loop(cs, tb, max_insns, pc, host_pc,
926
diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c
927
index XXXXXXX..XXXXXXX 100644
928
--- a/target/xtensa/cpu.c
929
+++ b/target/xtensa/cpu.c
930
@@ -XXX,XX +XXX,XX @@ static const struct SysemuCPUOps xtensa_sysemu_ops = {
931
932
static const TCGCPUOps xtensa_tcg_ops = {
933
.initialize = xtensa_translate_init,
934
+ .translate_code = xtensa_translate_code,
935
.debug_excp_handler = xtensa_breakpoint_handler,
936
.restore_state_to_opc = xtensa_restore_state_to_opc,
937
938
diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c
939
index XXXXXXX..XXXXXXX 100644
940
--- a/target/xtensa/translate.c
941
+++ b/target/xtensa/translate.c
942
@@ -XXX,XX +XXX,XX @@ static const TranslatorOps xtensa_translator_ops = {
943
.tb_stop = xtensa_tr_tb_stop,
944
};
945
946
-void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
947
- vaddr pc, void *host_pc)
948
+void xtensa_translate_code(CPUState *cpu, TranslationBlock *tb,
949
+ int *max_insns, vaddr pc, void *host_pc)
950
{
951
DisasContext dc = {};
952
translator_loop(cpu, tb, max_insns, pc, host_pc,
553
--
953
--
554
2.34.1
954
2.43.0
555
955
556
956
diff view generated by jsdifflib