1
The following changes since commit 14639717bf379480e937716fcaf1e72b47fd4c5f:
1
Pretty small still, but there are two patches that ought
2
to get backported to stable, so no point in delaying.
2
3
3
Merge tag 'pull-trivial-patches' of https://gitlab.com/mjt0k/qemu into staging (2024-01-31 19:53:45 +0000)
4
r~
5
6
The following changes since commit a5ba0a7e4e150d1350a041f0d0ef9ca6c8d7c307:
7
8
Merge tag 'pull-aspeed-20241211' of https://github.com/legoater/qemu into staging (2024-12-11 15:16:47 +0000)
4
9
5
are available in the Git repository at:
10
are available in the Git repository at:
6
11
7
https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20240202
12
https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20241212
8
13
9
for you to fetch changes up to 73e095fc71dfeb8f5f767d9ac71078e562d935b0:
14
for you to fetch changes up to 7ac87b14a92234b6a89b701b4043ad6cf8bdcccf:
10
15
11
target/sparc: Remove FSR_FTT_NMASK, FSR_FTT_CEXC_NMASK (2024-02-02 14:40:06 +1000)
16
target/sparc: Use memcpy() and remove memcpy32() (2024-12-12 14:28:38 -0600)
12
17
13
----------------------------------------------------------------
18
----------------------------------------------------------------
14
tests/tcg: Fix multiarch/gdbstub/prot-none.py
19
tcg: Reset free_temps before tcg_optimize
15
hw/core: Convert cpu_mmu_index to a CPUClass hook
20
tcg/riscv: Fix StoreStore barrier generation
16
tcg/loongarch64: Set vector registers call clobbered
21
include/exec: Introduce fpst alias in helper-head.h.inc
17
target/sparc: floating-point cleanup
22
target/sparc: Use memcpy() and remove memcpy32()
18
23
19
----------------------------------------------------------------
24
----------------------------------------------------------------
20
Ilya Leoshkevich (1):
25
Philippe Mathieu-Daudé (1):
21
tests/tcg: Fix the /proc/self/mem probing in the PROT_NONE gdbstub test
26
target/sparc: Use memcpy() and remove memcpy32()
22
27
23
Richard Henderson (56):
28
Richard Henderson (2):
24
include/hw/core: Add mmu_index to CPUClass
29
tcg: Reset free_temps before tcg_optimize
25
target/alpha: Split out alpha_env_mmu_index
30
include/exec: Introduce fpst alias in helper-head.h.inc
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
31
81
include/exec/cpu-all.h | 4 +
32
Roman Artemev (1):
82
include/exec/cpu-common.h | 21 +
33
tcg/riscv: Fix StoreStore barrier generation
83
include/hw/core/cpu.h | 3 +
34
84
target/alpha/cpu.h | 2 +-
35
include/tcg/tcg-temp-internal.h | 6 ++++++
85
target/arm/cpu.h | 13 -
36
accel/tcg/plugin-gen.c | 2 +-
86
target/arm/internals.h | 5 +
37
target/sparc/win_helper.c | 26 ++++++++------------------
87
target/avr/cpu.h | 7 -
38
tcg/tcg.c | 5 ++++-
88
target/cris/cpu.h | 4 -
39
include/exec/helper-head.h.inc | 3 +++
89
target/hexagon/cpu.h | 9 -
40
tcg/riscv/tcg-target.c.inc | 2 +-
90
target/hppa/cpu.h | 13 -
41
6 files changed, 23 insertions(+), 21 deletions(-)
91
target/i386/cpu.h | 7 -
42
92
target/loongarch/cpu.h | 18 +-
93
target/m68k/cpu.h | 4 -
94
target/microblaze/cpu.h | 15 -
95
target/mips/cpu.h | 6 +-
96
target/nios2/cpu.h | 6 -
97
target/openrisc/cpu.h | 12 -
98
target/ppc/cpu.h | 2 +-
99
target/riscv/cpu.h | 4 +-
100
target/rx/cpu.h | 5 -
101
target/s390x/cpu.h | 2 +-
102
target/sh4/cpu.h | 10 -
103
target/sparc/cpu.h | 69 +-
104
target/sparc/helper.h | 116 ++-
105
target/tricore/cpu.h | 5 -
106
target/xtensa/cpu.h | 5 -
107
accel/tcg/cputlb.c | 22 +-
108
linux-user/sparc/cpu_loop.c | 2 +-
109
linux-user/sparc/signal.c | 14 +-
110
semihosting/uaccess.c | 2 +-
111
target/alpha/cpu.c | 6 +
112
target/alpha/translate.c | 2 +-
113
target/arm/cpu.c | 6 +
114
target/arm/helper.c | 2 +-
115
target/arm/tcg/helper-a64.c | 4 +-
116
target/arm/tcg/mte_helper.c | 18 +-
117
target/arm/tcg/sve_helper.c | 8 +-
118
target/arm/tcg/tlb_helper.c | 2 +-
119
target/avr/cpu.c | 6 +
120
target/cris/cpu.c | 6 +
121
target/cris/translate.c | 14 +-
122
target/hppa/cpu.c | 12 +
123
target/hppa/mem_helper.c | 2 +-
124
target/hppa/op_helper.c | 8 +-
125
target/i386/cpu.c | 10 +
126
target/i386/tcg/translate.c | 2 +-
127
target/loongarch/cpu.c | 11 +
128
target/loongarch/tcg/tlb_helper.c | 8 +-
129
target/loongarch/tcg/translate.c | 2 +-
130
target/m68k/cpu.c | 6 +
131
target/m68k/op_helper.c | 2 +-
132
target/microblaze/cpu.c | 18 +-
133
target/microblaze/helper.c | 3 +-
134
target/microblaze/mmu.c | 2 +-
135
target/microblaze/translate.c | 2 +-
136
target/mips/cpu.c | 6 +
137
target/mips/sysemu/physaddr.c | 2 +-
138
target/mips/tcg/msa_helper.c | 10 +-
139
target/mips/tcg/sysemu/cp0_helper.c | 2 +-
140
target/mips/tcg/sysemu/special_helper.c | 2 +-
141
target/mips/tcg/sysemu/tlb_helper.c | 34 +-
142
target/nios2/cpu.c | 7 +
143
target/nios2/translate.c | 2 +-
144
target/openrisc/cpu.c | 13 +
145
target/openrisc/translate.c | 2 +-
146
target/ppc/cpu_init.c | 8 +-
147
target/ppc/mem_helper.c | 10 +-
148
target/ppc/mmu_common.c | 4 +-
149
target/riscv/cpu.c | 6 +
150
target/riscv/cpu_helper.c | 6 +-
151
target/riscv/op_helper.c | 4 +-
152
target/riscv/vector_helper.c | 9 +-
153
target/rx/cpu.c | 6 +
154
target/s390x/cpu.c | 6 +
155
target/s390x/tcg/mem_helper.c | 34 +-
156
target/sh4/cpu.c | 16 +
157
target/sparc/cpu.c | 61 +-
158
target/sparc/fop_helper.c | 510 +++++++------
159
target/sparc/gdbstub.c | 8 +-
160
target/sparc/ldst_helper.c | 5 +-
161
target/sparc/machine.c | 36 +-
162
target/sparc/mmu_helper.c | 2 +-
163
target/sparc/translate.c | 799 +++++++--------------
164
target/tricore/cpu.c | 6 +
165
target/tricore/helper.c | 2 +-
166
target/tricore/translate.c | 2 +-
167
target/xtensa/cpu.c | 6 +
168
target/xtensa/mmu_helper.c | 2 +-
169
accel/tcg/ldst_common.c.inc | 42 +-
170
target/cris/translate_v10.c.inc | 6 +-
171
.../tcg/insn_trans/trans_privileged.c.inc | 2 +-
172
tcg/loongarch64/tcg-target.c.inc | 2 +-
173
tests/tcg/multiarch/gdbstub/prot-none.py | 2 +-
174
93 files changed, 1060 insertions(+), 1191 deletions(-)
diff view generated by jsdifflib
1
When allocating new temps during tcg_optmize, do not re-use
2
any EBB temps that were used within the TB. We do not have
3
any idea what span of the TB in which the temp was live.
4
5
Introduce tcg_temp_ebb_reset_freed and use before tcg_optimize,
6
as well as replacing the equivalent in plugin_gen_inject and
7
tcg_func_start.
8
9
Cc: qemu-stable@nongnu.org
10
Fixes: fb04ab7ddd8 ("tcg/optimize: Lower TCG_COND_TST{EQ,NE} if unsupported")
11
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2711
12
Reported-by: wannacu <wannacu2049@gmail.com>
13
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
14
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
15
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
16
---
4
target/arm/internals.h | 5 +++++
17
include/tcg/tcg-temp-internal.h | 6 ++++++
5
target/arm/helper.c | 2 +-
18
accel/tcg/plugin-gen.c | 2 +-
6
target/arm/tcg/helper-a64.c | 4 ++--
19
tcg/tcg.c | 5 ++++-
7
target/arm/tcg/mte_helper.c | 18 +++++++++---------
20
3 files changed, 11 insertions(+), 2 deletions(-)
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
21
12
diff --git a/target/arm/internals.h b/target/arm/internals.h
22
diff --git a/include/tcg/tcg-temp-internal.h b/include/tcg/tcg-temp-internal.h
13
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
14
--- a/target/arm/internals.h
24
--- a/include/tcg/tcg-temp-internal.h
15
+++ b/target/arm/internals.h
25
+++ b/include/tcg/tcg-temp-internal.h
16
@@ -XXX,XX +XXX,XX @@
26
@@ -XXX,XX +XXX,XX @@ TCGv_i64 tcg_temp_ebb_new_i64(void);
17
#define BANK_HYP 6
27
TCGv_ptr tcg_temp_ebb_new_ptr(void);
18
#define BANK_MON 7
28
TCGv_i128 tcg_temp_ebb_new_i128(void);
19
29
20
+static inline int arm_env_mmu_index(CPUARMState *env)
30
+/* Forget all freed EBB temps, so that new allocations produce new temps. */
31
+static inline void tcg_temp_ebb_reset_freed(TCGContext *s)
21
+{
32
+{
22
+ return EX_TBFLAG_ANY(env->hflags, MMUIDX);
33
+ memset(s->free_temps, 0, sizeof(s->free_temps));
23
+}
34
+}
24
+
35
+
25
static inline bool excp_is_internal(int excp)
36
#endif /* TCG_TEMP_FREE_H */
26
{
37
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
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
38
index XXXXXXX..XXXXXXX 100644
30
--- a/target/arm/helper.c
39
--- a/accel/tcg/plugin-gen.c
31
+++ b/target/arm/helper.c
40
+++ b/accel/tcg/plugin-gen.c
32
@@ -XXX,XX +XXX,XX @@ static void dccvap_writefn(CPUARMState *env, const ARMCPRegInfo *opaque,
41
@@ -XXX,XX +XXX,XX @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
33
uint64_t vaddr_in = (uint64_t) value;
42
* that might be live within the existing opcode stream.
34
uint64_t vaddr = vaddr_in & ~(dline_size - 1);
43
* The simplest solution is to release them all and create new.
35
void *haddr;
44
*/
36
- int mem_idx = cpu_mmu_index(env, false);
45
- memset(tcg_ctx->free_temps, 0, sizeof(tcg_ctx->free_temps));
37
+ int mem_idx = arm_env_mmu_index(env);
46
+ tcg_temp_ebb_reset_freed(tcg_ctx);
38
47
39
/* This won't be crossing page boundaries */
48
QTAILQ_FOREACH_SAFE(op, &tcg_ctx->ops, link, next) {
40
haddr = probe_read(env, vaddr, dline_size, mem_idx, GETPC());
49
switch (op->opc) {
41
diff --git a/target/arm/tcg/helper-a64.c b/target/arm/tcg/helper-a64.c
50
diff --git a/tcg/tcg.c b/tcg/tcg.c
42
index XXXXXXX..XXXXXXX 100644
51
index XXXXXXX..XXXXXXX 100644
43
--- a/target/arm/tcg/helper-a64.c
52
--- a/tcg/tcg.c
44
+++ b/target/arm/tcg/helper-a64.c
53
+++ b/tcg/tcg.c
45
@@ -XXX,XX +XXX,XX @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
54
@@ -XXX,XX +XXX,XX @@ void tcg_func_start(TCGContext *s)
46
tbii = EX_TBFLAG_A64(env->hflags, TBII);
55
s->nb_temps = s->nb_globals;
47
if ((tbii >> extract64(new_pc, 55, 1)) & 1) {
56
48
/* TBI is enabled. */
57
/* No temps have been previously allocated for size or locality. */
49
- int core_mmu_idx = cpu_mmu_index(env, false);
58
- memset(s->free_temps, 0, sizeof(s->free_temps));
50
+ int core_mmu_idx = arm_env_mmu_index(env);
59
+ tcg_temp_ebb_reset_freed(s);
51
if (regime_has_2_ranges(core_to_aa64_mmu_idx(core_mmu_idx))) {
60
52
new_pc = sextract64(new_pc, 0, 56);
61
/* No constant temps have been previously allocated. */
53
} else {
62
for (int i = 0; i < TCG_TYPE_COUNT; ++i) {
54
@@ -XXX,XX +XXX,XX @@ void HELPER(dc_zva)(CPUARMState *env, uint64_t vaddr_in)
63
@@ -XXX,XX +XXX,XX @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start)
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
}
64
}
84
}
65
#endif
85
@@ -XXX,XX +XXX,XX @@ typedef void stg_store1(uint64_t, uint8_t *, int);
66
86
static inline void do_stg(CPUARMState *env, uint64_t ptr, uint64_t xt,
67
+ /* Do not reuse any EBB that may be allocated within the TB. */
87
uintptr_t ra, stg_store1 store1)
68
+ tcg_temp_ebb_reset_freed(s);
88
{
69
+
89
- int mmu_idx = cpu_mmu_index(env, false);
70
tcg_optimize(s);
90
+ int mmu_idx = arm_env_mmu_index(env);
71
91
uint8_t *mem;
72
reachable_code_pass(s);
92
93
check_tag_aligned(env, ptr, ra);
94
@@ -XXX,XX +XXX,XX @@ void HELPER(stg_parallel)(CPUARMState *env, uint64_t ptr, uint64_t xt)
95
96
void HELPER(stg_stub)(CPUARMState *env, uint64_t ptr)
97
{
98
- int mmu_idx = cpu_mmu_index(env, false);
99
+ int mmu_idx = arm_env_mmu_index(env);
100
uintptr_t ra = GETPC();
101
102
check_tag_aligned(env, ptr, ra);
103
@@ -XXX,XX +XXX,XX @@ void HELPER(stg_stub)(CPUARMState *env, uint64_t ptr)
104
static inline void do_st2g(CPUARMState *env, uint64_t ptr, uint64_t xt,
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
--
73
--
202
2.34.1
74
2.43.0
203
75
204
76
diff view generated by jsdifflib
1
Without this padding, an unwind through the signal handler
1
From: Roman Artemev <roman.artemev@syntacore.com>
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
On RISC-V to StoreStore barrier corresponds
4
`fence w, w` not `fence r, r`
5
5
6
Cc: qemu-stable@nongnu.org
6
Cc: qemu-stable@nongnu.org
7
Fixes: ee95fae075c6 ("linux-user/aarch64: Add vdso")
7
Fixes: efbea94c76b ("tcg/riscv: Add slowpath load and store instructions")
8
Resolves: https://linaro.atlassian.net/browse/GNU-974
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Denis Tomashev <denis.tomashev@syntacore.com>
10
Signed-off-by: Roman Artemev <roman.artemev@syntacore.com>
11
Message-ID: <e2f2131e294a49e79959d4fa9ec02cf4@syntacore.com>
9
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
10
---
13
---
11
linux-user/aarch64/vdso-be.so | Bin 3216 -> 3224 bytes
14
tcg/riscv/tcg-target.c.inc | 2 +-
12
linux-user/aarch64/vdso-le.so | Bin 3216 -> 3224 bytes
15
1 file changed, 1 insertion(+), 1 deletion(-)
13
linux-user/aarch64/vdso.S | 4 ++++
14
3 files changed, 4 insertions(+)
15
16
16
diff --git a/linux-user/aarch64/vdso-be.so b/linux-user/aarch64/vdso-be.so
17
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
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
18
index XXXXXXX..XXXXXXX 100644
44
--- a/linux-user/aarch64/vdso.S
19
--- a/tcg/riscv/tcg-target.c.inc
45
+++ b/linux-user/aarch64/vdso.S
20
+++ b/tcg/riscv/tcg-target.c.inc
46
@@ -XXX,XX +XXX,XX @@ vdso_syscall __kernel_clock_getres, __NR_clock_getres
21
@@ -XXX,XX +XXX,XX @@ static void tcg_out_mb(TCGContext *s, TCGArg a0)
47
* For now, elide the unwind info for __kernel_rt_sigreturn and rely on
22
insn |= 0x02100000;
48
* the libgcc fallback routine as we have always done. This requires
23
}
49
* that the code sequence used be exact.
24
if (a0 & TCG_MO_ST_ST) {
50
+ *
25
- insn |= 0x02200000;
51
+ * Add a nop as a spacer to ensure that unwind does not pick up the
26
+ insn |= 0x01100000;
52
+ * unwind info from the preceding syscall.
27
}
53
*/
28
tcg_out32(s, insn);
54
+    nop
29
}
55
__kernel_rt_sigreturn:
56
    /* No BTI C insn here -- we arrive via RET. */
57
    mov    x8, #__NR_rt_sigreturn
58
--
30
--
59
2.34.1
31
2.43.0
diff view generated by jsdifflib
1
To be used after all targets have populated the hook.
1
This allows targets to declare that the helper requires a
2
float_status pointer and instead of a generic void pointer.
2
3
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
---
6
include/hw/core/cpu.h | 3 +++
7
include/exec/helper-head.h.inc | 3 +++
7
1 file changed, 3 insertions(+)
8
1 file changed, 3 insertions(+)
8
9
9
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
10
diff --git a/include/exec/helper-head.h.inc b/include/exec/helper-head.h.inc
10
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
11
--- a/include/hw/core/cpu.h
12
--- a/include/exec/helper-head.h.inc
12
+++ b/include/hw/core/cpu.h
13
+++ b/include/exec/helper-head.h.inc
13
@@ -XXX,XX +XXX,XX @@ struct SysemuCPUOps;
14
@@ -XXX,XX +XXX,XX @@
14
* @parse_features: Callback to parse command line arguments.
15
#define dh_alias_ptr ptr
15
* @reset_dump_flags: #CPUDumpFlags to use for reset logging.
16
#define dh_alias_cptr ptr
16
* @has_work: Callback for checking if there is work to do.
17
#define dh_alias_env ptr
17
+ * @mmu_index: Callback for choosing softmmu mmu index;
18
+#define dh_alias_fpst ptr
18
+ * may be used internally by memory_rw_debug without TCG.
19
#define dh_alias_void void
19
* @memory_rw_debug: Callback for GDB memory access.
20
#define dh_alias_noreturn noreturn
20
* @dump_state: Callback for dumping state.
21
#define dh_alias(t) glue(dh_alias_, t)
21
* @query_cpu_fast:
22
@@ -XXX,XX +XXX,XX @@
22
@@ -XXX,XX +XXX,XX @@ struct CPUClass {
23
#define dh_ctype_ptr void *
23
void (*parse_features)(const char *typename, char *str, Error **errp);
24
#define dh_ctype_cptr const void *
24
25
#define dh_ctype_env CPUArchState *
25
bool (*has_work)(CPUState *cpu);
26
+#define dh_ctype_fpst float_status *
26
+ int (*mmu_index)(CPUState *cpu, bool ifetch);
27
#define dh_ctype_void void
27
int (*memory_rw_debug)(CPUState *cpu, vaddr addr,
28
#define dh_ctype_noreturn G_NORETURN void
28
uint8_t *buf, int len, bool is_write);
29
#define dh_ctype(t) dh_ctype_##t
29
void (*dump_state)(CPUState *cpu, FILE *, int flags);
30
@@ -XXX,XX +XXX,XX @@
31
#define dh_typecode_f64 dh_typecode_i64
32
#define dh_typecode_cptr dh_typecode_ptr
33
#define dh_typecode_env dh_typecode_ptr
34
+#define dh_typecode_fpst dh_typecode_ptr
35
#define dh_typecode(t) dh_typecode_##t
36
37
#define dh_callflag_i32 0
30
--
38
--
31
2.34.1
39
2.43.0
32
40
33
41
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/alpha/cpu.h | 7 ++++++-
5
target/alpha/translate.c | 2 +-
6
2 files changed, 7 insertions(+), 2 deletions(-)
7
1
8
diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/alpha/cpu.h
11
+++ b/target/alpha/cpu.h
12
@@ -XXX,XX +XXX,XX @@ enum {
13
14
#define TB_FLAG_UNALIGN (1u << 1)
15
16
-static inline int cpu_mmu_index(CPUAlphaState *env, bool ifetch)
17
+static inline int alpha_env_mmu_index(CPUAlphaState *env)
18
{
19
int ret = env->flags & ENV_FLAG_PS_USER ? MMU_USER_IDX : MMU_KERNEL_IDX;
20
if (env->flags & ENV_FLAG_PAL_MODE) {
21
@@ -XXX,XX +XXX,XX @@ static inline int cpu_mmu_index(CPUAlphaState *env, bool ifetch)
22
return ret;
23
}
24
25
+static inline int cpu_mmu_index(CPUAlphaState *env, bool ifetch)
26
+{
27
+ return alpha_env_mmu_index(env);
28
+}
29
+
30
enum {
31
IR_V0 = 0,
32
IR_T0 = 1,
33
diff --git a/target/alpha/translate.c b/target/alpha/translate.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/target/alpha/translate.c
36
+++ b/target/alpha/translate.c
37
@@ -XXX,XX +XXX,XX @@ static void alpha_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu)
38
int64_t bound;
39
40
ctx->tbflags = ctx->base.tb->flags;
41
- ctx->mem_idx = cpu_mmu_index(env, false);
42
+ ctx->mem_idx = alpha_env_mmu_index(env);
43
ctx->implver = env->implver;
44
ctx->amask = env->amask;
45
46
--
47
2.34.1
48
49
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/alpha/cpu.c | 6 ++++++
5
1 file changed, 6 insertions(+)
6
1
7
diff --git a/target/alpha/cpu.c b/target/alpha/cpu.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/alpha/cpu.c
10
+++ b/target/alpha/cpu.c
11
@@ -XXX,XX +XXX,XX @@ static bool alpha_cpu_has_work(CPUState *cs)
12
| CPU_INTERRUPT_MCHK);
13
}
14
15
+static int alpha_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
32
2.34.1
33
34
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/arm/cpu.c | 6 ++++++
5
1 file changed, 6 insertions(+)
6
1
7
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/arm/cpu.c
10
+++ b/target/arm/cpu.c
11
@@ -XXX,XX +XXX,XX @@ static bool arm_cpu_has_work(CPUState *cs)
12
| CPU_INTERRUPT_EXITTB);
13
}
14
15
+static int arm_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
32
2.34.1
33
34
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/avr/cpu.h | 4 +---
5
target/avr/cpu.c | 6 ++++++
6
2 files changed, 7 insertions(+), 3 deletions(-)
7
1
8
diff --git a/target/avr/cpu.h b/target/avr/cpu.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/avr/cpu.h
11
+++ b/target/avr/cpu.h
12
@@ -XXX,XX +XXX,XX @@ static inline void set_avr_feature(CPUAVRState *env, int feature)
13
env->features |= (1U << feature);
14
}
15
16
-#define cpu_mmu_index avr_cpu_mmu_index
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
{
21
return ifetch ? MMU_CODE_IDX : MMU_DATA_IDX;
22
}
23
diff --git a/target/avr/cpu.c b/target/avr/cpu.c
24
index XXXXXXX..XXXXXXX 100644
25
--- a/target/avr/cpu.c
26
+++ b/target/avr/cpu.c
27
@@ -XXX,XX +XXX,XX @@ static bool avr_cpu_has_work(CPUState *cs)
28
&& cpu_interrupts_enabled(env);
29
}
30
31
+static int avr_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
48
2.34.1
49
50
diff view generated by jsdifflib
Deleted patch
1
Compute this value once for each translation.
2
1
3
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
5
---
6
target/cris/translate.c | 14 +++++---------
7
target/cris/translate_v10.c.inc | 6 ++----
8
2 files changed, 7 insertions(+), 13 deletions(-)
9
10
diff --git a/target/cris/translate.c b/target/cris/translate.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/target/cris/translate.c
13
+++ b/target/cris/translate.c
14
@@ -XXX,XX +XXX,XX @@ typedef struct DisasContext {
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
{
26
- int mem_index = cpu_mmu_index(&dc->cpu->env, false);
27
-
28
/* If we get a fault on a delayslot we must keep the jmp state in
29
the cpu-state to be able to re-execute the jmp. */
30
if (dc->delayed_branch == 1) {
31
cris_store_direct_jmp(dc);
32
}
33
34
- tcg_gen_qemu_ld_i64(dst, addr, mem_index, MO_TEUQ);
35
+ tcg_gen_qemu_ld_i64(dst, addr, dc->mem_index, MO_TEUQ);
36
}
37
38
static void gen_load(DisasContext *dc, TCGv dst, TCGv addr,
39
unsigned int size, int sign)
40
{
41
- int mem_index = cpu_mmu_index(&dc->cpu->env, false);
42
-
43
/* If we get a fault on a delayslot we must keep the jmp state in
44
the cpu-state to be able to re-execute the jmp. */
45
if (dc->delayed_branch == 1) {
46
cris_store_direct_jmp(dc);
47
}
48
49
- tcg_gen_qemu_ld_tl(dst, addr, mem_index,
50
+ tcg_gen_qemu_ld_tl(dst, addr, dc->mem_index,
51
MO_TE + ctz32(size) + (sign ? MO_SIGN : 0));
52
}
53
54
static void gen_store (DisasContext *dc, TCGv addr, TCGv val,
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
--
107
2.34.1
108
109
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/cris/cpu.c | 6 ++++++
5
1 file changed, 6 insertions(+)
6
1
7
diff --git a/target/cris/cpu.c b/target/cris/cpu.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/cris/cpu.c
10
+++ b/target/cris/cpu.c
11
@@ -XXX,XX +XXX,XX @@ static bool cris_cpu_has_work(CPUState *cs)
12
return cs->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI);
13
}
14
15
+static int cris_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
32
2.34.1
33
34
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Helge Deller <deller@gmx.de>
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
5
target/hppa/cpu.h | 7 ++-----
6
target/hppa/cpu.c | 12 ++++++++++++
7
2 files changed, 14 insertions(+), 5 deletions(-)
8
1
9
diff --git a/target/hppa/cpu.h b/target/hppa/cpu.h
10
index XXXXXXX..XXXXXXX 100644
11
--- a/target/hppa/cpu.h
12
+++ b/target/hppa/cpu.h
13
@@ -XXX,XX +XXX,XX @@ static inline int HPPA_BTLB_ENTRIES(CPUHPPAState *env)
14
return hppa_is_pa20(env) ? 0 : PA10_BTLB_FIXED + PA10_BTLB_VARIABLE;
15
}
16
17
+int hppa_cpu_mmu_index(CPUState *cs, bool ifetch);
18
static inline int cpu_mmu_index(CPUHPPAState *env, bool ifetch)
19
{
20
#ifdef CONFIG_USER_ONLY
21
return MMU_USER_IDX;
22
#else
23
- if (env->psw & (ifetch ? PSW_C : PSW_D)) {
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
}
31
32
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/target/hppa/cpu.c
35
+++ b/target/hppa/cpu.c
36
@@ -XXX,XX +XXX,XX @@ static bool hppa_cpu_has_work(CPUState *cs)
37
return cs->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI);
38
}
39
40
+int hppa_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
63
2.34.1
64
65
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/i386/cpu.h | 13 ++++++-------
5
target/i386/cpu.c | 10 ++++++++++
6
2 files changed, 16 insertions(+), 7 deletions(-)
7
1
8
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/i386/cpu.h
11
+++ b/target/i386/cpu.h
12
@@ -XXX,XX +XXX,XX @@ uint64_t cpu_get_tsc(CPUX86State *env);
13
#define MMU_NESTED_IDX 3
14
#define MMU_PHYS_IDX 4
15
16
-static inline int cpu_mmu_index(CPUX86State *env, bool ifetch)
17
-{
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
}
46
47
+int x86_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
68
2.34.1
69
70
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/loongarch/cpu.h | 6 ++----
5
target/loongarch/cpu.c | 11 +++++++++++
6
2 files changed, 13 insertions(+), 4 deletions(-)
7
1
8
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/loongarch/cpu.h
11
+++ b/target/loongarch/cpu.h
12
@@ -XXX,XX +XXX,XX @@ struct LoongArchCPUClass {
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
}
29
30
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
31
index XXXXXXX..XXXXXXX 100644
32
--- a/target/loongarch/cpu.c
33
+++ b/target/loongarch/cpu.c
34
@@ -XXX,XX +XXX,XX @@ static bool loongarch_cpu_has_work(CPUState *cs)
35
#endif
36
}
37
38
+int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch)
39
+{
40
+ CPULoongArchState *env = cpu_env(cs);
41
+
42
+ if (FIELD_EX64(env->CSR_CRMD, CSR_CRMD, PG)) {
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
--
60
2.34.1
61
62
diff view generated by jsdifflib
Deleted patch
1
The expected form is MMU_FOO_IDX, not MMU_IDX_FOO.
2
Rename to match generic code.
3
1
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
target/loongarch/cpu.h | 8 ++++----
8
target/loongarch/cpu.c | 2 +-
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
14
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/loongarch/cpu.h
17
+++ b/target/loongarch/cpu.h
18
@@ -XXX,XX +XXX,XX @@ struct LoongArchCPUClass {
19
*/
20
#define MMU_PLV_KERNEL 0
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
}
46
- return MMU_IDX_DA;
47
+ return MMU_DA_IDX;
48
}
49
50
static void loongarch_la464_initfn(Object *obj)
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
--
93
2.34.1
94
95
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/m68k/cpu.c | 6 ++++++
5
1 file changed, 6 insertions(+)
6
1
7
diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/m68k/cpu.c
10
+++ b/target/m68k/cpu.c
11
@@ -XXX,XX +XXX,XX @@ static bool m68k_cpu_has_work(CPUState *cs)
12
return cs->interrupt_request & CPU_INTERRUPT_HARD;
13
}
14
15
+static int m68k_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
32
2.34.1
33
34
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/microblaze/cpu.h | 13 ++-----------
5
target/microblaze/cpu.c | 18 +++++++++++++++++-
6
2 files changed, 19 insertions(+), 12 deletions(-)
7
1
8
diff --git a/target/microblaze/cpu.h b/target/microblaze/cpu.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/microblaze/cpu.h
11
+++ b/target/microblaze/cpu.h
12
@@ -XXX,XX +XXX,XX @@ void mb_cpu_transaction_failed(CPUState *cs, hwaddr physaddr, vaddr addr,
13
MemTxResult response, uintptr_t retaddr);
14
#endif
15
16
+int mb_cpu_mmu_index(CPUState *cs, bool ifetch);
17
static inline int cpu_mmu_index(CPUMBState *env, bool ifetch)
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
}
32
33
#ifndef CONFIG_USER_ONLY
34
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/microblaze/cpu.c
37
+++ b/target/microblaze/cpu.c
38
@@ -XXX,XX +XXX,XX @@ static bool mb_cpu_has_work(CPUState *cs)
39
return cs->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI);
40
}
41
42
+int mb_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
71
2.34.1
72
73
diff view generated by jsdifflib
Deleted patch
1
Rather than adjust env->hflags so that the value computed
2
by cpu_mmu_index() changes, compute the mmu_idx that we
3
want directly and pass it down.
4
1
5
Introduce symbolic constants for MMU_{KERNEL,ERL}_IDX.
6
7
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
9
---
10
target/mips/cpu.h | 4 +++-
11
target/mips/tcg/sysemu/tlb_helper.c | 32 ++++++++++++-----------------
12
2 files changed, 16 insertions(+), 20 deletions(-)
13
14
diff --git a/target/mips/cpu.h b/target/mips/cpu.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/target/mips/cpu.h
17
+++ b/target/mips/cpu.h
18
@@ -XXX,XX +XXX,XX @@ uint32_t cpu_rddsp(uint32_t mask_num, CPUMIPSState *env);
19
* MMU modes definitions. We carefully match the indices with our
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
}
34
diff --git a/target/mips/tcg/sysemu/tlb_helper.c b/target/mips/tcg/sysemu/tlb_helper.c
35
index XXXXXXX..XXXXXXX 100644
36
--- a/target/mips/tcg/sysemu/tlb_helper.c
37
+++ b/target/mips/tcg/sysemu/tlb_helper.c
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
}
69
70
static bool page_table_walk_refill(CPUMIPSState *env, vaddr address,
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
--
141
2.34.1
142
143
diff view generated by jsdifflib
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
3
Rather than manually copying each register, use
4
the libc memcpy(), which is well optimized nowadays.
5
6
Suggested-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
7
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
10
Message-ID: <20241205205418.67613-1-philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
12
---
4
target/mips/cpu.h | 7 ++++++-
13
target/sparc/win_helper.c | 26 ++++++++------------------
5
target/mips/sysemu/physaddr.c | 2 +-
14
1 file changed, 8 insertions(+), 18 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
15
12
diff --git a/target/mips/cpu.h b/target/mips/cpu.h
16
diff --git a/target/sparc/win_helper.c b/target/sparc/win_helper.c
13
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
14
--- a/target/mips/cpu.h
18
--- a/target/sparc/win_helper.c
15
+++ b/target/mips/cpu.h
19
+++ b/target/sparc/win_helper.c
16
@@ -XXX,XX +XXX,XX @@ static inline int hflags_mmu_index(uint32_t hflags)
20
@@ -XXX,XX +XXX,XX @@
21
#include "exec/helper-proto.h"
22
#include "trace.h"
23
24
-static inline void memcpy32(target_ulong *dst, const target_ulong *src)
25
-{
26
- dst[0] = src[0];
27
- dst[1] = src[1];
28
- dst[2] = src[2];
29
- dst[3] = src[3];
30
- dst[4] = src[4];
31
- dst[5] = src[5];
32
- dst[6] = src[6];
33
- dst[7] = src[7];
34
-}
35
-
36
void cpu_set_cwp(CPUSPARCState *env, int new_cwp)
37
{
38
/* put the modified wrap registers at their proper location */
39
if (env->cwp == env->nwindows - 1) {
40
- memcpy32(env->regbase, env->regbase + env->nwindows * 16);
41
+ memcpy(env->regbase, env->regbase + env->nwindows * 16,
42
+ sizeof(env->gregs));
43
}
44
env->cwp = new_cwp;
45
46
/* put the wrap registers at their temporary location */
47
if (new_cwp == env->nwindows - 1) {
48
- memcpy32(env->regbase + env->nwindows * 16, env->regbase);
49
+ memcpy(env->regbase + env->nwindows * 16, env->regbase,
50
+ sizeof(env->gregs));
51
}
52
env->regwptr = env->regbase + (new_cwp * 16);
53
}
54
@@ -XXX,XX +XXX,XX @@ void cpu_gl_switch_gregs(CPUSPARCState *env, uint32_t new_gl)
55
dst = get_gl_gregset(env, env->gl);
56
57
if (src != dst) {
58
- memcpy32(dst, env->gregs);
59
- memcpy32(env->gregs, src);
60
+ memcpy(dst, env->gregs, sizeof(env->gregs));
61
+ memcpy(env->gregs, src, sizeof(env->gregs));
17
}
62
}
18
}
63
}
19
64
20
-static inline int cpu_mmu_index(CPUMIPSState *env, bool ifetch)
65
@@ -XXX,XX +XXX,XX @@ void cpu_change_pstate(CPUSPARCState *env, uint32_t new_pstate)
21
+static inline int mips_env_mmu_index(CPUMIPSState *env)
66
/* Switch global register bank */
22
{
67
src = get_gregset(env, new_pstate_regs);
23
return hflags_mmu_index(env->hflags);
68
dst = get_gregset(env, pstate_regs);
24
}
69
- memcpy32(dst, env->gregs);
25
70
- memcpy32(env->gregs, src);
26
+static inline int cpu_mmu_index(CPUMIPSState *env, bool ifetch)
71
+ memcpy(dst, env->gregs, sizeof(env->gregs));
27
+{
72
+ memcpy(env->gregs, src, sizeof(env->gregs));
28
+ return mips_env_mmu_index(env);
73
} else {
29
+}
74
trace_win_helper_no_switch_pstate(new_pstate_regs);
30
+
31
#include "exec/cpu-all.h"
32
33
/* Exceptions */
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
}
75
}
135
--
76
--
136
2.34.1
77
2.43.0
137
78
138
79
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/mips/cpu.c | 6 ++++++
5
1 file changed, 6 insertions(+)
6
1
7
diff --git a/target/mips/cpu.c b/target/mips/cpu.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/mips/cpu.c
10
+++ b/target/mips/cpu.c
11
@@ -XXX,XX +XXX,XX @@ static bool mips_cpu_has_work(CPUState *cs)
12
return has_work;
13
}
14
15
+static int mips_cpu_mmu_index(CPUState *cs, bool ifunc)
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
--
32
2.34.1
33
34
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/nios2/cpu.h | 12 ++++++------
5
target/nios2/cpu.c | 7 +++++++
6
2 files changed, 13 insertions(+), 6 deletions(-)
7
1
8
diff --git a/target/nios2/cpu.h b/target/nios2/cpu.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/nios2/cpu.h
11
+++ b/target/nios2/cpu.h
12
@@ -XXX,XX +XXX,XX @@ void do_nios2_semihosting(CPUNios2State *env);
13
#define MMU_SUPERVISOR_IDX 0
14
#define MMU_USER_IDX 1
15
16
-static inline int cpu_mmu_index(CPUNios2State *env, bool ifetch)
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
+
35
static inline void cpu_get_tb_cpu_state(CPUNios2State *env, vaddr *pc,
36
uint64_t *cs_base, uint32_t *flags)
37
{
38
diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/target/nios2/cpu.c
41
+++ b/target/nios2/cpu.c
42
@@ -XXX,XX +XXX,XX @@ static bool nios2_cpu_has_work(CPUState *cs)
43
return cs->interrupt_request & CPU_INTERRUPT_HARD;
44
}
45
46
+int nios2_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
64
2.34.1
65
66
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/openrisc/cpu.h | 10 ++--------
5
target/openrisc/cpu.c | 13 +++++++++++++
6
2 files changed, 15 insertions(+), 8 deletions(-)
7
1
8
diff --git a/target/openrisc/cpu.h b/target/openrisc/cpu.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/openrisc/cpu.h
11
+++ b/target/openrisc/cpu.h
12
@@ -XXX,XX +XXX,XX @@ static inline void cpu_get_tb_cpu_state(CPUOpenRISCState *env, vaddr *pc,
13
| (env->sr & (SR_SM | SR_DME | SR_IME | SR_OVE));
14
}
15
16
+int openrisc_cpu_mmu_index(CPUState *cs, bool ifetch);
17
static inline int cpu_mmu_index(CPUOpenRISCState *env, bool ifetch)
18
{
19
- int ret = MMU_NOMMU_IDX; /* mmu is disabled */
20
-
21
- if (env->sr & (ifetch ? SR_IME : SR_DME)) {
22
- /* The mmu is enabled; test supervisor state. */
23
- ret = env->sr & SR_SM ? MMU_SUPERVISOR_IDX : MMU_USER_IDX;
24
- }
25
-
26
- return ret;
27
+ return openrisc_cpu_mmu_index(env_cpu(env), ifetch);
28
}
29
30
static inline uint32_t cpu_get_sr(const CPUOpenRISCState *env)
31
diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/target/openrisc/cpu.c
34
+++ b/target/openrisc/cpu.c
35
@@ -XXX,XX +XXX,XX @@ static bool openrisc_cpu_has_work(CPUState *cs)
36
CPU_INTERRUPT_TIMER);
37
}
38
39
+int openrisc_cpu_mmu_index(CPUState *cs, bool ifetch)
40
+{
41
+ CPUOpenRISCState *env = cpu_env(cs);
42
+
43
+ if (env->sr & (ifetch ? SR_IME : SR_DME)) {
44
+ /* The mmu is enabled; test supervisor state. */
45
+ return env->sr & SR_SM ? MMU_SUPERVISOR_IDX : MMU_USER_IDX;
46
+ }
47
+
48
+ return MMU_NOMMU_IDX; /* mmu is disabled */
49
+}
50
+
51
static void openrisc_disas_set_info(CPUState *cpu, disassemble_info *info)
52
{
53
info->print_insn = print_insn_or1k;
54
@@ -XXX,XX +XXX,XX @@ static void openrisc_cpu_class_init(ObjectClass *oc, void *data)
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
--
63
2.34.1
64
65
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/ppc/cpu.h | 7 ++++++-
5
target/ppc/cpu_init.c | 2 +-
6
target/ppc/mem_helper.c | 10 +++++-----
7
target/ppc/mmu_common.c | 4 ++--
8
4 files changed, 14 insertions(+), 9 deletions(-)
9
1
10
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
11
index XXXXXXX..XXXXXXX 100644
12
--- a/target/ppc/cpu.h
13
+++ b/target/ppc/cpu.h
14
@@ -XXX,XX +XXX,XX @@ int ppc_dcr_write(ppc_dcr_t *dcr_env, int dcrn, uint32_t val);
15
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
}
26
27
+static inline int cpu_mmu_index(CPUPPCState *env, bool ifetch)
28
+{
29
+ return ppc_env_mmu_index(env, ifetch);
30
+}
31
+
32
/* Compatibility modes */
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
{
55
uintptr_t raddr = GETPC();
56
- int mmu_idx = cpu_mmu_index(env, false);
57
+ int mmu_idx = ppc_env_mmu_index(env, false);
58
void *host = probe_contiguous(env, addr, (32 - reg) * 4,
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
{
64
uintptr_t raddr = GETPC();
65
- int mmu_idx = cpu_mmu_index(env, false);
66
+ int mmu_idx = ppc_env_mmu_index(env, false);
67
void *host = probe_contiguous(env, addr, (32 - reg) * 4,
68
MMU_DATA_STORE, mmu_idx, raddr);
69
70
@@ -XXX,XX +XXX,XX @@ static void do_lsw(CPUPPCState *env, target_ulong addr, uint32_t nb,
71
return;
72
}
73
74
- mmu_idx = cpu_mmu_index(env, false);
75
+ mmu_idx = ppc_env_mmu_index(env, false);
76
host = probe_contiguous(env, addr, nb, MMU_DATA_LOAD, mmu_idx, raddr);
77
78
if (likely(host)) {
79
@@ -XXX,XX +XXX,XX @@ void helper_stsw(CPUPPCState *env, target_ulong addr, uint32_t nb,
80
return;
81
}
82
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
--
114
2.34.1
115
116
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/ppc/cpu_init.c | 6 ++++++
5
1 file changed, 6 insertions(+)
6
1
7
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/ppc/cpu_init.c
10
+++ b/target/ppc/cpu_init.c
11
@@ -XXX,XX +XXX,XX @@ static bool ppc_cpu_has_work(CPUState *cs)
12
return cs->interrupt_request & CPU_INTERRUPT_HARD;
13
}
14
15
+static int ppc_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
32
2.34.1
33
34
diff view generated by jsdifflib
Deleted patch
1
Free up the riscv_cpu_mmu_index name for other usage;
2
emphasize that the argument is 'env'.
3
1
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
8
target/riscv/cpu.h | 4 ++--
9
target/riscv/cpu_helper.c | 2 +-
10
2 files changed, 3 insertions(+), 3 deletions(-)
11
12
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/riscv/cpu.h
15
+++ b/target/riscv/cpu.h
16
@@ -XXX,XX +XXX,XX @@ target_ulong riscv_cpu_get_geilen(CPURISCVState *env);
17
void riscv_cpu_set_geilen(CPURISCVState *env, target_ulong geilen);
18
bool riscv_cpu_vector_enabled(CPURISCVState *env);
19
void riscv_cpu_set_virt_enabled(CPURISCVState *env, bool enable);
20
-int riscv_cpu_mmu_index(CPURISCVState *env, bool ifetch);
21
+int riscv_env_mmu_index(CPURISCVState *env, bool ifetch);
22
G_NORETURN void riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
23
MMUAccessType access_type,
24
int mmu_idx, uintptr_t retaddr);
25
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
26
bool probe, uintptr_t retaddr);
27
char *riscv_isa_string(RISCVCPU *cpu);
28
29
-#define cpu_mmu_index riscv_cpu_mmu_index
30
+#define cpu_mmu_index riscv_env_mmu_index
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
{
45
#ifdef CONFIG_USER_ONLY
46
return 0;
47
--
48
2.34.1
49
50
diff view generated by jsdifflib
Deleted patch
1
Use the target-specific function name in preference
2
to the generic name.
3
1
4
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
5
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
---
8
target/riscv/cpu_helper.c | 4 ++--
9
target/riscv/op_helper.c | 4 ++--
10
target/riscv/vector_helper.c | 9 +++++----
11
3 files changed, 9 insertions(+), 8 deletions(-)
12
13
diff --git a/target/riscv/cpu_helper.c b/target/riscv/cpu_helper.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/riscv/cpu_helper.c
16
+++ b/target/riscv/cpu_helper.c
17
@@ -XXX,XX +XXX,XX @@ void cpu_get_tb_cpu_state(CPURISCVState *env, vaddr *pc,
18
#else
19
flags = FIELD_DP32(flags, TB_FLAGS, PRIV, env->priv);
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
}
77
}
78
79
@@ -XXX,XX +XXX,XX @@ vext_ldff(void *vd, void *v0, target_ulong base,
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
--
98
2.34.1
99
100
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
2
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
4
---
5
target/riscv/cpu.c | 6 ++++++
6
1 file changed, 6 insertions(+)
7
1
8
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/riscv/cpu.c
11
+++ b/target/riscv/cpu.c
12
@@ -XXX,XX +XXX,XX @@ static bool riscv_cpu_has_work(CPUState *cs)
13
#endif
14
}
15
16
+static int riscv_cpu_mmu_index(CPUState *cs, bool ifetch)
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
2.34.1
34
35
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/rx/cpu.c | 6 ++++++
5
1 file changed, 6 insertions(+)
6
1
7
diff --git a/target/rx/cpu.c b/target/rx/cpu.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/rx/cpu.c
10
+++ b/target/rx/cpu.c
11
@@ -XXX,XX +XXX,XX @@ static bool rx_cpu_has_work(CPUState *cs)
12
(CPU_INTERRUPT_HARD | CPU_INTERRUPT_FIR);
13
}
14
15
+static int riscv_cpu_mmu_index(CPUState *cs, bool ifunc)
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
--
32
2.34.1
33
34
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/s390x/cpu.h | 4 +++-
5
target/s390x/tcg/mem_helper.c | 34 ++++++++++++++++++----------------
6
2 files changed, 21 insertions(+), 17 deletions(-)
7
1
8
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/s390x/cpu.h
11
+++ b/target/s390x/cpu.h
12
@@ -XXX,XX +XXX,XX @@ extern const VMStateDescription vmstate_s390_cpu;
13
#define MMU_HOME_IDX 2
14
#define MMU_REAL_IDX 3
15
16
-static inline int cpu_mmu_index(CPUS390XState *env, bool ifetch)
17
+static inline int s390x_env_mmu_index(CPUS390XState *env, bool ifetch)
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
}
122
123
while (mask) {
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
--
186
2.34.1
187
188
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/s390x/cpu.c | 6 ++++++
5
1 file changed, 6 insertions(+)
6
1
7
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/s390x/cpu.c
10
+++ b/target/s390x/cpu.c
11
@@ -XXX,XX +XXX,XX @@ static bool s390_cpu_has_work(CPUState *cs)
12
return s390_cpu_has_int(cpu);
13
}
14
15
+static int s390x_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
32
2.34.1
33
34
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/sh4/cpu.h | 16 ++++++----------
5
target/sh4/cpu.c | 16 ++++++++++++++++
6
2 files changed, 22 insertions(+), 10 deletions(-)
7
1
8
diff --git a/target/sh4/cpu.h b/target/sh4/cpu.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/sh4/cpu.h
11
+++ b/target/sh4/cpu.h
12
@@ -XXX,XX +XXX,XX @@ void cpu_load_tlb(CPUSH4State * env);
13
14
/* MMU modes definitions */
15
#define MMU_USER_IDX 1
16
-static inline int cpu_mmu_index (CPUSH4State *env, bool ifetch)
17
-{
18
- /* The instruction in a RTE delay slot is fetched in privileged
19
- mode, but executed in user mode. */
20
- if (ifetch && (env->flags & TB_FLAG_DELAY_SLOT_RTE)) {
21
- return 0;
22
- } else {
23
- return (env->sr & (1u << SR_MD)) == 0 ? 1 : 0;
24
- }
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
}
32
33
+int sh4_cpu_mmu_index(CPUState *cs, bool ifetch);
34
+static inline int cpu_mmu_index(CPUSH4State *env, bool ifetch)
35
+{
36
+ return sh4_cpu_mmu_index(env_cpu(env), ifetch);
37
+}
38
+
39
static inline void cpu_get_tb_cpu_state(CPUSH4State *env, vaddr *pc,
40
uint64_t *cs_base, uint32_t *flags)
41
{
42
diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/target/sh4/cpu.c
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
}
49
50
+int sh4_cpu_mmu_index(CPUState *cs, bool ifetch)
51
+{
52
+ CPUSH4State *env = cpu_env(cs);
53
+
54
+ /*
55
+ * The instruction in a RTE delay slot is fetched in privileged mode,
56
+ * but executed in user mode.
57
+ */
58
+ if (ifetch && (env->flags & TB_FLAG_DELAY_SLOT_RTE)) {
59
+ return 0;
60
+ } else {
61
+ return (env->sr & (1u << SR_MD)) == 0 ? 1 : 0;
62
+ }
63
+}
64
+
65
static void superh_cpu_reset_hold(Object *obj)
66
{
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
--
77
2.34.1
78
79
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/sparc/cpu.h | 34 ++++++----------------------------
5
target/sparc/cpu.c | 29 +++++++++++++++++++++++++++++
6
2 files changed, 35 insertions(+), 28 deletions(-)
7
1
8
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
9
index XXXXXXX..XXXXXXX 100644
10
--- a/target/sparc/cpu.h
11
+++ b/target/sparc/cpu.h
12
@@ -XXX,XX +XXX,XX @@ static inline int cpu_supervisor_mode(CPUSPARCState *env1)
13
}
14
#endif
15
16
-static inline int cpu_mmu_index(CPUSPARCState *env, bool ifetch)
17
-{
18
-#if defined(CONFIG_USER_ONLY)
19
- return MMU_USER_IDX;
20
-#elif !defined(TARGET_SPARC64)
21
- if ((env->mmuregs[0] & MMU_E) == 0) { /* MMU disabled */
22
- return MMU_PHYS_IDX;
23
- } else {
24
- return env->psrs;
25
- }
26
-#else
27
- /* IMMU or DMMU disabled. */
28
- if (ifetch
29
- ? (env->lsu & IMMU_E) == 0 || (env->pstate & PS_RED) != 0
30
- : (env->lsu & DMMU_E) == 0) {
31
- return MMU_PHYS_IDX;
32
- } else if (cpu_hypervisor_mode(env)) {
33
- return MMU_PHYS_IDX;
34
- } else if (env->tl > 0) {
35
- return MMU_NUCLEUS_IDX;
36
- } else if (cpu_supervisor_mode(env)) {
37
- return MMU_KERNEL_IDX;
38
- } else {
39
- return MMU_USER_IDX;
40
- }
41
-#endif
42
-}
43
-
44
static inline int cpu_interrupts_enabled(CPUSPARCState *env1)
45
{
46
#if !defined (TARGET_SPARC64)
47
@@ -XXX,XX +XXX,XX @@ trap_state* cpu_tsptr(CPUSPARCState* env);
48
#define TB_FLAG_HYPER (1 << 7)
49
#define TB_FLAG_ASI_SHIFT 24
50
51
+int sparc_cpu_mmu_index(CPUState *cs, bool ifetch);
52
+static inline int cpu_mmu_index(CPUSPARCState *env, bool ifetch)
53
+{
54
+ return sparc_cpu_mmu_index(env_cpu(env), ifetch);
55
+}
56
+
57
static inline void cpu_get_tb_cpu_state(CPUSPARCState *env, vaddr *pc,
58
uint64_t *cs_base, uint32_t *pflags)
59
{
60
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/target/sparc/cpu.c
63
+++ b/target/sparc/cpu.c
64
@@ -XXX,XX +XXX,XX @@ static bool sparc_cpu_has_work(CPUState *cs)
65
cpu_interrupts_enabled(env);
66
}
67
68
+int sparc_cpu_mmu_index(CPUState *cs, bool ifetch)
69
+{
70
+ CPUSPARCState *env = cpu_env(cs);
71
+
72
+#ifndef TARGET_SPARC64
73
+ if ((env->mmuregs[0] & MMU_E) == 0) { /* MMU disabled */
74
+ return MMU_PHYS_IDX;
75
+ } else {
76
+ return env->psrs;
77
+ }
78
+#else
79
+ /* IMMU or DMMU disabled. */
80
+ if (ifetch
81
+ ? (env->lsu & IMMU_E) == 0 || (env->pstate & PS_RED) != 0
82
+ : (env->lsu & DMMU_E) == 0) {
83
+ return MMU_PHYS_IDX;
84
+ } else if (cpu_hypervisor_mode(env)) {
85
+ return MMU_PHYS_IDX;
86
+ } else if (env->tl > 0) {
87
+ return MMU_NUCLEUS_IDX;
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
--
108
2.34.1
109
110
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/tricore/cpu.c | 6 ++++++
5
1 file changed, 6 insertions(+)
6
1
7
diff --git a/target/tricore/cpu.c b/target/tricore/cpu.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/tricore/cpu.c
10
+++ b/target/tricore/cpu.c
11
@@ -XXX,XX +XXX,XX @@ static bool tricore_cpu_has_work(CPUState *cs)
12
return true;
13
}
14
15
+static int tricore_cpu_mmu_index(CPUState *cs, bool ifetch)
16
+{
17
+ return 0;
18
+}
19
+
20
static void tricore_cpu_realizefn(DeviceState *dev, Error **errp)
21
{
22
CPUState *cs = CPU(dev);
23
@@ -XXX,XX +XXX,XX @@ static void tricore_cpu_class_init(ObjectClass *c, void *data)
24
&mcc->parent_phases);
25
cc->class_by_name = tricore_cpu_class_by_name;
26
cc->has_work = tricore_cpu_has_work;
27
+ cc->mmu_index = tricore_cpu_mmu_index;
28
29
cc->gdb_read_register = tricore_cpu_gdb_read_register;
30
cc->gdb_write_register = tricore_cpu_gdb_write_register;
31
--
32
2.34.1
33
34
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
target/xtensa/cpu.c | 6 ++++++
5
1 file changed, 6 insertions(+)
6
1
7
diff --git a/target/xtensa/cpu.c b/target/xtensa/cpu.c
8
index XXXXXXX..XXXXXXX 100644
9
--- a/target/xtensa/cpu.c
10
+++ b/target/xtensa/cpu.c
11
@@ -XXX,XX +XXX,XX @@ static bool xtensa_cpu_has_work(CPUState *cs)
12
#endif
13
}
14
15
+static int xtensa_cpu_mmu_index(CPUState *cs, bool ifetch)
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
--
32
2.34.1
33
34
diff view generated by jsdifflib
Deleted patch
1
For user-only mode, use MMU_USER_IDX.
2
For system mode, use CPUClass.mmu_index.
3
1
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
6
---
7
include/exec/cpu-all.h | 4 ++++
8
include/exec/cpu-common.h | 22 ++++++++++++++++++++++
9
target/alpha/cpu.h | 5 -----
10
target/arm/cpu.h | 13 -------------
11
target/avr/cpu.h | 5 -----
12
target/cris/cpu.h | 4 ----
13
target/hexagon/cpu.h | 9 ---------
14
target/hppa/cpu.h | 10 ----------
15
target/i386/cpu.h | 6 ------
16
target/loongarch/cpu.h | 10 ----------
17
target/m68k/cpu.h | 4 ----
18
target/microblaze/cpu.h | 6 ------
19
target/mips/cpu.h | 5 -----
20
target/nios2/cpu.h | 6 ------
21
target/openrisc/cpu.h | 6 ------
22
target/ppc/cpu.h | 5 -----
23
target/riscv/cpu.h | 2 --
24
target/rx/cpu.h | 5 -----
25
target/s390x/cpu.h | 2 --
26
target/sh4/cpu.h | 6 ------
27
target/sparc/cpu.h | 6 ------
28
target/tricore/cpu.h | 5 -----
29
target/xtensa/cpu.h | 5 -----
30
target/hppa/cpu.c | 2 +-
31
target/i386/cpu.c | 2 +-
32
target/loongarch/cpu.c | 2 +-
33
target/microblaze/cpu.c | 2 +-
34
target/nios2/cpu.c | 2 +-
35
target/openrisc/cpu.c | 2 +-
36
target/sh4/cpu.c | 2 +-
37
target/sparc/cpu.c | 2 +-
38
31 files changed, 34 insertions(+), 133 deletions(-)
39
40
diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h
41
index XXXXXXX..XXXXXXX 100644
42
--- a/include/exec/cpu-all.h
43
+++ b/include/exec/cpu-all.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 @@
60
#include "exec/hwaddr.h"
61
#endif
62
#include "hw/core/cpu.h"
63
+#include "tcg/debug-assert.h"
64
65
#define EXCP_INTERRUPT 0x10000 /* async interruption */
66
#define EXCP_HLT 0x10001 /* hlt instruction reached */
67
@@ -XXX,XX +XXX,XX @@ static inline CPUState *env_cpu(CPUArchState *env)
68
return (void *)env - sizeof(CPUState);
69
}
70
71
+#ifndef CONFIG_USER_ONLY
72
+/**
73
+ * cpu_mmu_index:
74
+ * @env: The cpu environment
75
+ * @ifetch: True for code access, false for data access.
76
+ *
77
+ * Return the core mmu index for the current translation regime.
78
+ * This function is used by generic TCG code paths.
79
+ *
80
+ * The user-only version of this function is inline in cpu-all.h,
81
+ * where it always returns MMU_USER_IDX.
82
+ */
83
+static inline int cpu_mmu_index(CPUArchState *env, bool ifetch)
84
+{
85
+ CPUState *cs = env_cpu(env);
86
+ int ret = cs->cc->mmu_index(cs, ifetch);
87
+ tcg_debug_assert(ret >= 0 && ret < NB_MMU_MODES);
88
+ return ret;
89
+}
90
+#endif /* !CONFIG_USER_ONLY */
91
+
92
#endif /* CPU_COMMON_H */
93
diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h
94
index XXXXXXX..XXXXXXX 100644
95
--- a/target/alpha/cpu.h
96
+++ b/target/alpha/cpu.h
97
@@ -XXX,XX +XXX,XX @@ static inline int alpha_env_mmu_index(CPUAlphaState *env)
98
return ret;
99
}
100
101
-static inline int cpu_mmu_index(CPUAlphaState *env, bool ifetch)
102
-{
103
- return alpha_env_mmu_index(env);
104
-}
105
-
106
enum {
107
IR_V0 = 0,
108
IR_T0 = 1,
109
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
110
index XXXXXXX..XXXXXXX 100644
111
--- a/target/arm/cpu.h
112
+++ b/target/arm/cpu.h
113
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAG_A64, NV2_MEM_BE, 36, 1)
114
#define EX_TBFLAG_M32(IN, WHICH) FIELD_EX32(IN.flags2, TBFLAG_M32, WHICH)
115
#define EX_TBFLAG_AM32(IN, WHICH) FIELD_EX32(IN.flags2, TBFLAG_AM32, WHICH)
116
117
-/**
118
- * cpu_mmu_index:
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
134
index XXXXXXX..XXXXXXX 100644
135
--- a/target/avr/cpu.h
136
+++ b/target/avr/cpu.h
137
@@ -XXX,XX +XXX,XX @@ static inline void set_avr_feature(CPUAVRState *env, int feature)
138
env->features |= (1U << feature);
139
}
140
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);
147
148
int cpu_avr_exec(CPUState *cpu);
149
diff --git a/target/cris/cpu.h b/target/cris/cpu.h
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
165
index XXXXXXX..XXXXXXX 100644
166
--- a/target/hexagon/cpu.h
167
+++ b/target/hexagon/cpu.h
168
@@ -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;
182
183
void hexagon_translate_init(void);
184
diff --git a/target/hppa/cpu.h b/target/hppa/cpu.h
185
index XXXXXXX..XXXXXXX 100644
186
--- a/target/hppa/cpu.h
187
+++ b/target/hppa/cpu.h
188
@@ -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
}
191
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);
203
204
#define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
205
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
206
index XXXXXXX..XXXXXXX 100644
207
--- a/target/i386/cpu.h
208
+++ b/target/i386/cpu.h
209
@@ -XXX,XX +XXX,XX @@ static inline int cpu_mmu_index_kernel(CPUX86State *env)
210
#include "hw/i386/apic.h"
211
#endif
212
213
-int x86_cpu_mmu_index(CPUState *cs, bool ifetch);
214
-static inline int cpu_mmu_index(CPUX86State *env, bool ifetch)
215
-{
216
- return x86_cpu_mmu_index(env_cpu(env), ifetch);
217
-}
218
-
219
static inline void cpu_get_tb_cpu_state(CPUX86State *env, vaddr *pc,
220
uint64_t *cs_base, uint32_t *flags)
221
{
222
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
223
index XXXXXXX..XXXXXXX 100644
224
--- a/target/loongarch/cpu.h
225
+++ b/target/loongarch/cpu.h
226
@@ -XXX,XX +XXX,XX @@ struct LoongArchCPUClass {
227
#define MMU_USER_IDX MMU_PLV_USER
228
#define MMU_DA_IDX 4
229
230
-int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch);
231
-static inline int cpu_mmu_index(CPULoongArchState *env, bool ifetch)
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
244
index XXXXXXX..XXXXXXX 100644
245
--- a/target/m68k/cpu.h
246
+++ b/target/m68k/cpu.h
247
@@ -XXX,XX +XXX,XX @@ enum {
248
/* MMU modes definitions */
249
#define MMU_KERNEL_IDX 0
250
#define MMU_USER_IDX 1
251
-static inline int cpu_mmu_index (CPUM68KState *env, bool ifetch)
252
-{
253
- return (env->sr & SR_S) == 0 ? 1 : 0;
254
-}
255
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
259
index XXXXXXX..XXXXXXX 100644
260
--- a/target/microblaze/cpu.h
261
+++ b/target/microblaze/cpu.h
262
@@ -XXX,XX +XXX,XX @@ void mb_cpu_transaction_failed(CPUState *cs, hwaddr physaddr, vaddr addr,
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
}
282
283
-static inline int cpu_mmu_index(CPUMIPSState *env, bool ifetch)
284
-{
285
- return mips_env_mmu_index(env);
286
-}
287
-
288
#include "exec/cpu-all.h"
289
290
/* Exceptions */
291
diff --git a/target/nios2/cpu.h b/target/nios2/cpu.h
292
index XXXXXXX..XXXXXXX 100644
293
--- a/target/nios2/cpu.h
294
+++ b/target/nios2/cpu.h
295
@@ -XXX,XX +XXX,XX @@ FIELD(TBFLAGS, CRS0, 0, 1) /* Set if CRS == 0. */
296
FIELD(TBFLAGS, U, 1, 1) /* Overlaps CR_STATUS_U */
297
FIELD(TBFLAGS, R0_0, 2, 1) /* Set if R0 == 0. */
298
299
-int nios2_cpu_mmu_index(CPUState *cs, bool ifetch);
300
-static inline int cpu_mmu_index(CPUNios2State *env, bool ifetch)
301
-{
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
309
index XXXXXXX..XXXXXXX 100644
310
--- a/target/openrisc/cpu.h
311
+++ b/target/openrisc/cpu.h
312
@@ -XXX,XX +XXX,XX @@ static inline void cpu_get_tb_cpu_state(CPUOpenRISCState *env, vaddr *pc,
313
| (env->sr & (SR_SM | SR_DME | SR_IME | SR_OVE));
314
}
315
316
-int openrisc_cpu_mmu_index(CPUState *cs, bool ifetch);
317
-static inline int cpu_mmu_index(CPUOpenRISCState *env, bool ifetch)
318
-{
319
- return openrisc_cpu_mmu_index(env_cpu(env), ifetch);
320
-}
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
326
index XXXXXXX..XXXXXXX 100644
327
--- a/target/ppc/cpu.h
328
+++ b/target/ppc/cpu.h
329
@@ -XXX,XX +XXX,XX @@ static inline int ppc_env_mmu_index(CPUPPCState *env, bool ifetch)
330
#endif
331
}
332
333
-static inline int cpu_mmu_index(CPUPPCState *env, bool ifetch)
334
-{
335
- return ppc_env_mmu_index(env, ifetch);
336
-}
337
-
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
342
index XXXXXXX..XXXXXXX 100644
343
--- a/target/riscv/cpu.h
344
+++ b/target/riscv/cpu.h
345
@@ -XXX,XX +XXX,XX @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
346
bool probe, uintptr_t retaddr);
347
char *riscv_isa_string(RISCVCPU *cpu);
348
349
-#define cpu_mmu_index riscv_env_mmu_index
350
-
351
#ifndef CONFIG_USER_ONLY
352
void riscv_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
353
vaddr addr, unsigned size,
354
diff --git a/target/rx/cpu.h b/target/rx/cpu.h
355
index XXXXXXX..XXXXXXX 100644
356
--- a/target/rx/cpu.h
357
+++ b/target/rx/cpu.h
358
@@ -XXX,XX +XXX,XX @@ static inline void cpu_get_tb_cpu_state(CPURXState *env, vaddr *pc,
359
*flags = FIELD_DP32(*flags, PSW, U, env->psw_u);
360
}
361
362
-static inline int cpu_mmu_index(CPURXState *env, bool ifetch)
363
-{
364
- return 0;
365
-}
366
-
367
static inline uint32_t rx_cpu_pack_psw(CPURXState *env)
368
{
369
uint32_t psw = 0;
370
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
371
index XXXXXXX..XXXXXXX 100644
372
--- a/target/s390x/cpu.h
373
+++ b/target/s390x/cpu.h
374
@@ -XXX,XX +XXX,XX @@ static inline int s390x_env_mmu_index(CPUS390XState *env, bool ifetch)
375
#endif
376
}
377
378
-#define cpu_mmu_index s390x_env_mmu_index
379
-
380
#ifdef CONFIG_TCG
381
382
#include "tcg/tcg_s390x.h"
383
diff --git a/target/sh4/cpu.h b/target/sh4/cpu.h
384
index XXXXXXX..XXXXXXX 100644
385
--- a/target/sh4/cpu.h
386
+++ b/target/sh4/cpu.h
387
@@ -XXX,XX +XXX,XX @@ static inline void cpu_write_sr(CPUSH4State *env, target_ulong sr)
388
env->sr = sr & ~((1u << SR_M) | (1u << SR_Q) | (1u << SR_T));
389
}
390
391
-int sh4_cpu_mmu_index(CPUState *cs, bool ifetch);
392
-static inline int cpu_mmu_index(CPUSH4State *env, bool ifetch)
393
-{
394
- return sh4_cpu_mmu_index(env_cpu(env), ifetch);
395
-}
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
401
index XXXXXXX..XXXXXXX 100644
402
--- a/target/sparc/cpu.h
403
+++ b/target/sparc/cpu.h
404
@@ -XXX,XX +XXX,XX @@ trap_state* cpu_tsptr(CPUSPARCState* env);
405
#define TB_FLAG_HYPER (1 << 7)
406
#define TB_FLAG_ASI_SHIFT 24
407
408
-int sparc_cpu_mmu_index(CPUState *cs, bool ifetch);
409
-static inline int cpu_mmu_index(CPUSPARCState *env, bool ifetch)
410
-{
411
- return sparc_cpu_mmu_index(env_cpu(env), ifetch);
412
-}
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
418
index XXXXXXX..XXXXXXX 100644
419
--- a/target/tricore/cpu.h
420
+++ b/target/tricore/cpu.h
421
@@ -XXX,XX +XXX,XX @@ void fpu_set_state(CPUTriCoreState *env);
422
423
#define MMU_USER_IDX 2
424
425
-static inline int cpu_mmu_index(CPUTriCoreState *env, bool ifetch)
426
-{
427
- return 0;
428
-}
429
-
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
434
index XXXXXXX..XXXXXXX 100644
435
--- a/target/xtensa/cpu.h
436
+++ b/target/xtensa/cpu.h
437
@@ -XXX,XX +XXX,XX @@ static inline uint32_t xtensa_replicate_windowstart(CPUXtensaState *env)
438
/* MMU modes definitions */
439
#define MMU_USER_IDX 3
440
441
-static inline int cpu_mmu_index(CPUXtensaState *env, bool ifetch)
442
-{
443
- return xtensa_get_cring(env);
444
-}
445
-
446
#define XTENSA_TBFLAG_RING_MASK 0x3
447
#define XTENSA_TBFLAG_EXCM 0x4
448
#define XTENSA_TBFLAG_LITBASE 0x8
449
diff --git a/target/hppa/cpu.c b/target/hppa/cpu.c
450
index XXXXXXX..XXXXXXX 100644
451
--- a/target/hppa/cpu.c
452
+++ b/target/hppa/cpu.c
453
@@ -XXX,XX +XXX,XX @@ static bool hppa_cpu_has_work(CPUState *cs)
454
return cs->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI);
455
}
456
457
-int hppa_cpu_mmu_index(CPUState *cs, bool ifetch)
458
+static int hppa_cpu_mmu_index(CPUState *cs, bool ifetch)
459
{
460
CPUHPPAState *env = cpu_env(cs);
461
462
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
463
index XXXXXXX..XXXXXXX 100644
464
--- a/target/i386/cpu.c
465
+++ b/target/i386/cpu.c
466
@@ -XXX,XX +XXX,XX @@ static bool x86_cpu_has_work(CPUState *cs)
467
return x86_cpu_pending_interrupt(cs, cs->interrupt_request) != 0;
468
}
469
470
-int x86_cpu_mmu_index(CPUState *cs, bool ifetch)
471
+static int x86_cpu_mmu_index(CPUState *cs, bool ifetch)
472
{
473
CPUX86State *env = cpu_env(cs);
474
475
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
476
index XXXXXXX..XXXXXXX 100644
477
--- a/target/loongarch/cpu.c
478
+++ b/target/loongarch/cpu.c
479
@@ -XXX,XX +XXX,XX @@ static bool loongarch_cpu_has_work(CPUState *cs)
480
#endif
481
}
482
483
-int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch)
484
+static int loongarch_cpu_mmu_index(CPUState *cs, bool ifetch)
485
{
486
CPULoongArchState *env = cpu_env(cs);
487
488
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
489
index XXXXXXX..XXXXXXX 100644
490
--- a/target/microblaze/cpu.c
491
+++ b/target/microblaze/cpu.c
492
@@ -XXX,XX +XXX,XX @@ static bool mb_cpu_has_work(CPUState *cs)
493
return cs->interrupt_request & (CPU_INTERRUPT_HARD | CPU_INTERRUPT_NMI);
494
}
495
496
-int mb_cpu_mmu_index(CPUState *cs, bool ifetch)
497
+static int mb_cpu_mmu_index(CPUState *cs, bool ifetch)
498
{
499
CPUMBState *env = cpu_env(cs);
500
MicroBlazeCPU *cpu = env_archcpu(env);
501
diff --git a/target/nios2/cpu.c b/target/nios2/cpu.c
502
index XXXXXXX..XXXXXXX 100644
503
--- a/target/nios2/cpu.c
504
+++ b/target/nios2/cpu.c
505
@@ -XXX,XX +XXX,XX @@ static bool nios2_cpu_has_work(CPUState *cs)
506
return cs->interrupt_request & CPU_INTERRUPT_HARD;
507
}
508
509
-int nios2_cpu_mmu_index(CPUState *cs, bool ifetch)
510
+static int nios2_cpu_mmu_index(CPUState *cs, bool ifetch)
511
{
512
return (cpu_env(cs)->ctrl[CR_STATUS] & CR_STATUS_U
513
? MMU_USER_IDX : MMU_SUPERVISOR_IDX);
514
diff --git a/target/openrisc/cpu.c b/target/openrisc/cpu.c
515
index XXXXXXX..XXXXXXX 100644
516
--- a/target/openrisc/cpu.c
517
+++ b/target/openrisc/cpu.c
518
@@ -XXX,XX +XXX,XX @@ static bool openrisc_cpu_has_work(CPUState *cs)
519
CPU_INTERRUPT_TIMER);
520
}
521
522
-int openrisc_cpu_mmu_index(CPUState *cs, bool ifetch)
523
+static int openrisc_cpu_mmu_index(CPUState *cs, bool ifetch)
524
{
525
CPUOpenRISCState *env = cpu_env(cs);
526
527
diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c
528
index XXXXXXX..XXXXXXX 100644
529
--- a/target/sh4/cpu.c
530
+++ b/target/sh4/cpu.c
531
@@ -XXX,XX +XXX,XX @@ static bool superh_cpu_has_work(CPUState *cs)
532
return cs->interrupt_request & CPU_INTERRUPT_HARD;
533
}
534
535
-int sh4_cpu_mmu_index(CPUState *cs, bool ifetch)
536
+static int sh4_cpu_mmu_index(CPUState *cs, bool ifetch)
537
{
538
CPUSH4State *env = cpu_env(cs);
539
540
diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
541
index XXXXXXX..XXXXXXX 100644
542
--- a/target/sparc/cpu.c
543
+++ b/target/sparc/cpu.c
544
@@ -XXX,XX +XXX,XX @@ static bool sparc_cpu_has_work(CPUState *cs)
545
cpu_interrupts_enabled(env);
546
}
547
548
-int sparc_cpu_mmu_index(CPUState *cs, bool ifetch)
549
+static int sparc_cpu_mmu_index(CPUState *cs, bool ifetch)
550
{
551
CPUSPARCState *env = cpu_env(cs);
552
553
--
554
2.34.1
555
556
diff view generated by jsdifflib
Deleted patch
1
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
3
---
4
include/exec/cpu-all.h | 2 +-
5
include/exec/cpu-common.h | 3 +--
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
1
28
diff --git a/include/exec/cpu-all.h b/include/exec/cpu-all.h
29
index XXXXXXX..XXXXXXX 100644
30
--- a/include/exec/cpu-all.h
31
+++ b/include/exec/cpu-all.h
32
@@ -XXX,XX +XXX,XX @@ CPUArchState *cpu_copy(CPUArchState *env);
33
#define TLB_MMIO (1 << (TARGET_PAGE_BITS_MIN - 2))
34
#define TLB_WATCHPOINT 0
35
36
-static inline int cpu_mmu_index(CPUArchState *env, bool ifetch)
37
+static inline int cpu_mmu_index(CPUState *cs, bool ifetch)
38
{
39
return MMU_USER_IDX;
40
}
41
diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h
42
index XXXXXXX..XXXXXXX 100644
43
--- a/include/exec/cpu-common.h
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
}
190
}
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
--
503
2.34.1
504
505
diff view generated by jsdifflib
Deleted patch
1
From: Ilya Leoshkevich <iii@linux.ibm.com>
2
1
3
The `if not probe_proc_self_mem` check never passes, because
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
7
Fixes: dc84d50a7f9b ("tests/tcg: Add the PROT_NONE gdbstub test")
8
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
9
Message-Id: <20240131220245.235993-1-iii@linux.ibm.com>
10
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
---
12
tests/tcg/multiarch/gdbstub/prot-none.py | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
diff --git a/tests/tcg/multiarch/gdbstub/prot-none.py b/tests/tcg/multiarch/gdbstub/prot-none.py
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/tcg/multiarch/gdbstub/prot-none.py
18
+++ b/tests/tcg/multiarch/gdbstub/prot-none.py
19
@@ -XXX,XX +XXX,XX @@ def probe_proc_self_mem():
20
21
def run_test():
22
"""Run through the tests one by one"""
23
- if not probe_proc_self_mem:
24
+ if not probe_proc_self_mem():
25
print("SKIP: /proc/self/mem is not usable")
26
exit(0)
27
gdb.Breakpoint("break_here")
28
--
29
2.34.1
diff view generated by jsdifflib
Deleted patch
1
Because there are more call clobbered registers than
2
call saved registers, we begin with all registers as
3
call clobbered and then reset those that are saved.
4
1
5
This was missed when we introduced the LSX support.
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>
11
Reviewed-by: Song Gao <gaosong@loongson.cn>
12
Message-Id: <20240201233414.500588-1-richard.henderson@linaro.org>
13
---
14
tcg/loongarch64/tcg-target.c.inc | 2 +-
15
1 file changed, 1 insertion(+), 1 deletion(-)
16
17
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc
18
index XXXXXXX..XXXXXXX 100644
19
--- a/tcg/loongarch64/tcg-target.c.inc
20
+++ b/tcg/loongarch64/tcg-target.c.inc
21
@@ -XXX,XX +XXX,XX @@ static void tcg_target_init(TCGContext *s)
22
tcg_target_available_regs[TCG_TYPE_I32] = ALL_GENERAL_REGS;
23
tcg_target_available_regs[TCG_TYPE_I64] = ALL_GENERAL_REGS;
24
25
- tcg_target_call_clobber_regs = ALL_GENERAL_REGS;
26
+ tcg_target_call_clobber_regs = ALL_GENERAL_REGS | ALL_VECTOR_REGS;
27
tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S0);
28
tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S1);
29
tcg_regset_reset_reg(tcg_target_call_clobber_regs, TCG_REG_S2);
30
--
31
2.34.1
diff view generated by jsdifflib
Deleted patch
1
Align the operation to the 32-byte cacheline.
2
Use 2 pair of i128 instead of 8 pair of i32.
3
1
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
---
9
target/sparc/translate.c | 43 +++++++++++++++++++++++-----------------
10
1 file changed, 25 insertions(+), 18 deletions(-)
11
12
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/sparc/translate.c
15
+++ b/target/sparc/translate.c
16
@@ -XXX,XX +XXX,XX @@ static void gen_st_asi(DisasContext *dc, DisasASI *da, TCGv src, TCGv addr)
17
18
case GET_ASI_BCOPY:
19
assert(TARGET_LONG_BITS == 32);
20
- /* Copy 32 bytes from the address in SRC to ADDR. */
21
- /* ??? The original qemu code suggests 4-byte alignment, dropping
22
- the low bits, but the only place I can see this used is in the
23
- Linux kernel with 32 byte alignment, which would make more sense
24
- as a cacheline-style operation. */
25
+ /*
26
+ * Copy 32 bytes from the address in SRC to ADDR.
27
+ *
28
+ * From Ross RT625 hyperSPARC manual, section 4.6:
29
+ * "Block Copy and Block Fill will work only on cache line boundaries."
30
+ *
31
+ * It does not specify if an unaliged address is truncated or trapped.
32
+ * Previous qemu behaviour was to truncate to 4 byte alignment, which
33
+ * is obviously wrong. The only place I can see this used is in the
34
+ * Linux kernel which begins with page alignment, advancing by 32,
35
+ * so is always aligned. Assume truncation as the simpler option.
36
+ *
37
+ * Since the loads and stores are paired, allow the copy to happen
38
+ * in the host endianness. The copy need not be atomic.
39
+ */
40
{
41
+ MemOp mop = MO_128 | MO_ATOM_IFALIGN_PAIR;
42
TCGv saddr = tcg_temp_new();
43
TCGv daddr = tcg_temp_new();
44
- TCGv four = tcg_constant_tl(4);
45
- TCGv_i32 tmp = tcg_temp_new_i32();
46
- int i;
47
+ TCGv_i128 tmp = tcg_temp_new_i128();
48
49
- tcg_gen_andi_tl(saddr, src, -4);
50
- tcg_gen_andi_tl(daddr, addr, -4);
51
- for (i = 0; i < 32; i += 4) {
52
- /* Since the loads and stores are paired, allow the
53
- copy to happen in the host endianness. */
54
- tcg_gen_qemu_ld_i32(tmp, saddr, da->mem_idx, MO_UL);
55
- tcg_gen_qemu_st_i32(tmp, daddr, da->mem_idx, MO_UL);
56
- tcg_gen_add_tl(saddr, saddr, four);
57
- tcg_gen_add_tl(daddr, daddr, four);
58
- }
59
+ tcg_gen_andi_tl(saddr, src, -32);
60
+ tcg_gen_andi_tl(daddr, addr, -32);
61
+ tcg_gen_qemu_ld_i128(tmp, saddr, da->mem_idx, mop);
62
+ tcg_gen_qemu_st_i128(tmp, daddr, da->mem_idx, mop);
63
+ tcg_gen_addi_tl(saddr, saddr, 16);
64
+ tcg_gen_addi_tl(daddr, daddr, 16);
65
+ tcg_gen_qemu_ld_i128(tmp, saddr, da->mem_idx, mop);
66
+ tcg_gen_qemu_st_i128(tmp, daddr, da->mem_idx, mop);
67
}
68
break;
69
70
--
71
2.34.1
diff view generated by jsdifflib
Deleted patch
1
Align the operation to the 32-byte cacheline.
2
Use 2 i128 instead of 4 i64.
3
1
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-3-richard.henderson@linaro.org>
8
---
9
target/sparc/translate.c | 29 ++++++++++++++---------------
10
1 file changed, 14 insertions(+), 15 deletions(-)
11
12
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/sparc/translate.c
15
+++ b/target/sparc/translate.c
16
@@ -XXX,XX +XXX,XX @@ static void gen_stda_asi(DisasContext *dc, DisasASI *da, TCGv addr, int rd)
17
18
case GET_ASI_BFILL:
19
assert(TARGET_LONG_BITS == 32);
20
- /* Store 32 bytes of T64 to ADDR. */
21
- /* ??? The original qemu code suggests 8-byte alignment, dropping
22
- the low bits, but the only place I can see this used is in the
23
- Linux kernel with 32 byte alignment, which would make more sense
24
- as a cacheline-style operation. */
25
+ /*
26
+ * Store 32 bytes of [rd:rd+1] to ADDR.
27
+ * See comments for GET_ASI_COPY above.
28
+ */
29
{
30
- TCGv_i64 t64 = tcg_temp_new_i64();
31
- TCGv d_addr = tcg_temp_new();
32
- TCGv eight = tcg_constant_tl(8);
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
}
52
break;
53
54
--
55
2.34.1
diff view generated by jsdifflib
Deleted patch
1
Replace with tcg_temp_new_i32.
2
1
3
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
---
9
target/sparc/translate.c | 17 ++++++-----------
10
1 file changed, 6 insertions(+), 11 deletions(-)
11
12
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/sparc/translate.c
15
+++ b/target/sparc/translate.c
16
@@ -XXX,XX +XXX,XX @@ static void gen_store_fpr_F(DisasContext *dc, unsigned int dst, TCGv_i32 v)
17
gen_update_fprs_dirty(dc, dst);
18
}
19
20
-static TCGv_i32 gen_dest_fpr_F(DisasContext *dc)
21
-{
22
- return tcg_temp_new_i32();
23
-}
24
-
25
static TCGv_i64 gen_load_fpr_D(DisasContext *dc, unsigned int src)
26
{
27
src = DFPREG(src);
28
@@ -XXX,XX +XXX,XX @@ static void gen_ldf_asi(DisasContext *dc, DisasASI *da, MemOp orig_size,
29
memop |= MO_ALIGN_4;
30
switch (size) {
31
case MO_32:
32
- d32 = gen_dest_fpr_F(dc);
33
+ d32 = tcg_temp_new_i32();
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;
57
}
58
59
- dst = gen_dest_fpr_F(dc);
60
+ dst = tcg_temp_new_i32();
61
src = gen_load_fpr_D(dc, a->rs);
62
func(dst, src);
63
gen_store_fpr_F(dc, a->rd, dst);
64
@@ -XXX,XX +XXX,XX @@ static bool do_env_fd(DisasContext *dc, arg_r_r *a,
65
}
66
67
gen_op_clear_ieee_excp_and_FTT();
68
- dst = gen_dest_fpr_F(dc);
69
+ dst = tcg_temp_new_i32();
70
src = gen_load_fpr_D(dc, a->rs);
71
func(dst, tcg_env, src);
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
--
83
2.34.1
84
85
diff view generated by jsdifflib
Deleted patch
1
Use them for trans_FMOVq.
2
1
3
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
---
9
target/sparc/translate.c | 25 +++++++++++++++++++------
10
1 file changed, 19 insertions(+), 6 deletions(-)
11
12
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/sparc/translate.c
15
+++ b/target/sparc/translate.c
16
@@ -XXX,XX +XXX,XX @@ static TCGv_i64 gen_dest_fpr_D(DisasContext *dc, unsigned int dst)
17
return cpu_fpr[DFPREG(dst) / 2];
18
}
19
20
+static TCGv_i128 gen_load_fpr_Q(DisasContext *dc, unsigned int src)
21
+{
22
+ TCGv_i128 ret = tcg_temp_new_i128();
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
+}
28
+
29
+static void gen_store_fpr_Q(DisasContext *dc, unsigned int dst, TCGv_i128 v)
30
+{
31
+ dst = DFPREG(dst);
32
+ tcg_gen_extr_i128_i64(cpu_fpr[dst / 2 + 1], cpu_fpr[dst / 2], v);
33
+ gen_update_fprs_dirty(dc, dst);
34
+}
35
+
36
static void gen_op_load_fpr_QT0(unsigned int src)
37
{
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
}
50
51
gen_op_clear_ieee_excp_and_FTT();
52
- rd = QFPREG(a->rd);
53
- rs = QFPREG(a->rs);
54
- tcg_gen_mov_i64(cpu_fpr[rd / 2], cpu_fpr[rs / 2]);
55
- tcg_gen_mov_i64(cpu_fpr[rd / 2 + 1], cpu_fpr[rs / 2 + 1]);
56
- gen_update_fprs_dirty(dc, rd);
57
+ t = gen_load_fpr_Q(dc, a->rs);
58
+ gen_store_fpr_Q(dc, a->rd, t);
59
return advance_pc(dc);
60
}
61
62
--
63
2.34.1
64
65
diff view generated by jsdifflib
Deleted patch
1
These are simple bit manipulation insns.
2
Begin using i128 for float128.
3
Implement FMOVq with do_qq.
4
1
5
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
---
11
target/sparc/helper.h | 6 ----
12
target/sparc/fop_helper.c | 34 ---------------------
13
target/sparc/translate.c | 62 +++++++++++++++++++--------------------
14
3 files changed, 30 insertions(+), 72 deletions(-)
15
16
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/target/sparc/helper.h
19
+++ b/target/sparc/helper.h
20
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_5(st_asi, TCG_CALL_NO_WG, void, env, tl, i64, int, i32)
21
#endif
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
}
67
68
-float32 helper_fnegs(float32 src)
69
-{
70
- return float32_chs(src);
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
+}
172
+
173
+static void gen_op_fnegq(TCGv_i128 dst, TCGv_i128 src)
174
+{
175
+ TCGv_i64 l = tcg_temp_new_i64();
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
+}
182
+
183
+static void gen_op_fabsq(TCGv_i128 dst, TCGv_i128 src)
184
+{
185
+ TCGv_i64 l = tcg_temp_new_i64();
186
+ TCGv_i64 h = tcg_temp_new_i64();
187
+
188
+ tcg_gen_extr_i128_i64(l, h, src);
189
+ tcg_gen_andi_i64(h, h, ~(1ull << 63));
190
+ tcg_gen_concat_i64_i128(dst, l, h);
191
}
192
193
#ifdef TARGET_SPARC64
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
{
202
TCGv_i128 t;
203
204
- if (!avail_64(dc)) {
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
}
218
219
-static bool do_qq(DisasContext *dc, arg_r_r *a,
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
--
246
2.34.1
247
248
diff view generated by jsdifflib
Deleted patch
1
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
target/sparc/helper.h | 2 +-
7
target/sparc/fop_helper.c | 26 ++++++++++++++++++++++++--
8
target/sparc/translate.c | 12 +++++++-----
9
3 files changed, 32 insertions(+), 8 deletions(-)
10
1
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
14
+++ b/target/sparc/helper.h
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fcmps, TCG_CALL_NO_WG, tl, env, f32, f32)
16
DEF_HELPER_FLAGS_3(fcmpd, TCG_CALL_NO_WG, tl, env, f64, f64)
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;
84
}
85
@@ -XXX,XX +XXX,XX @@ static bool do_env_qq(DisasContext *dc, arg_r_r *a,
86
}
87
88
gen_op_clear_ieee_excp_and_FTT();
89
- gen_op_load_fpr_QT1(QFPREG(a->rs));
90
- func(tcg_env);
91
+
92
+ t = gen_load_fpr_Q(dc, a->rs);
93
+ func(t, tcg_env, t);
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
}
100
101
--
102
2.34.1
diff view generated by jsdifflib
Deleted patch
1
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
---
6
target/sparc/helper.h | 12 +++++-------
7
target/sparc/fop_helper.c | 29 ++++++++++++++---------------
8
target/sparc/translate.c | 13 +++++++------
9
3 files changed, 26 insertions(+), 28 deletions(-)
10
1
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
14
+++ b/target/sparc/helper.h
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_1(fcmpeq_fcc2, TCG_CALL_NO_WG, tl, env)
16
DEF_HELPER_FLAGS_1(fcmpeq_fcc3, TCG_CALL_NO_WG, tl, env)
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
}
84
85
F_BINOP(add);
86
@@ -XXX,XX +XXX,XX @@ void helper_fxtoq(CPUSPARCState *env, int64_t src)
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;
109
}
110
@@ -XXX,XX +XXX,XX @@ static bool do_env_qqq(DisasContext *dc, arg_r_r_r *a,
111
}
112
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
}
126
127
--
128
2.34.1
diff view generated by jsdifflib
Deleted patch
1
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
---
6
target/sparc/helper.h | 4 ++--
7
target/sparc/fop_helper.c | 8 ++++----
8
target/sparc/translate.c | 7 ++++---
9
3 files changed, 10 insertions(+), 9 deletions(-)
10
1
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
14
+++ b/target/sparc/helper.h
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(fxtoq, TCG_CALL_NO_RWG, void, env, s64)
16
#endif
17
DEF_HELPER_FLAGS_2(fdtos, TCG_CALL_NO_RWG, f32, env, f64)
18
DEF_HELPER_FLAGS_2(fstod, TCG_CALL_NO_RWG, f64, env, f32)
19
-DEF_HELPER_FLAGS_1(fqtos, TCG_CALL_NO_RWG, f32, env)
20
+DEF_HELPER_FLAGS_2(fqtos, TCG_CALL_NO_RWG, f32, env, i128)
21
DEF_HELPER_FLAGS_2(fstoq, TCG_CALL_NO_RWG, void, env, f32)
22
DEF_HELPER_FLAGS_1(fqtod, TCG_CALL_NO_RWG, f64, env)
23
DEF_HELPER_FLAGS_2(fdtoq, TCG_CALL_NO_RWG, void, env, f64)
24
DEF_HELPER_FLAGS_2(fstoi, TCG_CALL_NO_RWG, s32, env, f32)
25
DEF_HELPER_FLAGS_2(fdtoi, TCG_CALL_NO_RWG, s32, env, f64)
26
-DEF_HELPER_FLAGS_1(fqtoi, TCG_CALL_NO_RWG, s32, env)
27
+DEF_HELPER_FLAGS_2(fqtoi, TCG_CALL_NO_RWG, s32, env, i128)
28
#ifdef TARGET_SPARC64
29
DEF_HELPER_FLAGS_2(fstox, TCG_CALL_NO_RWG, s64, env, f32)
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
}
38
39
-float32 helper_fqtos(CPUSPARCState *env)
40
+float32 helper_fqtos(CPUSPARCState *env, Int128 src)
41
{
42
- return float128_to_float32(QT1, &env->fp_status);
43
+ return float128_to_float32(f128_in(src), &env->fp_status);
44
}
45
46
void helper_fstoq(CPUSPARCState *env, float32 src)
47
@@ -XXX,XX +XXX,XX @@ int32_t helper_fdtoi(CPUSPARCState *env, float64 src)
48
return float64_to_int32_round_to_zero(src, &env->fp_status);
49
}
50
51
-int32_t helper_fqtoi(CPUSPARCState *env)
52
+int32_t helper_fqtoi(CPUSPARCState *env, Int128 src)
53
{
54
- return float128_to_int32_round_to_zero(QT1, &env->fp_status);
55
+ return float128_to_int32_round_to_zero(f128_in(src), &env->fp_status);
56
}
57
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
77
gen_op_clear_ieee_excp_and_FTT();
78
- gen_op_load_fpr_QT1(QFPREG(a->rs));
79
+ src = gen_load_fpr_Q(dc, a->rs);
80
dst = tcg_temp_new_i32();
81
- func(dst, tcg_env);
82
+ func(dst, tcg_env, src);
83
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
84
gen_store_fpr_F(dc, a->rd, dst);
85
return advance_pc(dc);
86
--
87
2.34.1
diff view generated by jsdifflib
Deleted patch
1
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
target/sparc/helper.h | 4 ++--
7
target/sparc/fop_helper.c | 8 ++++----
8
target/sparc/translate.c | 7 ++++---
9
3 files changed, 10 insertions(+), 9 deletions(-)
10
1
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
14
+++ b/target/sparc/helper.h
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(fdtos, TCG_CALL_NO_RWG, f32, env, f64)
16
DEF_HELPER_FLAGS_2(fstod, TCG_CALL_NO_RWG, f64, env, f32)
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
}
40
41
-float64 helper_fqtod(CPUSPARCState *env)
42
+float64 helper_fqtod(CPUSPARCState *env, Int128 src)
43
{
44
- return float128_to_float64(QT1, &env->fp_status);
45
+ return float128_to_float64(f128_in(src), &env->fp_status);
46
}
47
48
void helper_fdtoq(CPUSPARCState *env, float64 src)
49
@@ -XXX,XX +XXX,XX @@ int64_t helper_fdtox(CPUSPARCState *env, float64 src)
50
return float64_to_int64_round_to_zero(src, &env->fp_status);
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
}
78
79
gen_op_clear_ieee_excp_and_FTT();
80
- gen_op_load_fpr_QT1(QFPREG(a->rs));
81
+ src = gen_load_fpr_Q(dc, a->rs);
82
dst = gen_dest_fpr_D(dc, a->rd);
83
- func(dst, tcg_env);
84
+ func(dst, tcg_env, src);
85
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
86
gen_store_fpr_D(dc, a->rd, dst);
87
return advance_pc(dc);
88
--
89
2.34.1
diff view generated by jsdifflib
Deleted patch
1
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
---
6
target/sparc/helper.h | 16 ++++++------
7
target/sparc/fop_helper.c | 23 +++++++++--------
8
target/sparc/translate.c | 54 +++++++++++++++------------------------
9
3 files changed, 41 insertions(+), 52 deletions(-)
10
1
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
14
+++ b/target/sparc/helper.h
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fcmpd, TCG_CALL_NO_WG, tl, env, f64, f64)
16
DEF_HELPER_FLAGS_3(fcmpes, TCG_CALL_NO_WG, tl, env, f32, f32)
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
}
52
53
-#define GEN_FCMP(name, size, reg1, reg2, FS, E) \
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
-{
116
- tcg_gen_st_i64(cpu_fpr[src / 2], tcg_env, offsetof(CPUSPARCState, qt0) +
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
-}
121
-
122
-static void gen_op_load_fpr_QT1(unsigned int src)
123
-{
124
- tcg_gen_st_i64(cpu_fpr[src / 2], tcg_env, offsetof(CPUSPARCState, qt1) +
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
-}
129
-
130
static void gen_op_store_QT0_fpr(unsigned int dst)
131
{
132
tcg_gen_ld_i64(cpu_fpr[dst / 2], tcg_env, offsetof(CPUSPARCState, qt0) +
133
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmpd(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
134
}
135
}
136
137
-static void gen_op_fcmpq(int fccno)
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
--
236
2.34.1
diff view generated by jsdifflib
Deleted patch
1
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
---
6
target/sparc/helper.h | 4 ++--
7
target/sparc/fop_helper.c | 8 ++++----
8
target/sparc/translate.c | 9 +++++----
9
3 files changed, 11 insertions(+), 10 deletions(-)
10
1
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
14
+++ b/target/sparc/helper.h
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fsmuld, TCG_CALL_NO_RWG, f64, env, f32, f32)
16
DEF_HELPER_FLAGS_3(fdmulq, TCG_CALL_NO_RWG, void, env, f64, f64)
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
}
40
41
-void helper_fitoq(CPUSPARCState *env, int32_t src)
42
+Int128 helper_fitoq(CPUSPARCState *env, int32_t src)
43
{
44
- QT0 = int32_to_float128(src, &env->fp_status);
45
+ return f128_ret(int32_to_float128(src, &env->fp_status));
46
}
47
48
#ifdef TARGET_SPARC64
49
@@ -XXX,XX +XXX,XX @@ float32 helper_fqtos(CPUSPARCState *env, Int128 src)
50
return float128_to_float32(f128_in(src), &env->fp_status);
51
}
52
53
-void helper_fstoq(CPUSPARCState *env, float32 src)
54
+Int128 helper_fstoq(CPUSPARCState *env, float32 src)
55
{
56
- QT0 = float32_to_float128(src, &env->fp_status);
57
+ return f128_ret(float32_to_float128(src, &env->fp_status));
58
}
59
60
float64 helper_fqtod(CPUSPARCState *env, Int128 src)
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(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
{
72
TCGv_i32 src;
73
+ TCGv_i128 dst;
74
75
if (gen_trap_ifnofpu(dc)) {
76
return true;
77
@@ -XXX,XX +XXX,XX @@ static bool do_env_qf(DisasContext *dc, arg_r_r *a,
78
79
gen_op_clear_ieee_excp_and_FTT();
80
src = gen_load_fpr_F(dc, a->rs);
81
- func(tcg_env, src);
82
- gen_op_store_QT0_fpr(QFPREG(a->rd));
83
- gen_update_fprs_dirty(dc, QFPREG(a->rd));
84
+ dst = tcg_temp_new_i128();
85
+ func(dst, tcg_env, src);
86
+ gen_store_fpr_Q(dc, a->rd, dst);
87
return advance_pc(dc);
88
}
89
90
--
91
2.34.1
diff view generated by jsdifflib
Deleted patch
1
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
---
6
target/sparc/helper.h | 4 ++--
7
target/sparc/fop_helper.c | 8 ++++----
8
target/sparc/translate.c | 9 +++++----
9
3 files changed, 11 insertions(+), 10 deletions(-)
10
1
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
14
+++ b/target/sparc/helper.h
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_2(fitos, TCG_CALL_NO_RWG, f32, env, s32)
16
#ifdef TARGET_SPARC64
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
}
39
40
-void helper_fxtoq(CPUSPARCState *env, int64_t src)
41
+Int128 helper_fxtoq(CPUSPARCState *env, int64_t src)
42
{
43
- QT0 = int64_to_float128(src, &env->fp_status);
44
+ return f128_ret(int64_to_float128(src, &env->fp_status));
45
}
46
#endif
47
48
@@ -XXX,XX +XXX,XX @@ float64 helper_fqtod(CPUSPARCState *env, Int128 src)
49
return float128_to_float64(f128_in(src), &env->fp_status);
50
}
51
52
-void helper_fdtoq(CPUSPARCState *env, float64 src)
53
+Int128 helper_fdtoq(CPUSPARCState *env, float64 src)
54
{
55
- QT0 = float64_to_float128(src, &env->fp_status);
56
+ return f128_ret(float64_to_float128(src, &env->fp_status));
57
}
58
59
/* Float to integer conversion. */
60
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
61
index XXXXXXX..XXXXXXX 100644
62
--- a/target/sparc/translate.c
63
+++ b/target/sparc/translate.c
64
@@ -XXX,XX +XXX,XX @@ TRANS(FiTOq, ALL, do_env_qf, a, gen_helper_fitoq)
65
TRANS(FsTOq, ALL, do_env_qf, a, gen_helper_fstoq)
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
}
88
89
--
90
2.34.1
diff view generated by jsdifflib
Deleted patch
1
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
target/sparc/helper.h | 2 +-
7
target/sparc/fop_helper.c | 8 ++++----
8
target/sparc/translate.c | 15 ++++-----------
9
3 files changed, 9 insertions(+), 16 deletions(-)
10
1
11
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/helper.h
14
+++ b/target/sparc/helper.h
15
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_FLAGS_3(fmuls, TCG_CALL_NO_RWG, f32, env, f32, f32)
16
DEF_HELPER_FLAGS_3(fdivs, TCG_CALL_NO_RWG, f32, env, f32, f32)
17
18
DEF_HELPER_FLAGS_3(fsmuld, TCG_CALL_NO_RWG, f64, env, f32, f32)
19
-DEF_HELPER_FLAGS_3(fdmulq, TCG_CALL_NO_RWG, void, env, f64, f64)
20
+DEF_HELPER_FLAGS_3(fdmulq, TCG_CALL_NO_RWG, i128, env, f64, f64)
21
22
DEF_HELPER_FLAGS_2(fitod, TCG_CALL_NO_RWG_SE, f64, env, s32)
23
DEF_HELPER_FLAGS_2(fitoq, TCG_CALL_NO_RWG, i128, env, s32)
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 @@ float64 helper_fsmuld(CPUSPARCState *env, float32 src1, float32 src2)
29
&env->fp_status);
30
}
31
32
-void helper_fdmulq(CPUSPARCState *env, float64 src1, float64 src2)
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
-{
54
- tcg_gen_ld_i64(cpu_fpr[dst / 2], tcg_env, offsetof(CPUSPARCState, qt0) +
55
- offsetof(CPU_QuadU, ll.upper));
56
- tcg_gen_ld_i64(cpu_fpr[dst/2 + 1], tcg_env, offsetof(CPUSPARCState, qt0) +
57
- offsetof(CPU_QuadU, ll.lower));
58
-}
59
-
60
/* moves */
61
#ifdef CONFIG_USER_ONLY
62
#define supervisor(dc) 0
63
@@ -XXX,XX +XXX,XX @@ TRANS(FDIVq, ALL, do_env_qqq, a, gen_helper_fdivq)
64
static bool trans_FdMULq(DisasContext *dc, arg_r_r_r *a)
65
{
66
TCGv_i64 src1, src2;
67
+ TCGv_i128 dst;
68
69
if (gen_trap_ifnofpu(dc)) {
70
return true;
71
@@ -XXX,XX +XXX,XX @@ static bool trans_FdMULq(DisasContext *dc, arg_r_r_r *a)
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
}
84
85
--
86
2.34.1
diff view generated by jsdifflib
Deleted patch
1
These are no longer used for passing data to/from helpers.
2
1
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-15-richard.henderson@linaro.org>
7
---
8
target/sparc/cpu.h | 2 --
9
target/sparc/fop_helper.c | 3 ---
10
target/sparc/ldst_helper.c | 3 ---
11
3 files changed, 8 deletions(-)
12
13
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/sparc/cpu.h
16
+++ b/target/sparc/cpu.h
17
@@ -XXX,XX +XXX,XX @@ struct CPUArchState {
18
uint64_t mmubpregs[4];
19
uint64_t prom_addr;
20
#endif
21
- /* temporary float registers */
22
- float128 qt0, qt1;
23
float_status fp_status;
24
#if defined(TARGET_SPARC64)
25
#define MAXTL_MAX 8
26
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/target/sparc/fop_helper.c
29
+++ b/target/sparc/fop_helper.c
30
@@ -XXX,XX +XXX,XX @@
31
#include "exec/helper-proto.h"
32
#include "fpu/softfloat.h"
33
34
-#define QT0 (env->qt0)
35
-#define QT1 (env->qt1)
36
-
37
static inline float128 f128_in(Int128 i)
38
{
39
union {
40
diff --git a/target/sparc/ldst_helper.c b/target/sparc/ldst_helper.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/target/sparc/ldst_helper.c
43
+++ b/target/sparc/ldst_helper.c
44
@@ -XXX,XX +XXX,XX @@
45
#endif
46
#endif
47
48
-#define QT0 (env->qt0)
49
-#define QT1 (env->qt1)
50
-
51
#if defined(TARGET_SPARC64) && !defined(CONFIG_USER_ONLY)
52
/* Calculates TSB pointer value for fault page size
53
* UltraSPARC IIi has fixed sizes (8k or 64k) for the page pointers
54
--
55
2.34.1
diff view generated by jsdifflib
Deleted patch
1
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
---
7
target/sparc/cpu.h | 4 +++-
8
target/sparc/helper.h | 1 +
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
1
18
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
19
index XXXXXXX..XXXXXXX 100644
20
--- a/target/sparc/cpu.h
21
+++ b/target/sparc/cpu.h
22
@@ -XXX,XX +XXX,XX @@ void sparc_restore_state_to_opc(CPUState *cs,
23
const TranslationBlock *tb,
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
}
79
80
static void restore_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
81
{
82
+ target_ulong fsr;
83
int i;
84
85
#ifdef TARGET_SPARC64
86
@@ -XXX,XX +XXX,XX @@ static void restore_fpu(struct target_siginfo_fpu *fpu, CPUSPARCState *env)
87
__get_user(env->fpr[i].ll, &fpu->si_double_regs[i]);
88
}
89
}
90
- __get_user(env->fsr, &fpu->si_fsr);
91
__get_user(env->gsr, &fpu->si_gsr);
92
env->fprs |= fprs;
93
#else
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
+
100
+ __get_user(fsr, &fpu->si_fsr);
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
+}
166
+
167
+target_ulong helper_get_fsr(CPUSPARCState *env)
168
+{
169
+ return cpu_get_fsr(env);
170
+}
171
+
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
}
184
185
+void cpu_put_fsr(CPUSPARCState *env, target_ulong fsr)
186
+{
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;
220
case 70:
221
- env->fsr = tmp;
222
+ cpu_put_fsr(env, tmp);
223
break;
224
default:
225
return 0;
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
--
321
2.34.1
322
323
diff view generated by jsdifflib
Deleted patch
1
This field is read-only. It is easier to store it separately
2
and merge it only upon read.
3
1
4
While we're at it, use FSR_VER_SHIFT to initialize fpu_version.
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
19
--- a/target/sparc/cpu.h
20
+++ b/target/sparc/cpu.h
21
@@ -XXX,XX +XXX,XX @@ enum {
22
#define FSR_NXC (1ULL << 0)
23
#define FSR_CEXC_MASK (FSR_NVC | FSR_OFC | FSR_UFC | FSR_DZC | FSR_NXC)
24
25
+#define FSR_VER_SHIFT 17
26
+#define FSR_VER_MASK (7 << FSR_VER_SHIFT)
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
}
176
177
target_ulong helper_get_fsr(CPUSPARCState *env)
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
--
188
2.34.1
189
190
diff view generated by jsdifflib
Deleted patch
1
Don't do the clearing explicitly before each FPop,
2
rather do it as part of the rest of exception handling.
3
1
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-18-richard.henderson@linaro.org>
8
---
9
target/sparc/fop_helper.c | 2 ++
10
target/sparc/translate.c | 16 ----------------
11
2 files changed, 2 insertions(+), 16 deletions(-)
12
13
diff --git a/target/sparc/fop_helper.c b/target/sparc/fop_helper.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/target/sparc/fop_helper.c
16
+++ b/target/sparc/fop_helper.c
17
@@ -XXX,XX +XXX,XX @@ static target_ulong do_check_ieee_exceptions(CPUSPARCState *env, uintptr_t ra)
18
target_ulong status = get_float_exception_flags(&env->fp_status);
19
target_ulong fsr = env->fsr;
20
21
+ fsr &= FSR_FTT_CEXC_NMASK;
22
+
23
if (unlikely(status)) {
24
/* Keep exception flags clear for next time. */
25
set_float_exception_flags(0, &env->fp_status);
26
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
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;
32
}
33
34
- gen_op_clear_ieee_excp_and_FTT();
35
tmp = gen_load_fpr_F(dc, a->rs);
36
func(tmp, tcg_env, tmp);
37
gen_helper_check_ieee_exceptions(cpu_fsr, tcg_env);
38
@@ -XXX,XX +XXX,XX @@ static bool do_env_fd(DisasContext *dc, arg_r_r *a,
39
return true;
40
}
41
42
- gen_op_clear_ieee_excp_and_FTT();
43
dst = tcg_temp_new_i32();
44
src = gen_load_fpr_D(dc, a->rs);
45
func(dst, tcg_env, src);
46
@@ -XXX,XX +XXX,XX @@ static bool do_env_dd(DisasContext *dc, arg_r_r *a,
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
--
152
2.34.1
diff view generated by jsdifflib
Deleted patch
1
If an exception is to be raised, the destination fp register
2
should be unmodified. The current implementation is incorrect,
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
1
7
We can simplify the entire implementation by having each
8
FPOp helper call check_ieee_exceptions. For the moment this
9
requires that all FPop helpers write to the TCG global cpu_fsr,
10
so remove TCG_CALL_NO_WG from the DEF_HELPER_FLAGS_*.
11
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
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
24
--- a/target/sparc/helper.h
25
+++ b/target/sparc/helper.h
26
@@ -XXX,XX +XXX,XX @@ DEF_HELPER_3(tsubcctv, tl, env, tl, tl)
27
DEF_HELPER_FLAGS_4(ld_asi, TCG_CALL_NO_WG, i64, env, tl, int, i32)
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
}
183
184
- return fsr;
185
+ env->fsr = fsr;
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;
580
}
581
582
- gen_op_clear_ieee_excp_and_FTT();
583
src = gen_load_fpr_F(dc, a->rs);
584
dst = tcg_temp_new_i128();
585
func(dst, tcg_env, src);
586
@@ -XXX,XX +XXX,XX @@ static bool do_env_qd(DisasContext *dc, arg_r_r *a,
587
return true;
588
}
589
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
--
635
2.34.1
diff view generated by jsdifflib
Deleted patch
1
These two fields are adjusted by all FPop insns.
2
Having them separate makes it easier to set without masking.
3
1
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
---
9
target/sparc/cpu.h | 7 +++++-
10
target/sparc/helper.h | 2 +-
11
target/sparc/fop_helper.c | 46 ++++++++++++++++++---------------------
12
target/sparc/translate.c | 31 ++++++++++++++++----------
13
4 files changed, 48 insertions(+), 38 deletions(-)
14
15
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/sparc/cpu.h
18
+++ b/target/sparc/cpu.h
19
@@ -XXX,XX +XXX,XX @@ enum {
20
#define FSR_DZM (1ULL << 24)
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
{
67
target_ulong status = get_float_exception_flags(&env->fp_status);
68
- target_ulong fsr = env->fsr;
69
-
70
- fsr &= FSR_FTT_CEXC_NMASK;
71
+ uint32_t cexc = 0;
72
73
if (unlikely(status)) {
74
/* Keep exception flags clear for next time. */
75
@@ -XXX,XX +XXX,XX @@ static void check_ieee_exceptions(CPUSPARCState *env, uintptr_t ra)
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
}
121
122
- env->fsr = fsr;
123
+ /* No trap, so FTT is cleared. */
124
+ env->fsr_cexc_ftt = cexc;
125
}
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;
207
}
208
- tmp = tcg_temp_new();
209
- tcg_gen_qemu_ld_tl(tmp, addr, dc->mem_idx, mop | MO_ALIGN);
210
- tcg_gen_andi_tl(tmp, tmp, new_mask);
211
- tcg_gen_andi_tl(cpu_fsr, cpu_fsr, old_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
}
223
224
--
225
2.34.1
diff view generated by jsdifflib
Deleted patch
1
Drop this field as a tcg global, loading it explicitly in the
2
few places required. This means that all FPop helpers may
3
once again be TCG_CALL_NO_WG.
4
1
5
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
---
10
target/sparc/helper.h | 120 +++++++++++++++++++-------------------
11
target/sparc/fop_helper.c | 9 ++-
12
target/sparc/translate.c | 98 ++++++++++++++++---------------
13
3 files changed, 114 insertions(+), 113 deletions(-)
14
15
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/sparc/helper.h
18
+++ 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)
20
DEF_HELPER_FLAGS_5(st_asi, TCG_CALL_NO_WG, void, env, tl, i64, int, i32)
21
#endif
22
DEF_HELPER_FLAGS_1(get_fsr, TCG_CALL_NO_WG_SE, tl, env)
23
-DEF_HELPER_FLAGS_2(set_fsr_noftt, 0, void, env, tl)
24
-DEF_HELPER_FLAGS_2(fsqrts, 0, f32, env, f32)
25
-DEF_HELPER_FLAGS_2(fsqrtd, 0, f64, env, f64)
26
-DEF_HELPER_FLAGS_2(fsqrtq, 0, i128, env, i128)
27
-DEF_HELPER_FLAGS_3(fcmps, 0, tl, env, f32, f32)
28
-DEF_HELPER_FLAGS_3(fcmpd, 0, tl, env, f64, f64)
29
-DEF_HELPER_FLAGS_3(fcmpes, 0, tl, env, f32, f32)
30
-DEF_HELPER_FLAGS_3(fcmped, 0, tl, env, f64, f64)
31
-DEF_HELPER_FLAGS_3(fcmpq, 0, tl, env, i128, i128)
32
-DEF_HELPER_FLAGS_3(fcmpeq, 0, tl, env, i128, i128)
33
+DEF_HELPER_FLAGS_2(set_fsr_noftt, TCG_CALL_NO_RWG, void, env, tl)
34
+DEF_HELPER_FLAGS_2(fsqrts, TCG_CALL_NO_WG, f32, env, f32)
35
+DEF_HELPER_FLAGS_2(fsqrtd, TCG_CALL_NO_WG, f64, env, f64)
36
+DEF_HELPER_FLAGS_2(fsqrtq, TCG_CALL_NO_WG, i128, env, i128)
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
160
index XXXXXXX..XXXXXXX 100644
161
--- a/target/sparc/fop_helper.c
162
+++ b/target/sparc/fop_helper.c
163
@@ -XXX,XX +XXX,XX @@ Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
164
}
165
166
#define GEN_FCMP(name, size, FS, E) \
167
- target_ulong glue(helper_, name) (CPUSPARCState *env, \
168
- Int128 src1, Int128 src2) \
169
+ void glue(helper_, name)(CPUSPARCState *env, Int128 src1, Int128 src2) \
170
{ \
171
float128 reg1 = f128_in(src1); \
172
float128 reg2 = f128_in(src2); \
173
@@ -XXX,XX +XXX,XX @@ Int128 helper_fsqrtq(CPUSPARCState *env, Int128 src)
174
fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \
175
break; \
176
} \
177
- return fsr; \
178
+ env->fsr = fsr; \
179
}
180
#define GEN_FCMP_T(name, size, FS, E) \
181
- target_ulong glue(helper_, name)(CPUSPARCState *env, size src1, size src2)\
182
+ void glue(helper_, name)(CPUSPARCState *env, size src1, size src2) \
183
{ \
184
FloatRelation ret; \
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
196
index XXXXXXX..XXXXXXX 100644
197
--- a/target/sparc/translate.c
198
+++ b/target/sparc/translate.c
199
@@ -XXX,XX +XXX,XX @@
200
201
/* global register indexes */
202
static TCGv_ptr cpu_regwptr;
203
-static TCGv cpu_fsr, cpu_pc, cpu_npc;
204
+static TCGv cpu_pc, cpu_npc;
205
static TCGv cpu_regs[32];
206
static TCGv cpu_y;
207
static TCGv cpu_tbr;
208
@@ -XXX,XX +XXX,XX @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond,
209
static void gen_fcompare(DisasCompare *cmp, unsigned int cc, unsigned int cond)
210
{
211
unsigned int offset;
212
- TCGv r_dst;
213
+ TCGv r_dst, fsr;
214
215
/* For now we still generate a straight boolean result. */
216
cmp->cond = TCG_COND_NE;
217
@@ -XXX,XX +XXX,XX @@ static void gen_fcompare(DisasCompare *cmp, unsigned int cc, unsigned int cond)
218
break;
219
}
220
221
+ fsr = tcg_temp_new();
222
+ tcg_gen_ld_tl(fsr, tcg_env, offsetof(CPUSPARCState, fsr));
223
switch (cond) {
224
case 0x0:
225
gen_op_eval_bn(r_dst);
226
break;
227
case 0x1:
228
- gen_op_eval_fbne(r_dst, cpu_fsr, offset);
229
+ gen_op_eval_fbne(r_dst, fsr, offset);
230
break;
231
case 0x2:
232
- gen_op_eval_fblg(r_dst, cpu_fsr, offset);
233
+ gen_op_eval_fblg(r_dst, fsr, offset);
234
break;
235
case 0x3:
236
- gen_op_eval_fbul(r_dst, cpu_fsr, offset);
237
+ gen_op_eval_fbul(r_dst, fsr, offset);
238
break;
239
case 0x4:
240
- gen_op_eval_fbl(r_dst, cpu_fsr, offset);
241
+ gen_op_eval_fbl(r_dst, fsr, offset);
242
break;
243
case 0x5:
244
- gen_op_eval_fbug(r_dst, cpu_fsr, offset);
245
+ gen_op_eval_fbug(r_dst, fsr, offset);
246
break;
247
case 0x6:
248
- gen_op_eval_fbg(r_dst, cpu_fsr, offset);
249
+ gen_op_eval_fbg(r_dst, fsr, offset);
250
break;
251
case 0x7:
252
- gen_op_eval_fbu(r_dst, cpu_fsr, offset);
253
+ gen_op_eval_fbu(r_dst, fsr, offset);
254
break;
255
case 0x8:
256
gen_op_eval_ba(r_dst);
257
break;
258
case 0x9:
259
- gen_op_eval_fbe(r_dst, cpu_fsr, offset);
260
+ gen_op_eval_fbe(r_dst, fsr, offset);
261
break;
262
case 0xa:
263
- gen_op_eval_fbue(r_dst, cpu_fsr, offset);
264
+ gen_op_eval_fbue(r_dst, fsr, offset);
265
break;
266
case 0xb:
267
- gen_op_eval_fbge(r_dst, cpu_fsr, offset);
268
+ gen_op_eval_fbge(r_dst, fsr, offset);
269
break;
270
case 0xc:
271
- gen_op_eval_fbuge(r_dst, cpu_fsr, offset);
272
+ gen_op_eval_fbuge(r_dst, fsr, offset);
273
break;
274
case 0xd:
275
- gen_op_eval_fble(r_dst, cpu_fsr, offset);
276
+ gen_op_eval_fble(r_dst, fsr, offset);
277
break;
278
case 0xe:
279
- gen_op_eval_fbule(r_dst, cpu_fsr, offset);
280
+ gen_op_eval_fbule(r_dst, fsr, offset);
281
break;
282
case 0xf:
283
- gen_op_eval_fbo(r_dst, cpu_fsr, offset);
284
+ gen_op_eval_fbo(r_dst, fsr, offset);
285
break;
286
}
287
}
288
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmps(int fccno, TCGv_i32 r_rs1, TCGv_i32 r_rs2)
289
{
290
switch (fccno) {
291
case 0:
292
- gen_helper_fcmps(cpu_fsr, tcg_env, r_rs1, r_rs2);
293
+ gen_helper_fcmps(tcg_env, r_rs1, r_rs2);
294
break;
295
case 1:
296
- gen_helper_fcmps_fcc1(cpu_fsr, tcg_env, r_rs1, r_rs2);
297
+ gen_helper_fcmps_fcc1(tcg_env, r_rs1, r_rs2);
298
break;
299
case 2:
300
- gen_helper_fcmps_fcc2(cpu_fsr, tcg_env, r_rs1, r_rs2);
301
+ gen_helper_fcmps_fcc2(tcg_env, r_rs1, r_rs2);
302
break;
303
case 3:
304
- gen_helper_fcmps_fcc3(cpu_fsr, tcg_env, r_rs1, r_rs2);
305
+ gen_helper_fcmps_fcc3(tcg_env, r_rs1, r_rs2);
306
break;
307
}
308
}
309
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmpd(int fccno, TCGv_i64 r_rs1, TCGv_i64 r_rs2)
310
{
311
switch (fccno) {
312
case 0:
313
- gen_helper_fcmpd(cpu_fsr, tcg_env, r_rs1, r_rs2);
314
+ gen_helper_fcmpd(tcg_env, r_rs1, r_rs2);
315
break;
316
case 1:
317
- gen_helper_fcmpd_fcc1(cpu_fsr, tcg_env, r_rs1, r_rs2);
318
+ gen_helper_fcmpd_fcc1(tcg_env, r_rs1, r_rs2);
319
break;
320
case 2:
321
- gen_helper_fcmpd_fcc2(cpu_fsr, tcg_env, r_rs1, r_rs2);
322
+ gen_helper_fcmpd_fcc2(tcg_env, r_rs1, r_rs2);
323
break;
324
case 3:
325
- gen_helper_fcmpd_fcc3(cpu_fsr, tcg_env, r_rs1, r_rs2);
326
+ gen_helper_fcmpd_fcc3(tcg_env, r_rs1, r_rs2);
327
break;
328
}
329
}
330
@@ -XXX,XX +XXX,XX @@ static void gen_op_fcmpq(int fccno, TCGv_i128 r_rs1, TCGv_i128 r_rs2)
331
{
332
switch (fccno) {
333
case 0:
334
- gen_helper_fcmpq(cpu_fsr, tcg_env, r_rs1, r_rs2);
335
+ gen_helper_fcmpq(tcg_env, r_rs1, r_rs2);
336
break;
337
case 1:
338
- gen_helper_fcmpq_fcc1(cpu_fsr, tcg_env, r_rs1, r_rs2);
339
+ gen_helper_fcmpq_fcc1(tcg_env, r_rs1, r_rs2);
340
break;
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
--
473
2.34.1
diff view generated by jsdifflib
Deleted patch
1
Represent each fcc field separately from the rest of fsr.
2
This vastly simplifies floating-point comparisons.
3
1
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-22-richard.henderson@linaro.org>
8
---
9
target/sparc/cpu.h | 20 +-
10
target/sparc/helper.h | 34 +--
11
target/sparc/fop_helper.c | 169 ++++++-------
12
target/sparc/translate.c | 503 +++++++++-----------------------------
13
4 files changed, 201 insertions(+), 525 deletions(-)
14
15
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/target/sparc/cpu.h
18
+++ b/target/sparc/cpu.h
19
@@ -XXX,XX +XXX,XX @@
20
21
#if !defined(TARGET_SPARC64)
22
#define TARGET_DPREGS 16
23
+#define TARGET_FCCREGS 1
24
#else
25
#define TARGET_DPREGS 32
26
+#define TARGET_FCCREGS 4
27
#endif
28
29
/*#define EXCP_INTERRUPT 0x100*/
30
@@ -XXX,XX +XXX,XX @@ enum {
31
#ifdef TARGET_SPARC64
32
#define FSR_FTT_NMASK 0xfffffffffffe3fffULL
33
#define FSR_FTT_CEXC_NMASK 0xfffffffffffe3fe0ULL
34
-#define FSR_LDFSR_OLDMASK 0x0000003f000fc000ULL
35
-#define FSR_LDXFSR_MASK 0x0000003fcfc00fffULL
36
-#define FSR_LDXFSR_OLDMASK 0x00000000000fc000ULL
37
#else
38
#define FSR_FTT_NMASK 0xfffe3fffULL
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
-{
356
- tcg_gen_movi_tl(dst, 1);
357
-}
358
-
359
-// 0
360
-static void gen_op_eval_bn(TCGv dst)
361
-{
362
- tcg_gen_movi_tl(dst, 0);
363
-}
364
-
365
-/*
366
- FPSR bit field FCC1 | FCC0:
367
- 0 =
368
- 1 <
369
- 2 >
370
- 3 unordered
371
-*/
372
-static void gen_mov_reg_FCC0(TCGv reg, TCGv src,
373
- unsigned int fcc_offset)
374
-{
375
- tcg_gen_shri_tl(reg, src, FSR_FCC0_SHIFT + fcc_offset);
376
- tcg_gen_andi_tl(reg, reg, 0x1);
377
-}
378
-
379
-static void gen_mov_reg_FCC1(TCGv reg, TCGv src, unsigned int fcc_offset)
380
-{
381
- tcg_gen_shri_tl(reg, src, FSR_FCC1_SHIFT + fcc_offset);
382
- tcg_gen_andi_tl(reg, reg, 0x1);
383
-}
384
-
385
-// !0: FCC0 | FCC1
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
{
508
/*
509
@@ -XXX,XX +XXX,XX @@ static void gen_compare(DisasCompare *cmp, bool xcc, unsigned int cond,
510
511
static void gen_fcompare(DisasCompare *cmp, unsigned int cc, unsigned int cond)
512
{
513
- unsigned int offset;
514
- TCGv r_dst, fsr;
515
+ TCGv_i32 fcc = cpu_fcc[cc];
516
+ TCGv_i32 c1 = fcc;
517
+ int c2 = 0;
518
+ TCGCond tcond;
519
520
- /* For now we still generate a straight boolean result. */
521
- cmp->cond = TCG_COND_NE;
522
- cmp->c1 = r_dst = tcg_temp_new();
523
- cmp->c2 = 0;
524
-
525
- switch (cc) {
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
}
578
-
579
- fsr = tcg_temp_new();
580
- tcg_gen_ld_tl(fsr, tcg_env, offsetof(CPUSPARCState, fsr));
581
- switch (cond) {
582
- case 0x0:
583
- gen_op_eval_bn(r_dst);
584
- break;
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
+
634
+ cmp->cond = tcond;
635
+ cmp->c2 = c2;
636
+ cmp->c1 = tcg_temp_new();
637
+ tcg_gen_extu_i32_tl(cmp->c1, c1);
638
}
639
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;
792
}
793
794
-static bool do_ldfsr(DisasContext *dc, arg_r_r_ri *a, MemOp mop,
795
- target_ulong new_mask, target_ulong old_mask)
796
+static bool trans_LDFSR(DisasContext *dc, arg_r_r_ri *a)
797
{
798
TCGv addr = gen_ldst_addr(dc, a->rs1, a->imm, a->rs2_or_imm);
799
- TCGv tnew, told;
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;
807
}
808
- tnew = tcg_temp_new();
809
- told = tcg_temp_new();
810
- tcg_gen_qemu_ld_tl(tnew, addr, dc->mem_idx, mop | MO_ALIGN);
811
- tcg_gen_ld_tl(told, tcg_env, offsetof(CPUSPARCState, fsr));
812
- tcg_gen_andi_tl(tnew, tnew, new_mask);
813
- tcg_gen_andi_tl(told, told, old_mask);
814
- tcg_gen_or_tl(tnew, tnew, told);
815
- gen_helper_set_fsr_noftt(tcg_env, tnew);
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
}
873
return advance_pc(dc);
874
}
875
@@ -XXX,XX +XXX,XX @@ static bool do_fcmpd(DisasContext *dc, arg_FCMPd *a, bool e)
876
src1 = gen_load_fpr_D(dc, a->rs1);
877
src2 = gen_load_fpr_D(dc, a->rs2);
878
if (e) {
879
- gen_op_fcmped(a->cc, src1, src2);
880
+ gen_helper_fcmped(cpu_fcc[a->cc], tcg_env, src1, src2);
881
} else {
882
- gen_op_fcmpd(a->cc, src1, src2);
883
+ gen_helper_fcmpd(cpu_fcc[a->cc], tcg_env, src1, src2);
884
}
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
--
942
2.34.1
diff view generated by jsdifflib
Deleted patch
1
These macros are no longer used.
2
1
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
---
8
target/sparc/cpu.h | 7 -------
9
1 file changed, 7 deletions(-)
10
11
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
12
index XXXXXXX..XXXXXXX 100644
13
--- a/target/sparc/cpu.h
14
+++ b/target/sparc/cpu.h
15
@@ -XXX,XX +XXX,XX @@ enum {
16
#define FSR_FTT1 (1ULL << 15)
17
#define FSR_FTT0 (1ULL << 14)
18
#define FSR_FTT_MASK (FSR_FTT2 | FSR_FTT1 | FSR_FTT0)
19
-#ifdef TARGET_SPARC64
20
-#define FSR_FTT_NMASK 0xfffffffffffe3fffULL
21
-#define FSR_FTT_CEXC_NMASK 0xfffffffffffe3fe0ULL
22
-#else
23
-#define FSR_FTT_NMASK 0xfffe3fffULL
24
-#define FSR_FTT_CEXC_NMASK 0xfffe3fe0ULL
25
-#endif
26
#define FSR_FTT_IEEE_EXCP (1ULL << 14)
27
#define FSR_FTT_UNIMPFPOP (3ULL << 14)
28
#define FSR_FTT_SEQ_ERROR (4ULL << 14)
29
--
30
2.34.1
diff view generated by jsdifflib