1
The following changes since commit 7e1c0047015ffbd408e1aa4a5ec1abe4751dbf7e:
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 'migration-20240522-pull-request' of https://gitlab.com/farosas/qemu into staging (2024-05-22 15:32:25 -0700)
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-20240523
12
https://gitlab.com/rth7680/qemu.git tags/pull-tcg-20241212
8
13
9
for you to fetch changes up to bfd43cccab9fb77b8405ca556fc2f2ed3b2920a3:
14
for you to fetch changes up to 7ac87b14a92234b6a89b701b4043ad6cf8bdcccf:
10
15
11
accel/tcg: Init tb size and icount before plugin_gen_tb_end (2024-05-22 19:05:26 -0700)
16
target/sparc: Use memcpy() and remove memcpy32() (2024-12-12 14:28:38 -0600)
12
17
13
----------------------------------------------------------------
18
----------------------------------------------------------------
14
tcg: Introduce TCG_TARGET_HAS_tst_vec
19
tcg: Reset free_temps before tcg_optimize
15
accel/tcg: Init tb size and icount before plugin_gen_tb_end
20
tcg/riscv: Fix StoreStore barrier generation
21
include/exec: Introduce fpst alias in helper-head.h.inc
22
target/sparc: Use memcpy() and remove memcpy32()
16
23
17
----------------------------------------------------------------
24
----------------------------------------------------------------
18
Richard Henderson (5):
25
Philippe Mathieu-Daudé (1):
19
tcg: Introduce TCG_TARGET_HAS_tst_vec
26
target/sparc: Use memcpy() and remove memcpy32()
20
tcg: Expand TCG_COND_TST* if not TCG_TARGET_HAS_tst_vec
21
tcg/aarch64: Support TCG_TARGET_HAS_tst_vec
22
tcg/arm: Support TCG_TARGET_HAS_tst_vec
23
accel/tcg: Init tb size and icount before plugin_gen_tb_end
24
27
25
include/tcg/tcg.h | 1 +
28
Richard Henderson (2):
26
tcg/aarch64/tcg-target.h | 1 +
29
tcg: Reset free_temps before tcg_optimize
27
tcg/arm/tcg-target.h | 1 +
30
include/exec: Introduce fpst alias in helper-head.h.inc
28
tcg/i386/tcg-target.h | 1 +
31
29
tcg/loongarch64/tcg-target.h | 1 +
32
Roman Artemev (1):
30
tcg/ppc/tcg-target.h | 1 +
33
tcg/riscv: Fix StoreStore barrier generation
31
tcg/s390x/tcg-target.h | 1 +
34
32
accel/tcg/translator.c | 8 ++++----
35
include/tcg/tcg-temp-internal.h | 6 ++++++
33
tcg/tcg-op-vec.c | 18 ++++++++++++++++++
36
accel/tcg/plugin-gen.c | 2 +-
34
tcg/aarch64/tcg-target.c.inc | 26 ++++++++++++++++++++++++--
37
target/sparc/win_helper.c | 26 ++++++++------------------
35
tcg/arm/tcg-target.c.inc | 23 ++++++++++++++++++++---
38
tcg/tcg.c | 5 ++++-
36
11 files changed, 73 insertions(+), 9 deletions(-)
39
include/exec/helper-head.h.inc | 3 +++
40
tcg/riscv/tcg-target.c.inc | 2 +-
41
6 files changed, 23 insertions(+), 21 deletions(-)
42
diff view generated by jsdifflib
1
When passing disassembly data to plugin callbacks,
1
When allocating new temps during tcg_optmize, do not re-use
2
translator_st_len relies on db->tb->size having been set.
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.
3
4
4
Fixes: 4c833c60e047 ("disas: Use translator_st to get disassembly data")
5
Introduce tcg_temp_ebb_reset_freed and use before tcg_optimize,
5
Reported-by: Bernhard Beschow <shentey@gmail.com>
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>
6
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
13
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
7
Tested-by: Bernhard Beschow <shentey@gmail.com>
8
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
14
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
15
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
---
16
---
10
accel/tcg/translator.c | 8 ++++----
17
include/tcg/tcg-temp-internal.h | 6 ++++++
11
1 file changed, 4 insertions(+), 4 deletions(-)
18
accel/tcg/plugin-gen.c | 2 +-
19
tcg/tcg.c | 5 ++++-
20
3 files changed, 11 insertions(+), 2 deletions(-)
12
21
13
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
22
diff --git a/include/tcg/tcg-temp-internal.h b/include/tcg/tcg-temp-internal.h
14
index XXXXXXX..XXXXXXX 100644
23
index XXXXXXX..XXXXXXX 100644
15
--- a/accel/tcg/translator.c
24
--- a/include/tcg/tcg-temp-internal.h
16
+++ b/accel/tcg/translator.c
25
+++ b/include/tcg/tcg-temp-internal.h
17
@@ -XXX,XX +XXX,XX @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
26
@@ -XXX,XX +XXX,XX @@ TCGv_i64 tcg_temp_ebb_new_i64(void);
18
set_can_do_io(db, true);
27
TCGv_ptr tcg_temp_ebb_new_ptr(void);
19
tcg_ctx->emit_before_op = NULL;
28
TCGv_i128 tcg_temp_ebb_new_i128(void);
20
29
21
+ /* May be used by disas_log or plugin callbacks. */
30
+/* Forget all freed EBB temps, so that new allocations produce new temps. */
22
+ tb->size = db->pc_next - db->pc_first;
31
+static inline void tcg_temp_ebb_reset_freed(TCGContext *s)
23
+ tb->icount = db->num_insns;
32
+{
33
+ memset(s->free_temps, 0, sizeof(s->free_temps));
34
+}
24
+
35
+
25
if (plugin_enabled) {
36
#endif /* TCG_TEMP_FREE_H */
26
plugin_gen_tb_end(cpu, db->num_insns);
37
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
38
index XXXXXXX..XXXXXXX 100644
39
--- a/accel/tcg/plugin-gen.c
40
+++ b/accel/tcg/plugin-gen.c
41
@@ -XXX,XX +XXX,XX @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
42
* that might be live within the existing opcode stream.
43
* The simplest solution is to release them all and create new.
44
*/
45
- memset(tcg_ctx->free_temps, 0, sizeof(tcg_ctx->free_temps));
46
+ tcg_temp_ebb_reset_freed(tcg_ctx);
47
48
QTAILQ_FOREACH_SAFE(op, &tcg_ctx->ops, link, next) {
49
switch (op->opc) {
50
diff --git a/tcg/tcg.c b/tcg/tcg.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/tcg/tcg.c
53
+++ b/tcg/tcg.c
54
@@ -XXX,XX +XXX,XX @@ void tcg_func_start(TCGContext *s)
55
s->nb_temps = s->nb_globals;
56
57
/* No temps have been previously allocated for size or locality. */
58
- memset(s->free_temps, 0, sizeof(s->free_temps));
59
+ tcg_temp_ebb_reset_freed(s);
60
61
/* No constant temps have been previously allocated. */
62
for (int i = 0; i < TCG_TYPE_COUNT; ++i) {
63
@@ -XXX,XX +XXX,XX @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb, uint64_t pc_start)
27
}
64
}
28
65
#endif
29
- /* The disas_log hook may use these values rather than recompute. */
66
30
- tb->size = db->pc_next - db->pc_first;
67
+ /* Do not reuse any EBB that may be allocated within the TB. */
31
- tb->icount = db->num_insns;
68
+ tcg_temp_ebb_reset_freed(s);
32
-
69
+
33
if (qemu_loglevel_mask(CPU_LOG_TB_IN_ASM)
70
tcg_optimize(s);
34
&& qemu_log_in_addr_range(db->pc_first)) {
71
35
FILE *logfile = qemu_log_trylock();
72
reachable_code_pass(s);
36
--
73
--
37
2.34.1
74
2.43.0
75
76
diff view generated by jsdifflib
1
From: Roman Artemev <roman.artemev@syntacore.com>
2
3
On RISC-V to StoreStore barrier corresponds
4
`fence w, w` not `fence r, r`
5
6
Cc: qemu-stable@nongnu.org
7
Fixes: efbea94c76b ("tcg/riscv: Add slowpath load and store instructions")
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>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
12
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
---
13
---
3
tcg/arm/tcg-target.h | 2 +-
14
tcg/riscv/tcg-target.c.inc | 2 +-
4
tcg/arm/tcg-target.c.inc | 23 ++++++++++++++++++++---
15
1 file changed, 1 insertion(+), 1 deletion(-)
5
2 files changed, 21 insertions(+), 4 deletions(-)
6
16
7
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
17
diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
8
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/arm/tcg-target.h
19
--- a/tcg/riscv/tcg-target.c.inc
10
+++ b/tcg/arm/tcg-target.h
20
+++ b/tcg/riscv/tcg-target.c.inc
11
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
21
@@ -XXX,XX +XXX,XX @@ static void tcg_out_mb(TCGContext *s, TCGArg a0)
12
#define TCG_TARGET_HAS_minmax_vec 1
22
insn |= 0x02100000;
13
#define TCG_TARGET_HAS_bitsel_vec 1
23
}
14
#define TCG_TARGET_HAS_cmpsel_vec 0
24
if (a0 & TCG_MO_ST_ST) {
15
-#define TCG_TARGET_HAS_tst_vec 0
25
- insn |= 0x02200000;
16
+#define TCG_TARGET_HAS_tst_vec 1
26
+ insn |= 0x01100000;
17
27
}
18
#define TCG_TARGET_DEFAULT_MO (0)
28
tcg_out32(s, insn);
19
#define TCG_TARGET_NEED_LDST_LABELS
29
}
20
diff --git a/tcg/arm/tcg-target.c.inc b/tcg/arm/tcg-target.c.inc
21
index XXXXXXX..XXXXXXX 100644
22
--- a/tcg/arm/tcg-target.c.inc
23
+++ b/tcg/arm/tcg-target.c.inc
24
@@ -XXX,XX +XXX,XX @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
25
case INDEX_op_cmp_vec:
26
{
27
TCGCond cond = args[3];
28
+ ARMInsn insn;
29
30
- if (cond == TCG_COND_NE) {
31
+ switch (cond) {
32
+ case TCG_COND_NE:
33
if (const_args[2]) {
34
tcg_out_vreg3(s, INSN_VTST, q, vece, a0, a1, a1);
35
} else {
36
tcg_out_vreg3(s, INSN_VCEQ, q, vece, a0, a1, a2);
37
tcg_out_vreg2(s, INSN_VMVN, q, 0, a0, a0);
38
}
39
- } else {
40
- ARMInsn insn;
41
+ break;
42
43
+ case TCG_COND_TSTNE:
44
+ case TCG_COND_TSTEQ:
45
+ if (const_args[2]) {
46
+ /* (x & 0) == 0 */
47
+ tcg_out_dupi_vec(s, type, MO_8, a0,
48
+ -(cond == TCG_COND_TSTEQ));
49
+ break;
50
+ }
51
+ tcg_out_vreg3(s, INSN_VTST, q, vece, a0, a1, a2);
52
+ if (cond == TCG_COND_TSTEQ) {
53
+ tcg_out_vreg2(s, INSN_VMVN, q, 0, a0, a0);
54
+ }
55
+ break;
56
+
57
+ default:
58
if (const_args[2]) {
59
insn = vec_cmp0_insn[cond];
60
if (insn) {
61
@@ -XXX,XX +XXX,XX @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
62
tcg_debug_assert(insn != 0);
63
}
64
tcg_out_vreg3(s, insn, q, vece, a0, a1, a2);
65
+ break;
66
}
67
}
68
return;
69
--
30
--
70
2.34.1
31
2.43.0
diff view generated by jsdifflib
1
Prelude to supporting TCG_COND_TST* in vector comparisons.
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/tcg/tcg.h | 1 +
7
include/exec/helper-head.h.inc | 3 +++
7
tcg/aarch64/tcg-target.h | 1 +
8
1 file changed, 3 insertions(+)
8
tcg/arm/tcg-target.h | 1 +
9
tcg/i386/tcg-target.h | 1 +
10
tcg/loongarch64/tcg-target.h | 1 +
11
tcg/ppc/tcg-target.h | 1 +
12
tcg/s390x/tcg-target.h | 1 +
13
7 files changed, 7 insertions(+)
14
9
15
diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
10
diff --git a/include/exec/helper-head.h.inc b/include/exec/helper-head.h.inc
16
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
17
--- a/include/tcg/tcg.h
12
--- a/include/exec/helper-head.h.inc
18
+++ b/include/tcg/tcg.h
13
+++ b/include/exec/helper-head.h.inc
19
@@ -XXX,XX +XXX,XX @@ typedef uint64_t TCGRegSet;
14
@@ -XXX,XX +XXX,XX @@
20
#define TCG_TARGET_HAS_minmax_vec 0
15
#define dh_alias_ptr ptr
21
#define TCG_TARGET_HAS_bitsel_vec 0
16
#define dh_alias_cptr ptr
22
#define TCG_TARGET_HAS_cmpsel_vec 0
17
#define dh_alias_env ptr
23
+#define TCG_TARGET_HAS_tst_vec 0
18
+#define dh_alias_fpst ptr
24
#else
19
#define dh_alias_void void
25
#define TCG_TARGET_MAYBE_vec 1
20
#define dh_alias_noreturn noreturn
26
#endif
21
#define dh_alias(t) glue(dh_alias_, t)
27
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
22
@@ -XXX,XX +XXX,XX @@
28
index XXXXXXX..XXXXXXX 100644
23
#define dh_ctype_ptr void *
29
--- a/tcg/aarch64/tcg-target.h
24
#define dh_ctype_cptr const void *
30
+++ b/tcg/aarch64/tcg-target.h
25
#define dh_ctype_env CPUArchState *
31
@@ -XXX,XX +XXX,XX @@ typedef enum {
26
+#define dh_ctype_fpst float_status *
32
#define TCG_TARGET_HAS_minmax_vec 1
27
#define dh_ctype_void void
33
#define TCG_TARGET_HAS_bitsel_vec 1
28
#define dh_ctype_noreturn G_NORETURN void
34
#define TCG_TARGET_HAS_cmpsel_vec 0
29
#define dh_ctype(t) dh_ctype_##t
35
+#define TCG_TARGET_HAS_tst_vec 0
30
@@ -XXX,XX +XXX,XX @@
36
31
#define dh_typecode_f64 dh_typecode_i64
37
#define TCG_TARGET_DEFAULT_MO (0)
32
#define dh_typecode_cptr dh_typecode_ptr
38
#define TCG_TARGET_NEED_LDST_LABELS
33
#define dh_typecode_env dh_typecode_ptr
39
diff --git a/tcg/arm/tcg-target.h b/tcg/arm/tcg-target.h
34
+#define dh_typecode_fpst dh_typecode_ptr
40
index XXXXXXX..XXXXXXX 100644
35
#define dh_typecode(t) dh_typecode_##t
41
--- a/tcg/arm/tcg-target.h
36
42
+++ b/tcg/arm/tcg-target.h
37
#define dh_callflag_i32 0
43
@@ -XXX,XX +XXX,XX @@ extern bool use_neon_instructions;
44
#define TCG_TARGET_HAS_minmax_vec 1
45
#define TCG_TARGET_HAS_bitsel_vec 1
46
#define TCG_TARGET_HAS_cmpsel_vec 0
47
+#define TCG_TARGET_HAS_tst_vec 0
48
49
#define TCG_TARGET_DEFAULT_MO (0)
50
#define TCG_TARGET_NEED_LDST_LABELS
51
diff --git a/tcg/i386/tcg-target.h b/tcg/i386/tcg-target.h
52
index XXXXXXX..XXXXXXX 100644
53
--- a/tcg/i386/tcg-target.h
54
+++ b/tcg/i386/tcg-target.h
55
@@ -XXX,XX +XXX,XX @@ typedef enum {
56
#define TCG_TARGET_HAS_minmax_vec 1
57
#define TCG_TARGET_HAS_bitsel_vec have_avx512vl
58
#define TCG_TARGET_HAS_cmpsel_vec -1
59
+#define TCG_TARGET_HAS_tst_vec 0
60
61
#define TCG_TARGET_deposit_i32_valid(ofs, len) \
62
(((ofs) == 0 && ((len) == 8 || (len) == 16)) || \
63
diff --git a/tcg/loongarch64/tcg-target.h b/tcg/loongarch64/tcg-target.h
64
index XXXXXXX..XXXXXXX 100644
65
--- a/tcg/loongarch64/tcg-target.h
66
+++ b/tcg/loongarch64/tcg-target.h
67
@@ -XXX,XX +XXX,XX @@ typedef enum {
68
#define TCG_TARGET_HAS_minmax_vec 1
69
#define TCG_TARGET_HAS_bitsel_vec 1
70
#define TCG_TARGET_HAS_cmpsel_vec 0
71
+#define TCG_TARGET_HAS_tst_vec 0
72
73
#define TCG_TARGET_DEFAULT_MO (0)
74
75
diff --git a/tcg/ppc/tcg-target.h b/tcg/ppc/tcg-target.h
76
index XXXXXXX..XXXXXXX 100644
77
--- a/tcg/ppc/tcg-target.h
78
+++ b/tcg/ppc/tcg-target.h
79
@@ -XXX,XX +XXX,XX @@ typedef enum {
80
#define TCG_TARGET_HAS_minmax_vec 1
81
#define TCG_TARGET_HAS_bitsel_vec have_vsx
82
#define TCG_TARGET_HAS_cmpsel_vec 0
83
+#define TCG_TARGET_HAS_tst_vec 0
84
85
#define TCG_TARGET_DEFAULT_MO (0)
86
#define TCG_TARGET_NEED_LDST_LABELS
87
diff --git a/tcg/s390x/tcg-target.h b/tcg/s390x/tcg-target.h
88
index XXXXXXX..XXXXXXX 100644
89
--- a/tcg/s390x/tcg-target.h
90
+++ b/tcg/s390x/tcg-target.h
91
@@ -XXX,XX +XXX,XX @@ extern uint64_t s390_facilities[3];
92
#define TCG_TARGET_HAS_minmax_vec 1
93
#define TCG_TARGET_HAS_bitsel_vec 1
94
#define TCG_TARGET_HAS_cmpsel_vec 0
95
+#define TCG_TARGET_HAS_tst_vec 0
96
97
/* used for function call generation */
98
#define TCG_TARGET_STACK_ALIGN        8
99
--
38
--
100
2.34.1
39
2.43.0
101
40
102
41
diff view generated by jsdifflib
Deleted patch
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
---
3
tcg/tcg-op-vec.c | 18 ++++++++++++++++++
4
1 file changed, 18 insertions(+)
5
1
6
diff --git a/tcg/tcg-op-vec.c b/tcg/tcg-op-vec.c
7
index XXXXXXX..XXXXXXX 100644
8
--- a/tcg/tcg-op-vec.c
9
+++ b/tcg/tcg-op-vec.c
10
@@ -XXX,XX +XXX,XX @@ void tcg_gen_cmp_vec(TCGCond cond, unsigned vece,
11
TCGTemp *rt = tcgv_vec_temp(r);
12
TCGTemp *at = tcgv_vec_temp(a);
13
TCGTemp *bt = tcgv_vec_temp(b);
14
+ TCGTemp *tt = NULL;
15
TCGArg ri = temp_arg(rt);
16
TCGArg ai = temp_arg(at);
17
TCGArg bi = temp_arg(bt);
18
+ TCGArg ti;
19
TCGType type = rt->base_type;
20
int can;
21
22
@@ -XXX,XX +XXX,XX @@ void tcg_gen_cmp_vec(TCGCond cond, unsigned vece,
23
tcg_debug_assert(bt->base_type >= type);
24
tcg_assert_listed_vecop(INDEX_op_cmp_vec);
25
can = tcg_can_emit_vec_op(INDEX_op_cmp_vec, type, vece);
26
+
27
+ if (!TCG_TARGET_HAS_tst_vec && is_tst_cond(cond)) {
28
+ tt = tcg_temp_new_internal(type, TEMP_EBB);
29
+ ti = temp_arg(tt);
30
+ vec_gen_3(INDEX_op_and_vec, type, 0, ti, ai, bi);
31
+ at = tt;
32
+ ai = ti;
33
+ bt = tcg_constant_internal(type, 0);
34
+ bi = temp_arg(bt);
35
+ cond = tcg_tst_eqne_cond(cond);
36
+ }
37
+
38
if (can > 0) {
39
vec_gen_4(INDEX_op_cmp_vec, type, vece, ri, ai, bi, cond);
40
} else {
41
@@ -XXX,XX +XXX,XX @@ void tcg_gen_cmp_vec(TCGCond cond, unsigned vece,
42
tcg_expand_vec_op(INDEX_op_cmp_vec, type, vece, ri, ai, bi, cond);
43
tcg_swap_vecop_list(hold_list);
44
}
45
+
46
+ if (tt) {
47
+ tcg_temp_free_internal(tt);
48
+ }
49
}
50
51
static bool do_op3(unsigned vece, TCGv_vec r, TCGv_vec a,
52
--
53
2.34.1
diff view generated by jsdifflib
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>
1
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
11
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
2
---
12
---
3
tcg/aarch64/tcg-target.h | 2 +-
13
target/sparc/win_helper.c | 26 ++++++++------------------
4
tcg/aarch64/tcg-target.c.inc | 26 ++++++++++++++++++++++++--
14
1 file changed, 8 insertions(+), 18 deletions(-)
5
2 files changed, 25 insertions(+), 3 deletions(-)
6
15
7
diff --git a/tcg/aarch64/tcg-target.h b/tcg/aarch64/tcg-target.h
16
diff --git a/target/sparc/win_helper.c b/target/sparc/win_helper.c
8
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
9
--- a/tcg/aarch64/tcg-target.h
18
--- a/target/sparc/win_helper.c
10
+++ b/tcg/aarch64/tcg-target.h
19
+++ b/target/sparc/win_helper.c
11
@@ -XXX,XX +XXX,XX @@ typedef enum {
20
@@ -XXX,XX +XXX,XX @@
12
#define TCG_TARGET_HAS_minmax_vec 1
21
#include "exec/helper-proto.h"
13
#define TCG_TARGET_HAS_bitsel_vec 1
22
#include "trace.h"
14
#define TCG_TARGET_HAS_cmpsel_vec 0
23
15
-#define TCG_TARGET_HAS_tst_vec 0
24
-static inline void memcpy32(target_ulong *dst, const target_ulong *src)
16
+#define TCG_TARGET_HAS_tst_vec 1
25
-{
17
26
- dst[0] = src[0];
18
#define TCG_TARGET_DEFAULT_MO (0)
27
- dst[1] = src[1];
19
#define TCG_TARGET_NEED_LDST_LABELS
28
- dst[2] = src[2];
20
diff --git a/tcg/aarch64/tcg-target.c.inc b/tcg/aarch64/tcg-target.c.inc
29
- dst[3] = src[3];
21
index XXXXXXX..XXXXXXX 100644
30
- dst[4] = src[4];
22
--- a/tcg/aarch64/tcg-target.c.inc
31
- dst[5] = src[5];
23
+++ b/tcg/aarch64/tcg-target.c.inc
32
- dst[6] = src[6];
24
@@ -XXX,XX +XXX,XX @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
33
- dst[7] = src[7];
25
TCGCond cond = args[3];
34
-}
26
AArch64Insn insn;
35
-
27
36
void cpu_set_cwp(CPUSPARCState *env, int new_cwp)
28
- if (cond == TCG_COND_NE) {
37
{
29
+ switch (cond) {
38
/* put the modified wrap registers at their proper location */
30
+ case TCG_COND_NE:
39
if (env->cwp == env->nwindows - 1) {
31
if (const_args[2]) {
40
- memcpy32(env->regbase, env->regbase + env->nwindows * 16);
32
if (is_scalar) {
41
+ memcpy(env->regbase, env->regbase + env->nwindows * 16,
33
tcg_out_insn(s, 3611, CMTST, vece, a0, a1, a1);
42
+ sizeof(env->gregs));
34
@@ -XXX,XX +XXX,XX @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
43
}
35
}
44
env->cwp = new_cwp;
36
tcg_out_insn(s, 3617, NOT, is_q, 0, a0, a0);
45
37
}
46
/* put the wrap registers at their temporary location */
38
- } else {
47
if (new_cwp == env->nwindows - 1) {
39
+ break;
48
- memcpy32(env->regbase + env->nwindows * 16, env->regbase);
40
+
49
+ memcpy(env->regbase + env->nwindows * 16, env->regbase,
41
+ case TCG_COND_TSTNE:
50
+ sizeof(env->gregs));
42
+ case TCG_COND_TSTEQ:
51
}
43
+ if (const_args[2]) {
52
env->regwptr = env->regbase + (new_cwp * 16);
44
+ /* (x & 0) == 0 */
53
}
45
+ tcg_out_dupi_vec(s, type, MO_8, a0,
54
@@ -XXX,XX +XXX,XX @@ void cpu_gl_switch_gregs(CPUSPARCState *env, uint32_t new_gl)
46
+ -(cond == TCG_COND_TSTEQ));
55
dst = get_gl_gregset(env, env->gl);
47
+ break;
56
48
+ }
57
if (src != dst) {
49
+ if (is_scalar) {
58
- memcpy32(dst, env->gregs);
50
+ tcg_out_insn(s, 3611, CMTST, vece, a0, a1, a2);
59
- memcpy32(env->gregs, src);
51
+ } else {
60
+ memcpy(dst, env->gregs, sizeof(env->gregs));
52
+ tcg_out_insn(s, 3616, CMTST, is_q, vece, a0, a1, a2);
61
+ memcpy(env->gregs, src, sizeof(env->gregs));
53
+ }
62
}
54
+ if (cond == TCG_COND_TSTEQ) {
63
}
55
+ tcg_out_insn(s, 3617, NOT, is_q, 0, a0, a0);
64
56
+ }
65
@@ -XXX,XX +XXX,XX @@ void cpu_change_pstate(CPUSPARCState *env, uint32_t new_pstate)
57
+ break;
66
/* Switch global register bank */
58
+
67
src = get_gregset(env, new_pstate_regs);
59
+ default:
68
dst = get_gregset(env, pstate_regs);
60
if (const_args[2]) {
69
- memcpy32(dst, env->gregs);
61
if (is_scalar) {
70
- memcpy32(env->gregs, src);
62
insn = cmp0_scalar_insn[cond];
71
+ memcpy(dst, env->gregs, sizeof(env->gregs));
63
@@ -XXX,XX +XXX,XX @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
72
+ memcpy(env->gregs, src, sizeof(env->gregs));
64
}
73
} else {
65
tcg_out_insn_3616(s, insn, is_q, vece, a0, a1, a2);
74
trace_win_helper_no_switch_pstate(new_pstate_regs);
66
}
75
}
67
+ break;
68
}
69
}
70
break;
71
--
76
--
72
2.34.1
77
2.43.0
78
79
diff view generated by jsdifflib