mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 02:24:58 -06:00
target/i386: Add size suffix to vector FP helpers
For AVX we're going to need both 128 bit (xmm) and 256 bit (ymm) variants of floating point helpers. Add the register type suffix to the existing *PS and *PD helpers (SS and SD variants are only valid on 128 bit vectors) No functional changes. Signed-off-by: Paul Brook <paul@nowt.org> Message-Id: <20220424220204.2493824-15-paul@nowt.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
d7a851f89a
commit
ce4fa29f94
3 changed files with 67 additions and 66 deletions
|
@ -2804,7 +2804,7 @@ typedef void (*SSEFunc_0_eppt)(TCGv_ptr env, TCGv_ptr reg_a, TCGv_ptr reg_b,
|
|||
gen_helper_ ## x ## _mmx, gen_helper_ ## x ## _xmm, NULL, NULL)
|
||||
|
||||
#define SSE_FOP(name) OP(op1, SSE_OPF_SCALAR, \
|
||||
gen_helper_##name##ps, gen_helper_##name##pd, \
|
||||
gen_helper_##name##ps##_xmm, gen_helper_##name##pd##_xmm, \
|
||||
gen_helper_##name##ss, gen_helper_##name##sd)
|
||||
#define SSE_OP(sname, dname, op, flags) OP(op, flags, \
|
||||
gen_helper_##sname##_xmm, gen_helper_##dname##_xmm, NULL, NULL)
|
||||
|
@ -2843,12 +2843,12 @@ static const struct SSEOpHelper_table1 sse_op_table1[256] = {
|
|||
gen_helper_comiss, gen_helper_comisd, NULL, NULL),
|
||||
[0x50] = SSE_SPECIAL, /* movmskps, movmskpd */
|
||||
[0x51] = OP(op1, SSE_OPF_SCALAR,
|
||||
gen_helper_sqrtps, gen_helper_sqrtpd,
|
||||
gen_helper_sqrtps_xmm, gen_helper_sqrtpd_xmm,
|
||||
gen_helper_sqrtss, gen_helper_sqrtsd),
|
||||
[0x52] = OP(op1, SSE_OPF_SCALAR,
|
||||
gen_helper_rsqrtps, NULL, gen_helper_rsqrtss, NULL),
|
||||
gen_helper_rsqrtps_xmm, NULL, gen_helper_rsqrtss, NULL),
|
||||
[0x53] = OP(op1, SSE_OPF_SCALAR,
|
||||
gen_helper_rcpps, NULL, gen_helper_rcpss, NULL),
|
||||
gen_helper_rcpps_xmm, NULL, gen_helper_rcpss, NULL),
|
||||
[0x54] = SSE_OP(pand, pand, op1, 0), /* andps, andpd */
|
||||
[0x55] = SSE_OP(pandn, pandn, op1, 0), /* andnps, andnpd */
|
||||
[0x56] = SSE_OP(por, por, op1, 0), /* orps, orpd */
|
||||
|
@ -2856,19 +2856,19 @@ static const struct SSEOpHelper_table1 sse_op_table1[256] = {
|
|||
[0x58] = SSE_FOP(add),
|
||||
[0x59] = SSE_FOP(mul),
|
||||
[0x5a] = OP(op1, SSE_OPF_SCALAR,
|
||||
gen_helper_cvtps2pd, gen_helper_cvtpd2ps,
|
||||
gen_helper_cvtps2pd_xmm, gen_helper_cvtpd2ps_xmm,
|
||||
gen_helper_cvtss2sd, gen_helper_cvtsd2ss),
|
||||
[0x5b] = OP(op1, 0,
|
||||
gen_helper_cvtdq2ps, gen_helper_cvtps2dq,
|
||||
gen_helper_cvttps2dq, NULL),
|
||||
gen_helper_cvtdq2ps_xmm, gen_helper_cvtps2dq_xmm,
|
||||
gen_helper_cvttps2dq_xmm, NULL),
|
||||
[0x5c] = SSE_FOP(sub),
|
||||
[0x5d] = SSE_FOP(min),
|
||||
[0x5e] = SSE_FOP(div),
|
||||
[0x5f] = SSE_FOP(max),
|
||||
|
||||
[0xc2] = SSE_FOP(cmpeq), /* sse_op_table4 */
|
||||
[0xc6] = OP(dummy, SSE_OPF_SHUF, (SSEFunc_0_epp)gen_helper_shufps,
|
||||
(SSEFunc_0_epp)gen_helper_shufpd, NULL, NULL),
|
||||
[0xc6] = OP(dummy, SSE_OPF_SHUF, (SSEFunc_0_epp)gen_helper_shufps_xmm,
|
||||
(SSEFunc_0_epp)gen_helper_shufpd_xmm, NULL, NULL),
|
||||
|
||||
/* SSSE3, SSE4, MOVBE, CRC32, BMI1, BMI2, ADX. */
|
||||
[0x38] = SSE_SPECIAL,
|
||||
|
@ -2909,15 +2909,15 @@ static const struct SSEOpHelper_table1 sse_op_table1[256] = {
|
|||
[0x79] = OP(op1, 0,
|
||||
NULL, gen_helper_extrq_r, NULL, gen_helper_insertq_r),
|
||||
[0x7c] = OP(op1, 0,
|
||||
NULL, gen_helper_haddpd, NULL, gen_helper_haddps),
|
||||
NULL, gen_helper_haddpd_xmm, NULL, gen_helper_haddps_xmm),
|
||||
[0x7d] = OP(op1, 0,
|
||||
NULL, gen_helper_hsubpd, NULL, gen_helper_hsubps),
|
||||
NULL, gen_helper_hsubpd_xmm, NULL, gen_helper_hsubps_xmm),
|
||||
[0x7e] = SSE_SPECIAL, /* movd, movd, , movq */
|
||||
[0x7f] = SSE_SPECIAL, /* movq, movdqa, movdqu */
|
||||
[0xc4] = SSE_SPECIAL, /* pinsrw */
|
||||
[0xc5] = SSE_SPECIAL, /* pextrw */
|
||||
[0xd0] = OP(op1, 0,
|
||||
NULL, gen_helper_addsubpd, NULL, gen_helper_addsubps),
|
||||
NULL, gen_helper_addsubpd_xmm, NULL, gen_helper_addsubps_xmm),
|
||||
[0xd1] = MMX_OP(psrlw),
|
||||
[0xd2] = MMX_OP(psrld),
|
||||
[0xd3] = MMX_OP(psrlq),
|
||||
|
@ -2940,8 +2940,8 @@ static const struct SSEOpHelper_table1 sse_op_table1[256] = {
|
|||
[0xe4] = MMX_OP(pmulhuw),
|
||||
[0xe5] = MMX_OP(pmulhw),
|
||||
[0xe6] = OP(op1, 0,
|
||||
NULL, gen_helper_cvttpd2dq,
|
||||
gen_helper_cvtdq2pd, gen_helper_cvtpd2dq),
|
||||
NULL, gen_helper_cvttpd2dq_xmm,
|
||||
gen_helper_cvtdq2pd_xmm, gen_helper_cvtpd2dq_xmm),
|
||||
[0xe7] = SSE_SPECIAL, /* movntq, movntq */
|
||||
[0xe8] = MMX_OP(psubsb),
|
||||
[0xe9] = MMX_OP(psubsw),
|
||||
|
@ -3018,8 +3018,9 @@ static const SSEFunc_l_ep sse_op_table3bq[] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
#define SSE_FOP(x) { gen_helper_ ## x ## ps, gen_helper_ ## x ## pd, \
|
||||
gen_helper_ ## x ## ss, gen_helper_ ## x ## sd, }
|
||||
#define SSE_FOP(x) { \
|
||||
gen_helper_ ## x ## ps ## _xmm, gen_helper_ ## x ## pd ## _xmm, \
|
||||
gen_helper_ ## x ## ss, gen_helper_ ## x ## sd}
|
||||
static const SSEFunc_0_epp sse_op_table4[8][4] = {
|
||||
SSE_FOP(cmpeq),
|
||||
SSE_FOP(cmplt),
|
||||
|
@ -3636,13 +3637,13 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b,
|
|||
case 0x050: /* movmskps */
|
||||
rm = (modrm & 7) | REX_B(s);
|
||||
tcg_gen_addi_ptr(s->ptr0, cpu_env, ZMM_OFFSET(rm));
|
||||
gen_helper_movmskps(s->tmp2_i32, cpu_env, s->ptr0);
|
||||
gen_helper_movmskps_xmm(s->tmp2_i32, cpu_env, s->ptr0);
|
||||
tcg_gen_extu_i32_tl(cpu_regs[reg], s->tmp2_i32);
|
||||
break;
|
||||
case 0x150: /* movmskpd */
|
||||
rm = (modrm & 7) | REX_B(s);
|
||||
tcg_gen_addi_ptr(s->ptr0, cpu_env, ZMM_OFFSET(rm));
|
||||
gen_helper_movmskpd(s->tmp2_i32, cpu_env, s->ptr0);
|
||||
gen_helper_movmskpd_xmm(s->tmp2_i32, cpu_env, s->ptr0);
|
||||
tcg_gen_extu_i32_tl(cpu_regs[reg], s->tmp2_i32);
|
||||
break;
|
||||
case 0x02a: /* cvtpi2ps */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue