On 12/29/2025 4:47 PM, [email protected] wrote:
> From: Zhijin Zeng <[email protected]>
> 
> The RISC-V target currently uses register t6 as the destination for vsetvli 
> and
> vsetvl instructions to capture the resulting vector length (vl).
> 
> However, in the tcg_out_dupm_vec function, t6 is also used as a temporary
> register. Since tcg_out_dup_vec may emit a vsetvli or vsetvl instruction
> internally, the value previously written to t6 (e.g., by an earlier ld in
> the same translation block) can be unintentionally overwritten.
> 
> This patch reserves the t3 register to be used as the destination for vsetvli
> and vsetvl instructions.
> 
> Signed-off-by: Zhijin Zeng <[email protected]>
> ---
>  tcg/riscv/tcg-target.c.inc | 10 +++++++---
>  tcg/riscv/tcg-target.h     |  1 +
>  2 files changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/tcg/riscv/tcg-target.c.inc b/tcg/riscv/tcg-target.c.inc
> index 31b9f7d87a..359021aa76 100644
> --- a/tcg/riscv/tcg-target.c.inc
> +++ b/tcg/riscv/tcg-target.c.inc
> @@ -3022,10 +3022,12 @@ static void probe_frac_lmul_1(TCGType type, MemOp 
> vsew)
>          p->vset_insn = encode_vseti(OPC_VSETIVLI, TCG_REG_ZERO, avl, vtype);
>      } else if (lmul_eq_avl) {
>          /* rd != 0 and rs1 == 0 uses vlmax */
> -        p->vset_insn = encode_vset(OPC_VSETVLI, TCG_REG_TMP0, TCG_REG_ZERO, 
> vtype);
> +        p->vset_insn = encode_vset(OPC_VSETVLI, TCG_REG_TMP3, TCG_REG_ZERO,
> +                                   vtype);
>      } else {
> -        p->movi_insn = encode_i(OPC_ADDI, TCG_REG_TMP0, TCG_REG_ZERO, avl);
> -        p->vset_insn = encode_vset(OPC_VSETVLI, TCG_REG_ZERO, TCG_REG_TMP0, 
> vtype);
> +        p->movi_insn = encode_i(OPC_ADDI, TCG_REG_TMP3, TCG_REG_ZERO, avl);
> +        p->vset_insn = encode_vset(OPC_VSETVLI, TCG_REG_ZERO, TCG_REG_TMP3,
> +                                   vtype);
>      }
>  }
>  
> @@ -3070,6 +3072,8 @@ static void tcg_target_init(TCGContext *s)
>      tcg_regset_set_reg(s->reserved_regs, TCG_REG_TP);
>  
>      if (cpuinfo & CPUINFO_ZVE64X) {
> +        tcg_regset_set_reg(s->reserved_regs, TCG_REG_TMP3);
> +
>          switch (riscv_lg2_vlenb) {
>          case TCG_TYPE_V64:
>              tcg_target_available_regs[TCG_TYPE_V64] = ALL_VECTOR_REGS;
> diff --git a/tcg/riscv/tcg-target.h b/tcg/riscv/tcg-target.h
> index 6dc77d944b..0f2dced8e2 100644
> --- a/tcg/riscv/tcg-target.h
> +++ b/tcg/riscv/tcg-target.h
> @@ -55,6 +55,7 @@ typedef enum {
>      TCG_REG_TMP0       = TCG_REG_T6,
>      TCG_REG_TMP1       = TCG_REG_T5,
>      TCG_REG_TMP2       = TCG_REG_T4,
> +    TCG_REG_TMP3       = TCG_REG_T3,
>  } TCGReg;
>  
>  #define TCG_REG_ZERO  TCG_REG_ZERO

LGTM. :)

Thanks,
Chao

Reply via email to