mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86emul: extend decoding / mem access testing to VEX-encoded insns
Signed-off-by: Jan Beulich <jbeulich@suse.com> Acked-by: Andrew Cooper <andrew.cooper3@citrix.com>
This commit is contained in:
1 parent
d9dad3584b
commit
5e6dc9b8e5
1 file changed
+528
-1
@@ -1034,6 +1034,449 @@ static const struct {
|
||||
{ { 0xdf, 0xe8 }, F, N }, /* fucomip */
|
||||
{ { 0xdf, 0xf0 }, F, N }, /* fcomip */
|
||||
};
|
||||
|
||||
#define VSIB(n) 0x04 | ((n) << 3), 0x38 /* reg: %xmm<n>, mem: (%eax,%xmm7) */
|
||||
|
||||
static const struct vex {
|
||||
uint8_t opc[3];
|
||||
uint8_t len:3;
|
||||
bool modrm:1; /* Should register form (also) be tested? */
|
||||
uint8_t mem:2;
|
||||
uint8_t pfx:2;
|
||||
uint8_t w:2;
|
||||
#define WIG 0
|
||||
#define W0 1
|
||||
#define W1 2
|
||||
#define Wn (W0 | W1)
|
||||
uint8_t l:2;
|
||||
#define LIG 0
|
||||
#define L0 1
|
||||
#define L1 2
|
||||
#define Ln (L0 | L1)
|
||||
} vex_0f[] = {
|
||||
{ { 0x10 }, 2, T, R, pfx_no, WIG, Ln }, /* vmovups */
|
||||
{ { 0x10 }, 2, T, R, pfx_66, WIG, Ln }, /* vmovupd */
|
||||
{ { 0x10 }, 2, T, R, pfx_f3, WIG, LIG }, /* vmovss */
|
||||
{ { 0x10 }, 2, T, R, pfx_f2, WIG, LIG }, /* vmovsd */
|
||||
{ { 0x11 }, 2, T, W, pfx_no, WIG, Ln }, /* vmovups */
|
||||
{ { 0x11 }, 2, T, W, pfx_66, WIG, Ln }, /* vmovupd */
|
||||
{ { 0x11 }, 2, T, W, pfx_f3, WIG, LIG }, /* vmovss */
|
||||
{ { 0x11 }, 2, T, W, pfx_f2, WIG, LIG }, /* vmovsd */
|
||||
{ { 0x12 }, 2, T, R, pfx_no, WIG, L0 }, /* vmovlps / vmovhlps */
|
||||
{ { 0x12 }, 2, F, R, pfx_66, WIG, L0 }, /* vmovlpd */
|
||||
{ { 0x12 }, 2, T, R, pfx_f3, WIG, Ln }, /* vmovsldup */
|
||||
{ { 0x12 }, 2, T, R, pfx_f2, WIG, Ln }, /* vmovddup */
|
||||
{ { 0x13 }, 2, F, W, pfx_no, WIG, L0 }, /* vmovlps */
|
||||
{ { 0x13 }, 2, F, W, pfx_66, WIG, L0 }, /* vmovlpd */
|
||||
{ { 0x14 }, 2, T, R, pfx_no, WIG, Ln }, /* vunpcklps */
|
||||
{ { 0x14 }, 2, T, R, pfx_66, WIG, Ln }, /* vunpcklpd */
|
||||
{ { 0x15 }, 2, T, R, pfx_no, WIG, Ln }, /* vunpckhps */
|
||||
{ { 0x15 }, 2, T, R, pfx_66, WIG, Ln }, /* vunpckhpd */
|
||||
{ { 0x16 }, 2, T, R, pfx_no, WIG, L0 }, /* vmovhps / vmovlhps */
|
||||
{ { 0x16 }, 2, F, R, pfx_66, WIG, L0 }, /* vmovhpd */
|
||||
{ { 0x16 }, 2, T, R, pfx_f3, WIG, Ln }, /* vmovshdup */
|
||||
{ { 0x17 }, 2, F, W, pfx_no, WIG, L0 }, /* vmovhps */
|
||||
{ { 0x17 }, 2, F, W, pfx_66, WIG, L0 }, /* vmovhpd */
|
||||
{ { 0x28 }, 2, T, R, pfx_no, WIG, Ln }, /* vmovaps */
|
||||
{ { 0x28 }, 2, T, R, pfx_66, WIG, Ln }, /* vmovapd */
|
||||
{ { 0x29 }, 2, T, W, pfx_no, WIG, Ln }, /* vmovaps */
|
||||
{ { 0x29 }, 2, T, W, pfx_66, WIG, Ln }, /* vmovapd */
|
||||
{ { 0x2a }, 2, T, R, pfx_f3, Wn, LIG }, /* vcvtsi2ss */
|
||||
{ { 0x2a }, 2, T, R, pfx_f2, Wn, LIG }, /* vcvtsi2sd */
|
||||
{ { 0x2b }, 2, T, W, pfx_no, WIG, Ln }, /* vmovntps */
|
||||
{ { 0x2b }, 2, T, W, pfx_66, WIG, Ln }, /* vmovntpd */
|
||||
{ { 0x2c }, 2, T, R, pfx_f3, Wn, LIG }, /* vcvttss2si */
|
||||
{ { 0x2c }, 2, T, R, pfx_f2, Wn, LIG }, /* vcvttsd2si */
|
||||
{ { 0x2d }, 2, T, R, pfx_f3, Wn, LIG }, /* vcvtss2si */
|
||||
{ { 0x2d }, 2, T, R, pfx_f2, Wn, LIG }, /* vcvtsd2si */
|
||||
{ { 0x2e }, 2, T, R, pfx_no, WIG, LIG }, /* vucomiss */
|
||||
{ { 0x2e }, 2, T, R, pfx_66, WIG, LIG }, /* vucomisd */
|
||||
{ { 0x2f }, 2, T, R, pfx_no, WIG, LIG }, /* vcomiss */
|
||||
{ { 0x2f }, 2, T, R, pfx_66, WIG, LIG }, /* vcomisd */
|
||||
{ { 0x41, 0xc0 }, 2, F, N, pfx_no, Wn, L1 }, /* kand{w,q} */
|
||||
{ { 0x41, 0xc0 }, 2, F, N, pfx_66, Wn, L1 }, /* kand{b,d} */
|
||||
{ { 0x42, 0xc0 }, 2, F, N, pfx_no, Wn, L1 }, /* kandn{w,q} */
|
||||
{ { 0x42, 0xc0 }, 2, F, N, pfx_66, Wn, L1 }, /* kandn{b,d} */
|
||||
{ { 0x44, 0xc0 }, 2, F, N, pfx_no, Wn, L0 }, /* knot{w,q} */
|
||||
{ { 0x44, 0xc0 }, 2, F, N, pfx_66, Wn, L0 }, /* knot{b,d} */
|
||||
{ { 0x45, 0xc0 }, 2, F, N, pfx_no, Wn, L1 }, /* kor{w,q} */
|
||||
{ { 0x45, 0xc0 }, 2, F, N, pfx_66, Wn, L1 }, /* kor{b,d} */
|
||||
{ { 0x46, 0xc0 }, 2, F, N, pfx_no, Wn, L1 }, /* kxnor{w,q} */
|
||||
{ { 0x46, 0xc0 }, 2, F, N, pfx_66, Wn, L1 }, /* kxnor{b,d} */
|
||||
{ { 0x47, 0xc0 }, 2, F, N, pfx_no, Wn, L1 }, /* kxor{w,q} */
|
||||
{ { 0x47, 0xc0 }, 2, F, N, pfx_66, Wn, L1 }, /* kxor{b,d} */
|
||||
{ { 0x4a, 0xc0 }, 2, F, N, pfx_no, Wn, L1 }, /* kadd{w,q} */
|
||||
{ { 0x4a, 0xc0 }, 2, F, N, pfx_66, Wn, L1 }, /* kadd{b,d} */
|
||||
{ { 0x4b, 0xc0 }, 2, F, N, pfx_no, Wn, L1 }, /* kunpck{wd,dq} */
|
||||
{ { 0x4b, 0xc0 }, 2, F, N, pfx_66, W0, L1 }, /* kunpckbw */
|
||||
{ { 0x50, 0xc0 }, 2, F, N, pfx_no, WIG, Ln }, /* vmovmskps */
|
||||
{ { 0x50, 0xc0 }, 2, F, N, pfx_66, WIG, Ln }, /* vmovmskpd */
|
||||
{ { 0x51 }, 2, T, R, pfx_no, WIG, Ln }, /* vsqrtps */
|
||||
{ { 0x51 }, 2, T, R, pfx_66, WIG, Ln }, /* vsqrtpd */
|
||||
{ { 0x51 }, 2, T, R, pfx_f3, WIG, LIG }, /* vsqrtss */
|
||||
{ { 0x51 }, 2, T, R, pfx_f2, WIG, LIG }, /* vsqrtsd */
|
||||
{ { 0x52 }, 2, T, R, pfx_no, WIG, Ln }, /* vrsqrtps */
|
||||
{ { 0x52 }, 2, T, R, pfx_f3, WIG, LIG }, /* vrsqrtss */
|
||||
{ { 0x53 }, 2, T, R, pfx_no, WIG, Ln }, /* vrcpps */
|
||||
{ { 0x53 }, 2, T, R, pfx_f3, WIG, LIG }, /* vrcpss */
|
||||
{ { 0x54 }, 2, T, R, pfx_no, WIG, Ln }, /* vandps */
|
||||
{ { 0x54 }, 2, T, R, pfx_66, WIG, Ln }, /* vandpd */
|
||||
{ { 0x55 }, 2, T, R, pfx_no, WIG, Ln }, /* vandnps */
|
||||
{ { 0x55 }, 2, T, R, pfx_66, WIG, Ln }, /* vandnpd */
|
||||
{ { 0x56 }, 2, T, R, pfx_no, WIG, Ln }, /* vorps */
|
||||
{ { 0x56 }, 2, T, R, pfx_66, WIG, Ln }, /* vorpd */
|
||||
{ { 0x57 }, 2, T, R, pfx_no, WIG, Ln }, /* vxorps */
|
||||
{ { 0x57 }, 2, T, R, pfx_66, WIG, Ln }, /* vxorpd */
|
||||
{ { 0x58 }, 2, T, R, pfx_no, WIG, Ln }, /* vaddps */
|
||||
{ { 0x58 }, 2, T, R, pfx_66, WIG, Ln }, /* vaddpd */
|
||||
{ { 0x58 }, 2, T, R, pfx_f3, WIG, LIG }, /* vaddss */
|
||||
{ { 0x58 }, 2, T, R, pfx_f2, WIG, LIG }, /* vaddsd */
|
||||
{ { 0x59 }, 2, T, R, pfx_no, WIG, Ln }, /* vmulps */
|
||||
{ { 0x59 }, 2, T, R, pfx_66, WIG, Ln }, /* vmulpd */
|
||||
{ { 0x59 }, 2, T, R, pfx_f3, WIG, LIG }, /* vmulss */
|
||||
{ { 0x59 }, 2, T, R, pfx_f2, WIG, LIG }, /* vmulsd */
|
||||
{ { 0x5a }, 2, T, R, pfx_no, WIG, Ln }, /* vcvtps2pd */
|
||||
{ { 0x5a }, 2, T, R, pfx_66, WIG, Ln }, /* vcvtpd2ps */
|
||||
{ { 0x5a }, 2, T, R, pfx_f3, WIG, LIG }, /* vcvtss2sd */
|
||||
{ { 0x5a }, 2, T, R, pfx_f2, WIG, LIG }, /* vcvtsd2ss */
|
||||
{ { 0x5b }, 2, T, R, pfx_no, WIG, Ln }, /* vcvtdq2ps */
|
||||
{ { 0x5b }, 2, T, R, pfx_66, WIG, Ln }, /* vcvtps2dq */
|
||||
{ { 0x5b }, 2, T, R, pfx_f3, WIG, Ln }, /* vcvttps2dq */
|
||||
{ { 0x5c }, 2, T, R, pfx_no, WIG, Ln }, /* vsubps */
|
||||
{ { 0x5c }, 2, T, R, pfx_66, WIG, Ln }, /* vsubpd */
|
||||
{ { 0x5c }, 2, T, R, pfx_f3, WIG, LIG }, /* vsubss */
|
||||
{ { 0x5c }, 2, T, R, pfx_f2, WIG, LIG }, /* vsubsd */
|
||||
{ { 0x5d }, 2, T, R, pfx_no, WIG, Ln }, /* vminps */
|
||||
{ { 0x5d }, 2, T, R, pfx_66, WIG, Ln }, /* vminpd */
|
||||
{ { 0x5d }, 2, T, R, pfx_f3, WIG, LIG }, /* vminss */
|
||||
{ { 0x5d }, 2, T, R, pfx_f2, WIG, LIG }, /* vminsd */
|
||||
{ { 0x5e }, 2, T, R, pfx_no, WIG, Ln }, /* vdivps */
|
||||
{ { 0x5e }, 2, T, R, pfx_66, WIG, Ln }, /* vdivpd */
|
||||
{ { 0x5e }, 2, T, R, pfx_f3, WIG, LIG }, /* vdivss */
|
||||
{ { 0x5e }, 2, T, R, pfx_f2, WIG, LIG }, /* vdivsd */
|
||||
{ { 0x5f }, 2, T, R, pfx_no, WIG, Ln }, /* vmaxps */
|
||||
{ { 0x5f }, 2, T, R, pfx_66, WIG, Ln }, /* vmaxpd */
|
||||
{ { 0x5f }, 2, T, R, pfx_f3, WIG, LIG }, /* vmaxss */
|
||||
{ { 0x5f }, 2, T, R, pfx_f2, WIG, LIG }, /* vmaxsd */
|
||||
{ { 0x60 }, 2, T, R, pfx_66, WIG, Ln }, /* vpunpcklbw */
|
||||
{ { 0x61 }, 2, T, R, pfx_66, WIG, Ln }, /* vpunpcklwd */
|
||||
{ { 0x62 }, 2, T, R, pfx_66, WIG, Ln }, /* vpunpckldq */
|
||||
{ { 0x63 }, 2, T, R, pfx_66, WIG, Ln }, /* vpacksswb */
|
||||
{ { 0x64 }, 2, T, R, pfx_66, WIG, Ln }, /* vpcmpgtb */
|
||||
{ { 0x65 }, 2, T, R, pfx_66, WIG, Ln }, /* vpcmpgtw */
|
||||
{ { 0x66 }, 2, T, R, pfx_66, WIG, Ln }, /* vpcmpgtd */
|
||||
{ { 0x67 }, 2, T, R, pfx_66, WIG, Ln }, /* vpackuswb */
|
||||
{ { 0x68 }, 2, T, R, pfx_66, WIG, Ln }, /* vpunpckhbw */
|
||||
{ { 0x69 }, 2, T, R, pfx_66, WIG, Ln }, /* vpunpckhwd */
|
||||
{ { 0x6a }, 2, T, R, pfx_66, WIG, Ln }, /* vpunpckhdq */
|
||||
{ { 0x6b }, 2, T, R, pfx_66, WIG, Ln }, /* vpackssdw */
|
||||
{ { 0x6c }, 2, T, R, pfx_66, WIG, Ln }, /* vpunpcklqdq */
|
||||
{ { 0x6d }, 2, T, R, pfx_66, WIG, Ln }, /* vpunpckhqdq */
|
||||
{ { 0x6e }, 2, T, R, pfx_66, Wn, L0 }, /* vmov{d,q} */
|
||||
{ { 0x6f }, 2, T, R, pfx_66, WIG, Ln }, /* vmovdqa */
|
||||
{ { 0x6f }, 2, T, R, pfx_f3, WIG, Ln }, /* vmovdqu */
|
||||
{ { 0x70 }, 3, T, R, pfx_66, WIG, Ln }, /* vpshufd */
|
||||
{ { 0x70 }, 3, T, R, pfx_f3, WIG, Ln }, /* vpshuflw */
|
||||
{ { 0x70 }, 3, T, R, pfx_f2, WIG, Ln }, /* vpshufhw */
|
||||
{ { 0x71, 0xd0 }, 3, F, N, pfx_66, WIG, Ln }, /* vpsrlw */
|
||||
{ { 0x71, 0xe0 }, 3, F, N, pfx_66, WIG, Ln }, /* vpsraw */
|
||||
{ { 0x71, 0xf0 }, 3, F, N, pfx_66, WIG, Ln }, /* vpsllw */
|
||||
{ { 0x72, 0xd0 }, 3, F, N, pfx_66, WIG, Ln }, /* vpsrld */
|
||||
{ { 0x72, 0xe0 }, 3, F, N, pfx_66, WIG, Ln }, /* vpsrad */
|
||||
{ { 0x72, 0xf0 }, 3, F, N, pfx_66, WIG, Ln }, /* vpslld */
|
||||
{ { 0x73, 0xd0 }, 3, F, N, pfx_66, WIG, Ln }, /* vpsrlq */
|
||||
{ { 0x73, 0xd8 }, 3, F, N, pfx_66, WIG, Ln }, /* vpsrldq */
|
||||
{ { 0x73, 0xf0 }, 3, F, N, pfx_66, WIG, Ln }, /* vpsllq */
|
||||
{ { 0x73, 0xf8 }, 3, F, N, pfx_66, WIG, Ln }, /* vpslldq */
|
||||
{ { 0x74 }, 2, T, R, pfx_66, WIG, Ln }, /* vpcmpeqb */
|
||||
{ { 0x75 }, 2, T, R, pfx_66, WIG, Ln }, /* vpcmpeqw */
|
||||
{ { 0x76 }, 2, T, R, pfx_66, WIG, Ln }, /* vpcmpeqd */
|
||||
{ { 0x77 }, 1, F, N, pfx_no, WIG, Ln }, /* vzero{upper,all} */
|
||||
{ { 0x7c }, 2, T, R, pfx_66, WIG, Ln }, /* vhaddpd */
|
||||
{ { 0x7c }, 2, T, R, pfx_f2, WIG, Ln }, /* vhaddps */
|
||||
{ { 0x7d }, 2, T, R, pfx_66, WIG, Ln }, /* vhsubpd */
|
||||
{ { 0x7d }, 2, T, R, pfx_f2, WIG, Ln }, /* vhsubps */
|
||||
{ { 0x7e }, 2, T, W, pfx_66, Wn, L0 }, /* vmov{d,q} */
|
||||
{ { 0x7e }, 2, T, R, pfx_f3, WIG, L0 }, /* vmovq */
|
||||
{ { 0x7f }, 2, T, W, pfx_66, WIG, Ln }, /* vmovdqa */
|
||||
{ { 0x7f }, 2, T, W, pfx_f3, WIG, Ln }, /* vmovdqu */
|
||||
{ { 0x90 }, 2, T, R, pfx_no, Wn, L0 }, /* kmov{w,q} */
|
||||
{ { 0x90 }, 2, T, R, pfx_66, Wn, L0 }, /* kmov{b,d} */
|
||||
{ { 0x91 }, 2, N, W, pfx_no, Wn, L0 }, /* kmov{w,q} */
|
||||
{ { 0x91 }, 2, N, W, pfx_66, Wn, L0 }, /* kmov{b,d} */
|
||||
{ { 0x92, 0xc0 }, 2, F, N, pfx_no, W0, L0 }, /* kmovw */
|
||||
{ { 0x92, 0xc0 }, 2, F, N, pfx_66, W0, L0 }, /* kmovb */
|
||||
{ { 0x92, 0xc0 }, 2, F, N, pfx_f2, Wn, L0 }, /* kmov{d,q} */
|
||||
{ { 0x93, 0xc0 }, 2, F, N, pfx_no, W0, L0 }, /* kmovw */
|
||||
{ { 0x93, 0xc0 }, 2, F, N, pfx_66, W0, L0 }, /* kmovb */
|
||||
{ { 0x93, 0xc0 }, 2, F, N, pfx_f2, Wn, L0 }, /* kmov{d,q} */
|
||||
{ { 0x98, 0xc0 }, 2, F, N, pfx_no, Wn, L0 }, /* kortest{w,q} */
|
||||
{ { 0x98, 0xc0 }, 2, F, N, pfx_66, Wn, L0 }, /* kortest{b,d} */
|
||||
{ { 0x99, 0xc0 }, 2, F, N, pfx_no, Wn, L0 }, /* ktest{w,q} */
|
||||
{ { 0x99, 0xc0 }, 2, F, N, pfx_66, Wn, L0 }, /* ktest{b,d} */
|
||||
{ { 0xae, 0x10 }, 2, F, R, pfx_no, WIG, L0 }, /* vldmxcsr */
|
||||
{ { 0xae, 0x18 }, 2, F, W, pfx_no, WIG, L0 }, /* vstmxcsr */
|
||||
{ { 0xc2 }, 3, T, R, pfx_no, WIG, Ln }, /* vcmpps */
|
||||
{ { 0xc2 }, 3, T, R, pfx_66, WIG, Ln }, /* vcmppd */
|
||||
{ { 0xc2 }, 3, T, R, pfx_f3, WIG, LIG }, /* vcmpss */
|
||||
{ { 0xc2 }, 3, T, R, pfx_f2, WIG, LIG }, /* vcmpsd */
|
||||
{ { 0xc4 }, 3, T, R, pfx_66, WIG, L0 }, /* vpinsrw */
|
||||
{ { 0xc5, 0xc0 }, 3, F, N, pfx_66, WIG, L0 }, /* vpextrw */
|
||||
{ { 0xc6 }, 3, T, R, pfx_no, WIG, Ln }, /* vshufps */
|
||||
{ { 0xc6 }, 3, T, R, pfx_66, WIG, Ln }, /* vshufpd */
|
||||
{ { 0xd0 }, 2, T, R, pfx_66, WIG, Ln }, /* vaddsubpd */
|
||||
{ { 0xd0 }, 2, T, R, pfx_f2, WIG, Ln }, /* vaddsubps */
|
||||
{ { 0xd1 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsrlw */
|
||||
{ { 0xd2 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsrld */
|
||||
{ { 0xd3 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsrlq */
|
||||
{ { 0xd4 }, 2, T, R, pfx_66, WIG, Ln }, /* vpaddq */
|
||||
{ { 0xd5 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmullw */
|
||||
{ { 0xd6 }, 2, T, W, pfx_66, WIG, L0 }, /* vmovq */
|
||||
{ { 0xd7, 0xc0 }, 2, F, N, pfx_66, WIG, Ln }, /* vpmovmskb */
|
||||
{ { 0xd8 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsubusb */
|
||||
{ { 0xd9 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsubusw */
|
||||
{ { 0xda }, 2, T, R, pfx_66, WIG, Ln }, /* vpminub */
|
||||
{ { 0xdb }, 2, T, R, pfx_66, WIG, Ln }, /* vpand */
|
||||
{ { 0xdc }, 2, T, R, pfx_66, WIG, Ln }, /* vpaddusb */
|
||||
{ { 0xdd }, 2, T, R, pfx_66, WIG, Ln }, /* vpaddusw */
|
||||
{ { 0xde }, 2, T, R, pfx_66, WIG, Ln }, /* vpmaxub */
|
||||
{ { 0xdf }, 2, T, R, pfx_66, WIG, Ln }, /* vpandn */
|
||||
{ { 0xe0 }, 2, T, R, pfx_66, WIG, Ln }, /* vpavgb */
|
||||
{ { 0xe1 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsraw */
|
||||
{ { 0xe2 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsrad */
|
||||
{ { 0xe3 }, 2, T, R, pfx_66, WIG, Ln }, /* vpavgw */
|
||||
{ { 0xe4 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmulhuw */
|
||||
{ { 0xe5 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmulhw */
|
||||
{ { 0xe6 }, 2, T, R, pfx_66, WIG, Ln }, /* vcvttpd2dq */
|
||||
{ { 0xe6 }, 2, T, R, pfx_f3, WIG, Ln }, /* vcvtdq2pd */
|
||||
{ { 0xe6 }, 2, T, R, pfx_f2, WIG, Ln }, /* vcvtpd2dq */
|
||||
{ { 0xe7 }, 2, F, W, pfx_66, WIG, Ln }, /* vmovntdq */
|
||||
{ { 0xe8 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsubsb */
|
||||
{ { 0xe9 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsubsw */
|
||||
{ { 0xea }, 2, T, R, pfx_66, WIG, Ln }, /* vpminsw */
|
||||
{ { 0xeb }, 2, T, R, pfx_66, WIG, Ln }, /* vpor */
|
||||
{ { 0xec }, 2, T, R, pfx_66, WIG, Ln }, /* vpaddsb */
|
||||
{ { 0xed }, 2, T, R, pfx_66, WIG, Ln }, /* vpaddsw */
|
||||
{ { 0xee }, 2, T, R, pfx_66, WIG, Ln }, /* vpmaxsw */
|
||||
{ { 0xef }, 2, T, R, pfx_66, WIG, Ln }, /* vpxor */
|
||||
{ { 0xf0 }, 2, T, R, pfx_f2, WIG, Ln }, /* vlddqu */
|
||||
{ { 0xf1 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsllw */
|
||||
{ { 0xf2 }, 2, T, R, pfx_66, WIG, Ln }, /* vpslld */
|
||||
{ { 0xf3 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsllq */
|
||||
{ { 0xf4 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmuludq */
|
||||
{ { 0xf5 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmaddwd */
|
||||
{ { 0xf6 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsadbw */
|
||||
{ { 0xf7, 0xc0 }, 2, F, W, pfx_66, WIG, L0 }, /* vmaskmovdqu */
|
||||
{ { 0xf8 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsubb */
|
||||
{ { 0xf9 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsubw */
|
||||
{ { 0xfa }, 2, T, R, pfx_66, WIG, Ln }, /* vpsubd */
|
||||
{ { 0xfb }, 2, T, R, pfx_66, WIG, Ln }, /* vpsubq */
|
||||
{ { 0xfc }, 2, T, R, pfx_66, WIG, Ln }, /* vpaddb */
|
||||
{ { 0xfd }, 2, T, R, pfx_66, WIG, Ln }, /* vpaddw */
|
||||
{ { 0xfe }, 2, T, R, pfx_66, WIG, Ln }, /* vpaddd */
|
||||
}, vex_0f38[] = {
|
||||
{ { 0x00 }, 2, T, R, pfx_66, WIG, Ln }, /* vpshufb */
|
||||
{ { 0x01 }, 2, T, R, pfx_66, WIG, Ln }, /* vphaddw */
|
||||
{ { 0x02 }, 2, T, R, pfx_66, WIG, Ln }, /* vphaddd */
|
||||
{ { 0x03 }, 2, T, R, pfx_66, WIG, Ln }, /* vphaddsw */
|
||||
{ { 0x04 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmaddubsw */
|
||||
{ { 0x05 }, 2, T, R, pfx_66, WIG, Ln }, /* vphsubw */
|
||||
{ { 0x06 }, 2, T, R, pfx_66, WIG, Ln }, /* vphsubd */
|
||||
{ { 0x07 }, 2, T, R, pfx_66, WIG, Ln }, /* vphsubsw */
|
||||
{ { 0x08 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsignb */
|
||||
{ { 0x09 }, 2, T, R, pfx_66, WIG, Ln }, /* vpsignw */
|
||||
{ { 0x0a }, 2, T, R, pfx_66, WIG, Ln }, /* vpsignd */
|
||||
{ { 0x0b }, 2, T, R, pfx_66, WIG, Ln }, /* vpmulhrsw */
|
||||
{ { 0x0c }, 2, T, R, pfx_66, W0, Ln }, /* vpermilps */
|
||||
{ { 0x0d }, 2, T, R, pfx_66, W0, Ln }, /* vpermilpd */
|
||||
{ { 0x0e }, 2, T, R, pfx_66, W0, Ln }, /* vtestps */
|
||||
{ { 0x0f }, 2, T, R, pfx_66, W0, Ln }, /* vtestpd */
|
||||
{ { 0x13 }, 2, T, R, pfx_66, W0, Ln }, /* vcvtph2ps */
|
||||
{ { 0x16 }, 2, T, R, pfx_66, W0, L1 }, /* vpermps */
|
||||
{ { 0x17 }, 2, T, R, pfx_66, WIG, Ln }, /* vptest */
|
||||
{ { 0x18 }, 2, T, R, pfx_66, W0, Ln }, /* vbroadcastss */
|
||||
{ { 0x19 }, 2, T, R, pfx_66, W0, L1 }, /* vbroadcastsd */
|
||||
{ { 0x1a }, 2, F, R, pfx_66, W0, L1 }, /* vbroadcastf128 */
|
||||
{ { 0x1c }, 2, T, R, pfx_66, WIG, Ln }, /* vpabsb */
|
||||
{ { 0x1d }, 2, T, R, pfx_66, WIG, Ln }, /* vpabsw */
|
||||
{ { 0x1e }, 2, T, R, pfx_66, WIG, Ln }, /* vpabsd */
|
||||
{ { 0x20 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovsxbw */
|
||||
{ { 0x21 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovsxbd */
|
||||
{ { 0x22 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovsxbq */
|
||||
{ { 0x23 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovsxwd */
|
||||
{ { 0x24 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovsxwq */
|
||||
{ { 0x25 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovsxdq */
|
||||
{ { 0x28 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmuldq */
|
||||
{ { 0x29 }, 2, T, R, pfx_66, WIG, Ln }, /* vpcmpeqq */
|
||||
{ { 0x2a }, 2, F, R, pfx_66, WIG, Ln }, /* vmovntdqa */
|
||||
{ { 0x2b }, 2, T, R, pfx_66, WIG, Ln }, /* vpackusdw */
|
||||
{ { 0x2c }, 2, F, R, pfx_66, W0, Ln }, /* vmaskmovps */
|
||||
{ { 0x2d }, 2, F, R, pfx_66, W0, Ln }, /* vmaskmovpd */
|
||||
{ { 0x2e }, 2, F, W, pfx_66, W0, Ln }, /* vmaskmovps */
|
||||
{ { 0x2f }, 2, F, W, pfx_66, W0, Ln }, /* vmaskmovpd */
|
||||
{ { 0x30 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovzxbw */
|
||||
{ { 0x31 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovzxbd */
|
||||
{ { 0x32 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovzxbq */
|
||||
{ { 0x33 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovzxwd */
|
||||
{ { 0x34 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovzxwq */
|
||||
{ { 0x35 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmovzxdq */
|
||||
{ { 0x36 }, 2, T, R, pfx_66, W0, L1 }, /* vpermd */
|
||||
{ { 0x37 }, 2, T, R, pfx_66, WIG, Ln }, /* vpcmpgtq */
|
||||
{ { 0x38 }, 2, T, R, pfx_66, WIG, Ln }, /* vpminsb */
|
||||
{ { 0x39 }, 2, T, R, pfx_66, WIG, Ln }, /* vpminsd */
|
||||
{ { 0x3a }, 2, T, R, pfx_66, WIG, Ln }, /* vpminuw */
|
||||
{ { 0x3b }, 2, T, R, pfx_66, WIG, Ln }, /* vpminud */
|
||||
{ { 0x3c }, 2, T, R, pfx_66, WIG, Ln }, /* vpmaxsb */
|
||||
{ { 0x3d }, 2, T, R, pfx_66, WIG, Ln }, /* vpmaxsd */
|
||||
{ { 0x3e }, 2, T, R, pfx_66, WIG, Ln }, /* vpmaxuw */
|
||||
{ { 0x3f }, 2, T, R, pfx_66, WIG, Ln }, /* vpmaxud */
|
||||
{ { 0x40 }, 2, T, R, pfx_66, WIG, Ln }, /* vpmulld */
|
||||
{ { 0x41 }, 2, T, R, pfx_66, WIG, L0 }, /* vphminposuw */
|
||||
{ { 0x45 }, 2, T, R, pfx_66, Wn, Ln }, /* vpsrlv{d,q} */
|
||||
{ { 0x46 }, 2, T, R, pfx_66, W0, Ln }, /* vpsravd */
|
||||
{ { 0x47 }, 2, T, R, pfx_66, Wn, Ln }, /* vpsllv{d,q} */
|
||||
{ { 0x58 }, 2, T, R, pfx_66, W0, Ln }, /* vpbroadcastd */
|
||||
{ { 0x59 }, 2, T, R, pfx_66, W0, Ln }, /* vpbroadcastq */
|
||||
{ { 0x5a }, 2, F, R, pfx_66, W0, L1 }, /* vbroadcasti128 */
|
||||
{ { 0x78 }, 2, T, R, pfx_66, W0, Ln }, /* vpbroadcastb */
|
||||
{ { 0x79 }, 2, T, R, pfx_66, W0, Ln }, /* vpbroadcastw */
|
||||
{ { 0x8c }, 2, F, R, pfx_66, Wn, Ln }, /* vpmaskmov{d,q} */
|
||||
{ { 0x8e }, 2, F, W, pfx_66, Wn, Ln }, /* vpmaskmov{d,q} */
|
||||
{ { 0x90, VSIB(1) }, 3, F, R, pfx_66, Wn, Ln }, /* vpgatherd{d,q} */
|
||||
{ { 0x91, VSIB(1) }, 3, F, R, pfx_66, Wn, Ln }, /* vpgatherq{d,q} */
|
||||
{ { 0x92, VSIB(1) }, 3, F, R, pfx_66, Wn, Ln }, /* vgatherdp{s,d} */
|
||||
{ { 0x93, VSIB(1) }, 3, F, R, pfx_66, Wn, Ln }, /* vgatherqp{s,d} */
|
||||
{ { 0x96 }, 2, T, R, pfx_66, Wn, Ln }, /* vmaddsub132p{s,d} */
|
||||
{ { 0x97 }, 2, T, R, pfx_66, Wn, Ln }, /* vmsubadd132p{s,d} */
|
||||
{ { 0x98 }, 2, T, R, pfx_66, Wn, Ln }, /* vmadd132p{s,d} */
|
||||
{ { 0x99 }, 2, T, R, pfx_66, Wn, LIG }, /* vmadd132s{s,d} */
|
||||
{ { 0x9a }, 2, T, R, pfx_66, Wn, Ln }, /* vmsub132p{s,d} */
|
||||
{ { 0x9b }, 2, T, R, pfx_66, Wn, LIG }, /* vmsub132s{s,d} */
|
||||
{ { 0x9c }, 2, T, R, pfx_66, Wn, Ln }, /* vnmadd132p{s,d} */
|
||||
{ { 0x9d }, 2, T, R, pfx_66, Wn, LIG }, /* vnmadd132s{s,d} */
|
||||
{ { 0x9e }, 2, T, R, pfx_66, Wn, Ln }, /* vnmsub132p{s,d} */
|
||||
{ { 0x9f }, 2, T, R, pfx_66, Wn, LIG }, /* vnmsub132s{s,d} */
|
||||
{ { 0xa6 }, 2, T, R, pfx_66, Wn, Ln }, /* vmaddsub213p{s,d} */
|
||||
{ { 0xa7 }, 2, T, R, pfx_66, Wn, Ln }, /* vmsubadd213p{s,d} */
|
||||
{ { 0xa8 }, 2, T, R, pfx_66, Wn, Ln }, /* vmadd213p{s,d} */
|
||||
{ { 0xa9 }, 2, T, R, pfx_66, Wn, LIG }, /* vmadd213s{s,d} */
|
||||
{ { 0xaa }, 2, T, R, pfx_66, Wn, Ln }, /* vmsub213p{s,d} */
|
||||
{ { 0xab }, 2, T, R, pfx_66, Wn, LIG }, /* vmsub213s{s,d} */
|
||||
{ { 0xac }, 2, T, R, pfx_66, Wn, Ln }, /* vnmadd213p{s,d} */
|
||||
{ { 0xad }, 2, T, R, pfx_66, Wn, LIG }, /* vnmadd213s{s,d} */
|
||||
{ { 0xae }, 2, T, R, pfx_66, Wn, Ln }, /* vnmsub213p{s,d} */
|
||||
{ { 0xaf }, 2, T, R, pfx_66, Wn, LIG }, /* vnmsub213s{s,d} */
|
||||
{ { 0xb6 }, 2, T, R, pfx_66, Wn, Ln }, /* vmaddsub231p{s,d} */
|
||||
{ { 0xb7 }, 2, T, R, pfx_66, Wn, Ln }, /* vmsubadd231p{s,d} */
|
||||
{ { 0xb8 }, 2, T, R, pfx_66, Wn, Ln }, /* vmadd231p{s,d} */
|
||||
{ { 0xb9 }, 2, T, R, pfx_66, Wn, LIG }, /* vmadd231s{s,d} */
|
||||
{ { 0xba }, 2, T, R, pfx_66, Wn, Ln }, /* vmsub231p{s,d} */
|
||||
{ { 0xbb }, 2, T, R, pfx_66, Wn, LIG }, /* vmsub231s{s,d} */
|
||||
{ { 0xbc }, 2, T, R, pfx_66, Wn, Ln }, /* vnmadd231p{s,d} */
|
||||
{ { 0xbd }, 2, T, R, pfx_66, Wn, LIG }, /* vnmadd231s{s,d} */
|
||||
{ { 0xbe }, 2, T, R, pfx_66, Wn, Ln }, /* vnmsub231p{s,d} */
|
||||
{ { 0xbf }, 2, T, R, pfx_66, Wn, LIG }, /* vnmsub231s{s,d} */
|
||||
{ { 0xcf }, 2, T, R, pfx_66, W0, Ln }, /* vgf2p8mulb */
|
||||
{ { 0xdb }, 2, T, R, pfx_66, WIG, L0 }, /* vaesimc */
|
||||
{ { 0xdc }, 2, T, R, pfx_66, WIG, Ln }, /* vaesenc */
|
||||
{ { 0xdd }, 2, T, R, pfx_66, WIG, Ln }, /* vaesenclast */
|
||||
{ { 0xde }, 2, T, R, pfx_66, WIG, Ln }, /* vaesdec */
|
||||
{ { 0xdf }, 2, T, R, pfx_66, WIG, Ln }, /* vaesdeclast */
|
||||
{ { 0xf2 }, 2, T, R, pfx_no, Wn, L0 }, /* andn */
|
||||
{ { 0xf3, 0x08 }, 2, T, R, pfx_no, Wn, L0 }, /* blsr */
|
||||
{ { 0xf3, 0x10 }, 2, T, R, pfx_no, Wn, L0 }, /* blsmsk */
|
||||
{ { 0xf3, 0x18 }, 2, T, R, pfx_no, Wn, L0 }, /* blsi */
|
||||
{ { 0xf5 }, 2, T, R, pfx_no, Wn, L0 }, /* bzhi */
|
||||
{ { 0xf5 }, 2, T, R, pfx_f3, Wn, L0 }, /* pext */
|
||||
{ { 0xf5 }, 2, T, R, pfx_f2, Wn, L0 }, /* pdep */
|
||||
{ { 0xf6 }, 2, T, R, pfx_f2, Wn, L0 }, /* mulx */
|
||||
{ { 0xf7 }, 2, T, R, pfx_no, Wn, L0 }, /* bextr */
|
||||
{ { 0xf7 }, 2, T, R, pfx_66, Wn, L0 }, /* shlx */
|
||||
{ { 0xf7 }, 2, T, R, pfx_f3, Wn, L0 }, /* sarx */
|
||||
{ { 0xf7 }, 2, T, R, pfx_f2, Wn, L0 }, /* shrx */
|
||||
}, vex_0f3a[] = {
|
||||
{ { 0x00 }, 3, T, R, pfx_66, W1, L1 }, /* vpermq */
|
||||
{ { 0x01 }, 3, T, R, pfx_66, W1, L1 }, /* vpermpd */
|
||||
{ { 0x02 }, 3, T, R, pfx_66, W0, Ln }, /* vpblendd */
|
||||
{ { 0x04 }, 3, T, R, pfx_66, W0, Ln }, /* vpermilps */
|
||||
{ { 0x05 }, 3, T, R, pfx_66, W0, Ln }, /* vpermilpd */
|
||||
{ { 0x06 }, 3, T, R, pfx_66, W0, L1 }, /* vperm2f128 */
|
||||
{ { 0x08 }, 3, T, R, pfx_66, WIG, Ln }, /* vroundps */
|
||||
{ { 0x09 }, 3, T, R, pfx_66, WIG, Ln }, /* vroundpd */
|
||||
{ { 0x0a }, 3, T, R, pfx_66, WIG, LIG }, /* vroundss */
|
||||
{ { 0x0b }, 3, T, R, pfx_66, WIG, LIG }, /* vroundsd */
|
||||
{ { 0x0c }, 3, T, R, pfx_66, WIG, Ln }, /* vblendps */
|
||||
{ { 0x0d }, 3, T, R, pfx_66, WIG, Ln }, /* vblendpd */
|
||||
{ { 0x0e }, 3, T, R, pfx_66, WIG, Ln }, /* vpblendw */
|
||||
{ { 0x0f }, 3, T, R, pfx_66, WIG, Ln }, /* vpalignr */
|
||||
{ { 0x14 }, 3, T, W, pfx_66, WIG, L0 }, /* vpextrb */
|
||||
{ { 0x15 }, 3, T, W, pfx_66, WIG, L0 }, /* vpextrw */
|
||||
{ { 0x16 }, 3, T, W, pfx_66, Wn, L0 }, /* vpextr{d,q} */
|
||||
{ { 0x17 }, 3, T, W, pfx_66, WIG, L0 }, /* vextractps */
|
||||
{ { 0x18 }, 3, T, R, pfx_66, W0, L1 }, /* vinsertf128 */
|
||||
{ { 0x19 }, 3, T, W, pfx_66, W0, L1 }, /* vextractf128 */
|
||||
{ { 0x1d }, 3, T, W, pfx_66, W0, Ln }, /* vcvtps2ph */
|
||||
{ { 0x20 }, 3, T, R, pfx_66, WIG, L0 }, /* vpinsrb */
|
||||
{ { 0x21 }, 3, T, R, pfx_66, WIG, L0 }, /* vinsertps */
|
||||
{ { 0x22 }, 3, T, R, pfx_66, Wn, L0 }, /* vpinsr{d,q} */
|
||||
{ { 0x30, 0xc0 }, 3, F, N, pfx_66, Wn, L0 }, /* kshiftr{b,w} */
|
||||
{ { 0x31, 0xc0 }, 3, F, N, pfx_66, Wn, L0 }, /* kshiftr{d,q} */
|
||||
{ { 0x32, 0xc0 }, 3, F, N, pfx_66, Wn, L0 }, /* kshiftl{b,w} */
|
||||
{ { 0x33, 0xc0 }, 3, F, N, pfx_66, Wn, L0 }, /* kshiftl{d,q} */
|
||||
{ { 0x38 }, 3, T, R, pfx_66, W0, L1 }, /* vinserti128 */
|
||||
{ { 0x39 }, 3, T, W, pfx_66, W0, L1 }, /* vextracti128 */
|
||||
{ { 0x40 }, 3, T, R, pfx_66, WIG, Ln }, /* vdpps */
|
||||
{ { 0x41 }, 3, T, R, pfx_66, WIG, Ln }, /* vdppd */
|
||||
{ { 0x42 }, 3, T, R, pfx_66, WIG, Ln }, /* vmpsadbw */
|
||||
{ { 0x44 }, 3, T, R, pfx_66, WIG, Ln }, /* vpclmulqdq */
|
||||
{ { 0x46 }, 3, T, R, pfx_66, W0, L1 }, /* vperm2i128 */
|
||||
{ { 0x48 }, 3, T, R, pfx_66, Wn, Ln }, /* vpermil2ps */
|
||||
{ { 0x49 }, 3, T, R, pfx_66, Wn, Ln }, /* vpermil2pd */
|
||||
{ { 0x4a }, 3, T, R, pfx_66, W0, Ln }, /* vblendvps */
|
||||
{ { 0x4b }, 3, T, R, pfx_66, W0, Ln }, /* vblendvpd */
|
||||
{ { 0x4c }, 3, T, R, pfx_66, W0, Ln }, /* vpblendvb */
|
||||
{ { 0x5c }, 3, T, R, pfx_66, Wn, Ln }, /* vfmaddsubps */
|
||||
{ { 0x5d }, 3, T, R, pfx_66, Wn, Ln }, /* vfmaddsubpd */
|
||||
{ { 0x5e }, 3, T, R, pfx_66, Wn, Ln }, /* vfmsubaddps */
|
||||
{ { 0x5f }, 3, T, R, pfx_66, Wn, Ln }, /* vfmsubaddpd */
|
||||
{ { 0x60 }, 3, T, R, pfx_66, WIG, L0 }, /* vpcmpestrm */
|
||||
{ { 0x61 }, 3, T, R, pfx_66, WIG, L0 }, /* vpcmpestri */
|
||||
{ { 0x62 }, 3, T, R, pfx_66, WIG, L0 }, /* vpcmpistrm */
|
||||
{ { 0x63 }, 3, T, R, pfx_66, WIG, L0 }, /* vpcmpistri */
|
||||
{ { 0x68 }, 3, T, R, pfx_66, Wn, Ln }, /* vfmaddps */
|
||||
{ { 0x69 }, 3, T, R, pfx_66, Wn, Ln }, /* vfmaddpd */
|
||||
{ { 0x6a }, 3, T, R, pfx_66, Wn, LIG }, /* vfmaddss */
|
||||
{ { 0x6b }, 3, T, R, pfx_66, Wn, LIG }, /* vfmaddsd */
|
||||
{ { 0x6c }, 3, T, R, pfx_66, Wn, Ln }, /* vfmsubps */
|
||||
{ { 0x6d }, 3, T, R, pfx_66, Wn, Ln }, /* vfmsubpd */
|
||||
{ { 0x6e }, 3, T, R, pfx_66, Wn, LIG }, /* vfmsubss */
|
||||
{ { 0x6f }, 3, T, R, pfx_66, Wn, LIG }, /* vfmsubsd */
|
||||
{ { 0x78 }, 3, T, R, pfx_66, Wn, Ln }, /* vfnmaddps */
|
||||
{ { 0x79 }, 3, T, R, pfx_66, Wn, Ln }, /* vfnmaddpd */
|
||||
{ { 0x7a }, 3, T, R, pfx_66, Wn, LIG }, /* vfnmaddss */
|
||||
{ { 0x7b }, 3, T, R, pfx_66, Wn, LIG }, /* vfnmaddsd */
|
||||
{ { 0x7c }, 3, T, R, pfx_66, Wn, Ln }, /* vfnmsubps */
|
||||
{ { 0x7d }, 3, T, R, pfx_66, Wn, Ln }, /* vfnmsubpd */
|
||||
{ { 0x7e }, 3, T, R, pfx_66, Wn, LIG }, /* vfnmsubss */
|
||||
{ { 0x7f }, 3, T, R, pfx_66, Wn, LIG }, /* vfnmsubsd */
|
||||
{ { 0xce }, 3, T, R, pfx_66, W1, Ln }, /* vgf2p8affineqb */
|
||||
{ { 0xcf }, 3, T, R, pfx_66, W1, Ln }, /* vgf2p8affineinvqb */
|
||||
{ { 0xdf }, 3, T, R, pfx_66, WIG, Ln }, /* vaeskeygenassist */
|
||||
{ { 0xf0 }, 3, T, R, pfx_f2, Wn, L0 }, /* rorx */
|
||||
};
|
||||
|
||||
static const struct {
|
||||
const struct vex *tbl;
|
||||
unsigned int num;
|
||||
} vex[] = {
|
||||
{ vex_0f, ARRAY_SIZE(vex_0f) },
|
||||
{ vex_0f38, ARRAY_SIZE(vex_0f38) },
|
||||
{ vex_0f3a, ARRAY_SIZE(vex_0f3a) },
|
||||
};
|
||||
|
||||
#undef Wn
|
||||
#undef Ln
|
||||
|
||||
#undef F
|
||||
#undef N
|
||||
#undef R
|
||||
@@ -1125,7 +1568,7 @@ void predicates_test(void *instr, struct x86_emulate_ctxt *ctxt,
|
||||
|
||||
for ( m = 0; m < sizeof(long) / sizeof(int); ++m )
|
||||
{
|
||||
unsigned int t;
|
||||
unsigned int t, x;
|
||||
|
||||
ctxt->addr_size = 32 << m;
|
||||
ctxt->sp_size = 32 << m;
|
||||
@@ -1211,6 +1654,90 @@ void predicates_test(void *instr, struct x86_emulate_ctxt *ctxt,
|
||||
ctxt, fetch);
|
||||
}
|
||||
|
||||
for ( t = 0; t < ARRAY_SIZE(vex_0f); ++t )
|
||||
{
|
||||
if ( vex_0f[t].w == WIG || (vex_0f[t].w & W0) )
|
||||
{
|
||||
uint8_t *ptr = instr;
|
||||
|
||||
memset(instr + 3, 0xcc, 12);
|
||||
|
||||
*ptr++ = 0xc5;
|
||||
*ptr++ = 0xf8 | vex_0f[t].pfx;
|
||||
memcpy(ptr, vex_0f[t].opc, vex_0f[t].len);
|
||||
|
||||
if ( vex_0f[t].l == LIG || (vex_0f[t].l & L0) )
|
||||
do_test(instr, vex_0f[t].len + ((void *)ptr - instr),
|
||||
vex_0f[t].modrm ? (void *)ptr - instr + 1 : 0,
|
||||
vex_0f[t].mem, ctxt, fetch);
|
||||
|
||||
if ( vex_0f[t].l == LIG || (vex_0f[t].l & L1) )
|
||||
{
|
||||
ptr[-1] |= 4;
|
||||
memcpy(ptr, vex_0f[t].opc, vex_0f[t].len);
|
||||
|
||||
do_test(instr, vex_0f[t].len + ((void *)ptr - instr),
|
||||
vex_0f[t].modrm ? (void *)ptr - instr + 1 : 0,
|
||||
vex_0f[t].mem, ctxt, fetch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for ( x = 0; x < ARRAY_SIZE(vex); ++x )
|
||||
{
|
||||
for ( t = 0; t < vex[x].num; ++t )
|
||||
{
|
||||
uint8_t *ptr = instr;
|
||||
|
||||
memset(instr + 4, 0xcc, 11);
|
||||
|
||||
*ptr++ = 0xc4;
|
||||
*ptr++ = 0xe1 + x;
|
||||
*ptr++ = 0x78 | vex[x].tbl[t].pfx;
|
||||
|
||||
if ( vex[x].tbl[t].w == WIG || (vex[x].tbl[t].w & W0) )
|
||||
{
|
||||
memcpy(ptr, vex[x].tbl[t].opc, vex[x].tbl[t].len);
|
||||
|
||||
if ( vex[x].tbl[t].l == LIG || (vex[x].tbl[t].l & L0) )
|
||||
do_test(instr, vex[x].tbl[t].len + ((void *)ptr - instr),
|
||||
vex[x].tbl[t].modrm ? (void *)ptr - instr + 1 : 0,
|
||||
vex[x].tbl[t].mem, ctxt, fetch);
|
||||
|
||||
if ( vex[x].tbl[t].l == LIG || (vex[x].tbl[t].l & L1) )
|
||||
{
|
||||
ptr[-1] |= 4;
|
||||
memcpy(ptr, vex[x].tbl[t].opc, vex[x].tbl[t].len);
|
||||
|
||||
do_test(instr, vex[x].tbl[t].len + ((void *)ptr - instr),
|
||||
vex[x].tbl[t].modrm ? (void *)ptr - instr + 1 : 0,
|
||||
vex[x].tbl[t].mem, ctxt, fetch);
|
||||
}
|
||||
}
|
||||
|
||||
if ( vex[x].tbl[t].w == WIG || (vex[x].tbl[t].w & W1) )
|
||||
{
|
||||
ptr[-1] = 0xf8 | vex[x].tbl[t].pfx;
|
||||
memcpy(ptr, vex[x].tbl[t].opc, vex[x].tbl[t].len);
|
||||
|
||||
if ( vex[x].tbl[t].l == LIG || (vex[x].tbl[t].l & L0) )
|
||||
do_test(instr, vex[x].tbl[t].len + ((void *)ptr - instr),
|
||||
vex[x].tbl[t].modrm ? (void *)ptr - instr + 1 : 0,
|
||||
vex[x].tbl[t].mem, ctxt, fetch);
|
||||
|
||||
if ( vex[x].tbl[t].l == LIG || (vex[x].tbl[t].l & L1) )
|
||||
{
|
||||
ptr[-1] |= 4;
|
||||
memcpy(ptr, vex[x].tbl[t].opc, vex[x].tbl[t].len);
|
||||
|
||||
do_test(instr, vex[x].tbl[t].len + ((void *)ptr - instr),
|
||||
vex[x].tbl[t].modrm ? (void *)ptr - instr + 1 : 0,
|
||||
vex[x].tbl[t].mem, ctxt, fetch);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( errors )
|
||||
exit(1);
|
||||
|
||||
|
||||