Message ID | 20240527211912.14060-3-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | tcg/loongarch64: Support v64 and v256 | expand |
在 2024/5/28 上午5:18, Richard Henderson 写道: > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > tcg/loongarch64/tcg-target.c.inc | 36 +++++++++----------------------- > 1 file changed, 10 insertions(+), 26 deletions(-) Reviewed-by: Song Gao <gaosong@loongson.cn> Thanks. Song Gao > diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc > index 06ca1ab11c..b9078ac793 100644 > --- a/tcg/loongarch64/tcg-target.c.inc > +++ b/tcg/loongarch64/tcg-target.c.inc > @@ -803,6 +803,12 @@ static void tcg_out_ldst(TCGContext *s, LoongArchInsn opc, TCGReg data, > case OPC_ST_D: > tcg_out32(s, encode_djsk12_insn(opc, data, addr, imm12)); > break; > + case OPC_FLD_S: > + case OPC_FLD_D: > + case OPC_FST_S: > + case OPC_FST_D: > + tcg_out32(s, encode_fdjsk12_insn(opc, data, addr, imm12)); > + break; > default: > g_assert_not_reached(); > } > @@ -816,14 +822,14 @@ static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg dest, > if (dest < TCG_REG_V0) { > tcg_out_ldst(s, OPC_LD_W, dest, base, offset); > } else { > - tcg_out_dupm_vec(s, TCG_TYPE_I128, MO_32, dest, base, offset); > + tcg_out_ldst(s, OPC_FLD_S, dest, base, offset); > } > break; > case TCG_TYPE_I64: > if (dest < TCG_REG_V0) { > tcg_out_ldst(s, OPC_LD_D, dest, base, offset); > } else { > - tcg_out_dupm_vec(s, TCG_TYPE_I128, MO_64, dest, base, offset); > + tcg_out_ldst(s, OPC_FLD_D, dest, base, offset); > } > break; > case TCG_TYPE_V128: > @@ -847,36 +853,14 @@ static void tcg_out_st(TCGContext *s, TCGType type, TCGReg src, > if (src < TCG_REG_V0) { > tcg_out_ldst(s, OPC_ST_W, src, base, offset); > } else { > - /* TODO: Could use fst_s, fstx_s */ > - if (offset < -0x100 || offset > 0xff || (offset & 3)) { > - if (-0x800 <= offset && offset <= 0x7ff) { > - tcg_out_opc_addi_d(s, TCG_REG_TMP0, base, offset); > - } else { > - tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP0, offset); > - tcg_out_opc_add_d(s, TCG_REG_TMP0, TCG_REG_TMP0, base); > - } > - base = TCG_REG_TMP0; > - offset = 0; > - } > - tcg_out_opc_vstelm_w(s, src, base, offset, 0); > + tcg_out_ldst(s, OPC_FST_S, src, base, offset); > } > break; > case TCG_TYPE_I64: > if (src < TCG_REG_V0) { > tcg_out_ldst(s, OPC_ST_D, src, base, offset); > } else { > - /* TODO: Could use fst_d, fstx_d */ > - if (offset < -0x100 || offset > 0xff || (offset & 7)) { > - if (-0x800 <= offset && offset <= 0x7ff) { > - tcg_out_opc_addi_d(s, TCG_REG_TMP0, base, offset); > - } else { > - tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP0, offset); > - tcg_out_opc_add_d(s, TCG_REG_TMP0, TCG_REG_TMP0, base); > - } > - base = TCG_REG_TMP0; > - offset = 0; > - } > - tcg_out_opc_vstelm_d(s, src, base, offset, 0); > + tcg_out_ldst(s, OPC_FST_D, src, base, offset); > } > break; > case TCG_TYPE_V128:
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc index 06ca1ab11c..b9078ac793 100644 --- a/tcg/loongarch64/tcg-target.c.inc +++ b/tcg/loongarch64/tcg-target.c.inc @@ -803,6 +803,12 @@ static void tcg_out_ldst(TCGContext *s, LoongArchInsn opc, TCGReg data, case OPC_ST_D: tcg_out32(s, encode_djsk12_insn(opc, data, addr, imm12)); break; + case OPC_FLD_S: + case OPC_FLD_D: + case OPC_FST_S: + case OPC_FST_D: + tcg_out32(s, encode_fdjsk12_insn(opc, data, addr, imm12)); + break; default: g_assert_not_reached(); } @@ -816,14 +822,14 @@ static void tcg_out_ld(TCGContext *s, TCGType type, TCGReg dest, if (dest < TCG_REG_V0) { tcg_out_ldst(s, OPC_LD_W, dest, base, offset); } else { - tcg_out_dupm_vec(s, TCG_TYPE_I128, MO_32, dest, base, offset); + tcg_out_ldst(s, OPC_FLD_S, dest, base, offset); } break; case TCG_TYPE_I64: if (dest < TCG_REG_V0) { tcg_out_ldst(s, OPC_LD_D, dest, base, offset); } else { - tcg_out_dupm_vec(s, TCG_TYPE_I128, MO_64, dest, base, offset); + tcg_out_ldst(s, OPC_FLD_D, dest, base, offset); } break; case TCG_TYPE_V128: @@ -847,36 +853,14 @@ static void tcg_out_st(TCGContext *s, TCGType type, TCGReg src, if (src < TCG_REG_V0) { tcg_out_ldst(s, OPC_ST_W, src, base, offset); } else { - /* TODO: Could use fst_s, fstx_s */ - if (offset < -0x100 || offset > 0xff || (offset & 3)) { - if (-0x800 <= offset && offset <= 0x7ff) { - tcg_out_opc_addi_d(s, TCG_REG_TMP0, base, offset); - } else { - tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP0, offset); - tcg_out_opc_add_d(s, TCG_REG_TMP0, TCG_REG_TMP0, base); - } - base = TCG_REG_TMP0; - offset = 0; - } - tcg_out_opc_vstelm_w(s, src, base, offset, 0); + tcg_out_ldst(s, OPC_FST_S, src, base, offset); } break; case TCG_TYPE_I64: if (src < TCG_REG_V0) { tcg_out_ldst(s, OPC_ST_D, src, base, offset); } else { - /* TODO: Could use fst_d, fstx_d */ - if (offset < -0x100 || offset > 0xff || (offset & 7)) { - if (-0x800 <= offset && offset <= 0x7ff) { - tcg_out_opc_addi_d(s, TCG_REG_TMP0, base, offset); - } else { - tcg_out_movi(s, TCG_TYPE_PTR, TCG_REG_TMP0, offset); - tcg_out_opc_add_d(s, TCG_REG_TMP0, TCG_REG_TMP0, base); - } - base = TCG_REG_TMP0; - offset = 0; - } - tcg_out_opc_vstelm_d(s, src, base, offset, 0); + tcg_out_ldst(s, OPC_FST_D, src, base, offset); } break; case TCG_TYPE_V128:
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- tcg/loongarch64/tcg-target.c.inc | 36 +++++++++----------------------- 1 file changed, 10 insertions(+), 26 deletions(-)