Message ID | 20240527211912.14060-12-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | tcg/loongarch64: Support v64 and v256 | expand |
在 2024/5/28 上午5:19, Richard Henderson 写道: > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > tcg/loongarch64/tcg-target.c.inc | 29 +++++++++++++++-------------- > 1 file changed, 15 insertions(+), 14 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 c7d0c7839b..47011488dd 100644 > --- a/tcg/loongarch64/tcg-target.c.inc > +++ b/tcg/loongarch64/tcg-target.c.inc > @@ -1774,33 +1774,34 @@ static void tcg_out_addsub_vec(TCGContext *s, unsigned vece, const TCGArg a0, > static const LoongArchInsn sub_vec_imm_insn[4] = { > OPC_VSUBI_BU, OPC_VSUBI_HU, OPC_VSUBI_WU, OPC_VSUBI_DU > }; > + LoongArchInsn insn; > > if (a2_is_const) { > int64_t value = sextract64(a2, 0, 8 << vece); > + > if (!is_add) { > value = -value; > } > - > - /* Try vaddi/vsubi */ > - if (0 <= value && value <= 0x1f) { > - tcg_out32(s, encode_vdvjuk5_insn(add_vec_imm_insn[vece], a0, \ > - a1, value)); > - return; > - } else if (-0x1f <= value && value < 0) { > - tcg_out32(s, encode_vdvjuk5_insn(sub_vec_imm_insn[vece], a0, \ > - a1, -value)); > - return; > + if (value < 0) { > + insn = sub_vec_imm_insn[vece]; > + value = -value; > + } else { > + insn = add_vec_imm_insn[vece]; > } > > - /* constraint TCG_CT_CONST_VADD ensures unreachable */ > - g_assert_not_reached(); > + /* Constraint TCG_CT_CONST_VADD ensures validity. */ > + tcg_debug_assert(0 <= value && value <= 0x1f); > + > + tcg_out32(s, encode_vdvjuk5_insn(insn, a0, a1, value)); > + return; > } > > if (is_add) { > - tcg_out32(s, encode_vdvjvk_insn(add_vec_insn[vece], a0, a1, a2)); > + insn = add_vec_insn[vece]; > } else { > - tcg_out32(s, encode_vdvjvk_insn(sub_vec_insn[vece], a0, a1, a2)); > + insn = sub_vec_insn[vece]; > } > + tcg_out32(s, encode_vdvjvk_insn(insn, a0, a1, a2)); > } > > static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
diff --git a/tcg/loongarch64/tcg-target.c.inc b/tcg/loongarch64/tcg-target.c.inc index c7d0c7839b..47011488dd 100644 --- a/tcg/loongarch64/tcg-target.c.inc +++ b/tcg/loongarch64/tcg-target.c.inc @@ -1774,33 +1774,34 @@ static void tcg_out_addsub_vec(TCGContext *s, unsigned vece, const TCGArg a0, static const LoongArchInsn sub_vec_imm_insn[4] = { OPC_VSUBI_BU, OPC_VSUBI_HU, OPC_VSUBI_WU, OPC_VSUBI_DU }; + LoongArchInsn insn; if (a2_is_const) { int64_t value = sextract64(a2, 0, 8 << vece); + if (!is_add) { value = -value; } - - /* Try vaddi/vsubi */ - if (0 <= value && value <= 0x1f) { - tcg_out32(s, encode_vdvjuk5_insn(add_vec_imm_insn[vece], a0, \ - a1, value)); - return; - } else if (-0x1f <= value && value < 0) { - tcg_out32(s, encode_vdvjuk5_insn(sub_vec_imm_insn[vece], a0, \ - a1, -value)); - return; + if (value < 0) { + insn = sub_vec_imm_insn[vece]; + value = -value; + } else { + insn = add_vec_imm_insn[vece]; } - /* constraint TCG_CT_CONST_VADD ensures unreachable */ - g_assert_not_reached(); + /* Constraint TCG_CT_CONST_VADD ensures validity. */ + tcg_debug_assert(0 <= value && value <= 0x1f); + + tcg_out32(s, encode_vdvjuk5_insn(insn, a0, a1, value)); + return; } if (is_add) { - tcg_out32(s, encode_vdvjvk_insn(add_vec_insn[vece], a0, a1, a2)); + insn = add_vec_insn[vece]; } else { - tcg_out32(s, encode_vdvjvk_insn(sub_vec_insn[vece], a0, a1, a2)); + insn = sub_vec_insn[vece]; } + tcg_out32(s, encode_vdvjvk_insn(insn, a0, a1, a2)); } static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- tcg/loongarch64/tcg-target.c.inc | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-)