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 |