From b1b08c13c00e4d7dccc22919d8fe099c1f076631 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 18 Aug 2026 11:20:30 +0100 Subject: [PATCH] Update clobber table to encode the clobbering for each of the forms --- core/rexcode/isa/x86/mnemonic_builders.odin | 14 - core/rexcode/isa/x86/mnemonics.odin | 2 - core/rexcode/isa/x86/printer.odin | 4 +- .../isa/x86/tablegen/clobber_table.odin | 6076 +++++++++++++---- .../isa/x86/tablegen/encoding_table.odin | 14 +- core/rexcode/isa/x86/tablegen/gen.odin | 105 +- .../x86/tablegen/generated/decode_tables.odin | 128 +- .../x86/tablegen/generated/encode_tables.odin | 3870 ++++++++++- .../isa/x86/tablegen/generated/writer.odin | 2 +- core/rexcode/isa/x86/tables.odin | 10 +- .../isa/x86/tables/x86.clobber_table.bin | Bin 19104 -> 0 bytes .../isa/x86/tables/x86.encode_forms.bin | Bin 38320 -> 38320 bytes .../isa/x86/tables/x86.encode_recipes.bin | Bin 28740 -> 28740 bytes .../isa/x86/tables/x86.encode_runs.bin | Bin 9552 -> 9536 bytes core/rexcode/isa/x86/tables/x86.evex.bin | Bin 8360 -> 8360 bytes core/rexcode/isa/x86/tables/x86.legacy.bin | Bin 25400 -> 25400 bytes core/rexcode/isa/x86/tables/x86.vex.bin | Bin 14140 -> 14140 bytes 17 files changed, 8731 insertions(+), 1494 deletions(-) delete mode 100644 core/rexcode/isa/x86/tables/x86.clobber_table.bin diff --git a/core/rexcode/isa/x86/mnemonic_builders.odin b/core/rexcode/isa/x86/mnemonic_builders.odin index c7b518e03..2957a1264 100644 --- a/core/rexcode/isa/x86/mnemonic_builders.odin +++ b/core/rexcode/isa/x86/mnemonic_builders.odin @@ -2159,12 +2159,6 @@ inst_movss_m32_xmm :: #force_inline proc "contextless" (dst: Me emit_movss_xmm_xmm :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: XMM, src: XMM) { append(instructions, inst_movss_xmm_xmm(dst, src)) } emit_movss_xmm_m32 :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: XMM, src: Mem32) { append(instructions, inst_movss_xmm_m32(dst, src)) } emit_movss_m32_xmm :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: Mem32, src: XMM) { append(instructions, inst_movss_m32_xmm(dst, src)) } -inst_movsd_sse_xmm_xmm :: #force_inline proc "contextless" (dst: XMM, src: XMM) -> Instruction { return with_hint(Instruction{ mnemonic = .MOVSD_SSE, operand_count = 2, ops = {op_xmm(dst), op_xmm(src), {}, {}} }, 733) } -inst_movsd_sse_xmm_m64 :: #force_inline proc "contextless" (dst: XMM, src: Mem64) -> Instruction { return with_hint(Instruction{ mnemonic = .MOVSD_SSE, operand_count = 2, ops = {op_xmm(dst), op_mem(src.mem, 8), {}, {}} }, 733) } -inst_movsd_sse_m64_xmm :: #force_inline proc "contextless" (dst: Mem64, src: XMM) -> Instruction { return with_hint(Instruction{ mnemonic = .MOVSD_SSE, operand_count = 2, ops = {op_mem(dst.mem, 8), op_xmm(src), {}, {}} }, 734) } -emit_movsd_sse_xmm_xmm :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: XMM, src: XMM) { append(instructions, inst_movsd_sse_xmm_xmm(dst, src)) } -emit_movsd_sse_xmm_m64 :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: XMM, src: Mem64) { append(instructions, inst_movsd_sse_xmm_m64(dst, src)) } -emit_movsd_sse_m64_xmm :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: Mem64, src: XMM) { append(instructions, inst_movsd_sse_m64_xmm(dst, src)) } inst_movdqa_xmm_xmm :: #force_inline proc "contextless" (dst: XMM, src: XMM) -> Instruction { return with_hint(Instruction{ mnemonic = .MOVDQA, operand_count = 2, ops = {op_xmm(dst), op_xmm(src), {}, {}} }, 735) } inst_movdqa_xmm_m128 :: #force_inline proc "contextless" (dst: XMM, src: Mem128) -> Instruction { return with_hint(Instruction{ mnemonic = .MOVDQA, operand_count = 2, ops = {op_xmm(dst), op_mem(src.mem, 16), {}, {}} }, 735) } inst_movdqa_m128_xmm :: #force_inline proc "contextless" (dst: Mem128, src: XMM) -> Instruction { return with_hint(Instruction{ mnemonic = .MOVDQA, operand_count = 2, ops = {op_mem(dst.mem, 16), op_xmm(src), {}, {}} }, 736) } @@ -2417,10 +2411,6 @@ inst_cmpss_xmm_xmm_imm8 :: #force_inline proc "contextless" (dst: XM inst_cmpss_xmm_m32_imm8 :: #force_inline proc "contextless" (dst: XMM, src: Mem32, imm: i8) -> Instruction { return with_hint(Instruction{ mnemonic = .CMPSS, operand_count = 3, ops = {op_xmm(dst), op_mem(src.mem, 4), op_imm8(imm), {}} }, 809) } emit_cmpss_xmm_xmm_imm8 :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: XMM, src: XMM, imm: i8) { append(instructions, inst_cmpss_xmm_xmm_imm8(dst, src, imm)) } emit_cmpss_xmm_m32_imm8 :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: XMM, src: Mem32, imm: i8) { append(instructions, inst_cmpss_xmm_m32_imm8(dst, src, imm)) } -inst_cmpsd_sse_xmm_xmm_imm8 :: #force_inline proc "contextless" (dst: XMM, src: XMM, imm: i8) -> Instruction { return with_hint(Instruction{ mnemonic = .CMPSD_SSE, operand_count = 3, ops = {op_xmm(dst), op_xmm(src), op_imm8(imm), {}} }, 810) } -inst_cmpsd_sse_xmm_m64_imm8 :: #force_inline proc "contextless" (dst: XMM, src: Mem64, imm: i8) -> Instruction { return with_hint(Instruction{ mnemonic = .CMPSD_SSE, operand_count = 3, ops = {op_xmm(dst), op_mem(src.mem, 8), op_imm8(imm), {}} }, 810) } -emit_cmpsd_sse_xmm_xmm_imm8 :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: XMM, src: XMM, imm: i8) { append(instructions, inst_cmpsd_sse_xmm_xmm_imm8(dst, src, imm)) } -emit_cmpsd_sse_xmm_m64_imm8 :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: XMM, src: Mem64, imm: i8) { append(instructions, inst_cmpsd_sse_xmm_m64_imm8(dst, src, imm)) } inst_comiss_xmm_xmm :: #force_inline proc "contextless" (dst: XMM, src: XMM) -> Instruction { return with_hint(Instruction{ mnemonic = .COMISS, operand_count = 2, ops = {op_xmm(dst), op_xmm(src), {}, {}} }, 811) } inst_comiss_xmm_m32 :: #force_inline proc "contextless" (dst: XMM, src: Mem32) -> Instruction { return with_hint(Instruction{ mnemonic = .COMISS, operand_count = 2, ops = {op_xmm(dst), op_mem(src.mem, 4), {}, {}} }, 811) } emit_comiss_xmm_xmm :: #force_inline proc(instructions: ^[dynamic]Instruction, dst: XMM, src: XMM) { append(instructions, inst_comiss_xmm_xmm(dst, src)) } @@ -8030,8 +8020,6 @@ inst_movupd :: proc{ inst_movupd_xmm_xmm, inst_movu emit_movupd :: proc{ emit_movupd_xmm_xmm, emit_movupd_xmm_m128, emit_movupd_m128_xmm } inst_movss :: proc{ inst_movss_xmm_xmm, inst_movss_xmm_m32, inst_movss_m32_xmm } emit_movss :: proc{ emit_movss_xmm_xmm, emit_movss_xmm_m32, emit_movss_m32_xmm } -inst_movsd_sse :: proc{ inst_movsd_sse_xmm_xmm, inst_movsd_sse_xmm_m64, inst_movsd_sse_m64_xmm } -emit_movsd_sse :: proc{ emit_movsd_sse_xmm_xmm, emit_movsd_sse_xmm_m64, emit_movsd_sse_m64_xmm } inst_movdqa :: proc{ inst_movdqa_xmm_xmm, inst_movdqa_xmm_m128, inst_movdqa_m128_xmm } emit_movdqa :: proc{ emit_movdqa_xmm_xmm, emit_movdqa_xmm_m128, emit_movdqa_m128_xmm } inst_movdqu :: proc{ inst_movdqu_xmm_xmm, inst_movdqu_xmm_m128, inst_movdqu_m128_xmm } @@ -8150,8 +8138,6 @@ inst_cmppd :: proc{ inst_cmppd_xmm_xmm_imm8, inst_ emit_cmppd :: proc{ emit_cmppd_xmm_xmm_imm8, emit_cmppd_xmm_m128_imm8 } inst_cmpss :: proc{ inst_cmpss_xmm_xmm_imm8, inst_cmpss_xmm_m32_imm8 } emit_cmpss :: proc{ emit_cmpss_xmm_xmm_imm8, emit_cmpss_xmm_m32_imm8 } -inst_cmpsd_sse :: proc{ inst_cmpsd_sse_xmm_xmm_imm8, inst_cmpsd_sse_xmm_m64_imm8 } -emit_cmpsd_sse :: proc{ emit_cmpsd_sse_xmm_xmm_imm8, emit_cmpsd_sse_xmm_m64_imm8 } inst_comiss :: proc{ inst_comiss_xmm_xmm, inst_comiss_xmm_m32 } emit_comiss :: proc{ emit_comiss_xmm_xmm, emit_comiss_xmm_m32 } inst_comisd :: proc{ inst_comisd_xmm_xmm, inst_comisd_xmm_m64 } diff --git a/core/rexcode/isa/x86/mnemonics.odin b/core/rexcode/isa/x86/mnemonics.odin index 7428b208a..e654bcd95 100644 --- a/core/rexcode/isa/x86/mnemonics.odin +++ b/core/rexcode/isa/x86/mnemonics.odin @@ -300,7 +300,6 @@ Mnemonic :: enum u16 { MOVAPD, MOVUPD, MOVSS, - MOVSD_SSE, // distinguish from string MOVSD MOVDQA, MOVDQU, MOVQ, @@ -360,7 +359,6 @@ Mnemonic :: enum u16 { CMPPS, CMPPD, CMPSS, - CMPSD_SSE, COMISS, COMISD, UCOMISS, diff --git a/core/rexcode/isa/x86/printer.odin b/core/rexcode/isa/x86/printer.odin index 687fbf55f..30ea392a9 100644 --- a/core/rexcode/isa/x86/printer.odin +++ b/core/rexcode/isa/x86/printer.odin @@ -51,9 +51,7 @@ Print_Result :: isa.Print_Result mnemonic_to_string :: proc(m: Mnemonic, lowercase: bool) -> string { #partial switch m { - case .INVALID: return "???" - case .MOVSD_SSE: return lowercase ? "movsd" : "MOVSD" - case .CMPSD_SSE: return lowercase ? "cmpsd" : "CMPSD" + case .INVALID: return "???" } if name, ok := reflect.enum_name_from_value(m); ok { return lowercase ? strings.to_lower(name, context.temp_allocator) : name diff --git a/core/rexcode/isa/x86/tablegen/clobber_table.odin b/core/rexcode/isa/x86/tablegen/clobber_table.odin index 857b604be..3bc0a9b19 100644 --- a/core/rexcode/isa/x86/tablegen/clobber_table.odin +++ b/core/rexcode/isa/x86/tablegen/clobber_table.odin @@ -1,1275 +1,4867 @@ -// clobber_table.odin -- auxiliary side-effect table for rexcode_x86_tablegen +// clobber_table.odin -- PER-FORM side-effect table for rexcode_x86_tablegen // -// DERIVED, NOT EXTRACTED. The ENCODING_TABLE describes how bytes are laid out -// (opcode, ModRM roles, prefixes, REX). It carries no read/write direction and -// no implicit side effects, so this table cannot be produced from it alone -- -// it is a hand-authored semantics layer sourced from the Intel SDM Vol.2 -// ("Operation" + "Flags Affected") applied per instruction family. +// Type: [Mnemonic][]x86.Clobber (parallel to [Mnemonic][]Encoding) // -// Conventions: -// written / read explicit operand slots (OP0..OP3). rmw = written & read. -// implicit_wr / _rd registers touched that are NOT explicit operands -// (widths follow operand size; e.g. RAX means AL/AX/EAX/RAX). -// flags_wr EFLAGS set to a DEFINED value (a cleared flag counts). -// flags_undef EFLAGS left ARCHITECTURALLY UNDEFINED (must be treated -// as clobbered by a compiler, value not guaranteed). -// flags_rd EFLAGS consumed by the instruction. -// writes_mem/reads_mem memory VALUE touched (explicit mem operand or -// implicit: PUSH/CALL/string ops/gather/scatter/etc). -// side_effects effects that are NOT clobbers but still make the -// instruction non-eliminable and/or non-reorderable -// (fences, serialization, traps, control flow, ...). -// This is what separates MFENCE -- orders memory, -// clobbers nothing -- from a genuine no-op. -// FPU_ST/FPU_SW = x87 stack / status word; MXCSR = SSE control-status; -// VECTOR = the whole SIMD register file (VZEROALL/VZEROUPPER). +// HOW EACH FORM IS SPECIALISED FROM THE UNION: +// 1. Implicit-operand normalisation. An operand that is an implicit register +// (AL/AX/EAX/RAX_IMPL -> RAX, CL_IMPL -> RCX, XMM0_IMPL -> XMM0, +// ST0_IMPL -> FPU_ST) or an implicit constant (ONE_IMPL) is removed from the +// OP0..OP3 slot set and, if that slot was written/read, folded into +// implicit_wr/implicit_rd. Registers that are implicit but NOT tied to an +// operand (RSP for the stack, RSI/RDI/RCX for strings, RDX for MULX, ...) +// are inherent and kept on every form. +// 2. Slot trimming. OP slots that are .NONE in a given form are dropped from +// written/read. +// 3. Per-form memory. writes_mem/reads_mem keep the union's DIRECTION but are +// asserted on a form only when that form actually carries a memory-capable +// operand, OR the instruction addresses memory implicitly (stack, string, +// XLAT table, MASKMOVDQU/[rDI] store, VMCS, shadow stack). Consequently +// register-only forms of otherwise-memory instructions (e.g. MOV r,imm; +// FADD ST(0),ST(i); FST ST(i); MOVLHPS; PEXTRW r32,xmm) no longer carry the +// blanket memory flag the union used. +// 4. Family splits that the union could only approximate: +// IMUL -- 1-operand form writes RDX:RAX implicitly (r/m8 -> AX only); +// 2-operand form is OP0 *= OP1; 3-operand form is OP0 = OP1 * imm +// (OP0 not read); neither multi-operand form touches RAX/RDX. +// MUL/DIV/IDIV -- the r/m8 form uses the A-register only and does not +// touch (R)DX. +// SHL/SHR/SAR/ROL/ROR/RCL/RCR/SHLD/SHRD -- only the CL form reads RCX; +// the 1/imm8 forms do not. +// Flags and side_effects are uniform across a mnemonic's forms and are carried +// through unchanged. // -// INVARIANT: an instruction is a pure, freely-eliminable no-op iff every -// clobber set is empty AND side_effects == {}. In this table only .NOP -// (and the .INVALID sentinel) satisfy that. +// INVARIANT preserved: a form is a freely-eliminable no-op iff every clobber set +// is empty AND side_effects == {} (only .NOP and the .INVALID sentinel qualify). package rexcode_x86_tablegen import "core:rexcode/isa/x86" @(rodata) -CLOBBER_TABLE := [Mnemonic]x86.Clobber{ +CLOBBER_TABLE := [Mnemonic][]x86.Clobber{ .INVALID = {}, - // ---- 8.1 Data Transfer Encodings ---- - .MOV = {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, - .MOVABS = {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, - .MOVZX = {written={.OP0}, read={.OP1}, reads_mem=true}, - .MOVSX = {written={.OP0}, read={.OP1}, reads_mem=true}, - .MOVSXD = {written={.OP0}, read={.OP1}, reads_mem=true}, - .XCHG = {written={.OP0, .OP1}, read={.OP0, .OP1}, writes_mem=true, reads_mem=true}, // asserts LOCK when a mem operand is used - .PUSH = {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true}, - .POP = {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true}, - .LEA = {written={.OP0}}, // no memory access: computes effective address only - // ---- 8.2 Arithmetic Encodings ---- - .ADD = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, - .ADC = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, - .SUB = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, - .SBB = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, - .MUL = {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.SF, .ZF, .AF, .PF}, reads_mem=true}, // RAX/RDX widths follow operand size (r/m8 -> AX only) - .IMUL = {written={.OP0}, read={.OP0, .OP1, .OP2}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.SF, .ZF, .AF, .PF}, reads_mem=true}, // union of forms: 1-op writes RDX:RAX (implicit); 2/3-op writes OP0, no implicit - .DIV = {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, // RDX:RAX = quotient/remainder; r/m8 uses AX only - .IDIV = {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, // RDX:RAX = quotient/remainder; r/m8 uses AX only - .INC = {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, // CF deliberately NOT affected - .DEC = {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, // CF deliberately NOT affected - .NEG = {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, - .CMP = {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, // no operand written; flags only + // 8.1 Data Transfer Encodings + .MOV = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .MOVABS = { + {written={.OP0}, read={.OP1}}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + }, + .MOVZX = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .MOVSX = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .MOVSXD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .XCHG = { // asserts LOCK when a mem operand is used + {written={.OP1}, read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}}, + {written={.OP1}, read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}}, + {written={.OP1}, read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, writes_mem=true, reads_mem=true}, + }, + .PUSH = { + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + }, + .POP = { + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true}, + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true}, + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true}, + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true}, + }, + .LEA = { // no memory access: computes effective address only + {written={.OP0}}, + {written={.OP0}}, + {written={.OP0}}, + }, - // ---- 8.3 Logical Encodings ---- - .AND = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.OF, .CF, .SF, .ZF, .PF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, - .OR = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.OF, .CF, .SF, .ZF, .PF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, - .XOR = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.OF, .CF, .SF, .ZF, .PF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, - .NOT = {written={.OP0}, read={.OP0}, writes_mem=true, reads_mem=true}, - .TEST = {read={.OP0, .OP1}, flags_wr={.OF, .CF, .SF, .ZF, .PF}, flags_undef={.AF}, reads_mem=true}, // no operand written; flags only + // 8.2 Arithmetic Encodings + .ADD = { + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + }, + .ADC = { + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + }, + .SUB = { + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + }, + .SBB = { + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + }, + .MUL = { // RAX/RDX widths follow operand size (r/m8 -> AX only) + {read={.OP0}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // r/m8 form: A-register only, no (R)DX + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + }, + .IMUL = { // union of forms: 1-op writes RDX:RAX (implicit); 2/3-op writes OP0, no implicit + {read={.OP0}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 1-op r/m8: AX <- AL*r/m8 + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 1-operand form: RDX:RAX <- RAX * r/m + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 1-operand form: RDX:RAX <- RAX * r/m + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 1-operand form: RDX:RAX <- RAX * r/m + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 2-operand form: OP0 *= OP1 + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 2-operand form: OP0 *= OP1 + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 2-operand form: OP0 *= OP1 + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 3-operand form: OP0 = OP1 * imm (OP0 not read) + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 3-operand form: OP0 = OP1 * imm (OP0 not read) + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 3-operand form: OP0 = OP1 * imm (OP0 not read) + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 3-operand form: OP0 = OP1 * imm (OP0 not read) + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 3-operand form: OP0 = OP1 * imm (OP0 not read) + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, // 3-operand form: OP0 = OP1 * imm (OP0 not read) + }, + .DIV = { // RDX:RAX = quotient/remainder; r/m8 uses AX only + {read={.OP0}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, // r/m8 form: A-register only, no (R)DX + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, + .IDIV = { // RDX:RAX = quotient/remainder; r/m8 uses AX only + {read={.OP0}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, // r/m8 form: A-register only, no (R)DX + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, + .INC = { // CF deliberately NOT affected + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + }, + .DEC = { // CF deliberately NOT affected + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + }, + .NEG = { + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + }, + .CMP = { // no operand written; flags only + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, - // ---- 8.4 Shift/Rotate Encodings ---- - .SHL = {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .SF, .ZF, .PF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, // OF defined only for 1-bit count; count==0 leaves flags unchanged - .SHR = {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .SF, .ZF, .PF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, // OF defined only for 1-bit count; count==0 leaves flags unchanged - .SAR = {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .SF, .ZF, .PF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, // OF defined only for 1-bit count; count==0 leaves flags unchanged - .ROL = {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, // only CF/OF affected; count==0 leaves flags unchanged - .ROR = {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, // only CF/OF affected; count==0 leaves flags unchanged - .RCL = {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, - .RCR = {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, - .SHLD = {written={.OP0}, read={.OP0, .OP1, .OP2}, implicit_rd={.RCX}, flags_wr={.CF, .SF, .ZF, .PF}, flags_undef={.OF, .AF}, writes_mem=true, reads_mem=true}, - .SHRD = {written={.OP0}, read={.OP0, .OP1, .OP2}, implicit_rd={.RCX}, flags_wr={.CF, .SF, .ZF, .PF}, flags_undef={.OF, .AF}, writes_mem=true, reads_mem=true}, + // 8.3 Logical Encodings + .AND = { + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + }, + .OR = { + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + }, + .XOR = { + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + }, + .NOT = { + {written={.OP0}, read={.OP0}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, writes_mem=true, reads_mem=true}, + }, + .TEST = { // no operand written; flags only + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + }, - // ---- 8.5 Bit Operation Encodings ---- - .BT = {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.OF, .SF, .AF, .PF}, reads_mem=true}, // ZF unaffected - .BTS = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.OF, .SF, .AF, .PF}, writes_mem=true, reads_mem=true}, // ZF unaffected - .BTR = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.OF, .SF, .AF, .PF}, writes_mem=true, reads_mem=true}, // ZF unaffected - .BTC = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.OF, .SF, .AF, .PF}, writes_mem=true, reads_mem=true}, // ZF unaffected - .BSF = {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .OF, .SF, .AF, .PF}, reads_mem=true}, // destination undefined when source == 0 - .BSR = {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .OF, .SF, .AF, .PF}, reads_mem=true}, // destination undefined when source == 0 - .POPCNT = {written={.OP0}, read={.OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, // ZF per source; CF/OF/SF/AF/PF cleared - .LZCNT = {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.OF, .SF, .AF, .PF}, reads_mem=true}, - .TZCNT = {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.OF, .SF, .AF, .PF}, reads_mem=true}, + // 8.4 Shift/Rotate Encodings + .SHL = { // OF defined only for 1-bit count; count==0 leaves flags unchanged + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + }, + .SHR = { // OF defined only for 1-bit count; count==0 leaves flags unchanged + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + }, + .SAR = { // OF defined only for 1-bit count; count==0 leaves flags unchanged + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + }, + .ROL = { // only CF/OF affected; count==0 leaves flags unchanged + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + }, + .ROR = { // only CF/OF affected; count==0 leaves flags unchanged + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + }, + .RCL = { + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + }, + .RCR = { + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + }, + .SHLD = { + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + }, + .SHRD = { + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + }, - // ---- 8.6 Control Flow Encodings ---- - .JMP = {read={.OP0}, reads_mem=true, side_effects={.CONTROL}}, // indirect forms read reg/mem; writes RIP - .JA = {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JAE = {flags_rd={.CF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JB = {flags_rd={.CF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JBE = {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JC = {flags_rd={.CF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JE = {flags_rd={.ZF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JZ = {flags_rd={.ZF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JG = {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JGE = {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JL = {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JLE = {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNA = {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNAE = {flags_rd={.CF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNB = {flags_rd={.CF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNBE = {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNC = {flags_rd={.CF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNE = {flags_rd={.ZF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNZ = {flags_rd={.ZF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNG = {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNGE = {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNL = {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNLE = {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNO = {flags_rd={.OF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNP = {flags_rd={.PF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JNS = {flags_rd={.SF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JO = {flags_rd={.OF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JP = {flags_rd={.PF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JPE = {flags_rd={.PF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JPO = {flags_rd={.PF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JS = {flags_rd={.SF}, side_effects={.CONTROL}}, // reads flags; writes RIP on taken branch - .JCXZ = {implicit_rd={.RCX}, side_effects={.CONTROL}}, // reads CX - .JECXZ = {implicit_rd={.RCX}, side_effects={.CONTROL}}, // reads ECX - .JRCXZ = {implicit_rd={.RCX}, side_effects={.CONTROL}}, // reads RCX - .LOOP = {implicit_wr={.RCX}, implicit_rd={.RCX}, side_effects={.CONTROL}}, - .LOOPE = {implicit_wr={.RCX}, implicit_rd={.RCX}, flags_rd={.ZF}, side_effects={.CONTROL}}, - .LOOPNE = {implicit_wr={.RCX}, implicit_rd={.RCX}, flags_rd={.ZF}, side_effects={.CONTROL}}, - .CALL = {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true, side_effects={.CONTROL}}, // pushes return address - .RET = {implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true, side_effects={.CONTROL}}, // pops return address (+imm16 form adjusts RSP) - .IRET = {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true, side_effects={.SERIALIZING, .CONTROL}}, // pops RIP/CS/RFLAGS (privileged bits conditionally) - .IRETD = {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true, side_effects={.SERIALIZING, .CONTROL}}, // pops RIP/CS/RFLAGS (privileged bits conditionally) - .IRETQ = {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true, side_effects={.SERIALIZING, .CONTROL}}, // pops RIP/CS/RFLAGS (privileged bits conditionally) - .INT = {read={.OP0}, implicit_wr={.RSP}, flags_wr={.IF}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true, side_effects={.INTERRUPT, .CONTROL}}, // pushes RFLAGS/CS/RIP; clears TF/IF via gate - .INT3 = {read={.OP0}, implicit_wr={.RSP}, flags_wr={.IF}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true, side_effects={.INTERRUPT, .CONTROL}}, // pushes RFLAGS/CS/RIP; clears TF/IF via gate - .INTO = {implicit_wr={.RSP}, flags_wr={.IF}, flags_rd={.OF, .CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true, side_effects={.INTERRUPT, .CONTROL}}, // #OF only if OF=1 - .SYSCALL = {implicit_wr={.RCX, .R11}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, side_effects={.INTERRUPT, .CONTROL}}, // RCX<-RIP, R11<-RFLAGS; RFLAGS masked by IA32_FMASK - .SYSRET = {implicit_rd={.RCX, .R11}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, side_effects={.SERIALIZING, .INTERRUPT, .PRIVILEGED, .CONTROL}}, // RIP<-RCX, RFLAGS<-R11 - .SYSENTER = {implicit_wr={.RSP}, flags_wr={.IF}, side_effects={.INTERRUPT, .CONTROL}}, // privileged; RSP/RIP from MSRs - .SYSEXIT = {implicit_wr={.RSP}, implicit_rd={.RCX, .RDX}, side_effects={.SERIALIZING, .INTERRUPT, .PRIVILEGED, .CONTROL}}, // privileged; RSP<-RDX/RCX, RIP<-RCX/RDX + // 8.5 Bit Operation Encodings + .BT = { // ZF unaffected + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + }, + .BTS = { // ZF unaffected + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + }, + .BTR = { // ZF unaffected + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + }, + .BTC = { // ZF unaffected + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + }, + .BSF = { // destination undefined when source == 0 + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + }, + .BSR = { // destination undefined when source == 0 + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + }, + .POPCNT = { // ZF per source; CF/OF/SF/AF/PF cleared + {written={.OP0}, read={.OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, + .LZCNT = { + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + }, + .TZCNT = { + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + }, - // ---- 8.7 Conditional Set/Move Encodings ---- - .SETA = {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, - .SETAE = {written={.OP0}, flags_rd={.CF}, writes_mem=true}, - .SETB = {written={.OP0}, flags_rd={.CF}, writes_mem=true}, - .SETBE = {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, - .SETC = {written={.OP0}, flags_rd={.CF}, writes_mem=true}, - .SETE = {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, - .SETG = {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, - .SETGE = {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, - .SETL = {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, - .SETLE = {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, - .SETNA = {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, - .SETNAE = {written={.OP0}, flags_rd={.CF}, writes_mem=true}, - .SETNB = {written={.OP0}, flags_rd={.CF}, writes_mem=true}, - .SETNBE = {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, - .SETNC = {written={.OP0}, flags_rd={.CF}, writes_mem=true}, - .SETNE = {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, - .SETNG = {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, - .SETNGE = {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, - .SETNL = {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, - .SETNLE = {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, - .SETNO = {written={.OP0}, flags_rd={.OF}, writes_mem=true}, - .SETNP = {written={.OP0}, flags_rd={.PF}, writes_mem=true}, - .SETNS = {written={.OP0}, flags_rd={.SF}, writes_mem=true}, - .SETNZ = {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, - .SETO = {written={.OP0}, flags_rd={.OF}, writes_mem=true}, - .SETP = {written={.OP0}, flags_rd={.PF}, writes_mem=true}, - .SETPE = {written={.OP0}, flags_rd={.PF}, writes_mem=true}, - .SETPO = {written={.OP0}, flags_rd={.PF}, writes_mem=true}, - .SETS = {written={.OP0}, flags_rd={.SF}, writes_mem=true}, - .SETZ = {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, - .CMOVA = {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, // conditional write of OP0 - .CMOVAE = {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, // conditional write of OP0 - .CMOVB = {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, // conditional write of OP0 - .CMOVBE = {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, // conditional write of OP0 - .CMOVC = {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, // conditional write of OP0 - .CMOVE = {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, // conditional write of OP0 - .CMOVG = {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, // conditional write of OP0 - .CMOVGE = {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, // conditional write of OP0 - .CMOVL = {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, // conditional write of OP0 - .CMOVLE = {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, // conditional write of OP0 - .CMOVNA = {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, // conditional write of OP0 - .CMOVNAE = {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, // conditional write of OP0 - .CMOVNB = {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, // conditional write of OP0 - .CMOVNBE = {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, // conditional write of OP0 - .CMOVNC = {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, // conditional write of OP0 - .CMOVNE = {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, // conditional write of OP0 - .CMOVNG = {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, // conditional write of OP0 - .CMOVNGE = {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, // conditional write of OP0 - .CMOVNL = {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, // conditional write of OP0 - .CMOVNLE = {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, // conditional write of OP0 - .CMOVNO = {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, // conditional write of OP0 - .CMOVNP = {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, // conditional write of OP0 - .CMOVNS = {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, // conditional write of OP0 - .CMOVNZ = {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, // conditional write of OP0 - .CMOVO = {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, // conditional write of OP0 - .CMOVP = {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, // conditional write of OP0 - .CMOVPE = {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, // conditional write of OP0 - .CMOVPO = {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, // conditional write of OP0 - .CMOVS = {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, // conditional write of OP0 - .CMOVZ = {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, // conditional write of OP0 + // 8.6 Control Flow Encodings + .JMP = { // indirect forms read reg/mem; writes RIP + {read={.OP0}, side_effects={.CONTROL}}, + {read={.OP0}, side_effects={.CONTROL}}, + {read={.OP0}, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, reads_mem=true, side_effects={.CONTROL}}, + }, + .JA = { // reads flags; writes RIP on taken branch + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + }, + .JAE = { // reads flags; writes RIP on taken branch + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + }, + .JB = { // reads flags; writes RIP on taken branch + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + }, + .JBE = { // reads flags; writes RIP on taken branch + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + }, + .JC = { // reads flags; writes RIP on taken branch + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + }, + .JE = { // reads flags; writes RIP on taken branch + {flags_rd={.ZF}, side_effects={.CONTROL}}, + {flags_rd={.ZF}, side_effects={.CONTROL}}, + }, + .JZ = { // reads flags; writes RIP on taken branch + {flags_rd={.ZF}, side_effects={.CONTROL}}, + {flags_rd={.ZF}, side_effects={.CONTROL}}, + }, + .JG = { // reads flags; writes RIP on taken branch + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + }, + .JGE = { // reads flags; writes RIP on taken branch + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + }, + .JL = { // reads flags; writes RIP on taken branch + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + }, + .JLE = { // reads flags; writes RIP on taken branch + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + }, + .JNA = { // reads flags; writes RIP on taken branch + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + }, + .JNAE = { // reads flags; writes RIP on taken branch + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + }, + .JNB = { // reads flags; writes RIP on taken branch + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + }, + .JNBE = { // reads flags; writes RIP on taken branch + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + }, + .JNC = { // reads flags; writes RIP on taken branch + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + }, + .JNE = { // reads flags; writes RIP on taken branch + {flags_rd={.ZF}, side_effects={.CONTROL}}, + {flags_rd={.ZF}, side_effects={.CONTROL}}, + }, + .JNZ = { // reads flags; writes RIP on taken branch + {flags_rd={.ZF}, side_effects={.CONTROL}}, + {flags_rd={.ZF}, side_effects={.CONTROL}}, + }, + .JNG = { // reads flags; writes RIP on taken branch + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + }, + .JNGE = { // reads flags; writes RIP on taken branch + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + }, + .JNL = { // reads flags; writes RIP on taken branch + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + }, + .JNLE = { // reads flags; writes RIP on taken branch + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + }, + .JNO = { // reads flags; writes RIP on taken branch + {flags_rd={.OF}, side_effects={.CONTROL}}, + {flags_rd={.OF}, side_effects={.CONTROL}}, + }, + .JNP = { // reads flags; writes RIP on taken branch + {flags_rd={.PF}, side_effects={.CONTROL}}, + {flags_rd={.PF}, side_effects={.CONTROL}}, + }, + .JNS = { // reads flags; writes RIP on taken branch + {flags_rd={.SF}, side_effects={.CONTROL}}, + {flags_rd={.SF}, side_effects={.CONTROL}}, + }, + .JO = { // reads flags; writes RIP on taken branch + {flags_rd={.OF}, side_effects={.CONTROL}}, + {flags_rd={.OF}, side_effects={.CONTROL}}, + }, + .JP = { // reads flags; writes RIP on taken branch + {flags_rd={.PF}, side_effects={.CONTROL}}, + {flags_rd={.PF}, side_effects={.CONTROL}}, + }, + .JPE = { // reads flags; writes RIP on taken branch + {flags_rd={.PF}, side_effects={.CONTROL}}, + {flags_rd={.PF}, side_effects={.CONTROL}}, + }, + .JPO = { // reads flags; writes RIP on taken branch + {flags_rd={.PF}, side_effects={.CONTROL}}, + {flags_rd={.PF}, side_effects={.CONTROL}}, + }, + .JS = { // reads flags; writes RIP on taken branch + {flags_rd={.SF}, side_effects={.CONTROL}}, + {flags_rd={.SF}, side_effects={.CONTROL}}, + }, + .JCXZ = { // reads CX + {implicit_rd={.RCX}, side_effects={.CONTROL}}, + }, + .JECXZ = { // reads ECX + {implicit_rd={.RCX}, side_effects={.CONTROL}}, + }, + .JRCXZ = { // reads RCX + {implicit_rd={.RCX}, side_effects={.CONTROL}}, + }, + .LOOP = { + {implicit_wr={.RCX}, implicit_rd={.RCX}, side_effects={.CONTROL}}, + }, + .LOOPE = { + {implicit_wr={.RCX}, implicit_rd={.RCX}, flags_rd={.ZF}, side_effects={.CONTROL}}, + }, + .LOOPNE = { + {implicit_wr={.RCX}, implicit_rd={.RCX}, flags_rd={.ZF}, side_effects={.CONTROL}}, + }, + .CALL = { // pushes return address + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true, side_effects={.CONTROL}}, + }, + .RET = { // pops return address (+imm16 form adjusts RSP) + {implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true, side_effects={.CONTROL}}, + {implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true, side_effects={.CONTROL}}, + }, + .IRET = { // pops RIP/CS/RFLAGS (privileged bits conditionally) + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true, side_effects={.SERIALIZING, .CONTROL}}, + }, + .IRETD = { // pops RIP/CS/RFLAGS (privileged bits conditionally) + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true, side_effects={.SERIALIZING, .CONTROL}}, + }, + .IRETQ = { // pops RIP/CS/RFLAGS (privileged bits conditionally) + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true, side_effects={.SERIALIZING, .CONTROL}}, + }, + .INT = { // pushes RFLAGS/CS/RIP; clears TF/IF via gate + {read={.OP0}, implicit_wr={.RSP}, flags_wr={.IF}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true, side_effects={.INTERRUPT, .CONTROL}}, + }, + .INT3 = { // pushes RFLAGS/CS/RIP; clears TF/IF via gate + {implicit_wr={.RSP}, flags_wr={.IF}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true, side_effects={.INTERRUPT, .CONTROL}}, + }, + .INTO = { // #OF only if OF=1 + {implicit_wr={.RSP}, flags_wr={.IF}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true, side_effects={.INTERRUPT, .CONTROL}}, + }, + .SYSCALL = { // RCX<-RIP, R11<-RFLAGS; RFLAGS masked by IA32_FMASK + {implicit_wr={.RCX, .R11}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, side_effects={.INTERRUPT, .CONTROL}}, + }, + .SYSRET = { // RIP<-RCX, RFLAGS<-R11 + {implicit_rd={.RCX, .R11}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, side_effects={.SERIALIZING, .INTERRUPT, .PRIVILEGED, .CONTROL}}, + }, + .SYSENTER = { // privileged; RSP/RIP from MSRs + {implicit_wr={.RSP}, flags_wr={.IF}, side_effects={.INTERRUPT, .CONTROL}}, + }, + .SYSEXIT = { // privileged; RSP<-RDX/RCX, RIP<-RCX/RDX + {implicit_wr={.RSP}, implicit_rd={.RCX, .RDX}, side_effects={.SERIALIZING, .INTERRUPT, .PRIVILEGED, .CONTROL}}, + }, - // ---- 8.8 String Operation Encodings ---- - .MOVS = {implicit_wr={.RSI, .RDI, .RCX}, implicit_rd={.RSI, .RDI, .RCX}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .MOVSB = {implicit_wr={.RSI, .RDI, .RCX}, implicit_rd={.RSI, .RDI, .RCX}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .MOVSW = {implicit_wr={.RSI, .RDI, .RCX}, implicit_rd={.RSI, .RDI, .RCX}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .MOVSD = {implicit_wr={.RSI, .RDI, .RCX}, implicit_rd={.RSI, .RDI, .RCX}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .MOVSQ = {implicit_wr={.RSI, .RDI, .RCX}, implicit_rd={.RSI, .RDI, .RCX}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .CMPS = {implicit_wr={.RSI, .RDI, .RCX}, implicit_rd={.RSI, .RDI, .RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .CMPSB = {implicit_wr={.RSI, .RDI, .RCX}, implicit_rd={.RSI, .RDI, .RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .CMPSW = {implicit_wr={.RSI, .RDI, .RCX}, implicit_rd={.RSI, .RDI, .RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .CMPSD = {implicit_wr={.RSI, .RDI, .RCX}, implicit_rd={.RSI, .RDI, .RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .CMPSQ = {implicit_wr={.RSI, .RDI, .RCX}, implicit_rd={.RSI, .RDI, .RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .SCAS = {implicit_wr={.RDI, .RCX}, implicit_rd={.RDI, .RAX, .RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .SCASB = {implicit_wr={.RDI, .RCX}, implicit_rd={.RDI, .RAX, .RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .SCASW = {implicit_wr={.RDI, .RCX}, implicit_rd={.RDI, .RAX, .RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .SCASD = {implicit_wr={.RDI, .RCX}, implicit_rd={.RDI, .RAX, .RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .SCASQ = {implicit_wr={.RDI, .RCX}, implicit_rd={.RDI, .RAX, .RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .LODS = {implicit_wr={.RSI, .RAX}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .LODSB = {implicit_wr={.RSI, .RAX}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .LODSW = {implicit_wr={.RSI, .RAX}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .LODSD = {implicit_wr={.RSI, .RAX}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .LODSQ = {implicit_wr={.RSI, .RAX}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .STOS = {implicit_wr={.RDI, .RCX}, implicit_rd={.RDI, .RAX, .RCX}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .STOSB = {implicit_wr={.RDI, .RCX}, implicit_rd={.RDI, .RAX, .RCX}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .STOSW = {implicit_wr={.RDI, .RCX}, implicit_rd={.RDI, .RAX, .RCX}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .STOSD = {implicit_wr={.RDI, .RCX}, implicit_rd={.RDI, .RAX, .RCX}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX - .STOSQ = {implicit_wr={.RDI, .RCX}, implicit_rd={.RDI, .RAX, .RCX}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, // REP/REPZ/REPNZ forms read+write RCX + // 8.7 Conditional Set/Move Encodings + .SETA = { + {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, + }, + .SETAE = { + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + }, + .SETB = { + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + }, + .SETBE = { + {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, + }, + .SETC = { + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + }, + .SETE = { + {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, + }, + .SETG = { + {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, + }, + .SETGE = { + {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, + }, + .SETL = { + {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, + }, + .SETLE = { + {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, + }, + .SETNA = { + {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, + }, + .SETNAE = { + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + }, + .SETNB = { + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + }, + .SETNBE = { + {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, + }, + .SETNC = { + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + }, + .SETNE = { + {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, + }, + .SETNG = { + {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, + }, + .SETNGE = { + {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, + }, + .SETNL = { + {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, + }, + .SETNLE = { + {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, + }, + .SETNO = { + {written={.OP0}, flags_rd={.OF}, writes_mem=true}, + }, + .SETNP = { + {written={.OP0}, flags_rd={.PF}, writes_mem=true}, + }, + .SETNS = { + {written={.OP0}, flags_rd={.SF}, writes_mem=true}, + }, + .SETNZ = { + {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, + }, + .SETO = { + {written={.OP0}, flags_rd={.OF}, writes_mem=true}, + }, + .SETP = { + {written={.OP0}, flags_rd={.PF}, writes_mem=true}, + }, + .SETPE = { + {written={.OP0}, flags_rd={.PF}, writes_mem=true}, + }, + .SETPO = { + {written={.OP0}, flags_rd={.PF}, writes_mem=true}, + }, + .SETS = { + {written={.OP0}, flags_rd={.SF}, writes_mem=true}, + }, + .SETZ = { + {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, + }, + .CMOVA = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + }, + .CMOVAE = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + }, + .CMOVB = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + }, + .CMOVBE = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + }, + .CMOVC = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + }, + .CMOVE = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + }, + .CMOVG = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + }, + .CMOVGE = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + }, + .CMOVL = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + }, + .CMOVLE = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + }, + .CMOVNA = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + }, + .CMOVNAE = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + }, + .CMOVNB = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + }, + .CMOVNBE = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + }, + .CMOVNC = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + }, + .CMOVNE = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + }, + .CMOVNG = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + }, + .CMOVNGE = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + }, + .CMOVNL = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + }, + .CMOVNLE = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + }, + .CMOVNO = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + }, + .CMOVNP = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + }, + .CMOVNS = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + }, + .CMOVNZ = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + }, + .CMOVO = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + }, + .CMOVP = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + }, + .CMOVPE = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + }, + .CMOVPO = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + }, + .CMOVS = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + }, + .CMOVZ = { // conditional write of OP0 + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + }, - // ---- 8.9 Flag Operation Encodings ---- - .CLC = {flags_wr={.CF}}, - .STC = {flags_wr={.CF}}, - .CMC = {flags_wr={.CF}, flags_rd={.CF}}, - .CLD = {flags_wr={.DF}}, - .STD = {flags_wr={.DF}}, - .CLI = {flags_wr={.IF}}, - .STI = {flags_wr={.IF}}, - .LAHF = {implicit_wr={.RAX}, flags_rd={.SF, .ZF, .AF, .PF, .CF}}, // AH <- flags - .SAHF = {implicit_rd={.RAX}, flags_wr={.SF, .ZF, .AF, .PF, .CF}}, // flags <- AH - .PUSHF = {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true}, - .PUSHFD = {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true}, - .PUSHFQ = {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true}, - .POPF = {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true}, - .POPFD = {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true}, - .POPFQ = {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true}, + // 8.8 String Operation Encodings + .MOVS = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + }, + .MOVSB = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + }, + .MOVSW = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + }, + .MOVSD = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + // SSE variants + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVSQ = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + }, + .CMPS = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + }, + .CMPSB = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + }, + .CMPSW = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + }, + .CMPSD = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CMPSQ = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + }, + .SCAS = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + }, + .SCASB = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + }, + .SCASW = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + }, + .SCASD = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + }, + .SCASQ = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + }, + .LODS = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RAX, .RSI}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, + }, + .LODSB = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RAX, .RSI}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, + }, + .LODSW = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RAX, .RSI}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, + }, + .LODSD = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RAX, .RSI}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, + }, + .LODSQ = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RAX, .RSI}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, + }, + .STOS = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + }, + .STOSB = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + }, + .STOSW = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + }, + .STOSD = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + }, + .STOSQ = { // REP/REPZ/REPNZ forms read+write RCX + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + }, - // ---- 8.10 Miscellaneous Encodings ---- - .NOP = {}, // no register/flag/memory clobber - .HLT = {side_effects={.HALT, .PRIVILEGED}}, // no register/flag/memory clobber - .WAIT = {implicit_rd={.FPU_SW}}, // waits on pending x87 exception - .LOCK = {side_effects={.FENCE}}, // no register/flag/memory clobber - .UD0 = {side_effects={.TRAP}}, // no register/flag/memory clobber - .UD1 = {side_effects={.TRAP}}, // no register/flag/memory clobber - .UD2 = {side_effects={.TRAP}}, // no register/flag/memory clobber - .CPUID = {implicit_wr={.RAX, .RBX, .RCX, .RDX}, implicit_rd={.RAX, .RCX}, side_effects={.SERIALIZING}}, - .RDTSC = {implicit_wr={.RAX, .RDX}}, - .RDTSCP = {implicit_wr={.RAX, .RDX, .RCX}}, - .RDPMC = {implicit_wr={.RAX, .RDX}, implicit_rd={.RCX}}, - .XGETBV = {implicit_wr={.RAX, .RDX}, implicit_rd={.RCX}}, - .XSETBV = {implicit_rd={.RCX, .RDX, .RAX}}, // privileged; writes XCR[ECX] - .CBW = {implicit_wr={.RAX}, implicit_rd={.RAX}}, - .CWDE = {implicit_wr={.RAX}, implicit_rd={.RAX}}, - .CDQE = {implicit_wr={.RAX}, implicit_rd={.RAX}}, - .CWD = {implicit_wr={.RDX}, implicit_rd={.RAX}}, - .CDQ = {implicit_wr={.RDX}, implicit_rd={.RAX}}, - .CQO = {implicit_wr={.RDX}, implicit_rd={.RAX}}, + // 8.9 Flag Operation Encodings + .CLC = { + {flags_wr={.CF}}, + }, + .STC = { + {flags_wr={.CF}}, + }, + .CMC = { + {flags_wr={.CF}, flags_rd={.CF}}, + }, + .CLD = { + {flags_wr={.DF}}, + }, + .STD = { + {flags_wr={.DF}}, + }, + .CLI = { + {flags_wr={.IF}}, + }, + .STI = { + {flags_wr={.IF}}, + }, + .LAHF = { // AH <- flags + {implicit_wr={.RAX}, flags_rd={.CF, .PF, .AF, .ZF, .SF}}, + }, + .SAHF = { // flags <- AH + {implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF}}, + }, + .PUSHF = { + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true}, + }, + .PUSHFD = { + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true}, + }, + .PUSHFQ = { + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true}, + }, + .POPF = { + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true}, + }, + .POPFD = { + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true}, + }, + .POPFQ = { + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true}, + }, - // ---- 8.11 BMI/ADX Encodings ---- - .ANDN = {written={.OP0}, read={.OP1, .OP2}, flags_wr={.SF, .ZF, .CF, .OF}, flags_undef={.AF, .PF}, reads_mem=true}, - .BEXTR = {written={.OP0}, read={.OP1, .OP2}, flags_wr={.ZF, .CF, .OF}, flags_undef={.SF, .AF, .PF}, reads_mem=true}, - .BLSI = {written={.OP0}, read={.OP1}, flags_wr={.CF, .SF, .ZF, .OF}, flags_undef={.AF, .PF}, reads_mem=true}, - .BLSMSK = {written={.OP0}, read={.OP1}, flags_wr={.CF, .SF, .ZF, .OF}, flags_undef={.AF, .PF}, reads_mem=true}, - .BLSR = {written={.OP0}, read={.OP1}, flags_wr={.CF, .SF, .ZF, .OF}, flags_undef={.AF, .PF}, reads_mem=true}, - .BZHI = {written={.OP0}, read={.OP1, .OP2}, flags_wr={.ZF, .SF, .CF, .OF}, flags_undef={.AF, .PF}, reads_mem=true}, - .PDEP = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // no flags affected - .PEXT = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // no flags affected - .RORX = {written={.OP0}, read={.OP1}, reads_mem=true}, // no flags affected - .SARX = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // no flags affected (unlike SAR/SHL/SHR) - .SHLX = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // no flags affected (unlike SAR/SHL/SHR) - .SHRX = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // no flags affected (unlike SAR/SHL/SHR) - .MULX = {written={.OP0, .OP1}, read={.OP2}, implicit_rd={.RDX}, reads_mem=true}, // no flags affected; implicit multiplicand in rDX - .ADCX = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_rd={.CF}, reads_mem=true}, // only CF (chains with ADCX) - .ADOX = {written={.OP0}, read={.OP0, .OP1}, flags_wr={.OF}, flags_rd={.OF}, reads_mem=true}, // only OF (chains with ADOX) + // 8.10 Miscellaneous Encodings + .NOP = { // no register/flag/memory clobber + {}, + {}, + {}, + {}, + }, + .HLT = { // no register/flag/memory clobber + {side_effects={.HALT, .PRIVILEGED}}, + }, + .WAIT = { // waits on pending x87 exception + {implicit_rd={.FPU_SW}}, + }, + .LOCK = { // no register/flag/memory clobber + {side_effects={.FENCE}}, + }, + .UD0 = { // no register/flag/memory clobber + {side_effects={.TRAP}}, + }, + .UD1 = { // no register/flag/memory clobber + {side_effects={.TRAP}}, + }, + .UD2 = { // no register/flag/memory clobber + {side_effects={.TRAP}}, + }, + .CPUID = { + {implicit_wr={.RAX, .RBX, .RCX, .RDX}, implicit_rd={.RAX, .RCX}, side_effects={.SERIALIZING}}, + }, + .RDTSC = { + {implicit_wr={.RAX, .RDX}}, + }, + .RDTSCP = { + {implicit_wr={.RAX, .RCX, .RDX}}, + }, + .RDPMC = { + {implicit_wr={.RAX, .RDX}, implicit_rd={.RCX}}, + }, + .XGETBV = { + {implicit_wr={.RAX, .RDX}, implicit_rd={.RCX}}, + }, + .XSETBV = { // privileged; writes XCR[ECX] + {implicit_rd={.RAX, .RCX, .RDX}}, + }, + .CBW = { + {implicit_wr={.RAX}, implicit_rd={.RAX}}, + }, + .CWDE = { + {implicit_wr={.RAX}, implicit_rd={.RAX}}, + }, + .CDQE = { + {implicit_wr={.RAX}, implicit_rd={.RAX}}, + }, + .CWD = { + {implicit_wr={.RDX}, implicit_rd={.RAX}}, + }, + .CDQ = { + {implicit_wr={.RDX}, implicit_rd={.RAX}}, + }, + .CQO = { + {implicit_wr={.RDX}, implicit_rd={.RAX}}, + }, - // ---- 8.12 SSE Encodings ---- - .MOVAPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVUPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVAPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVUPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVSD_SSE = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVDQA = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVDQU = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVLPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVHPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVLPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVHPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVLHPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .MOVHLPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .MOVMSKPS = {written={.OP0}, read={.OP1}}, // destination is a GPR - .MOVMSKPD = {written={.OP0}, read={.OP1}}, // destination is a GPR - .MOVNTPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVNTPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVNTDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .MOVNTDQA = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .ADDPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .ADDPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .ADDSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .ADDSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .SUBPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .SUBPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .SUBSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .SUBSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MULPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MULPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MULSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MULSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .DIVPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .DIVPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .DIVSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .DIVSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .SQRTPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .SQRTPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .SQRTSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .SQRTSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .RCPPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .RCPSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .RSQRTPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .RSQRTSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MAXPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MAXPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MAXSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MAXSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MINPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MINPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MINSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MINSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .ANDPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .ANDPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .ANDNPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .ANDNPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .ORPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .ORPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .XORPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .XORPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .CMPPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CMPPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CMPSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CMPSD_SSE = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .COMISS = {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}, reads_mem=true}, // OF/SF/AF cleared - .COMISD = {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}, reads_mem=true}, // OF/SF/AF cleared - .UCOMISS = {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}, reads_mem=true}, // OF/SF/AF cleared - .UCOMISD = {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}, reads_mem=true}, // OF/SF/AF cleared - .SHUFPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .SHUFPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .UNPCKLPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .UNPCKHPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .UNPCKLPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .UNPCKHPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .CVTPS2PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTPD2PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTSS2SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTSD2SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTPS2DQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTPD2DQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTDQ2PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTDQ2PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTSS2SI = {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, // destination is a GPR - .CVTSD2SI = {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, // destination is a GPR - .CVTSI2SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTSI2SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTTPS2DQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTTPD2DQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .CVTTSS2SI = {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, // destination is a GPR - .CVTTSD2SI = {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, // destination is a GPR - .PADDB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PADDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PADDD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PADDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSUBB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSUBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSUBD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSUBQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PADDSB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PADDSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PADDUSB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PADDUSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSUBSB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSUBSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSUBUSB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSUBUSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMULLW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMULHW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMULHUW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMULUDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMADDWD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PAND = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PANDN = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .POR = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PXOR = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSLLW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSLLD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSLLQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSRLW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSRLD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSRLQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSRAW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSRAD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PCMPEQB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PCMPEQW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PCMPEQD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PCMPGTB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PCMPGTW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PCMPGTD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PACKSSWB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PACKSSDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PACKUSWB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PUNPCKLBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PUNPCKLWD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PUNPCKLDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PUNPCKLQDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PUNPCKHBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PUNPCKHWD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PUNPCKHDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PUNPCKHQDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSHUFD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSHUFHW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSHUFLW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSHUFW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PEXTRW = {written={.OP0}, read={.OP1}, writes_mem=true}, // destination may be memory - .PINSRW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVMSKB = {written={.OP0}, read={.OP1}}, // destination is a GPR - .PAVGB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PAVGW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMAXUB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMAXSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMINUB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMINSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSADBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .MASKMOVDQU = {read={.OP0, .OP1}, implicit_rd={.RDI}, flags_rd={.DF}, writes_mem=true}, // byte-masked store to DS:[rDI] - .LFENCE = {side_effects={.FENCE, .SERIALIZING}}, // ordering/hint; no clobber - .SFENCE = {side_effects={.FENCE}}, // ordering/hint; no clobber - .MFENCE = {side_effects={.FENCE}}, // ordering/hint; no clobber - .PAUSE = {side_effects={.HINT}}, // ordering/hint; no clobber - .CLFLUSH = {read={.OP0}, reads_mem=true, side_effects={.CACHE}}, // flushes cache line for the addressed byte - .ADDSUBPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .ADDSUBPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .HADDPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .HADDPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .HSUBPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .HSUBPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .MOVDDUP = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .MOVSLDUP = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .MOVSHDUP = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .LDDQU = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSHUFB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PHADDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PHADDD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PHADDSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PHSUBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PHSUBD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PHSUBSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMADDUBSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMULHRSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSIGNB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSIGNW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PSIGND = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PABSB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PABSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PABSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PALIGNR = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .BLENDPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .BLENDPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .BLENDVPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .BLENDVPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PBLENDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PBLENDVB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .DPPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .DPPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .EXTRACTPS = {written={.OP0}, read={.OP1}, writes_mem=true}, // destination may be memory - .INSERTPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .MPSADBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PACKUSDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PEXTRB = {written={.OP0}, read={.OP1}, writes_mem=true}, // destination may be memory - .PEXTRD = {written={.OP0}, read={.OP1}, writes_mem=true}, // destination may be memory - .PEXTRQ = {written={.OP0}, read={.OP1}, writes_mem=true}, // destination may be memory - .PHMINPOSUW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PINSRB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PINSRD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PINSRQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMAXSB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMAXSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMAXUW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMAXUD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMINSB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMINSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMINUW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMINUD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVSXBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVSXBD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVSXBQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVSXWD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVSXWQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVSXDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVZXBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVZXBD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVZXBQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVZXWD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVZXWQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMOVZXDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMULDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PMULLD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PTEST = {read={.OP0, .OP1}, flags_wr={.ZF, .CF}, flags_undef={.OF, .SF, .AF, .PF}, reads_mem=true}, // ZF from AND, CF from ANDN; others cleared - .ROUNDPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .ROUNDPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .ROUNDSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .ROUNDSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .PCMPEQQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .CRC32 = {written={.OP0}, read={.OP0, .OP1}, reads_mem=true}, // accumulates CRC into OP0; no flags - .PCMPESTRI = {implicit_wr={.RCX}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .ZF, .SF, .OF, .AF, .PF}, reads_mem=true}, // ECX<-index; CF/ZF/SF/OF set, AF/PF cleared ; reads EAX/EDX lengths - .PCMPESTRM = {implicit_wr={.XMM0}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .ZF, .SF, .OF, .AF, .PF}, reads_mem=true}, // XMM0<-mask; CF/ZF/SF/OF set, AF/PF cleared ; reads EAX/EDX lengths - .PCMPISTRI = {implicit_wr={.RCX}, flags_wr={.CF, .ZF, .SF, .OF, .AF, .PF}, reads_mem=true}, // ECX<-index; CF/ZF/SF/OF set, AF/PF cleared - .PCMPISTRM = {implicit_wr={.XMM0}, flags_wr={.CF, .ZF, .SF, .OF, .AF, .PF}, reads_mem=true}, // XMM0<-mask; CF/ZF/SF/OF set, AF/PF cleared - .PCMPGTQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .PCLMULQDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .AESDEC = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .AESDECLAST = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .AESENC = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .AESENCLAST = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .AESIMC = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .AESKEYGENASSIST = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .SHA1MSG1 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .SHA1MSG2 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .SHA1NEXTE = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .SHA1RNDS4 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .SHA256MSG1 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .SHA256MSG2 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .SHA256RNDS2 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // 8.11 BMI/ADX Encodings + .ANDN = { + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + }, + .BEXTR = { + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .OF}, flags_undef={.PF, .AF, .SF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .OF}, flags_undef={.PF, .AF, .SF}, reads_mem=true}, + }, + .BLSI = { + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + }, + .BLSMSK = { + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + }, + .BLSR = { + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + }, + .BZHI = { + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + }, + .PDEP = { // no flags affected + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .PEXT = { // no flags affected + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .RORX = { // no flags affected + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .SARX = { // no flags affected (unlike SAR/SHL/SHR) + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .SHLX = { // no flags affected (unlike SAR/SHL/SHR) + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .SHRX = { // no flags affected (unlike SAR/SHL/SHR) + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .MULX = { // no flags affected; implicit multiplicand in rDX + {written={.OP0, .OP1}, read={.OP2}, implicit_rd={.RDX}, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP2}, implicit_rd={.RDX}, reads_mem=true}, + }, + .ADCX = { // only CF (chains with ADCX) + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_rd={.CF}, reads_mem=true}, + }, + .ADOX = { // only OF (chains with ADOX) + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.OF}, flags_rd={.OF}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.OF}, flags_rd={.OF}, reads_mem=true}, + }, - // ---- 8.13 AVX/AVX2 Encodings ---- - .VADDPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VADDPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VADDSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VADDSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSUBPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSUBPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSUBSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSUBSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMULPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMULPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMULSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMULSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VDIVPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VDIVPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VDIVSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VDIVSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSQRTPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSQRTPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSQRTSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSQRTSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRCPPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRCPSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRSQRTPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRSQRTSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMAXPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMAXPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMAXSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMAXSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMINPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMINPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMINSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VMINSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VANDPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VANDPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VANDNPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VANDNPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VORPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VORPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VXORPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VXORPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VCMPPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCMPPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCMPSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCMPSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCOMISS = {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}, reads_mem=true}, // OF/SF/AF cleared - .VCOMISD = {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}, reads_mem=true}, // OF/SF/AF cleared - .VUCOMISS = {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}, reads_mem=true}, // OF/SF/AF cleared - .VUCOMISD = {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}, reads_mem=true}, // OF/SF/AF cleared - .VSHUFPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VSHUFPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VUNPCKLPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VUNPCKHPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VUNPCKLPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VUNPCKHPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VBLENDPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VBLENDPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VBLENDVPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VBLENDVPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VDPPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VDPPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VROUNDPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VROUNDPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VROUNDSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VROUNDSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VEXTRACTPS = {written={.OP0}, read={.OP1}, writes_mem=true}, // destination may be memory - .VINSERTPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMOVAPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVUPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVAPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVUPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVDQA = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVDQU = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVLPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVHPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVLPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVHPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVLHPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMOVHLPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMOVMSKPS = {written={.OP0}, read={.OP1}}, // destination is a GPR - .VMOVMSKPD = {written={.OP0}, read={.OP1}}, // destination is a GPR - .VMOVNTPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVNTPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVNTDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMOVNTDQA = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VADDSUBPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VADDSUBPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VHADDPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VHADDPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VHSUBPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VHSUBPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VLDDQU = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMOVDDUP = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMOVSLDUP = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMOVSHDUP = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCMPESTRI = {implicit_wr={.RCX}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .ZF, .SF, .OF, .AF, .PF}, reads_mem=true}, // ECX<-index; CF/ZF/SF/OF set, AF/PF cleared ; reads EAX/EDX lengths - .VPCMPESTRM = {implicit_wr={.XMM0}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .ZF, .SF, .OF, .AF, .PF}, reads_mem=true}, // XMM0<-mask; CF/ZF/SF/OF set, AF/PF cleared ; reads EAX/EDX lengths - .VPCMPISTRI = {implicit_wr={.RCX}, flags_wr={.CF, .ZF, .SF, .OF, .AF, .PF}, reads_mem=true}, // ECX<-index; CF/ZF/SF/OF set, AF/PF cleared - .VPCMPISTRM = {implicit_wr={.XMM0}, flags_wr={.CF, .ZF, .SF, .OF, .AF, .PF}, reads_mem=true}, // XMM0<-mask; CF/ZF/SF/OF set, AF/PF cleared - .VPBROADCASTB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPBROADCASTW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPBROADCASTD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPBROADCASTQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VCVTPS2PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTPD2PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTSS2SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTSD2SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTPS2DQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTPD2DQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTDQ2PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTDQ2PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTSS2SI = {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, // destination is a GPR - .VCVTSD2SI = {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, // destination is a GPR - .VCVTSI2SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTSI2SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTTPS2DQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTTPD2DQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTTSS2SI = {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, // destination is a GPR - .VCVTTSD2SI = {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, // destination is a GPR - .VPADDB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPADDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPADDD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPADDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSUBB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSUBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSUBD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSUBQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMULLW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMULHW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMULHUW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMULUDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMADDWD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPAND = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPANDN = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPOR = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPXOR = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSLLW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSLLD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSLLQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSRLW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSRLD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSRLQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSRAW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSRAD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCMPEQB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCMPEQW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCMPEQD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCMPEQQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCMPGTB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCMPGTW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCMPGTD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCMPGTQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPACKSSWB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPACKSSDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPACKUSWB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPACKUSDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPUNPCKLBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPUNPCKLWD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPUNPCKLDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPUNPCKLQDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPUNPCKHBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPUNPCKHWD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPUNPCKHDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPUNPCKHQDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSHUFD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSHUFHW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSHUFLW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPEXTRB = {written={.OP0}, read={.OP1}, writes_mem=true}, // destination may be memory - .VPEXTRW = {written={.OP0}, read={.OP1}, writes_mem=true}, // destination may be memory - .VPEXTRD = {written={.OP0}, read={.OP1}, writes_mem=true}, // destination may be memory - .VPEXTRQ = {written={.OP0}, read={.OP1}, writes_mem=true}, // destination may be memory - .VPINSRB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPINSRW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPINSRD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPINSRQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVMSKB = {written={.OP0}, read={.OP1}}, // destination is a GPR - .VPTEST = {read={.OP0, .OP1}, flags_wr={.ZF, .CF}, flags_undef={.OF, .SF, .AF, .PF}, reads_mem=true}, // ZF from AND, CF from ANDN; others cleared - .VPSHUFB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPHADDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPHADDD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPHADDSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPHSUBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPHSUBD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPHSUBSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMADDUBSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMULHRSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSIGNB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSIGNW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSIGND = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPABSB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPABSW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPABSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPALIGNR = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPBLENDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPBLENDVB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMPSADBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPHMINPOSUW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMAXSB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMAXSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMAXUW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMAXUD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMINSB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMINSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMINUW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMINUD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSXBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSXBD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSXBQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSXWD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSXWQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSXDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVZXBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVZXBD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVZXBQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVZXWD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVZXWQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVZXDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMULDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMULLD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMASKMOVDQU = {read={.OP0, .OP1}, implicit_rd={.RDI}, flags_rd={.DF}, writes_mem=true}, // byte-masked store to DS:[rDI] - .VPCLMULQDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VAESDEC = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VAESDECLAST = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VAESENC = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VAESENCLAST = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VAESIMC = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VAESKEYGENASSIST = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VBROADCASTSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VBROADCASTSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VBROADCASTF128 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VEXTRACTF128 = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VINSERTF128 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERM2F128 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMASKMOVPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VMASKMOVPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VTESTPS = {read={.OP0, .OP1}, flags_wr={.ZF, .CF}, flags_undef={.OF, .SF, .AF, .PF}, reads_mem=true}, // ZF from AND, CF from ANDN; others cleared - .VTESTPD = {read={.OP0, .OP1}, flags_wr={.ZF, .CF}, flags_undef={.OF, .SF, .AF, .PF}, reads_mem=true}, // ZF from AND, CF from ANDN; others cleared - .VZEROALL = {implicit_wr={.VECTOR}}, // zeroes the entire vector register file (YMM/ZMM) - .VZEROUPPER = {implicit_wr={.VECTOR}}, // zeroes bits [MAXVL-1:128] of every vector register - .VBROADCASTI128 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VEXTRACTI128 = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VINSERTI128 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERM2I128 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPBLENDD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSLLVD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSLLVQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSRLVD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSRLVQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSRAVD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMASKMOVD = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VPMASKMOVQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, writes_mem=true, reads_mem=true}, - .VGATHERDPS = {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, // mask operand (OP2) is zeroed as elements are gathered - .VGATHERDPD = {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, // mask operand (OP2) is zeroed as elements are gathered - .VGATHERQPS = {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, // mask operand (OP2) is zeroed as elements are gathered - .VGATHERQPD = {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, // mask operand (OP2) is zeroed as elements are gathered - .VPGATHERDD = {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, // mask operand (OP2) is zeroed as elements are gathered - .VPGATHERDQ = {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, // mask operand (OP2) is zeroed as elements are gathered - .VPGATHERQD = {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, // mask operand (OP2) is zeroed as elements are gathered - .VPGATHERQQ = {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, // mask operand (OP2) is zeroed as elements are gathered + // 8.12 SSE Encodings + .MOVAPS = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVUPS = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVAPD = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVUPD = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVSS = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVDQA = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVDQU = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVQ = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .MOVD = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVLPS = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVHPS = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVLPD = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVHPD = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVLHPS = { + {written={.OP0}, read={.OP1}}, + }, + .MOVHLPS = { + {written={.OP0}, read={.OP1}}, + }, + .MOVMSKPS = { // destination is a GPR + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .MOVMSKPD = { // destination is a GPR + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .MOVNTPS = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVNTPD = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVNTDQ = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .MOVNTDQA = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .ADDPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .ADDPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .ADDSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .ADDSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .SUBPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .SUBPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .SUBSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .SUBSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MULPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MULPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MULSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MULSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .DIVPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .DIVPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .DIVSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .DIVSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .SQRTPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .SQRTPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .SQRTSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .SQRTSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .RCPPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .RCPSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .RSQRTPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .RSQRTSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MAXPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MAXPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MAXSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MAXSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MINPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MINPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MINSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MINSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .ANDPS = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .ANDPD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .ANDNPS = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .ANDNPD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .ORPS = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .ORPD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .XORPS = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .XORPD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .CMPPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CMPPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CMPSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .COMISS = { // OF/SF/AF cleared + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + }, + .COMISD = { // OF/SF/AF cleared + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + }, + .UCOMISS = { // OF/SF/AF cleared + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + }, + .UCOMISD = { // OF/SF/AF cleared + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + }, + .SHUFPS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .SHUFPD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .UNPCKLPS = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .UNPCKHPS = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .UNPCKLPD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .UNPCKHPD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .CVTPS2PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTPD2PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTSS2SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTSD2SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTPS2DQ = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTPD2DQ = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTDQ2PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTDQ2PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTSS2SI = { // destination is a GPR + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTSD2SI = { // destination is a GPR + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTSI2SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTSI2SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTTPS2DQ = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTTPD2DQ = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTTSS2SI = { // destination is a GPR + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .CVTTSD2SI = { // destination is a GPR + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .PADDB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PADDW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PADDD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PADDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSUBB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSUBW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSUBD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSUBQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PADDSB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PADDSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PADDUSB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PADDUSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSUBSB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSUBSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSUBUSB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSUBUSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMULLW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMULHW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMULHUW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMULUDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMADDWD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PAND = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PANDN = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .POR = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PXOR = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSLLW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + }, + .PSLLD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + }, + .PSLLQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + }, + .PSRLW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + }, + .PSRLD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + }, + .PSRLQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + }, + .PSRAW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + }, + .PSRAD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + }, + .PCMPEQB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PCMPEQW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PCMPEQD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PCMPGTB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PCMPGTW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PCMPGTD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PACKSSWB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PACKSSDW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PACKUSWB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PUNPCKLBW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PUNPCKLWD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PUNPCKLDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PUNPCKLQDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PUNPCKHBW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PUNPCKHWD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PUNPCKHDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PUNPCKHQDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSHUFD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .PSHUFHW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .PSHUFLW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .PSHUFW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .PEXTRW = { // destination may be memory + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .PINSRW = { + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .PMOVMSKB = { // destination is a GPR + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .PAVGB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PAVGW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMAXUB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMAXSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMINUB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMINSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSADBW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .MASKMOVDQU = { // byte-masked store to DS:[rDI] + {read={.OP0, .OP1}, implicit_rd={.RDI}, flags_rd={.DF}, writes_mem=true}, + }, + .LFENCE = { // ordering/hint; no clobber + {side_effects={.FENCE, .SERIALIZING}}, + }, + .SFENCE = { // ordering/hint; no clobber + {side_effects={.FENCE}}, + }, + .MFENCE = { // ordering/hint; no clobber + {side_effects={.FENCE}}, + }, + .PAUSE = { // ordering/hint; no clobber + {side_effects={.HINT}}, + }, + .CLFLUSH = { // flushes cache line for the addressed byte + {read={.OP0}, reads_mem=true, side_effects={.CACHE}}, + }, + .ADDSUBPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .ADDSUBPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .HADDPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .HADDPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .HSUBPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .HSUBPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .MOVDDUP = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .MOVSLDUP = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .MOVSHDUP = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .LDDQU = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSHUFB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PHADDW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PHADDD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PHADDSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PHSUBW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PHSUBD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PHSUBSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMADDUBSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMULHRSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSIGNB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSIGNW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PSIGND = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PABSB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PABSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PABSD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PALIGNR = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .BLENDPS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .BLENDPD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .BLENDVPS = { + {written={.OP0}, read={.OP1}, implicit_rd={.XMM0}, reads_mem=true}, + }, + .BLENDVPD = { + {written={.OP0}, read={.OP1}, implicit_rd={.XMM0}, reads_mem=true}, + }, + .PBLENDW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .PBLENDVB = { + {written={.OP0}, read={.OP1}, implicit_rd={.XMM0}, reads_mem=true}, + }, + .DPPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .DPPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .EXTRACTPS = { // destination may be memory + {written={.OP0}, read={.OP1}, writes_mem=true}, + }, + .INSERTPS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .MPSADBW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .PACKUSDW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PEXTRB = { // destination may be memory + {written={.OP0}, read={.OP1}, writes_mem=true}, + }, + .PEXTRD = { // destination may be memory + {written={.OP0}, read={.OP1}, writes_mem=true}, + }, + .PEXTRQ = { // destination may be memory + {written={.OP0}, read={.OP1}, writes_mem=true}, + }, + .PHMINPOSUW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PINSRB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .PINSRD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .PINSRQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .PMAXSB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMAXSD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMAXUW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMAXUD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMINSB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMINSD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMINUW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMINUD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVSXBW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVSXBD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVSXBQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVSXWD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVSXWQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVSXDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVZXBW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVZXBD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVZXBQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVZXWD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVZXWQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMOVZXDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMULDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PMULLD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PTEST = { // ZF from AND, CF from ANDN; others cleared + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + }, + .ROUNDPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .ROUNDPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .ROUNDSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .ROUNDSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .PCMPEQQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .CRC32 = { // accumulates CRC into OP0; no flags + {written={.OP0}, read={.OP0, .OP1}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, reads_mem=true}, + }, + .PCMPESTRI = { // ECX<-index; CF/ZF/SF/OF set, AF/PF cleared ; reads EAX/EDX lengths + {implicit_wr={.RCX}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, + .PCMPESTRM = { // XMM0<-mask; CF/ZF/SF/OF set, AF/PF cleared ; reads EAX/EDX lengths + {implicit_wr={.XMM0}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, + .PCMPISTRI = { // ECX<-index; CF/ZF/SF/OF set, AF/PF cleared + {implicit_wr={.RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, + .PCMPISTRM = { // XMM0<-mask; CF/ZF/SF/OF set, AF/PF cleared + {implicit_wr={.XMM0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, + .PCMPGTQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .PCLMULQDQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .AESDEC = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .AESDECLAST = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .AESENC = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .AESENCLAST = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .AESIMC = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .AESKEYGENASSIST = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .SHA1MSG1 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .SHA1MSG2 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .SHA1NEXTE = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .SHA1RNDS4 = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .SHA256MSG1 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .SHA256MSG2 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .SHA256RNDS2 = { + {written={.OP0}, read={.OP1}, implicit_rd={.XMM0}, reads_mem=true}, + }, - // ---- 8.14 FMA Encodings ---- - .VFMADD132PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADD213PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADD231PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADD132PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADD213PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADD231PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADD132SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADD213SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADD231SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADD132SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADD213SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADD231SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB132PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB213PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB231PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB132PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB213PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB231PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB132SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB213SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB231SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB132SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB213SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUB231SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD132PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD213PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD231PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD132PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD213PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD231PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD132SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD213SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD231SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD132SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD213SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMADD231SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB132PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB213PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB231PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB132PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB213PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB231PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB132SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB213SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB231SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB132SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB213SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFNMSUB231SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADDSUB132PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADDSUB213PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADDSUB231PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADDSUB132PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADDSUB213PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMADDSUB231PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUBADD132PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUBADD213PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUBADD231PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUBADD132PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUBADD213PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFMSUBADD231PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTPH2PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VCVTPS2PH = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, writes_mem=true, reads_mem=true}, // may set MXCSR exception/status bits + // 8.13 AVX/AVX2 Encodings + .VADDPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VADDPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VADDSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VADDSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSUBPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSUBPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSUBSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSUBSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMULPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMULPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMULSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMULSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VDIVPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VDIVPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VDIVSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VDIVSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSQRTPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSQRTPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSQRTSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSQRTSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRCPPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRCPSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRSQRTPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRSQRTSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMAXPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMAXPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMAXSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMAXSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMINPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMINPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMINSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VMINSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VANDPS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VANDPD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VANDNPS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VANDNPD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VORPS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VORPD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VXORPS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VXORPD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VCMPPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCMPPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCMPSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCMPSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCOMISS = { // OF/SF/AF cleared + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + }, + .VCOMISD = { // OF/SF/AF cleared + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + }, + .VUCOMISS = { // OF/SF/AF cleared + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + }, + .VUCOMISD = { // OF/SF/AF cleared + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + }, + .VSHUFPS = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VSHUFPD = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VUNPCKLPS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VUNPCKHPS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VUNPCKLPD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VUNPCKHPD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VBLENDPS = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VBLENDPD = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VBLENDVPS = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VBLENDVPD = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VDPPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VDPPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VROUNDPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VROUNDPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VROUNDSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VROUNDSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VEXTRACTPS = { // destination may be memory + {written={.OP0}, read={.OP1}, writes_mem=true}, + }, + .VINSERTPS = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VMOVAPS = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVUPS = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVAPD = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVUPD = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVSS = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VMOVSD = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VMOVDQA = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVDQU = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVQ = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VMOVD = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVLPS = { + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVHPS = { + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVLPD = { + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVHPD = { + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVLHPS = { + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VMOVHLPS = { + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VMOVMSKPS = { // destination is a GPR + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VMOVMSKPD = { // destination is a GPR + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VMOVNTPS = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVNTPD = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVNTDQ = { + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .VMOVNTDQA = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VADDSUBPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VADDSUBPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VHADDPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VHADDPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VHSUBPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VHSUBPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VLDDQU = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VMOVDDUP = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VMOVSLDUP = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VMOVSHDUP = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPCMPESTRI = { // ECX<-index; CF/ZF/SF/OF set, AF/PF cleared ; reads EAX/EDX lengths + {implicit_wr={.RCX}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, + .VPCMPESTRM = { // XMM0<-mask; CF/ZF/SF/OF set, AF/PF cleared ; reads EAX/EDX lengths + {implicit_wr={.XMM0}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, + .VPCMPISTRI = { // ECX<-index; CF/ZF/SF/OF set, AF/PF cleared + {implicit_wr={.RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, + .VPCMPISTRM = { // XMM0<-mask; CF/ZF/SF/OF set, AF/PF cleared + {implicit_wr={.XMM0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + }, + .VPBROADCASTB = { + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPBROADCASTW = { + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPBROADCASTD = { + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPBROADCASTQ = { + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VCVTPS2PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTPD2PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTSS2SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTSD2SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTPS2DQ = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTPD2DQ = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTDQ2PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTDQ2PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTSS2SI = { // destination is a GPR + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTSD2SI = { // destination is a GPR + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTSI2SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTSI2SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTTPS2DQ = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTTPD2DQ = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTTSS2SI = { // destination is a GPR + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTTSD2SI = { // destination is a GPR + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VPADDB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPADDW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPADDD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPADDQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSUBB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSUBW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSUBD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSUBQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMULLW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMULHW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMULHUW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMULUDQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMADDWD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPAND = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPANDN = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPOR = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPXOR = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSLLW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VPSLLD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VPSLLQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VPSRLW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VPSRLD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VPSRLQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VPSRAW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VPSRAD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + }, + .VPCMPEQB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPEQW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPEQD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPEQQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPGTB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPGTW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPGTD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPGTQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPACKSSWB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPACKSSDW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPACKUSWB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPACKUSDW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPUNPCKLBW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPUNPCKLWD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPUNPCKLDQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPUNPCKLQDQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPUNPCKHBW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPUNPCKHWD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPUNPCKHDQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPUNPCKHQDQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSHUFD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSHUFHW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSHUFLW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPEXTRB = { // destination may be memory + {written={.OP0}, read={.OP1}, writes_mem=true}, + }, + .VPEXTRW = { // destination may be memory + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, writes_mem=true}, + }, + .VPEXTRD = { // destination may be memory + {written={.OP0}, read={.OP1}, writes_mem=true}, + }, + .VPEXTRQ = { // destination may be memory + {written={.OP0}, read={.OP1}, writes_mem=true}, + }, + .VPINSRB = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPINSRW = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPINSRD = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPINSRQ = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPMOVMSKB = { // destination is a GPR + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VPTEST = { // ZF from AND, CF from ANDN; others cleared + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + }, + .VPSHUFB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPHADDW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPHADDD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPHADDSW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPHSUBW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPHSUBD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPHSUBSW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMADDUBSW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMULHRSW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSIGNB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSIGNW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSIGND = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPABSB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPABSW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPABSD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPALIGNR = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPBLENDW = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPBLENDVB = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VMPSADBW = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPHMINPOSUW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMAXSB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMAXSD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMAXUW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMAXUD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMINSB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMINSD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMINUW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMINUD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMOVSXBW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVSXBD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVSXBQ = { + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVSXWD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVSXWQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVSXDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVZXBW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVZXBD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVZXBQ = { + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVZXWD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVZXWQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVZXDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMULDQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMULLD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VMASKMOVDQU = { // byte-masked store to DS:[rDI] + {read={.OP0, .OP1}, implicit_rd={.RDI}, flags_rd={.DF}, writes_mem=true}, + }, + .VPCLMULQDQ = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VAESDEC = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VAESDECLAST = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VAESENC = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VAESENCLAST = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VAESIMC = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VAESKEYGENASSIST = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VBROADCASTSS = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VBROADCASTSD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + }, + .VBROADCASTF128 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VEXTRACTF128 = { + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + }, + .VINSERTF128 = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPERM2F128 = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VMASKMOVPS = { + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + }, + .VMASKMOVPD = { + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + }, + .VTESTPS = { // ZF from AND, CF from ANDN; others cleared + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + }, + .VTESTPD = { // ZF from AND, CF from ANDN; others cleared + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + }, + .VZEROALL = { // zeroes the entire vector register file (YMM/ZMM) + {implicit_wr={.VECTOR}}, + }, + .VZEROUPPER = { // zeroes bits [MAXVL-1:128] of every vector register + {implicit_wr={.VECTOR}}, + }, + .VBROADCASTI128 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VEXTRACTI128 = { + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + }, + .VINSERTI128 = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPERM2I128 = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPERMD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMPS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMPD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPBLENDD = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPSLLVD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSLLVQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSRLVD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSRLVQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSRAVD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMASKMOVD = { + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + }, + .VPMASKMOVQ = { + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + }, + .VGATHERDPS = { // mask operand (OP2) is zeroed as elements are gathered + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + }, + .VGATHERDPD = { // mask operand (OP2) is zeroed as elements are gathered + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + }, + .VGATHERQPS = { // mask operand (OP2) is zeroed as elements are gathered + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + }, + .VGATHERQPD = { // mask operand (OP2) is zeroed as elements are gathered + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + }, + .VPGATHERDD = { // mask operand (OP2) is zeroed as elements are gathered + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + }, + .VPGATHERDQ = { // mask operand (OP2) is zeroed as elements are gathered + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + }, + .VPGATHERQD = { // mask operand (OP2) is zeroed as elements are gathered + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + }, + .VPGATHERQQ = { // mask operand (OP2) is zeroed as elements are gathered + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + }, - // ---- 8.15 AVX-512 Encodings ---- - .VMOVDQA32 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMOVDQA64 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMOVDQU8 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMOVDQU16 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMOVDQU32 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VMOVDQU64 = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPBLENDMB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPBLENDMW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPBLENDMD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPBLENDMQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VBLENDMPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VBLENDMPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCMPB = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPCMPUB = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPCMPW = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPCMPUW = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPCMPD = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPCMPUD = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPCMPQ = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPCMPUQ = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPTESTMB = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPTESTMW = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPTESTMD = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPTESTMQ = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPTESTNMB = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPTESTNMW = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPTESTNMD = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPTESTNMQ = {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, // result written to an opmask register (k1), not EFLAGS - .VPCOMPRESSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCOMPRESSQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VCOMPRESSPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VCOMPRESSPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPEXPANDD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPEXPANDQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VEXPANDPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VEXPANDPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCONFLICTD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPCONFLICTQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPLZCNTD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPLZCNTQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMI2B = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMI2W = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMI2D = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMI2Q = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMI2PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMI2PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMT2B = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMT2W = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMT2D = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMT2Q = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMT2PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMT2PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPERMW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVB2M = {written={.OP0}, read={.OP1}}, // sign bits -> opmask register - .VPMOVW2M = {written={.OP0}, read={.OP1}}, // sign bits -> opmask register - .VPMOVD2M = {written={.OP0}, read={.OP1}}, // sign bits -> opmask register - .VPMOVQ2M = {written={.OP0}, read={.OP1}}, // sign bits -> opmask register - .VPMOVM2B = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVM2W = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVM2D = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVM2Q = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVQB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSQB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVUSQB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVQW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSQW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVUSQW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVQD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSQD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVUSQD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVDB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSDB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVUSDB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVUSDW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVWB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVSWB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMOVUSWB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPROLD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPROLQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPROLVD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPROLVQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPRORD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPRORQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPRORVD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPRORVQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSCATTERDD = {read={.OP0, .OP1}, writes_mem=true}, // opmask k1 is consumed and cleared per element - .VPSCATTERDQ = {read={.OP0, .OP1}, writes_mem=true}, // opmask k1 is consumed and cleared per element - .VPSCATTERQD = {read={.OP0, .OP1}, writes_mem=true}, // opmask k1 is consumed and cleared per element - .VPSCATTERQQ = {read={.OP0, .OP1}, writes_mem=true}, // opmask k1 is consumed and cleared per element - .VSCATTERDPS = {read={.OP0, .OP1}, writes_mem=true}, // opmask k1 is consumed and cleared per element - .VSCATTERDPD = {read={.OP0, .OP1}, writes_mem=true}, // opmask k1 is consumed and cleared per element - .VSCATTERQPS = {read={.OP0, .OP1}, writes_mem=true}, // opmask k1 is consumed and cleared per element - .VSCATTERQPD = {read={.OP0, .OP1}, writes_mem=true}, // opmask k1 is consumed and cleared per element - .VPSRAVQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSRAVW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSLLVW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPSRLVW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VRANGEPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRANGEPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRANGESS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRANGESD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VREDUCEPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VREDUCEPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VREDUCESS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VREDUCESD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRNDSCALEPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRNDSCALEPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRNDSCALESS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRNDSCALESD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRSQRT14PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRSQRT14PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRSQRT14SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRSQRT14SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRCP14PS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRCP14PD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRCP14SS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VRCP14SD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSCALEFPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSCALEFPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSCALEFSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VSCALEFSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VGETEXPPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VGETEXPPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VGETEXPSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VGETEXPSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VGETMANTPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VGETMANTPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VGETMANTSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VGETMANTSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFIXUPIMMPS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFIXUPIMMPD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFIXUPIMMSS = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFIXUPIMMSD = {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, // may set MXCSR exception/status bits - .VFPCLASSPS = {written={.OP0}, read={.OP1}, reads_mem=true}, // class predicate written to an opmask register - .VFPCLASSPD = {written={.OP0}, read={.OP1}, reads_mem=true}, // class predicate written to an opmask register - .VFPCLASSSS = {written={.OP0}, read={.OP1}, reads_mem=true}, // class predicate written to an opmask register - .VFPCLASSSD = {written={.OP0}, read={.OP1}, reads_mem=true}, // class predicate written to an opmask register - .VALIGNQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VALIGND = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VDBPSADBW = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPTERNLOGD = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPTERNLOGQ = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .VPMULTISHIFTQB = {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, - .KADDW = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KADDB = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KADDQ = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KADDD = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KANDW = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KANDB = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KANDQ = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KANDD = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KANDNW = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KANDNB = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KANDNQ = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KANDND = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KMOVW = {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, // opmask <-> GPR/mem/opmask - .KMOVB = {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, // opmask <-> GPR/mem/opmask - .KMOVQ = {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, // opmask <-> GPR/mem/opmask - .KMOVD = {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, // opmask <-> GPR/mem/opmask - .KNOTW = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KNOTB = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KNOTQ = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KNOTD = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KORW = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KORB = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KORQ = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KORD = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KORTESTW = {read={.OP0, .OP1}, flags_wr={.ZF, .CF, .PF, .SF, .OF, .AF}}, // sets ZF/CF from mask test - .KORTESTB = {read={.OP0, .OP1}, flags_wr={.ZF, .CF, .PF, .SF, .OF, .AF}}, // sets ZF/CF from mask test - .KORTESTQ = {read={.OP0, .OP1}, flags_wr={.ZF, .CF, .PF, .SF, .OF, .AF}}, // sets ZF/CF from mask test - .KORTESTD = {read={.OP0, .OP1}, flags_wr={.ZF, .CF, .PF, .SF, .OF, .AF}}, // sets ZF/CF from mask test - .KSHIFTLW = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KSHIFTLB = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KSHIFTLQ = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KSHIFTLD = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KSHIFTRW = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KSHIFTRB = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KSHIFTRQ = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KSHIFTRD = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KTESTW = {read={.OP0, .OP1}, flags_wr={.ZF, .CF, .PF, .SF, .OF, .AF}}, // sets ZF/CF from mask test - .KTESTB = {read={.OP0, .OP1}, flags_wr={.ZF, .CF, .PF, .SF, .OF, .AF}}, // sets ZF/CF from mask test - .KTESTQ = {read={.OP0, .OP1}, flags_wr={.ZF, .CF, .PF, .SF, .OF, .AF}}, // sets ZF/CF from mask test - .KTESTD = {read={.OP0, .OP1}, flags_wr={.ZF, .CF, .PF, .SF, .OF, .AF}}, // sets ZF/CF from mask test - .KUNPCKBW = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KUNPCKWD = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KUNPCKDQ = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KXNORW = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KXNORB = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KXNORQ = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KXNORD = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KXORW = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KXORB = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KXORQ = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation - .KXORD = {written={.OP0}, read={.OP1, .OP2}}, // opmask register operation + // 8.14 FMA Encodings + .VFMADD132PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADD213PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADD231PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADD132PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADD213PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADD231PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADD132SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADD213SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADD231SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADD132SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADD213SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADD231SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB132PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB213PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB231PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB132PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB213PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB231PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB132SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB213SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB231SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB132SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB213SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUB231SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD132PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD213PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD231PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD132PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD213PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD231PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD132SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD213SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD231SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD132SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD213SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMADD231SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB132PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB213PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB231PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB132PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB213PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB231PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB132SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB213SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB231SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB132SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB213SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFNMSUB231SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADDSUB132PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADDSUB213PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADDSUB231PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADDSUB132PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADDSUB213PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMADDSUB231PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUBADD132PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUBADD213PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUBADD231PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUBADD132PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUBADD213PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFMSUBADD231PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTPH2PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VCVTPS2PH = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, writes_mem=true, reads_mem=true}, + }, - // ---- 8.16 x87 FPU Encodings ---- - .FADD = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FADDP = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FIADD = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FSUB = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FSUBP = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FISUB = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FSUBR = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FSUBRP = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FISUBR = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FMUL = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FMULP = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FIMUL = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FDIV = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FDIVP = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FIDIV = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FDIVR = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FDIVRP = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FIDIVR = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FSQRT = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FABS = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FCHS = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FPREM = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FPREM1 = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FRNDINT = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FSCALE = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FXTRACT = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FXAM = {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, // sets x87 condition codes C0-C3 (status word), not EFLAGS - .FLD = {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, // push onto x87 stack - .FILD = {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, // push onto x87 stack - .FBLD = {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, // push onto x87 stack - .FST = {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, // store (FSTP/FISTP/FBSTP pop the stack) - .FSTP = {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, // store (FSTP/FISTP/FBSTP pop the stack) - .FIST = {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, // store (FSTP/FISTP/FBSTP pop the stack) - .FISTP = {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, // store (FSTP/FISTP/FBSTP pop the stack) - .FISTTP = {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, // store (FSTP/FISTP/FBSTP pop the stack) - .FBSTP = {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, // store (FSTP/FISTP/FBSTP pop the stack) - .FXCH = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FCMOVB = {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF}}, // conditional x87 move; reads EFLAGS - .FCMOVE = {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.ZF}}, // conditional x87 move; reads EFLAGS - .FCMOVBE = {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF, .ZF}}, // conditional x87 move; reads EFLAGS - .FCMOVU = {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.PF}}, // conditional x87 move; reads EFLAGS - .FCMOVNB = {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF}}, // conditional x87 move; reads EFLAGS - .FCMOVNE = {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.ZF}}, // conditional x87 move; reads EFLAGS - .FCMOVNBE = {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF, .ZF}}, // conditional x87 move; reads EFLAGS - .FCMOVNU = {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.PF}}, // conditional x87 move; reads EFLAGS - .FCOM = {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, // sets x87 condition codes C0-C3 (status word), not EFLAGS - .FCOMP = {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, // sets x87 condition codes C0-C3 (status word), not EFLAGS - .FCOMPP = {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, // sets x87 condition codes C0-C3 (status word), not EFLAGS - .FICOM = {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // sets x87 condition codes C0-C3 (status word), not EFLAGS - .FICOMP = {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // sets x87 condition codes C0-C3 (status word), not EFLAGS - .FCOMI = {implicit_rd={.FPU_ST}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}}, // compares ST(0):ST(i) into EFLAGS - .FCOMIP = {implicit_rd={.FPU_ST}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}}, // compares ST(0):ST(i) into EFLAGS - .FUCOMI = {implicit_rd={.FPU_ST}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}}, // compares ST(0):ST(i) into EFLAGS - .FUCOMIP = {implicit_rd={.FPU_ST}, flags_wr={.ZF, .PF, .CF}, flags_undef={.OF, .SF, .AF}}, // compares ST(0):ST(i) into EFLAGS - .FUCOM = {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, // sets x87 condition codes C0-C3 (status word), not EFLAGS - .FUCOMP = {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, // sets x87 condition codes C0-C3 (status word), not EFLAGS - .FUCOMPP = {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, // sets x87 condition codes C0-C3 (status word), not EFLAGS - .FTST = {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, // sets x87 condition codes C0-C3 (status word), not EFLAGS - .FLDZ = {implicit_wr={.FPU_ST, .FPU_SW}}, // push onto x87 stack - .FLD1 = {implicit_wr={.FPU_ST, .FPU_SW}}, // push onto x87 stack - .FLDPI = {implicit_wr={.FPU_ST, .FPU_SW}}, // push onto x87 stack - .FLDL2T = {implicit_wr={.FPU_ST, .FPU_SW}}, // push onto x87 stack - .FLDL2E = {implicit_wr={.FPU_ST, .FPU_SW}}, // push onto x87 stack - .FLDLG2 = {implicit_wr={.FPU_ST, .FPU_SW}}, // push onto x87 stack - .FLDLN2 = {implicit_wr={.FPU_ST, .FPU_SW}}, // push onto x87 stack - .FSIN = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FCOS = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FSINCOS = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FPTAN = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FPATAN = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .F2XM1 = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FYL2X = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FYL2XP1 = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FINIT = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FNINIT = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FINCSTP = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FDECSTP = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FFREE = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FFREEP = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FNOP = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FWAIT = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, // x87 arithmetic: updates ST(0) and status word C1 - .FCLEX = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FNCLEX = {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, // x87 arithmetic: updates ST(0) and status word C1 - .FSTCW = {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, // stores x87 (and SSE) state to memory - .FNSTCW = {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, // stores x87 (and SSE) state to memory - .FLDCW = {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, // loads x87 (and SSE) state from memory - .FSTENV = {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, // stores x87 (and SSE) state to memory - .FNSTENV = {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, // stores x87 (and SSE) state to memory - .FLDENV = {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, // loads x87 (and SSE) state from memory - .FSAVE = {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, // stores x87 (and SSE) state to memory - .FNSAVE = {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, // stores x87 (and SSE) state to memory - .FRSTOR = {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, // loads x87 (and SSE) state from memory - .FSTSW = {implicit_wr={.RAX, .FPU_SW}, writes_mem=true}, // AX form writes AX; m2byte form writes memory - .FNSTSW = {implicit_wr={.RAX, .FPU_SW}, writes_mem=true}, // AX form writes AX; m2byte form writes memory - .FXSAVE = {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, // stores x87 (and SSE) state to memory - .FXSAVE64 = {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, // stores x87 (and SSE) state to memory - .FXRSTOR = {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, // loads x87 (and SSE) state from memory - .FXRSTOR64 = {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, // loads x87 (and SSE) state from memory + // 8.15 AVX-512 Encodings + .VMOVDQA32 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VMOVDQA64 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VMOVDQU8 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VMOVDQU16 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VMOVDQU32 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VMOVDQU64 = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPBLENDMB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPBLENDMW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPBLENDMD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPBLENDMQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VBLENDMPS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VBLENDMPD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPB = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPUB = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPW = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPUW = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPD = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPUD = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPQ = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCMPUQ = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPTESTMB = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPTESTMW = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPTESTMD = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPTESTMQ = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPTESTNMB = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPTESTNMW = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPTESTNMD = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPTESTNMQ = { // result written to an opmask register (k1), not EFLAGS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPCOMPRESSD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPCOMPRESSQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VCOMPRESSPS = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VCOMPRESSPD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPEXPANDD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPEXPANDQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VEXPANDPS = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VEXPANDPD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPCONFLICTD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPCONFLICTQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPLZCNTD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPLZCNTQ = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPERMI2B = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMI2W = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMI2D = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMI2Q = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMI2PS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMI2PD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMT2B = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMT2W = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMT2D = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMT2Q = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMT2PS = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMT2PD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPERMW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPMOVB2M = { // sign bits -> opmask register + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VPMOVW2M = { // sign bits -> opmask register + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VPMOVD2M = { // sign bits -> opmask register + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VPMOVQ2M = { // sign bits -> opmask register + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VPMOVM2B = { + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VPMOVM2W = { + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VPMOVM2D = { + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VPMOVM2Q = { + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .VPMOVQB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVSQB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVUSQB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVQW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVSQW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVUSQW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVQD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVSQD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVUSQD = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVDB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVSDB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVUSDB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVDW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVSDW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVUSDW = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVWB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVSWB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPMOVUSWB = { + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VPROLD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPROLQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPROLVD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPROLVQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPRORD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPRORQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPRORVD = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPRORVQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSCATTERDD = { // opmask k1 is consumed and cleared per element + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + }, + .VPSCATTERDQ = { // opmask k1 is consumed and cleared per element + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + }, + .VPSCATTERQD = { // opmask k1 is consumed and cleared per element + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + }, + .VPSCATTERQQ = { // opmask k1 is consumed and cleared per element + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + }, + .VSCATTERDPS = { // opmask k1 is consumed and cleared per element + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + }, + .VSCATTERDPD = { // opmask k1 is consumed and cleared per element + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + }, + .VSCATTERQPS = { // opmask k1 is consumed and cleared per element + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + }, + .VSCATTERQPD = { // opmask k1 is consumed and cleared per element + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + }, + .VPSRAVQ = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSRAVW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSLLVW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VPSRLVW = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .VRANGEPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRANGEPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRANGESS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRANGESD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VREDUCEPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VREDUCEPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VREDUCESS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VREDUCESD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRNDSCALEPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRNDSCALEPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRNDSCALESS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRNDSCALESD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRSQRT14PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRSQRT14PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRSQRT14SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRSQRT14SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRCP14PS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRCP14PD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRCP14SS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VRCP14SD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSCALEFPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSCALEFPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSCALEFSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VSCALEFSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VGETEXPPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VGETEXPPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VGETEXPSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VGETEXPSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VGETMANTPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VGETMANTPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VGETMANTSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VGETMANTSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFIXUPIMMPS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFIXUPIMMPD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFIXUPIMMSS = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFIXUPIMMSD = { // may set MXCSR exception/status bits + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + }, + .VFPCLASSPS = { // class predicate written to an opmask register + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VFPCLASSPD = { // class predicate written to an opmask register + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VFPCLASSSS = { // class predicate written to an opmask register + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VFPCLASSSD = { // class predicate written to an opmask register + {written={.OP0}, read={.OP1}, reads_mem=true}, + }, + .VALIGNQ = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VALIGND = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VDBPSADBW = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPTERNLOGD = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPTERNLOGQ = { + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + }, + .VPMULTISHIFTQB = { + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + }, + .KADDW = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KADDB = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KADDQ = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KADDD = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KANDW = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KANDB = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KANDQ = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KANDD = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KANDNW = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KANDNB = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KANDNQ = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KANDND = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KMOVW = { // opmask <-> GPR/mem/opmask + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .KMOVB = { // opmask <-> GPR/mem/opmask + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .KMOVQ = { // opmask <-> GPR/mem/opmask + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .KMOVD = { // opmask <-> GPR/mem/opmask + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + }, + .KNOTW = { // opmask register operation + {written={.OP0}, read={.OP1}}, + }, + .KNOTB = { // opmask register operation + {written={.OP0}, read={.OP1}}, + }, + .KNOTQ = { // opmask register operation + {written={.OP0}, read={.OP1}}, + }, + .KNOTD = { // opmask register operation + {written={.OP0}, read={.OP1}}, + }, + .KORW = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KORB = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KORQ = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KORD = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KORTESTW = { // sets ZF/CF from mask test + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + }, + .KORTESTB = { // sets ZF/CF from mask test + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + }, + .KORTESTQ = { // sets ZF/CF from mask test + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + }, + .KORTESTD = { // sets ZF/CF from mask test + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + }, + .KSHIFTLW = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KSHIFTLB = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KSHIFTLQ = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KSHIFTLD = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KSHIFTRW = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KSHIFTRB = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KSHIFTRQ = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KSHIFTRD = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KTESTW = { // sets ZF/CF from mask test + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + }, + .KTESTB = { // sets ZF/CF from mask test + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + }, + .KTESTQ = { // sets ZF/CF from mask test + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + }, + .KTESTD = { // sets ZF/CF from mask test + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + }, + .KUNPCKBW = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KUNPCKWD = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KUNPCKDQ = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KXNORW = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KXNORB = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KXNORQ = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KXNORD = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KXORW = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KXORB = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KXORQ = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, + .KXORD = { // opmask register operation + {written={.OP0}, read={.OP1, .OP2}}, + }, - // ---- 8.17 System Instruction Encodings ---- - .LGDT = {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, // privileged load - .SGDT = {written={.OP0}, writes_mem=true}, // stores descriptor/register to r/m (privileged for some) - .LIDT = {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, // privileged load - .SIDT = {written={.OP0}, writes_mem=true}, // stores descriptor/register to r/m (privileged for some) - .LLDT = {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, // privileged load - .SLDT = {written={.OP0}, writes_mem=true}, // stores descriptor/register to r/m (privileged for some) - .LTR = {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, // privileged load - .STR = {written={.OP0}, writes_mem=true}, // stores descriptor/register to r/m (privileged for some) - .LMSW = {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, // privileged load - .SMSW = {written={.OP0}, writes_mem=true}, // stores descriptor/register to r/m (privileged for some) - .CLTS = {side_effects={.PRIVILEGED}}, // privileged; no GPR/EFLAGS clobber modeled - .ARPL = {written={.OP0}, read={.OP1}, flags_wr={.ZF}, writes_mem=true, reads_mem=true}, // legacy; adjusts RPL, sets ZF - .LAR = {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, // ZF=1 on success; OP0 undefined on failure - .LSL = {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, // ZF=1 on success; OP0 undefined on failure - .VERR = {read={.OP0}, flags_wr={.ZF}, reads_mem=true}, // ZF=1 if segment is readable/writable - .VERW = {read={.OP0}, flags_wr={.ZF}, reads_mem=true}, // ZF=1 if segment is readable/writable - .INVD = {side_effects={.SERIALIZING, .PRIVILEGED}}, // privileged; no GPR/EFLAGS clobber modeled - .WBINVD = {side_effects={.SERIALIZING, .PRIVILEGED}}, // privileged; no GPR/EFLAGS clobber modeled - .INVLPG = {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, // privileged; no GPR/EFLAGS clobber modeled - .INVPCID = {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, // VMX/INVx status reported in ZF/CF - .RSM = {side_effects={.SERIALIZING, .PRIVILEGED}}, // privileged; no GPR/EFLAGS clobber modeled - .RDMSR = {implicit_wr={.RAX, .RDX}, implicit_rd={.RCX}, side_effects={.PRIVILEGED}}, // privileged; EDX:EAX <- MSR[ECX] - .WRMSR = {implicit_rd={.RAX, .RCX, .RDX}, side_effects={.SERIALIZING, .PRIVILEGED}}, // privileged; MSR[ECX] <- EDX:EAX - .VMCALL = {side_effects={.PRIVILEGED}}, // privileged; no GPR/EFLAGS clobber modeled - .VMLAUNCH = {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, // VMX/INVx status reported in ZF/CF - .VMRESUME = {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, // VMX/INVx status reported in ZF/CF - .VMXOFF = {side_effects={.PRIVILEGED}}, // privileged; no GPR/EFLAGS clobber modeled - .VMXON = {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, // VMX/INVx status reported in ZF/CF - .VMCLEAR = {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, // VMX/INVx status reported in ZF/CF - .VMPTRLD = {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, // VMX/INVx status reported in ZF/CF - .VMPTRST = {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, // VMX/INVx status reported in ZF/CF - .VMREAD = {written={.OP0}, read={.OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true, side_effects={.PRIVILEGED}}, // VMX status in ZF/CF - .VMWRITE = {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, // VMX status in ZF/CF - .VMFUNC = {side_effects={.PRIVILEGED}}, // privileged; no GPR/EFLAGS clobber modeled - .INVEPT = {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, // VMX/INVx status reported in ZF/CF - .INVVPID = {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, // VMX/INVx status reported in ZF/CF + // 8.16 x87 FPU Encodings + .FADD = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FADDP = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FIADD = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + }, + .FSUB = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FSUBP = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FISUB = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + }, + .FSUBR = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FSUBRP = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FISUBR = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + }, + .FMUL = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FMULP = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FIMUL = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + }, + .FDIV = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FDIVP = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FIDIV = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + }, + .FDIVR = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FDIVRP = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FIDIVR = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + }, + .FSQRT = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FABS = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FCHS = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FPREM = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FPREM1 = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FRNDINT = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FSCALE = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FXTRACT = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FXAM = { // sets x87 condition codes C0-C3 (status word), not EFLAGS + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FLD = { // push onto x87 stack + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}}, + }, + .FILD = { // push onto x87 stack + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + }, + .FBLD = { // push onto x87 stack + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + }, + .FST = { // store (FSTP/FISTP/FBSTP pop the stack) + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}}, + }, + .FSTP = { // store (FSTP/FISTP/FBSTP pop the stack) + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}}, + }, + .FIST = { // store (FSTP/FISTP/FBSTP pop the stack) + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FISTP = { // store (FSTP/FISTP/FBSTP pop the stack) + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FISTTP = { // store (FSTP/FISTP/FBSTP pop the stack) + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FBSTP = { // store (FSTP/FISTP/FBSTP pop the stack) + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FXCH = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FCMOVB = { // conditional x87 move; reads EFLAGS + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF}}, + }, + .FCMOVE = { // conditional x87 move; reads EFLAGS + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.ZF}}, + }, + .FCMOVBE = { // conditional x87 move; reads EFLAGS + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF, .ZF}}, + }, + .FCMOVU = { // conditional x87 move; reads EFLAGS + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.PF}}, + }, + .FCMOVNB = { // conditional x87 move; reads EFLAGS + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF}}, + }, + .FCMOVNE = { // conditional x87 move; reads EFLAGS + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.ZF}}, + }, + .FCMOVNBE = { // conditional x87 move; reads EFLAGS + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF, .ZF}}, + }, + .FCMOVNU = { // conditional x87 move; reads EFLAGS + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.PF}}, + }, + .FCOM = { // sets x87 condition codes C0-C3 (status word), not EFLAGS + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FCOMP = { // sets x87 condition codes C0-C3 (status word), not EFLAGS + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FCOMPP = { // sets x87 condition codes C0-C3 (status word), not EFLAGS + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FICOM = { // sets x87 condition codes C0-C3 (status word), not EFLAGS + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + }, + .FICOMP = { // sets x87 condition codes C0-C3 (status word), not EFLAGS + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + }, + .FCOMI = { // compares ST(0):ST(i) into EFLAGS + {implicit_rd={.FPU_ST}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}}, + }, + .FCOMIP = { // compares ST(0):ST(i) into EFLAGS + {implicit_rd={.FPU_ST}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}}, + }, + .FUCOMI = { // compares ST(0):ST(i) into EFLAGS + {implicit_rd={.FPU_ST}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}}, + }, + .FUCOMIP = { // compares ST(0):ST(i) into EFLAGS + {implicit_rd={.FPU_ST}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}}, + }, + .FUCOM = { // sets x87 condition codes C0-C3 (status word), not EFLAGS + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FUCOMP = { // sets x87 condition codes C0-C3 (status word), not EFLAGS + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FUCOMPP = { // sets x87 condition codes C0-C3 (status word), not EFLAGS + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FTST = { // sets x87 condition codes C0-C3 (status word), not EFLAGS + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FLDZ = { // push onto x87 stack + {implicit_wr={.FPU_ST, .FPU_SW}}, + }, + .FLD1 = { // push onto x87 stack + {implicit_wr={.FPU_ST, .FPU_SW}}, + }, + .FLDPI = { // push onto x87 stack + {implicit_wr={.FPU_ST, .FPU_SW}}, + }, + .FLDL2T = { // push onto x87 stack + {implicit_wr={.FPU_ST, .FPU_SW}}, + }, + .FLDL2E = { // push onto x87 stack + {implicit_wr={.FPU_ST, .FPU_SW}}, + }, + .FLDLG2 = { // push onto x87 stack + {implicit_wr={.FPU_ST, .FPU_SW}}, + }, + .FLDLN2 = { // push onto x87 stack + {implicit_wr={.FPU_ST, .FPU_SW}}, + }, + .FSIN = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FCOS = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FSINCOS = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FPTAN = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FPATAN = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .F2XM1 = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FYL2X = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FYL2XP1 = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FINIT = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FNINIT = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FINCSTP = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FDECSTP = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FFREE = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FFREEP = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FNOP = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FWAIT = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FCLEX = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FNCLEX = { // x87 arithmetic: updates ST(0) and status word C1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + }, + .FSTCW = { // stores x87 (and SSE) state to memory + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FNSTCW = { // stores x87 (and SSE) state to memory + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FLDCW = { // loads x87 (and SSE) state from memory + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + }, + .FSTENV = { // stores x87 (and SSE) state to memory + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FNSTENV = { // stores x87 (and SSE) state to memory + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FLDENV = { // loads x87 (and SSE) state from memory + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + }, + .FSAVE = { // stores x87 (and SSE) state to memory + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FNSAVE = { // stores x87 (and SSE) state to memory + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FRSTOR = { // loads x87 (and SSE) state from memory + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + }, + .FSTSW = { // AX form writes AX; m2byte form writes memory + {implicit_wr={.RAX, .FPU_SW}, writes_mem=true}, + {implicit_wr={.RAX, .FPU_SW}}, + }, + .FNSTSW = { // AX form writes AX; m2byte form writes memory + {implicit_wr={.RAX, .FPU_SW}, writes_mem=true}, + {implicit_wr={.RAX, .FPU_SW}}, + }, + .FXSAVE = { // stores x87 (and SSE) state to memory + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FXSAVE64 = { // stores x87 (and SSE) state to memory + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + }, + .FXRSTOR = { // loads x87 (and SSE) state from memory + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + }, + .FXRSTOR64 = { // loads x87 (and SSE) state from memory + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + }, - // ---- 8.18 Security and Memory Protection Encodings ---- - .ENCLS = {side_effects={.PRIVILEGED}}, // SGX enclave leaf; behaviour selected by EAX - .ENCLU = {side_effects={.PRIVILEGED}}, // SGX enclave leaf; behaviour selected by EAX - .ENCLV = {side_effects={.PRIVILEGED}}, // SGX enclave leaf; behaviour selected by EAX - .RDPKRU = {implicit_wr={.RAX}, implicit_rd={.RCX}}, // EAX <- PKRU (EDX cleared); reads ECX - .WRPKRU = {implicit_rd={.RAX, .RCX, .RDX}}, // PKRU <- EAX; ECX/EDX must be 0 - .INCSSPD = {read={.OP0}, writes_mem=true, side_effects={.CET}}, // advances SSP - .INCSSPQ = {read={.OP0}, writes_mem=true, side_effects={.CET}}, // advances SSP - .RDSSPD = {written={.OP0}, side_effects={.CET}}, // reads shadow-stack pointer into OP0 - .RDSSPQ = {written={.OP0}, side_effects={.CET}}, // reads shadow-stack pointer into OP0 - .SAVEPREVSSP = {side_effects={.CET}}, // CET shadow-stack management - .RSTORSSP = {side_effects={.CET}}, // CET shadow-stack management - .WRSSD = {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, // writes to shadow stack - .WRSSQ = {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, // writes to shadow stack - .WRUSSD = {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, // writes to shadow stack - .WRUSSQ = {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, // writes to shadow stack - .SETSSBSY = {side_effects={.CET}}, // CET shadow-stack management - .CLRSSBSY = {side_effects={.CET}}, // CET shadow-stack management - .ENDBR64 = {side_effects={.HINT, .CET}}, // CET landing pad; NOP-like - .ENDBR32 = {side_effects={.HINT, .CET}}, // CET landing pad; NOP-like + // 8.17 System Instruction Encodings + .LGDT = { // privileged load + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + }, + .SGDT = { // stores descriptor/register to r/m (privileged for some) + {written={.OP0}, writes_mem=true}, + {written={.OP0}, writes_mem=true}, + }, + .LIDT = { // privileged load + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + }, + .SIDT = { // stores descriptor/register to r/m (privileged for some) + {written={.OP0}, writes_mem=true}, + {written={.OP0}, writes_mem=true}, + }, + .LLDT = { // privileged load + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + }, + .SLDT = { // stores descriptor/register to r/m (privileged for some) + {written={.OP0}, writes_mem=true}, + {written={.OP0}}, + {written={.OP0}}, + }, + .LTR = { // privileged load + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + }, + .STR = { // stores descriptor/register to r/m (privileged for some) + {written={.OP0}, writes_mem=true}, + {written={.OP0}}, + {written={.OP0}}, + }, + .LMSW = { // privileged load + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + }, + .SMSW = { // stores descriptor/register to r/m (privileged for some) + {written={.OP0}, writes_mem=true}, + {written={.OP0}}, + {written={.OP0}}, + }, + .CLTS = { // privileged; no GPR/EFLAGS clobber modeled + {side_effects={.PRIVILEGED}}, + }, + .ARPL = { // legacy; adjusts RPL, sets ZF + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, writes_mem=true, reads_mem=true}, + }, + .LAR = { // ZF=1 on success; OP0 undefined on failure + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + }, + .LSL = { // ZF=1 on success; OP0 undefined on failure + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + }, + .VERR = { // ZF=1 if segment is readable/writable + {read={.OP0}, flags_wr={.ZF}, reads_mem=true}, + }, + .VERW = { // ZF=1 if segment is readable/writable + {read={.OP0}, flags_wr={.ZF}, reads_mem=true}, + }, + .INVD = { // privileged; no GPR/EFLAGS clobber modeled + {side_effects={.SERIALIZING, .PRIVILEGED}}, + }, + .WBINVD = { // privileged; no GPR/EFLAGS clobber modeled + {side_effects={.SERIALIZING, .PRIVILEGED}}, + }, + .INVLPG = { // privileged; no GPR/EFLAGS clobber modeled + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + }, + .INVPCID = { // VMX/INVx status reported in ZF/CF + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, + .RSM = { // privileged; no GPR/EFLAGS clobber modeled + {side_effects={.SERIALIZING, .PRIVILEGED}}, + }, + .RDMSR = { // privileged; EDX:EAX <- MSR[ECX] + {implicit_wr={.RAX, .RDX}, implicit_rd={.RCX}, side_effects={.PRIVILEGED}}, + }, + .WRMSR = { // privileged; MSR[ECX] <- EDX:EAX + {implicit_rd={.RAX, .RCX, .RDX}, side_effects={.SERIALIZING, .PRIVILEGED}}, + }, + .VMCALL = { // privileged; no GPR/EFLAGS clobber modeled + {side_effects={.PRIVILEGED}}, + }, + .VMLAUNCH = { // VMX/INVx status reported in ZF/CF + {flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, + .VMRESUME = { // VMX/INVx status reported in ZF/CF + {flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, + .VMXOFF = { // privileged; no GPR/EFLAGS clobber modeled + {side_effects={.PRIVILEGED}}, + }, + .VMXON = { // VMX/INVx status reported in ZF/CF + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, + .VMCLEAR = { // VMX/INVx status reported in ZF/CF + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, + .VMPTRLD = { // VMX/INVx status reported in ZF/CF + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, + .VMPTRST = { // VMX/INVx status reported in ZF/CF + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, + .VMREAD = { // VMX status in ZF/CF + {written={.OP0}, read={.OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true, side_effects={.PRIVILEGED}}, + }, + .VMWRITE = { // VMX status in ZF/CF + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, + .VMFUNC = { // privileged; no GPR/EFLAGS clobber modeled + {side_effects={.PRIVILEGED}}, + }, + .INVEPT = { // VMX/INVx status reported in ZF/CF + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, + .INVVPID = { // VMX/INVx status reported in ZF/CF + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, - // ---- 8.19 XSAVE/XRSTOR State Management Encodings ---- - .XSAVE = {implicit_rd={.RAX, .RDX}, writes_mem=true}, // saves state components selected by EDX:EAX - .XSAVE64 = {implicit_rd={.RAX, .RDX}, writes_mem=true}, // saves state components selected by EDX:EAX - .XRSTOR = {implicit_wr={.FPU_ST, .FPU_SW, .MXCSR}, implicit_rd={.RAX, .RDX}, reads_mem=true}, // restores state components selected by EDX:EAX - .XRSTOR64 = {implicit_wr={.FPU_ST, .FPU_SW, .MXCSR}, implicit_rd={.RAX, .RDX}, reads_mem=true}, // restores state components selected by EDX:EAX - .XSAVEOPT = {implicit_rd={.RAX, .RDX}, writes_mem=true}, // saves state components selected by EDX:EAX - .XSAVEOPT64 = {implicit_rd={.RAX, .RDX}, writes_mem=true}, // saves state components selected by EDX:EAX - .XSAVEC = {implicit_rd={.RAX, .RDX}, writes_mem=true}, // saves state components selected by EDX:EAX - .XSAVEC64 = {implicit_rd={.RAX, .RDX}, writes_mem=true}, // saves state components selected by EDX:EAX - .XSAVES = {implicit_rd={.RAX, .RDX}, writes_mem=true, side_effects={.PRIVILEGED}}, // saves state components selected by EDX:EAX - .XSAVES64 = {implicit_rd={.RAX, .RDX}, writes_mem=true, side_effects={.PRIVILEGED}}, // saves state components selected by EDX:EAX - .XRSTORS = {implicit_wr={.FPU_ST, .FPU_SW, .MXCSR}, implicit_rd={.RAX, .RDX}, reads_mem=true, side_effects={.PRIVILEGED}}, // restores state components selected by EDX:EAX - .XRSTORS64 = {implicit_wr={.FPU_ST, .FPU_SW, .MXCSR}, implicit_rd={.RAX, .RDX}, reads_mem=true, side_effects={.PRIVILEGED}}, // restores state components selected by EDX:EAX + // 8.18 Security and Memory Protection Encodings + .ENCLS = { // SGX enclave leaf; behaviour selected by EAX + {side_effects={.PRIVILEGED}}, + }, + .ENCLU = { // SGX enclave leaf; behaviour selected by EAX + {side_effects={.PRIVILEGED}}, + }, + .ENCLV = { // SGX enclave leaf; behaviour selected by EAX + {side_effects={.PRIVILEGED}}, + }, + .RDPKRU = { // EAX <- PKRU (EDX cleared); reads ECX + {implicit_wr={.RAX}, implicit_rd={.RCX}}, + }, + .WRPKRU = { // PKRU <- EAX; ECX/EDX must be 0 + {implicit_rd={.RAX, .RCX, .RDX}}, + }, + .INCSSPD = { // advances SSP + {read={.OP0}, side_effects={.CET}}, + }, + .INCSSPQ = { // advances SSP + {read={.OP0}, side_effects={.CET}}, + }, + .RDSSPD = { // reads shadow-stack pointer into OP0 + {written={.OP0}, side_effects={.CET}}, + }, + .RDSSPQ = { // reads shadow-stack pointer into OP0 + {written={.OP0}, side_effects={.CET}}, + }, + .SAVEPREVSSP = { // CET shadow-stack management + {side_effects={.CET}}, + }, + .RSTORSSP = { // CET shadow-stack management + {side_effects={.CET}}, + }, + .WRSSD = { // writes to shadow stack + {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, + }, + .WRSSQ = { // writes to shadow stack + {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, + }, + .WRUSSD = { // writes to shadow stack + {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, + }, + .WRUSSQ = { // writes to shadow stack + {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, + }, + .SETSSBSY = { // CET shadow-stack management + {side_effects={.CET}}, + }, + .CLRSSBSY = { // CET shadow-stack management + {side_effects={.CET}}, + }, + .ENDBR64 = { // CET landing pad; NOP-like + {side_effects={.HINT, .CET}}, + }, + .ENDBR32 = { // CET landing pad; NOP-like + {side_effects={.HINT, .CET}}, + }, - // ---- 8.20 Cache and Prefetch Encodings ---- - .PREFETCHT0 = {read={.OP0}, reads_mem=true, side_effects={.HINT}}, // cache hint/maintenance; no register or flag clobber - .PREFETCHT1 = {read={.OP0}, reads_mem=true, side_effects={.HINT}}, // cache hint/maintenance; no register or flag clobber - .PREFETCHT2 = {read={.OP0}, reads_mem=true, side_effects={.HINT}}, // cache hint/maintenance; no register or flag clobber - .PREFETCHNTA = {read={.OP0}, reads_mem=true, side_effects={.HINT}}, // cache hint/maintenance; no register or flag clobber - .PREFETCHW = {read={.OP0}, reads_mem=true, side_effects={.HINT}}, // cache hint/maintenance; no register or flag clobber - .CLFLUSHOPT = {read={.OP0}, reads_mem=true, side_effects={.CACHE}}, // cache hint/maintenance; no register or flag clobber - .CLWB = {read={.OP0}, reads_mem=true, side_effects={.CACHE}}, // cache hint/maintenance; no register or flag clobber - .CLDEMOTE = {read={.OP0}, reads_mem=true, side_effects={.HINT}}, // cache hint/maintenance; no register or flag clobber + // 8.19 XSAVE/XRSTOR State Management Encodings + .XSAVE = { // saves state components selected by EDX:EAX + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + }, + .XSAVE64 = { // saves state components selected by EDX:EAX + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + }, + .XRSTOR = { // restores state components selected by EDX:EAX + {implicit_wr={.MXCSR, .FPU_ST, .FPU_SW}, implicit_rd={.RAX, .RDX}, reads_mem=true}, + }, + .XRSTOR64 = { // restores state components selected by EDX:EAX + {implicit_wr={.MXCSR, .FPU_ST, .FPU_SW}, implicit_rd={.RAX, .RDX}, reads_mem=true}, + }, + .XSAVEOPT = { // saves state components selected by EDX:EAX + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + }, + .XSAVEOPT64 = { // saves state components selected by EDX:EAX + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + }, + .XSAVEC = { // saves state components selected by EDX:EAX + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + }, + .XSAVEC64 = { // saves state components selected by EDX:EAX + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + }, + .XSAVES = { // saves state components selected by EDX:EAX + {implicit_rd={.RAX, .RDX}, writes_mem=true, side_effects={.PRIVILEGED}}, + }, + .XSAVES64 = { // saves state components selected by EDX:EAX + {implicit_rd={.RAX, .RDX}, writes_mem=true, side_effects={.PRIVILEGED}}, + }, + .XRSTORS = { // restores state components selected by EDX:EAX + {implicit_wr={.MXCSR, .FPU_ST, .FPU_SW}, implicit_rd={.RAX, .RDX}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, + .XRSTORS64 = { // restores state components selected by EDX:EAX + {implicit_wr={.MXCSR, .FPU_ST, .FPU_SW}, implicit_rd={.RAX, .RDX}, reads_mem=true, side_effects={.PRIVILEGED}}, + }, - // ---- 8.21 Atomic and Byte Swap Encodings ---- - .BSWAP = {written={.OP0}, read={.OP0}}, - .CMPXCHG = {written={.OP0}, read={.OP0, .OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, // ZF set on match; on mismatch RAX <- dest - .CMPXCHG8B = {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX, .RBX, .RCX}, flags_wr={.ZF}, writes_mem=true, reads_mem=true}, // EDX:EAX (RDX:RAX) compared; ECX:EBX (RCX:RBX) is the new value - .CMPXCHG16B = {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX, .RBX, .RCX}, flags_wr={.ZF}, writes_mem=true, reads_mem=true}, // EDX:EAX (RDX:RAX) compared; ECX:EBX (RCX:RBX) is the new value - .XADD = {written={.OP0, .OP1}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + // 8.20 Cache and Prefetch Encodings + .PREFETCHT0 = { // cache hint/maintenance; no register or flag clobber + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + }, + .PREFETCHT1 = { // cache hint/maintenance; no register or flag clobber + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + }, + .PREFETCHT2 = { // cache hint/maintenance; no register or flag clobber + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + }, + .PREFETCHNTA = { // cache hint/maintenance; no register or flag clobber + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + }, + .PREFETCHW = { // cache hint/maintenance; no register or flag clobber + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + }, + .CLFLUSHOPT = { // cache hint/maintenance; no register or flag clobber + {read={.OP0}, reads_mem=true, side_effects={.CACHE}}, + }, + .CLWB = { // cache hint/maintenance; no register or flag clobber + {read={.OP0}, reads_mem=true, side_effects={.CACHE}}, + }, + .CLDEMOTE = { // cache hint/maintenance; no register or flag clobber + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + }, - // ---- 8.22 Miscellaneous Encodings ---- - .BOUND = {read={.OP0, .OP1}, reads_mem=true, side_effects={.TRAP}}, // #BR if out of bounds - .ENTER = {implicit_wr={.RSP, .RBP}, implicit_rd={.RSP, .RBP}, writes_mem=true}, // builds stack frame - .LEAVE = {implicit_wr={.RSP, .RBP}, implicit_rd={.RBP}, reads_mem=true}, - .XLAT = {implicit_wr={.RAX}, implicit_rd={.RAX, .RBX}, reads_mem=true}, // AL <- [rBX + AL] - .XLATB = {implicit_wr={.RAX}, implicit_rd={.RAX, .RBX}, reads_mem=true}, // AL <- [rBX + AL] - .MOVBE = {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, // byte-swapping load/store - .RDRAND = {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, // CF=1 if value valid; OF/SF/ZF/AF/PF cleared - .RDSEED = {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, // CF=1 if value valid; OF/SF/ZF/AF/PF cleared + // 8.21 Atomic and Byte Swap Encodings + .BSWAP = { + {written={.OP0}, read={.OP0}}, + {written={.OP0}, read={.OP0}}, + }, + .CMPXCHG = { // ZF set on match; on mismatch RAX <- dest + {written={.OP0}, read={.OP0, .OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + }, + .CMPXCHG8B = { // EDX:EAX (RDX:RAX) compared; ECX:EBX (RCX:RBX) is the new value + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RBX, .RCX, .RDX}, flags_wr={.ZF}, writes_mem=true, reads_mem=true}, + }, + .CMPXCHG16B = { // EDX:EAX (RDX:RAX) compared; ECX:EBX (RCX:RBX) is the new value + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RBX, .RCX, .RDX}, flags_wr={.ZF}, writes_mem=true, reads_mem=true}, + }, + .XADD = { + {written={.OP0, .OP1}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + }, + + // 8.22 Miscellaneous Encodings + .BOUND = { // #BR if out of bounds + {read={.OP0, .OP1}, reads_mem=true, side_effects={.TRAP}}, + {read={.OP0, .OP1}, reads_mem=true, side_effects={.TRAP}}, + }, + .ENTER = { // builds stack frame + {implicit_wr={.RSP, .RBP}, implicit_rd={.RSP, .RBP}, writes_mem=true}, + }, + .LEAVE = { + {implicit_wr={.RSP, .RBP}, implicit_rd={.RBP}, reads_mem=true}, + }, + .XLAT = { // AL <- [rBX + AL] + {implicit_wr={.RAX}, implicit_rd={.RAX, .RBX}, reads_mem=true}, + }, + .XLATB = { // AL <- [rBX + AL] + {implicit_wr={.RAX}, implicit_rd={.RAX, .RBX}, reads_mem=true}, + }, + .MOVBE = { // byte-swapping load/store + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + }, + .RDRAND = { // CF=1 if value valid; OF/SF/ZF/AF/PF cleared + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + }, + .RDSEED = { // CF=1 if value valid; OF/SF/ZF/AF/PF cleared + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + }, } diff --git a/core/rexcode/isa/x86/tablegen/encoding_table.odin b/core/rexcode/isa/x86/tablegen/encoding_table.odin index 9793858ee..9fc398807 100644 --- a/core/rexcode/isa/x86/tablegen/encoding_table.odin +++ b/core/rexcode/isa/x86/tablegen/encoding_table.odin @@ -12,7 +12,7 @@ package rexcode_x86_tablegen // Operand_Type list satisfies the user's Instruction operands. @(rodata) -ENCODING_TABLE: [Mnemonic][]Encoding = { +ENCODING_TABLE := [Mnemonic][]Encoding{ .INVALID = {}, // ------------------------------------------------------------------------- @@ -1000,6 +1000,8 @@ ENCODING_TABLE: [Mnemonic][]Encoding = { }, .MOVSD = { {.MOVSD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA5, 0, {rep_ok=true}}, + {.MOVSD, {.XMM, .XMM_M64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, 0x10, 0, {esc=._0F, prefix=PREFIX_F2}}, + {.MOVSD, {.XMM_M64, .XMM, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, 0x11, 0, {esc=._0F, prefix=PREFIX_F2}}, }, .MOVSQ = { {.MOVSQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA5, 0, {rep_ok=true, force_rex_w=true}}, @@ -1014,7 +1016,8 @@ ENCODING_TABLE: [Mnemonic][]Encoding = { {.CMPSW, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA7, 0, {rep_ok=true, opsize_16=true}}, }, .CMPSD = { - {.CMPSD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA7, 0, {rep_ok=true}}, + {.CMPSD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA7, 0, {rep_ok=true}}, + {.CMPSD, {.XMM, .XMM_M64, .IMM8, .NONE}, {.REG, .MR, .IB, .NONE}, 0xC2, 0, {esc=._0F, prefix=PREFIX_F2}}, }, .CMPSQ = { {.CMPSQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA7, 0, {rep_ok=true, force_rex_w=true}}, @@ -1265,10 +1268,6 @@ ENCODING_TABLE: [Mnemonic][]Encoding = { {.MOVSS, {.XMM, .XMM_M32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, 0x10, 0, {esc=._0F, prefix=PREFIX_F3}}, {.MOVSS, {.XMM_M32, .XMM, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, 0x11, 0, {esc=._0F, prefix=PREFIX_F3}}, }, - .MOVSD_SSE = { - {.MOVSD_SSE, {.XMM, .XMM_M64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, 0x10, 0, {esc=._0F, prefix=PREFIX_F2}}, - {.MOVSD_SSE, {.XMM_M64, .XMM, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, 0x11, 0, {esc=._0F, prefix=PREFIX_F2}}, - }, .MOVDQA = { {.MOVDQA, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, 0x6F, 0, {esc=._0F, prefix=PREFIX_66}}, {.MOVDQA, {.XMM_M128, .XMM, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, 0x7F, 0, {esc=._0F, prefix=PREFIX_66}}, @@ -1462,9 +1461,6 @@ ENCODING_TABLE: [Mnemonic][]Encoding = { .CMPSS = { {.CMPSS, {.XMM, .XMM_M32, .IMM8, .NONE}, {.REG, .MR, .IB, .NONE}, 0xC2, 0, {esc=._0F, prefix=PREFIX_F3}}, }, - .CMPSD_SSE = { - {.CMPSD_SSE, {.XMM, .XMM_M64, .IMM8, .NONE}, {.REG, .MR, .IB, .NONE}, 0xC2, 0, {esc=._0F, prefix=PREFIX_F2}}, - }, .COMISS = { {.COMISS, {.XMM, .XMM_M32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, 0x2F, 0, {esc=._0F}}, }, diff --git a/core/rexcode/isa/x86/tablegen/gen.odin b/core/rexcode/isa/x86/tablegen/gen.odin index fbd0af645..10225cd7d 100644 --- a/core/rexcode/isa/x86/tablegen/gen.odin +++ b/core/rexcode/isa/x86/tablegen/gen.odin @@ -34,6 +34,7 @@ import lib "../" // `Mnemonic`/`Encoding` unqualified — its body stays byte-for-byte unedited. Encoding :: lib.Encoding Mnemonic :: lib.Mnemonic +Clobber :: lib.Clobber PREFIX_66 :: lib.PREFIX_66 PREFIX_F3 :: lib.PREFIX_F3 PREFIX_F2 :: lib.PREFIX_F2 @@ -47,22 +48,22 @@ BLOBS := [?]Blob{ {"ENCODE_FORMS", "x86.encode_forms.bin", "Encoding"}, {"ENCODE_RUNS", "x86.encode_runs.bin", "Encode_Run"}, {"ENCODE_RECIPES", "x86.encode_recipes.bin", "Form_Recipe"}, - {"MODRM_TABLE", "x86.modrm.bin", "ModRM_Info"}, - {"SIB_TABLE", "x86.sib.bin", "SIB_Info"}, - {"LEGACY_DECODE_ENTRIES", "x86.legacy.bin", "Decode_Entry"}, - {"VEX_DECODE_ENTRIES", "x86.vex.bin", "VEX_Decode_Entry"}, - {"EVEX_DECODE_ENTRIES", "x86.evex.bin", "VEX_Decode_Entry"}, - {"DECODE_INDEX_LEGACY", "x86.idx_legacy.bin", "Decode_Index"}, - {"DECODE_INDEX_ESC_0F", "x86.idx_0f.bin", "Decode_Index"}, - {"DECODE_INDEX_ESC_0F38", "x86.idx_0f38.bin", "Decode_Index"}, - {"DECODE_INDEX_ESC_0F3A", "x86.idx_0f3a.bin", "Decode_Index"}, - {"VEX_INDEX_0F", "x86.vex_idx_0f.bin", "Decode_Index"}, - {"VEX_INDEX_0F38", "x86.vex_idx_0f38.bin", "Decode_Index"}, - {"VEX_INDEX_0F3A", "x86.vex_idx_0f3a.bin", "Decode_Index"}, - {"EVEX_INDEX_0F", "x86.evex_idx_0f.bin", "Decode_Index"}, - {"EVEX_INDEX_0F38", "x86.evex_idx_0f38.bin","Decode_Index"}, - {"EVEX_INDEX_0F3A", "x86.evex_idx_0f3a.bin","Decode_Index"}, - {"CLOBBER_TABLE", "x86.clobber_table.bin","Clobber"}, + {"MODRM_TABLE", "x86.modrm.bin", "ModRM_Info"}, + {"SIB_TABLE", "x86.sib.bin", "SIB_Info"}, + {"LEGACY_DECODE_ENTRIES", "x86.legacy.bin", "Decode_Entry"}, + {"VEX_DECODE_ENTRIES", "x86.vex.bin", "VEX_Decode_Entry"}, + {"EVEX_DECODE_ENTRIES", "x86.evex.bin", "VEX_Decode_Entry"}, + {"DECODE_INDEX_LEGACY", "x86.idx_legacy.bin", "Decode_Index"}, + {"DECODE_INDEX_ESC_0F", "x86.idx_0f.bin", "Decode_Index"}, + {"DECODE_INDEX_ESC_0F38", "x86.idx_0f38.bin", "Decode_Index"}, + {"DECODE_INDEX_ESC_0F3A", "x86.idx_0f3a.bin", "Decode_Index"}, + {"VEX_INDEX_0F", "x86.vex_idx_0f.bin", "Decode_Index"}, + {"VEX_INDEX_0F38", "x86.vex_idx_0f38.bin", "Decode_Index"}, + {"VEX_INDEX_0F3A", "x86.vex_idx_0f3a.bin", "Decode_Index"}, + {"EVEX_INDEX_0F", "x86.evex_idx_0f.bin", "Decode_Index"}, + {"EVEX_INDEX_0F38", "x86.evex_idx_0f38.bin", "Decode_Index"}, + {"EVEX_INDEX_0F3A", "x86.evex_idx_0f3a.bin", "Decode_Index"}, + {"CLOBBER_FORMS", "x86.clobber_forms.bin", "Clobber"}, } DIR_GEN :: #directory + "/generated/" @@ -110,6 +111,17 @@ emit_encode_tables :: proc() { } strings.write_string(&sb, "}\n\n") + strings.write_string(&sb, "@(rodata)\n") + fmt.sbprintfln(&sb, "CLOBBER_FORMS := [%d]lib.Clobber{{", total_forms()) + for m in Mnemonic { + forms := CLOBBER_TABLE[m] + assert(len(forms) == len(ENCODING_TABLE[m])) + if len(forms) == 0 { continue } + fmt.sbprintfln(&sb, "\t// .%v", m) + for f in forms { write_clobber(&sb, f, max_name) } + } + strings.write_string(&sb, "}\n\n") + // Run index, one entry per mnemonic (dense, enum-ordinal order). run_name := 0 for m in Mnemonic { run_name = max(run_name, len(reflect.enum_string(m))) } @@ -153,6 +165,59 @@ write_encoding :: proc(sb: ^strings.Builder, e: lib.Encoding, max_name: int) { strings.write_string(sb, "},\n") } +write_clobber :: proc(sb: ^strings.Builder, c: lib.Clobber, max_name: int) { + i := 0 + sep :: proc(sb: ^strings.Builder, i: ^int) { + if i^ > 0 { strings.write_string(sb, ", ") } + i^ += 1 + } + write_flags :: proc(sb: ^strings.Builder, name: string, flags: $T) { + strings.write_string(sb, name) + strings.write_string(sb, "={") + i := 0 + for flag in flags { + if i > 0 { strings.write_string(sb, ", ") } + fmt.sbprintf(sb, ".%s", flag) + i += 1 + } + strings.write_string(sb, "}") + } + + strings.write_string(sb, "\t{") + if c.written != nil { + sep(sb, &i); write_flags(sb, "written", c.written) + } + if c.read != nil { + sep(sb, &i); write_flags(sb, "read", c.read) + } + if c.implicit_wr != nil { + sep(sb, &i); write_flags(sb, "implicit_wr", c.implicit_wr) + } + if c.implicit_rd != nil { + sep(sb, &i); write_flags(sb, "implicit_rd", c.implicit_rd) + } + if c.flags_wr != nil { + sep(sb, &i); write_flags(sb, "flags_wr", c.flags_wr) + } + if c.flags_undef != nil { + sep(sb, &i); write_flags(sb, "flags_undef", c.flags_undef) + } + if c.flags_rd != nil { + sep(sb, &i); write_flags(sb, "flags_rd", c.flags_rd) + } + if c.writes_mem { + sep(sb, &i); strings.write_string(sb, "writes_mem=true") + } + if c.reads_mem { + sep(sb, &i); strings.write_string(sb, "reads_mem=true") + } + if c.side_effects != nil { + sep(sb, &i); write_flags(sb, "side_effects", c.side_effects) + } + + strings.write_string(sb, "},\n") +} + // ----------------------------------------------------------------------------- // Decode side // ----------------------------------------------------------------------------- @@ -548,6 +613,14 @@ encoding_forms :: #force_inline proc "contextless" (m: Mnemonic) -> []Encoding { return ENCODE_FORMS[r.start:][:r.count] } +// Per-mnemonic encode forms: the run of ENCODE_FORMS belonging to ` + "`m`" + `. +// Replaces the old ENCODING_TABLE[m] slice; the returned view is into rodata. +@(private, require_results) +clobber_forms :: #force_inline proc "contextless" (m: Mnemonic) -> []Clobber { + r := ENCODE_RUNS[u16(m)] + return CLOBBER_FORMS[r.start:][:r.count] +} + // Flat [prefix][opcode] lookup into a logical [4][256] index table. @(private, require_results) didx :: #force_inline proc "contextless" (t: []Decode_Index, prefix, opcode: u8) -> Decode_Index { diff --git a/core/rexcode/isa/x86/tablegen/generated/decode_tables.odin b/core/rexcode/isa/x86/tablegen/generated/decode_tables.odin index 6821eb95a..5d4939325 100644 --- a/core/rexcode/isa/x86/tablegen/generated/decode_tables.odin +++ b/core/rexcode/isa/x86/tablegen/generated/decode_tables.odin @@ -146,57 +146,57 @@ SIB_TABLE := [256]lib.SIB_Info{ @(rodata) LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0x00, 0xFF, .ADD, {.RM8, .R8, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x01, 0xFF, .ADD, {.RM16, .R16, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x01, 0xFF, .ADD, {.RM64, .R64, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x01, 0xFF, .ADD, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x01, 0xFF, .ADD, {.RM16, .R16, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x02, 0xFF, .ADD, {.R8, .RM8, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x03, 0xFF, .ADD, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x03, 0xFF, .ADD, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x03, 0xFF, .ADD, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {force_rex_w=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x03, 0xFF, .ADD, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x04, 0xFF, .ADD, {.AL_IMPL, .IMM8, .NONE, .NONE}, {.IMPL, .IB, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x05, 0xFF, .ADD, {.EAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {op_count=2}}, - {.NONE, 0, 0x05, 0xFF, .ADD, {.AX_IMPL, .IMM16, .NONE, .NONE}, {.IMPL, .IW, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x05, 0xFF, .ADD, {.RAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, + {.NONE, 0, 0x05, 0xFF, .ADD, {.AX_IMPL, .IMM16, .NONE, .NONE}, {.IMPL, .IW, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x08, 0xFF, .OR, {.RM8, .R8, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x09, 0xFF, .OR, {.RM64, .R64, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x09, 0xFF, .OR, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x09, 0xFF, .OR, {.RM16, .R16, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x09, 0xFF, .OR, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x09, 0xFF, .OR, {.RM64, .R64, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x0A, 0xFF, .OR, {.R8, .RM8, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x0B, 0xFF, .OR, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x0B, 0xFF, .OR, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x0B, 0xFF, .OR, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {force_rex_w=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x0B, 0xFF, .OR, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x0C, 0xFF, .OR, {.AL_IMPL, .IMM8, .NONE, .NONE}, {.IMPL, .IB, .NONE, .NONE}, {op_count=2}}, + {.NONE, 0, 0x0D, 0xFF, .OR, {.RAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, {.NONE, 0, 0x0D, 0xFF, .OR, {.EAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x0D, 0xFF, .OR, {.AX_IMPL, .IMM16, .NONE, .NONE}, {.IMPL, .IW, .NONE, .NONE}, {op_count=2}}, - {.NONE, 0, 0x0D, 0xFF, .OR, {.RAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, {.NONE, 0, 0x10, 0xFF, .ADC, {.RM8, .R8, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x11, 0xFF, .ADC, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x11, 0xFF, .ADC, {.RM64, .R64, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x11, 0xFF, .ADC, {.RM16, .R16, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x11, 0xFF, .ADC, {.RM64, .R64, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x11, 0xFF, .ADC, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x12, 0xFF, .ADC, {.R8, .RM8, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x13, 0xFF, .ADC, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x13, 0xFF, .ADC, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {force_rex_w=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x13, 0xFF, .ADC, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x13, 0xFF, .ADC, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {force_rex_w=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x14, 0xFF, .ADC, {.AL_IMPL, .IMM8, .NONE, .NONE}, {.IMPL, .IB, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x15, 0xFF, .ADC, {.EAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {op_count=2}}, - {.NONE, 0, 0x15, 0xFF, .ADC, {.RAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, {.NONE, 0, 0x15, 0xFF, .ADC, {.AX_IMPL, .IMM16, .NONE, .NONE}, {.IMPL, .IW, .NONE, .NONE}, {op_count=2}}, + {.NONE, 0, 0x15, 0xFF, .ADC, {.RAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, {.NONE, 0, 0x18, 0xFF, .SBB, {.RM8, .R8, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x19, 0xFF, .SBB, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x19, 0xFF, .SBB, {.RM64, .R64, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x19, 0xFF, .SBB, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x19, 0xFF, .SBB, {.RM16, .R16, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x1A, 0xFF, .SBB, {.R8, .RM8, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x1B, 0xFF, .SBB, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x1B, 0xFF, .SBB, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {force_rex_w=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x1B, 0xFF, .SBB, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x1C, 0xFF, .SBB, {.AL_IMPL, .IMM8, .NONE, .NONE}, {.IMPL, .IB, .NONE, .NONE}, {op_count=2}}, - {.NONE, 0, 0x1D, 0xFF, .SBB, {.EAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x1D, 0xFF, .SBB, {.AX_IMPL, .IMM16, .NONE, .NONE}, {.IMPL, .IW, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x1D, 0xFF, .SBB, {.RAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, + {.NONE, 0, 0x1D, 0xFF, .SBB, {.EAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x20, 0xFF, .AND, {.RM8, .R8, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x21, 0xFF, .AND, {.RM64, .R64, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x21, 0xFF, .AND, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x21, 0xFF, .AND, {.RM16, .R16, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x21, 0xFF, .AND, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x22, 0xFF, .AND, {.R8, .RM8, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x23, 0xFF, .AND, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x23, 0xFF, .AND, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {force_rex_w=true, op_count=2, needs_modrm=true}}, @@ -206,21 +206,21 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0x25, 0xFF, .AND, {.EAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x25, 0xFF, .AND, {.RAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, {.NONE, 0, 0x28, 0xFF, .SUB, {.RM8, .R8, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x29, 0xFF, .SUB, {.RM16, .R16, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x29, 0xFF, .SUB, {.RM64, .R64, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x29, 0xFF, .SUB, {.RM16, .R16, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x29, 0xFF, .SUB, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x2A, 0xFF, .SUB, {.R8, .RM8, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x2B, 0xFF, .SUB, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x2B, 0xFF, .SUB, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x2B, 0xFF, .SUB, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {force_rex_w=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x2B, 0xFF, .SUB, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x2B, 0xFF, .SUB, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x2C, 0xFF, .SUB, {.AL_IMPL, .IMM8, .NONE, .NONE}, {.IMPL, .IB, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x2D, 0xFF, .SUB, {.AX_IMPL, .IMM16, .NONE, .NONE}, {.IMPL, .IW, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x2D, 0xFF, .SUB, {.RAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, {.NONE, 0, 0x2D, 0xFF, .SUB, {.EAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x30, 0xFF, .XOR, {.RM8, .R8, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x31, 0xFF, .XOR, {.RM16, .R16, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x31, 0xFF, .XOR, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x31, 0xFF, .XOR, {.RM64, .R64, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x31, 0xFF, .XOR, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {lock_ok=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x32, 0xFF, .XOR, {.R8, .RM8, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x33, 0xFF, .XOR, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x33, 0xFF, .XOR, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {force_rex_w=true, op_count=2, needs_modrm=true}}, @@ -231,18 +231,18 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0x35, 0xFF, .XOR, {.RAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, {.NONE, 0, 0x38, 0xFF, .CMP, {.RM8, .R8, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x39, 0xFF, .CMP, {.RM16, .R16, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x39, 0xFF, .CMP, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x39, 0xFF, .CMP, {.RM64, .R64, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {force_rex_w=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x39, 0xFF, .CMP, {.RM32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x3A, 0xFF, .CMP, {.R8, .RM8, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x3B, 0xFF, .CMP, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x3B, 0xFF, .CMP, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {force_rex_w=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x3B, 0xFF, .CMP, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x3B, 0xFF, .CMP, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x3C, 0xFF, .CMP, {.AL_IMPL, .IMM8, .NONE, .NONE}, {.IMPL, .IB, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x3D, 0xFF, .CMP, {.RAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, {.NONE, 0, 0x3D, 0xFF, .CMP, {.EAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x3D, 0xFF, .CMP, {.AX_IMPL, .IMM16, .NONE, .NONE}, {.IMPL, .IW, .NONE, .NONE}, {op_count=2}}, - {.NONE, 0, 0x40, 0xFF, .INC, {.R32, .NONE, .NONE, .NONE}, {.OP_R, .NONE, .NONE, .NONE}, {mode_32_only=true, op_count=1}}, {.NONE, 0, 0x40, 0xFF, .INC, {.R16, .NONE, .NONE, .NONE}, {.OP_R, .NONE, .NONE, .NONE}, {mode_32_only=true, op_count=1}}, + {.NONE, 0, 0x40, 0xFF, .INC, {.R32, .NONE, .NONE, .NONE}, {.OP_R, .NONE, .NONE, .NONE}, {mode_32_only=true, op_count=1}}, {.NONE, 0, 0x48, 0xFF, .DEC, {.R16, .NONE, .NONE, .NONE}, {.OP_R, .NONE, .NONE, .NONE}, {mode_32_only=true, op_count=1}}, {.NONE, 0, 0x48, 0xFF, .DEC, {.R32, .NONE, .NONE, .NONE}, {.OP_R, .NONE, .NONE, .NONE}, {mode_32_only=true, op_count=1}}, {.NONE, 0, 0x50, 0xFF, .PUSH, {.R16, .NONE, .NONE, .NONE}, {.OP_R, .NONE, .NONE, .NONE}, {op_count=1}}, @@ -255,25 +255,25 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0x63, 0xFF, .ARPL, {.RM16, .R16, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {op_count=2, needs_modrm=true}}, {.NONE, 0, 0x68, 0xFF, .PUSH, {.IMM16, .NONE, .NONE, .NONE}, {.IW, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x68, 0xFF, .PUSH, {.IMM32, .NONE, .NONE, .NONE}, {.ID, .NONE, .NONE, .NONE}, {op_count=1}}, - {.NONE, 0, 0x69, 0xFF, .IMUL, {.R16, .RM16, .IMM16, .NONE}, {.REG, .MR, .IW, .NONE}, {op_count=3, needs_modrm=true}}, {.NONE, 0, 0x69, 0xFF, .IMUL, {.R64, .RM64, .IMM32, .NONE}, {.REG, .MR, .ID, .NONE}, {force_rex_w=true, op_count=3, needs_modrm=true}}, + {.NONE, 0, 0x69, 0xFF, .IMUL, {.R16, .RM16, .IMM16, .NONE}, {.REG, .MR, .IW, .NONE}, {op_count=3, needs_modrm=true}}, {.NONE, 0, 0x69, 0xFF, .IMUL, {.R32, .RM32, .IMM32, .NONE}, {.REG, .MR, .ID, .NONE}, {op_count=3, needs_modrm=true}}, {.NONE, 0, 0x6A, 0xFF, .PUSH, {.IMM8SX, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, - {.NONE, 0, 0x6B, 0xFF, .IMUL, {.R32, .RM32, .IMM8SX, .NONE}, {.REG, .MR, .IB, .NONE}, {op_count=3, needs_modrm=true}}, {.NONE, 0, 0x6B, 0xFF, .IMUL, {.R16, .RM16, .IMM8SX, .NONE}, {.REG, .MR, .IB, .NONE}, {op_count=3, needs_modrm=true}}, {.NONE, 0, 0x6B, 0xFF, .IMUL, {.R64, .RM64, .IMM8SX, .NONE}, {.REG, .MR, .IB, .NONE}, {force_rex_w=true, op_count=3, needs_modrm=true}}, + {.NONE, 0, 0x6B, 0xFF, .IMUL, {.R32, .RM32, .IMM8SX, .NONE}, {.REG, .MR, .IB, .NONE}, {op_count=3, needs_modrm=true}}, {.NONE, 0, 0x70, 0xFF, .JO, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x71, 0xFF, .JNO, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x72, 0xFF, .JNAE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, - {.NONE, 0, 0x72, 0xFF, .JC, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x72, 0xFF, .JB, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, - {.NONE, 0, 0x73, 0xFF, .JAE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, + {.NONE, 0, 0x72, 0xFF, .JC, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x73, 0xFF, .JNB, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, + {.NONE, 0, 0x73, 0xFF, .JAE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x73, 0xFF, .JNC, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x74, 0xFF, .JZ, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x74, 0xFF, .JE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, - {.NONE, 0, 0x75, 0xFF, .JNZ, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x75, 0xFF, .JNE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, + {.NONE, 0, 0x75, 0xFF, .JNZ, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x76, 0xFF, .JBE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x76, 0xFF, .JNA, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x77, 0xFF, .JA, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, @@ -282,16 +282,16 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0x79, 0xFF, .JNS, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x7A, 0xFF, .JP, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x7A, 0xFF, .JPE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, - {.NONE, 0, 0x7B, 0xFF, .JNP, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x7B, 0xFF, .JPO, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, - {.NONE, 0, 0x7C, 0xFF, .JNGE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, + {.NONE, 0, 0x7B, 0xFF, .JNP, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x7C, 0xFF, .JL, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, - {.NONE, 0, 0x7D, 0xFF, .JNL, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, + {.NONE, 0, 0x7C, 0xFF, .JNGE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x7D, 0xFF, .JGE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, + {.NONE, 0, 0x7D, 0xFF, .JNL, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x7E, 0xFF, .JLE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x7E, 0xFF, .JNG, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, - {.NONE, 0, 0x7F, 0xFF, .JG, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x7F, 0xFF, .JNLE, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, + {.NONE, 0, 0x7F, 0xFF, .JG, {.REL8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0x80, 0x00, .ADD, {.RM8, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x80, 0x01, .OR, {.RM8, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x80, 0x02, .ADC, {.RM8, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, @@ -303,9 +303,9 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0x81, 0x00, .ADD, {.RM64, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x00, .ADD, {.RM16, .IMM16, .NONE, .NONE}, {.MR, .IW, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x00, .ADD, {.RM32, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x81, 0x01, .OR, {.RM64, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x01, .OR, {.RM32, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x01, .OR, {.RM16, .IMM16, .NONE, .NONE}, {.MR, .IW, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x81, 0x01, .OR, {.RM64, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x02, .ADC, {.RM32, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x02, .ADC, {.RM16, .IMM16, .NONE, .NONE}, {.MR, .IW, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x02, .ADC, {.RM64, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, @@ -313,17 +313,17 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0x81, 0x03, .SBB, {.RM32, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x03, .SBB, {.RM64, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x04, .AND, {.RM32, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x81, 0x04, .AND, {.RM16, .IMM16, .NONE, .NONE}, {.MR, .IW, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x04, .AND, {.RM64, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x81, 0x04, .AND, {.RM16, .IMM16, .NONE, .NONE}, {.MR, .IW, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x05, .SUB, {.RM16, .IMM16, .NONE, .NONE}, {.MR, .IW, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x05, .SUB, {.RM32, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x05, .SUB, {.RM64, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x06, .XOR, {.RM64, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x06, .XOR, {.RM16, .IMM16, .NONE, .NONE}, {.MR, .IW, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x06, .XOR, {.RM32, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x81, 0x07, .CMP, {.RM16, .IMM16, .NONE, .NONE}, {.MR, .IW, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x07, .CMP, {.RM32, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x81, 0x07, .CMP, {.RM64, .IMM32, .NONE, .NONE}, {.MR, .ID, .NONE, .NONE}, {force_rex_w=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x81, 0x07, .CMP, {.RM16, .IMM16, .NONE, .NONE}, {.MR, .IW, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x83, 0x00, .ADD, {.RM64, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x83, 0x00, .ADD, {.RM16, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x83, 0x00, .ADD, {.RM32, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, @@ -336,8 +336,8 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0x83, 0x03, .SBB, {.RM32, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x83, 0x03, .SBB, {.RM16, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x83, 0x03, .SBB, {.RM64, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0x83, 0x04, .AND, {.RM16, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x83, 0x04, .AND, {.RM64, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {force_rex_w=true, lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0x83, 0x04, .AND, {.RM16, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x83, 0x04, .AND, {.RM32, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x83, 0x05, .SUB, {.RM16, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x83, 0x05, .SUB, {.RM32, .IMM8SX, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {lock_ok=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, @@ -373,24 +373,24 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0x8E, 0xFF, .MOV, {.SREG, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {force_rex_w=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0x8F, 0x00, .POP, {.RM16, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {.NONE, 0, 0x8F, 0x00, .POP, {.RM64, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {default_64=true, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, - {.NONE, 0, 0x90, 0xFF, .NOP, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, {.NONE, 0, 0x90, 0xFF, .XCHG, {.EAX_IMPL, .R32, .NONE, .NONE}, {.IMPL, .OP_R, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x90, 0xFF, .XCHG, {.AX_IMPL, .R16, .NONE, .NONE}, {.IMPL, .OP_R, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0x90, 0xFF, .XCHG, {.RAX_IMPL, .R64, .NONE, .NONE}, {.IMPL, .OP_R, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, + {.NONE, 0, 0x90, 0xFF, .NOP, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, {.NONE, 0, 0x98, 0xFF, .CWDE, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, - {.NONE, 0, 0x98, 0xFF, .CBW, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true}}, {.NONE, 0, 0x98, 0xFF, .CDQE, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {force_rex_w=true}}, - {.NONE, 0, 0x99, 0xFF, .CDQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, + {.NONE, 0, 0x98, 0xFF, .CBW, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true}}, {.NONE, 0, 0x99, 0xFF, .CWD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true}}, {.NONE, 0, 0x99, 0xFF, .CQO, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {force_rex_w=true}}, - {.NONE, 0, 0x9B, 0xFF, .WAIT, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, + {.NONE, 0, 0x99, 0xFF, .CDQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, {.NONE, 0, 0x9B, 0xFF, .FWAIT, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, - {.NONE, 0, 0x9C, 0xFF, .PUSHFQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {default_64=true}}, + {.NONE, 0, 0x9B, 0xFF, .WAIT, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, {.NONE, 0, 0x9C, 0xFF, .PUSHF, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true}}, + {.NONE, 0, 0x9C, 0xFF, .PUSHFQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {default_64=true}}, {.NONE, 0, 0x9C, 0xFF, .PUSHFD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, - {.NONE, 0, 0x9D, 0xFF, .POPF, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true}}, {.NONE, 0, 0x9D, 0xFF, .POPFQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {default_64=true}}, {.NONE, 0, 0x9D, 0xFF, .POPFD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, + {.NONE, 0, 0x9D, 0xFF, .POPF, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true}}, {.NONE, 0, 0x9E, 0xFF, .SAHF, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, {.NONE, 0, 0x9F, 0xFF, .LAHF, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, {.NONE, 0, 0xA0, 0xFF, .MOVABS, {.AL_IMPL, .MOFFS8, .NONE, .NONE}, {.IMPL, .IQ, .NONE, .NONE}, {op_count=2}}, @@ -409,35 +409,35 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0xA3, 0xFF, .MOV, {.MOFFS16, .AX_IMPL, .NONE, .NONE}, {.IQ, .IMPL, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0xA3, 0xFF, .MOV, {.MOFFS32, .EAX_IMPL, .NONE, .NONE}, {.IQ, .IMPL, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0xA3, 0xFF, .MOV, {.MOFFS64, .RAX_IMPL, .NONE, .NONE}, {.IQ, .IMPL, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, - {.NONE, 0, 0xA4, 0xFF, .MOVSB, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, {.NONE, 0, 0xA4, 0xFF, .MOVS, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, + {.NONE, 0, 0xA4, 0xFF, .MOVSB, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, {.NONE, 0, 0xA5, 0xFF, .MOVSD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, {.NONE, 0, 0xA5, 0xFF, .MOVSW, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true, rep_ok=true}}, {.NONE, 0, 0xA5, 0xFF, .MOVSQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {force_rex_w=true, rep_ok=true}}, {.NONE, 0, 0xA6, 0xFF, .CMPS, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, {.NONE, 0, 0xA6, 0xFF, .CMPSB, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, - {.NONE, 0, 0xA7, 0xFF, .CMPSW, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true, rep_ok=true}}, {.NONE, 0, 0xA7, 0xFF, .CMPSQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {force_rex_w=true, rep_ok=true}}, {.NONE, 0, 0xA7, 0xFF, .CMPSD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, + {.NONE, 0, 0xA7, 0xFF, .CMPSW, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true, rep_ok=true}}, {.NONE, 0, 0xA8, 0xFF, .TEST, {.AL_IMPL, .IMM8, .NONE, .NONE}, {.IMPL, .IB, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0xA9, 0xFF, .TEST, {.EAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0xA9, 0xFF, .TEST, {.AX_IMPL, .IMM16, .NONE, .NONE}, {.IMPL, .IW, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0xA9, 0xFF, .TEST, {.RAX_IMPL, .IMM32, .NONE, .NONE}, {.IMPL, .ID, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, {.NONE, 0, 0xAA, 0xFF, .STOS, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, {.NONE, 0, 0xAA, 0xFF, .STOSB, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, + {.NONE, 0, 0xAB, 0xFF, .STOSQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {force_rex_w=true, rep_ok=true}}, {.NONE, 0, 0xAB, 0xFF, .STOSW, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true, rep_ok=true}}, {.NONE, 0, 0xAB, 0xFF, .STOSD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, - {.NONE, 0, 0xAB, 0xFF, .STOSQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {force_rex_w=true, rep_ok=true}}, - {.NONE, 0, 0xAC, 0xFF, .LODSB, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, {.NONE, 0, 0xAC, 0xFF, .LODS, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, + {.NONE, 0, 0xAC, 0xFF, .LODSB, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, {.NONE, 0, 0xAD, 0xFF, .LODSQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {force_rex_w=true, rep_ok=true}}, {.NONE, 0, 0xAD, 0xFF, .LODSD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, {.NONE, 0, 0xAD, 0xFF, .LODSW, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true, rep_ok=true}}, - {.NONE, 0, 0xAE, 0xFF, .SCAS, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, {.NONE, 0, 0xAE, 0xFF, .SCASB, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, + {.NONE, 0, 0xAE, 0xFF, .SCAS, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, {.NONE, 0, 0xAF, 0xFF, .SCASD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {rep_ok=true}}, - {.NONE, 0, 0xAF, 0xFF, .SCASQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {force_rex_w=true, rep_ok=true}}, {.NONE, 0, 0xAF, 0xFF, .SCASW, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true, rep_ok=true}}, + {.NONE, 0, 0xAF, 0xFF, .SCASQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {force_rex_w=true, rep_ok=true}}, {.NONE, 0, 0xB0, 0xFF, .MOV, {.R8, .IMM8, .NONE, .NONE}, {.OP_R, .IB, .NONE, .NONE}, {op_count=2}}, {.NONE, 0, 0xB8, 0xFF, .MOVABS, {.R64, .IMM64, .NONE, .NONE}, {.OP_R, .IQ, .NONE, .NONE}, {force_rex_w=true, op_count=2}}, {.NONE, 0, 0xB8, 0xFF, .MOV, {.R32, .IMM32, .NONE, .NONE}, {.OP_R, .ID, .NONE, .NONE}, {op_count=2}}, @@ -451,11 +451,11 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0xC0, 0x05, .SHR, {.RM8, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0xC0, 0x07, .SAR, {.RM8, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0xC1, 0x00, .ROL, {.RM32, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0xC1, 0x00, .ROL, {.RM16, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0xC1, 0x00, .ROL, {.RM64, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {force_rex_w=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, - {.NONE, 0, 0xC1, 0x01, .ROR, {.RM32, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0xC1, 0x00, .ROL, {.RM16, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0xC1, 0x01, .ROR, {.RM64, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {force_rex_w=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0xC1, 0x01, .ROR, {.RM16, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, + {.NONE, 0, 0xC1, 0x01, .ROR, {.RM32, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0xC1, 0x02, .RCL, {.RM16, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0xC1, 0x02, .RCL, {.RM64, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {force_rex_w=true, modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0xC1, 0x02, .RCL, {.RM32, .IMM8, .NONE, .NONE}, {.MR, .IB, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, @@ -483,8 +483,8 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0xCD, 0xFF, .INT, {.IMM8, .NONE, .NONE, .NONE}, {.IB, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0xCE, 0xFF, .INTO, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, {.NONE, 0, 0xCF, 0xFF, .IRET, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {opsize_16=true}}, - {.NONE, 0, 0xCF, 0xFF, .IRETQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {force_rex_w=true}}, {.NONE, 0, 0xCF, 0xFF, .IRETD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, + {.NONE, 0, 0xCF, 0xFF, .IRETQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {force_rex_w=true}}, {.NONE, 0, 0xD0, 0x00, .ROL, {.RM8, .ONE_IMPL, .NONE, .NONE}, {.MR, .IMPL, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0xD0, 0x01, .ROR, {.RM8, .ONE_IMPL, .NONE, .NONE}, {.MR, .IMPL, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, {.NONE, 0, 0xD0, 0x02, .RCL, {.RM8, .ONE_IMPL, .NONE, .NONE}, {.MR, .IMPL, .NONE, .NONE}, {modrm_reg_ext=true, op_count=2, needs_modrm=true}}, @@ -599,8 +599,8 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0xD9, 0xFC, .FRNDINT, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, {.NONE, 0, 0xD9, 0xFD, .FSCALE, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, {.NONE, 0, 0xD9, 0xFE, .FSIN, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, - {.NONE, 0, 0xD9, 0xFF, .FCOS, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, {.NONE, 0, 0xD9, 0xFF, .FLD, {.M32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {op_count=1, needs_modrm=true}}, + {.NONE, 0, 0xD9, 0xFF, .FCOS, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {}}, {.NONE, 0, 0xDA, 0x01, .FIMUL, {.M32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {.NONE, 0, 0xDA, 0x02, .FICOM, {.M32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {.NONE, 0, 0xDA, 0x03, .FICOMP, {.M32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {modrm_reg_ext=true, op_count=1, needs_modrm=true}}, @@ -650,8 +650,8 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0xDD, 0x04, .FRSTOR, {.M, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {.NONE, 0, 0xDD, 0x06, .FSAVE, {.M, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {.NONE, 0, 0xDD, 0x06, .FNSAVE, {.M, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {modrm_reg_ext=true, op_count=1, needs_modrm=true}}, - {.NONE, 0, 0xDD, 0x07, .FNSTSW, {.M16, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {.NONE, 0, 0xDD, 0x07, .FSTSW, {.M16, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {modrm_reg_ext=true, op_count=1, needs_modrm=true}}, + {.NONE, 0, 0xDD, 0x07, .FNSTSW, {.M16, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {.NONE, 0, 0xDD, 0xC0, .FFREE, {.STI, .NONE, .NONE, .NONE}, {.OP_R, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0xDD, 0xD0, .FST, {.STI, .NONE, .NONE, .NONE}, {.OP_R, .NONE, .NONE, .NONE}, {op_count=1}}, {.NONE, 0, 0xDD, 0xD8, .FSTP, {.STI, .NONE, .NONE, .NONE}, {.OP_R, .NONE, .NONE, .NONE}, {op_count=1}}, @@ -760,8 +760,8 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {.NONE, 0, 0xFF, 0x06, .PUSH, {.RM16, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {.NONE, 2, 0x90, 0xFF, .PAUSE, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {prefix=2}}, {._0F, 0, 0x00, 0x00, .SLDT, {.R64, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, force_rex_w=true, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, - {._0F, 0, 0x00, 0x00, .SLDT, {.R32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x00, 0x00, .SLDT, {.RM16, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, + {._0F, 0, 0x00, 0x00, .SLDT, {.R32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x00, 0x01, .STR, {.R32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x00, 0x01, .STR, {.R64, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, force_rex_w=true, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x00, 0x01, .STR, {.RM16, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, @@ -775,11 +775,11 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {._0F, 0, 0x01, 0x01, .SIDT, {.M16_32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x01, 0x02, .LGDT, {.M16_64, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x01, 0x02, .LGDT, {.M16_32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, - {._0F, 0, 0x01, 0x03, .LIDT, {.M16_64, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x01, 0x03, .LIDT, {.M16_32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, - {._0F, 0, 0x01, 0x04, .SMSW, {.R64, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, force_rex_w=true, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, + {._0F, 0, 0x01, 0x03, .LIDT, {.M16_64, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x01, 0x04, .SMSW, {.RM16, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x01, 0x04, .SMSW, {.R32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, + {._0F, 0, 0x01, 0x04, .SMSW, {.R64, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, force_rex_w=true, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x01, 0x06, .LMSW, {.RM16, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x01, 0x07, .INVLPG, {.M8, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x01, 0xC0, .ENCLV, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {esc=._0F}}, @@ -795,12 +795,12 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {._0F, 0, 0x01, 0xEE, .RDPKRU, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {esc=._0F}}, {._0F, 0, 0x01, 0xEF, .WRPKRU, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {esc=._0F}}, {._0F, 0, 0x01, 0xF9, .RDTSCP, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {esc=._0F}}, - {._0F, 0, 0x02, 0xFF, .LAR, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, force_rex_w=true, op_count=2, needs_modrm=true}}, - {._0F, 0, 0x02, 0xFF, .LAR, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, {._0F, 0, 0x02, 0xFF, .LAR, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, + {._0F, 0, 0x02, 0xFF, .LAR, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, + {._0F, 0, 0x02, 0xFF, .LAR, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, force_rex_w=true, op_count=2, needs_modrm=true}}, {._0F, 0, 0x03, 0xFF, .LSL, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, - {._0F, 0, 0x03, 0xFF, .LSL, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, force_rex_w=true, op_count=2, needs_modrm=true}}, {._0F, 0, 0x03, 0xFF, .LSL, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, + {._0F, 0, 0x03, 0xFF, .LSL, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, force_rex_w=true, op_count=2, needs_modrm=true}}, {._0F, 0, 0x05, 0xFF, .SYSCALL, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {esc=._0F}}, {._0F, 0, 0x06, 0xFF, .CLTS, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {esc=._0F}}, {._0F, 0, 0x07, 0xFF, .SYSRET, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, {esc=._0F}}, @@ -823,8 +823,8 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {._0F, 0, 0x18, 0x02, .PREFETCHT1, {.M8, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x18, 0x03, .PREFETCHT2, {.M8, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x1C, 0x00, .CLDEMOTE, {.M8, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, - {._0F, 0, 0x1F, 0x00, .NOP, {.RM16, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x1F, 0x00, .NOP, {.RM32, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, + {._0F, 0, 0x1F, 0x00, .NOP, {.RM16, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x1F, 0x00, .NOP, {.RM64, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, force_rex_w=true, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 0, 0x20, 0xFF, .MOV, {.R64, .CR, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, {._0F, 0, 0x21, 0xFF, .MOV, {.R64, .DR, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, @@ -931,8 +931,8 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {._0F, 0, 0x4F, 0xFF, .CMOVG, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, force_rex_w=true, op_count=2, needs_modrm=true}}, {._0F, 0, 0x4F, 0xFF, .CMOVG, {.R16, .RM16, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, {._0F, 0, 0x4F, 0xFF, .CMOVG, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, - {._0F, 0, 0x50, 0xFF, .MOVMSKPS, {.R32, .XMM, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, {._0F, 0, 0x50, 0xFF, .MOVMSKPS, {.R64, .XMM, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, force_rex_w=true, op_count=2, needs_modrm=true}}, + {._0F, 0, 0x50, 0xFF, .MOVMSKPS, {.R32, .XMM, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, {._0F, 0, 0x51, 0xFF, .SQRTPS, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, {._0F, 0, 0x52, 0xFF, .RSQRTPS, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, {._0F, 0, 0x53, 0xFF, .RCPPS, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, op_count=2, needs_modrm=true}}, @@ -1133,8 +1133,8 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {._0F, 1, 0x2B, 0xFF, .MOVNTPD, {.M128, .XMM, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {esc=._0F, prefix=1, op_count=2, needs_modrm=true}}, {._0F, 1, 0x2E, 0xFF, .UCOMISD, {.XMM, .XMM_M64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=1, op_count=2, needs_modrm=true}}, {._0F, 1, 0x2F, 0xFF, .COMISD, {.XMM, .XMM_M64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=1, op_count=2, needs_modrm=true}}, - {._0F, 1, 0x50, 0xFF, .MOVMSKPD, {.R64, .XMM, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=1, force_rex_w=true, op_count=2, needs_modrm=true}}, {._0F, 1, 0x50, 0xFF, .MOVMSKPD, {.R32, .XMM, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=1, op_count=2, needs_modrm=true}}, + {._0F, 1, 0x50, 0xFF, .MOVMSKPD, {.R64, .XMM, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=1, force_rex_w=true, op_count=2, needs_modrm=true}}, {._0F, 1, 0x51, 0xFF, .SQRTPD, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=1, op_count=2, needs_modrm=true}}, {._0F, 1, 0x54, 0xFF, .ANDPD, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=1, op_count=2, needs_modrm=true}}, {._0F, 1, 0x55, 0xFF, .ANDNPD, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=1, op_count=2, needs_modrm=true}}, @@ -1285,8 +1285,8 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {._0F, 2, 0xC2, 0xFF, .CMPSS, {.XMM, .XMM_M32, .IMM8, .NONE}, {.REG, .MR, .IB, .NONE}, {esc=._0F, prefix=2, op_count=3, needs_modrm=true}}, {._0F, 2, 0xC7, 0x06, .VMXON, {.M64, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, {esc=._0F, prefix=2, modrm_reg_ext=true, op_count=1, needs_modrm=true}}, {._0F, 2, 0xE6, 0xFF, .CVTDQ2PD, {.XMM, .XMM_M64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=2, op_count=2, needs_modrm=true}}, - {._0F, 3, 0x10, 0xFF, .MOVSD_SSE, {.XMM, .XMM_M64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=3, op_count=2, needs_modrm=true}}, - {._0F, 3, 0x11, 0xFF, .MOVSD_SSE, {.XMM_M64, .XMM, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {esc=._0F, prefix=3, op_count=2, needs_modrm=true}}, + {._0F, 3, 0x10, 0xFF, .MOVSD, {.XMM, .XMM_M64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=3, op_count=2, needs_modrm=true}}, + {._0F, 3, 0x11, 0xFF, .MOVSD, {.XMM_M64, .XMM, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {esc=._0F, prefix=3, op_count=2, needs_modrm=true}}, {._0F, 3, 0x12, 0xFF, .MOVDDUP, {.XMM, .XMM_M64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=3, op_count=2, needs_modrm=true}}, {._0F, 3, 0x2A, 0xFF, .CVTSI2SD, {.XMM, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=3, force_rex_w=true, op_count=2, needs_modrm=true}}, {._0F, 3, 0x2A, 0xFF, .CVTSI2SD, {.XMM, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=3, op_count=2, needs_modrm=true}}, @@ -1305,7 +1305,7 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {._0F, 3, 0x70, 0xFF, .PSHUFLW, {.XMM, .XMM_M128, .IMM8, .NONE}, {.REG, .MR, .IB, .NONE}, {esc=._0F, prefix=3, op_count=3, needs_modrm=true}}, {._0F, 3, 0x7C, 0xFF, .HADDPS, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=3, op_count=2, needs_modrm=true}}, {._0F, 3, 0x7D, 0xFF, .HSUBPS, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=3, op_count=2, needs_modrm=true}}, - {._0F, 3, 0xC2, 0xFF, .CMPSD_SSE, {.XMM, .XMM_M64, .IMM8, .NONE}, {.REG, .MR, .IB, .NONE}, {esc=._0F, prefix=3, op_count=3, needs_modrm=true}}, + {._0F, 3, 0xC2, 0xFF, .CMPSD, {.XMM, .XMM_M64, .IMM8, .NONE}, {.REG, .MR, .IB, .NONE}, {esc=._0F, prefix=3, op_count=3, needs_modrm=true}}, {._0F, 3, 0xD0, 0xFF, .ADDSUBPS, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=3, op_count=2, needs_modrm=true}}, {._0F, 3, 0xE6, 0xFF, .CVTPD2DQ, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=3, op_count=2, needs_modrm=true}}, {._0F, 3, 0xF0, 0xFF, .LDDQU, {.XMM, .M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F, prefix=3, op_count=2, needs_modrm=true}}, @@ -1380,8 +1380,8 @@ LEGACY_DECODE_ENTRIES := [1270]lib.Decode_Entry{ {._0F38, 1, 0xDF, 0xFF, .AESDECLAST, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F38, prefix=1, op_count=2, needs_modrm=true}}, {._0F38, 1, 0xF5, 0xFF, .WRUSSD, {.M32, .R32, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {esc=._0F38, prefix=1, op_count=2, needs_modrm=true}}, {._0F38, 1, 0xF5, 0xFF, .WRUSSQ, {.M64, .R64, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, {esc=._0F38, prefix=1, force_rex_w=true, op_count=2, needs_modrm=true}}, - {._0F38, 1, 0xF6, 0xFF, .ADCX, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F38, prefix=1, force_rex_w=true, op_count=2, needs_modrm=true}}, {._0F38, 1, 0xF6, 0xFF, .ADCX, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F38, prefix=1, op_count=2, needs_modrm=true}}, + {._0F38, 1, 0xF6, 0xFF, .ADCX, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F38, prefix=1, force_rex_w=true, op_count=2, needs_modrm=true}}, {._0F38, 2, 0xF6, 0xFF, .ADOX, {.R64, .RM64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F38, prefix=2, force_rex_w=true, op_count=2, needs_modrm=true}}, {._0F38, 2, 0xF6, 0xFF, .ADOX, {.R32, .RM32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F38, prefix=2, op_count=2, needs_modrm=true}}, {._0F38, 3, 0xF0, 0xFF, .CRC32, {.R64, .RM8, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, {esc=._0F38, prefix=3, force_rex_w=true, op_count=2, needs_modrm=true}}, diff --git a/core/rexcode/isa/x86/tablegen/generated/encode_tables.odin b/core/rexcode/isa/x86/tablegen/generated/encode_tables.odin index fa4a01692..74eda1187 100644 --- a/core/rexcode/isa/x86/tablegen/generated/encode_tables.odin +++ b/core/rexcode/isa/x86/tablegen/generated/encode_tables.odin @@ -800,6 +800,8 @@ ENCODE_FORMS := [2395]lib.Encoding{ {.MOVSW, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA5, 0, {opsize_16=true, rep_ok=true}}, // .MOVSD {.MOVSD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA5, 0, {rep_ok=true}}, + {.MOVSD, {.XMM, .XMM_M64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, 0x10, 0, {esc=._0F, prefix=3, explicit_count=2}}, + {.MOVSD, {.XMM_M64, .XMM, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, 0x11, 0, {esc=._0F, prefix=3, explicit_count=2}}, // .MOVSQ {.MOVSQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA5, 0, {force_rex_w=true, rep_ok=true}}, // .CMPS @@ -810,6 +812,7 @@ ENCODE_FORMS := [2395]lib.Encoding{ {.CMPSW, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA7, 0, {opsize_16=true, rep_ok=true}}, // .CMPSD {.CMPSD, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA7, 0, {rep_ok=true}}, + {.CMPSD, {.XMM, .XMM_M64, .IMM8, .NONE}, {.REG, .MR, .IB, .NONE}, 0xC2, 0, {esc=._0F, prefix=3, explicit_count=3}}, // .CMPSQ {.CMPSQ, {.NONE, .NONE, .NONE, .NONE}, {.NONE, .NONE, .NONE, .NONE}, 0xA7, 0, {force_rex_w=true, rep_ok=true}}, // .SCAS @@ -973,9 +976,6 @@ ENCODE_FORMS := [2395]lib.Encoding{ // .MOVSS {.MOVSS, {.XMM, .XMM_M32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, 0x10, 0, {esc=._0F, prefix=2, explicit_count=2}}, {.MOVSS, {.XMM_M32, .XMM, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, 0x11, 0, {esc=._0F, prefix=2, explicit_count=2}}, - // .MOVSD_SSE - {.MOVSD_SSE, {.XMM, .XMM_M64, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, 0x10, 0, {esc=._0F, prefix=3, explicit_count=2}}, - {.MOVSD_SSE, {.XMM_M64, .XMM, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, 0x11, 0, {esc=._0F, prefix=3, explicit_count=2}}, // .MOVDQA {.MOVDQA, {.XMM, .XMM_M128, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, 0x6F, 0, {esc=._0F, prefix=1, explicit_count=2}}, {.MOVDQA, {.XMM_M128, .XMM, .NONE, .NONE}, {.MR, .REG, .NONE, .NONE}, 0x7F, 0, {esc=._0F, prefix=1, explicit_count=2}}, @@ -1110,8 +1110,6 @@ ENCODE_FORMS := [2395]lib.Encoding{ {.CMPPD, {.XMM, .XMM_M128, .IMM8, .NONE}, {.REG, .MR, .IB, .NONE}, 0xC2, 0, {esc=._0F, prefix=1, explicit_count=3}}, // .CMPSS {.CMPSS, {.XMM, .XMM_M32, .IMM8, .NONE}, {.REG, .MR, .IB, .NONE}, 0xC2, 0, {esc=._0F, prefix=2, explicit_count=3}}, - // .CMPSD_SSE - {.CMPSD_SSE, {.XMM, .XMM_M64, .IMM8, .NONE}, {.REG, .MR, .IB, .NONE}, 0xC2, 0, {esc=._0F, prefix=3, explicit_count=3}}, // .COMISS {.COMISS, {.XMM, .XMM_M32, .NONE, .NONE}, {.REG, .MR, .NONE, .NONE}, 0x2F, 0, {esc=._0F, explicit_count=2}}, // .COMISD @@ -3599,6 +3597,3596 @@ ENCODE_FORMS := [2395]lib.Encoding{ {.RDSEED, {.R64, .NONE, .NONE, .NONE}, {.MR, .NONE, .NONE, .NONE}, 0xC7, 7, {esc=._0F, force_rex_w=true, modrm_reg_ext=true, explicit_count=1}}, } +@(rodata) +CLOBBER_FORMS := [2395]lib.Clobber{ + // .MOV + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .MOVABS + {written={.OP0}, read={.OP1}}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_rd={.RAX}, writes_mem=true, reads_mem=true}, + // .MOVZX + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .MOVSX + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .MOVSXD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .XCHG + {written={.OP1}, read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}}, + {written={.OP1}, read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}}, + {written={.OP1}, read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, writes_mem=true, reads_mem=true}, + // .PUSH + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true}, + // .POP + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true}, + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true}, + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true}, + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true}, + {written={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true}, + // .LEA + {written={.OP0}}, + {written={.OP0}}, + {written={.OP0}}, + // .ADD + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + // .ADC + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + // .SUB + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + // .SBB + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + // .MUL + {read={.OP0}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + // .IMUL + {read={.OP0}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .OF}, flags_undef={.PF, .AF, .ZF, .SF}, reads_mem=true}, + // .DIV + {read={.OP0}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .IDIV + {read={.OP0}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RDX}, flags_undef={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .INC + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + // .DEC + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + // .NEG + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + // .CMP + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .AND + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + // .OR + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + // .XOR + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + // .NOT + {written={.OP0}, read={.OP0}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, writes_mem=true, reads_mem=true}, + // .TEST + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP1}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, reads_mem=true}, + // .SHL + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + // .SHR + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + // .SAR + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .ZF, .SF, .OF}, flags_undef={.AF}, writes_mem=true, reads_mem=true}, + // .ROL + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + // .ROR + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, writes_mem=true, reads_mem=true}, + // .RCL + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + // .RCR + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0}, implicit_rd={.RCX}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF, .OF}, flags_rd={.CF}, writes_mem=true, reads_mem=true}, + // .SHLD + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + // .SHRD + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1, .OP2}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_rd={.RCX}, flags_wr={.CF, .PF, .ZF, .SF}, flags_undef={.AF, .OF}, writes_mem=true, reads_mem=true}, + // .BT + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + // .BTS + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + // .BTR + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + // .BTC + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_undef={.PF, .AF, .SF, .OF}, writes_mem=true, reads_mem=true}, + // .BSF + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + // .BSR + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, flags_undef={.CF, .PF, .AF, .SF, .OF}, reads_mem=true}, + // .POPCNT + {written={.OP0}, read={.OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .LZCNT + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + // .TZCNT + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + // .JMP + {read={.OP0}, side_effects={.CONTROL}}, + {read={.OP0}, side_effects={.CONTROL}}, + {read={.OP0}, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, reads_mem=true, side_effects={.CONTROL}}, + // .JA + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + // .JAE + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + // .JB + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + // .JBE + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + // .JC + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + // .JE + {flags_rd={.ZF}, side_effects={.CONTROL}}, + {flags_rd={.ZF}, side_effects={.CONTROL}}, + // .JZ + {flags_rd={.ZF}, side_effects={.CONTROL}}, + {flags_rd={.ZF}, side_effects={.CONTROL}}, + // .JG + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + // .JGE + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + // .JL + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + // .JLE + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + // .JNA + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + // .JNAE + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + // .JNB + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + // .JNBE + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + {flags_rd={.CF, .ZF}, side_effects={.CONTROL}}, + // .JNC + {flags_rd={.CF}, side_effects={.CONTROL}}, + {flags_rd={.CF}, side_effects={.CONTROL}}, + // .JNE + {flags_rd={.ZF}, side_effects={.CONTROL}}, + {flags_rd={.ZF}, side_effects={.CONTROL}}, + // .JNZ + {flags_rd={.ZF}, side_effects={.CONTROL}}, + {flags_rd={.ZF}, side_effects={.CONTROL}}, + // .JNG + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + // .JNGE + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + // .JNL + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.SF, .OF}, side_effects={.CONTROL}}, + // .JNLE + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + {flags_rd={.ZF, .SF, .OF}, side_effects={.CONTROL}}, + // .JNO + {flags_rd={.OF}, side_effects={.CONTROL}}, + {flags_rd={.OF}, side_effects={.CONTROL}}, + // .JNP + {flags_rd={.PF}, side_effects={.CONTROL}}, + {flags_rd={.PF}, side_effects={.CONTROL}}, + // .JNS + {flags_rd={.SF}, side_effects={.CONTROL}}, + {flags_rd={.SF}, side_effects={.CONTROL}}, + // .JO + {flags_rd={.OF}, side_effects={.CONTROL}}, + {flags_rd={.OF}, side_effects={.CONTROL}}, + // .JP + {flags_rd={.PF}, side_effects={.CONTROL}}, + {flags_rd={.PF}, side_effects={.CONTROL}}, + // .JPE + {flags_rd={.PF}, side_effects={.CONTROL}}, + {flags_rd={.PF}, side_effects={.CONTROL}}, + // .JPO + {flags_rd={.PF}, side_effects={.CONTROL}}, + {flags_rd={.PF}, side_effects={.CONTROL}}, + // .JS + {flags_rd={.SF}, side_effects={.CONTROL}}, + {flags_rd={.SF}, side_effects={.CONTROL}}, + // .JCXZ + {implicit_rd={.RCX}, side_effects={.CONTROL}}, + // .JECXZ + {implicit_rd={.RCX}, side_effects={.CONTROL}}, + // .JRCXZ + {implicit_rd={.RCX}, side_effects={.CONTROL}}, + // .LOOP + {implicit_wr={.RCX}, implicit_rd={.RCX}, side_effects={.CONTROL}}, + // .LOOPE + {implicit_wr={.RCX}, implicit_rd={.RCX}, flags_rd={.ZF}, side_effects={.CONTROL}}, + // .LOOPNE + {implicit_wr={.RCX}, implicit_rd={.RCX}, flags_rd={.ZF}, side_effects={.CONTROL}}, + // .CALL + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true, side_effects={.CONTROL}}, + {read={.OP0}, implicit_wr={.RSP}, implicit_rd={.RSP}, writes_mem=true, reads_mem=true, side_effects={.CONTROL}}, + // .RET + {implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true, side_effects={.CONTROL}}, + {implicit_wr={.RSP}, implicit_rd={.RSP}, reads_mem=true, side_effects={.CONTROL}}, + // .IRET + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true, side_effects={.SERIALIZING, .CONTROL}}, + // .IRETD + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true, side_effects={.SERIALIZING, .CONTROL}}, + // .IRETQ + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true, side_effects={.SERIALIZING, .CONTROL}}, + // .INT + {read={.OP0}, implicit_wr={.RSP}, flags_wr={.IF}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true, side_effects={.INTERRUPT, .CONTROL}}, + // .INT3 + {implicit_wr={.RSP}, flags_wr={.IF}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true, side_effects={.INTERRUPT, .CONTROL}}, + // .INTO + {implicit_wr={.RSP}, flags_wr={.IF}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true, side_effects={.INTERRUPT, .CONTROL}}, + // .SYSCALL + {implicit_wr={.RCX, .R11}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, side_effects={.INTERRUPT, .CONTROL}}, + // .SYSRET + {implicit_rd={.RCX, .R11}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, side_effects={.SERIALIZING, .INTERRUPT, .PRIVILEGED, .CONTROL}}, + // .SYSENTER + {implicit_wr={.RSP}, flags_wr={.IF}, side_effects={.INTERRUPT, .CONTROL}}, + // .SYSEXIT + {implicit_wr={.RSP}, implicit_rd={.RCX, .RDX}, side_effects={.SERIALIZING, .INTERRUPT, .PRIVILEGED, .CONTROL}}, + // .SETA + {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, + // .SETAE + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + // .SETB + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + // .SETBE + {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, + // .SETC + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + // .SETE + {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, + // .SETG + {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, + // .SETGE + {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, + // .SETL + {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, + // .SETLE + {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, + // .SETNA + {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, + // .SETNAE + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + // .SETNB + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + // .SETNBE + {written={.OP0}, flags_rd={.CF, .ZF}, writes_mem=true}, + // .SETNC + {written={.OP0}, flags_rd={.CF}, writes_mem=true}, + // .SETNE + {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, + // .SETNG + {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, + // .SETNGE + {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, + // .SETNL + {written={.OP0}, flags_rd={.SF, .OF}, writes_mem=true}, + // .SETNLE + {written={.OP0}, flags_rd={.ZF, .SF, .OF}, writes_mem=true}, + // .SETNO + {written={.OP0}, flags_rd={.OF}, writes_mem=true}, + // .SETNP + {written={.OP0}, flags_rd={.PF}, writes_mem=true}, + // .SETNS + {written={.OP0}, flags_rd={.SF}, writes_mem=true}, + // .SETNZ + {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, + // .SETO + {written={.OP0}, flags_rd={.OF}, writes_mem=true}, + // .SETP + {written={.OP0}, flags_rd={.PF}, writes_mem=true}, + // .SETPE + {written={.OP0}, flags_rd={.PF}, writes_mem=true}, + // .SETPO + {written={.OP0}, flags_rd={.PF}, writes_mem=true}, + // .SETS + {written={.OP0}, flags_rd={.SF}, writes_mem=true}, + // .SETZ + {written={.OP0}, flags_rd={.ZF}, writes_mem=true}, + // .CMOVA + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + // .CMOVAE + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + // .CMOVB + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + // .CMOVBE + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + // .CMOVC + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + // .CMOVE + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + // .CMOVG + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + // .CMOVGE + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + // .CMOVL + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + // .CMOVLE + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + // .CMOVNA + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + // .CMOVNAE + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + // .CMOVNB + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + // .CMOVNBE + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF, .ZF}, reads_mem=true}, + // .CMOVNC + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.CF}, reads_mem=true}, + // .CMOVNE + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + // .CMOVNG + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + // .CMOVNGE + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + // .CMOVNL + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF, .OF}, reads_mem=true}, + // .CMOVNLE + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF, .SF, .OF}, reads_mem=true}, + // .CMOVNO + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + // .CMOVNP + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + // .CMOVNS + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + // .CMOVNZ + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + // .CMOVO + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.OF}, reads_mem=true}, + // .CMOVP + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + // .CMOVPE + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + // .CMOVPO + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.PF}, reads_mem=true}, + // .CMOVS + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.SF}, reads_mem=true}, + // .CMOVZ + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_rd={.ZF}, reads_mem=true}, + // .MOVS + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + // .MOVSB + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + // .MOVSW + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + // .MOVSD + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVSQ + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + // .CMPS + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + // .CMPSB + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + // .CMPSW + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + // .CMPSD + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CMPSQ + {implicit_wr={.RCX, .RSI, .RDI}, implicit_rd={.RCX, .RSI, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + // .SCAS + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + // .SCASB + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + // .SCASW + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + // .SCASD + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + // .SCASQ + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, flags_rd={.DF}, reads_mem=true}, + // .LODS + {implicit_wr={.RAX, .RSI}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, + // .LODSB + {implicit_wr={.RAX, .RSI}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, + // .LODSW + {implicit_wr={.RAX, .RSI}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, + // .LODSD + {implicit_wr={.RAX, .RSI}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, + // .LODSQ + {implicit_wr={.RAX, .RSI}, implicit_rd={.RSI}, flags_rd={.DF}, reads_mem=true}, + // .STOS + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + // .STOSB + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + // .STOSW + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + // .STOSD + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + // .STOSQ + {implicit_wr={.RCX, .RDI}, implicit_rd={.RAX, .RCX, .RDI}, flags_rd={.DF}, writes_mem=true, reads_mem=true}, + // .CLC + {flags_wr={.CF}}, + // .STC + {flags_wr={.CF}}, + // .CMC + {flags_wr={.CF}, flags_rd={.CF}}, + // .CLD + {flags_wr={.DF}}, + // .STD + {flags_wr={.DF}}, + // .CLI + {flags_wr={.IF}}, + // .STI + {flags_wr={.IF}}, + // .LAHF + {implicit_wr={.RAX}, flags_rd={.CF, .PF, .AF, .ZF, .SF}}, + // .SAHF + {implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF}}, + // .PUSHF + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true}, + // .PUSHFD + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true}, + // .PUSHFQ + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_rd={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, writes_mem=true}, + // .POPF + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true}, + // .POPFD + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true}, + // .POPFQ + {implicit_wr={.RSP}, implicit_rd={.RSP}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF, .DF, .IF}, reads_mem=true}, + // .NOP + {}, + {}, + {}, + {}, + // .HLT + {side_effects={.HALT, .PRIVILEGED}}, + // .WAIT + {implicit_rd={.FPU_SW}}, + // .LOCK + {side_effects={.FENCE}}, + // .UD0 + {side_effects={.TRAP}}, + // .UD1 + {side_effects={.TRAP}}, + // .UD2 + {side_effects={.TRAP}}, + // .CPUID + {implicit_wr={.RAX, .RBX, .RCX, .RDX}, implicit_rd={.RAX, .RCX}, side_effects={.SERIALIZING}}, + // .RDTSC + {implicit_wr={.RAX, .RDX}}, + // .RDTSCP + {implicit_wr={.RAX, .RCX, .RDX}}, + // .RDPMC + {implicit_wr={.RAX, .RDX}, implicit_rd={.RCX}}, + // .XGETBV + {implicit_wr={.RAX, .RDX}, implicit_rd={.RCX}}, + // .XSETBV + {implicit_rd={.RAX, .RCX, .RDX}}, + // .CBW + {implicit_wr={.RAX}, implicit_rd={.RAX}}, + // .CWDE + {implicit_wr={.RAX}, implicit_rd={.RAX}}, + // .CDQE + {implicit_wr={.RAX}, implicit_rd={.RAX}}, + // .CWD + {implicit_wr={.RDX}, implicit_rd={.RAX}}, + // .CDQ + {implicit_wr={.RDX}, implicit_rd={.RAX}}, + // .CQO + {implicit_wr={.RDX}, implicit_rd={.RAX}}, + // .ANDN + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + // .BEXTR + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .OF}, flags_undef={.PF, .AF, .SF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .OF}, flags_undef={.PF, .AF, .SF}, reads_mem=true}, + // .BLSI + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + // .BLSMSK + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + // .BLSR + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + // .BZHI + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, flags_wr={.CF, .ZF, .SF, .OF}, flags_undef={.PF, .AF}, reads_mem=true}, + // .PDEP + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .PEXT + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .RORX + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .SARX + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .SHLX + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .SHRX + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .MULX + {written={.OP0, .OP1}, read={.OP2}, implicit_rd={.RDX}, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP2}, implicit_rd={.RDX}, reads_mem=true}, + // .ADCX + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_rd={.CF}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.CF}, flags_rd={.CF}, reads_mem=true}, + // .ADOX + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.OF}, flags_rd={.OF}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, flags_wr={.OF}, flags_rd={.OF}, reads_mem=true}, + // .MOVAPS + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVUPS + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVAPD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVUPD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVSS + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVDQA + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVDQU + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVQ + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .MOVD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVLPS + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVHPS + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVLPD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVHPD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVLHPS + {written={.OP0}, read={.OP1}}, + // .MOVHLPS + {written={.OP0}, read={.OP1}}, + // .MOVMSKPS + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .MOVMSKPD + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .MOVNTPS + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVNTPD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVNTDQ + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .MOVNTDQA + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .ADDPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .ADDPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .ADDSS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .ADDSD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .SUBPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .SUBPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .SUBSS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .SUBSD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MULPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MULPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MULSS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MULSD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .DIVPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .DIVPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .DIVSS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .DIVSD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .SQRTPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .SQRTPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .SQRTSS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .SQRTSD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .RCPPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .RCPSS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .RSQRTPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .RSQRTSS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MAXPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MAXPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MAXSS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MAXSD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MINPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MINPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MINSS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MINSD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .ANDPS + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .ANDPD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .ANDNPS + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .ANDNPD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .ORPS + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .ORPD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .XORPS + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .XORPD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .CMPPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CMPPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CMPSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .COMISS + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + // .COMISD + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + // .UCOMISS + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + // .UCOMISD + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + // .SHUFPS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .SHUFPD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .UNPCKLPS + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .UNPCKHPS + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .UNPCKLPD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .UNPCKHPD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .CVTPS2PD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTPD2PS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTSS2SD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTSD2SS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTPS2DQ + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTPD2DQ + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTDQ2PS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTDQ2PD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTSS2SI + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTSD2SI + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTSI2SS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTSI2SD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTTPS2DQ + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTTPD2DQ + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTTSS2SI + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .CVTTSD2SI + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .PADDB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PADDW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PADDD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PADDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSUBB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSUBW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSUBD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSUBQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PADDSB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PADDSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PADDUSB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PADDUSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSUBSB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSUBSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSUBUSB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSUBUSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMULLW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMULHW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMULHUW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMULUDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMADDWD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PAND + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PANDN + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .POR + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PXOR + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSLLW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + // .PSLLD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + // .PSLLQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + // .PSRLW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + // .PSRLD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + // .PSRLQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + // .PSRAW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + // .PSRAD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + // .PCMPEQB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PCMPEQW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PCMPEQD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PCMPGTB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PCMPGTW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PCMPGTD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PACKSSWB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PACKSSDW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PACKUSWB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PUNPCKLBW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PUNPCKLWD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PUNPCKLDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PUNPCKLQDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PUNPCKHBW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PUNPCKHWD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PUNPCKHDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PUNPCKHQDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSHUFD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .PSHUFHW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .PSHUFLW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .PSHUFW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .PEXTRW + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .PINSRW + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .PMOVMSKB + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .PAVGB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PAVGW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMAXUB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMAXSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMINUB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMINSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSADBW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .MASKMOVDQU + {read={.OP0, .OP1}, implicit_rd={.RDI}, flags_rd={.DF}, writes_mem=true}, + // .LFENCE + {side_effects={.FENCE, .SERIALIZING}}, + // .SFENCE + {side_effects={.FENCE}}, + // .MFENCE + {side_effects={.FENCE}}, + // .PAUSE + {side_effects={.HINT}}, + // .CLFLUSH + {read={.OP0}, reads_mem=true, side_effects={.CACHE}}, + // .ADDSUBPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .ADDSUBPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .HADDPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .HADDPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .HSUBPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .HSUBPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .MOVDDUP + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .MOVSLDUP + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .MOVSHDUP + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .LDDQU + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSHUFB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PHADDW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PHADDD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PHADDSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PHSUBW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PHSUBD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PHSUBSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMADDUBSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMULHRSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSIGNB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSIGNW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PSIGND + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PABSB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PABSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PABSD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PALIGNR + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .BLENDPS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .BLENDPD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .BLENDVPS + {written={.OP0}, read={.OP1}, implicit_rd={.XMM0}, reads_mem=true}, + // .BLENDVPD + {written={.OP0}, read={.OP1}, implicit_rd={.XMM0}, reads_mem=true}, + // .PBLENDW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .PBLENDVB + {written={.OP0}, read={.OP1}, implicit_rd={.XMM0}, reads_mem=true}, + // .DPPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .DPPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .EXTRACTPS + {written={.OP0}, read={.OP1}, writes_mem=true}, + // .INSERTPS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .MPSADBW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .PACKUSDW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PEXTRB + {written={.OP0}, read={.OP1}, writes_mem=true}, + // .PEXTRD + {written={.OP0}, read={.OP1}, writes_mem=true}, + // .PEXTRQ + {written={.OP0}, read={.OP1}, writes_mem=true}, + // .PHMINPOSUW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PINSRB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .PINSRD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .PINSRQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .PMAXSB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMAXSD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMAXUW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMAXUD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMINSB + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMINSD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMINUW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMINUD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVSXBW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVSXBD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVSXBQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVSXWD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVSXWQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVSXDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVZXBW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVZXBD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVZXBQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVZXWD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVZXWQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMOVZXDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMULDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PMULLD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PTEST + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + // .ROUNDPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .ROUNDPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .ROUNDSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .ROUNDSD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .PCMPEQQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .CRC32 + {written={.OP0}, read={.OP0, .OP1}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, reads_mem=true}, + // .PCMPESTRI + {implicit_wr={.RCX}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .PCMPESTRM + {implicit_wr={.XMM0}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .PCMPISTRI + {implicit_wr={.RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .PCMPISTRM + {implicit_wr={.XMM0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .PCMPGTQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .PCLMULQDQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .AESDEC + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .AESDECLAST + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .AESENC + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .AESENCLAST + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .AESIMC + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .AESKEYGENASSIST + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .SHA1MSG1 + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .SHA1MSG2 + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .SHA1NEXTE + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .SHA1RNDS4 + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .SHA256MSG1 + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .SHA256MSG2 + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .SHA256RNDS2 + {written={.OP0}, read={.OP1}, implicit_rd={.XMM0}, reads_mem=true}, + // .VADDPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VADDPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VADDSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VADDSD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSUBPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSUBPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSUBSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSUBSD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMULPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMULPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMULSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMULSD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VDIVPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VDIVPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VDIVSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VDIVSD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSQRTPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSQRTPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSQRTSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSQRTSD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRCPPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRCPSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRSQRTPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRSQRTSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMAXPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMAXPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMAXSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMAXSD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMINPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMINPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMINSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VMINSD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VANDPS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VANDPD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VANDNPS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VANDNPD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VORPS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VORPD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VXORPS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VXORPD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VCMPPS + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCMPPD + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCMPSS + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCMPSD + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCOMISS + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + // .VCOMISD + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + // .VUCOMISS + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + // .VUCOMISD + {read={.OP0, .OP1}, implicit_wr={.MXCSR}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}, reads_mem=true}, + // .VSHUFPS + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VSHUFPD + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VUNPCKLPS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VUNPCKHPS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VUNPCKLPD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VUNPCKHPD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VBLENDPS + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VBLENDPD + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VBLENDVPS + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VBLENDVPD + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VDPPS + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VDPPD + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VROUNDPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VROUNDPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VROUNDSS + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VROUNDSD + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VEXTRACTPS + {written={.OP0}, read={.OP1}, writes_mem=true}, + // .VINSERTPS + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VMOVAPS + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVUPS + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVAPD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVUPD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVSS + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + // .VMOVSD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + // .VMOVDQA + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVDQU + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVQ + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VMOVD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVLPS + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVHPS + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVLPD + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVHPD + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVLHPS + {written={.OP0}, read={.OP1, .OP2}}, + // .VMOVHLPS + {written={.OP0}, read={.OP1, .OP2}}, + // .VMOVMSKPS + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VMOVMSKPD + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VMOVNTPS + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVNTPD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVNTDQ + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .VMOVNTDQA + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VADDSUBPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VADDSUBPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VHADDPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VHADDPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VHSUBPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VHSUBPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VLDDQU + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VMOVDDUP + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VMOVSLDUP + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VMOVSHDUP + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPCMPESTRI + {implicit_wr={.RCX}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .VPCMPESTRM + {implicit_wr={.XMM0}, implicit_rd={.RAX, .RDX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .VPCMPISTRI + {implicit_wr={.RCX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .VPCMPISTRM + {implicit_wr={.XMM0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true}, + // .VPBROADCASTB + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPBROADCASTW + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPBROADCASTD + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPBROADCASTQ + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VCVTPS2PD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTPD2PS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTSS2SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTSD2SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTPS2DQ + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTPD2DQ + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTDQ2PS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTDQ2PD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTSS2SI + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTSD2SI + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTSI2SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTSI2SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTTPS2DQ + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTTPD2DQ + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTTSS2SI + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTTSD2SI + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VPADDB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPADDW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPADDD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPADDQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSUBB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSUBW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSUBD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSUBQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMULLW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMULHW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMULHUW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMULUDQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMADDWD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPAND + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPANDN + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPOR + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPXOR + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSLLW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + // .VPSLLD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + // .VPSLLQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + // .VPSRLW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + // .VPSRLD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + // .VPSRLQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + // .VPSRAW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + // .VPSRAD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}}, + // .VPCMPEQB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPEQW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPEQD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPEQQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPGTB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPGTW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPGTD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPGTQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPACKSSWB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPACKSSDW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPACKUSWB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPACKUSDW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPUNPCKLBW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPUNPCKLWD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPUNPCKLDQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPUNPCKLQDQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPUNPCKHBW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPUNPCKHWD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPUNPCKHDQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPUNPCKHQDQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSHUFD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSHUFHW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSHUFLW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPEXTRB + {written={.OP0}, read={.OP1}, writes_mem=true}, + // .VPEXTRW + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, writes_mem=true}, + // .VPEXTRD + {written={.OP0}, read={.OP1}, writes_mem=true}, + // .VPEXTRQ + {written={.OP0}, read={.OP1}, writes_mem=true}, + // .VPINSRB + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPINSRW + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPINSRD + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPINSRQ + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPMOVMSKB + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VPTEST + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + // .VPSHUFB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPHADDW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPHADDD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPHADDSW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPHSUBW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPHSUBD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPHSUBSW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMADDUBSW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMULHRSW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSIGNB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSIGNW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSIGND + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPABSB + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPABSW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPABSD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPALIGNR + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPBLENDW + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPBLENDVB + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VMPSADBW + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPHMINPOSUW + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMAXSB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMAXSD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMAXUW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMAXUD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMINSB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMINSD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMINUW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMINUD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMOVSXBW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVSXBD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVSXBQ + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVSXWD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVSXWQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVSXDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVZXBW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVZXBD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVZXBQ + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVZXWD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVZXWQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVZXDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMULDQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMULLD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VMASKMOVDQU + {read={.OP0, .OP1}, implicit_rd={.RDI}, flags_rd={.DF}, writes_mem=true}, + // .VPCLMULQDQ + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VAESDEC + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VAESDECLAST + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VAESENC + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VAESENCLAST + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VAESIMC + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VAESKEYGENASSIST + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VBROADCASTSS + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VBROADCASTSD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + // .VBROADCASTF128 + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VEXTRACTF128 + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + // .VINSERTF128 + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPERM2F128 + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VMASKMOVPS + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + // .VMASKMOVPD + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + // .VTESTPS + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + // .VTESTPD + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + {read={.OP0, .OP1}, flags_wr={.CF, .ZF}, flags_undef={.PF, .AF, .SF, .OF}, reads_mem=true}, + // .VZEROALL + {implicit_wr={.VECTOR}}, + // .VZEROUPPER + {implicit_wr={.VECTOR}}, + // .VBROADCASTI128 + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VEXTRACTI128 + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + // .VINSERTI128 + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPERM2I128 + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPERMD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMPS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMPD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPBLENDD + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPSLLVD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSLLVQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSRLVD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSRLVQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSRAVD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMASKMOVD + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + // .VPMASKMOVQ + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, writes_mem=true, reads_mem=true}, + // .VGATHERDPS + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + // .VGATHERDPD + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + // .VGATHERQPS + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + // .VGATHERQPD + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + // .VPGATHERDD + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + // .VPGATHERDQ + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + // .VPGATHERQD + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + // .VPGATHERQQ + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + {written={.OP0, .OP2}, read={.OP0, .OP1, .OP2}, reads_mem=true}, + // .VFMADD132PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADD213PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADD231PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADD132PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADD213PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADD231PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADD132SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADD213SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADD231SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADD132SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADD213SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADD231SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB132PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB213PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB231PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB132PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB213PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB231PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB132SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB213SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB231SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB132SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB213SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUB231SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD132PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD213PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD231PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD132PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD213PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD231PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD132SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD213SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD231SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD132SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD213SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMADD231SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB132PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB213PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB231PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB132PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB213PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB231PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB132SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB213SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB231SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB132SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB213SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFNMSUB231SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADDSUB132PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADDSUB213PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADDSUB231PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADDSUB132PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADDSUB213PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMADDSUB231PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUBADD132PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUBADD213PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUBADD231PS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUBADD132PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUBADD213PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFMSUBADD231PD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTPH2PS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VCVTPS2PH + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, writes_mem=true, reads_mem=true}, + // .VMOVDQA32 + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VMOVDQA64 + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VMOVDQU8 + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VMOVDQU16 + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VMOVDQU32 + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VMOVDQU64 + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPBLENDMB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPBLENDMW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPBLENDMD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPBLENDMQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VBLENDMPS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VBLENDMPD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPUB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPUW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPUD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCMPUQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPTESTMB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPTESTMW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPTESTMD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPTESTMQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPTESTNMB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPTESTNMW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPTESTNMD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPTESTNMQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPCOMPRESSD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPCOMPRESSQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VCOMPRESSPS + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VCOMPRESSPD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPEXPANDD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPEXPANDQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VEXPANDPS + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VEXPANDPD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPCONFLICTD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPCONFLICTQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPLZCNTD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPLZCNTQ + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPERMI2B + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMI2W + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMI2D + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMI2Q + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMI2PS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMI2PD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMT2B + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMT2W + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMT2D + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMT2Q + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMT2PS + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMT2PD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPERMW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPMOVB2M + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VPMOVW2M + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VPMOVD2M + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VPMOVQ2M + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VPMOVM2B + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VPMOVM2W + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VPMOVM2D + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VPMOVM2Q + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .VPMOVQB + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVSQB + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVUSQB + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVQW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVSQW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVUSQW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVQD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVSQD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVUSQD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVDB + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVSDB + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVUSDB + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVDW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVSDW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVUSDW + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVWB + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVSWB + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPMOVUSWB + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VPROLD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPROLQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPROLVD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPROLVQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPRORD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPRORQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPRORVD + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPRORVQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSCATTERDD + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + // .VPSCATTERDQ + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + // .VPSCATTERQD + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + // .VPSCATTERQQ + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + // .VSCATTERDPS + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + // .VSCATTERDPD + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + // .VSCATTERQPS + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + // .VSCATTERQPD + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + {read={.OP0, .OP1}, writes_mem=true}, + // .VPSRAVQ + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSRAVW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSLLVW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VPSRLVW + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .VRANGEPS + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRANGEPD + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRANGESS + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRANGESD + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VREDUCEPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VREDUCEPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VREDUCESS + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VREDUCESD + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRNDSCALEPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRNDSCALEPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRNDSCALESS + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRNDSCALESD + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRSQRT14PS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRSQRT14PD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRSQRT14SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRSQRT14SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRCP14PS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRCP14PD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRCP14SS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VRCP14SD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSCALEFPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSCALEFPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSCALEFSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VSCALEFSD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VGETEXPPS + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VGETEXPPD + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VGETEXPSS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VGETEXPSD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VGETMANTPS + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VGETMANTPD + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VGETMANTSS + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VGETMANTSD + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFIXUPIMMPS + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFIXUPIMMPD + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFIXUPIMMSS + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFIXUPIMMSD + {written={.OP0}, read={.OP1, .OP2, .OP3}, implicit_wr={.MXCSR}, reads_mem=true}, + // .VFPCLASSPS + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VFPCLASSPD + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VFPCLASSSS + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VFPCLASSSD + {written={.OP0}, read={.OP1}, reads_mem=true}, + // .VALIGNQ + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VALIGND + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VDBPSADBW + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPTERNLOGD + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPTERNLOGQ + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2, .OP3}, reads_mem=true}, + // .VPMULTISHIFTQB + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + {written={.OP0}, read={.OP1, .OP2}, reads_mem=true}, + // .KADDW + {written={.OP0}, read={.OP1, .OP2}}, + // .KADDB + {written={.OP0}, read={.OP1, .OP2}}, + // .KADDQ + {written={.OP0}, read={.OP1, .OP2}}, + // .KADDD + {written={.OP0}, read={.OP1, .OP2}}, + // .KANDW + {written={.OP0}, read={.OP1, .OP2}}, + // .KANDB + {written={.OP0}, read={.OP1, .OP2}}, + // .KANDQ + {written={.OP0}, read={.OP1, .OP2}}, + // .KANDD + {written={.OP0}, read={.OP1, .OP2}}, + // .KANDNW + {written={.OP0}, read={.OP1, .OP2}}, + // .KANDNB + {written={.OP0}, read={.OP1, .OP2}}, + // .KANDNQ + {written={.OP0}, read={.OP1, .OP2}}, + // .KANDND + {written={.OP0}, read={.OP1, .OP2}}, + // .KMOVW + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .KMOVB + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .KMOVQ + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .KMOVD + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}}, + {written={.OP0}, read={.OP1}}, + // .KNOTW + {written={.OP0}, read={.OP1}}, + // .KNOTB + {written={.OP0}, read={.OP1}}, + // .KNOTQ + {written={.OP0}, read={.OP1}}, + // .KNOTD + {written={.OP0}, read={.OP1}}, + // .KORW + {written={.OP0}, read={.OP1, .OP2}}, + // .KORB + {written={.OP0}, read={.OP1, .OP2}}, + // .KORQ + {written={.OP0}, read={.OP1, .OP2}}, + // .KORD + {written={.OP0}, read={.OP1, .OP2}}, + // .KORTESTW + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + // .KORTESTB + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + // .KORTESTQ + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + // .KORTESTD + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + // .KSHIFTLW + {written={.OP0}, read={.OP1, .OP2}}, + // .KSHIFTLB + {written={.OP0}, read={.OP1, .OP2}}, + // .KSHIFTLQ + {written={.OP0}, read={.OP1, .OP2}}, + // .KSHIFTLD + {written={.OP0}, read={.OP1, .OP2}}, + // .KSHIFTRW + {written={.OP0}, read={.OP1, .OP2}}, + // .KSHIFTRB + {written={.OP0}, read={.OP1, .OP2}}, + // .KSHIFTRQ + {written={.OP0}, read={.OP1, .OP2}}, + // .KSHIFTRD + {written={.OP0}, read={.OP1, .OP2}}, + // .KTESTW + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + // .KTESTB + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + // .KTESTQ + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + // .KTESTD + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + // .KUNPCKBW + {written={.OP0}, read={.OP1, .OP2}}, + // .KUNPCKWD + {written={.OP0}, read={.OP1, .OP2}}, + // .KUNPCKDQ + {written={.OP0}, read={.OP1, .OP2}}, + // .KXNORW + {written={.OP0}, read={.OP1, .OP2}}, + // .KXNORB + {written={.OP0}, read={.OP1, .OP2}}, + // .KXNORQ + {written={.OP0}, read={.OP1, .OP2}}, + // .KXNORD + {written={.OP0}, read={.OP1, .OP2}}, + // .KXORW + {written={.OP0}, read={.OP1, .OP2}}, + // .KXORB + {written={.OP0}, read={.OP1, .OP2}}, + // .KXORQ + {written={.OP0}, read={.OP1, .OP2}}, + // .KXORD + {written={.OP0}, read={.OP1, .OP2}}, + // .FADD + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FADDP + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FIADD + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + // .FSUB + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FSUBP + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FISUB + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + // .FSUBR + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FSUBRP + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FISUBR + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + // .FMUL + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FMULP + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FIMUL + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + // .FDIV + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FDIVP + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FIDIV + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + // .FDIVR + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FDIVRP + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FIDIVR + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + // .FSQRT + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FABS + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FCHS + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FPREM + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FPREM1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FRNDINT + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FSCALE + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FXTRACT + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FXAM + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + // .FLD + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}}, + // .FILD + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + // .FBLD + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + // .FST + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}}, + // .FSTP + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}}, + // .FIST + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FISTP + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FISTTP + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FBSTP + {implicit_wr={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FXCH + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FCMOVB + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF}}, + // .FCMOVE + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.ZF}}, + // .FCMOVBE + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF, .ZF}}, + // .FCMOVU + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.PF}}, + // .FCMOVNB + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF}}, + // .FCMOVNE + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.ZF}}, + // .FCMOVNBE + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.CF, .ZF}}, + // .FCMOVNU + {implicit_wr={.FPU_ST}, implicit_rd={.FPU_ST}, flags_rd={.PF}}, + // .FCOM + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + // .FCOMP + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + // .FCOMPP + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + // .FICOM + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + // .FICOMP + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}, reads_mem=true}, + // .FCOMI + {implicit_rd={.FPU_ST}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}}, + // .FCOMIP + {implicit_rd={.FPU_ST}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}}, + // .FUCOMI + {implicit_rd={.FPU_ST}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}}, + // .FUCOMIP + {implicit_rd={.FPU_ST}, flags_wr={.CF, .PF, .ZF}, flags_undef={.AF, .SF, .OF}}, + // .FUCOM + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + // .FUCOMP + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + // .FUCOMPP + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + // .FTST + {implicit_wr={.FPU_SW}, implicit_rd={.FPU_ST}}, + // .FLDZ + {implicit_wr={.FPU_ST, .FPU_SW}}, + // .FLD1 + {implicit_wr={.FPU_ST, .FPU_SW}}, + // .FLDPI + {implicit_wr={.FPU_ST, .FPU_SW}}, + // .FLDL2T + {implicit_wr={.FPU_ST, .FPU_SW}}, + // .FLDL2E + {implicit_wr={.FPU_ST, .FPU_SW}}, + // .FLDLG2 + {implicit_wr={.FPU_ST, .FPU_SW}}, + // .FLDLN2 + {implicit_wr={.FPU_ST, .FPU_SW}}, + // .FSIN + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FCOS + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FSINCOS + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FPTAN + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FPATAN + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .F2XM1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FYL2X + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FYL2XP1 + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FINIT + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FNINIT + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FINCSTP + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FDECSTP + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FFREE + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FFREEP + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FNOP + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FWAIT + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FCLEX + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FNCLEX + {implicit_wr={.FPU_ST, .FPU_SW}, implicit_rd={.FPU_ST}}, + // .FSTCW + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FNSTCW + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FLDCW + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + // .FSTENV + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FNSTENV + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FLDENV + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + // .FSAVE + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FNSAVE + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FRSTOR + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + // .FSTSW + {implicit_wr={.RAX, .FPU_SW}, writes_mem=true}, + {implicit_wr={.RAX, .FPU_SW}}, + // .FNSTSW + {implicit_wr={.RAX, .FPU_SW}, writes_mem=true}, + {implicit_wr={.RAX, .FPU_SW}}, + // .FXSAVE + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FXSAVE64 + {implicit_rd={.FPU_ST, .FPU_SW}, writes_mem=true}, + // .FXRSTOR + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + // .FXRSTOR64 + {implicit_wr={.FPU_ST, .FPU_SW}, reads_mem=true}, + // .LGDT + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + // .SGDT + {written={.OP0}, writes_mem=true}, + {written={.OP0}, writes_mem=true}, + // .LIDT + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + // .SIDT + {written={.OP0}, writes_mem=true}, + {written={.OP0}, writes_mem=true}, + // .LLDT + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + // .SLDT + {written={.OP0}, writes_mem=true}, + {written={.OP0}}, + {written={.OP0}}, + // .LTR + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + // .STR + {written={.OP0}, writes_mem=true}, + {written={.OP0}}, + {written={.OP0}}, + // .LMSW + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + // .SMSW + {written={.OP0}, writes_mem=true}, + {written={.OP0}}, + {written={.OP0}}, + // .CLTS + {side_effects={.PRIVILEGED}}, + // .ARPL + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, writes_mem=true, reads_mem=true}, + // .LAR + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + // .LSL + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + {written={.OP0}, read={.OP1}, flags_wr={.ZF}, reads_mem=true}, + // .VERR + {read={.OP0}, flags_wr={.ZF}, reads_mem=true}, + // .VERW + {read={.OP0}, flags_wr={.ZF}, reads_mem=true}, + // .INVD + {side_effects={.SERIALIZING, .PRIVILEGED}}, + // .WBINVD + {side_effects={.SERIALIZING, .PRIVILEGED}}, + // .INVLPG + {read={.OP0}, reads_mem=true, side_effects={.SERIALIZING, .PRIVILEGED}}, + // .INVPCID + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .RSM + {side_effects={.SERIALIZING, .PRIVILEGED}}, + // .RDMSR + {implicit_wr={.RAX, .RDX}, implicit_rd={.RCX}, side_effects={.PRIVILEGED}}, + // .WRMSR + {implicit_rd={.RAX, .RCX, .RDX}, side_effects={.SERIALIZING, .PRIVILEGED}}, + // .VMCALL + {side_effects={.PRIVILEGED}}, + // .VMLAUNCH + {flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .VMRESUME + {flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .VMXOFF + {side_effects={.PRIVILEGED}}, + // .VMXON + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .VMCLEAR + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .VMPTRLD + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .VMPTRST + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .VMREAD + {written={.OP0}, read={.OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true, side_effects={.PRIVILEGED}}, + // .VMWRITE + {read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .VMFUNC + {side_effects={.PRIVILEGED}}, + // .INVEPT + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .INVVPID + {read={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .ENCLS + {side_effects={.PRIVILEGED}}, + // .ENCLU + {side_effects={.PRIVILEGED}}, + // .ENCLV + {side_effects={.PRIVILEGED}}, + // .RDPKRU + {implicit_wr={.RAX}, implicit_rd={.RCX}}, + // .WRPKRU + {implicit_rd={.RAX, .RCX, .RDX}}, + // .INCSSPD + {read={.OP0}, side_effects={.CET}}, + // .INCSSPQ + {read={.OP0}, side_effects={.CET}}, + // .RDSSPD + {written={.OP0}, side_effects={.CET}}, + // .RDSSPQ + {written={.OP0}, side_effects={.CET}}, + // .SAVEPREVSSP + {side_effects={.CET}}, + // .RSTORSSP + {side_effects={.CET}}, + // .WRSSD + {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, + // .WRSSQ + {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, + // .WRUSSD + {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, + // .WRUSSQ + {read={.OP0, .OP1}, writes_mem=true, side_effects={.CET}}, + // .SETSSBSY + {side_effects={.CET}}, + // .CLRSSBSY + {side_effects={.CET}}, + // .ENDBR64 + {side_effects={.HINT, .CET}}, + // .ENDBR32 + {side_effects={.HINT, .CET}}, + // .XSAVE + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + // .XSAVE64 + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + // .XRSTOR + {implicit_wr={.MXCSR, .FPU_ST, .FPU_SW}, implicit_rd={.RAX, .RDX}, reads_mem=true}, + // .XRSTOR64 + {implicit_wr={.MXCSR, .FPU_ST, .FPU_SW}, implicit_rd={.RAX, .RDX}, reads_mem=true}, + // .XSAVEOPT + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + // .XSAVEOPT64 + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + // .XSAVEC + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + // .XSAVEC64 + {implicit_rd={.RAX, .RDX}, writes_mem=true}, + // .XSAVES + {implicit_rd={.RAX, .RDX}, writes_mem=true, side_effects={.PRIVILEGED}}, + // .XSAVES64 + {implicit_rd={.RAX, .RDX}, writes_mem=true, side_effects={.PRIVILEGED}}, + // .XRSTORS + {implicit_wr={.MXCSR, .FPU_ST, .FPU_SW}, implicit_rd={.RAX, .RDX}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .XRSTORS64 + {implicit_wr={.MXCSR, .FPU_ST, .FPU_SW}, implicit_rd={.RAX, .RDX}, reads_mem=true, side_effects={.PRIVILEGED}}, + // .PREFETCHT0 + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + // .PREFETCHT1 + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + // .PREFETCHT2 + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + // .PREFETCHNTA + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + // .PREFETCHW + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + // .CLFLUSHOPT + {read={.OP0}, reads_mem=true, side_effects={.CACHE}}, + // .CLWB + {read={.OP0}, reads_mem=true, side_effects={.CACHE}}, + // .CLDEMOTE + {read={.OP0}, reads_mem=true, side_effects={.HINT}}, + // .BSWAP + {written={.OP0}, read={.OP0}}, + {written={.OP0}, read={.OP0}}, + // .CMPXCHG + {written={.OP0}, read={.OP0, .OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP0, .OP1}, implicit_wr={.RAX}, implicit_rd={.RAX}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + // .CMPXCHG8B + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RBX, .RCX, .RDX}, flags_wr={.ZF}, writes_mem=true, reads_mem=true}, + // .CMPXCHG16B + {read={.OP0}, implicit_wr={.RAX, .RDX}, implicit_rd={.RAX, .RBX, .RCX, .RDX}, flags_wr={.ZF}, writes_mem=true, reads_mem=true}, + // .XADD + {written={.OP0, .OP1}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + {written={.OP0, .OP1}, read={.OP0, .OP1}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}, writes_mem=true, reads_mem=true}, + // .BOUND + {read={.OP0, .OP1}, reads_mem=true, side_effects={.TRAP}}, + {read={.OP0, .OP1}, reads_mem=true, side_effects={.TRAP}}, + // .ENTER + {implicit_wr={.RSP, .RBP}, implicit_rd={.RSP, .RBP}, writes_mem=true}, + // .LEAVE + {implicit_wr={.RSP, .RBP}, implicit_rd={.RBP}, reads_mem=true}, + // .XLAT + {implicit_wr={.RAX}, implicit_rd={.RAX, .RBX}, reads_mem=true}, + // .XLATB + {implicit_wr={.RAX}, implicit_rd={.RAX, .RBX}, reads_mem=true}, + // .MOVBE + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + {written={.OP0}, read={.OP1}, writes_mem=true, reads_mem=true}, + // .RDRAND + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + // .RDSEED + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, + {written={.OP0}, flags_wr={.CF, .PF, .AF, .ZF, .SF, .OF}}, +} + @(rodata) ENCODE_RUNS := [lib.Mnemonic]lib.Encode_Run{ .INVALID = { 0, 0}, @@ -3758,143 +7346,141 @@ ENCODE_RUNS := [lib.Mnemonic]lib.Encode_Run{ .MOVS = { 630, 1}, .MOVSB = { 631, 1}, .MOVSW = { 632, 1}, - .MOVSD = { 633, 1}, - .MOVSQ = { 634, 1}, - .CMPS = { 635, 1}, - .CMPSB = { 636, 1}, - .CMPSW = { 637, 1}, - .CMPSD = { 638, 1}, - .CMPSQ = { 639, 1}, - .SCAS = { 640, 1}, - .SCASB = { 641, 1}, - .SCASW = { 642, 1}, - .SCASD = { 643, 1}, - .SCASQ = { 644, 1}, - .LODS = { 645, 1}, - .LODSB = { 646, 1}, - .LODSW = { 647, 1}, - .LODSD = { 648, 1}, - .LODSQ = { 649, 1}, - .STOS = { 650, 1}, - .STOSB = { 651, 1}, - .STOSW = { 652, 1}, - .STOSD = { 653, 1}, - .STOSQ = { 654, 1}, - .CLC = { 655, 1}, - .STC = { 656, 1}, - .CMC = { 657, 1}, - .CLD = { 658, 1}, - .STD = { 659, 1}, - .CLI = { 660, 1}, - .STI = { 661, 1}, - .LAHF = { 662, 1}, - .SAHF = { 663, 1}, - .PUSHF = { 664, 1}, - .PUSHFD = { 665, 1}, - .PUSHFQ = { 666, 1}, - .POPF = { 667, 1}, - .POPFD = { 668, 1}, - .POPFQ = { 669, 1}, - .NOP = { 670, 4}, - .HLT = { 674, 1}, - .WAIT = { 675, 1}, - .LOCK = { 676, 1}, - .UD0 = { 677, 1}, - .UD1 = { 678, 1}, - .UD2 = { 679, 1}, - .CPUID = { 680, 1}, - .RDTSC = { 681, 1}, - .RDTSCP = { 682, 1}, - .RDPMC = { 683, 1}, - .XGETBV = { 684, 1}, - .XSETBV = { 685, 1}, - .CBW = { 686, 1}, - .CWDE = { 687, 1}, - .CDQE = { 688, 1}, - .CWD = { 689, 1}, - .CDQ = { 690, 1}, - .CQO = { 691, 1}, - .ANDN = { 692, 2}, - .BEXTR = { 694, 2}, - .BLSI = { 696, 2}, - .BLSMSK = { 698, 2}, - .BLSR = { 700, 2}, - .BZHI = { 702, 2}, - .PDEP = { 704, 2}, - .PEXT = { 706, 2}, - .RORX = { 708, 2}, - .SARX = { 710, 2}, - .SHLX = { 712, 2}, - .SHRX = { 714, 2}, - .MULX = { 716, 2}, - .ADCX = { 718, 2}, - .ADOX = { 720, 2}, - .MOVAPS = { 722, 2}, - .MOVUPS = { 724, 2}, - .MOVAPD = { 726, 2}, - .MOVUPD = { 728, 2}, - .MOVSS = { 730, 2}, - .MOVSD_SSE = { 732, 2}, - .MOVDQA = { 734, 2}, - .MOVDQU = { 736, 2}, - .MOVQ = { 738, 6}, - .MOVD = { 744, 4}, - .MOVLPS = { 748, 2}, - .MOVHPS = { 750, 2}, - .MOVLPD = { 752, 2}, - .MOVHPD = { 754, 2}, - .MOVLHPS = { 756, 1}, - .MOVHLPS = { 757, 1}, - .MOVMSKPS = { 758, 2}, - .MOVMSKPD = { 760, 2}, - .MOVNTPS = { 762, 1}, - .MOVNTPD = { 763, 1}, - .MOVNTDQ = { 764, 1}, - .MOVNTDQA = { 765, 1}, - .ADDPS = { 766, 1}, - .ADDPD = { 767, 1}, - .ADDSS = { 768, 1}, - .ADDSD = { 769, 1}, - .SUBPS = { 770, 1}, - .SUBPD = { 771, 1}, - .SUBSS = { 772, 1}, - .SUBSD = { 773, 1}, - .MULPS = { 774, 1}, - .MULPD = { 775, 1}, - .MULSS = { 776, 1}, - .MULSD = { 777, 1}, - .DIVPS = { 778, 1}, - .DIVPD = { 779, 1}, - .DIVSS = { 780, 1}, - .DIVSD = { 781, 1}, - .SQRTPS = { 782, 1}, - .SQRTPD = { 783, 1}, - .SQRTSS = { 784, 1}, - .SQRTSD = { 785, 1}, - .RCPPS = { 786, 1}, - .RCPSS = { 787, 1}, - .RSQRTPS = { 788, 1}, - .RSQRTSS = { 789, 1}, - .MAXPS = { 790, 1}, - .MAXPD = { 791, 1}, - .MAXSS = { 792, 1}, - .MAXSD = { 793, 1}, - .MINPS = { 794, 1}, - .MINPD = { 795, 1}, - .MINSS = { 796, 1}, - .MINSD = { 797, 1}, - .ANDPS = { 798, 1}, - .ANDPD = { 799, 1}, - .ANDNPS = { 800, 1}, - .ANDNPD = { 801, 1}, - .ORPS = { 802, 1}, - .ORPD = { 803, 1}, - .XORPS = { 804, 1}, - .XORPD = { 805, 1}, - .CMPPS = { 806, 1}, - .CMPPD = { 807, 1}, - .CMPSS = { 808, 1}, - .CMPSD_SSE = { 809, 1}, + .MOVSD = { 633, 3}, + .MOVSQ = { 636, 1}, + .CMPS = { 637, 1}, + .CMPSB = { 638, 1}, + .CMPSW = { 639, 1}, + .CMPSD = { 640, 2}, + .CMPSQ = { 642, 1}, + .SCAS = { 643, 1}, + .SCASB = { 644, 1}, + .SCASW = { 645, 1}, + .SCASD = { 646, 1}, + .SCASQ = { 647, 1}, + .LODS = { 648, 1}, + .LODSB = { 649, 1}, + .LODSW = { 650, 1}, + .LODSD = { 651, 1}, + .LODSQ = { 652, 1}, + .STOS = { 653, 1}, + .STOSB = { 654, 1}, + .STOSW = { 655, 1}, + .STOSD = { 656, 1}, + .STOSQ = { 657, 1}, + .CLC = { 658, 1}, + .STC = { 659, 1}, + .CMC = { 660, 1}, + .CLD = { 661, 1}, + .STD = { 662, 1}, + .CLI = { 663, 1}, + .STI = { 664, 1}, + .LAHF = { 665, 1}, + .SAHF = { 666, 1}, + .PUSHF = { 667, 1}, + .PUSHFD = { 668, 1}, + .PUSHFQ = { 669, 1}, + .POPF = { 670, 1}, + .POPFD = { 671, 1}, + .POPFQ = { 672, 1}, + .NOP = { 673, 4}, + .HLT = { 677, 1}, + .WAIT = { 678, 1}, + .LOCK = { 679, 1}, + .UD0 = { 680, 1}, + .UD1 = { 681, 1}, + .UD2 = { 682, 1}, + .CPUID = { 683, 1}, + .RDTSC = { 684, 1}, + .RDTSCP = { 685, 1}, + .RDPMC = { 686, 1}, + .XGETBV = { 687, 1}, + .XSETBV = { 688, 1}, + .CBW = { 689, 1}, + .CWDE = { 690, 1}, + .CDQE = { 691, 1}, + .CWD = { 692, 1}, + .CDQ = { 693, 1}, + .CQO = { 694, 1}, + .ANDN = { 695, 2}, + .BEXTR = { 697, 2}, + .BLSI = { 699, 2}, + .BLSMSK = { 701, 2}, + .BLSR = { 703, 2}, + .BZHI = { 705, 2}, + .PDEP = { 707, 2}, + .PEXT = { 709, 2}, + .RORX = { 711, 2}, + .SARX = { 713, 2}, + .SHLX = { 715, 2}, + .SHRX = { 717, 2}, + .MULX = { 719, 2}, + .ADCX = { 721, 2}, + .ADOX = { 723, 2}, + .MOVAPS = { 725, 2}, + .MOVUPS = { 727, 2}, + .MOVAPD = { 729, 2}, + .MOVUPD = { 731, 2}, + .MOVSS = { 733, 2}, + .MOVDQA = { 735, 2}, + .MOVDQU = { 737, 2}, + .MOVQ = { 739, 6}, + .MOVD = { 745, 4}, + .MOVLPS = { 749, 2}, + .MOVHPS = { 751, 2}, + .MOVLPD = { 753, 2}, + .MOVHPD = { 755, 2}, + .MOVLHPS = { 757, 1}, + .MOVHLPS = { 758, 1}, + .MOVMSKPS = { 759, 2}, + .MOVMSKPD = { 761, 2}, + .MOVNTPS = { 763, 1}, + .MOVNTPD = { 764, 1}, + .MOVNTDQ = { 765, 1}, + .MOVNTDQA = { 766, 1}, + .ADDPS = { 767, 1}, + .ADDPD = { 768, 1}, + .ADDSS = { 769, 1}, + .ADDSD = { 770, 1}, + .SUBPS = { 771, 1}, + .SUBPD = { 772, 1}, + .SUBSS = { 773, 1}, + .SUBSD = { 774, 1}, + .MULPS = { 775, 1}, + .MULPD = { 776, 1}, + .MULSS = { 777, 1}, + .MULSD = { 778, 1}, + .DIVPS = { 779, 1}, + .DIVPD = { 780, 1}, + .DIVSS = { 781, 1}, + .DIVSD = { 782, 1}, + .SQRTPS = { 783, 1}, + .SQRTPD = { 784, 1}, + .SQRTSS = { 785, 1}, + .SQRTSD = { 786, 1}, + .RCPPS = { 787, 1}, + .RCPSS = { 788, 1}, + .RSQRTPS = { 789, 1}, + .RSQRTSS = { 790, 1}, + .MAXPS = { 791, 1}, + .MAXPD = { 792, 1}, + .MAXSS = { 793, 1}, + .MAXSD = { 794, 1}, + .MINPS = { 795, 1}, + .MINPD = { 796, 1}, + .MINSS = { 797, 1}, + .MINSD = { 798, 1}, + .ANDPS = { 799, 1}, + .ANDPD = { 800, 1}, + .ANDNPS = { 801, 1}, + .ANDNPD = { 802, 1}, + .ORPS = { 803, 1}, + .ORPD = { 804, 1}, + .XORPS = { 805, 1}, + .XORPD = { 806, 1}, + .CMPPS = { 807, 1}, + .CMPPD = { 808, 1}, + .CMPSS = { 809, 1}, .COMISS = { 810, 1}, .COMISD = { 811, 1}, .UCOMISS = { 812, 1}, diff --git a/core/rexcode/isa/x86/tablegen/generated/writer.odin b/core/rexcode/isa/x86/tablegen/generated/writer.odin index 85bcd8a48..cae51a210 100644 --- a/core/rexcode/isa/x86/tablegen/generated/writer.odin +++ b/core/rexcode/isa/x86/tablegen/generated/writer.odin @@ -42,5 +42,5 @@ main :: proc() { w(TABLES + "x86.evex_idx_0f.bin", raw(&EVEX_INDEX_0F, size_of(EVEX_INDEX_0F))) w(TABLES + "x86.evex_idx_0f38.bin", raw(&EVEX_INDEX_0F38, size_of(EVEX_INDEX_0F38))) w(TABLES + "x86.evex_idx_0f3a.bin", raw(&EVEX_INDEX_0F3A, size_of(EVEX_INDEX_0F3A))) - w(TABLES + "x86.clobber_table.bin", raw(&tablegen.CLOBBER_TABLE, size_of(tablegen.CLOBBER_TABLE))) + w(TABLES + "x86.clobber_forms.bin", raw(&CLOBBER_FORMS, size_of(CLOBBER_FORMS))) } diff --git a/core/rexcode/isa/x86/tables.odin b/core/rexcode/isa/x86/tables.odin index 13482ddbc..4bd5710a2 100644 --- a/core/rexcode/isa/x86/tables.odin +++ b/core/rexcode/isa/x86/tables.odin @@ -94,7 +94,7 @@ Decode_Index :: struct { @(rodata) EVEX_INDEX_0F := #load("tables/x86.evex_idx_0f.bin", []Decode_Index) @(rodata) EVEX_INDEX_0F38 := #load("tables/x86.evex_idx_0f38.bin", []Decode_Index) @(rodata) EVEX_INDEX_0F3A := #load("tables/x86.evex_idx_0f3a.bin", []Decode_Index) -@(rodata) CLOBBER_TABLE := #load("tables/x86.clobber_table.bin", []Clobber) +@(rodata) CLOBBER_FORMS := #load("tables/x86.clobber_forms.bin", []Clobber) // ----------------------------------------------------------------------------- // Accessors @@ -108,6 +108,14 @@ encoding_forms :: #force_inline proc "contextless" (m: Mnemonic) -> []Encoding { return ENCODE_FORMS[r.start:][:r.count] } +// Per-mnemonic encode forms: the run of ENCODE_FORMS belonging to `m`. +// Replaces the old ENCODING_TABLE[m] slice; the returned view is into rodata. +@(private, require_results) +clobber_forms :: #force_inline proc "contextless" (m: Mnemonic) -> []Clobber { + r := ENCODE_RUNS[u16(m)] + return CLOBBER_FORMS[r.start:][:r.count] +} + // Flat [prefix][opcode] lookup into a logical [4][256] index table. @(private, require_results) didx :: #force_inline proc "contextless" (t: []Decode_Index, prefix, opcode: u8) -> Decode_Index { diff --git a/core/rexcode/isa/x86/tables/x86.clobber_table.bin b/core/rexcode/isa/x86/tables/x86.clobber_table.bin deleted file mode 100644 index 338d8d8572fd6b842e2e45eba9f8410e9e7a0160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19104 zcmZQT1B^@v0Y*j!27G)5GlYx;zkwFe*0?57WsC5YTI9Ht*D9}>P`|AXZ@ z5%!_+L25uofiWX84;0JDd~iU639wp-6cV41dJd2_B=zWg3p9BH0(^A!gzN`f4JJSa zGcXWRkM2HnKDzy+x>o_@3?%n}BL;~tfF@5!J-U8$KEgau-U1m8N}?bdKc5Ah7eVSE z>S26Xc%bo7%PU3(r1FXZoW4Ni*MEp{j7(5@JbXq_>DR!(!0?}ekwJkGR30)gAo0Pa zBQl?b5u_GkfdV)@Ss0<_Gb{qz2hk5w0g`uM-~lngco8TIf?1&S0n!Y@5CO2`A*miL zfX)Y%lc1anmIMbCNG}LOL^!~D5qt|Yz5xL~x_UzP4Yd0d(EP)M#uq^2qlXV6{pjYQ z^KqCD&K95;;RHt(qP_+d#>n+II-ihw4m9&D(D()f_~_~h**DPcQ$X_%6B=ItjgKBa zg!H4Eht9`tJ_CaZg9#{l85|((0jlsp^{E5cKM?aN;j1vHf?H28^C;yDGJs2VP&o)L zTqxy(+ye?gSol%O2bl$S7>EJI*!aj|pfVq-6ilJ>LFGMI0!kqBVdls~dQjd=hG7A?z0FeM!7}w&DVV^|XJi8@vSa{Lpdt;- z&}0w;34{0`FEJp=6XJvQBdG`TL56{=WCni!6W+*%tsDyP?VtaDF_d+`Fx1z809lCFpj+N zfMhNZ3Ce;<=?R)1Kr#?a8+mwf0JV=KJ_9o-{c=OvFrZ?DL_S7-qrU%1@(|l{JwuO=KR;6*U!&&3aww!e8*JeL zbKO9te~Q9m2=qrO4PT1FhhYB}y?(`0evOU?BG11;q7}KmAT@kI&2NJ7LwWfNaVUs{ zls_OA1QWprtrkJ8Kj~hd(l-4Q3Sac`6?8r!{ee2Q_fOi4{(O1_8p}0Rti-9# zn~yFJ;e$#W&549RXH9*g6fs{3f_7j8;ay+EJj^KmD;5+_6 zegR?FmJ~1>Vlsqmf>3a>304L}L>OUwXnThdc^@lC2}nQkeocrxVn-)P9;6P28=&SR znFn?g5+9}%OcS9VT|XKh5~8A0wxZoh%}V0&N$5%$59f@z3Y&vp~-XfU96&WCrbThNWjvpl~wqL-RMNd;pzy zgv^JW*My`VDLpVSf-1%X4A5QQ(BMA+2^El)-~eVsBpEDxNd5vThMw01W#-Ra7y$6PsvH0S diff --git a/core/rexcode/isa/x86/tables/x86.encode_forms.bin b/core/rexcode/isa/x86/tables/x86.encode_forms.bin index 71049b89b699a440b4f72e7c2bcf1d5e9d0d1331..59f12ef4c569d68083aae103a22081a25fce2344 100644 GIT binary patch literal 38320 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 diff --git a/core/rexcode/isa/x86/tables/x86.encode_recipes.bin b/core/rexcode/isa/x86/tables/x86.encode_recipes.bin index c72162a4f2f5209ae6b37f933b3c9226e893e54c..2bc0e47c0bfd5133d7e07363efe778c96a0f1fb8 100644 GIT binary patch delta 45 zcmX@|fbqx!#tl1UCkH4=Ox_`D!}E#%5CanfBg20tM%K+=WMf!1XDGEWZ~md`;{^bk C&k(o( delta 48 zcmX@|fbqx!#tl1UC$Ev^o_t%@aI=J53=8ikegOt121bVe{~1_6ZO&BcXJ-7g`K@ZW F7Xa9R5_gz$GTcM)c zp!9Yo1_mYu28NwbdN-8b3#Io%>4Q-EFqA$DrH@1DlTi9Jls*fk&qL{pObqp4i!MV2 zu0rYSQ2Hj6z73`CLh1WZ`XQ8l%*4RJ#=yYv667rg28Op#@%K>rBb5FOrN2Tw`i)5# R5-#7N53?T2lfr`I_(jTDoCn)^| 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 literal 8360 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 literal 25400 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 diff --git a/core/rexcode/isa/x86/tables/x86.vex.bin b/core/rexcode/isa/x86/tables/x86.vex.bin index fca9d0eea67a550b3790c2443690046d2658b97a..34b01319ea5bb98f81385e587ce3e76595c83e24 100644 GIT binary patch literal 14140 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 literal 14140 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