mirror of https://gitee.com/openkylin/qemu.git
tcg/i386: Support vector scalar shift opcodes
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
b4578cd91c
commit
0a8d7a3bf5
|
@ -183,7 +183,7 @@ extern bool have_avx2;
|
||||||
#define TCG_TARGET_HAS_not_vec 0
|
#define TCG_TARGET_HAS_not_vec 0
|
||||||
#define TCG_TARGET_HAS_neg_vec 0
|
#define TCG_TARGET_HAS_neg_vec 0
|
||||||
#define TCG_TARGET_HAS_shi_vec 1
|
#define TCG_TARGET_HAS_shi_vec 1
|
||||||
#define TCG_TARGET_HAS_shs_vec 0
|
#define TCG_TARGET_HAS_shs_vec 1
|
||||||
#define TCG_TARGET_HAS_shv_vec have_avx2
|
#define TCG_TARGET_HAS_shv_vec have_avx2
|
||||||
#define TCG_TARGET_HAS_cmp_vec 1
|
#define TCG_TARGET_HAS_cmp_vec 1
|
||||||
#define TCG_TARGET_HAS_mul_vec 1
|
#define TCG_TARGET_HAS_mul_vec 1
|
||||||
|
|
|
@ -420,6 +420,14 @@ static inline int tcg_target_const_match(tcg_target_long val, TCGType type,
|
||||||
#define OPC_PSHIFTW_Ib (0x71 | P_EXT | P_DATA16) /* /2 /6 /4 */
|
#define OPC_PSHIFTW_Ib (0x71 | P_EXT | P_DATA16) /* /2 /6 /4 */
|
||||||
#define OPC_PSHIFTD_Ib (0x72 | P_EXT | P_DATA16) /* /2 /6 /4 */
|
#define OPC_PSHIFTD_Ib (0x72 | P_EXT | P_DATA16) /* /2 /6 /4 */
|
||||||
#define OPC_PSHIFTQ_Ib (0x73 | P_EXT | P_DATA16) /* /2 /6 /4 */
|
#define OPC_PSHIFTQ_Ib (0x73 | P_EXT | P_DATA16) /* /2 /6 /4 */
|
||||||
|
#define OPC_PSLLW (0xf1 | P_EXT | P_DATA16)
|
||||||
|
#define OPC_PSLLD (0xf2 | P_EXT | P_DATA16)
|
||||||
|
#define OPC_PSLLQ (0xf3 | P_EXT | P_DATA16)
|
||||||
|
#define OPC_PSRAW (0xe1 | P_EXT | P_DATA16)
|
||||||
|
#define OPC_PSRAD (0xe2 | P_EXT | P_DATA16)
|
||||||
|
#define OPC_PSRLW (0xd1 | P_EXT | P_DATA16)
|
||||||
|
#define OPC_PSRLD (0xd2 | P_EXT | P_DATA16)
|
||||||
|
#define OPC_PSRLQ (0xd3 | P_EXT | P_DATA16)
|
||||||
#define OPC_PSUBB (0xf8 | P_EXT | P_DATA16)
|
#define OPC_PSUBB (0xf8 | P_EXT | P_DATA16)
|
||||||
#define OPC_PSUBW (0xf9 | P_EXT | P_DATA16)
|
#define OPC_PSUBW (0xf9 | P_EXT | P_DATA16)
|
||||||
#define OPC_PSUBD (0xfa | P_EXT | P_DATA16)
|
#define OPC_PSUBD (0xfa | P_EXT | P_DATA16)
|
||||||
|
@ -2724,6 +2732,15 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
|
||||||
/* TODO: AVX512 adds support for MO_16, MO_64. */
|
/* TODO: AVX512 adds support for MO_16, MO_64. */
|
||||||
OPC_UD2, OPC_UD2, OPC_VPSRAVD, OPC_UD2
|
OPC_UD2, OPC_UD2, OPC_VPSRAVD, OPC_UD2
|
||||||
};
|
};
|
||||||
|
static int const shls_insn[4] = {
|
||||||
|
OPC_UD2, OPC_PSLLW, OPC_PSLLD, OPC_PSLLQ
|
||||||
|
};
|
||||||
|
static int const shrs_insn[4] = {
|
||||||
|
OPC_UD2, OPC_PSRLW, OPC_PSRLD, OPC_PSRLQ
|
||||||
|
};
|
||||||
|
static int const sars_insn[4] = {
|
||||||
|
OPC_UD2, OPC_PSRAW, OPC_PSRAD, OPC_UD2
|
||||||
|
};
|
||||||
|
|
||||||
TCGType type = vecl + TCG_TYPE_V64;
|
TCGType type = vecl + TCG_TYPE_V64;
|
||||||
int insn, sub;
|
int insn, sub;
|
||||||
|
@ -2785,6 +2802,15 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
|
||||||
case INDEX_op_sarv_vec:
|
case INDEX_op_sarv_vec:
|
||||||
insn = sarv_insn[vece];
|
insn = sarv_insn[vece];
|
||||||
goto gen_simd;
|
goto gen_simd;
|
||||||
|
case INDEX_op_shls_vec:
|
||||||
|
insn = shls_insn[vece];
|
||||||
|
goto gen_simd;
|
||||||
|
case INDEX_op_shrs_vec:
|
||||||
|
insn = shrs_insn[vece];
|
||||||
|
goto gen_simd;
|
||||||
|
case INDEX_op_sars_vec:
|
||||||
|
insn = sars_insn[vece];
|
||||||
|
goto gen_simd;
|
||||||
case INDEX_op_x86_punpckl_vec:
|
case INDEX_op_x86_punpckl_vec:
|
||||||
insn = punpckl_insn[vece];
|
insn = punpckl_insn[vece];
|
||||||
goto gen_simd;
|
goto gen_simd;
|
||||||
|
@ -3165,6 +3191,9 @@ static const TCGTargetOpDef *tcg_target_op_def(TCGOpcode op)
|
||||||
case INDEX_op_shlv_vec:
|
case INDEX_op_shlv_vec:
|
||||||
case INDEX_op_shrv_vec:
|
case INDEX_op_shrv_vec:
|
||||||
case INDEX_op_sarv_vec:
|
case INDEX_op_sarv_vec:
|
||||||
|
case INDEX_op_shls_vec:
|
||||||
|
case INDEX_op_shrs_vec:
|
||||||
|
case INDEX_op_sars_vec:
|
||||||
case INDEX_op_cmp_vec:
|
case INDEX_op_cmp_vec:
|
||||||
case INDEX_op_x86_shufps_vec:
|
case INDEX_op_x86_shufps_vec:
|
||||||
case INDEX_op_x86_blend_vec:
|
case INDEX_op_x86_blend_vec:
|
||||||
|
@ -3222,6 +3251,12 @@ int tcg_can_emit_vec_op(TCGOpcode opc, TCGType type, unsigned vece)
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
case INDEX_op_shls_vec:
|
||||||
|
case INDEX_op_shrs_vec:
|
||||||
|
return vece >= MO_16;
|
||||||
|
case INDEX_op_sars_vec:
|
||||||
|
return vece >= MO_16 && vece <= MO_32;
|
||||||
|
|
||||||
case INDEX_op_shlv_vec:
|
case INDEX_op_shlv_vec:
|
||||||
case INDEX_op_shrv_vec:
|
case INDEX_op_shrv_vec:
|
||||||
return have_avx2 && vece >= MO_32;
|
return have_avx2 && vece >= MO_32;
|
||||||
|
|
Loading…
Reference in New Issue