mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
Changes:
- Extend the x86 instruction decoder with APX and other new instructions - Misc cleanups Signed-off-by: Ingo Molnar <mingo@kernel.org> -----BEGIN PGP SIGNATURE----- iQJFBAABCgAvFiEEBpT5eoXrXCwVQwEKEnMQ0APhK1gFAmZIa8ERHG1pbmdvQGtl cm5lbC5vcmcACgkQEnMQ0APhK1gHbw//Zet6K5cbgp5QB570J+rdDyViAl+spYxt sbWk8CUg0/jk5oSo45psl9xR8mmSPpeEOpTsuJPzEGfbunvTLU8G6HV/l1EDAk8I Yeia3zLvssTfsirIfSck6spSDRmCRQTiKWibj2mlXSFlXRuVXiIKmbSYZGyx4vk6 5zkKuC6+k77X1qlWYCl9M9Sn0nWr/oEuXPXotliDqhev/DdhP5iBniKHEhkzUOEn KHtfFTu0B4GbTC1w3hZ3Dmbqz3nrdXf56Py1Vf/uMyzP3UhuE0vE+tC4h7TnfZf6 LBTLEpw+K4KRuppcI2PbEMvzfMT41rtx7S8u83gzKIBhqrfSm1L6OSi8UEOph68G +p1IS1H4c4woY+0JefaFLiTeweuws4L45PiNNa4qnQp9HX/3G3bTt+kc1vddbfjg x7pnIntSDKwLtKfo5GYJ+OtTfKQRC13dQroLujsmFa0/me3MbFao+i50UlAoWWBa 1qSCsJpSpGAhYlchxBVfitiiLVpGU7+O39m6ZosA6n2HGSpfgfW1p3xigaPYRISq GcedKmx8lIThe483T0Y8/Bk2QtCeVCryZb9Qij3B2NKFttlNJaGx/iabE2AuLheY qnEEQ5UqYgrXEJz1Vu/QqR5Yb9dqkC2MID8llawK66M+kH91cXSXg7RcBEkoLBF4 eT9AuGGWMp4= =mmyf -----END PGP SIGNATURE----- Merge tag 'perf-urgent-2024-05-18' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull perf event updates from Ingo Molnar: - Extend the x86 instruction decoder with APX and other new instructions - Misc cleanups * tag 'perf-urgent-2024-05-18' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: perf/x86/cstate: Remove unused 'struct perf_cstate_msr' perf/x86/rapl: Rename 'maxdie' to nr_rapl_pmu and 'dieid' to rapl_pmu_idx x86/insn: Add support for APX EVEX instructions to the opcode map x86/insn: Add support for APX EVEX to the instruction decoder logic x86/insn: x86/insn: Add support for REX2 prefix to the instruction decoder opcode map x86/insn: Add support for REX2 prefix to the instruction decoder logic x86/insn: Add misc new Intel instructions x86/insn: Add VEX versions of VPDPBUSD, VPDPBUSDS, VPDPWSSD and VPDPWSSDS x86/insn: Fix PUSH instruction in x86 instruction decoder opcode map x86/insn: Add Key Locker instructions to the opcode map
This commit is contained in:
commit
fe0d43f231
@ -143,12 +143,6 @@ struct cstate_model {
|
||||
#define SLM_PKG_C6_USE_C7_MSR (1UL << 0)
|
||||
#define KNL_CORE_C6_MSR (1UL << 1)
|
||||
|
||||
struct perf_cstate_msr {
|
||||
u64 msr;
|
||||
struct perf_pmu_events_attr *attr;
|
||||
};
|
||||
|
||||
|
||||
/* cstate_core PMU */
|
||||
static struct pmu cstate_core_pmu;
|
||||
static bool has_cstate_core;
|
||||
|
@ -114,8 +114,8 @@ struct rapl_pmu {
|
||||
|
||||
struct rapl_pmus {
|
||||
struct pmu pmu;
|
||||
unsigned int maxdie;
|
||||
struct rapl_pmu *pmus[] __counted_by(maxdie);
|
||||
unsigned int nr_rapl_pmu;
|
||||
struct rapl_pmu *pmus[] __counted_by(nr_rapl_pmu);
|
||||
};
|
||||
|
||||
enum rapl_unit_quirk {
|
||||
@ -141,13 +141,13 @@ static struct perf_msr *rapl_msrs;
|
||||
|
||||
static inline struct rapl_pmu *cpu_to_rapl_pmu(unsigned int cpu)
|
||||
{
|
||||
unsigned int dieid = topology_logical_die_id(cpu);
|
||||
unsigned int rapl_pmu_idx = topology_logical_die_id(cpu);
|
||||
|
||||
/*
|
||||
* The unsigned check also catches the '-1' return value for non
|
||||
* existent mappings in the topology map.
|
||||
*/
|
||||
return dieid < rapl_pmus->maxdie ? rapl_pmus->pmus[dieid] : NULL;
|
||||
return rapl_pmu_idx < rapl_pmus->nr_rapl_pmu ? rapl_pmus->pmus[rapl_pmu_idx] : NULL;
|
||||
}
|
||||
|
||||
static inline u64 rapl_read_counter(struct perf_event *event)
|
||||
@ -658,7 +658,7 @@ static void cleanup_rapl_pmus(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < rapl_pmus->maxdie; i++)
|
||||
for (i = 0; i < rapl_pmus->nr_rapl_pmu; i++)
|
||||
kfree(rapl_pmus->pmus[i]);
|
||||
kfree(rapl_pmus);
|
||||
}
|
||||
@ -674,13 +674,13 @@ static const struct attribute_group *rapl_attr_update[] = {
|
||||
|
||||
static int __init init_rapl_pmus(void)
|
||||
{
|
||||
int maxdie = topology_max_packages() * topology_max_dies_per_package();
|
||||
int nr_rapl_pmu = topology_max_packages() * topology_max_dies_per_package();
|
||||
|
||||
rapl_pmus = kzalloc(struct_size(rapl_pmus, pmus, maxdie), GFP_KERNEL);
|
||||
rapl_pmus = kzalloc(struct_size(rapl_pmus, pmus, nr_rapl_pmu), GFP_KERNEL);
|
||||
if (!rapl_pmus)
|
||||
return -ENOMEM;
|
||||
|
||||
rapl_pmus->maxdie = maxdie;
|
||||
rapl_pmus->nr_rapl_pmu = nr_rapl_pmu;
|
||||
rapl_pmus->pmu.attr_groups = rapl_attr_groups;
|
||||
rapl_pmus->pmu.attr_update = rapl_attr_update;
|
||||
rapl_pmus->pmu.task_ctx_nr = perf_invalid_context;
|
||||
|
@ -35,6 +35,8 @@
|
||||
#define INAT_PFX_VEX2 13 /* 2-bytes VEX prefix */
|
||||
#define INAT_PFX_VEX3 14 /* 3-bytes VEX prefix */
|
||||
#define INAT_PFX_EVEX 15 /* EVEX prefix */
|
||||
/* x86-64 REX2 prefix */
|
||||
#define INAT_PFX_REX2 16 /* 0xD5 */
|
||||
|
||||
#define INAT_LSTPFX_MAX 3
|
||||
#define INAT_LGCPFX_MAX 11
|
||||
@ -50,7 +52,7 @@
|
||||
|
||||
/* Legacy prefix */
|
||||
#define INAT_PFX_OFFS 0
|
||||
#define INAT_PFX_BITS 4
|
||||
#define INAT_PFX_BITS 5
|
||||
#define INAT_PFX_MAX ((1 << INAT_PFX_BITS) - 1)
|
||||
#define INAT_PFX_MASK (INAT_PFX_MAX << INAT_PFX_OFFS)
|
||||
/* Escape opcodes */
|
||||
@ -77,6 +79,9 @@
|
||||
#define INAT_VEXOK (1 << (INAT_FLAG_OFFS + 5))
|
||||
#define INAT_VEXONLY (1 << (INAT_FLAG_OFFS + 6))
|
||||
#define INAT_EVEXONLY (1 << (INAT_FLAG_OFFS + 7))
|
||||
#define INAT_NO_REX2 (1 << (INAT_FLAG_OFFS + 8))
|
||||
#define INAT_REX2_VARIANT (1 << (INAT_FLAG_OFFS + 9))
|
||||
#define INAT_EVEX_SCALABLE (1 << (INAT_FLAG_OFFS + 10))
|
||||
/* Attribute making macros for attribute tables */
|
||||
#define INAT_MAKE_PREFIX(pfx) (pfx << INAT_PFX_OFFS)
|
||||
#define INAT_MAKE_ESCAPE(esc) (esc << INAT_ESC_OFFS)
|
||||
@ -128,6 +133,11 @@ static inline int inat_is_rex_prefix(insn_attr_t attr)
|
||||
return (attr & INAT_PFX_MASK) == INAT_PFX_REX;
|
||||
}
|
||||
|
||||
static inline int inat_is_rex2_prefix(insn_attr_t attr)
|
||||
{
|
||||
return (attr & INAT_PFX_MASK) == INAT_PFX_REX2;
|
||||
}
|
||||
|
||||
static inline int inat_last_prefix_id(insn_attr_t attr)
|
||||
{
|
||||
if ((attr & INAT_PFX_MASK) > INAT_LSTPFX_MAX)
|
||||
@ -227,4 +237,9 @@ static inline int inat_must_evex(insn_attr_t attr)
|
||||
{
|
||||
return attr & INAT_EVEXONLY;
|
||||
}
|
||||
|
||||
static inline int inat_evex_scalable(insn_attr_t attr)
|
||||
{
|
||||
return attr & INAT_EVEX_SCALABLE;
|
||||
}
|
||||
#endif
|
||||
|
@ -112,10 +112,15 @@ struct insn {
|
||||
#define X86_SIB_INDEX(sib) (((sib) & 0x38) >> 3)
|
||||
#define X86_SIB_BASE(sib) ((sib) & 0x07)
|
||||
|
||||
#define X86_REX_W(rex) ((rex) & 8)
|
||||
#define X86_REX_R(rex) ((rex) & 4)
|
||||
#define X86_REX_X(rex) ((rex) & 2)
|
||||
#define X86_REX_B(rex) ((rex) & 1)
|
||||
#define X86_REX2_M(rex) ((rex) & 0x80) /* REX2 M0 */
|
||||
#define X86_REX2_R(rex) ((rex) & 0x40) /* REX2 R4 */
|
||||
#define X86_REX2_X(rex) ((rex) & 0x20) /* REX2 X4 */
|
||||
#define X86_REX2_B(rex) ((rex) & 0x10) /* REX2 B4 */
|
||||
|
||||
#define X86_REX_W(rex) ((rex) & 8) /* REX or REX2 W */
|
||||
#define X86_REX_R(rex) ((rex) & 4) /* REX or REX2 R3 */
|
||||
#define X86_REX_X(rex) ((rex) & 2) /* REX or REX2 X3 */
|
||||
#define X86_REX_B(rex) ((rex) & 1) /* REX or REX2 B3 */
|
||||
|
||||
/* VEX bit flags */
|
||||
#define X86_VEX_W(vex) ((vex) & 0x80) /* VEX3 Byte2 */
|
||||
@ -161,6 +166,18 @@ static inline void insn_get_attribute(struct insn *insn)
|
||||
/* Instruction uses RIP-relative addressing */
|
||||
extern int insn_rip_relative(struct insn *insn);
|
||||
|
||||
static inline int insn_is_rex2(struct insn *insn)
|
||||
{
|
||||
if (!insn->prefixes.got)
|
||||
insn_get_prefixes(insn);
|
||||
return insn->rex_prefix.nbytes == 2;
|
||||
}
|
||||
|
||||
static inline insn_byte_t insn_rex2_m_bit(struct insn *insn)
|
||||
{
|
||||
return X86_REX2_M(insn->rex_prefix.bytes[1]);
|
||||
}
|
||||
|
||||
static inline int insn_is_avx(struct insn *insn)
|
||||
{
|
||||
if (!insn->prefixes.got)
|
||||
@ -198,6 +215,13 @@ static inline insn_byte_t insn_vex_p_bits(struct insn *insn)
|
||||
return X86_VEX_P(insn->vex_prefix.bytes[2]);
|
||||
}
|
||||
|
||||
static inline insn_byte_t insn_vex_w_bit(struct insn *insn)
|
||||
{
|
||||
if (insn->vex_prefix.nbytes < 3)
|
||||
return 0;
|
||||
return X86_VEX_W(insn->vex_prefix.bytes[2]);
|
||||
}
|
||||
|
||||
/* Get the last prefix id from last prefix or VEX prefix */
|
||||
static inline int insn_last_prefix_id(struct insn *insn)
|
||||
{
|
||||
|
@ -185,6 +185,17 @@ found:
|
||||
if (X86_REX_W(b))
|
||||
/* REX.W overrides opnd_size */
|
||||
insn->opnd_bytes = 8;
|
||||
} else if (inat_is_rex2_prefix(attr)) {
|
||||
insn_set_byte(&insn->rex_prefix, 0, b);
|
||||
b = peek_nbyte_next(insn_byte_t, insn, 1);
|
||||
insn_set_byte(&insn->rex_prefix, 1, b);
|
||||
insn->rex_prefix.nbytes = 2;
|
||||
insn->next_byte += 2;
|
||||
if (X86_REX_W(b))
|
||||
/* REX.W overrides opnd_size */
|
||||
insn->opnd_bytes = 8;
|
||||
insn->rex_prefix.got = 1;
|
||||
goto vex_end;
|
||||
}
|
||||
}
|
||||
insn->rex_prefix.got = 1;
|
||||
@ -283,6 +294,10 @@ int insn_get_opcode(struct insn *insn)
|
||||
m = insn_vex_m_bits(insn);
|
||||
p = insn_vex_p_bits(insn);
|
||||
insn->attr = inat_get_avx_attribute(op, m, p);
|
||||
/* SCALABLE EVEX uses p bits to encode operand size */
|
||||
if (inat_evex_scalable(insn->attr) && !insn_vex_w_bit(insn) &&
|
||||
p == INAT_PFX_OPNDSZ)
|
||||
insn->opnd_bytes = 2;
|
||||
if ((inat_must_evex(insn->attr) && !insn_is_evex(insn)) ||
|
||||
(!inat_accept_vex(insn->attr) &&
|
||||
!inat_is_group(insn->attr))) {
|
||||
@ -294,6 +309,20 @@ int insn_get_opcode(struct insn *insn)
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* Check if there is REX2 prefix or not */
|
||||
if (insn_is_rex2(insn)) {
|
||||
if (insn_rex2_m_bit(insn)) {
|
||||
/* map 1 is escape 0x0f */
|
||||
insn_attr_t esc_attr = inat_get_opcode_attribute(0x0f);
|
||||
|
||||
pfx_id = insn_last_prefix_id(insn);
|
||||
insn->attr = inat_get_escape_attribute(op, pfx_id, esc_attr);
|
||||
} else {
|
||||
insn->attr = inat_get_opcode_attribute(op);
|
||||
}
|
||||
goto end;
|
||||
}
|
||||
|
||||
insn->attr = inat_get_opcode_attribute(op);
|
||||
while (inat_is_escape(insn->attr)) {
|
||||
/* Get escaped opcode */
|
||||
|
@ -23,6 +23,7 @@
|
||||
#
|
||||
# AVX Superscripts
|
||||
# (ev): this opcode requires EVEX prefix.
|
||||
# (es): this opcode requires EVEX prefix and is SCALABALE.
|
||||
# (evo): this opcode is changed by EVEX prefix (EVEX opcode)
|
||||
# (v): this opcode requires VEX prefix.
|
||||
# (v1): this opcode only supports 128bit VEX.
|
||||
@ -33,6 +34,10 @@
|
||||
# - (F2): the last prefix is 0xF2
|
||||
# - (!F3) : the last prefix is not 0xF3 (including non-last prefix case)
|
||||
# - (66&F2): Both 0x66 and 0xF2 prefixes are specified.
|
||||
#
|
||||
# REX2 Prefix
|
||||
# - (!REX2): REX2 is not allowed
|
||||
# - (REX2): REX2 variant e.g. JMPABS
|
||||
|
||||
Table: one byte opcode
|
||||
Referrer:
|
||||
@ -148,7 +153,7 @@ AVXcode:
|
||||
65: SEG=GS (Prefix)
|
||||
66: Operand-Size (Prefix)
|
||||
67: Address-Size (Prefix)
|
||||
68: PUSH Iz (d64)
|
||||
68: PUSH Iz
|
||||
69: IMUL Gv,Ev,Iz
|
||||
6a: PUSH Ib (d64)
|
||||
6b: IMUL Gv,Ev,Ib
|
||||
@ -157,22 +162,22 @@ AVXcode:
|
||||
6e: OUTS/OUTSB DX,Xb
|
||||
6f: OUTS/OUTSW/OUTSD DX,Xz
|
||||
# 0x70 - 0x7f
|
||||
70: JO Jb
|
||||
71: JNO Jb
|
||||
72: JB/JNAE/JC Jb
|
||||
73: JNB/JAE/JNC Jb
|
||||
74: JZ/JE Jb
|
||||
75: JNZ/JNE Jb
|
||||
76: JBE/JNA Jb
|
||||
77: JNBE/JA Jb
|
||||
78: JS Jb
|
||||
79: JNS Jb
|
||||
7a: JP/JPE Jb
|
||||
7b: JNP/JPO Jb
|
||||
7c: JL/JNGE Jb
|
||||
7d: JNL/JGE Jb
|
||||
7e: JLE/JNG Jb
|
||||
7f: JNLE/JG Jb
|
||||
70: JO Jb (!REX2)
|
||||
71: JNO Jb (!REX2)
|
||||
72: JB/JNAE/JC Jb (!REX2)
|
||||
73: JNB/JAE/JNC Jb (!REX2)
|
||||
74: JZ/JE Jb (!REX2)
|
||||
75: JNZ/JNE Jb (!REX2)
|
||||
76: JBE/JNA Jb (!REX2)
|
||||
77: JNBE/JA Jb (!REX2)
|
||||
78: JS Jb (!REX2)
|
||||
79: JNS Jb (!REX2)
|
||||
7a: JP/JPE Jb (!REX2)
|
||||
7b: JNP/JPO Jb (!REX2)
|
||||
7c: JL/JNGE Jb (!REX2)
|
||||
7d: JNL/JGE Jb (!REX2)
|
||||
7e: JLE/JNG Jb (!REX2)
|
||||
7f: JNLE/JG Jb (!REX2)
|
||||
# 0x80 - 0x8f
|
||||
80: Grp1 Eb,Ib (1A)
|
||||
81: Grp1 Ev,Iz (1A)
|
||||
@ -208,24 +213,24 @@ AVXcode:
|
||||
9e: SAHF
|
||||
9f: LAHF
|
||||
# 0xa0 - 0xaf
|
||||
a0: MOV AL,Ob
|
||||
a1: MOV rAX,Ov
|
||||
a2: MOV Ob,AL
|
||||
a3: MOV Ov,rAX
|
||||
a4: MOVS/B Yb,Xb
|
||||
a5: MOVS/W/D/Q Yv,Xv
|
||||
a6: CMPS/B Xb,Yb
|
||||
a7: CMPS/W/D Xv,Yv
|
||||
a8: TEST AL,Ib
|
||||
a9: TEST rAX,Iz
|
||||
aa: STOS/B Yb,AL
|
||||
ab: STOS/W/D/Q Yv,rAX
|
||||
ac: LODS/B AL,Xb
|
||||
ad: LODS/W/D/Q rAX,Xv
|
||||
ae: SCAS/B AL,Yb
|
||||
a0: MOV AL,Ob (!REX2)
|
||||
a1: MOV rAX,Ov (!REX2) | JMPABS O (REX2),(o64)
|
||||
a2: MOV Ob,AL (!REX2)
|
||||
a3: MOV Ov,rAX (!REX2)
|
||||
a4: MOVS/B Yb,Xb (!REX2)
|
||||
a5: MOVS/W/D/Q Yv,Xv (!REX2)
|
||||
a6: CMPS/B Xb,Yb (!REX2)
|
||||
a7: CMPS/W/D Xv,Yv (!REX2)
|
||||
a8: TEST AL,Ib (!REX2)
|
||||
a9: TEST rAX,Iz (!REX2)
|
||||
aa: STOS/B Yb,AL (!REX2)
|
||||
ab: STOS/W/D/Q Yv,rAX (!REX2)
|
||||
ac: LODS/B AL,Xb (!REX2)
|
||||
ad: LODS/W/D/Q rAX,Xv (!REX2)
|
||||
ae: SCAS/B AL,Yb (!REX2)
|
||||
# Note: The May 2011 Intel manual shows Xv for the second parameter of the
|
||||
# next instruction but Yv is correct
|
||||
af: SCAS/W/D/Q rAX,Yv
|
||||
af: SCAS/W/D/Q rAX,Yv (!REX2)
|
||||
# 0xb0 - 0xbf
|
||||
b0: MOV AL/R8L,Ib
|
||||
b1: MOV CL/R9L,Ib
|
||||
@ -266,7 +271,7 @@ d1: Grp2 Ev,1 (1A)
|
||||
d2: Grp2 Eb,CL (1A)
|
||||
d3: Grp2 Ev,CL (1A)
|
||||
d4: AAM Ib (i64)
|
||||
d5: AAD Ib (i64)
|
||||
d5: AAD Ib (i64) | REX2 (Prefix),(o64)
|
||||
d6:
|
||||
d7: XLAT/XLATB
|
||||
d8: ESC
|
||||
@ -281,26 +286,26 @@ df: ESC
|
||||
# Note: "forced64" is Intel CPU behavior: they ignore 0x66 prefix
|
||||
# in 64-bit mode. AMD CPUs accept 0x66 prefix, it causes RIP truncation
|
||||
# to 16 bits. In 32-bit mode, 0x66 is accepted by both Intel and AMD.
|
||||
e0: LOOPNE/LOOPNZ Jb (f64)
|
||||
e1: LOOPE/LOOPZ Jb (f64)
|
||||
e2: LOOP Jb (f64)
|
||||
e3: JrCXZ Jb (f64)
|
||||
e4: IN AL,Ib
|
||||
e5: IN eAX,Ib
|
||||
e6: OUT Ib,AL
|
||||
e7: OUT Ib,eAX
|
||||
e0: LOOPNE/LOOPNZ Jb (f64) (!REX2)
|
||||
e1: LOOPE/LOOPZ Jb (f64) (!REX2)
|
||||
e2: LOOP Jb (f64) (!REX2)
|
||||
e3: JrCXZ Jb (f64) (!REX2)
|
||||
e4: IN AL,Ib (!REX2)
|
||||
e5: IN eAX,Ib (!REX2)
|
||||
e6: OUT Ib,AL (!REX2)
|
||||
e7: OUT Ib,eAX (!REX2)
|
||||
# With 0x66 prefix in 64-bit mode, for AMD CPUs immediate offset
|
||||
# in "near" jumps and calls is 16-bit. For CALL,
|
||||
# push of return address is 16-bit wide, RSP is decremented by 2
|
||||
# but is not truncated to 16 bits, unlike RIP.
|
||||
e8: CALL Jz (f64)
|
||||
e9: JMP-near Jz (f64)
|
||||
ea: JMP-far Ap (i64)
|
||||
eb: JMP-short Jb (f64)
|
||||
ec: IN AL,DX
|
||||
ed: IN eAX,DX
|
||||
ee: OUT DX,AL
|
||||
ef: OUT DX,eAX
|
||||
e8: CALL Jz (f64) (!REX2)
|
||||
e9: JMP-near Jz (f64) (!REX2)
|
||||
ea: JMP-far Ap (i64) (!REX2)
|
||||
eb: JMP-short Jb (f64) (!REX2)
|
||||
ec: IN AL,DX (!REX2)
|
||||
ed: IN eAX,DX (!REX2)
|
||||
ee: OUT DX,AL (!REX2)
|
||||
ef: OUT DX,eAX (!REX2)
|
||||
# 0xf0 - 0xff
|
||||
f0: LOCK (Prefix)
|
||||
f1:
|
||||
@ -386,14 +391,14 @@ AVXcode: 1
|
||||
2e: vucomiss Vss,Wss (v1) | vucomisd Vsd,Wsd (66),(v1)
|
||||
2f: vcomiss Vss,Wss (v1) | vcomisd Vsd,Wsd (66),(v1)
|
||||
# 0x0f 0x30-0x3f
|
||||
30: WRMSR
|
||||
31: RDTSC
|
||||
32: RDMSR
|
||||
33: RDPMC
|
||||
34: SYSENTER
|
||||
35: SYSEXIT
|
||||
30: WRMSR (!REX2)
|
||||
31: RDTSC (!REX2)
|
||||
32: RDMSR (!REX2)
|
||||
33: RDPMC (!REX2)
|
||||
34: SYSENTER (!REX2)
|
||||
35: SYSEXIT (!REX2)
|
||||
36:
|
||||
37: GETSEC
|
||||
37: GETSEC (!REX2)
|
||||
38: escape # 3-byte escape 1
|
||||
39:
|
||||
3a: escape # 3-byte escape 2
|
||||
@ -473,22 +478,22 @@ AVXcode: 1
|
||||
7f: movq Qq,Pq | vmovdqa Wx,Vx (66) | vmovdqa32/64 Wx,Vx (66),(evo) | vmovdqu Wx,Vx (F3) | vmovdqu32/64 Wx,Vx (F3),(evo) | vmovdqu8/16 Wx,Vx (F2),(ev)
|
||||
# 0x0f 0x80-0x8f
|
||||
# Note: "forced64" is Intel CPU behavior (see comment about CALL insn).
|
||||
80: JO Jz (f64)
|
||||
81: JNO Jz (f64)
|
||||
82: JB/JC/JNAE Jz (f64)
|
||||
83: JAE/JNB/JNC Jz (f64)
|
||||
84: JE/JZ Jz (f64)
|
||||
85: JNE/JNZ Jz (f64)
|
||||
86: JBE/JNA Jz (f64)
|
||||
87: JA/JNBE Jz (f64)
|
||||
88: JS Jz (f64)
|
||||
89: JNS Jz (f64)
|
||||
8a: JP/JPE Jz (f64)
|
||||
8b: JNP/JPO Jz (f64)
|
||||
8c: JL/JNGE Jz (f64)
|
||||
8d: JNL/JGE Jz (f64)
|
||||
8e: JLE/JNG Jz (f64)
|
||||
8f: JNLE/JG Jz (f64)
|
||||
80: JO Jz (f64) (!REX2)
|
||||
81: JNO Jz (f64) (!REX2)
|
||||
82: JB/JC/JNAE Jz (f64) (!REX2)
|
||||
83: JAE/JNB/JNC Jz (f64) (!REX2)
|
||||
84: JE/JZ Jz (f64) (!REX2)
|
||||
85: JNE/JNZ Jz (f64) (!REX2)
|
||||
86: JBE/JNA Jz (f64) (!REX2)
|
||||
87: JA/JNBE Jz (f64) (!REX2)
|
||||
88: JS Jz (f64) (!REX2)
|
||||
89: JNS Jz (f64) (!REX2)
|
||||
8a: JP/JPE Jz (f64) (!REX2)
|
||||
8b: JNP/JPO Jz (f64) (!REX2)
|
||||
8c: JL/JNGE Jz (f64) (!REX2)
|
||||
8d: JNL/JGE Jz (f64) (!REX2)
|
||||
8e: JLE/JNG Jz (f64) (!REX2)
|
||||
8f: JNLE/JG Jz (f64) (!REX2)
|
||||
# 0x0f 0x90-0x9f
|
||||
90: SETO Eb | kmovw/q Vk,Wk | kmovb/d Vk,Wk (66)
|
||||
91: SETNO Eb | kmovw/q Mv,Vk | kmovb/d Mv,Vk (66)
|
||||
@ -698,17 +703,17 @@ AVXcode: 2
|
||||
4d: vrcp14ss/d Vsd,Hpd,Wsd (66),(ev)
|
||||
4e: vrsqrt14ps/d Vpd,Wpd (66),(ev)
|
||||
4f: vrsqrt14ss/d Vsd,Hsd,Wsd (66),(ev)
|
||||
50: vpdpbusd Vx,Hx,Wx (66),(ev)
|
||||
51: vpdpbusds Vx,Hx,Wx (66),(ev)
|
||||
52: vdpbf16ps Vx,Hx,Wx (F3),(ev) | vpdpwssd Vx,Hx,Wx (66),(ev) | vp4dpwssd Vdqq,Hdqq,Wdq (F2),(ev)
|
||||
53: vpdpwssds Vx,Hx,Wx (66),(ev) | vp4dpwssds Vdqq,Hdqq,Wdq (F2),(ev)
|
||||
50: vpdpbusd Vx,Hx,Wx (66) | vpdpbssd Vx,Hx,Wx (F2),(v) | vpdpbsud Vx,Hx,Wx (F3),(v) | vpdpbuud Vx,Hx,Wx (v)
|
||||
51: vpdpbusds Vx,Hx,Wx (66) | vpdpbssds Vx,Hx,Wx (F2),(v) | vpdpbsuds Vx,Hx,Wx (F3),(v) | vpdpbuuds Vx,Hx,Wx (v)
|
||||
52: vdpbf16ps Vx,Hx,Wx (F3),(ev) | vpdpwssd Vx,Hx,Wx (66) | vp4dpwssd Vdqq,Hdqq,Wdq (F2),(ev)
|
||||
53: vpdpwssds Vx,Hx,Wx (66) | vp4dpwssds Vdqq,Hdqq,Wdq (F2),(ev)
|
||||
54: vpopcntb/w Vx,Wx (66),(ev)
|
||||
55: vpopcntd/q Vx,Wx (66),(ev)
|
||||
58: vpbroadcastd Vx,Wx (66),(v)
|
||||
59: vpbroadcastq Vx,Wx (66),(v) | vbroadcasti32x2 Vx,Wx (66),(evo)
|
||||
5a: vbroadcasti128 Vqq,Mdq (66),(v) | vbroadcasti32x4/64x2 Vx,Wx (66),(evo)
|
||||
5b: vbroadcasti32x8/64x4 Vqq,Mdq (66),(ev)
|
||||
5c: TDPBF16PS Vt,Wt,Ht (F3),(v1)
|
||||
5c: TDPBF16PS Vt,Wt,Ht (F3),(v1) | TDPFP16PS Vt,Wt,Ht (F2),(v1),(o64)
|
||||
# Skip 0x5d
|
||||
5e: TDPBSSD Vt,Wt,Ht (F2),(v1) | TDPBSUD Vt,Wt,Ht (F3),(v1) | TDPBUSD Vt,Wt,Ht (66),(v1) | TDPBUUD Vt,Wt,Ht (v1)
|
||||
# Skip 0x5f-0x61
|
||||
@ -718,10 +723,12 @@ AVXcode: 2
|
||||
65: vblendmps/d Vx,Hx,Wx (66),(ev)
|
||||
66: vpblendmb/w Vx,Hx,Wx (66),(ev)
|
||||
68: vp2intersectd/q Kx,Hx,Wx (F2),(ev)
|
||||
# Skip 0x69-0x6f
|
||||
# Skip 0x69-0x6b
|
||||
6c: TCMMIMFP16PS Vt,Wt,Ht (66),(v1),(o64) | TCMMRLFP16PS Vt,Wt,Ht (v1),(o64)
|
||||
# Skip 0x6d-0x6f
|
||||
70: vpshldvw Vx,Hx,Wx (66),(ev)
|
||||
71: vpshldvd/q Vx,Hx,Wx (66),(ev)
|
||||
72: vcvtne2ps2bf16 Vx,Hx,Wx (F2),(ev) | vcvtneps2bf16 Vx,Wx (F3),(ev) | vpshrdvw Vx,Hx,Wx (66),(ev)
|
||||
72: vcvtne2ps2bf16 Vx,Hx,Wx (F2),(ev) | vcvtneps2bf16 Vx,Wx (F3) | vpshrdvw Vx,Hx,Wx (66),(ev)
|
||||
73: vpshrdvd/q Vx,Hx,Wx (66),(ev)
|
||||
75: vpermi2b/w Vx,Hx,Wx (66),(ev)
|
||||
76: vpermi2d/q Vx,Hx,Wx (66),(ev)
|
||||
@ -777,8 +784,10 @@ ac: vfnmadd213ps/d Vx,Hx,Wx (66),(v)
|
||||
ad: vfnmadd213ss/d Vx,Hx,Wx (66),(v),(v1)
|
||||
ae: vfnmsub213ps/d Vx,Hx,Wx (66),(v)
|
||||
af: vfnmsub213ss/d Vx,Hx,Wx (66),(v),(v1)
|
||||
b4: vpmadd52luq Vx,Hx,Wx (66),(ev)
|
||||
b5: vpmadd52huq Vx,Hx,Wx (66),(ev)
|
||||
b0: vcvtneebf162ps Vx,Mx (F3),(!11B),(v) | vcvtneeph2ps Vx,Mx (66),(!11B),(v) | vcvtneobf162ps Vx,Mx (F2),(!11B),(v) | vcvtneoph2ps Vx,Mx (!11B),(v)
|
||||
b1: vbcstnebf162ps Vx,Mw (F3),(!11B),(v) | vbcstnesh2ps Vx,Mw (66),(!11B),(v)
|
||||
b4: vpmadd52luq Vx,Hx,Wx (66)
|
||||
b5: vpmadd52huq Vx,Hx,Wx (66)
|
||||
b6: vfmaddsub231ps/d Vx,Hx,Wx (66),(v)
|
||||
b7: vfmsubadd231ps/d Vx,Hx,Wx (66),(v)
|
||||
b8: vfmadd231ps/d Vx,Hx,Wx (66),(v)
|
||||
@ -796,15 +805,35 @@ c7: Grp19 (1A)
|
||||
c8: sha1nexte Vdq,Wdq | vexp2ps/d Vx,Wx (66),(ev)
|
||||
c9: sha1msg1 Vdq,Wdq
|
||||
ca: sha1msg2 Vdq,Wdq | vrcp28ps/d Vx,Wx (66),(ev)
|
||||
cb: sha256rnds2 Vdq,Wdq | vrcp28ss/d Vx,Hx,Wx (66),(ev)
|
||||
cc: sha256msg1 Vdq,Wdq | vrsqrt28ps/d Vx,Wx (66),(ev)
|
||||
cd: sha256msg2 Vdq,Wdq | vrsqrt28ss/d Vx,Hx,Wx (66),(ev)
|
||||
cb: sha256rnds2 Vdq,Wdq | vrcp28ss/d Vx,Hx,Wx (66),(ev) | vsha512rnds2 Vqq,Hqq,Udq (F2),(11B),(v)
|
||||
cc: sha256msg1 Vdq,Wdq | vrsqrt28ps/d Vx,Wx (66),(ev) | vsha512msg1 Vqq,Udq (F2),(11B),(v)
|
||||
cd: sha256msg2 Vdq,Wdq | vrsqrt28ss/d Vx,Hx,Wx (66),(ev) | vsha512msg2 Vqq,Uqq (F2),(11B),(v)
|
||||
cf: vgf2p8mulb Vx,Wx (66)
|
||||
d2: vpdpwsud Vx,Hx,Wx (F3),(v) | vpdpwusd Vx,Hx,Wx (66),(v) | vpdpwuud Vx,Hx,Wx (v)
|
||||
d3: vpdpwsuds Vx,Hx,Wx (F3),(v) | vpdpwusds Vx,Hx,Wx (66),(v) | vpdpwuuds Vx,Hx,Wx (v)
|
||||
d8: AESENCWIDE128KL Qpi (F3),(000),(00B) | AESENCWIDE256KL Qpi (F3),(000),(10B) | AESDECWIDE128KL Qpi (F3),(000),(01B) | AESDECWIDE256KL Qpi (F3),(000),(11B)
|
||||
da: vsm3msg1 Vdq,Hdq,Udq (v1) | vsm3msg2 Vdq,Hdq,Udq (66),(v1) | vsm4key4 Vx,Hx,Wx (F3),(v) | vsm4rnds4 Vx,Hx,Wx (F2),(v)
|
||||
db: VAESIMC Vdq,Wdq (66),(v1)
|
||||
dc: vaesenc Vx,Hx,Wx (66)
|
||||
dd: vaesenclast Vx,Hx,Wx (66)
|
||||
de: vaesdec Vx,Hx,Wx (66)
|
||||
df: vaesdeclast Vx,Hx,Wx (66)
|
||||
dc: vaesenc Vx,Hx,Wx (66) | LOADIWKEY Vx,Hx (F3) | AESENC128KL Vpd,Qpi (F3)
|
||||
dd: vaesenclast Vx,Hx,Wx (66) | AESDEC128KL Vpd,Qpi (F3)
|
||||
de: vaesdec Vx,Hx,Wx (66) | AESENC256KL Vpd,Qpi (F3)
|
||||
df: vaesdeclast Vx,Hx,Wx (66) | AESDEC256KL Vpd,Qpi (F3)
|
||||
e0: CMPOXADD My,Gy,By (66),(v1),(o64)
|
||||
e1: CMPNOXADD My,Gy,By (66),(v1),(o64)
|
||||
e2: CMPBXADD My,Gy,By (66),(v1),(o64)
|
||||
e3: CMPNBXADD My,Gy,By (66),(v1),(o64)
|
||||
e4: CMPZXADD My,Gy,By (66),(v1),(o64)
|
||||
e5: CMPNZXADD My,Gy,By (66),(v1),(o64)
|
||||
e6: CMPBEXADD My,Gy,By (66),(v1),(o64)
|
||||
e7: CMPNBEXADD My,Gy,By (66),(v1),(o64)
|
||||
e8: CMPSXADD My,Gy,By (66),(v1),(o64)
|
||||
e9: CMPNSXADD My,Gy,By (66),(v1),(o64)
|
||||
ea: CMPPXADD My,Gy,By (66),(v1),(o64)
|
||||
eb: CMPNPXADD My,Gy,By (66),(v1),(o64)
|
||||
ec: CMPLXADD My,Gy,By (66),(v1),(o64)
|
||||
ed: CMPNLXADD My,Gy,By (66),(v1),(o64)
|
||||
ee: CMPLEXADD My,Gy,By (66),(v1),(o64)
|
||||
ef: CMPNLEXADD My,Gy,By (66),(v1),(o64)
|
||||
f0: MOVBE Gy,My | MOVBE Gw,Mw (66) | CRC32 Gd,Eb (F2) | CRC32 Gd,Eb (66&F2)
|
||||
f1: MOVBE My,Gy | MOVBE Mw,Gw (66) | CRC32 Gd,Ey (F2) | CRC32 Gd,Ew (66&F2)
|
||||
f2: ANDN Gy,By,Ey (v)
|
||||
@ -812,8 +841,11 @@ f3: Grp17 (1A)
|
||||
f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v) | WRUSSD/Q My,Gy (66)
|
||||
f6: ADCX Gy,Ey (66) | ADOX Gy,Ey (F3) | MULX By,Gy,rDX,Ey (F2),(v) | WRSSD/Q My,Gy
|
||||
f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v)
|
||||
f8: MOVDIR64B Gv,Mdqq (66) | ENQCMD Gv,Mdqq (F2) | ENQCMDS Gv,Mdqq (F3)
|
||||
f8: MOVDIR64B Gv,Mdqq (66) | ENQCMD Gv,Mdqq (F2) | ENQCMDS Gv,Mdqq (F3) | URDMSR Rq,Gq (F2),(11B) | UWRMSR Gq,Rq (F3),(11B)
|
||||
f9: MOVDIRI My,Gy
|
||||
fa: ENCODEKEY128 Ew,Ew (F3)
|
||||
fb: ENCODEKEY256 Ew,Ew (F3)
|
||||
fc: AADD My,Gy | AAND My,Gy (66) | AOR My,Gy (F2) | AXOR My,Gy (F3)
|
||||
EndTable
|
||||
|
||||
Table: 3-byte opcode 2 (0x0f 0x3a)
|
||||
@ -893,10 +925,103 @@ c2: vcmpph Vx,Hx,Wx,Ib (ev) | vcmpsh Vx,Hx,Wx,Ib (F3),(ev)
|
||||
cc: sha1rnds4 Vdq,Wdq,Ib
|
||||
ce: vgf2p8affineqb Vx,Wx,Ib (66)
|
||||
cf: vgf2p8affineinvqb Vx,Wx,Ib (66)
|
||||
de: vsm3rnds2 Vdq,Hdq,Wdq,Ib (66),(v1)
|
||||
df: VAESKEYGEN Vdq,Wdq,Ib (66),(v1)
|
||||
f0: RORX Gy,Ey,Ib (F2),(v) | HRESET Gv,Ib (F3),(000),(11B)
|
||||
EndTable
|
||||
|
||||
Table: EVEX map 4
|
||||
Referrer:
|
||||
AVXcode: 4
|
||||
00: ADD Eb,Gb (ev)
|
||||
01: ADD Ev,Gv (es) | ADD Ev,Gv (66),(es)
|
||||
02: ADD Gb,Eb (ev)
|
||||
03: ADD Gv,Ev (es) | ADD Gv,Ev (66),(es)
|
||||
08: OR Eb,Gb (ev)
|
||||
09: OR Ev,Gv (es) | OR Ev,Gv (66),(es)
|
||||
0a: OR Gb,Eb (ev)
|
||||
0b: OR Gv,Ev (es) | OR Gv,Ev (66),(es)
|
||||
10: ADC Eb,Gb (ev)
|
||||
11: ADC Ev,Gv (es) | ADC Ev,Gv (66),(es)
|
||||
12: ADC Gb,Eb (ev)
|
||||
13: ADC Gv,Ev (es) | ADC Gv,Ev (66),(es)
|
||||
18: SBB Eb,Gb (ev)
|
||||
19: SBB Ev,Gv (es) | SBB Ev,Gv (66),(es)
|
||||
1a: SBB Gb,Eb (ev)
|
||||
1b: SBB Gv,Ev (es) | SBB Gv,Ev (66),(es)
|
||||
20: AND Eb,Gb (ev)
|
||||
21: AND Ev,Gv (es) | AND Ev,Gv (66),(es)
|
||||
22: AND Gb,Eb (ev)
|
||||
23: AND Gv,Ev (es) | AND Gv,Ev (66),(es)
|
||||
24: SHLD Ev,Gv,Ib (es) | SHLD Ev,Gv,Ib (66),(es)
|
||||
28: SUB Eb,Gb (ev)
|
||||
29: SUB Ev,Gv (es) | SUB Ev,Gv (66),(es)
|
||||
2a: SUB Gb,Eb (ev)
|
||||
2b: SUB Gv,Ev (es) | SUB Gv,Ev (66),(es)
|
||||
2c: SHRD Ev,Gv,Ib (es) | SHRD Ev,Gv,Ib (66),(es)
|
||||
30: XOR Eb,Gb (ev)
|
||||
31: XOR Ev,Gv (es) | XOR Ev,Gv (66),(es)
|
||||
32: XOR Gb,Eb (ev)
|
||||
33: XOR Gv,Ev (es) | XOR Gv,Ev (66),(es)
|
||||
# CCMPSCC instructions are: CCOMB, CCOMBE, CCOMF, CCOML, CCOMLE, CCOMNB, CCOMNBE, CCOMNL, CCOMNLE,
|
||||
# CCOMNO, CCOMNS, CCOMNZ, CCOMO, CCOMS, CCOMT, CCOMZ
|
||||
38: CCMPSCC Eb,Gb (ev)
|
||||
39: CCMPSCC Ev,Gv (es) | CCMPSCC Ev,Gv (66),(es)
|
||||
3a: CCMPSCC Gv,Ev (ev)
|
||||
3b: CCMPSCC Gv,Ev (es) | CCMPSCC Gv,Ev (66),(es)
|
||||
40: CMOVO Gv,Ev (es) | CMOVO Gv,Ev (66),(es) | CFCMOVO Ev,Ev (es) | CFCMOVO Ev,Ev (66),(es) | SETO Eb (F2),(ev)
|
||||
41: CMOVNO Gv,Ev (es) | CMOVNO Gv,Ev (66),(es) | CFCMOVNO Ev,Ev (es) | CFCMOVNO Ev,Ev (66),(es) | SETNO Eb (F2),(ev)
|
||||
42: CMOVB Gv,Ev (es) | CMOVB Gv,Ev (66),(es) | CFCMOVB Ev,Ev (es) | CFCMOVB Ev,Ev (66),(es) | SETB Eb (F2),(ev)
|
||||
43: CMOVNB Gv,Ev (es) | CMOVNB Gv,Ev (66),(es) | CFCMOVNB Ev,Ev (es) | CFCMOVNB Ev,Ev (66),(es) | SETNB Eb (F2),(ev)
|
||||
44: CMOVZ Gv,Ev (es) | CMOVZ Gv,Ev (66),(es) | CFCMOVZ Ev,Ev (es) | CFCMOVZ Ev,Ev (66),(es) | SETZ Eb (F2),(ev)
|
||||
45: CMOVNZ Gv,Ev (es) | CMOVNZ Gv,Ev (66),(es) | CFCMOVNZ Ev,Ev (es) | CFCMOVNZ Ev,Ev (66),(es) | SETNZ Eb (F2),(ev)
|
||||
46: CMOVBE Gv,Ev (es) | CMOVBE Gv,Ev (66),(es) | CFCMOVBE Ev,Ev (es) | CFCMOVBE Ev,Ev (66),(es) | SETBE Eb (F2),(ev)
|
||||
47: CMOVNBE Gv,Ev (es) | CMOVNBE Gv,Ev (66),(es) | CFCMOVNBE Ev,Ev (es) | CFCMOVNBE Ev,Ev (66),(es) | SETNBE Eb (F2),(ev)
|
||||
48: CMOVS Gv,Ev (es) | CMOVS Gv,Ev (66),(es) | CFCMOVS Ev,Ev (es) | CFCMOVS Ev,Ev (66),(es) | SETS Eb (F2),(ev)
|
||||
49: CMOVNS Gv,Ev (es) | CMOVNS Gv,Ev (66),(es) | CFCMOVNS Ev,Ev (es) | CFCMOVNS Ev,Ev (66),(es) | SETNS Eb (F2),(ev)
|
||||
4a: CMOVP Gv,Ev (es) | CMOVP Gv,Ev (66),(es) | CFCMOVP Ev,Ev (es) | CFCMOVP Ev,Ev (66),(es) | SETP Eb (F2),(ev)
|
||||
4b: CMOVNP Gv,Ev (es) | CMOVNP Gv,Ev (66),(es) | CFCMOVNP Ev,Ev (es) | CFCMOVNP Ev,Ev (66),(es) | SETNP Eb (F2),(ev)
|
||||
4c: CMOVL Gv,Ev (es) | CMOVL Gv,Ev (66),(es) | CFCMOVL Ev,Ev (es) | CFCMOVL Ev,Ev (66),(es) | SETL Eb (F2),(ev)
|
||||
4d: CMOVNL Gv,Ev (es) | CMOVNL Gv,Ev (66),(es) | CFCMOVNL Ev,Ev (es) | CFCMOVNL Ev,Ev (66),(es) | SETNL Eb (F2),(ev)
|
||||
4e: CMOVLE Gv,Ev (es) | CMOVLE Gv,Ev (66),(es) | CFCMOVLE Ev,Ev (es) | CFCMOVLE Ev,Ev (66),(es) | SETLE Eb (F2),(ev)
|
||||
4f: CMOVNLE Gv,Ev (es) | CMOVNLE Gv,Ev (66),(es) | CFCMOVNLE Ev,Ev (es) | CFCMOVNLE Ev,Ev (66),(es) | SETNLE Eb (F2),(ev)
|
||||
60: MOVBE Gv,Ev (es) | MOVBE Gv,Ev (66),(es)
|
||||
61: MOVBE Ev,Gv (es) | MOVBE Ev,Gv (66),(es)
|
||||
65: WRUSSD Md,Gd (66),(ev) | WRUSSQ Mq,Gq (66),(ev)
|
||||
66: ADCX Gy,Ey (66),(ev) | ADOX Gy,Ey (F3),(ev) | WRSSD Md,Gd (ev) | WRSSQ Mq,Gq (66),(ev)
|
||||
69: IMUL Gv,Ev,Iz (es) | IMUL Gv,Ev,Iz (66),(es)
|
||||
6b: IMUL Gv,Ev,Ib (es) | IMUL Gv,Ev,Ib (66),(es)
|
||||
80: Grp1 Eb,Ib (1A),(ev)
|
||||
81: Grp1 Ev,Iz (1A),(es)
|
||||
83: Grp1 Ev,Ib (1A),(es)
|
||||
# CTESTSCC instructions are: CTESTB, CTESTBE, CTESTF, CTESTL, CTESTLE, CTESTNB, CTESTNBE, CTESTNL,
|
||||
# CTESTNLE, CTESTNO, CTESTNS, CTESTNZ, CTESTO, CTESTS, CTESTT, CTESTZ
|
||||
84: CTESTSCC (ev)
|
||||
85: CTESTSCC (es) | CTESTSCC (66),(es)
|
||||
88: POPCNT Gv,Ev (es) | POPCNT Gv,Ev (66),(es)
|
||||
8f: POP2 Bq,Rq (000),(11B),(ev)
|
||||
a5: SHLD Ev,Gv,CL (es) | SHLD Ev,Gv,CL (66),(es)
|
||||
ad: SHRD Ev,Gv,CL (es) | SHRD Ev,Gv,CL (66),(es)
|
||||
af: IMUL Gv,Ev (es) | IMUL Gv,Ev (66),(es)
|
||||
c0: Grp2 Eb,Ib (1A),(ev)
|
||||
c1: Grp2 Ev,Ib (1A),(es)
|
||||
d0: Grp2 Eb,1 (1A),(ev)
|
||||
d1: Grp2 Ev,1 (1A),(es)
|
||||
d2: Grp2 Eb,CL (1A),(ev)
|
||||
d3: Grp2 Ev,CL (1A),(es)
|
||||
f0: CRC32 Gy,Eb (es) | INVEPT Gq,Mdq (F3),(ev)
|
||||
f1: CRC32 Gy,Ey (es) | CRC32 Gy,Ey (66),(es) | INVVPID Gy,Mdq (F3),(ev)
|
||||
f2: INVPCID Gy,Mdq (F3),(ev)
|
||||
f4: TZCNT Gv,Ev (es) | TZCNT Gv,Ev (66),(es)
|
||||
f5: LZCNT Gv,Ev (es) | LZCNT Gv,Ev (66),(es)
|
||||
f6: Grp3_1 Eb (1A),(ev)
|
||||
f7: Grp3_2 Ev (1A),(es)
|
||||
f8: MOVDIR64B Gv,Mdqq (66),(ev) | ENQCMD Gv,Mdqq (F2),(ev) | ENQCMDS Gv,Mdqq (F3),(ev) | URDMSR Rq,Gq (F2),(11B),(ev) | UWRMSR Gq,Rq (F3),(11B),(ev)
|
||||
f9: MOVDIRI My,Gy (ev)
|
||||
fe: Grp4 (1A),(ev)
|
||||
ff: Grp5 (1A),(es) | PUSH2 Bq,Rq (110),(11B),(ev)
|
||||
EndTable
|
||||
|
||||
Table: EVEX map 5
|
||||
Referrer:
|
||||
AVXcode: 5
|
||||
@ -975,6 +1100,12 @@ d6: vfcmulcph Vx,Hx,Wx (F2),(ev) | vfmulcph Vx,Hx,Wx (F3),(ev)
|
||||
d7: vfcmulcsh Vx,Hx,Wx (F2),(ev) | vfmulcsh Vx,Hx,Wx (F3),(ev)
|
||||
EndTable
|
||||
|
||||
Table: VEX map 7
|
||||
Referrer:
|
||||
AVXcode: 7
|
||||
f8: URDMSR Rq,Id (F2),(v1),(11B) | UWRMSR Id,Rq (F3),(v1),(11B)
|
||||
EndTable
|
||||
|
||||
GrpTable: Grp1
|
||||
0: ADD
|
||||
1: OR
|
||||
@ -1051,7 +1182,7 @@ GrpTable: Grp6
|
||||
EndTable
|
||||
|
||||
GrpTable: Grp7
|
||||
0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | PCONFIG (101),(11B) | ENCLV (000),(11B) | WRMSRNS (110),(11B)
|
||||
0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | PCONFIG (101),(11B) | ENCLV (000),(11B) | WRMSRNS (110),(11B) | RDMSRLIST (F2),(110),(11B) | WRMSRLIST (F3),(110),(11B) | PBNDKB (111),(11B)
|
||||
1: SIDT Ms | MONITOR (000),(11B) | MWAIT (001),(11B) | CLAC (010),(11B) | STAC (011),(11B) | ENCLS (111),(11B) | ERETU (F3),(010),(11B) | ERETS (F2),(010),(11B)
|
||||
2: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) | XEND (101)(11B) | XTEST (110)(11B) | ENCLU (111),(11B)
|
||||
3: LIDT Ms
|
||||
@ -1137,6 +1268,8 @@ GrpTable: Grp16
|
||||
1: prefetch T0
|
||||
2: prefetch T1
|
||||
3: prefetch T2
|
||||
6: prefetch IT1
|
||||
7: prefetch IT0
|
||||
EndTable
|
||||
|
||||
GrpTable: Grp17
|
||||
|
@ -64,7 +64,9 @@ BEGIN {
|
||||
|
||||
modrm_expr = "^([CDEGMNPQRSUVW/][a-z]+|NTA|T[012])"
|
||||
force64_expr = "\\([df]64\\)"
|
||||
rex_expr = "^REX(\\.[XRWB]+)*"
|
||||
rex_expr = "^((REX(\\.[XRWB]+)+)|(REX$))"
|
||||
rex2_expr = "\\(REX2\\)"
|
||||
no_rex2_expr = "\\(!REX2\\)"
|
||||
fpu_expr = "^ESC" # TODO
|
||||
|
||||
lprefix1_expr = "\\((66|!F3)\\)"
|
||||
@ -81,6 +83,8 @@ BEGIN {
|
||||
vexonly_expr = "\\(v\\)"
|
||||
# All opcodes with (ev) superscript supports *only* EVEX prefix
|
||||
evexonly_expr = "\\(ev\\)"
|
||||
# (es) is the same as (ev) but also "SCALABLE" i.e. W and pp determine operand size
|
||||
evex_scalable_expr = "\\(es\\)"
|
||||
|
||||
prefix_expr = "\\(Prefix\\)"
|
||||
prefix_num["Operand-Size"] = "INAT_PFX_OPNDSZ"
|
||||
@ -99,6 +103,7 @@ BEGIN {
|
||||
prefix_num["VEX+1byte"] = "INAT_PFX_VEX2"
|
||||
prefix_num["VEX+2byte"] = "INAT_PFX_VEX3"
|
||||
prefix_num["EVEX"] = "INAT_PFX_EVEX"
|
||||
prefix_num["REX2"] = "INAT_PFX_REX2"
|
||||
|
||||
clear_vars()
|
||||
}
|
||||
@ -314,6 +319,10 @@ function convert_operands(count,opnd, i,j,imm,mod)
|
||||
if (match(ext, force64_expr))
|
||||
flags = add_flags(flags, "INAT_FORCE64")
|
||||
|
||||
# check REX2 not allowed
|
||||
if (match(ext, no_rex2_expr))
|
||||
flags = add_flags(flags, "INAT_NO_REX2")
|
||||
|
||||
# check REX prefix
|
||||
if (match(opcode, rex_expr))
|
||||
flags = add_flags(flags, "INAT_MAKE_PREFIX(INAT_PFX_REX)")
|
||||
@ -325,6 +334,8 @@ function convert_operands(count,opnd, i,j,imm,mod)
|
||||
# check VEX codes
|
||||
if (match(ext, evexonly_expr))
|
||||
flags = add_flags(flags, "INAT_VEXOK | INAT_EVEXONLY")
|
||||
else if (match(ext, evex_scalable_expr))
|
||||
flags = add_flags(flags, "INAT_VEXOK | INAT_EVEXONLY | INAT_EVEX_SCALABLE")
|
||||
else if (match(ext, vexonly_expr))
|
||||
flags = add_flags(flags, "INAT_VEXOK | INAT_VEXONLY")
|
||||
else if (match(ext, vexok_expr) || match(opcode, vexok_opcode_expr))
|
||||
@ -351,6 +362,8 @@ function convert_operands(count,opnd, i,j,imm,mod)
|
||||
lptable3[idx] = add_flags(lptable3[idx],flags)
|
||||
variant = "INAT_VARIANT"
|
||||
}
|
||||
if (match(ext, rex2_expr))
|
||||
table[idx] = add_flags(table[idx], "INAT_REX2_VARIANT")
|
||||
if (!match(ext, lprefix_expr)){
|
||||
table[idx] = add_flags(table[idx],flags)
|
||||
}
|
||||
|
@ -35,6 +35,8 @@
|
||||
#define INAT_PFX_VEX2 13 /* 2-bytes VEX prefix */
|
||||
#define INAT_PFX_VEX3 14 /* 3-bytes VEX prefix */
|
||||
#define INAT_PFX_EVEX 15 /* EVEX prefix */
|
||||
/* x86-64 REX2 prefix */
|
||||
#define INAT_PFX_REX2 16 /* 0xD5 */
|
||||
|
||||
#define INAT_LSTPFX_MAX 3
|
||||
#define INAT_LGCPFX_MAX 11
|
||||
@ -50,7 +52,7 @@
|
||||
|
||||
/* Legacy prefix */
|
||||
#define INAT_PFX_OFFS 0
|
||||
#define INAT_PFX_BITS 4
|
||||
#define INAT_PFX_BITS 5
|
||||
#define INAT_PFX_MAX ((1 << INAT_PFX_BITS) - 1)
|
||||
#define INAT_PFX_MASK (INAT_PFX_MAX << INAT_PFX_OFFS)
|
||||
/* Escape opcodes */
|
||||
@ -77,6 +79,9 @@
|
||||
#define INAT_VEXOK (1 << (INAT_FLAG_OFFS + 5))
|
||||
#define INAT_VEXONLY (1 << (INAT_FLAG_OFFS + 6))
|
||||
#define INAT_EVEXONLY (1 << (INAT_FLAG_OFFS + 7))
|
||||
#define INAT_NO_REX2 (1 << (INAT_FLAG_OFFS + 8))
|
||||
#define INAT_REX2_VARIANT (1 << (INAT_FLAG_OFFS + 9))
|
||||
#define INAT_EVEX_SCALABLE (1 << (INAT_FLAG_OFFS + 10))
|
||||
/* Attribute making macros for attribute tables */
|
||||
#define INAT_MAKE_PREFIX(pfx) (pfx << INAT_PFX_OFFS)
|
||||
#define INAT_MAKE_ESCAPE(esc) (esc << INAT_ESC_OFFS)
|
||||
@ -128,6 +133,11 @@ static inline int inat_is_rex_prefix(insn_attr_t attr)
|
||||
return (attr & INAT_PFX_MASK) == INAT_PFX_REX;
|
||||
}
|
||||
|
||||
static inline int inat_is_rex2_prefix(insn_attr_t attr)
|
||||
{
|
||||
return (attr & INAT_PFX_MASK) == INAT_PFX_REX2;
|
||||
}
|
||||
|
||||
static inline int inat_last_prefix_id(insn_attr_t attr)
|
||||
{
|
||||
if ((attr & INAT_PFX_MASK) > INAT_LSTPFX_MAX)
|
||||
@ -227,4 +237,9 @@ static inline int inat_must_evex(insn_attr_t attr)
|
||||
{
|
||||
return attr & INAT_EVEXONLY;
|
||||
}
|
||||
|
||||
static inline int inat_evex_scalable(insn_attr_t attr)
|
||||
{
|
||||
return attr & INAT_EVEX_SCALABLE;
|
||||
}
|
||||
#endif
|
||||
|
@ -112,10 +112,15 @@ struct insn {
|
||||
#define X86_SIB_INDEX(sib) (((sib) & 0x38) >> 3)
|
||||
#define X86_SIB_BASE(sib) ((sib) & 0x07)
|
||||
|
||||
#define X86_REX_W(rex) ((rex) & 8)
|
||||
#define X86_REX_R(rex) ((rex) & 4)
|
||||
#define X86_REX_X(rex) ((rex) & 2)
|
||||
#define X86_REX_B(rex) ((rex) & 1)
|
||||
#define X86_REX2_M(rex) ((rex) & 0x80) /* REX2 M0 */
|
||||
#define X86_REX2_R(rex) ((rex) & 0x40) /* REX2 R4 */
|
||||
#define X86_REX2_X(rex) ((rex) & 0x20) /* REX2 X4 */
|
||||
#define X86_REX2_B(rex) ((rex) & 0x10) /* REX2 B4 */
|
||||
|
||||
#define X86_REX_W(rex) ((rex) & 8) /* REX or REX2 W */
|
||||
#define X86_REX_R(rex) ((rex) & 4) /* REX or REX2 R3 */
|
||||
#define X86_REX_X(rex) ((rex) & 2) /* REX or REX2 X3 */
|
||||
#define X86_REX_B(rex) ((rex) & 1) /* REX or REX2 B3 */
|
||||
|
||||
/* VEX bit flags */
|
||||
#define X86_VEX_W(vex) ((vex) & 0x80) /* VEX3 Byte2 */
|
||||
@ -161,6 +166,18 @@ static inline void insn_get_attribute(struct insn *insn)
|
||||
/* Instruction uses RIP-relative addressing */
|
||||
extern int insn_rip_relative(struct insn *insn);
|
||||
|
||||
static inline int insn_is_rex2(struct insn *insn)
|
||||
{
|
||||
if (!insn->prefixes.got)
|
||||
insn_get_prefixes(insn);
|
||||
return insn->rex_prefix.nbytes == 2;
|
||||
}
|
||||
|
||||
static inline insn_byte_t insn_rex2_m_bit(struct insn *insn)
|
||||
{
|
||||
return X86_REX2_M(insn->rex_prefix.bytes[1]);
|
||||
}
|
||||
|
||||
static inline int insn_is_avx(struct insn *insn)
|
||||
{
|
||||
if (!insn->prefixes.got)
|
||||
@ -198,6 +215,13 @@ static inline insn_byte_t insn_vex_p_bits(struct insn *insn)
|
||||
return X86_VEX_P(insn->vex_prefix.bytes[2]);
|
||||
}
|
||||
|
||||
static inline insn_byte_t insn_vex_w_bit(struct insn *insn)
|
||||
{
|
||||
if (insn->vex_prefix.nbytes < 3)
|
||||
return 0;
|
||||
return X86_VEX_W(insn->vex_prefix.bytes[2]);
|
||||
}
|
||||
|
||||
/* Get the last prefix id from last prefix or VEX prefix */
|
||||
static inline int insn_last_prefix_id(struct insn *insn)
|
||||
{
|
||||
|
@ -185,6 +185,17 @@ found:
|
||||
if (X86_REX_W(b))
|
||||
/* REX.W overrides opnd_size */
|
||||
insn->opnd_bytes = 8;
|
||||
} else if (inat_is_rex2_prefix(attr)) {
|
||||
insn_set_byte(&insn->rex_prefix, 0, b);
|
||||
b = peek_nbyte_next(insn_byte_t, insn, 1);
|
||||
insn_set_byte(&insn->rex_prefix, 1, b);
|
||||
insn->rex_prefix.nbytes = 2;
|
||||
insn->next_byte += 2;
|
||||
if (X86_REX_W(b))
|
||||
/* REX.W overrides opnd_size */
|
||||
insn->opnd_bytes = 8;
|
||||
insn->rex_prefix.got = 1;
|
||||
goto vex_end;
|
||||
}
|
||||
}
|
||||
insn->rex_prefix.got = 1;
|
||||
@ -283,6 +294,10 @@ int insn_get_opcode(struct insn *insn)
|
||||
m = insn_vex_m_bits(insn);
|
||||
p = insn_vex_p_bits(insn);
|
||||
insn->attr = inat_get_avx_attribute(op, m, p);
|
||||
/* SCALABLE EVEX uses p bits to encode operand size */
|
||||
if (inat_evex_scalable(insn->attr) && !insn_vex_w_bit(insn) &&
|
||||
p == INAT_PFX_OPNDSZ)
|
||||
insn->opnd_bytes = 2;
|
||||
if ((inat_must_evex(insn->attr) && !insn_is_evex(insn)) ||
|
||||
(!inat_accept_vex(insn->attr) &&
|
||||
!inat_is_group(insn->attr))) {
|
||||
@ -294,6 +309,20 @@ int insn_get_opcode(struct insn *insn)
|
||||
goto end;
|
||||
}
|
||||
|
||||
/* Check if there is REX2 prefix or not */
|
||||
if (insn_is_rex2(insn)) {
|
||||
if (insn_rex2_m_bit(insn)) {
|
||||
/* map 1 is escape 0x0f */
|
||||
insn_attr_t esc_attr = inat_get_opcode_attribute(0x0f);
|
||||
|
||||
pfx_id = insn_last_prefix_id(insn);
|
||||
insn->attr = inat_get_escape_attribute(op, pfx_id, esc_attr);
|
||||
} else {
|
||||
insn->attr = inat_get_opcode_attribute(op);
|
||||
}
|
||||
goto end;
|
||||
}
|
||||
|
||||
insn->attr = inat_get_opcode_attribute(op);
|
||||
while (inat_is_escape(insn->attr)) {
|
||||
/* Get escaped opcode */
|
||||
|
@ -23,6 +23,7 @@
|
||||
#
|
||||
# AVX Superscripts
|
||||
# (ev): this opcode requires EVEX prefix.
|
||||
# (es): this opcode requires EVEX prefix and is SCALABALE.
|
||||
# (evo): this opcode is changed by EVEX prefix (EVEX opcode)
|
||||
# (v): this opcode requires VEX prefix.
|
||||
# (v1): this opcode only supports 128bit VEX.
|
||||
@ -33,6 +34,10 @@
|
||||
# - (F2): the last prefix is 0xF2
|
||||
# - (!F3) : the last prefix is not 0xF3 (including non-last prefix case)
|
||||
# - (66&F2): Both 0x66 and 0xF2 prefixes are specified.
|
||||
#
|
||||
# REX2 Prefix
|
||||
# - (!REX2): REX2 is not allowed
|
||||
# - (REX2): REX2 variant e.g. JMPABS
|
||||
|
||||
Table: one byte opcode
|
||||
Referrer:
|
||||
@ -148,7 +153,7 @@ AVXcode:
|
||||
65: SEG=GS (Prefix)
|
||||
66: Operand-Size (Prefix)
|
||||
67: Address-Size (Prefix)
|
||||
68: PUSH Iz (d64)
|
||||
68: PUSH Iz
|
||||
69: IMUL Gv,Ev,Iz
|
||||
6a: PUSH Ib (d64)
|
||||
6b: IMUL Gv,Ev,Ib
|
||||
@ -157,22 +162,22 @@ AVXcode:
|
||||
6e: OUTS/OUTSB DX,Xb
|
||||
6f: OUTS/OUTSW/OUTSD DX,Xz
|
||||
# 0x70 - 0x7f
|
||||
70: JO Jb
|
||||
71: JNO Jb
|
||||
72: JB/JNAE/JC Jb
|
||||
73: JNB/JAE/JNC Jb
|
||||
74: JZ/JE Jb
|
||||
75: JNZ/JNE Jb
|
||||
76: JBE/JNA Jb
|
||||
77: JNBE/JA Jb
|
||||
78: JS Jb
|
||||
79: JNS Jb
|
||||
7a: JP/JPE Jb
|
||||
7b: JNP/JPO Jb
|
||||
7c: JL/JNGE Jb
|
||||
7d: JNL/JGE Jb
|
||||
7e: JLE/JNG Jb
|
||||
7f: JNLE/JG Jb
|
||||
70: JO Jb (!REX2)
|
||||
71: JNO Jb (!REX2)
|
||||
72: JB/JNAE/JC Jb (!REX2)
|
||||
73: JNB/JAE/JNC Jb (!REX2)
|
||||
74: JZ/JE Jb (!REX2)
|
||||
75: JNZ/JNE Jb (!REX2)
|
||||
76: JBE/JNA Jb (!REX2)
|
||||
77: JNBE/JA Jb (!REX2)
|
||||
78: JS Jb (!REX2)
|
||||
79: JNS Jb (!REX2)
|
||||
7a: JP/JPE Jb (!REX2)
|
||||
7b: JNP/JPO Jb (!REX2)
|
||||
7c: JL/JNGE Jb (!REX2)
|
||||
7d: JNL/JGE Jb (!REX2)
|
||||
7e: JLE/JNG Jb (!REX2)
|
||||
7f: JNLE/JG Jb (!REX2)
|
||||
# 0x80 - 0x8f
|
||||
80: Grp1 Eb,Ib (1A)
|
||||
81: Grp1 Ev,Iz (1A)
|
||||
@ -208,24 +213,24 @@ AVXcode:
|
||||
9e: SAHF
|
||||
9f: LAHF
|
||||
# 0xa0 - 0xaf
|
||||
a0: MOV AL,Ob
|
||||
a1: MOV rAX,Ov
|
||||
a2: MOV Ob,AL
|
||||
a3: MOV Ov,rAX
|
||||
a4: MOVS/B Yb,Xb
|
||||
a5: MOVS/W/D/Q Yv,Xv
|
||||
a6: CMPS/B Xb,Yb
|
||||
a7: CMPS/W/D Xv,Yv
|
||||
a8: TEST AL,Ib
|
||||
a9: TEST rAX,Iz
|
||||
aa: STOS/B Yb,AL
|
||||
ab: STOS/W/D/Q Yv,rAX
|
||||
ac: LODS/B AL,Xb
|
||||
ad: LODS/W/D/Q rAX,Xv
|
||||
ae: SCAS/B AL,Yb
|
||||
a0: MOV AL,Ob (!REX2)
|
||||
a1: MOV rAX,Ov (!REX2) | JMPABS O (REX2),(o64)
|
||||
a2: MOV Ob,AL (!REX2)
|
||||
a3: MOV Ov,rAX (!REX2)
|
||||
a4: MOVS/B Yb,Xb (!REX2)
|
||||
a5: MOVS/W/D/Q Yv,Xv (!REX2)
|
||||
a6: CMPS/B Xb,Yb (!REX2)
|
||||
a7: CMPS/W/D Xv,Yv (!REX2)
|
||||
a8: TEST AL,Ib (!REX2)
|
||||
a9: TEST rAX,Iz (!REX2)
|
||||
aa: STOS/B Yb,AL (!REX2)
|
||||
ab: STOS/W/D/Q Yv,rAX (!REX2)
|
||||
ac: LODS/B AL,Xb (!REX2)
|
||||
ad: LODS/W/D/Q rAX,Xv (!REX2)
|
||||
ae: SCAS/B AL,Yb (!REX2)
|
||||
# Note: The May 2011 Intel manual shows Xv for the second parameter of the
|
||||
# next instruction but Yv is correct
|
||||
af: SCAS/W/D/Q rAX,Yv
|
||||
af: SCAS/W/D/Q rAX,Yv (!REX2)
|
||||
# 0xb0 - 0xbf
|
||||
b0: MOV AL/R8L,Ib
|
||||
b1: MOV CL/R9L,Ib
|
||||
@ -266,7 +271,7 @@ d1: Grp2 Ev,1 (1A)
|
||||
d2: Grp2 Eb,CL (1A)
|
||||
d3: Grp2 Ev,CL (1A)
|
||||
d4: AAM Ib (i64)
|
||||
d5: AAD Ib (i64)
|
||||
d5: AAD Ib (i64) | REX2 (Prefix),(o64)
|
||||
d6:
|
||||
d7: XLAT/XLATB
|
||||
d8: ESC
|
||||
@ -281,26 +286,26 @@ df: ESC
|
||||
# Note: "forced64" is Intel CPU behavior: they ignore 0x66 prefix
|
||||
# in 64-bit mode. AMD CPUs accept 0x66 prefix, it causes RIP truncation
|
||||
# to 16 bits. In 32-bit mode, 0x66 is accepted by both Intel and AMD.
|
||||
e0: LOOPNE/LOOPNZ Jb (f64)
|
||||
e1: LOOPE/LOOPZ Jb (f64)
|
||||
e2: LOOP Jb (f64)
|
||||
e3: JrCXZ Jb (f64)
|
||||
e4: IN AL,Ib
|
||||
e5: IN eAX,Ib
|
||||
e6: OUT Ib,AL
|
||||
e7: OUT Ib,eAX
|
||||
e0: LOOPNE/LOOPNZ Jb (f64) (!REX2)
|
||||
e1: LOOPE/LOOPZ Jb (f64) (!REX2)
|
||||
e2: LOOP Jb (f64) (!REX2)
|
||||
e3: JrCXZ Jb (f64) (!REX2)
|
||||
e4: IN AL,Ib (!REX2)
|
||||
e5: IN eAX,Ib (!REX2)
|
||||
e6: OUT Ib,AL (!REX2)
|
||||
e7: OUT Ib,eAX (!REX2)
|
||||
# With 0x66 prefix in 64-bit mode, for AMD CPUs immediate offset
|
||||
# in "near" jumps and calls is 16-bit. For CALL,
|
||||
# push of return address is 16-bit wide, RSP is decremented by 2
|
||||
# but is not truncated to 16 bits, unlike RIP.
|
||||
e8: CALL Jz (f64)
|
||||
e9: JMP-near Jz (f64)
|
||||
ea: JMP-far Ap (i64)
|
||||
eb: JMP-short Jb (f64)
|
||||
ec: IN AL,DX
|
||||
ed: IN eAX,DX
|
||||
ee: OUT DX,AL
|
||||
ef: OUT DX,eAX
|
||||
e8: CALL Jz (f64) (!REX2)
|
||||
e9: JMP-near Jz (f64) (!REX2)
|
||||
ea: JMP-far Ap (i64) (!REX2)
|
||||
eb: JMP-short Jb (f64) (!REX2)
|
||||
ec: IN AL,DX (!REX2)
|
||||
ed: IN eAX,DX (!REX2)
|
||||
ee: OUT DX,AL (!REX2)
|
||||
ef: OUT DX,eAX (!REX2)
|
||||
# 0xf0 - 0xff
|
||||
f0: LOCK (Prefix)
|
||||
f1:
|
||||
@ -386,14 +391,14 @@ AVXcode: 1
|
||||
2e: vucomiss Vss,Wss (v1) | vucomisd Vsd,Wsd (66),(v1)
|
||||
2f: vcomiss Vss,Wss (v1) | vcomisd Vsd,Wsd (66),(v1)
|
||||
# 0x0f 0x30-0x3f
|
||||
30: WRMSR
|
||||
31: RDTSC
|
||||
32: RDMSR
|
||||
33: RDPMC
|
||||
34: SYSENTER
|
||||
35: SYSEXIT
|
||||
30: WRMSR (!REX2)
|
||||
31: RDTSC (!REX2)
|
||||
32: RDMSR (!REX2)
|
||||
33: RDPMC (!REX2)
|
||||
34: SYSENTER (!REX2)
|
||||
35: SYSEXIT (!REX2)
|
||||
36:
|
||||
37: GETSEC
|
||||
37: GETSEC (!REX2)
|
||||
38: escape # 3-byte escape 1
|
||||
39:
|
||||
3a: escape # 3-byte escape 2
|
||||
@ -473,22 +478,22 @@ AVXcode: 1
|
||||
7f: movq Qq,Pq | vmovdqa Wx,Vx (66) | vmovdqa32/64 Wx,Vx (66),(evo) | vmovdqu Wx,Vx (F3) | vmovdqu32/64 Wx,Vx (F3),(evo) | vmovdqu8/16 Wx,Vx (F2),(ev)
|
||||
# 0x0f 0x80-0x8f
|
||||
# Note: "forced64" is Intel CPU behavior (see comment about CALL insn).
|
||||
80: JO Jz (f64)
|
||||
81: JNO Jz (f64)
|
||||
82: JB/JC/JNAE Jz (f64)
|
||||
83: JAE/JNB/JNC Jz (f64)
|
||||
84: JE/JZ Jz (f64)
|
||||
85: JNE/JNZ Jz (f64)
|
||||
86: JBE/JNA Jz (f64)
|
||||
87: JA/JNBE Jz (f64)
|
||||
88: JS Jz (f64)
|
||||
89: JNS Jz (f64)
|
||||
8a: JP/JPE Jz (f64)
|
||||
8b: JNP/JPO Jz (f64)
|
||||
8c: JL/JNGE Jz (f64)
|
||||
8d: JNL/JGE Jz (f64)
|
||||
8e: JLE/JNG Jz (f64)
|
||||
8f: JNLE/JG Jz (f64)
|
||||
80: JO Jz (f64) (!REX2)
|
||||
81: JNO Jz (f64) (!REX2)
|
||||
82: JB/JC/JNAE Jz (f64) (!REX2)
|
||||
83: JAE/JNB/JNC Jz (f64) (!REX2)
|
||||
84: JE/JZ Jz (f64) (!REX2)
|
||||
85: JNE/JNZ Jz (f64) (!REX2)
|
||||
86: JBE/JNA Jz (f64) (!REX2)
|
||||
87: JA/JNBE Jz (f64) (!REX2)
|
||||
88: JS Jz (f64) (!REX2)
|
||||
89: JNS Jz (f64) (!REX2)
|
||||
8a: JP/JPE Jz (f64) (!REX2)
|
||||
8b: JNP/JPO Jz (f64) (!REX2)
|
||||
8c: JL/JNGE Jz (f64) (!REX2)
|
||||
8d: JNL/JGE Jz (f64) (!REX2)
|
||||
8e: JLE/JNG Jz (f64) (!REX2)
|
||||
8f: JNLE/JG Jz (f64) (!REX2)
|
||||
# 0x0f 0x90-0x9f
|
||||
90: SETO Eb | kmovw/q Vk,Wk | kmovb/d Vk,Wk (66)
|
||||
91: SETNO Eb | kmovw/q Mv,Vk | kmovb/d Mv,Vk (66)
|
||||
@ -698,17 +703,17 @@ AVXcode: 2
|
||||
4d: vrcp14ss/d Vsd,Hpd,Wsd (66),(ev)
|
||||
4e: vrsqrt14ps/d Vpd,Wpd (66),(ev)
|
||||
4f: vrsqrt14ss/d Vsd,Hsd,Wsd (66),(ev)
|
||||
50: vpdpbusd Vx,Hx,Wx (66),(ev)
|
||||
51: vpdpbusds Vx,Hx,Wx (66),(ev)
|
||||
52: vdpbf16ps Vx,Hx,Wx (F3),(ev) | vpdpwssd Vx,Hx,Wx (66),(ev) | vp4dpwssd Vdqq,Hdqq,Wdq (F2),(ev)
|
||||
53: vpdpwssds Vx,Hx,Wx (66),(ev) | vp4dpwssds Vdqq,Hdqq,Wdq (F2),(ev)
|
||||
50: vpdpbusd Vx,Hx,Wx (66) | vpdpbssd Vx,Hx,Wx (F2),(v) | vpdpbsud Vx,Hx,Wx (F3),(v) | vpdpbuud Vx,Hx,Wx (v)
|
||||
51: vpdpbusds Vx,Hx,Wx (66) | vpdpbssds Vx,Hx,Wx (F2),(v) | vpdpbsuds Vx,Hx,Wx (F3),(v) | vpdpbuuds Vx,Hx,Wx (v)
|
||||
52: vdpbf16ps Vx,Hx,Wx (F3),(ev) | vpdpwssd Vx,Hx,Wx (66) | vp4dpwssd Vdqq,Hdqq,Wdq (F2),(ev)
|
||||
53: vpdpwssds Vx,Hx,Wx (66) | vp4dpwssds Vdqq,Hdqq,Wdq (F2),(ev)
|
||||
54: vpopcntb/w Vx,Wx (66),(ev)
|
||||
55: vpopcntd/q Vx,Wx (66),(ev)
|
||||
58: vpbroadcastd Vx,Wx (66),(v)
|
||||
59: vpbroadcastq Vx,Wx (66),(v) | vbroadcasti32x2 Vx,Wx (66),(evo)
|
||||
5a: vbroadcasti128 Vqq,Mdq (66),(v) | vbroadcasti32x4/64x2 Vx,Wx (66),(evo)
|
||||
5b: vbroadcasti32x8/64x4 Vqq,Mdq (66),(ev)
|
||||
5c: TDPBF16PS Vt,Wt,Ht (F3),(v1)
|
||||
5c: TDPBF16PS Vt,Wt,Ht (F3),(v1) | TDPFP16PS Vt,Wt,Ht (F2),(v1),(o64)
|
||||
# Skip 0x5d
|
||||
5e: TDPBSSD Vt,Wt,Ht (F2),(v1) | TDPBSUD Vt,Wt,Ht (F3),(v1) | TDPBUSD Vt,Wt,Ht (66),(v1) | TDPBUUD Vt,Wt,Ht (v1)
|
||||
# Skip 0x5f-0x61
|
||||
@ -718,10 +723,12 @@ AVXcode: 2
|
||||
65: vblendmps/d Vx,Hx,Wx (66),(ev)
|
||||
66: vpblendmb/w Vx,Hx,Wx (66),(ev)
|
||||
68: vp2intersectd/q Kx,Hx,Wx (F2),(ev)
|
||||
# Skip 0x69-0x6f
|
||||
# Skip 0x69-0x6b
|
||||
6c: TCMMIMFP16PS Vt,Wt,Ht (66),(v1),(o64) | TCMMRLFP16PS Vt,Wt,Ht (v1),(o64)
|
||||
# Skip 0x6d-0x6f
|
||||
70: vpshldvw Vx,Hx,Wx (66),(ev)
|
||||
71: vpshldvd/q Vx,Hx,Wx (66),(ev)
|
||||
72: vcvtne2ps2bf16 Vx,Hx,Wx (F2),(ev) | vcvtneps2bf16 Vx,Wx (F3),(ev) | vpshrdvw Vx,Hx,Wx (66),(ev)
|
||||
72: vcvtne2ps2bf16 Vx,Hx,Wx (F2),(ev) | vcvtneps2bf16 Vx,Wx (F3) | vpshrdvw Vx,Hx,Wx (66),(ev)
|
||||
73: vpshrdvd/q Vx,Hx,Wx (66),(ev)
|
||||
75: vpermi2b/w Vx,Hx,Wx (66),(ev)
|
||||
76: vpermi2d/q Vx,Hx,Wx (66),(ev)
|
||||
@ -777,8 +784,10 @@ ac: vfnmadd213ps/d Vx,Hx,Wx (66),(v)
|
||||
ad: vfnmadd213ss/d Vx,Hx,Wx (66),(v),(v1)
|
||||
ae: vfnmsub213ps/d Vx,Hx,Wx (66),(v)
|
||||
af: vfnmsub213ss/d Vx,Hx,Wx (66),(v),(v1)
|
||||
b4: vpmadd52luq Vx,Hx,Wx (66),(ev)
|
||||
b5: vpmadd52huq Vx,Hx,Wx (66),(ev)
|
||||
b0: vcvtneebf162ps Vx,Mx (F3),(!11B),(v) | vcvtneeph2ps Vx,Mx (66),(!11B),(v) | vcvtneobf162ps Vx,Mx (F2),(!11B),(v) | vcvtneoph2ps Vx,Mx (!11B),(v)
|
||||
b1: vbcstnebf162ps Vx,Mw (F3),(!11B),(v) | vbcstnesh2ps Vx,Mw (66),(!11B),(v)
|
||||
b4: vpmadd52luq Vx,Hx,Wx (66)
|
||||
b5: vpmadd52huq Vx,Hx,Wx (66)
|
||||
b6: vfmaddsub231ps/d Vx,Hx,Wx (66),(v)
|
||||
b7: vfmsubadd231ps/d Vx,Hx,Wx (66),(v)
|
||||
b8: vfmadd231ps/d Vx,Hx,Wx (66),(v)
|
||||
@ -796,15 +805,35 @@ c7: Grp19 (1A)
|
||||
c8: sha1nexte Vdq,Wdq | vexp2ps/d Vx,Wx (66),(ev)
|
||||
c9: sha1msg1 Vdq,Wdq
|
||||
ca: sha1msg2 Vdq,Wdq | vrcp28ps/d Vx,Wx (66),(ev)
|
||||
cb: sha256rnds2 Vdq,Wdq | vrcp28ss/d Vx,Hx,Wx (66),(ev)
|
||||
cc: sha256msg1 Vdq,Wdq | vrsqrt28ps/d Vx,Wx (66),(ev)
|
||||
cd: sha256msg2 Vdq,Wdq | vrsqrt28ss/d Vx,Hx,Wx (66),(ev)
|
||||
cb: sha256rnds2 Vdq,Wdq | vrcp28ss/d Vx,Hx,Wx (66),(ev) | vsha512rnds2 Vqq,Hqq,Udq (F2),(11B),(v)
|
||||
cc: sha256msg1 Vdq,Wdq | vrsqrt28ps/d Vx,Wx (66),(ev) | vsha512msg1 Vqq,Udq (F2),(11B),(v)
|
||||
cd: sha256msg2 Vdq,Wdq | vrsqrt28ss/d Vx,Hx,Wx (66),(ev) | vsha512msg2 Vqq,Uqq (F2),(11B),(v)
|
||||
cf: vgf2p8mulb Vx,Wx (66)
|
||||
d2: vpdpwsud Vx,Hx,Wx (F3),(v) | vpdpwusd Vx,Hx,Wx (66),(v) | vpdpwuud Vx,Hx,Wx (v)
|
||||
d3: vpdpwsuds Vx,Hx,Wx (F3),(v) | vpdpwusds Vx,Hx,Wx (66),(v) | vpdpwuuds Vx,Hx,Wx (v)
|
||||
d8: AESENCWIDE128KL Qpi (F3),(000),(00B) | AESENCWIDE256KL Qpi (F3),(000),(10B) | AESDECWIDE128KL Qpi (F3),(000),(01B) | AESDECWIDE256KL Qpi (F3),(000),(11B)
|
||||
da: vsm3msg1 Vdq,Hdq,Udq (v1) | vsm3msg2 Vdq,Hdq,Udq (66),(v1) | vsm4key4 Vx,Hx,Wx (F3),(v) | vsm4rnds4 Vx,Hx,Wx (F2),(v)
|
||||
db: VAESIMC Vdq,Wdq (66),(v1)
|
||||
dc: vaesenc Vx,Hx,Wx (66)
|
||||
dd: vaesenclast Vx,Hx,Wx (66)
|
||||
de: vaesdec Vx,Hx,Wx (66)
|
||||
df: vaesdeclast Vx,Hx,Wx (66)
|
||||
dc: vaesenc Vx,Hx,Wx (66) | LOADIWKEY Vx,Hx (F3) | AESENC128KL Vpd,Qpi (F3)
|
||||
dd: vaesenclast Vx,Hx,Wx (66) | AESDEC128KL Vpd,Qpi (F3)
|
||||
de: vaesdec Vx,Hx,Wx (66) | AESENC256KL Vpd,Qpi (F3)
|
||||
df: vaesdeclast Vx,Hx,Wx (66) | AESDEC256KL Vpd,Qpi (F3)
|
||||
e0: CMPOXADD My,Gy,By (66),(v1),(o64)
|
||||
e1: CMPNOXADD My,Gy,By (66),(v1),(o64)
|
||||
e2: CMPBXADD My,Gy,By (66),(v1),(o64)
|
||||
e3: CMPNBXADD My,Gy,By (66),(v1),(o64)
|
||||
e4: CMPZXADD My,Gy,By (66),(v1),(o64)
|
||||
e5: CMPNZXADD My,Gy,By (66),(v1),(o64)
|
||||
e6: CMPBEXADD My,Gy,By (66),(v1),(o64)
|
||||
e7: CMPNBEXADD My,Gy,By (66),(v1),(o64)
|
||||
e8: CMPSXADD My,Gy,By (66),(v1),(o64)
|
||||
e9: CMPNSXADD My,Gy,By (66),(v1),(o64)
|
||||
ea: CMPPXADD My,Gy,By (66),(v1),(o64)
|
||||
eb: CMPNPXADD My,Gy,By (66),(v1),(o64)
|
||||
ec: CMPLXADD My,Gy,By (66),(v1),(o64)
|
||||
ed: CMPNLXADD My,Gy,By (66),(v1),(o64)
|
||||
ee: CMPLEXADD My,Gy,By (66),(v1),(o64)
|
||||
ef: CMPNLEXADD My,Gy,By (66),(v1),(o64)
|
||||
f0: MOVBE Gy,My | MOVBE Gw,Mw (66) | CRC32 Gd,Eb (F2) | CRC32 Gd,Eb (66&F2)
|
||||
f1: MOVBE My,Gy | MOVBE Mw,Gw (66) | CRC32 Gd,Ey (F2) | CRC32 Gd,Ew (66&F2)
|
||||
f2: ANDN Gy,By,Ey (v)
|
||||
@ -812,8 +841,11 @@ f3: Grp17 (1A)
|
||||
f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v) | WRUSSD/Q My,Gy (66)
|
||||
f6: ADCX Gy,Ey (66) | ADOX Gy,Ey (F3) | MULX By,Gy,rDX,Ey (F2),(v) | WRSSD/Q My,Gy
|
||||
f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v)
|
||||
f8: MOVDIR64B Gv,Mdqq (66) | ENQCMD Gv,Mdqq (F2) | ENQCMDS Gv,Mdqq (F3)
|
||||
f8: MOVDIR64B Gv,Mdqq (66) | ENQCMD Gv,Mdqq (F2) | ENQCMDS Gv,Mdqq (F3) | URDMSR Rq,Gq (F2),(11B) | UWRMSR Gq,Rq (F3),(11B)
|
||||
f9: MOVDIRI My,Gy
|
||||
fa: ENCODEKEY128 Ew,Ew (F3)
|
||||
fb: ENCODEKEY256 Ew,Ew (F3)
|
||||
fc: AADD My,Gy | AAND My,Gy (66) | AOR My,Gy (F2) | AXOR My,Gy (F3)
|
||||
EndTable
|
||||
|
||||
Table: 3-byte opcode 2 (0x0f 0x3a)
|
||||
@ -893,10 +925,103 @@ c2: vcmpph Vx,Hx,Wx,Ib (ev) | vcmpsh Vx,Hx,Wx,Ib (F3),(ev)
|
||||
cc: sha1rnds4 Vdq,Wdq,Ib
|
||||
ce: vgf2p8affineqb Vx,Wx,Ib (66)
|
||||
cf: vgf2p8affineinvqb Vx,Wx,Ib (66)
|
||||
de: vsm3rnds2 Vdq,Hdq,Wdq,Ib (66),(v1)
|
||||
df: VAESKEYGEN Vdq,Wdq,Ib (66),(v1)
|
||||
f0: RORX Gy,Ey,Ib (F2),(v) | HRESET Gv,Ib (F3),(000),(11B)
|
||||
EndTable
|
||||
|
||||
Table: EVEX map 4
|
||||
Referrer:
|
||||
AVXcode: 4
|
||||
00: ADD Eb,Gb (ev)
|
||||
01: ADD Ev,Gv (es) | ADD Ev,Gv (66),(es)
|
||||
02: ADD Gb,Eb (ev)
|
||||
03: ADD Gv,Ev (es) | ADD Gv,Ev (66),(es)
|
||||
08: OR Eb,Gb (ev)
|
||||
09: OR Ev,Gv (es) | OR Ev,Gv (66),(es)
|
||||
0a: OR Gb,Eb (ev)
|
||||
0b: OR Gv,Ev (es) | OR Gv,Ev (66),(es)
|
||||
10: ADC Eb,Gb (ev)
|
||||
11: ADC Ev,Gv (es) | ADC Ev,Gv (66),(es)
|
||||
12: ADC Gb,Eb (ev)
|
||||
13: ADC Gv,Ev (es) | ADC Gv,Ev (66),(es)
|
||||
18: SBB Eb,Gb (ev)
|
||||
19: SBB Ev,Gv (es) | SBB Ev,Gv (66),(es)
|
||||
1a: SBB Gb,Eb (ev)
|
||||
1b: SBB Gv,Ev (es) | SBB Gv,Ev (66),(es)
|
||||
20: AND Eb,Gb (ev)
|
||||
21: AND Ev,Gv (es) | AND Ev,Gv (66),(es)
|
||||
22: AND Gb,Eb (ev)
|
||||
23: AND Gv,Ev (es) | AND Gv,Ev (66),(es)
|
||||
24: SHLD Ev,Gv,Ib (es) | SHLD Ev,Gv,Ib (66),(es)
|
||||
28: SUB Eb,Gb (ev)
|
||||
29: SUB Ev,Gv (es) | SUB Ev,Gv (66),(es)
|
||||
2a: SUB Gb,Eb (ev)
|
||||
2b: SUB Gv,Ev (es) | SUB Gv,Ev (66),(es)
|
||||
2c: SHRD Ev,Gv,Ib (es) | SHRD Ev,Gv,Ib (66),(es)
|
||||
30: XOR Eb,Gb (ev)
|
||||
31: XOR Ev,Gv (es) | XOR Ev,Gv (66),(es)
|
||||
32: XOR Gb,Eb (ev)
|
||||
33: XOR Gv,Ev (es) | XOR Gv,Ev (66),(es)
|
||||
# CCMPSCC instructions are: CCOMB, CCOMBE, CCOMF, CCOML, CCOMLE, CCOMNB, CCOMNBE, CCOMNL, CCOMNLE,
|
||||
# CCOMNO, CCOMNS, CCOMNZ, CCOMO, CCOMS, CCOMT, CCOMZ
|
||||
38: CCMPSCC Eb,Gb (ev)
|
||||
39: CCMPSCC Ev,Gv (es) | CCMPSCC Ev,Gv (66),(es)
|
||||
3a: CCMPSCC Gv,Ev (ev)
|
||||
3b: CCMPSCC Gv,Ev (es) | CCMPSCC Gv,Ev (66),(es)
|
||||
40: CMOVO Gv,Ev (es) | CMOVO Gv,Ev (66),(es) | CFCMOVO Ev,Ev (es) | CFCMOVO Ev,Ev (66),(es) | SETO Eb (F2),(ev)
|
||||
41: CMOVNO Gv,Ev (es) | CMOVNO Gv,Ev (66),(es) | CFCMOVNO Ev,Ev (es) | CFCMOVNO Ev,Ev (66),(es) | SETNO Eb (F2),(ev)
|
||||
42: CMOVB Gv,Ev (es) | CMOVB Gv,Ev (66),(es) | CFCMOVB Ev,Ev (es) | CFCMOVB Ev,Ev (66),(es) | SETB Eb (F2),(ev)
|
||||
43: CMOVNB Gv,Ev (es) | CMOVNB Gv,Ev (66),(es) | CFCMOVNB Ev,Ev (es) | CFCMOVNB Ev,Ev (66),(es) | SETNB Eb (F2),(ev)
|
||||
44: CMOVZ Gv,Ev (es) | CMOVZ Gv,Ev (66),(es) | CFCMOVZ Ev,Ev (es) | CFCMOVZ Ev,Ev (66),(es) | SETZ Eb (F2),(ev)
|
||||
45: CMOVNZ Gv,Ev (es) | CMOVNZ Gv,Ev (66),(es) | CFCMOVNZ Ev,Ev (es) | CFCMOVNZ Ev,Ev (66),(es) | SETNZ Eb (F2),(ev)
|
||||
46: CMOVBE Gv,Ev (es) | CMOVBE Gv,Ev (66),(es) | CFCMOVBE Ev,Ev (es) | CFCMOVBE Ev,Ev (66),(es) | SETBE Eb (F2),(ev)
|
||||
47: CMOVNBE Gv,Ev (es) | CMOVNBE Gv,Ev (66),(es) | CFCMOVNBE Ev,Ev (es) | CFCMOVNBE Ev,Ev (66),(es) | SETNBE Eb (F2),(ev)
|
||||
48: CMOVS Gv,Ev (es) | CMOVS Gv,Ev (66),(es) | CFCMOVS Ev,Ev (es) | CFCMOVS Ev,Ev (66),(es) | SETS Eb (F2),(ev)
|
||||
49: CMOVNS Gv,Ev (es) | CMOVNS Gv,Ev (66),(es) | CFCMOVNS Ev,Ev (es) | CFCMOVNS Ev,Ev (66),(es) | SETNS Eb (F2),(ev)
|
||||
4a: CMOVP Gv,Ev (es) | CMOVP Gv,Ev (66),(es) | CFCMOVP Ev,Ev (es) | CFCMOVP Ev,Ev (66),(es) | SETP Eb (F2),(ev)
|
||||
4b: CMOVNP Gv,Ev (es) | CMOVNP Gv,Ev (66),(es) | CFCMOVNP Ev,Ev (es) | CFCMOVNP Ev,Ev (66),(es) | SETNP Eb (F2),(ev)
|
||||
4c: CMOVL Gv,Ev (es) | CMOVL Gv,Ev (66),(es) | CFCMOVL Ev,Ev (es) | CFCMOVL Ev,Ev (66),(es) | SETL Eb (F2),(ev)
|
||||
4d: CMOVNL Gv,Ev (es) | CMOVNL Gv,Ev (66),(es) | CFCMOVNL Ev,Ev (es) | CFCMOVNL Ev,Ev (66),(es) | SETNL Eb (F2),(ev)
|
||||
4e: CMOVLE Gv,Ev (es) | CMOVLE Gv,Ev (66),(es) | CFCMOVLE Ev,Ev (es) | CFCMOVLE Ev,Ev (66),(es) | SETLE Eb (F2),(ev)
|
||||
4f: CMOVNLE Gv,Ev (es) | CMOVNLE Gv,Ev (66),(es) | CFCMOVNLE Ev,Ev (es) | CFCMOVNLE Ev,Ev (66),(es) | SETNLE Eb (F2),(ev)
|
||||
60: MOVBE Gv,Ev (es) | MOVBE Gv,Ev (66),(es)
|
||||
61: MOVBE Ev,Gv (es) | MOVBE Ev,Gv (66),(es)
|
||||
65: WRUSSD Md,Gd (66),(ev) | WRUSSQ Mq,Gq (66),(ev)
|
||||
66: ADCX Gy,Ey (66),(ev) | ADOX Gy,Ey (F3),(ev) | WRSSD Md,Gd (ev) | WRSSQ Mq,Gq (66),(ev)
|
||||
69: IMUL Gv,Ev,Iz (es) | IMUL Gv,Ev,Iz (66),(es)
|
||||
6b: IMUL Gv,Ev,Ib (es) | IMUL Gv,Ev,Ib (66),(es)
|
||||
80: Grp1 Eb,Ib (1A),(ev)
|
||||
81: Grp1 Ev,Iz (1A),(es)
|
||||
83: Grp1 Ev,Ib (1A),(es)
|
||||
# CTESTSCC instructions are: CTESTB, CTESTBE, CTESTF, CTESTL, CTESTLE, CTESTNB, CTESTNBE, CTESTNL,
|
||||
# CTESTNLE, CTESTNO, CTESTNS, CTESTNZ, CTESTO, CTESTS, CTESTT, CTESTZ
|
||||
84: CTESTSCC (ev)
|
||||
85: CTESTSCC (es) | CTESTSCC (66),(es)
|
||||
88: POPCNT Gv,Ev (es) | POPCNT Gv,Ev (66),(es)
|
||||
8f: POP2 Bq,Rq (000),(11B),(ev)
|
||||
a5: SHLD Ev,Gv,CL (es) | SHLD Ev,Gv,CL (66),(es)
|
||||
ad: SHRD Ev,Gv,CL (es) | SHRD Ev,Gv,CL (66),(es)
|
||||
af: IMUL Gv,Ev (es) | IMUL Gv,Ev (66),(es)
|
||||
c0: Grp2 Eb,Ib (1A),(ev)
|
||||
c1: Grp2 Ev,Ib (1A),(es)
|
||||
d0: Grp2 Eb,1 (1A),(ev)
|
||||
d1: Grp2 Ev,1 (1A),(es)
|
||||
d2: Grp2 Eb,CL (1A),(ev)
|
||||
d3: Grp2 Ev,CL (1A),(es)
|
||||
f0: CRC32 Gy,Eb (es) | INVEPT Gq,Mdq (F3),(ev)
|
||||
f1: CRC32 Gy,Ey (es) | CRC32 Gy,Ey (66),(es) | INVVPID Gy,Mdq (F3),(ev)
|
||||
f2: INVPCID Gy,Mdq (F3),(ev)
|
||||
f4: TZCNT Gv,Ev (es) | TZCNT Gv,Ev (66),(es)
|
||||
f5: LZCNT Gv,Ev (es) | LZCNT Gv,Ev (66),(es)
|
||||
f6: Grp3_1 Eb (1A),(ev)
|
||||
f7: Grp3_2 Ev (1A),(es)
|
||||
f8: MOVDIR64B Gv,Mdqq (66),(ev) | ENQCMD Gv,Mdqq (F2),(ev) | ENQCMDS Gv,Mdqq (F3),(ev) | URDMSR Rq,Gq (F2),(11B),(ev) | UWRMSR Gq,Rq (F3),(11B),(ev)
|
||||
f9: MOVDIRI My,Gy (ev)
|
||||
fe: Grp4 (1A),(ev)
|
||||
ff: Grp5 (1A),(es) | PUSH2 Bq,Rq (110),(11B),(ev)
|
||||
EndTable
|
||||
|
||||
Table: EVEX map 5
|
||||
Referrer:
|
||||
AVXcode: 5
|
||||
@ -975,6 +1100,12 @@ d6: vfcmulcph Vx,Hx,Wx (F2),(ev) | vfmulcph Vx,Hx,Wx (F3),(ev)
|
||||
d7: vfcmulcsh Vx,Hx,Wx (F2),(ev) | vfmulcsh Vx,Hx,Wx (F3),(ev)
|
||||
EndTable
|
||||
|
||||
Table: VEX map 7
|
||||
Referrer:
|
||||
AVXcode: 7
|
||||
f8: URDMSR Rq,Id (F2),(v1),(11B) | UWRMSR Id,Rq (F3),(v1),(11B)
|
||||
EndTable
|
||||
|
||||
GrpTable: Grp1
|
||||
0: ADD
|
||||
1: OR
|
||||
@ -1051,7 +1182,7 @@ GrpTable: Grp6
|
||||
EndTable
|
||||
|
||||
GrpTable: Grp7
|
||||
0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | PCONFIG (101),(11B) | ENCLV (000),(11B) | WRMSRNS (110),(11B)
|
||||
0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | PCONFIG (101),(11B) | ENCLV (000),(11B) | WRMSRNS (110),(11B) | RDMSRLIST (F2),(110),(11B) | WRMSRLIST (F3),(110),(11B) | PBNDKB (111),(11B)
|
||||
1: SIDT Ms | MONITOR (000),(11B) | MWAIT (001),(11B) | CLAC (010),(11B) | STAC (011),(11B) | ENCLS (111),(11B) | ERETU (F3),(010),(11B) | ERETS (F2),(010),(11B)
|
||||
2: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) | XEND (101)(11B) | XTEST (110)(11B) | ENCLU (111),(11B)
|
||||
3: LIDT Ms
|
||||
@ -1137,6 +1268,8 @@ GrpTable: Grp16
|
||||
1: prefetch T0
|
||||
2: prefetch T1
|
||||
3: prefetch T2
|
||||
6: prefetch IT1
|
||||
7: prefetch IT0
|
||||
EndTable
|
||||
|
||||
GrpTable: Grp17
|
||||
|
@ -64,7 +64,9 @@ BEGIN {
|
||||
|
||||
modrm_expr = "^([CDEGMNPQRSUVW/][a-z]+|NTA|T[012])"
|
||||
force64_expr = "\\([df]64\\)"
|
||||
rex_expr = "^REX(\\.[XRWB]+)*"
|
||||
rex_expr = "^((REX(\\.[XRWB]+)+)|(REX$))"
|
||||
rex2_expr = "\\(REX2\\)"
|
||||
no_rex2_expr = "\\(!REX2\\)"
|
||||
fpu_expr = "^ESC" # TODO
|
||||
|
||||
lprefix1_expr = "\\((66|!F3)\\)"
|
||||
@ -81,6 +83,8 @@ BEGIN {
|
||||
vexonly_expr = "\\(v\\)"
|
||||
# All opcodes with (ev) superscript supports *only* EVEX prefix
|
||||
evexonly_expr = "\\(ev\\)"
|
||||
# (es) is the same as (ev) but also "SCALABLE" i.e. W and pp determine operand size
|
||||
evex_scalable_expr = "\\(es\\)"
|
||||
|
||||
prefix_expr = "\\(Prefix\\)"
|
||||
prefix_num["Operand-Size"] = "INAT_PFX_OPNDSZ"
|
||||
@ -99,6 +103,7 @@ BEGIN {
|
||||
prefix_num["VEX+1byte"] = "INAT_PFX_VEX2"
|
||||
prefix_num["VEX+2byte"] = "INAT_PFX_VEX3"
|
||||
prefix_num["EVEX"] = "INAT_PFX_EVEX"
|
||||
prefix_num["REX2"] = "INAT_PFX_REX2"
|
||||
|
||||
clear_vars()
|
||||
}
|
||||
@ -314,6 +319,10 @@ function convert_operands(count,opnd, i,j,imm,mod)
|
||||
if (match(ext, force64_expr))
|
||||
flags = add_flags(flags, "INAT_FORCE64")
|
||||
|
||||
# check REX2 not allowed
|
||||
if (match(ext, no_rex2_expr))
|
||||
flags = add_flags(flags, "INAT_NO_REX2")
|
||||
|
||||
# check REX prefix
|
||||
if (match(opcode, rex_expr))
|
||||
flags = add_flags(flags, "INAT_MAKE_PREFIX(INAT_PFX_REX)")
|
||||
@ -325,6 +334,8 @@ function convert_operands(count,opnd, i,j,imm,mod)
|
||||
# check VEX codes
|
||||
if (match(ext, evexonly_expr))
|
||||
flags = add_flags(flags, "INAT_VEXOK | INAT_EVEXONLY")
|
||||
else if (match(ext, evex_scalable_expr))
|
||||
flags = add_flags(flags, "INAT_VEXOK | INAT_EVEXONLY | INAT_EVEX_SCALABLE")
|
||||
else if (match(ext, vexonly_expr))
|
||||
flags = add_flags(flags, "INAT_VEXOK | INAT_VEXONLY")
|
||||
else if (match(ext, vexok_expr) || match(opcode, vexok_opcode_expr))
|
||||
@ -351,6 +362,8 @@ function convert_operands(count,opnd, i,j,imm,mod)
|
||||
lptable3[idx] = add_flags(lptable3[idx],flags)
|
||||
variant = "INAT_VARIANT"
|
||||
}
|
||||
if (match(ext, rex2_expr))
|
||||
table[idx] = add_flags(table[idx], "INAT_REX2_VARIANT")
|
||||
if (!match(ext, lprefix_expr)){
|
||||
table[idx] = add_flags(table[idx],flags)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user