mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
target/i386: reimplement 0x0f 0xd0-0xd7, 0xe0-0xe7, 0xf0-0xf7, add AVX
The more complicated ones here are d6-d7, e6-e7, f7. The others are trivial. For LDDQU, using gen_load_sse directly might corrupt the register if the second part of the load fails. Therefore, add a custom X86_TYPE_WM value; like X86_TYPE_W it does call gen_load(), but it also rejects a value of 11 in the ModRM field like X86_TYPE_M. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
ce4fcb9478
commit
6bbeb98d10
4 changed files with 122 additions and 11 deletions
|
@ -289,6 +289,18 @@ static void decode_0F7F(DisasContext *s, CPUX86State *env, X86OpEntry *entry, ui
|
|||
*entry = *decode_by_prefix(s, opcodes_0F7F);
|
||||
}
|
||||
|
||||
static void decode_0FD6(DisasContext *s, CPUX86State *env, X86OpEntry *entry, uint8_t *b)
|
||||
{
|
||||
static const X86OpEntry movq[4] = {
|
||||
{},
|
||||
X86_OP_ENTRY3(MOVQ, W,x, None, None, V,q, vex5),
|
||||
X86_OP_ENTRY3(MOVq_dq, V,dq, None, None, N,q),
|
||||
X86_OP_ENTRY3(MOVq_dq, P,q, None, None, U,q),
|
||||
};
|
||||
|
||||
*entry = *decode_by_prefix(s, movq);
|
||||
}
|
||||
|
||||
static const X86OpEntry opcodes_0F38_00toEF[240] = {
|
||||
};
|
||||
|
||||
|
@ -398,6 +410,17 @@ static void decode_0F5B(DisasContext *s, CPUX86State *env, X86OpEntry *entry, ui
|
|||
*entry = *decode_by_prefix(s, opcodes_0F5B);
|
||||
}
|
||||
|
||||
static void decode_0FE6(DisasContext *s, CPUX86State *env, X86OpEntry *entry, uint8_t *b)
|
||||
{
|
||||
static const X86OpEntry opcodes_0FE6[4] = {
|
||||
{},
|
||||
X86_OP_ENTRY2(VCVTTPD2DQ, V,x, W,x, vex2),
|
||||
X86_OP_ENTRY2(VCVTDQ2PD, V,x, W,x, vex2),
|
||||
X86_OP_ENTRY2(VCVTPD2DQ, V,x, W,x, vex2),
|
||||
};
|
||||
*entry = *decode_by_prefix(s, opcodes_0FE6);
|
||||
}
|
||||
|
||||
static const X86OpEntry opcodes_0F[256] = {
|
||||
[0x50] = X86_OP_ENTRY3(MOVMSK, G,y, None,None, U,x, vex7 p_00_66),
|
||||
[0x51] = X86_OP_GROUP3(sse_unary, V,x, H,x, W,x, vex2_rep3 p_00_66_f3_f2),
|
||||
|
@ -454,6 +477,33 @@ static const X86OpEntry opcodes_0F[256] = {
|
|||
[0x7e] = X86_OP_GROUP0(0F7E),
|
||||
[0x7f] = X86_OP_GROUP0(0F7F),
|
||||
|
||||
[0xd0] = X86_OP_ENTRY3(VADDSUB, V,x, H,x, W,x, vex2 cpuid(SSE3) p_66_f2),
|
||||
[0xd1] = X86_OP_ENTRY3(PSRLW_r, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xd2] = X86_OP_ENTRY3(PSRLD_r, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xd3] = X86_OP_ENTRY3(PSRLQ_r, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xd4] = X86_OP_ENTRY3(PADDQ, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xd5] = X86_OP_ENTRY3(PMULLW, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xd6] = X86_OP_GROUP0(0FD6),
|
||||
[0xd7] = X86_OP_ENTRY3(PMOVMSKB, G,d, None,None, U,x, vex7 mmx avx2_256 p_00_66),
|
||||
|
||||
[0xe0] = X86_OP_ENTRY3(PAVGB, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xe1] = X86_OP_ENTRY3(PSRAW_r, V,x, H,x, W,x, vex7 mmx avx2_256 p_00_66),
|
||||
[0xe2] = X86_OP_ENTRY3(PSRAD_r, V,x, H,x, W,x, vex7 mmx avx2_256 p_00_66),
|
||||
[0xe3] = X86_OP_ENTRY3(PAVGW, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xe4] = X86_OP_ENTRY3(PMULHUW, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xe5] = X86_OP_ENTRY3(PMULHW, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xe6] = X86_OP_GROUP0(0FE6),
|
||||
[0xe7] = X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex1 mmx p_00_66), /* MOVNTQ/MOVNTDQ */
|
||||
|
||||
[0xf0] = X86_OP_ENTRY3(MOVDQ, V,x, None,None, WM,x, vex4_unal cpuid(SSE3) p_f2), /* LDDQU */
|
||||
[0xf1] = X86_OP_ENTRY3(PSLLW_r, V,x, H,x, W,x, vex7 mmx avx2_256 p_00_66),
|
||||
[0xf2] = X86_OP_ENTRY3(PSLLD_r, V,x, H,x, W,x, vex7 mmx avx2_256 p_00_66),
|
||||
[0xf3] = X86_OP_ENTRY3(PSLLQ_r, V,x, H,x, W,x, vex7 mmx avx2_256 p_00_66),
|
||||
[0xf4] = X86_OP_ENTRY3(PMULUDQ, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xf5] = X86_OP_ENTRY3(PMADDWD, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xf6] = X86_OP_ENTRY3(PSADBW, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xf7] = X86_OP_ENTRY3(MASKMOV, None,None, V,dq, U,dq, vex4_unal avx2_256 mmx p_00_66),
|
||||
|
||||
/* Incorrectly missing from 2-17 */
|
||||
[0xd8] = X86_OP_ENTRY3(PSUBUSB, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xd9] = X86_OP_ENTRY3(PSUBUSW, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
|
@ -710,6 +760,9 @@ static bool decode_op(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode,
|
|||
}
|
||||
goto get_modrm;
|
||||
|
||||
case X86_TYPE_WM: /* modrm byte selects an XMM/YMM memory operand */
|
||||
op->unit = X86_OP_SSE;
|
||||
/* fall through */
|
||||
case X86_TYPE_M: /* modrm byte selects a memory operand */
|
||||
modrm = get_modrm(s, env);
|
||||
if ((modrm >> 6) == 3) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue