Skip to content

Commit

Permalink
target/loongarch: Implement LASX fpu fcvt instructions
Browse files Browse the repository at this point in the history
This patch includes:
- XVFCVT{L/H}.{S.H/D.S};
- XVFCVT.{H.S/S.D};
- XVFRINT[{RNE/RZ/RP/RM}].{S/D};
- XVFTINT[{RNE/RZ/RP/RM}].{W.S/L.D};
- XVFTINT[RZ].{WU.S/LU.D};
- XVFTINT[{RNE/RZ/RP/RM}].W.D;
- XVFTINT[{RNE/RZ/RP/RM}]{L/H}.L.S;
- XVFFINT.{S.W/D.L}[U];
- X[CVFFINT.S.L, VFFINT{L/H}.D.W.

Signed-off-by: Song Gao <gaosong@loongson.cn>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20230914022645.1151356-48-gaosong@loongson.cn>
  • Loading branch information
gaosong-loongson committed Sep 20, 2023
1 parent c9caf15 commit 60df31a
Show file tree
Hide file tree
Showing 4 changed files with 315 additions and 86 deletions.
56 changes: 56 additions & 0 deletions target/loongarch/disas.c
Original file line number Diff line number Diff line change
Expand Up @@ -2286,6 +2286,62 @@ INSN_LASX(xvfrecip_d, vv)
INSN_LASX(xvfrsqrt_s, vv)
INSN_LASX(xvfrsqrt_d, vv)

INSN_LASX(xvfcvtl_s_h, vv)
INSN_LASX(xvfcvth_s_h, vv)
INSN_LASX(xvfcvtl_d_s, vv)
INSN_LASX(xvfcvth_d_s, vv)
INSN_LASX(xvfcvt_h_s, vvv)
INSN_LASX(xvfcvt_s_d, vvv)

INSN_LASX(xvfrint_s, vv)
INSN_LASX(xvfrint_d, vv)
INSN_LASX(xvfrintrm_s, vv)
INSN_LASX(xvfrintrm_d, vv)
INSN_LASX(xvfrintrp_s, vv)
INSN_LASX(xvfrintrp_d, vv)
INSN_LASX(xvfrintrz_s, vv)
INSN_LASX(xvfrintrz_d, vv)
INSN_LASX(xvfrintrne_s, vv)
INSN_LASX(xvfrintrne_d, vv)

INSN_LASX(xvftint_w_s, vv)
INSN_LASX(xvftint_l_d, vv)
INSN_LASX(xvftintrm_w_s, vv)
INSN_LASX(xvftintrm_l_d, vv)
INSN_LASX(xvftintrp_w_s, vv)
INSN_LASX(xvftintrp_l_d, vv)
INSN_LASX(xvftintrz_w_s, vv)
INSN_LASX(xvftintrz_l_d, vv)
INSN_LASX(xvftintrne_w_s, vv)
INSN_LASX(xvftintrne_l_d, vv)
INSN_LASX(xvftint_wu_s, vv)
INSN_LASX(xvftint_lu_d, vv)
INSN_LASX(xvftintrz_wu_s, vv)
INSN_LASX(xvftintrz_lu_d, vv)
INSN_LASX(xvftint_w_d, vvv)
INSN_LASX(xvftintrm_w_d, vvv)
INSN_LASX(xvftintrp_w_d, vvv)
INSN_LASX(xvftintrz_w_d, vvv)
INSN_LASX(xvftintrne_w_d, vvv)
INSN_LASX(xvftintl_l_s, vv)
INSN_LASX(xvftinth_l_s, vv)
INSN_LASX(xvftintrml_l_s, vv)
INSN_LASX(xvftintrmh_l_s, vv)
INSN_LASX(xvftintrpl_l_s, vv)
INSN_LASX(xvftintrph_l_s, vv)
INSN_LASX(xvftintrzl_l_s, vv)
INSN_LASX(xvftintrzh_l_s, vv)
INSN_LASX(xvftintrnel_l_s, vv)
INSN_LASX(xvftintrneh_l_s, vv)

INSN_LASX(xvffint_s_w, vv)
INSN_LASX(xvffint_s_wu, vv)
INSN_LASX(xvffint_d_l, vv)
INSN_LASX(xvffint_d_lu, vv)
INSN_LASX(xvffintl_d_w, vv)
INSN_LASX(xvffinth_d_w, vv)
INSN_LASX(xvffint_s_l, vvv)

INSN_LASX(xvreplgr2vr_b, vr)
INSN_LASX(xvreplgr2vr_h, vr)
INSN_LASX(xvreplgr2vr_w, vr)
Expand Down
52 changes: 52 additions & 0 deletions target/loongarch/insn_trans/trans_vec.c.inc
Original file line number Diff line number Diff line change
Expand Up @@ -4403,6 +4403,12 @@ TRANS(vfcvtl_d_s, LSX, gen_vv_ptr, gen_helper_vfcvtl_d_s)
TRANS(vfcvth_d_s, LSX, gen_vv_ptr, gen_helper_vfcvth_d_s)
TRANS(vfcvt_h_s, LSX, gen_vvv_ptr, gen_helper_vfcvt_h_s)
TRANS(vfcvt_s_d, LSX, gen_vvv_ptr, gen_helper_vfcvt_s_d)
TRANS(xvfcvtl_s_h, LASX, gen_xx_ptr, gen_helper_vfcvtl_s_h)
TRANS(xvfcvth_s_h, LASX, gen_xx_ptr, gen_helper_vfcvth_s_h)
TRANS(xvfcvtl_d_s, LASX, gen_xx_ptr, gen_helper_vfcvtl_d_s)
TRANS(xvfcvth_d_s, LASX, gen_xx_ptr, gen_helper_vfcvth_d_s)
TRANS(xvfcvt_h_s, LASX, gen_xxx_ptr, gen_helper_vfcvt_h_s)
TRANS(xvfcvt_s_d, LASX, gen_xxx_ptr, gen_helper_vfcvt_s_d)

TRANS(vfrintrne_s, LSX, gen_vv_ptr, gen_helper_vfrintrne_s)
TRANS(vfrintrne_d, LSX, gen_vv_ptr, gen_helper_vfrintrne_d)
Expand All @@ -4414,6 +4420,16 @@ TRANS(vfrintrm_s, LSX, gen_vv_ptr, gen_helper_vfrintrm_s)
TRANS(vfrintrm_d, LSX, gen_vv_ptr, gen_helper_vfrintrm_d)
TRANS(vfrint_s, LSX, gen_vv_ptr, gen_helper_vfrint_s)
TRANS(vfrint_d, LSX, gen_vv_ptr, gen_helper_vfrint_d)
TRANS(xvfrintrne_s, LASX, gen_xx_ptr, gen_helper_vfrintrne_s)
TRANS(xvfrintrne_d, LASX, gen_xx_ptr, gen_helper_vfrintrne_d)
TRANS(xvfrintrz_s, LASX, gen_xx_ptr, gen_helper_vfrintrz_s)
TRANS(xvfrintrz_d, LASX, gen_xx_ptr, gen_helper_vfrintrz_d)
TRANS(xvfrintrp_s, LASX, gen_xx_ptr, gen_helper_vfrintrp_s)
TRANS(xvfrintrp_d, LASX, gen_xx_ptr, gen_helper_vfrintrp_d)
TRANS(xvfrintrm_s, LASX, gen_xx_ptr, gen_helper_vfrintrm_s)
TRANS(xvfrintrm_d, LASX, gen_xx_ptr, gen_helper_vfrintrm_d)
TRANS(xvfrint_s, LASX, gen_xx_ptr, gen_helper_vfrint_s)
TRANS(xvfrint_d, LASX, gen_xx_ptr, gen_helper_vfrint_d)

TRANS(vftintrne_w_s, LSX, gen_vv_ptr, gen_helper_vftintrne_w_s)
TRANS(vftintrne_l_d, LSX, gen_vv_ptr, gen_helper_vftintrne_l_d)
Expand Down Expand Up @@ -4444,6 +4460,35 @@ TRANS(vftintrml_l_s, LSX, gen_vv_ptr, gen_helper_vftintrml_l_s)
TRANS(vftintrmh_l_s, LSX, gen_vv_ptr, gen_helper_vftintrmh_l_s)
TRANS(vftintl_l_s, LSX, gen_vv_ptr, gen_helper_vftintl_l_s)
TRANS(vftinth_l_s, LSX, gen_vv_ptr, gen_helper_vftinth_l_s)
TRANS(xvftintrne_w_s, LASX, gen_xx_ptr, gen_helper_vftintrne_w_s)
TRANS(xvftintrne_l_d, LASX, gen_xx_ptr, gen_helper_vftintrne_l_d)
TRANS(xvftintrz_w_s, LASX, gen_xx_ptr, gen_helper_vftintrz_w_s)
TRANS(xvftintrz_l_d, LASX, gen_xx_ptr, gen_helper_vftintrz_l_d)
TRANS(xvftintrp_w_s, LASX, gen_xx_ptr, gen_helper_vftintrp_w_s)
TRANS(xvftintrp_l_d, LASX, gen_xx_ptr, gen_helper_vftintrp_l_d)
TRANS(xvftintrm_w_s, LASX, gen_xx_ptr, gen_helper_vftintrm_w_s)
TRANS(xvftintrm_l_d, LASX, gen_xx_ptr, gen_helper_vftintrm_l_d)
TRANS(xvftint_w_s, LASX, gen_xx_ptr, gen_helper_vftint_w_s)
TRANS(xvftint_l_d, LASX, gen_xx_ptr, gen_helper_vftint_l_d)
TRANS(xvftintrz_wu_s, LASX, gen_xx_ptr, gen_helper_vftintrz_wu_s)
TRANS(xvftintrz_lu_d, LASX, gen_xx_ptr, gen_helper_vftintrz_lu_d)
TRANS(xvftint_wu_s, LASX, gen_xx_ptr, gen_helper_vftint_wu_s)
TRANS(xvftint_lu_d, LASX, gen_xx_ptr, gen_helper_vftint_lu_d)
TRANS(xvftintrne_w_d, LASX, gen_xxx_ptr, gen_helper_vftintrne_w_d)
TRANS(xvftintrz_w_d, LASX, gen_xxx_ptr, gen_helper_vftintrz_w_d)
TRANS(xvftintrp_w_d, LASX, gen_xxx_ptr, gen_helper_vftintrp_w_d)
TRANS(xvftintrm_w_d, LASX, gen_xxx_ptr, gen_helper_vftintrm_w_d)
TRANS(xvftint_w_d, LASX, gen_xxx_ptr, gen_helper_vftint_w_d)
TRANS(xvftintrnel_l_s, LASX, gen_xx_ptr, gen_helper_vftintrnel_l_s)
TRANS(xvftintrneh_l_s, LASX, gen_xx_ptr, gen_helper_vftintrneh_l_s)
TRANS(xvftintrzl_l_s, LASX, gen_xx_ptr, gen_helper_vftintrzl_l_s)
TRANS(xvftintrzh_l_s, LASX, gen_xx_ptr, gen_helper_vftintrzh_l_s)
TRANS(xvftintrpl_l_s, LASX, gen_xx_ptr, gen_helper_vftintrpl_l_s)
TRANS(xvftintrph_l_s, LASX, gen_xx_ptr, gen_helper_vftintrph_l_s)
TRANS(xvftintrml_l_s, LASX, gen_xx_ptr, gen_helper_vftintrml_l_s)
TRANS(xvftintrmh_l_s, LASX, gen_xx_ptr, gen_helper_vftintrmh_l_s)
TRANS(xvftintl_l_s, LASX, gen_xx_ptr, gen_helper_vftintl_l_s)
TRANS(xvftinth_l_s, LASX, gen_xx_ptr, gen_helper_vftinth_l_s)

TRANS(vffint_s_w, LSX, gen_vv_ptr, gen_helper_vffint_s_w)
TRANS(vffint_d_l, LSX, gen_vv_ptr, gen_helper_vffint_d_l)
Expand All @@ -4452,6 +4497,13 @@ TRANS(vffint_d_lu, LSX, gen_vv_ptr, gen_helper_vffint_d_lu)
TRANS(vffintl_d_w, LSX, gen_vv_ptr, gen_helper_vffintl_d_w)
TRANS(vffinth_d_w, LSX, gen_vv_ptr, gen_helper_vffinth_d_w)
TRANS(vffint_s_l, LSX, gen_vvv_ptr, gen_helper_vffint_s_l)
TRANS(xvffint_s_w, LASX, gen_xx_ptr, gen_helper_vffint_s_w)
TRANS(xvffint_d_l, LASX, gen_xx_ptr, gen_helper_vffint_d_l)
TRANS(xvffint_s_wu, LASX, gen_xx_ptr, gen_helper_vffint_s_wu)
TRANS(xvffint_d_lu, LASX, gen_xx_ptr, gen_helper_vffint_d_lu)
TRANS(xvffintl_d_w, LASX, gen_xx_ptr, gen_helper_vffintl_d_w)
TRANS(xvffinth_d_w, LASX, gen_xx_ptr, gen_helper_vffinth_d_w)
TRANS(xvffint_s_l, LASX, gen_xxx_ptr, gen_helper_vffint_s_l)

static bool do_cmp(DisasContext *ctx, arg_vvv *a, MemOp mop, TCGCond cond)
{
Expand Down
58 changes: 58 additions & 0 deletions target/loongarch/insns.decode
Original file line number Diff line number Diff line change
Expand Up @@ -1857,6 +1857,64 @@ xvfrecip_d 0111 01101001 11001 11110 ..... ..... @vv
xvfrsqrt_s 0111 01101001 11010 00001 ..... ..... @vv
xvfrsqrt_d 0111 01101001 11010 00010 ..... ..... @vv

xvfcvtl_s_h 0111 01101001 11011 11010 ..... ..... @vv
xvfcvth_s_h 0111 01101001 11011 11011 ..... ..... @vv
xvfcvtl_d_s 0111 01101001 11011 11100 ..... ..... @vv
xvfcvth_d_s 0111 01101001 11011 11101 ..... ..... @vv
xvfcvt_h_s 0111 01010100 01100 ..... ..... ..... @vvv
xvfcvt_s_d 0111 01010100 01101 ..... ..... ..... @vvv

xvfrintrne_s 0111 01101001 11010 11101 ..... ..... @vv
xvfrintrne_d 0111 01101001 11010 11110 ..... ..... @vv
xvfrintrz_s 0111 01101001 11010 11001 ..... ..... @vv
xvfrintrz_d 0111 01101001 11010 11010 ..... ..... @vv
xvfrintrp_s 0111 01101001 11010 10101 ..... ..... @vv
xvfrintrp_d 0111 01101001 11010 10110 ..... ..... @vv
xvfrintrm_s 0111 01101001 11010 10001 ..... ..... @vv
xvfrintrm_d 0111 01101001 11010 10010 ..... ..... @vv
xvfrint_s 0111 01101001 11010 01101 ..... ..... @vv
xvfrint_d 0111 01101001 11010 01110 ..... ..... @vv

xvftintrne_w_s 0111 01101001 11100 10100 ..... ..... @vv
xvftintrne_l_d 0111 01101001 11100 10101 ..... ..... @vv
xvftintrz_w_s 0111 01101001 11100 10010 ..... ..... @vv
xvftintrz_l_d 0111 01101001 11100 10011 ..... ..... @vv
xvftintrp_w_s 0111 01101001 11100 10000 ..... ..... @vv
xvftintrp_l_d 0111 01101001 11100 10001 ..... ..... @vv
xvftintrm_w_s 0111 01101001 11100 01110 ..... ..... @vv
xvftintrm_l_d 0111 01101001 11100 01111 ..... ..... @vv
xvftint_w_s 0111 01101001 11100 01100 ..... ..... @vv
xvftint_l_d 0111 01101001 11100 01101 ..... ..... @vv
xvftintrz_wu_s 0111 01101001 11100 11100 ..... ..... @vv
xvftintrz_lu_d 0111 01101001 11100 11101 ..... ..... @vv
xvftint_wu_s 0111 01101001 11100 10110 ..... ..... @vv
xvftint_lu_d 0111 01101001 11100 10111 ..... ..... @vv

xvftintrne_w_d 0111 01010100 10111 ..... ..... ..... @vvv
xvftintrz_w_d 0111 01010100 10110 ..... ..... ..... @vvv
xvftintrp_w_d 0111 01010100 10101 ..... ..... ..... @vvv
xvftintrm_w_d 0111 01010100 10100 ..... ..... ..... @vvv
xvftint_w_d 0111 01010100 10011 ..... ..... ..... @vvv

xvftintrnel_l_s 0111 01101001 11101 01000 ..... ..... @vv
xvftintrneh_l_s 0111 01101001 11101 01001 ..... ..... @vv
xvftintrzl_l_s 0111 01101001 11101 00110 ..... ..... @vv
xvftintrzh_l_s 0111 01101001 11101 00111 ..... ..... @vv
xvftintrpl_l_s 0111 01101001 11101 00100 ..... ..... @vv
xvftintrph_l_s 0111 01101001 11101 00101 ..... ..... @vv
xvftintrml_l_s 0111 01101001 11101 00010 ..... ..... @vv
xvftintrmh_l_s 0111 01101001 11101 00011 ..... ..... @vv
xvftintl_l_s 0111 01101001 11101 00000 ..... ..... @vv
xvftinth_l_s 0111 01101001 11101 00001 ..... ..... @vv

xvffint_s_w 0111 01101001 11100 00000 ..... ..... @vv
xvffint_d_l 0111 01101001 11100 00010 ..... ..... @vv
xvffint_s_wu 0111 01101001 11100 00001 ..... ..... @vv
xvffint_d_lu 0111 01101001 11100 00011 ..... ..... @vv
xvffintl_d_w 0111 01101001 11100 00100 ..... ..... @vv
xvffinth_d_w 0111 01101001 11100 00101 ..... ..... @vv
xvffint_s_l 0111 01010100 10000 ..... ..... ..... @vvv

xvreplgr2vr_b 0111 01101001 11110 00000 ..... ..... @vr
xvreplgr2vr_h 0111 01101001 11110 00001 ..... ..... @vr
xvreplgr2vr_w 0111 01101001 11110 00010 ..... ..... @vr
Expand Down

0 comments on commit 60df31a

Please sign in to comment.