mirror of
https://github.com/qemu/qemu.git
synced 2024-12-13 05:33:34 +08:00
target/arm: Convert Neon 3-reg-same comparisons to decodetree
Convert the Neon comparison ops in the 3-reg-same grouping to decodetree. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20200430181003.21682-18-peter.maydell@linaro.org
This commit is contained in:
parent
36b59310c3
commit
02bd0cdb64
@ -54,6 +54,11 @@ VBSL_3s 1111 001 1 0 . 01 .... .... 0001 ... 1 .... @3same_logic
|
||||
VBIT_3s 1111 001 1 0 . 10 .... .... 0001 ... 1 .... @3same_logic
|
||||
VBIF_3s 1111 001 1 0 . 11 .... .... 0001 ... 1 .... @3same_logic
|
||||
|
||||
VCGT_S_3s 1111 001 0 0 . .. .... .... 0011 . . . 0 .... @3same
|
||||
VCGT_U_3s 1111 001 1 0 . .. .... .... 0011 . . . 0 .... @3same
|
||||
VCGE_S_3s 1111 001 0 0 . .. .... .... 0011 . . . 1 .... @3same
|
||||
VCGE_U_3s 1111 001 1 0 . .. .... .... 0011 . . . 1 .... @3same
|
||||
|
||||
VMAX_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 0 .... @3same
|
||||
VMAX_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 0 .... @3same
|
||||
VMIN_S_3s 1111 001 0 0 . .. .... .... 0110 . . . 1 .... @3same
|
||||
@ -61,3 +66,6 @@ VMIN_U_3s 1111 001 1 0 . .. .... .... 0110 . . . 1 .... @3same
|
||||
|
||||
VADD_3s 1111 001 0 0 . .. .... .... 1000 . . . 0 .... @3same
|
||||
VSUB_3s 1111 001 1 0 . .. .... .... 1000 . . . 0 .... @3same
|
||||
|
||||
VTST_3s 1111 001 0 0 . .. .... .... 1000 . . . 1 .... @3same
|
||||
VCEQ_3s 1111 001 1 0 . .. .... .... 1000 . . . 1 .... @3same
|
||||
|
@ -631,3 +631,25 @@ DO_3SAME_NO_SZ_3(VMAX_S, tcg_gen_gvec_smax)
|
||||
DO_3SAME_NO_SZ_3(VMAX_U, tcg_gen_gvec_umax)
|
||||
DO_3SAME_NO_SZ_3(VMIN_S, tcg_gen_gvec_smin)
|
||||
DO_3SAME_NO_SZ_3(VMIN_U, tcg_gen_gvec_umin)
|
||||
|
||||
#define DO_3SAME_CMP(INSN, COND) \
|
||||
static void gen_##INSN##_3s(unsigned vece, uint32_t rd_ofs, \
|
||||
uint32_t rn_ofs, uint32_t rm_ofs, \
|
||||
uint32_t oprsz, uint32_t maxsz) \
|
||||
{ \
|
||||
tcg_gen_gvec_cmp(COND, vece, rd_ofs, rn_ofs, rm_ofs, oprsz, maxsz); \
|
||||
} \
|
||||
DO_3SAME_NO_SZ_3(INSN, gen_##INSN##_3s)
|
||||
|
||||
DO_3SAME_CMP(VCGT_S, TCG_COND_GT)
|
||||
DO_3SAME_CMP(VCGT_U, TCG_COND_GTU)
|
||||
DO_3SAME_CMP(VCGE_S, TCG_COND_GE)
|
||||
DO_3SAME_CMP(VCGE_U, TCG_COND_GEU)
|
||||
DO_3SAME_CMP(VCEQ, TCG_COND_EQ)
|
||||
|
||||
static void gen_VTST_3s(unsigned vece, uint32_t rd_ofs, uint32_t rn_ofs,
|
||||
uint32_t rm_ofs, uint32_t oprsz, uint32_t maxsz)
|
||||
{
|
||||
tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs, oprsz, maxsz, &cmtst_op[vece]);
|
||||
}
|
||||
DO_3SAME_NO_SZ_3(VTST, gen_VTST_3s)
|
||||
|
@ -4879,26 +4879,6 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
||||
u ? &mls_op[size] : &mla_op[size]);
|
||||
return 0;
|
||||
|
||||
case NEON_3R_VTST_VCEQ:
|
||||
if (u) { /* VCEQ */
|
||||
tcg_gen_gvec_cmp(TCG_COND_EQ, size, rd_ofs, rn_ofs, rm_ofs,
|
||||
vec_size, vec_size);
|
||||
} else { /* VTST */
|
||||
tcg_gen_gvec_3(rd_ofs, rn_ofs, rm_ofs,
|
||||
vec_size, vec_size, &cmtst_op[size]);
|
||||
}
|
||||
return 0;
|
||||
|
||||
case NEON_3R_VCGT:
|
||||
tcg_gen_gvec_cmp(u ? TCG_COND_GTU : TCG_COND_GT, size,
|
||||
rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
|
||||
return 0;
|
||||
|
||||
case NEON_3R_VCGE:
|
||||
tcg_gen_gvec_cmp(u ? TCG_COND_GEU : TCG_COND_GE, size,
|
||||
rd_ofs, rn_ofs, rm_ofs, vec_size, vec_size);
|
||||
return 0;
|
||||
|
||||
case NEON_3R_VSHL:
|
||||
/* Note the operation is vshl vd,vm,vn */
|
||||
tcg_gen_gvec_3(rd_ofs, rm_ofs, rn_ofs, vec_size, vec_size,
|
||||
@ -4909,6 +4889,9 @@ static int disas_neon_data_insn(DisasContext *s, uint32_t insn)
|
||||
case NEON_3R_LOGIC:
|
||||
case NEON_3R_VMAX:
|
||||
case NEON_3R_VMIN:
|
||||
case NEON_3R_VTST_VCEQ:
|
||||
case NEON_3R_VCGT:
|
||||
case NEON_3R_VCGE:
|
||||
/* Already handled by decodetree */
|
||||
return 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user