[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v5 36/54] tcg: Introduce tcg_out_movext3
From: |
Peter Maydell |
Subject: |
Re: [PATCH v5 36/54] tcg: Introduce tcg_out_movext3 |
Date: |
Tue, 16 May 2023 11:03:25 +0100 |
On Mon, 15 May 2023 at 15:43, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> With x86_64 as host, we do not have any temporaries with which to
> resolve cycles, but we do have xchg. As a side bonus, the set of
> graphs that can be made with 3 nodes and all nodes conflicting is
> small: two. We can solve the cycle with a single temp.
>
> This is required for x86_64 to handle stores of i128: 1 address
> register and 2 data registers.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> static void tcg_out_helper_load_regs(TCGContext *s,
> unsigned nmov, TCGMovExtend *mov,
> - unsigned ntmp, const int *tmp)
> + const TCGLdstHelperParam *parm)
> {
> + TCGReg dst3;
> +
> switch (nmov) {
> - default:
> + case 4:
> /* The backend must have provided enough temps for the worst case. */
> - tcg_debug_assert(ntmp + 1 >= nmov);
> + tcg_debug_assert(parm->ntmp >= 2);
>
> - for (unsigned i = nmov - 1; i >= 2; --i) {
> - TCGReg dst = mov[i].dst;
> -
> - for (unsigned j = 0; j < i; ++j) {
> - if (dst == mov[j].src) {
> - /*
> - * Conflict.
> - * Copy the source to a temporary, recurse for the
> - * remaining moves, perform the extension from our
> - * scratch on the way out.
> - */
> - TCGReg scratch = tmp[--ntmp];
> - tcg_out_mov(s, mov[i].src_type, scratch, mov[i].src);
> - mov[i].src = scratch;
> -
> - tcg_out_helper_load_regs(s, i, mov, ntmp, tmp);
> - tcg_out_movext1(s, &mov[i]);
> - return;
> - }
> + dst3 = mov[3].dst;
> + for (unsigned j = 0; j < 3; ++j) {
> + if (dst3 == mov[j].src) {
> + /*
> + * Conflict. Copy the source to a temporary, perform the
> + * remaining moves, then the extension from our scratch
> + * on the way out.
> + */
> + TCGReg scratch = parm->tmp[1];
> + tcg_out_movext3(s, mov, mov + 1, mov + 2, parm->tmp[0]);
> + tcg_out_movext1_new_src(s, &mov[3], scratch);
Isn't this missing the "copy the source to a temporary" part?
I was expecting an initial tcg_out_mov() like the old code has.
> + break;
> }
> -
Otherwise
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
-- PMM
- [PATCH v5 16/54] tcg/aarch64: Use full load/store helpers in user-only mode, (continued)
- [PATCH v5 16/54] tcg/aarch64: Use full load/store helpers in user-only mode, Richard Henderson, 2023/05/15
- [PATCH v5 18/54] tcg/loongarch64: Use full load/store helpers in user-only mode, Richard Henderson, 2023/05/15
- [PATCH v5 24/54] tcg/sparc64: Allocate %g2 as a third temporary, Richard Henderson, 2023/05/15
- [PATCH v5 15/54] tcg/i386: Use full load/store helpers in user-only mode, Richard Henderson, 2023/05/15
- [PATCH v5 22/54] tcg/mips: Use full load/store helpers in user-only mode, Richard Henderson, 2023/05/15
- [PATCH v5 21/54] tcg/arm: Use full load/store helpers in user-only mode, Richard Henderson, 2023/05/15
- [PATCH v5 25/54] tcg/sparc64: Rename tcg_out_movi_imm13 to tcg_out_movi_s13, Richard Henderson, 2023/05/15
- [PATCH v5 36/54] tcg: Introduce tcg_out_movext3, Richard Henderson, 2023/05/15
- Re: [PATCH v5 36/54] tcg: Introduce tcg_out_movext3,
Peter Maydell <=
- [PATCH v5 20/54] tcg/arm: Adjust constraints on qemu_ld/st, Richard Henderson, 2023/05/15
- [PATCH v5 27/54] tcg/sparc64: Rename tcg_out_movi_imm32 to tcg_out_movi_u32, Richard Henderson, 2023/05/15
- [PATCH v5 32/54] tcg/loongarch64: Support softmmu unaligned accesses, Richard Henderson, 2023/05/15
- [PATCH v5 26/54] target/sparc64: Remove tcg_out_movi_s13 case from tcg_out_movi_imm32, Richard Henderson, 2023/05/15
- [PATCH v5 39/54] tcg: Introduce atom_and_align_for_opc, Richard Henderson, 2023/05/15