This patch includes: - XVNEG.{B/H/W/D}. Signed-off-by: Song Gao <gaos...@loongson.cn> --- target/loongarch/disas.c | 10 ++++++++++ target/loongarch/insn_trans/trans_lasx.c.inc | 5 +++++ target/loongarch/insn_trans/trans_lsx.c.inc | 12 ++++++------ target/loongarch/insns.decode | 10 +++++----- 4 files changed, 26 insertions(+), 11 deletions(-)
diff --git a/target/loongarch/disas.c b/target/loongarch/disas.c index f59e3cebf0..4e26d49acc 100644 --- a/target/loongarch/disas.c +++ b/target/loongarch/disas.c @@ -1713,6 +1713,11 @@ static void output_vv_i_x(DisasContext *ctx, arg_vv_i *a, const char *mnemonic) output(ctx, mnemonic, "x%d, x%d, 0x%x", a->vd, a->vj, a->imm); } +static void output_vv_x(DisasContext *ctx, arg_vv *a, const char *mnemonic) +{ + output(ctx, mnemonic, "x%d, x%d", a->vd, a->vj); +} + static void output_vr_x(DisasContext *ctx, arg_vr *a, const char *mnemonic) { output(ctx, mnemonic, "x%d, r%d", a->vd, a->rj); @@ -1738,6 +1743,11 @@ INSN_LASX(xvsubi_hu, vv_i) INSN_LASX(xvsubi_wu, vv_i) INSN_LASX(xvsubi_du, vv_i) +INSN_LASX(xvneg_b, vv) +INSN_LASX(xvneg_h, vv) +INSN_LASX(xvneg_w, vv) +INSN_LASX(xvneg_d, vv) + INSN_LASX(xvreplgr2vr_b, vr) INSN_LASX(xvreplgr2vr_h, vr) INSN_LASX(xvreplgr2vr_w, vr) diff --git a/target/loongarch/insn_trans/trans_lasx.c.inc b/target/loongarch/insn_trans/trans_lasx.c.inc index 93932593a5..0c7d2bbffd 100644 --- a/target/loongarch/insn_trans/trans_lasx.c.inc +++ b/target/loongarch/insn_trans/trans_lasx.c.inc @@ -56,6 +56,11 @@ TRANS(xvsubi_hu, gvec_subi, 32, MO_16) TRANS(xvsubi_wu, gvec_subi, 32, MO_32) TRANS(xvsubi_du, gvec_subi, 32, MO_64) +TRANS(xvneg_b, gvec_vv, 32, MO_8, tcg_gen_gvec_neg) +TRANS(xvneg_h, gvec_vv, 32, MO_16, tcg_gen_gvec_neg) +TRANS(xvneg_w, gvec_vv, 32, MO_32, tcg_gen_gvec_neg) +TRANS(xvneg_d, gvec_vv, 32, MO_64, tcg_gen_gvec_neg) + TRANS(xvreplgr2vr_b, gvec_dup, 32, MO_8) TRANS(xvreplgr2vr_h, gvec_dup, 32, MO_16) TRANS(xvreplgr2vr_w, gvec_dup, 32, MO_32) diff --git a/target/loongarch/insn_trans/trans_lsx.c.inc b/target/loongarch/insn_trans/trans_lsx.c.inc index b95a2dffda..a1370b90e6 100644 --- a/target/loongarch/insn_trans/trans_lsx.c.inc +++ b/target/loongarch/insn_trans/trans_lsx.c.inc @@ -81,7 +81,7 @@ static bool gvec_vvv(DisasContext *ctx, arg_vvv *a, uint32_t oprsz, MemOp mop, return true; } -static bool gvec_vv(DisasContext *ctx, arg_vv *a, MemOp mop, +static bool gvec_vv(DisasContext *ctx, arg_vv *a, uint32_t oprsz, MemOp mop, void (*func)(unsigned, uint32_t, uint32_t, uint32_t, uint32_t)) { @@ -92,7 +92,7 @@ static bool gvec_vv(DisasContext *ctx, arg_vv *a, MemOp mop, vd_ofs = vec_full_offset(a->vd); vj_ofs = vec_full_offset(a->vj); - func(mop, vd_ofs, vj_ofs, 16, ctx->vl/8); + func(mop, vd_ofs, vj_ofs, oprsz, ctx->vl / 8); return true; } @@ -173,10 +173,10 @@ TRANS(vsubi_hu, gvec_subi, 16, MO_16) TRANS(vsubi_wu, gvec_subi, 16, MO_32) TRANS(vsubi_du, gvec_subi, 16, MO_64) -TRANS(vneg_b, gvec_vv, MO_8, tcg_gen_gvec_neg) -TRANS(vneg_h, gvec_vv, MO_16, tcg_gen_gvec_neg) -TRANS(vneg_w, gvec_vv, MO_32, tcg_gen_gvec_neg) -TRANS(vneg_d, gvec_vv, MO_64, tcg_gen_gvec_neg) +TRANS(vneg_b, gvec_vv, 16, MO_8, tcg_gen_gvec_neg) +TRANS(vneg_h, gvec_vv, 16, MO_16, tcg_gen_gvec_neg) +TRANS(vneg_w, gvec_vv, 16, MO_32, tcg_gen_gvec_neg) +TRANS(vneg_d, gvec_vv, 16, MO_64, tcg_gen_gvec_neg) TRANS(vsadd_b, gvec_vvv, 16, MO_8, tcg_gen_gvec_ssadd) TRANS(vsadd_h, gvec_vvv, 16, MO_16, tcg_gen_gvec_ssadd) diff --git a/target/loongarch/insns.decode b/target/loongarch/insns.decode index 963d0f567a..759172628f 100644 --- a/target/loongarch/insns.decode +++ b/target/loongarch/insns.decode @@ -1311,11 +1311,6 @@ xvsub_w 0111 01000000 11010 ..... ..... ..... @vvv xvsub_d 0111 01000000 11011 ..... ..... ..... @vvv xvsub_q 0111 01010010 11011 ..... ..... ..... @vvv -xvreplgr2vr_b 0111 01101001 11110 00000 ..... ..... @vr -xvreplgr2vr_h 0111 01101001 11110 00001 ..... ..... @vr -xvreplgr2vr_w 0111 01101001 11110 00010 ..... ..... @vr -xvreplgr2vr_d 0111 01101001 11110 00011 ..... ..... @vr - xvaddi_bu 0111 01101000 10100 ..... ..... ..... @vv_ui5 xvaddi_hu 0111 01101000 10101 ..... ..... ..... @vv_ui5 xvaddi_wu 0111 01101000 10110 ..... ..... ..... @vv_ui5 @@ -1325,6 +1320,11 @@ xvsubi_hu 0111 01101000 11001 ..... ..... ..... @vv_ui5 xvsubi_wu 0111 01101000 11010 ..... ..... ..... @vv_ui5 xvsubi_du 0111 01101000 11011 ..... ..... ..... @vv_ui5 +xvneg_b 0111 01101001 11000 01100 ..... ..... @vv +xvneg_h 0111 01101001 11000 01101 ..... ..... @vv +xvneg_w 0111 01101001 11000 01110 ..... ..... @vv +xvneg_d 0111 01101001 11000 01111 ..... ..... @vv + xvreplgr2vr_b 0111 01101001 11110 00000 ..... ..... @vr xvreplgr2vr_h 0111 01101001 11110 00001 ..... ..... @vr xvreplgr2vr_w 0111 01101001 11110 00010 ..... ..... @vr -- 2.39.1